diff --git a/Gemfile.lock b/Gemfile.lock index 6cc132b9..090b3ed7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -14,30 +14,31 @@ GEM securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) uri (>= 0.13.1) - ast (2.4.2) + ast (2.4.3) base64 (0.2.0) benchmark (0.4.0) bigdecimal (3.1.9) concurrent-ruby (1.3.5) - connection_pool (2.5.0) + connection_pool (2.5.3) drb (2.2.1) i18n (1.14.7) concurrent-ruby (~> 1.0) - json (2.10.2) - language_server-protocol (3.17.0.4) + json (2.12.0) + language_server-protocol (3.17.0.5) lint_roller (1.1.0) - logger (1.6.6) + logger (1.7.0) minitest (5.25.5) - parallel (1.26.3) - parser (3.3.7.1) + parallel (1.27.0) + parser (3.3.8.0) ast (~> 2.4.1) racc prettier_print (1.2.1) + prism (1.4.0) racc (1.8.1) - rack (3.1.12) + rack (3.1.14) rainbow (3.1.1) regexp_parser (2.10.0) - rubocop (1.74.0) + rubocop (1.75.5) json (~> 2.3) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.1.0) @@ -45,11 +46,12 @@ GEM parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 2.9.3, < 3.0) - rubocop-ast (>= 1.38.0, < 2.0) + rubocop-ast (>= 1.44.0, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 4.0) - rubocop-ast (1.38.1) - parser (>= 3.3.1.0) + rubocop-ast (1.44.1) + parser (>= 3.3.7.2) + prism (~> 1.4) rubocop-capybara (2.22.1) lint_roller (~> 1.1) rubocop (~> 1.72, >= 1.72.1) @@ -65,13 +67,13 @@ GEM rubocop-factory_bot (2.27.1) lint_roller (~> 1.1) rubocop (~> 1.72, >= 1.72.1) - rubocop-rails (2.30.3) + rubocop-rails (2.31.0) activesupport (>= 4.2.0) lint_roller (~> 1.1) rack (>= 1.1) - rubocop (>= 1.72.1, < 2.0) + rubocop (>= 1.75.0, < 2.0) rubocop-ast (>= 1.38.0, < 2.0) - rubocop-rspec (3.5.0) + rubocop-rspec (3.6.0) lint_roller (~> 1.1) rubocop (~> 1.72, >= 1.72.1) rubocop-rspec_rails (2.31.0) @@ -97,4 +99,4 @@ DEPENDENCIES syntax_tree BUNDLED WITH - 2.6.6 + 2.6.8 diff --git a/assets/javascripts/discourse/components/activity-pub-actor.gjs b/assets/javascripts/discourse/components/activity-pub-actor.gjs index 49bfb726..c79ecdef 100644 --- a/assets/javascripts/discourse/components/activity-pub-actor.gjs +++ b/assets/javascripts/discourse/components/activity-pub-actor.gjs @@ -1,4 +1,4 @@ -import or from "truth-helpers/helpers/or"; +import { or } from "truth-helpers"; import ActivityPubActorHandleLink from "./activity-pub-actor-handle-link"; import ActivityPubActorImage from "./activity-pub-actor-image"; diff --git a/assets/javascripts/discourse/components/activity-pub-authorize.js b/assets/javascripts/discourse/components/activity-pub-authorize.gjs similarity index 53% rename from assets/javascripts/discourse/components/activity-pub-authorize.js rename to assets/javascripts/discourse/components/activity-pub-authorize.gjs index a6068ac2..b1b4a610 100644 --- a/assets/javascripts/discourse/components/activity-pub-authorize.js +++ b/assets/javascripts/discourse/components/activity-pub-authorize.gjs @@ -1,10 +1,15 @@ import Component from "@glimmer/component"; import { tracked } from "@glimmer/tracking"; +import { Input } from "@ember/component"; +import { fn, hash } from "@ember/helper"; +import { on } from "@ember/modifier"; import { action } from "@ember/object"; +import DButton from "discourse/components/d-button"; import { ajax } from "discourse/lib/ajax"; import { popupAjaxError } from "discourse/lib/ajax-error"; import getURL from "discourse/lib/get-url"; import { i18n } from "discourse-i18n"; +import ComboBox from "select-kit/components/combo-box"; const supportedAuthTypes = ["discourse", "mastodon"]; @@ -121,4 +126,60 @@ export default class ActivityPubAuthorize extends Component { authorizeDomain() { window.open(getURL(`/ap/auth/authorize/${this.authType}`), "_self"); } + + } diff --git a/assets/javascripts/discourse/components/activity-pub-authorize.hbs b/assets/javascripts/discourse/components/activity-pub-authorize.hbs deleted file mode 100644 index 8eedada0..00000000 --- a/assets/javascripts/discourse/components/activity-pub-authorize.hbs +++ /dev/null @@ -1,53 +0,0 @@ -
-
- - {{#if this.verifiedDomain}} - - {{this.domain}} - - - {{else}} - - {{/if}} - - -
-
\ No newline at end of file diff --git a/assets/javascripts/discourse/components/activity-pub-follow-domain.js b/assets/javascripts/discourse/components/activity-pub-follow-domain.gjs similarity index 64% rename from assets/javascripts/discourse/components/activity-pub-follow-domain.js rename to assets/javascripts/discourse/components/activity-pub-follow-domain.gjs index 78c2934c..fa4fd303 100644 --- a/assets/javascripts/discourse/components/activity-pub-follow-domain.js +++ b/assets/javascripts/discourse/components/activity-pub-follow-domain.gjs @@ -1,8 +1,10 @@ import Component from "@glimmer/component"; import { tracked } from "@glimmer/tracking"; +import { Input } from "@ember/component"; +import { on } from "@ember/modifier"; import { action } from "@ember/object"; -import { service } from "@ember/service"; import { Promise } from "rsvp"; +import DButton from "discourse/components/d-button"; import { ajax } from "discourse/lib/ajax"; import DiscourseURL from "discourse/lib/url"; import { extractDomainFromUrl, hostnameValid } from "discourse/lib/utilities"; @@ -22,8 +24,6 @@ const mastodonFollowUrl = (domain, handle) => { const mastodonAboutPath = "api/v2/instance"; export default class ActivityPubFollowDomain extends Component { - @service site; - @tracked verifying = false; @tracked error = null; @@ -88,4 +88,37 @@ export default class ActivityPubFollowDomain extends Component { this.error = i18n("discourse_activity_pub.follow.domain.invalid"); } } + + } diff --git a/assets/javascripts/discourse/components/activity-pub-follow-domain.hbs b/assets/javascripts/discourse/components/activity-pub-follow-domain.hbs deleted file mode 100644 index 13e7638b..00000000 --- a/assets/javascripts/discourse/components/activity-pub-follow-domain.hbs +++ /dev/null @@ -1,28 +0,0 @@ -
- -
- - -
-
- {{#if this.error}} - {{this.error}} - {{else if this.verifying}} - {{i18n "discourse_activity_pub.follow.domain.verifying"}} - {{else}} - {{i18n "discourse_activity_pub.follow.domain.description"}} - {{/if}} -
-
\ No newline at end of file diff --git a/assets/javascripts/discourse/components/activity-pub-handle.gjs b/assets/javascripts/discourse/components/activity-pub-handle.gjs index 5e8aeccd..866d5773 100644 --- a/assets/javascripts/discourse/components/activity-pub-handle.gjs +++ b/assets/javascripts/discourse/components/activity-pub-handle.gjs @@ -1,16 +1,12 @@ import Component from "@glimmer/component"; import { tracked } from "@glimmer/tracking"; import { action } from "@ember/object"; -import { service } from "@ember/service"; import DButton from "discourse/components/d-button"; import icon from "discourse/helpers/d-icon"; import discourseLater from "discourse/lib/later"; import { clipboardCopy } from "discourse/lib/utilities"; export default class ActivityPubHandle extends Component { - @service site; - @service siteSettings; - @tracked copied = false; get showLink() { diff --git a/assets/javascripts/discourse/components/activity-pub-nav-item.js b/assets/javascripts/discourse/components/activity-pub-nav-item.gjs similarity index 79% rename from assets/javascripts/discourse/components/activity-pub-nav-item.js rename to assets/javascripts/discourse/components/activity-pub-nav-item.gjs index d638333d..cf3fc23b 100644 --- a/assets/javascripts/discourse/components/activity-pub-nav-item.js +++ b/assets/javascripts/discourse/components/activity-pub-nav-item.gjs @@ -1,6 +1,10 @@ import Component from "@glimmer/component"; import { tracked } from "@glimmer/tracking"; +import didInsert from "@ember/render-modifiers/modifiers/did-insert"; +import didUpdate from "@ember/render-modifiers/modifiers/did-update"; +import willDestroy from "@ember/render-modifiers/modifiers/will-destroy"; import { service } from "@ember/service"; +import icon from "discourse/helpers/d-icon"; import { bind } from "discourse/lib/decorators"; import getURL from "discourse/lib/get-url"; import { i18n } from "discourse-i18n"; @@ -13,7 +17,6 @@ export default class ActivityPubNavItem extends Component { @service router; @service messageBus; @service site; - @service currentUser; @tracked visible = false; @tracked actor; @@ -110,4 +113,19 @@ export default class ActivityPubNavItem extends Component { get active() { return this.router.currentRouteName.includes(`activityPub.actor`); } + + } diff --git a/assets/javascripts/discourse/components/activity-pub-nav-item.hbs b/assets/javascripts/discourse/components/activity-pub-nav-item.hbs deleted file mode 100644 index e0ef051c..00000000 --- a/assets/javascripts/discourse/components/activity-pub-nav-item.hbs +++ /dev/null @@ -1,12 +0,0 @@ - - {{d-icon "discourse-activity-pub"}} - {{i18n "discourse_activity_pub.discovery.label"}} - \ No newline at end of file diff --git a/assets/javascripts/discourse/components/activity-pub-post-actions.gjs b/assets/javascripts/discourse/components/activity-pub-post-actions.gjs index e95abc25..8a07ce16 100644 --- a/assets/javascripts/discourse/components/activity-pub-post-actions.gjs +++ b/assets/javascripts/discourse/components/activity-pub-post-actions.gjs @@ -32,6 +32,11 @@ export default class ActivityPubPostActions extends Component { this.status = status; } + willDestroy() { + super.willDestroy(...arguments); + this.appEvents.off("activity-pub:post-updated", this, "postUpdated"); + } + postUpdated(postId, postProps) { if (this.post.id === postId) { this.post.setProperties(postProps); diff --git a/assets/javascripts/discourse/components/activity-pub-site-setting-notice.gjs b/assets/javascripts/discourse/components/activity-pub-site-setting-notice.gjs index 6a9c8234..676770b7 100644 --- a/assets/javascripts/discourse/components/activity-pub-site-setting-notice.gjs +++ b/assets/javascripts/discourse/components/activity-pub-site-setting-notice.gjs @@ -1,13 +1,10 @@ import Component from "@glimmer/component"; -import { service } from "@ember/service"; import { dasherize } from "@ember/string"; import icon from "discourse/helpers/d-icon"; import getURL from "discourse/lib/get-url"; import { i18n } from "discourse-i18n"; export default class ActivityPubSiteSettingNotice extends Component { - @service siteSettings; - get containerClass() { return `activity-pub-site-setting ${dasherize(this.args.setting)}`; } diff --git a/assets/javascripts/discourse/components/modal/activity-pub-actor-follow.gjs b/assets/javascripts/discourse/components/modal/activity-pub-actor-follow.gjs new file mode 100644 index 00000000..09072629 --- /dev/null +++ b/assets/javascripts/discourse/components/modal/activity-pub-actor-follow.gjs @@ -0,0 +1,148 @@ +import Component from "@glimmer/component"; +import { tracked } from "@glimmer/tracking"; +import { Input } from "@ember/component"; +import { on } from "@ember/modifier"; +import { action } from "@ember/object"; +import DButton from "discourse/components/d-button"; +import DModal from "discourse/components/d-modal"; +import loadingSpinner from "discourse/helpers/loading-spinner"; +import { i18n } from "discourse-i18n"; +import ActivityPubActor from "../../models/activity-pub-actor"; +import ActivityPubWebfinger from "../../models/activity-pub-webfinger"; +import ActivityPubActor0 from "../activity-pub-actor"; +import ActivityPubActorFollowBtn from "../activity-pub-actor-follow-btn"; + +export default class ActivityPubFollowRemote extends Component { + @tracked verifying = false; + @tracked error = null; + @tracked followActor; + + get title() { + return i18n("discourse_activity_pub.actor_follow.title", { + actor: this.args.model.actor.name, + }); + } + + get footerClass() { + let result = "activity-pub-actor-follow-find-footer"; + if (this.error) { + result += " error"; + } + return result; + } + + get actorClass() { + let result = "activity-pub-actor-follow-actor-container"; + if (!this.followActor) { + result += " no-actor"; + } + return result; + } + + get notFound() { + return this.followActor === false; + } + + @action + onKeyup(e) { + this.error = null; + + if (e.key === "Enter") { + this.find(); + } else { + this.followActor = null; + } + } + + @action + follow(actor, followActor) { + return this.args.model.follow(actor, followActor).then(() => { + this.args.closeModal(); + }); + } + + @action + async find() { + const handle = this.handle; + + if (!handle) { + return; + } + + this.validating = true; + const validated = await ActivityPubWebfinger.validateHandle(handle); + this.validating = false; + + if (validated) { + this.finding = true; + this.followActor = await ActivityPubActor.findByHandle( + this.args.model.actor.id, + handle + ); + this.finding = false; + } else { + this.error = i18n("discourse_activity_pub.actor_follow.find.invalid"); + } + } + + +} diff --git a/assets/javascripts/discourse/components/modal/activity-pub-actor-follow.hbs b/assets/javascripts/discourse/components/modal/activity-pub-actor-follow.hbs deleted file mode 100644 index aff27e85..00000000 --- a/assets/javascripts/discourse/components/modal/activity-pub-actor-follow.hbs +++ /dev/null @@ -1,56 +0,0 @@ - - <:body> -
-
- -
- - -
-
- {{#if this.error}} - {{this.error}} - {{else if this.validating}} - {{i18n "discourse_activity_pub.actor_follow.find.validating"}} - {{else}} - {{i18n "discourse_activity_pub.actor_follow.find.description"}} - {{/if}} -
-
-
- {{#if this.followActor}} -
- - -
- {{else if this.finding}} - {{loading-spinner size="small"}} - {{else if this.notFound}} - {{i18n - "discourse_activity_pub.actor_follow.find.not_found" - handle=this.handle - }} - {{/if}} -
-
- -
\ No newline at end of file diff --git a/assets/javascripts/discourse/components/modal/activity-pub-actor-follow.js b/assets/javascripts/discourse/components/modal/activity-pub-actor-follow.js deleted file mode 100644 index 860135b6..00000000 --- a/assets/javascripts/discourse/components/modal/activity-pub-actor-follow.js +++ /dev/null @@ -1,83 +0,0 @@ -import Component from "@glimmer/component"; -import { tracked } from "@glimmer/tracking"; -import { action } from "@ember/object"; -import { service } from "@ember/service"; -import { i18n } from "discourse-i18n"; -import ActivityPubActor from "../../models/activity-pub-actor"; -import ActivityPubWebfinger from "../../models/activity-pub-webfinger"; - -export default class ActivityPubFollowRemote extends Component { - @service site; - - @tracked verifying = false; - @tracked error = null; - @tracked followActor; - - get title() { - return i18n("discourse_activity_pub.actor_follow.title", { - actor: this.args.model.actor.name, - }); - } - - get footerClass() { - let result = "activity-pub-actor-follow-find-footer"; - if (this.error) { - result += " error"; - } - return result; - } - - get actorClass() { - let result = "activity-pub-actor-follow-actor-container"; - if (!this.followActor) { - result += " no-actor"; - } - return result; - } - - get notFound() { - return this.followActor === false; - } - - @action - onKeyup(e) { - this.error = null; - - if (e.key === "Enter") { - this.find(); - } else { - this.followActor = null; - } - } - - @action - follow(actor, followActor) { - return this.args.model.follow(actor, followActor).then(() => { - this.args.closeModal(); - }); - } - - @action - async find() { - const handle = this.handle; - - if (!handle) { - return; - } - - this.validating = true; - const validated = await ActivityPubWebfinger.validateHandle(handle); - this.validating = false; - - if (validated) { - this.finding = true; - this.followActor = await ActivityPubActor.findByHandle( - this.args.model.actor.id, - handle - ); - this.finding = false; - } else { - this.error = i18n("discourse_activity_pub.actor_follow.find.invalid"); - } - } -} diff --git a/assets/javascripts/discourse/components/modal/activity-pub-actor-reject.gjs b/assets/javascripts/discourse/components/modal/activity-pub-actor-reject.gjs new file mode 100644 index 00000000..6fe92314 --- /dev/null +++ b/assets/javascripts/discourse/components/modal/activity-pub-actor-reject.gjs @@ -0,0 +1,48 @@ +import Component from "@glimmer/component"; +import { action } from "@ember/object"; +import DButton from "discourse/components/d-button"; +import DModal from "discourse/components/d-modal"; +import DModalCancel from "discourse/components/d-modal-cancel"; +import { i18n } from "discourse-i18n"; + +export default class ActivityPubActorReject extends Component { + get title() { + return i18n("discourse_activity_pub.actor_reject.modal_title", { + actor: this.args.model.actor?.name, + }); + } + + @action + reject() { + const model = this.args.model; + model.reject(model.actor, model.follower); + this.args.closeModal(); + } + + +} diff --git a/assets/javascripts/discourse/components/modal/activity-pub-actor-reject.hbs b/assets/javascripts/discourse/components/modal/activity-pub-actor-reject.hbs deleted file mode 100644 index e9c187e8..00000000 --- a/assets/javascripts/discourse/components/modal/activity-pub-actor-reject.hbs +++ /dev/null @@ -1,24 +0,0 @@ - - <:body> -
- {{i18n - "discourse_activity_pub.actor_reject.confirm" - actor=@model.actor.name - follower=@model.follower.handle - }} -
- - - <:footer> - - - -
\ No newline at end of file diff --git a/assets/javascripts/discourse/components/modal/activity-pub-actor-reject.js b/assets/javascripts/discourse/components/modal/activity-pub-actor-reject.js deleted file mode 100644 index 0353456f..00000000 --- a/assets/javascripts/discourse/components/modal/activity-pub-actor-reject.js +++ /dev/null @@ -1,18 +0,0 @@ -import Component from "@glimmer/component"; -import { action } from "@ember/object"; -import { i18n } from "discourse-i18n"; - -export default class ActivityPubActorReject extends Component { - get title() { - return i18n("discourse_activity_pub.actor_reject.modal_title", { - actor: this.args.model.actor?.name, - }); - } - - @action - reject() { - const model = this.args.model; - model.reject(model.actor, model.follower); - this.args.closeModal(); - } -} diff --git a/assets/javascripts/discourse/components/modal/activity-pub-actor-unfollow.gjs b/assets/javascripts/discourse/components/modal/activity-pub-actor-unfollow.gjs new file mode 100644 index 00000000..ca3a0ad1 --- /dev/null +++ b/assets/javascripts/discourse/components/modal/activity-pub-actor-unfollow.gjs @@ -0,0 +1,48 @@ +import Component from "@glimmer/component"; +import { action } from "@ember/object"; +import DButton from "discourse/components/d-button"; +import DModal from "discourse/components/d-modal"; +import DModalCancel from "discourse/components/d-modal-cancel"; +import { i18n } from "discourse-i18n"; + +export default class ActivityPubActorUnfollow extends Component { + get title() { + return i18n("discourse_activity_pub.actor_unfollow.modal_title", { + actor: this.args.model.actor.name, + }); + } + + @action + unfollow() { + const model = this.args.model; + model.unfollow(model.actor, model.followedActor); + this.args.closeModal(); + } + + +} diff --git a/assets/javascripts/discourse/components/modal/activity-pub-actor-unfollow.hbs b/assets/javascripts/discourse/components/modal/activity-pub-actor-unfollow.hbs deleted file mode 100644 index 834b8662..00000000 --- a/assets/javascripts/discourse/components/modal/activity-pub-actor-unfollow.hbs +++ /dev/null @@ -1,24 +0,0 @@ - - <:body> -
- {{i18n - "discourse_activity_pub.actor_unfollow.confirm" - actor=@model.actor.name - followed_actor=@model.followedActor.handle - }} -
- - - <:footer> - - - -
\ No newline at end of file diff --git a/assets/javascripts/discourse/components/modal/activity-pub-actor-unfollow.js b/assets/javascripts/discourse/components/modal/activity-pub-actor-unfollow.js deleted file mode 100644 index 0fc84606..00000000 --- a/assets/javascripts/discourse/components/modal/activity-pub-actor-unfollow.js +++ /dev/null @@ -1,18 +0,0 @@ -import Component from "@glimmer/component"; -import { action } from "@ember/object"; -import { i18n } from "discourse-i18n"; - -export default class ActivityPubActorUnfollow extends Component { - get title() { - return i18n("discourse_activity_pub.actor_unfollow.modal_title", { - actor: this.args.model.actor.name, - }); - } - - @action - unfollow() { - const model = this.args.model; - model.unfollow(model.actor, model.followedActor); - this.args.closeModal(); - } -} diff --git a/assets/javascripts/discourse/components/modal/activity-pub-follow.gjs b/assets/javascripts/discourse/components/modal/activity-pub-follow.gjs new file mode 100644 index 00000000..7f3447c6 --- /dev/null +++ b/assets/javascripts/discourse/components/modal/activity-pub-follow.gjs @@ -0,0 +1,35 @@ +import Component from "@glimmer/component"; +import DModal from "discourse/components/d-modal"; +import { i18n } from "discourse-i18n"; +import ActivityPubFollowDomain from "../activity-pub-follow-domain"; +import ActivityPubHandle from "../activity-pub-handle"; + +export default class ActivityPubFollow extends Component { + get title() { + const actor = this.args.model.actor; + return i18n("discourse_activity_pub.follow.title", { + actor: actor.name || actor.username, + }); + } + + +} diff --git a/assets/javascripts/discourse/components/modal/activity-pub-follow.hbs b/assets/javascripts/discourse/components/modal/activity-pub-follow.hbs deleted file mode 100644 index 1e7c9612..00000000 --- a/assets/javascripts/discourse/components/modal/activity-pub-follow.hbs +++ /dev/null @@ -1,18 +0,0 @@ - - <:body> -
- - - -
- {{i18n "discourse_activity_pub.handle.description"}} -
-
- -
\ No newline at end of file diff --git a/assets/javascripts/discourse/components/modal/activity-pub-follow.js b/assets/javascripts/discourse/components/modal/activity-pub-follow.js deleted file mode 100644 index e9c7f727..00000000 --- a/assets/javascripts/discourse/components/modal/activity-pub-follow.js +++ /dev/null @@ -1,11 +0,0 @@ -import Component from "@glimmer/component"; -import { i18n } from "discourse-i18n"; - -export default class ActivityPubFollow extends Component { - get title() { - const actor = this.args.model.actor; - return i18n("discourse_activity_pub.follow.title", { - actor: actor.name || actor.username, - }); - } -} diff --git a/assets/javascripts/discourse/components/modal/activity-pub-log-json.gjs b/assets/javascripts/discourse/components/modal/activity-pub-log-json.gjs new file mode 100644 index 00000000..60120506 --- /dev/null +++ b/assets/javascripts/discourse/components/modal/activity-pub-log-json.gjs @@ -0,0 +1,65 @@ +import Component from "@glimmer/component"; +import { tracked } from "@glimmer/tracking"; +import { action } from "@ember/object"; +import DButton from "discourse/components/d-button"; +import DModal from "discourse/components/d-modal"; +import formatDate from "discourse/helpers/format-date"; +import htmlSafe from "discourse/helpers/html-safe"; +import discourseLater from "discourse/lib/later"; +import { clipboardCopy } from "discourse/lib/utilities"; +import { i18n } from "discourse-i18n"; + +export default class ActivityPubLogJson extends Component { + @tracked copied = false; + + get jsonDisplay() { + return JSON.stringify(this.args.model.log.json, null, 4); + } + + @action + copyToClipboard() { + clipboardCopy(this.args.model.log.json); + this.copied = true; + discourseLater(() => { + this.copied = false; + }, 3000); + } + + +} diff --git a/assets/javascripts/discourse/components/modal/activity-pub-log-json.hbs b/assets/javascripts/discourse/components/modal/activity-pub-log-json.hbs deleted file mode 100644 index e8015f00..00000000 --- a/assets/javascripts/discourse/components/modal/activity-pub-log-json.hbs +++ /dev/null @@ -1,35 +0,0 @@ - - <:body> -
-
- {{htmlSafe - (i18n - "admin.discourse_activity_pub.log.json.logged_at" - logged_at=(formatDate - @model.log.created_at format="medium" leaveAgo="true" - ) - ) - }} -
-
- {{#if this.copied}} - - {{i18n "admin.discourse_activity_pub.log.json.copy.success"}} - - {{/if}} - -
-
-
{{this.jsonDisplay}}
- -
\ No newline at end of file diff --git a/assets/javascripts/discourse/components/modal/activity-pub-log-json.js b/assets/javascripts/discourse/components/modal/activity-pub-log-json.js deleted file mode 100644 index 2d92c602..00000000 --- a/assets/javascripts/discourse/components/modal/activity-pub-log-json.js +++ /dev/null @@ -1,22 +0,0 @@ -import Component from "@glimmer/component"; -import { tracked } from "@glimmer/tracking"; -import { action } from "@ember/object"; -import discourseLater from "discourse/lib/later"; -import { clipboardCopy } from "discourse/lib/utilities"; - -export default class ActivityPubLogJson extends Component { - @tracked copied = false; - - get jsonDisplay() { - return JSON.stringify(this.args.model.log.json, null, 4); - } - - @action - copyToClipboard() { - clipboardCopy(this.args.model.log.json); - this.copied = true; - discourseLater(() => { - this.copied = false; - }, 3000); - } -} diff --git a/assets/javascripts/discourse/lib/activity-pub-utilities.js b/assets/javascripts/discourse/lib/activity-pub-utilities.js index e04fd6c4..18811122 100644 --- a/assets/javascripts/discourse/lib/activity-pub-utilities.js +++ b/assets/javascripts/discourse/lib/activity-pub-utilities.js @@ -10,29 +10,22 @@ function getStatusDatetimeFormat(infoStatus = false) { } export function buildHandle({ actor, model, site }) { - if ((!actor && !model) || (model && !site)) { - return undefined; - } else { - const username = actor ? actor.username : model.activity_pub_username; - const domain = actor ? actor.domain : site.activity_pub_host; - return `@${username}@${domain}`; + if (actor) { + return `@${actor.username}@${actor.domain}`; + } else if (model && site) { + return `@${model.activity_pub_username}@${site.activity_pub_host}`; } } export function showStatusToUser(user, siteSettings) { - if (!siteSettings) { - return false; - } const groupIds = siteSettings.activity_pub_post_status_visibility_groups .split("|") .map(Number); - if (groupIds.includes(AUTO_GROUPS.everyone.id)) { - return true; - } - if (!user) { - return false; - } - return user.groups.some((group) => groupIds.includes(group.id)); + + return ( + groupIds.includes(AUTO_GROUPS.everyone.id) || + user?.groups.some((group) => groupIds.includes(group.id)) + ); } export function activityPubPostStatus(post) { diff --git a/assets/javascripts/discourse/templates/activity-pub-about.gjs b/assets/javascripts/discourse/templates/activity-pub-about.gjs new file mode 100644 index 00000000..c227ecbd --- /dev/null +++ b/assets/javascripts/discourse/templates/activity-pub-about.gjs @@ -0,0 +1,32 @@ +import RouteTemplate from "ember-route-template"; +import { i18n } from "discourse-i18n"; +import ActivityPubActorCard from "../components/activity-pub-actor-card"; + +export default RouteTemplate( + +); diff --git a/assets/javascripts/discourse/templates/activity-pub-about.hbs b/assets/javascripts/discourse/templates/activity-pub-about.hbs deleted file mode 100644 index 74ca50af..00000000 --- a/assets/javascripts/discourse/templates/activity-pub-about.hbs +++ /dev/null @@ -1,24 +0,0 @@ -
-

{{i18n "discourse_activity_pub.about.title"}}

-

{{i18n "discourse_activity_pub.about.description"}}

- {{#if this.hasCategoryActors}} -
-

{{i18n "discourse_activity_pub.about.categories"}}

-
- {{#each this.categoryActors as |actor|}} - - {{/each}} -
-
- {{/if}} - {{#if this.hasTagActors}} -
-

{{i18n "discourse_activity_pub.about.tags"}}

-
- {{#each this.tagActors as |actor|}} - - {{/each}} -
-
- {{/if}} -
\ No newline at end of file diff --git a/assets/javascripts/discourse/templates/activity-pub-actor-followers.gjs b/assets/javascripts/discourse/templates/activity-pub-actor-followers.gjs new file mode 100644 index 00000000..79ce79f1 --- /dev/null +++ b/assets/javascripts/discourse/templates/activity-pub-actor-followers.gjs @@ -0,0 +1,104 @@ +import { concat } from "@ember/helper"; +import RouteTemplate from "ember-route-template"; +import ConditionalLoadingSpinner from "discourse/components/conditional-loading-spinner"; +import LoadMore from "discourse/components/load-more"; +import ResponsiveTable from "discourse/components/responsive-table"; +import TableHeaderToggle from "discourse/components/table-header-toggle"; +import avatar from "discourse/helpers/avatar"; +import boundDate from "discourse/helpers/bound-date"; +import routeAction from "discourse/helpers/route-action"; +import { i18n } from "discourse-i18n"; +import ActivityPubActor from "../components/activity-pub-actor"; +import ActivityPubFollowBtn from "../components/activity-pub-follow-btn"; + +export default RouteTemplate( + +); diff --git a/assets/javascripts/discourse/templates/activity-pub-actor-followers.hbs b/assets/javascripts/discourse/templates/activity-pub-actor-followers.hbs deleted file mode 100644 index c777a332..00000000 --- a/assets/javascripts/discourse/templates/activity-pub-actor-followers.hbs +++ /dev/null @@ -1,83 +0,0 @@ - - {{#if this.hasActors}} - - <:header> - - - - {{#if this.currentUser.admin}} -
- {{i18n - "discourse_activity_pub.follow_table.actions" - }} -
- {{/if}} - - <:body> - {{#each this.actors as |follower|}} -
-
- -
-
- {{#if follower.model}} - - {{avatar follower.model imageSize="small"}} - - {{/if}} -
-
- {{bound-date follower.followed_at}} -
- {{#if this.currentUser.admin}} -
- -
- {{/if}} -
- {{/each}} - -
- - - {{else}} -

{{i18n "search.no_results"}}

- {{/if}} -
\ No newline at end of file diff --git a/assets/javascripts/discourse/templates/activity-pub-actor-follows.gjs b/assets/javascripts/discourse/templates/activity-pub-actor-follows.gjs new file mode 100644 index 00000000..40054229 --- /dev/null +++ b/assets/javascripts/discourse/templates/activity-pub-actor-follows.gjs @@ -0,0 +1,104 @@ +import { concat } from "@ember/helper"; +import RouteTemplate from "ember-route-template"; +import ConditionalLoadingSpinner from "discourse/components/conditional-loading-spinner"; +import LoadMore from "discourse/components/load-more"; +import ResponsiveTable from "discourse/components/responsive-table"; +import TableHeaderToggle from "discourse/components/table-header-toggle"; +import avatar from "discourse/helpers/avatar"; +import boundDate from "discourse/helpers/bound-date"; +import routeAction from "discourse/helpers/route-action"; +import { i18n } from "discourse-i18n"; +import ActivityPubActor from "../components/activity-pub-actor"; +import ActivityPubFollowBtn from "../components/activity-pub-follow-btn"; + +export default RouteTemplate( + +); diff --git a/assets/javascripts/discourse/templates/activity-pub-actor-follows.hbs b/assets/javascripts/discourse/templates/activity-pub-actor-follows.hbs deleted file mode 100644 index 7e9e263a..00000000 --- a/assets/javascripts/discourse/templates/activity-pub-actor-follows.hbs +++ /dev/null @@ -1,79 +0,0 @@ - - {{#if this.hasActors}} - - <:header> - - - - - - <:body> - {{#each this.actors as |actor|}} -
-
- -
-
- {{#if actor.model}} - - {{avatar actor.model imageSize="small"}} - - {{/if}} -
-
- {{#if actor.followed_at}} - {{bound-date actor.followed_at}} - {{else}} - {{i18n "discourse_activity_pub.follow_table.follow_pending"}} - {{/if}} -
-
- -
-
- {{/each}} - -
- - - {{else}} -

{{i18n "search.no_results"}}

- {{/if}} -
\ No newline at end of file diff --git a/assets/javascripts/discourse/templates/activity-pub-actor.gjs b/assets/javascripts/discourse/templates/activity-pub-actor.gjs new file mode 100644 index 00000000..1f380466 --- /dev/null +++ b/assets/javascripts/discourse/templates/activity-pub-actor.gjs @@ -0,0 +1,27 @@ +import RouteTemplate from "ember-route-template"; +import Navigation from "discourse/components/discovery/navigation"; +import routeAction from "discourse/helpers/route-action"; +import ActivityPubBanner from "../components/activity-pub-banner"; +import ActivityPubNav from "../components/activity-pub-nav"; + +export default RouteTemplate( + +); diff --git a/assets/javascripts/discourse/templates/activity-pub-actor.hbs b/assets/javascripts/discourse/templates/activity-pub-actor.hbs deleted file mode 100644 index ad214089..00000000 --- a/assets/javascripts/discourse/templates/activity-pub-actor.hbs +++ /dev/null @@ -1,14 +0,0 @@ - - -{{#if this.site.activity_pub_publishing_enabled}} - -{{/if}} - - - -{{outlet}} \ No newline at end of file diff --git a/assets/javascripts/discourse/templates/admin-plugins-activity-pub-actor-show.gjs b/assets/javascripts/discourse/templates/admin-plugins-activity-pub-actor-show.gjs new file mode 100644 index 00000000..602bf661 --- /dev/null +++ b/assets/javascripts/discourse/templates/admin-plugins-activity-pub-actor-show.gjs @@ -0,0 +1,213 @@ +import { Input } from "@ember/component"; +import { fn, hash } from "@ember/helper"; +import { on } from "@ember/modifier"; +import RouteTemplate from "ember-route-template"; +import { and, eq, not } from "truth-helpers"; +import ConditionalLoadingSpinner from "discourse/components/conditional-loading-spinner"; +import DButton from "discourse/components/d-button"; +import DToggleSwitch from "discourse/components/d-toggle-switch"; +import icon from "discourse/helpers/d-icon"; +import { i18n } from "discourse-i18n"; +import ActivityPubActorModel from "../components/activity-pub-actor-model"; +import ActivityPubActorStatus from "../components/activity-pub-actor-status"; +import ActivityPubCategoryChooser from "../components/activity-pub-category-chooser"; +import ActivityPubHandle from "../components/activity-pub-handle"; +import ActivityPubPostObjectTypeDropdown from "../components/activity-pub-post-object-type-dropdown"; +import ActivityPubPublicationTypeDropdown from "../components/activity-pub-publication-type-dropdown"; +import ActivityPubSiteSettingNotice from "../components/activity-pub-site-setting-notice"; +import ActivityPubTagChooser from "../components/activity-pub-tag-chooser"; +import ActivityPubVisibilityDropdown from "../components/activity-pub-visibility-dropdown"; + +export default RouteTemplate( + +); diff --git a/assets/javascripts/discourse/templates/admin-plugins-activity-pub-actor-show.hbs b/assets/javascripts/discourse/templates/admin-plugins-activity-pub-actor-show.hbs deleted file mode 100644 index 4ff8ffcb..00000000 --- a/assets/javascripts/discourse/templates/admin-plugins-activity-pub-actor-show.hbs +++ /dev/null @@ -1,174 +0,0 @@ -
-
-

{{this.titleLabel}}

-
- -
- {{#if this.actor.isNew}} -
- {{#if (eq this.actor.model_type "category")}} - - {{/if}} - {{#if (eq this.actor.model_type "tag")}} - - {{/if}} -
- {{else}} - - - -
- -
- {{/if}} -
- -
-
- {{#if this.showForm}} -
- -
- - @{{this.site.activity_pub_host}} -
-
- {{i18n - "admin.discourse_activity_pub.actor.username_description" - min_length=this.siteSettings.min_username_length - max_length=this.siteSettings.max_username_length - }} -
-
- -
- - -
- {{i18n "admin.discourse_activity_pub.actor.name_description"}} -
-
- - {{#if this.site.activity_pub_publishing_enabled}} -
- - -
- {{i18n - "admin.discourse_activity_pub.actor.default_visibility_description" - }} -
-
- -
- - -
- {{i18n - "admin.discourse_activity_pub.actor.post_object_type_description" - }} -
-
- -
- - -
- {{i18n - "admin.discourse_activity_pub.actor.publication_type_description" - }} -
-
- {{/if}} - {{/if}} -
- -
- {{#if (and this.showForm this.siteSettings.login_required)}} -
-
- {{i18n "admin.discourse_activity_pub.actor.site_setting.title"}} -
- - -
- {{/if}} -
-
- -
- {{#if this.showForm}} - - {{#if this.saveResponse}} - - {{#if this.saveSuccess}} - {{d-icon "check"}} - {{i18n "admin.discourse_activity_pub.actor.save.success"}} - {{else}} - {{d-icon "xmark"}} - {{i18n "admin.discourse_activity_pub.actor.save.failed"}} - {{/if}} - - {{/if}} - - {{/if}} -
-
\ No newline at end of file diff --git a/assets/javascripts/discourse/templates/admin-plugins-activity-pub-actor.gjs b/assets/javascripts/discourse/templates/admin-plugins-activity-pub-actor.gjs new file mode 100644 index 00000000..07f1d5b5 --- /dev/null +++ b/assets/javascripts/discourse/templates/admin-plugins-activity-pub-actor.gjs @@ -0,0 +1,84 @@ +import { fn } from "@ember/helper"; +import RouteTemplate from "ember-route-template"; +import ConditionalLoadingSpinner from "discourse/components/conditional-loading-spinner"; +import DButton from "discourse/components/d-button"; +import LoadMore from "discourse/components/load-more"; +import ResponsiveTable from "discourse/components/responsive-table"; +import TableHeaderToggle from "discourse/components/table-header-toggle"; +import { i18n } from "discourse-i18n"; +import ActivityPubActor from "../components/activity-pub-actor"; +import ActivityPubActorModel from "../components/activity-pub-actor-model"; + +export default RouteTemplate( + +); diff --git a/assets/javascripts/discourse/templates/admin-plugins-activity-pub-actor.hbs b/assets/javascripts/discourse/templates/admin-plugins-activity-pub-actor.hbs deleted file mode 100644 index 4b67246b..00000000 --- a/assets/javascripts/discourse/templates/admin-plugins-activity-pub-actor.hbs +++ /dev/null @@ -1,63 +0,0 @@ -
-

{{this.title}}

-
- - - {{#if this.hasActors}} - - <:header> - - -
-
- {{i18n "admin.discourse_activity_pub.actor.table.actions"}} -
-
- - <:body> - {{#each this.actors as |actor|}} -
-
- -
-
- -
-
- -
-
- {{/each}} - -
- - - {{else}} -

{{i18n "search.no_results"}}

- {{/if}} -
\ No newline at end of file diff --git a/assets/javascripts/discourse/templates/admin-plugins-activity-pub-log.gjs b/assets/javascripts/discourse/templates/admin-plugins-activity-pub-log.gjs new file mode 100644 index 00000000..02300b00 --- /dev/null +++ b/assets/javascripts/discourse/templates/admin-plugins-activity-pub-log.gjs @@ -0,0 +1,90 @@ +import { fn } from "@ember/helper"; +import RouteTemplate from "ember-route-template"; +import ConditionalLoadingSpinner from "discourse/components/conditional-loading-spinner"; +import DButton from "discourse/components/d-button"; +import LoadMore from "discourse/components/load-more"; +import ResponsiveTable from "discourse/components/responsive-table"; +import TableHeaderToggle from "discourse/components/table-header-toggle"; +import formatDate from "discourse/helpers/format-date"; +import { i18n } from "discourse-i18n"; + +export default RouteTemplate( + +); diff --git a/assets/javascripts/discourse/templates/admin-plugins-activity-pub-log.hbs b/assets/javascripts/discourse/templates/admin-plugins-activity-pub-log.hbs deleted file mode 100644 index 9f6a3871..00000000 --- a/assets/javascripts/discourse/templates/admin-plugins-activity-pub-log.hbs +++ /dev/null @@ -1,76 +0,0 @@ -
-

{{i18n "admin.discourse_activity_pub.log.title"}}

-
- - - {{#if this.hasLogs}} - - <:header> - - - -
-
- {{i18n "admin.discourse_activity_pub.log.json.label"}} -
-
- - <:body> - {{#each this.logs as |log|}} -
-
- {{formatDate log.created_at leaveAgo="true"}} -
-
- {{log.level}} -
-
- {{log.message}} -
-
- {{#if log.json}} - - {{/if}} -
-
- {{/each}} - -
- - - {{else}} -

{{i18n "search.no_results"}}

- {{/if}} -
\ No newline at end of file diff --git a/assets/javascripts/discourse/templates/admin-plugins-activity-pub.gjs b/assets/javascripts/discourse/templates/admin-plugins-activity-pub.gjs new file mode 100644 index 00000000..545cd362 --- /dev/null +++ b/assets/javascripts/discourse/templates/admin-plugins-activity-pub.gjs @@ -0,0 +1,50 @@ +import { hash } from "@ember/helper"; +import { LinkTo } from "@ember/routing"; +import RouteTemplate from "ember-route-template"; +import icon from "discourse/helpers/d-icon"; +import { i18n } from "discourse-i18n"; +import AdminNav from "admin/components/admin-nav"; + +export default RouteTemplate( + +); diff --git a/assets/javascripts/discourse/templates/admin-plugins-activity-pub.hbs b/assets/javascripts/discourse/templates/admin-plugins-activity-pub.hbs deleted file mode 100644 index 816fd1ab..00000000 --- a/assets/javascripts/discourse/templates/admin-plugins-activity-pub.hbs +++ /dev/null @@ -1,37 +0,0 @@ -{{#admin-nav}} -
  • - - {{i18n "admin.discourse_activity_pub.actor.category.label"}} - -
  • -
  • - - {{i18n "admin.discourse_activity_pub.actor.tag.label"}} - -
  • -
  • - - {{i18n "admin.discourse_activity_pub.log.label"}} - -
  • -
  • - - {{d-icon "plus"}} - {{i18n this.addActorLabel}} - -
  • -{{/admin-nav}} - -
    - {{outlet}} -
    \ No newline at end of file diff --git a/assets/javascripts/discourse/templates/preferences/activity-pub.gjs b/assets/javascripts/discourse/templates/preferences/activity-pub.gjs new file mode 100644 index 00000000..f140457f --- /dev/null +++ b/assets/javascripts/discourse/templates/preferences/activity-pub.gjs @@ -0,0 +1,88 @@ +import { concat, fn } from "@ember/helper"; +import RouteTemplate from "ember-route-template"; +import DButton from "discourse/components/d-button"; +import ResponsiveTable from "discourse/components/responsive-table"; +import bodyClass from "discourse/helpers/body-class"; +import { i18n } from "discourse-i18n"; +import ActivityPubActor from "../../components/activity-pub-actor"; +import ActivityPubAuthorize from "../../components/activity-pub-authorize"; + +export default RouteTemplate( + +); diff --git a/assets/javascripts/discourse/templates/preferences/activity-pub.hbs b/assets/javascripts/discourse/templates/preferences/activity-pub.hbs deleted file mode 100644 index ac5deaef..00000000 --- a/assets/javascripts/discourse/templates/preferences/activity-pub.hbs +++ /dev/null @@ -1,71 +0,0 @@ -{{body-class "user-preferences-activity-pub-page"}} - -
    - -
    - - -
    -
    - -{{#if this.hasAuthorizations}} -
    - - <:header> -
    -
    - {{i18n "user.discourse_activity_pub.actor"}} -
    -
    -
    -
    - {{i18n "user.discourse_activity_pub.auth_type"}} -
    -
    -
    -
    - {{i18n "user.discourse_activity_pub.actions"}} -
    -
    - - <:body> - {{#each this.authorizations as |authorization|}} -
    -
    - -
    -
    - {{i18n - (concat - "user.discourse_activity_pub.authorize.auth_type." - authorization.auth_type - ".title" - ) - }} -
    -
    - -
    -
    - {{/each}} - -
    -
    -{{/if}} \ No newline at end of file diff --git a/assets/stylesheets/common/common.scss b/assets/stylesheets/common/common.scss index 2b18ad05..ebc55d9f 100644 --- a/assets/stylesheets/common/common.scss +++ b/assets/stylesheets/common/common.scss @@ -422,7 +422,7 @@ body.user-preferences-activity-pub-page { align-items: center; justify-content: space-between; - @media all and (max-width: 400px) { + @media all and (width <= 400px) { flex-flow: wrap; gap: 1em; diff --git a/package.json b/package.json index 8cdc01bf..882f8af7 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,11 @@ { "private": true, "devDependencies": { - "@discourse/lint-configs": "2.11.1", - "ember-template-lint": "7.0.1", - "eslint": "9.22.0", + "@discourse/lint-configs": "2.17.2", + "ember-template-lint": "7.6.0", + "eslint": "9.26.0", "prettier": "3.5.3", - "stylelint": "16.16.0" + "stylelint": "16.19.1" }, "engines": { "node": ">= 22", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ae987b46..2f117150 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,20 +9,20 @@ importers: .: devDependencies: '@discourse/lint-configs': - specifier: 2.11.1 - version: 2.11.1(ember-template-lint@7.0.1(@babel/core@7.26.10))(eslint@9.22.0)(postcss@8.5.3)(prettier@3.5.3)(stylelint@16.16.0(typescript@5.8.2)) + specifier: 2.17.2 + version: 2.17.2(ember-template-lint@7.6.0(@babel/core@7.27.1))(eslint@9.26.0)(postcss@8.5.3)(prettier@3.5.3)(stylelint@16.19.1(typescript@5.8.3)) ember-template-lint: - specifier: 7.0.1 - version: 7.0.1(@babel/core@7.26.10) + specifier: 7.6.0 + version: 7.6.0(@babel/core@7.27.1) eslint: - specifier: 9.22.0 - version: 9.22.0 + specifier: 9.26.0 + version: 9.26.0 prettier: specifier: 3.5.3 version: 3.5.3 stylelint: - specifier: 16.16.0 - version: 16.16.0(typescript@5.8.2) + specifier: 16.19.1 + version: 16.19.1(typescript@5.8.3) packages: @@ -30,130 +30,130 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.8': - resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + '@babel/compat-data@7.27.2': + resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.26.10': - resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + '@babel/core@7.27.1': + resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==} engines: {node: '>=6.9.0'} - '@babel/eslint-parser@7.26.10': - resolution: {integrity: sha512-QsfQZr4AiLpKqn7fz+j7SN+f43z2DZCgGyYbNJ2vJOqKfG4E6MZer1+jqGZqKJaxq/gdO2DC/nUu45+pOL5p2Q==} + '@babel/eslint-parser@7.27.1': + resolution: {integrity: sha512-q8rjOuadH0V6Zo4XLMkJ3RMQ9MSBqwaDByyYB0izsYdaIWGNLmEblbCOf1vyFHICcg16CD7Fsi51vcQnYxmt6Q==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': ^7.11.0 eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - '@babel/generator@7.26.10': - resolution: {integrity: sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==} + '@babel/generator@7.27.1': + resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.25.9': - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + '@babel/helper-annotate-as-pure@7.27.1': + resolution: {integrity: sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.26.5': - resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.26.9': - resolution: {integrity: sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==} + '@babel/helper-create-class-features-plugin@7.27.1': + resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-member-expression-to-functions@7.25.9': - resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + '@babel/helper-module-transforms@7.27.1': + resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.25.9': - resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.26.5': - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/helper-replace-supers@7.26.5': - resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.26.10': - resolution: {integrity: sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==} + '@babel/helpers@7.27.1': + resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.10': - resolution: {integrity: sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==} + '@babel/parser@7.27.2': + resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-proposal-decorators@7.25.9': - resolution: {integrity: sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==} + '@babel/plugin-proposal-decorators@7.27.1': + resolution: {integrity: sha512-DTxe4LBPrtFdsWzgpmbBKevg3e9PBy+dXRt19kSbucbZvL2uqtdqwwpluL1jfxYE0wIDTFp1nTy/q6gNLsxXrg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-decorators@7.25.9': - resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==} + '@babel/plugin-syntax-decorators@7.27.1': + resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.25.9': - resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.26.8': - resolution: {integrity: sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==} + '@babel/plugin-transform-typescript@7.27.1': + resolution: {integrity: sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/template@7.26.9': - resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.10': - resolution: {integrity: sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==} + '@babel/traverse@7.27.1': + resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.10': - resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} + '@babel/types@7.27.1': + resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} engines: {node: '>=6.9.0'} '@csstools/css-parser-algorithms@3.0.4': @@ -179,13 +179,13 @@ packages: peerDependencies: postcss-selector-parser: ^7.0.0 - '@discourse/lint-configs@2.11.1': - resolution: {integrity: sha512-VQh052cXp43ytw+dn+pIyM5BMtgACXZ0z+tNpXVcRwiJWn8dbvuJaypFgWR6QCks3AKujypmLK8+FMnlZYZGRQ==} + '@discourse/lint-configs@2.17.2': + resolution: {integrity: sha512-hb0n4GDYZj6zKQq+Ls9dlYpC4wCT1vSTxsm2KZTyabCiDipDkYXXabDV+cirNrHfDuDrVXIe7Wsxn4OWX0zbrQ==} peerDependencies: - ember-template-lint: 7.0.1 - eslint: 9.22.0 + ember-template-lint: 7.6.0 + eslint: 9.26.0 prettier: 3.5.3 - stylelint: 16.16.0 + stylelint: 16.19.1 '@dual-bundle/import-meta-resolve@4.1.0': resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} @@ -193,8 +193,8 @@ packages: '@ember-data/rfc395-data@0.0.4': resolution: {integrity: sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ==} - '@eslint-community/eslint-utils@4.5.1': - resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -203,32 +203,32 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.2': - resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + '@eslint/config-array@0.20.0': + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.1.0': - resolution: {integrity: sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==} + '@eslint/config-helpers@0.2.2': + resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.12.0': - resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + '@eslint/core@0.13.0': + resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.0': - resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.22.0': - resolution: {integrity: sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==} + '@eslint/js@9.26.0': + resolution: {integrity: sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.7': - resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} + '@eslint/plugin-kit@0.2.8': + resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@glimmer/env@0.1.7': @@ -283,8 +283,8 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.2': - resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} '@jridgewell/gen-mapping@0.3.8': @@ -312,6 +312,10 @@ packages: resolution: {integrity: sha512-F5z53uvRIF4dYfFfJP3a2Cqg+4P1dgJchJsFnsZE0eZp0LK8X7g2J0CsJHRgns+skpXOlM7n5vFGwkWCWj8qJg==} engines: {node: 12.* || >= 14} + '@modelcontextprotocol/sdk@1.11.2': + resolution: {integrity: sha512-H9vwztj5OAqHg9GockCQC06k1natgcxWQSRpQcPJf6i5+MWBzfKkRtxGbjQf0X2ihii0ffLZCRGbYV2f2bjNCQ==} + engines: {node: '>=18'} + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} @@ -340,8 +344,8 @@ packages: '@types/eslint@8.56.12': resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -349,6 +353,10 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -392,8 +400,8 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} engines: {node: '>= 0.4'} array.prototype.flat@1.3.3: @@ -442,6 +450,10 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -449,8 +461,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + browserslist@4.24.5: + resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -460,8 +472,12 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - cacheable@1.8.9: - resolution: {integrity: sha512-FicwAUyWnrtnd4QqYAoRlNs44/a1jTL7XDKqm5gJ90wz1DQPlC7U2Rd1Tydpv+E7WAr4sQHuw8Q8M3nZMAyecQ==} + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cacheable@1.9.0: + resolution: {integrity: sha512-8D5htMCxPDUULux9gFzv30f04Xo3wCnik0oOxKoRTPIBoqA7HtOcJ87uBhQTs3jCfZZTrUBGsYIZOgE0ZRgMAg==} call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} @@ -479,8 +495,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001704: - resolution: {integrity: sha512-+L2IgBbV6gXB4ETf0keSvLr7JUrRVbIaB/lrQ1+z8mRcQiisG5k+lG6O4n6Y5q6f5EuNfaYXKgymucphlEXQew==} + caniuse-lite@1.0.30001717: + resolution: {integrity: sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -531,6 +547,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + content-tag-utils@0.3.1: resolution: {integrity: sha512-uBAmklAxqmem7WX/F7YA4eWBTegGLJ93MOPSJaJliAuzTNgF3u/H9YLlJ6Nae9/FwV+037OuXc75hvcmub1qww==} engines: {node: '>= 18'} @@ -538,12 +558,28 @@ packages: content-tag@2.0.3: resolution: {integrity: sha512-htLIdtfhhKW2fHlFLnZH7GFzHSdSpHhDLrWVswkNiiPMZ5uXq5JfrGboQKFhNQuAAFF8VNB2EYUj3MsdJrKKpg==} - content-tag@3.1.1: - resolution: {integrity: sha512-94puwVk6X8oJcbRIEY03UM80zWzA3dYgGkOiRJzeY1vXgwrFUh3OolDDi/D7YBa6Vsx+CgAvuk4uXlB8loZ1FA==} + content-tag@3.1.3: + resolution: {integrity: sha512-4Kiv9mEroxuMXfWUNUHcljVJgxThCNk7eEswdHMXdzJnkBBaYDqDwzHkoh3F74JJhfU3taJOsgpR6oEGIDg17g==} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + cosmiconfig@9.0.0: resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} @@ -624,6 +660,10 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -639,8 +679,11 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - electron-to-chromium@1.5.118: - resolution: {integrity: sha512-yNDUus0iultYyVoEFLnQeei7LOQkL8wg8GQpkPCRrOlJXlcCwa6eGKZkxQ9ciHsqZyYbj8Jd94X1CTPzGm+uIA==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.151: + resolution: {integrity: sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA==} ember-eslint-parser@0.5.9: resolution: {integrity: sha512-IW4/3cEiFp49M2LiKyzi7VcT1egogOe8UxQ9eUKTooenC7Q4qNhzTD6rOZ8j51m8iJC+8hCzjbNCa3K4CN0Hhg==} @@ -655,8 +698,8 @@ packages: ember-rfc176-data@0.3.18: resolution: {integrity: sha512-JtuLoYGSjay1W3MQAxt3eINWXNYYQliK90tLwtb8aeCuQK8zKGCRbBodVIrkcTqshULMnRuTOS6t1P7oQk3g6Q==} - ember-template-lint@7.0.1: - resolution: {integrity: sha512-rFGrioqtoHyWGig6PsURQYL797Hj1u9Wbn8ZyTO3H0NUNrRgPOX+2Gu9uTrmnf+KWry/2GB+yok6OY7mVSygIA==} + ember-template-lint@7.6.0: + resolution: {integrity: sha512-FqSPRB4w16Yy1fIwXPJgekSYcNFkvRvTePsgEc1C8o1gd/8bE0LgmkTXjf6pgGdIG477wMR1NyOm7oDCQNleVA==} engines: {node: ^18.18.0 || >= 20.9.0} hasBin: true @@ -668,6 +711,10 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -707,6 +754,9 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -813,8 +863,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.22.0: - resolution: {integrity: sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==} + eslint@9.26.0: + resolution: {integrity: sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -847,6 +897,28 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventsource-parser@3.0.1: + resolution: {integrity: sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + + express-rate-limit@7.5.0: + resolution: {integrity: sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==} + engines: {node: '>= 16'} + peerDependencies: + express: ^4.11 || 5 || ^5.0.0-beta.1 + + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -870,8 +942,8 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - file-entry-cache@10.0.7: - resolution: {integrity: sha512-txsf5fu3anp2ff3+gOJJzRImtrtm/oa9tYLN0iTuINZ++EyVR/nRrg2fKYwvG/pXDofcrvvb0scEbX3NyW/COw==} + file-entry-cache@10.1.0: + resolution: {integrity: sha512-Et/ex6smi3wOOB+n5mek+Grf7P2AxZR5ueqRUvAAn4qkyatXi3cUC1cuQXVkX0VlzBVsN4BkWJFmY/fYiRTdww==} file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} @@ -881,6 +953,10 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -893,8 +969,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flat-cache@6.1.7: - resolution: {integrity: sha512-qwZ4xf1v1m7Rc9XiORly31YaChvKt6oNVHuqqZcoED/7O+ToyNVGobKsIAopY9ODcWpEDKEBAbrSOCBHtNQvew==} + flat-cache@6.1.9: + resolution: {integrity: sha512-DUqiKkTlAfhtl7g78IuwqYM+YqvT+as0mY+EVk6mfimy19U79pJCzDZQsnqk3Ou/T6hFXWLGbwbADzD/c8Tydg==} flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} @@ -903,6 +979,14 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} @@ -969,8 +1053,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@16.0.0: - resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==} + globals@16.1.0: + resolution: {integrity: sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==} engines: {node: '>=18'} globalthis@1.0.4: @@ -1022,13 +1106,21 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hookified@1.8.1: - resolution: {integrity: sha512-GrO2l93P8xCWBSTBX9l2BxI78VU/MAAYag+pG8curS3aBGy0++ZlxrQ7PdUOUVMbn5BwkGb6+eRrnf43ipnFEA==} + hookified@1.9.0: + resolution: {integrity: sha512-2yEEGqphImtKIe1NXWEhu6yD3hlFR4Mxk4Mtp3XEyScpSt4pQ4ymmXA1zzxZpj99QkFK+nN0nzjeb2+RUi/6CQ==} html-tags@3.3.1: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -1036,8 +1128,8 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.3: - resolution: {integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==} + ignore@7.0.4: + resolution: {integrity: sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==} engines: {node: '>= 4'} import-fresh@3.3.1: @@ -1058,6 +1150,10 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -1133,6 +1229,9 @@ packages: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -1221,15 +1320,15 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - keyv@5.3.1: - resolution: {integrity: sha512-13hQT2q2VIwOoaJdJa7nY3J8UVbYtMTJFHnwm9LI+SaQRfUiM6Em9KZeOVTCKbMnGcRIL3NSUFpAdjZCq24nLQ==} + keyv@5.3.3: + resolution: {integrity: sha512-Rwu4+nXI9fqcxiEHtbkvoes2X+QfkTRo1TMkPfwzipGsJlJO/z69vqB4FNl9xJ3xCpAcbkvmEabZfPzrwN3+gQ==} kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - known-css-properties@0.35.0: - resolution: {integrity: sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==} + known-css-properties@0.36.0: + resolution: {integrity: sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==} language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -1288,13 +1387,21 @@ packages: mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - mdn-data@2.18.0: - resolution: {integrity: sha512-gtCy1yim/vpHF/tq3B4Z43x3zKWpYeb4IM3d/Mf4oMYcNuoXOYEaqtoFlLHw9zd7+WNN3jNh6/WXyUrD3OIiwQ==} + mdn-data@2.21.0: + resolution: {integrity: sha512-+ZKPQezM5vYJIkCxaC+4DTnRrVZR1CgsKLu5zsQERQx6Tea8Y+wMx5A24rq8A8NepCeatIQufVAekKNgiBMsGQ==} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} meow@13.2.0: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} engines: {node: '>=18'} + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -1303,6 +1410,14 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -1319,14 +1434,18 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.9: - resolution: {integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} @@ -1337,6 +1456,10 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -1361,6 +1484,13 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} @@ -1401,6 +1531,10 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1416,6 +1550,10 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -1431,6 +1569,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + pkce-challenge@5.0.0: + resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} + engines: {node: '>=16.20.0'} + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -1468,8 +1610,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-ember-template-tag@2.0.4: - resolution: {integrity: sha512-Ude3MJyPBMr/Er5aSS9Y0dsnHWX3prpJB+Jj/BKKUT/EvG2ftnIMBsZXmRu68RJA62JJB8MdKBloYmCu2pTRNg==} + prettier-plugin-ember-template-tag@2.0.5: + resolution: {integrity: sha512-G9lbK3wmryIBSzqBKKoy254v7hIjqzqYpqWxi9NvOxcxNtwLyrC1u9NLJJFm+x9blzqHQOzKGOseVnbLtEwEbg==} engines: {node: 18.* || >= 20} peerDependencies: prettier: '>= 3.0.0' @@ -1482,13 +1624,29 @@ packages: proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} + readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -1538,6 +1696,10 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -1556,10 +1718,21 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -1572,6 +1745,9 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1625,6 +1801,10 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1672,11 +1852,11 @@ packages: peerDependencies: stylelint: ^16.1.0 - stylelint-config-recommended@15.0.0: - resolution: {integrity: sha512-9LejMFsat7L+NXttdHdTq94byn25TD+82bzGRiV1Pgasl99pWnwipXS5DguTpp3nP1XjvLXVnEJIuYBfsRjRkA==} + stylelint-config-recommended@16.0.0: + resolution: {integrity: sha512-4RSmPjQegF34wNcK1e1O3Uz91HN8P1aFdFzio90wNK9mjgAI19u5vsU868cVZboKzCaa5XbpvtTzAAGQAxpcXA==} engines: {node: '>=18.12.0'} peerDependencies: - stylelint: ^16.13.0 + stylelint: ^16.16.0 stylelint-config-standard-scss@14.0.0: resolution: {integrity: sha512-6Pa26D9mHyi4LauJ83ls3ELqCglU6VfCXchovbEqQUiEkezvKdv6VgsIoMy58i00c854wVmOw0k8W5FTpuaVqg==} @@ -1694,20 +1874,20 @@ packages: peerDependencies: stylelint: ^16.1.0 - stylelint-config-standard@37.0.0: - resolution: {integrity: sha512-+6eBlbSTrOn/il2RlV0zYGQwRTkr+WtzuVSs1reaWGObxnxLpbcspCUYajVQHonVfxVw2U+h42azGhrBvcg8OA==} + stylelint-config-standard@38.0.0: + resolution: {integrity: sha512-uj3JIX+dpFseqd/DJx8Gy3PcRAJhlEZ2IrlFOc4LUxBX/PNMEQ198x7LCOE2Q5oT9Vw8nyc4CIL78xSqPr6iag==} engines: {node: '>=18.12.0'} peerDependencies: - stylelint: ^16.13.0 + stylelint: ^16.18.0 - stylelint-scss@6.11.1: - resolution: {integrity: sha512-e4rYo0UY+BIMtGeGanghrvHTjcryxgZbyFxUedp8dLFqC4P70aawNdYjRrQxbnKhu3BNr4+lt5e/53tcKXiwFA==} + stylelint-scss@6.12.0: + resolution: {integrity: sha512-U7CKhi1YNkM1pXUXl/GMUXi8xKdhl4Ayxdyceie1nZ1XNIdaUgMV6OArpooWcDzEggwgYD0HP/xIgVJo9a655w==} engines: {node: '>=18.12.0'} peerDependencies: stylelint: ^16.0.2 - stylelint@16.16.0: - resolution: {integrity: sha512-40X5UOb/0CEFnZVEHyN260HlSSUxPES+arrUphOumGWgXERHfwCD0kNBVILgQSij8iliYVwlc0V7M5bcLP9vPg==} + stylelint@16.19.1: + resolution: {integrity: sha512-C1SlPZNMKl+d/C867ZdCRthrS+6KuZ3AoGW113RZCOL0M8xOGpgx7G70wq7lFvqvm4dcfdGFVLB/mNaLFChRKw==} engines: {node: '>=18.12.0'} hasBin: true @@ -1738,6 +1918,10 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -1748,6 +1932,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -1764,8 +1952,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript@5.8.2: - resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} hasBin: true @@ -1785,6 +1973,10 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + upath@2.0.1: resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} engines: {node: '>=4'} @@ -1804,6 +1996,10 @@ packages: v8-compile-cache@2.4.0: resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -1843,6 +2039,9 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + write-file-atomic@5.0.1: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -1866,10 +2065,18 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.2.0: - resolution: {integrity: sha512-KHBC7z61OJeaMGnF3wqNZj+GGNXOyypZviiKpQeiHirG5Ib1ImwcLBH70rbMSkKfSmUNBsdf2PwaEJtKvgmkNw==} + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} + zod-to-json-schema@3.24.5: + resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} + peerDependencies: + zod: ^3.24.1 + + zod@3.24.4: + resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} + snapshots: '@ampproject/remapping@2.3.0': @@ -1877,26 +2084,26 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@babel/code-frame@7.26.2': + '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.8': {} + '@babel/compat-data@7.27.2': {} - '@babel/core@7.26.10': + '@babel/core@7.27.1': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.10 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helpers': 7.26.10 - '@babel/parser': 7.26.10 - '@babel/template': 7.26.9 - '@babel/traverse': 7.26.10 - '@babel/types': 7.26.10 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) + '@babel/helpers': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 convert-source-map: 2.0.0 debug: 4.4.0 gensync: 1.0.0-beta.2 @@ -1905,159 +2112,159 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/eslint-parser@7.26.10(@babel/core@7.26.10)(eslint@9.22.0)': + '@babel/eslint-parser@7.27.1(@babel/core@7.27.1)(eslint@9.26.0)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.1 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 9.22.0 + eslint: 9.26.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 - '@babel/generator@7.26.10': + '@babel/generator@7.27.1': dependencies: - '@babel/parser': 7.26.10 - '@babel/types': 7.26.10 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.25.9': + '@babel/helper-annotate-as-pure@7.27.1': dependencies: - '@babel/types': 7.26.10 + '@babel/types': 7.27.1 - '@babel/helper-compilation-targets@7.26.5': + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.26.8 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.4 + '@babel/compat-data': 7.27.2 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.24.5 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.26.9(@babel/core@7.26.10)': + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.26.10 + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.1) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.27.1 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-member-expression-to-functions@7.25.9': + '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.26.10 - '@babel/types': 7.26.10 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.25.9': + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.26.10 - '@babel/types': 7.26.10 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': + '@babel/helper-module-transforms@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.10 + '@babel/core': 7.27.1 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.25.9': + '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.26.10 + '@babel/types': 7.27.1 - '@babel/helper-plugin-utils@7.26.5': {} + '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.10)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.26.10 + '@babel/core': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.26.10 - '@babel/types': 7.26.10 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} - '@babel/helper-validator-option@7.25.9': {} + '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.26.10': + '@babel/helpers@7.27.1': dependencies: - '@babel/template': 7.26.9 - '@babel/types': 7.26.10 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 - '@babel/parser@7.26.10': + '@babel/parser@7.27.2': dependencies: - '@babel/types': 7.26.10 + '@babel/types': 7.27.1 - '@babel/plugin-proposal-decorators@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-proposal-decorators@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-decorators': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.27.1) transitivePeerDependencies: - supports-color - '@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typescript@7.26.8(@babel/core@7.26.10)': + '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.27.1)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.1) transitivePeerDependencies: - supports-color - '@babel/template@7.26.9': + '@babel/template@7.27.2': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.10 - '@babel/types': 7.26.10 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 - '@babel/traverse@7.26.10': + '@babel/traverse@7.27.1': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.10 - '@babel/parser': 7.26.10 - '@babel/template': 7.26.9 - '@babel/types': 7.26.10 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.26.10': + '@babel/types@7.27.1': dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)': dependencies: @@ -2074,26 +2281,27 @@ snapshots: dependencies: postcss-selector-parser: 7.1.0 - '@discourse/lint-configs@2.11.1(ember-template-lint@7.0.1(@babel/core@7.26.10))(eslint@9.22.0)(postcss@8.5.3)(prettier@3.5.3)(stylelint@16.16.0(typescript@5.8.2))': - dependencies: - '@babel/core': 7.26.10 - '@babel/eslint-parser': 7.26.10(@babel/core@7.26.10)(eslint@9.22.0) - '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.10) - ember-template-lint: 7.0.1(@babel/core@7.26.10) - eslint: 9.22.0 - eslint-plugin-decorator-position: 6.0.0(@babel/eslint-parser@7.26.10(@babel/core@7.26.10)(eslint@9.22.0))(eslint@9.22.0) - eslint-plugin-ember: 12.5.0(@babel/core@7.26.10)(eslint@9.22.0) - eslint-plugin-import: 2.31.0(eslint@9.22.0) - eslint-plugin-qunit: 8.1.2(eslint@9.22.0) - eslint-plugin-simple-import-sort: 12.1.1(eslint@9.22.0) - eslint-plugin-sort-class-members: 1.21.0(eslint@9.22.0) - globals: 16.0.0 + '@discourse/lint-configs@2.17.2(ember-template-lint@7.6.0(@babel/core@7.27.1))(eslint@9.26.0)(postcss@8.5.3)(prettier@3.5.3)(stylelint@16.19.1(typescript@5.8.3))': + dependencies: + '@babel/core': 7.27.1 + '@babel/eslint-parser': 7.27.1(@babel/core@7.27.1)(eslint@9.26.0) + '@babel/plugin-proposal-decorators': 7.27.1(@babel/core@7.27.1) + ember-template-lint: 7.6.0(@babel/core@7.27.1) + eslint: 9.26.0 + eslint-plugin-decorator-position: 6.0.0(@babel/eslint-parser@7.27.1(@babel/core@7.27.1)(eslint@9.26.0))(eslint@9.26.0) + eslint-plugin-ember: 12.5.0(@babel/core@7.27.1)(eslint@9.26.0) + eslint-plugin-import: 2.31.0(eslint@9.26.0) + eslint-plugin-qunit: 8.1.2(eslint@9.26.0) + eslint-plugin-simple-import-sort: 12.1.1(eslint@9.26.0) + eslint-plugin-sort-class-members: 1.21.0(eslint@9.26.0) + globals: 16.1.0 prettier: 3.5.3 - prettier-plugin-ember-template-tag: 2.0.4(prettier@3.5.3) - stylelint: 16.16.0(typescript@5.8.2) - stylelint-config-standard: 37.0.0(stylelint@16.16.0(typescript@5.8.2)) - stylelint-config-standard-scss: 14.0.0(postcss@8.5.3)(stylelint@16.16.0(typescript@5.8.2)) - typescript: 5.8.2 + prettier-plugin-ember-template-tag: 2.0.5(prettier@3.5.3) + stylelint: 16.19.1(typescript@5.8.3) + stylelint-config-standard: 38.0.0(stylelint@16.19.1(typescript@5.8.3)) + stylelint-config-standard-scss: 14.0.0(postcss@8.5.3)(stylelint@16.19.1(typescript@5.8.3)) + stylelint-scss: 6.12.0(stylelint@16.19.1(typescript@5.8.3)) + typescript: 5.8.3 transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-typescript @@ -2105,14 +2313,14 @@ snapshots: '@ember-data/rfc395-data@0.0.4': {} - '@eslint-community/eslint-utils@4.5.1(eslint@9.22.0)': + '@eslint-community/eslint-utils@4.7.0(eslint@9.26.0)': dependencies: - eslint: 9.22.0 + eslint: 9.26.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.2': + '@eslint/config-array@0.20.0': dependencies: '@eslint/object-schema': 2.1.6 debug: 4.4.0 @@ -2120,13 +2328,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.1.0': {} + '@eslint/config-helpers@0.2.2': {} - '@eslint/core@0.12.0': + '@eslint/core@0.13.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.0': + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 debug: 4.4.0 @@ -2140,13 +2348,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.22.0': {} + '@eslint/js@9.26.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.7': + '@eslint/plugin-kit@0.2.8': dependencies: - '@eslint/core': 0.12.0 + '@eslint/core': 0.13.0 levn: 0.4.1 '@glimmer/env@0.1.7': {} @@ -2220,7 +2428,7 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.2': {} + '@humanwhocodes/retry@0.4.3': {} '@jridgewell/gen-mapping@0.3.8': dependencies: @@ -2253,6 +2461,21 @@ snapshots: tslib: 2.8.1 upath: 2.0.1 + '@modelcontextprotocol/sdk@1.11.2': + dependencies: + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + express: 5.1.0 + express-rate-limit: 7.5.0(express@5.1.0) + pkce-challenge: 5.0.0 + raw-body: 3.0.0 + zod: 3.24.4 + zod-to-json-schema: 3.24.5(zod@3.24.4) + transitivePeerDependencies: + - supports-color + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': dependencies: eslint-scope: 5.1.1 @@ -2277,15 +2500,20 @@ snapshots: '@types/eslint@8.56.12': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 - '@types/estree@1.0.6': {} + '@types/estree@1.0.7': {} '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + acorn-jsx@5.3.2(acorn@8.14.1): dependencies: acorn: 8.14.1 @@ -2332,9 +2560,10 @@ snapshots: array-union@2.1.0: {} - array.prototype.findlastindex@1.2.5: + array.prototype.findlastindex@1.2.6: dependencies: call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 @@ -2398,6 +2627,20 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.0 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.0 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -2407,12 +2650,12 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.24.4: + browserslist@4.24.5: dependencies: - caniuse-lite: 1.0.30001704 - electron-to-chromium: 1.5.118 + caniuse-lite: 1.0.30001717 + electron-to-chromium: 1.5.151 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.4) + update-browserslist-db: 1.1.3(browserslist@4.24.5) buffer@5.7.1: dependencies: @@ -2424,10 +2667,12 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - cacheable@1.8.9: + bytes@3.1.2: {} + + cacheable@1.9.0: dependencies: - hookified: 1.8.1 - keyv: 5.3.1 + hookified: 1.9.0 + keyv: 5.3.3 call-bind-apply-helpers@1.0.2: dependencies: @@ -2448,7 +2693,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001704: {} + caniuse-lite@1.0.30001717: {} chalk@4.1.2: dependencies: @@ -2487,24 +2732,39 @@ snapshots: concat-map@0.0.1: {} + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + content-tag-utils@0.3.1: dependencies: - content-tag: 3.1.1 + content-tag: 3.1.3 content-tag@2.0.3: {} - content-tag@3.1.1: {} + content-tag@3.1.3: {} + + content-type@1.0.5: {} convert-source-map@2.0.0: {} - cosmiconfig@9.0.0(typescript@5.8.2): + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cosmiconfig@9.0.0(typescript@5.8.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.8.2 + typescript: 5.8.3 cross-spawn@7.0.6: dependencies: @@ -2571,6 +2831,8 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + depd@2.0.0: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -2590,12 +2852,14 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - electron-to-chromium@1.5.118: {} + ee-first@1.1.1: {} + + electron-to-chromium@1.5.151: {} - ember-eslint-parser@0.5.9(@babel/core@7.26.10)(eslint@9.22.0): + ember-eslint-parser@0.5.9(@babel/core@7.27.1)(eslint@9.26.0): dependencies: - '@babel/core': 7.26.10 - '@babel/eslint-parser': 7.26.10(@babel/core@7.26.10)(eslint@9.22.0) + '@babel/core': 7.27.1 + '@babel/eslint-parser': 7.27.1(@babel/core@7.27.1)(eslint@9.26.0) '@glimmer/syntax': 0.92.3 content-tag: 2.0.3 eslint-scope: 7.2.2 @@ -2607,18 +2871,18 @@ snapshots: ember-rfc176-data@0.3.18: {} - ember-template-lint@7.0.1(@babel/core@7.26.10): + ember-template-lint@7.6.0(@babel/core@7.27.1): dependencies: - '@babel/generator': 7.26.10 - '@babel/parser': 7.26.10 - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.26.10) - '@babel/traverse': 7.26.10 + '@babel/generator': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.1) + '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.1) + '@babel/traverse': 7.27.1 '@lint-todo/utils': 13.1.1 aria-query: 5.3.2 chalk: 5.4.1 ci-info: 4.2.0 - content-tag: 3.1.1 + content-tag: 3.1.3 content-tag-utils: 0.3.1 date-fns: 3.6.0 ember-template-recast: 6.1.5 @@ -2655,6 +2919,8 @@ snapshots: emoji-regex@8.0.0: {} + encodeurl@2.0.0: {} + env-paths@2.2.1: {} error-ex@1.3.2: @@ -2742,6 +3008,8 @@ snapshots: escalade@3.2.0: {} + escape-html@1.0.3: {} + escape-string-regexp@4.0.0: {} eslint-formatter-kakoune@1.0.0: {} @@ -2754,36 +3022,36 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.22.0): + eslint-module-utils@2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.26.0): dependencies: debug: 3.2.7 optionalDependencies: - eslint: 9.22.0 + eslint: 9.26.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-decorator-position@6.0.0(@babel/eslint-parser@7.26.10(@babel/core@7.26.10)(eslint@9.22.0))(eslint@9.22.0): + eslint-plugin-decorator-position@6.0.0(@babel/eslint-parser@7.27.1(@babel/core@7.27.1)(eslint@9.26.0))(eslint@9.26.0): dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.1 + '@babel/plugin-proposal-decorators': 7.27.1(@babel/core@7.27.1) '@ember-data/rfc395-data': 0.0.4 ember-rfc176-data: 0.3.18 - eslint: 9.22.0 + eslint: 9.26.0 snake-case: 3.0.4 optionalDependencies: - '@babel/eslint-parser': 7.26.10(@babel/core@7.26.10)(eslint@9.22.0) + '@babel/eslint-parser': 7.27.1(@babel/core@7.27.1)(eslint@9.26.0) transitivePeerDependencies: - supports-color - eslint-plugin-ember@12.5.0(@babel/core@7.26.10)(eslint@9.22.0): + eslint-plugin-ember@12.5.0(@babel/core@7.27.1)(eslint@9.26.0): dependencies: '@ember-data/rfc395-data': 0.0.4 css-tree: 3.1.0 - ember-eslint-parser: 0.5.9(@babel/core@7.26.10)(eslint@9.22.0) + ember-eslint-parser: 0.5.9(@babel/core@7.27.1)(eslint@9.26.0) ember-rfc176-data: 0.3.18 - eslint: 9.22.0 - eslint-utils: 3.0.0(eslint@9.22.0) + eslint: 9.26.0 + eslint-utils: 3.0.0(eslint@9.26.0) estraverse: 5.3.0 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 @@ -2792,18 +3060,18 @@ snapshots: transitivePeerDependencies: - '@babel/core' - eslint-plugin-import@2.31.0(eslint@9.22.0): + eslint-plugin-import@2.31.0(eslint@9.26.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 + array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.22.0 + eslint: 9.26.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.22.0) + eslint-module-utils: 2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.26.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -2819,20 +3087,20 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-qunit@8.1.2(eslint@9.22.0): + eslint-plugin-qunit@8.1.2(eslint@9.26.0): dependencies: - eslint-utils: 3.0.0(eslint@9.22.0) + eslint-utils: 3.0.0(eslint@9.26.0) requireindex: 1.2.0 transitivePeerDependencies: - eslint - eslint-plugin-simple-import-sort@12.1.1(eslint@9.22.0): + eslint-plugin-simple-import-sort@12.1.1(eslint@9.26.0): dependencies: - eslint: 9.22.0 + eslint: 9.26.0 - eslint-plugin-sort-class-members@1.21.0(eslint@9.22.0): + eslint-plugin-sort-class-members@1.21.0(eslint@9.26.0): dependencies: - eslint: 9.22.0 + eslint: 9.26.0 eslint-scope@5.1.1: dependencies: @@ -2849,9 +3117,9 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-utils@3.0.0(eslint@9.22.0): + eslint-utils@3.0.0(eslint@9.26.0): dependencies: - eslint: 9.22.0 + eslint: 9.26.0 eslint-visitor-keys: 2.1.0 eslint-visitor-keys@2.1.0: {} @@ -2860,20 +3128,21 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.22.0: + eslint@9.26.0: dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.2 - '@eslint/config-helpers': 0.1.0 - '@eslint/core': 0.12.0 - '@eslint/eslintrc': 3.3.0 - '@eslint/js': 9.22.0 - '@eslint/plugin-kit': 0.2.7 + '@eslint/config-array': 0.20.0 + '@eslint/config-helpers': 0.2.2 + '@eslint/core': 0.13.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.26.0 + '@eslint/plugin-kit': 0.2.8 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.2 - '@types/estree': 1.0.6 + '@humanwhocodes/retry': 0.4.3 + '@modelcontextprotocol/sdk': 1.11.2 + '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 @@ -2897,6 +3166,7 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 + zod: 3.24.4 transitivePeerDependencies: - supports-color @@ -2920,6 +3190,50 @@ snapshots: esutils@2.0.3: {} + etag@1.8.1: {} + + eventsource-parser@3.0.1: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.0.1 + + express-rate-limit@7.5.0(express@5.1.0): + dependencies: + express: 5.1.0 + + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.1 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + fast-deep-equal@3.1.3: {} fast-glob@3.3.3: @@ -2942,9 +3256,9 @@ snapshots: dependencies: reusify: 1.1.0 - file-entry-cache@10.0.7: + file-entry-cache@10.1.0: dependencies: - flat-cache: 6.1.7 + flat-cache: 6.1.9 file-entry-cache@8.0.0: dependencies: @@ -2954,6 +3268,17 @@ snapshots: dependencies: to-regex-range: 5.0.1 + finalhandler@2.1.0: + dependencies: + debug: 4.4.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -2970,11 +3295,11 @@ snapshots: flatted: 3.3.3 keyv: 4.5.4 - flat-cache@6.1.7: + flat-cache@6.1.9: dependencies: - cacheable: 1.8.9 + cacheable: 1.9.0 flatted: 3.3.3 - hookified: 1.8.1 + hookified: 1.9.0 flatted@3.3.3: {} @@ -2982,6 +3307,10 @@ snapshots: dependencies: is-callable: 1.2.7 + forwarded@0.2.0: {} + + fresh@2.0.0: {} + fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 @@ -3056,7 +3385,7 @@ snapshots: globals@14.0.0: {} - globals@16.0.0: {} + globals@16.1.0: {} globalthis@1.0.4: dependencies: @@ -3076,7 +3405,7 @@ snapshots: dependencies: '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.3 - ignore: 7.0.3 + ignore: 7.0.4 path-type: 6.0.0 slash: 5.1.0 unicorn-magic: 0.3.0 @@ -3109,15 +3438,27 @@ snapshots: dependencies: function-bind: 1.1.2 - hookified@1.8.1: {} + hookified@1.9.0: {} html-tags@3.3.1: {} + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + ieee754@1.2.1: {} ignore@5.3.2: {} - ignore@7.0.3: {} + ignore@7.0.4: {} import-fresh@3.3.1: dependencies: @@ -3136,6 +3477,8 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 + ipaddr.js@1.9.1: {} + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -3210,6 +3553,8 @@ snapshots: is-plain-object@5.0.0: {} + is-promise@4.0.0: {} + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -3289,13 +3634,13 @@ snapshots: dependencies: json-buffer: 3.0.1 - keyv@5.3.1: + keyv@5.3.3: dependencies: '@keyv/serialize': 1.0.3 kind-of@6.0.3: {} - known-css-properties@0.35.0: {} + known-css-properties@0.36.0: {} language-subtag-registry@0.3.23: {} @@ -3347,10 +3692,14 @@ snapshots: mdn-data@2.12.2: {} - mdn-data@2.18.0: {} + mdn-data@2.21.0: {} + + media-typer@1.1.0: {} meow@13.2.0: {} + merge-descriptors@2.0.0: {} + merge2@1.4.1: {} micromatch@4.0.8: @@ -3358,6 +3707,12 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + mime-db@1.54.0: {} + + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + mimic-fn@2.1.0: {} minimatch@3.1.2: @@ -3370,10 +3725,12 @@ snapshots: ms@2.1.3: {} - nanoid@3.3.9: {} + nanoid@3.3.11: {} natural-compare@1.4.0: {} + negotiator@1.0.0: {} + no-case@3.0.4: dependencies: lower-case: 2.0.2 @@ -3383,6 +3740,8 @@ snapshots: normalize-path@3.0.0: {} + object-assign@4.1.1: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} @@ -3416,6 +3775,14 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 @@ -3453,7 +3820,7 @@ snapshots: p-limit@4.0.0: dependencies: - yocto-queue: 1.2.0 + yocto-queue: 1.2.1 p-locate@5.0.0: dependencies: @@ -3469,11 +3836,13 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parseurl@1.3.3: {} + path-exists@4.0.0: {} path-exists@5.0.0: {} @@ -3482,6 +3851,8 @@ snapshots: path-parse@1.0.7: {} + path-to-regexp@8.2.0: {} + path-type@4.0.0: {} path-type@6.0.0: {} @@ -3490,6 +3861,8 @@ snapshots: picomatch@2.3.1: {} + pkce-challenge@5.0.0: {} + possible-typed-array-names@1.1.0: {} postcss-media-query-parser@0.2.3: {} @@ -3513,16 +3886,16 @@ snapshots: postcss@8.5.3: dependencies: - nanoid: 3.3.9 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 prelude-ls@1.2.1: {} - prettier-plugin-ember-template-tag@2.0.4(prettier@3.5.3): + prettier-plugin-ember-template-tag@2.0.5(prettier@3.5.3): dependencies: - '@babel/core': 7.26.10 - content-tag: 2.0.3 + '@babel/core': 7.27.1 + content-tag: 3.1.3 prettier: 3.5.3 transitivePeerDependencies: - supports-color @@ -3535,10 +3908,28 @@ snapshots: retry: 0.12.0 signal-exit: 3.0.7 + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + punycode@2.3.1: {} + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + queue-microtask@1.2.3: {} + range-parser@1.2.1: {} + + raw-body@3.0.0: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -3590,6 +3981,16 @@ snapshots: reusify@1.1.0: {} + router@2.2.0: + dependencies: + debug: 4.4.0 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.2.0 + transitivePeerDependencies: + - supports-color + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -3615,8 +4016,35 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + safer-buffer@2.1.2: {} + semver@6.3.1: {} + send@1.2.0: + dependencies: + debug: 4.4.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -3639,6 +4067,8 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 + setprototypeof@1.2.0: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -3696,6 +4126,8 @@ snapshots: source-map-js@1.2.1: {} + statuses@2.0.1: {} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -3737,54 +4169,54 @@ snapshots: strip-json-comments@3.1.1: {} - stylelint-config-recommended-scss@14.1.0(postcss@8.5.3)(stylelint@16.16.0(typescript@5.8.2)): + stylelint-config-recommended-scss@14.1.0(postcss@8.5.3)(stylelint@16.19.1(typescript@5.8.3)): dependencies: postcss-scss: 4.0.9(postcss@8.5.3) - stylelint: 16.16.0(typescript@5.8.2) - stylelint-config-recommended: 14.0.1(stylelint@16.16.0(typescript@5.8.2)) - stylelint-scss: 6.11.1(stylelint@16.16.0(typescript@5.8.2)) + stylelint: 16.19.1(typescript@5.8.3) + stylelint-config-recommended: 14.0.1(stylelint@16.19.1(typescript@5.8.3)) + stylelint-scss: 6.12.0(stylelint@16.19.1(typescript@5.8.3)) optionalDependencies: postcss: 8.5.3 - stylelint-config-recommended@14.0.1(stylelint@16.16.0(typescript@5.8.2)): + stylelint-config-recommended@14.0.1(stylelint@16.19.1(typescript@5.8.3)): dependencies: - stylelint: 16.16.0(typescript@5.8.2) + stylelint: 16.19.1(typescript@5.8.3) - stylelint-config-recommended@15.0.0(stylelint@16.16.0(typescript@5.8.2)): + stylelint-config-recommended@16.0.0(stylelint@16.19.1(typescript@5.8.3)): dependencies: - stylelint: 16.16.0(typescript@5.8.2) + stylelint: 16.19.1(typescript@5.8.3) - stylelint-config-standard-scss@14.0.0(postcss@8.5.3)(stylelint@16.16.0(typescript@5.8.2)): + stylelint-config-standard-scss@14.0.0(postcss@8.5.3)(stylelint@16.19.1(typescript@5.8.3)): dependencies: - stylelint: 16.16.0(typescript@5.8.2) - stylelint-config-recommended-scss: 14.1.0(postcss@8.5.3)(stylelint@16.16.0(typescript@5.8.2)) - stylelint-config-standard: 36.0.1(stylelint@16.16.0(typescript@5.8.2)) + stylelint: 16.19.1(typescript@5.8.3) + stylelint-config-recommended-scss: 14.1.0(postcss@8.5.3)(stylelint@16.19.1(typescript@5.8.3)) + stylelint-config-standard: 36.0.1(stylelint@16.19.1(typescript@5.8.3)) optionalDependencies: postcss: 8.5.3 - stylelint-config-standard@36.0.1(stylelint@16.16.0(typescript@5.8.2)): + stylelint-config-standard@36.0.1(stylelint@16.19.1(typescript@5.8.3)): dependencies: - stylelint: 16.16.0(typescript@5.8.2) - stylelint-config-recommended: 14.0.1(stylelint@16.16.0(typescript@5.8.2)) + stylelint: 16.19.1(typescript@5.8.3) + stylelint-config-recommended: 14.0.1(stylelint@16.19.1(typescript@5.8.3)) - stylelint-config-standard@37.0.0(stylelint@16.16.0(typescript@5.8.2)): + stylelint-config-standard@38.0.0(stylelint@16.19.1(typescript@5.8.3)): dependencies: - stylelint: 16.16.0(typescript@5.8.2) - stylelint-config-recommended: 15.0.0(stylelint@16.16.0(typescript@5.8.2)) + stylelint: 16.19.1(typescript@5.8.3) + stylelint-config-recommended: 16.0.0(stylelint@16.19.1(typescript@5.8.3)) - stylelint-scss@6.11.1(stylelint@16.16.0(typescript@5.8.2)): + stylelint-scss@6.12.0(stylelint@16.19.1(typescript@5.8.3)): dependencies: css-tree: 3.1.0 is-plain-object: 5.0.0 - known-css-properties: 0.35.0 - mdn-data: 2.18.0 + known-css-properties: 0.36.0 + mdn-data: 2.21.0 postcss-media-query-parser: 0.2.3 postcss-resolve-nested-selector: 0.1.6 postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 - stylelint: 16.16.0(typescript@5.8.2) + stylelint: 16.19.1(typescript@5.8.3) - stylelint@16.16.0(typescript@5.8.2): + stylelint@16.19.1(typescript@5.8.3): dependencies: '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) '@csstools/css-tokenizer': 3.0.3 @@ -3793,21 +4225,21 @@ snapshots: '@dual-bundle/import-meta-resolve': 4.1.0 balanced-match: 2.0.0 colord: 2.9.3 - cosmiconfig: 9.0.0(typescript@5.8.2) + cosmiconfig: 9.0.0(typescript@5.8.3) css-functions-list: 3.2.3 css-tree: 3.1.0 debug: 4.4.0 fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 - file-entry-cache: 10.0.7 + file-entry-cache: 10.1.0 global-modules: 2.0.0 globby: 11.1.0 globjoin: 0.1.4 html-tags: 3.3.1 - ignore: 7.0.3 + ignore: 7.0.4 imurmurhash: 0.1.4 is-plain-object: 5.0.0 - known-css-properties: 0.35.0 + known-css-properties: 0.36.0 mathml-tag-names: 2.1.3 meow: 13.2.0 micromatch: 4.0.8 @@ -3855,6 +4287,8 @@ snapshots: dependencies: is-number: 7.0.0 + toidentifier@1.0.1: {} + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -3868,6 +4302,12 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -3901,7 +4341,7 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript@5.8.2: {} + typescript@5.8.3: {} unbox-primitive@1.1.0: dependencies: @@ -3916,11 +4356,13 @@ snapshots: universalify@2.0.1: {} + unpipe@1.0.0: {} + upath@2.0.1: {} - update-browserslist-db@1.1.3(browserslist@4.24.4): + update-browserslist-db@1.1.3(browserslist@4.24.5): dependencies: - browserslist: 4.24.4 + browserslist: 4.24.5 escalade: 3.2.0 picocolors: 1.1.1 @@ -3932,6 +4374,8 @@ snapshots: v8-compile-cache@2.4.0: {} + vary@1.1.2: {} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 @@ -3995,6 +4439,8 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrappy@1.0.2: {} + write-file-atomic@5.0.1: dependencies: imurmurhash: 0.1.4 @@ -4018,4 +4464,10 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.2.0: {} + yocto-queue@1.2.1: {} + + zod-to-json-schema@3.24.5(zod@3.24.4): + dependencies: + zod: 3.24.4 + + zod@3.24.4: {} diff --git a/test/javascripts/acceptance/activity-pub-about-test.js b/test/javascripts/acceptance/activity-pub-about-test.js index e0d65cda..c737435b 100644 --- a/test/javascripts/acceptance/activity-pub-about-test.js +++ b/test/javascripts/acceptance/activity-pub-about-test.js @@ -1,11 +1,7 @@ import { visit } from "@ember/test-helpers"; import { test } from "qunit"; -import { - acceptance, - query, - queryAll, -} from "discourse/tests/helpers/qunit-helpers"; -import { default as AboutFixtures } from "../fixtures/about-fixtures"; +import { acceptance } from "discourse/tests/helpers/qunit-helpers"; +import AboutFixtures from "../fixtures/about-fixtures"; acceptance("Discourse Activity Pub | About", function (needs) { needs.site({ activity_pub_enabled: false }); @@ -18,22 +14,18 @@ acceptance("Discourse Activity Pub | About", function (needs) { test("lists the forum's actors", async function (assert) { await visit("/ap/about"); - const categoryActors = queryAll( - ".activity-pub-actors.categories .activity-pub-actor-card" - ); - assert.strictEqual(categoryActors.length, 2); + assert + .dom(".activity-pub-actors.categories .activity-pub-actor-card") + .exists({ count: 2 }); - const tagActors = queryAll( - ".activity-pub-actors.tags .activity-pub-actor-card" - ); - assert.strictEqual(tagActors.length, 1); + assert + .dom(".activity-pub-actors.tags .activity-pub-actor-card") + .exists({ count: 1 }); - assert.strictEqual( - query( + assert + .dom( ".activity-pub-actors.categories div.activity-pub-actor-card:first-of-type .follower-count" - ).innerText.trim(), - "4 followers", - "shows the right follower counts" - ); + ) + .hasText("4 followers", "shows the right follower counts"); }); }); diff --git a/test/javascripts/acceptance/activity-pub-admin-test.js b/test/javascripts/acceptance/activity-pub-admin-test.js index 1b9f4179..ec4f3885 100644 --- a/test/javascripts/acceptance/activity-pub-admin-test.js +++ b/test/javascripts/acceptance/activity-pub-admin-test.js @@ -6,15 +6,11 @@ import pretender, { parsePostData, response, } from "discourse/tests/helpers/create-pretender"; -import { - acceptance, - exists, - query, -} from "discourse/tests/helpers/qunit-helpers"; +import { acceptance } from "discourse/tests/helpers/qunit-helpers"; import selectKit from "discourse/tests/helpers/select-kit-helper"; -import { default as AdminActors } from "../fixtures/admin-actors-fixtures"; -import { default as Logs } from "../fixtures/logs-fixtures"; -import { default as SiteActors } from "../fixtures/site-actors-fixtures"; +import AdminActors from "../fixtures/admin-actors-fixtures"; +import Logs from "../fixtures/logs-fixtures"; +import SiteActors from "../fixtures/site-actors-fixtures"; const categoryActors = AdminActors["/admin/plugins/ap/actor?model_type=category"]; @@ -58,24 +54,19 @@ acceptance("Discourse Activity Pub | Admin | Index", function (needs) { }); await visit("/admin/plugins/ap/actor"); - assert.ok( - exists(".activity-pub-actor-table"), - "the actors table is visible" - ); - assert.strictEqual( - document.querySelectorAll(".activity-pub-actor-table-row").length, - 2, - "actors are visible" - ); - assert.ok( - exists(".activity-pub-actor-edit-btn"), - "the actor edit btn is visible" - ); + assert + .dom(".activity-pub-actor-table") + .exists("the actors table is visible"); + assert + .dom(".activity-pub-actor-table-row") + .exists({ count: 2 }, "actors are visible"); + assert + .dom(".activity-pub-actor-edit-btn") + .exists("the actor edit btn is visible"); await click(".activity-pub-actor-edit-btn"); - assert.ok( - exists(".admin-plugins.activity-pub.actor-show"), - "it routes to actor show" - ); + assert + .dom(".admin-plugins.activity-pub.actor-show") + .exists("routes to actor show"); }); test("actor controls", async function (assert) { @@ -98,10 +89,9 @@ acceptance("Discourse Activity Pub | Admin | Index", function (needs) { }); await visit("/admin/plugins/ap/actor"); - assert.ok( - exists(".activity-pub-add-actor.category"), - "the add category actor button is visible" - ); + assert + .dom(".activity-pub-add-actor.category") + .exists("the add category actor button is visible"); await click(".activity-pub-add-actor"); assert.strictEqual( queryParams.model_type, @@ -110,10 +100,9 @@ acceptance("Discourse Activity Pub | Admin | Index", function (needs) { ); await visit("/admin/plugins/ap/actor?model_type=tag"); - assert.ok( - exists(".activity-pub-add-actor.tag"), - "the add tag actor button is visible" - ); + assert + .dom(".activity-pub-add-actor.tag") + .exists("the add tag actor button is visible"); await click(".activity-pub-add-actor"); assert.strictEqual( queryParams.model_type, @@ -139,28 +128,24 @@ acceptance("Discourse Activity Pub | Admin | New Actor", function (needs) { test("creates a new actor", async function (assert) { await visit("/admin/plugins/ap/actor/new"); - assert.ok( - exists(".activity-pub-actor-add"), - "add actor container is visible" - ); - assert.ok( - exists(".activity-pub-new-actor-model"), - "actor model controls are visible" - ); + assert + .dom(".activity-pub-actor-add") + .exists("add actor container is visible"); + assert + .dom(".activity-pub-new-actor-model") + .exists("actor model controls are visible"); - assert.ok( - exists(".activity-pub-category-chooser"), - "activity pub category chooser is visible" - ); + assert + .dom(".activity-pub-category-chooser") + .exists("activity pub category chooser is visible"); const categories = selectKit(".activity-pub-category-chooser"); await categories.expand(); await categories.selectRowByValue(6); - assert.ok( - exists(".activity-pub-actor-form"), - "activity pub actor form is visible" - ); + assert + .dom(".activity-pub-actor-form") + .exists("activity pub actor form is visible"); const actor = { username: "ap_username", @@ -218,23 +203,20 @@ acceptance("Discourse Activity Pub | Admin | New Actor", function (needs) { test("creates a new actor with a tag model", async function (assert) { await visit("/admin/plugins/ap/actor/new?model_type=tag"); - assert.ok( - exists(".activity-pub-actor-add"), - "add actor container is visible" - ); - assert.ok( - exists(".activity-pub-new-actor-model"), - "actor model controls are visible" - ); + assert + .dom(".activity-pub-actor-add") + .exists("add actor container is visible"); + assert + .dom(".activity-pub-new-actor-model") + .exists("actor model controls are visible"); const tags = selectKit(".activity-pub-actor-add .tag-chooser"); await tags.expand(); await tags.selectRowByName("dog"); - assert.ok( - exists(".activity-pub-actor-form"), - "activity pub actor form is visible" - ); + assert + .dom(".activity-pub-actor-form") + .exists("activity pub actor form is visible"); const actor = { username: "ap_dog", @@ -293,10 +275,9 @@ acceptance("Discourse Activity Pub | Admin | New Actor", function (needs) { siteActors.tag.some((a) => a.name === createdActor.name), "adds the actor to site actors" ); - assert.ok( - query(".activity-pub-actor-status.active"), - "actor has the right status" - ); + assert + .dom(".activity-pub-actor-status") + .hasClass("active", "actor has the right status"); }); }); @@ -317,16 +298,13 @@ acceptance("Discourse Activity Pub | Admin | Edit Actor", function (needs) { test("edits an actor", async function (assert) { await visit(`/admin/plugins/ap/actor/${actor.id}`); - assert.ok( - exists(".activity-pub-actor-edit"), - "edit actor container is visible" - ); - assert.ok(exists(".activity-pub-actor-model"), "actor model is visible"); - assert.strictEqual( - query(".activity-pub-handle .handle").innerText.trim(), - actor.handle, - "shows the right handle" - ); + assert + .dom(".activity-pub-actor-edit") + .exists("edit actor container is visible"); + assert.dom(".activity-pub-actor-model").exists("actor model is visible"); + assert + .dom(".activity-pub-handle .handle") + .hasText(actor.handle, "shows the right handle"); const updates = { name: "Updated name", @@ -372,31 +350,26 @@ acceptance("Discourse Activity Pub | Admin | Logs", function (needs) { test("displays logs", async function (assert) { await visit("/admin/plugins/ap/log"); - assert.ok(exists(".activity-pub-log-table"), "log table is visible"); - assert.strictEqual( - document.querySelectorAll(".activity-pub-log-row").length, - 2, - "logs are visible" - ); - assert.ok( - exists( + assert.dom(".activity-pub-log-table").exists("log table is visible"); + assert + .dom(".activity-pub-log-row") + .exists({ count: 2 }, "logs are visible"); + assert + .dom( ".activity-pub-log-row:nth-of-type(1) .activity-pub-log-show-json-btn" - ), - "shows show json button if log has json" - ); - assert.notOk( - exists( + ) + .exists("shows show json button if log has json"); + assert + .dom( ".activity-pub-log-row:nth-of-type(2) .activity-pub-log-show-json-btn" - ), - "does not show json button if log does not have json" - ); + ) + .doesNotExist("does not show json button if log does not have json"); await click( ".activity-pub-log-row:nth-of-type(1) .activity-pub-log-show-json-btn" ); - assert.ok( - exists(".modal.activity-pub-json-modal"), - "it shows the log json modal" - ); + assert + .dom(".modal.activity-pub-json-modal") + .exists("shows the log json modal"); }); }); diff --git a/test/javascripts/acceptance/activity-pub-composer-test.js b/test/javascripts/acceptance/activity-pub-composer-test.js index 5a50981d..c666ac0f 100644 --- a/test/javascripts/acceptance/activity-pub-composer-test.js +++ b/test/javascripts/acceptance/activity-pub-composer-test.js @@ -2,14 +2,10 @@ import { click, visit } from "@ember/test-helpers"; import { test } from "qunit"; import { cloneJSON } from "discourse/lib/object"; import Site from "discourse/models/site"; -import { - acceptance, - exists, - query, -} from "discourse/tests/helpers/qunit-helpers"; +import { acceptance } from "discourse/tests/helpers/qunit-helpers"; import selectKit from "discourse/tests/helpers/select-kit-helper"; import { i18n } from "discourse-i18n"; -import { default as SiteActors } from "../fixtures/site-actors-fixtures"; +import SiteActors from "../fixtures/site-actors-fixtures"; acceptance("Discourse Activity Pub | composer", function (needs) { needs.user(); @@ -24,10 +20,9 @@ acceptance("Discourse Activity Pub | composer", function (needs) { await visit("/"); await click("#create-topic"); - assert.notOk( - exists("#reply-control .activity-pub-actor-status"), - "the status label is not visible" - ); + assert + .dom("#reply-control .activity-pub-actor-status") + .doesNotExist("the status label is not visible"); }); test("with a category with activity pub ready", async function (assert) { @@ -44,17 +39,15 @@ acceptance("Discourse Activity Pub | composer", function (needs) { await categoryChooser.expand(); await categoryChooser.selectRowByValue(2); - assert.ok( - exists("#reply-control .activity-pub-actor-status"), - "the status label is visible" - ); - assert.strictEqual( - query( - "#reply-control .activity-pub-actor-status .label" - ).innerText.trim(), - i18n("discourse_activity_pub.visibility.label.public"), - "the status label has the right text" - ); + assert + .dom("#reply-control .activity-pub-actor-status") + .exists("the status label is visible"); + assert + .dom("#reply-control .activity-pub-actor-status .label") + .hasText( + i18n("discourse_activity_pub.visibility.label.public"), + "the status label has the right text" + ); }); test("when the plugin is disabled", async function (assert) { @@ -71,9 +64,8 @@ acceptance("Discourse Activity Pub | composer", function (needs) { await categoryChooser.expand(); await categoryChooser.selectRowByValue(2); - assert.notOk( - exists("#reply-control .activity-pub-actor-status"), - "the status label is not visible" - ); + assert + .dom("#reply-control .activity-pub-actor-status") + .doesNotExist("the status label is not visible"); }); }); diff --git a/test/javascripts/acceptance/activity-pub-discovery-test.js b/test/javascripts/acceptance/activity-pub-discovery-test.js index 5e4e3703..771920bd 100644 --- a/test/javascripts/acceptance/activity-pub-discovery-test.js +++ b/test/javascripts/acceptance/activity-pub-discovery-test.js @@ -2,17 +2,13 @@ import { click, currentURL, triggerEvent, visit } from "@ember/test-helpers"; import { test } from "qunit"; import Category from "discourse/models/category"; import Site from "discourse/models/site"; -import { - acceptance, - exists, - query, -} from "discourse/tests/helpers/qunit-helpers"; +import { acceptance } from "discourse/tests/helpers/qunit-helpers"; import selectKit from "discourse/tests/helpers/select-kit-helper"; import { i18n } from "discourse-i18n"; -import { default as Actors } from "../fixtures/actors-fixtures"; -import { default as Followers } from "../fixtures/followers-fixtures"; -import { default as Follows } from "../fixtures/follows-fixtures"; -import { default as SiteActors } from "../fixtures/site-actors-fixtures"; +import Actors from "../fixtures/actors-fixtures"; +import Followers from "../fixtures/followers-fixtures"; +import Follows from "../fixtures/follows-fixtures"; +import SiteActors from "../fixtures/site-actors-fixtures"; const actorPath = `/ap/local/actor/2`; const followsPath = `${actorPath}/follows`; @@ -31,10 +27,9 @@ acceptance( test("with a non-category route", async function (assert) { await visit("/latest"); - assert.notOk( - exists(".activity-pub-discovery"), - "the discovery button is not visible" - ); + assert + .dom(".activity-pub-discovery") + .doesNotExist("the discovery button is not visible"); }); test("with a category route without category enabled", async function (assert) { @@ -42,10 +37,9 @@ acceptance( await visit(category.url); - assert.notOk( - exists(".activity-pub-category-nav.visible"), - "the activitypub nav button is not visible" - ); + assert + .dom(".activity-pub-category-nav.visible") + .doesNotExist("the ActivityPub nav button is not visible"); }); test("with a category route with category enabled", async function (assert) { @@ -54,10 +48,9 @@ acceptance( await visit(category.url); - assert.notOk( - exists(".activity-pub-category-nav.visible"), - "the activitypub nav button is not visible" - ); + assert + .dom(".activity-pub-category-nav.visible") + .doesNotExist("the ActivityPub nav button is not visible"); }); } ); @@ -111,10 +104,9 @@ acceptance( await visit("/latest"); - assert.notOk( - exists(".activity-pub-category-nav.visible"), - "the activitypub nav button is not visible" - ); + assert + .dom(".activity-pub-category-nav.visible") + .doesNotExist("the ActivityPub nav button is not visible"); }); test("with a category without an activity pub actor", async function (assert) { @@ -124,10 +116,9 @@ acceptance( await visit(category.url); - assert.notOk( - exists(".activity-pub-category-nav.visible"), - "the activitypub nav button is not visible" - ); + assert + .dom(".activity-pub-category-nav.visible") + .doesNotExist("the ActivityPub nav button is not visible"); }); test("with a category with an activity pub actor", async function (assert) { @@ -137,19 +128,16 @@ acceptance( await visit(category.url); - assert.ok( - exists(".activity-pub-route-nav.visible"), - "the activitypub nav button is visible" - ); + assert + .dom(".activity-pub-route-nav.visible") + .exists("the ActivityPub nav button is visible"); await click(".activity-pub-route-nav"); - assert.ok( - exists(".activity-pub-banner"), - "the activitypub category banner is visible" - ); - assert.strictEqual( - query(".activity-pub-banner-text .desktop").textContent.trim(), + assert + .dom(".activity-pub-banner") + .exists("the ActivityPub category banner is visible"); + assert.dom(".activity-pub-banner-text .desktop").hasText( i18n("discourse_activity_pub.banner.text", { model_name: "Cat 2", }), @@ -157,11 +145,12 @@ acceptance( ); await triggerEvent(".fk-d-tooltip__trigger", "pointermove"); - assert.equal( - query(".fk-d-tooltip__inner-content").textContent.trim(), - i18n("discourse_activity_pub.banner.public_first_post"), - "shows the right category banner tip" - ); + assert + .dom(".fk-d-tooltip__inner-content") + .hasText( + i18n("discourse_activity_pub.banner.public_first_post"), + "shows the right category banner tip" + ); }); test("when routing from a category with an actor to one without", async function (assert) { @@ -170,19 +159,17 @@ acceptance( await visit(category.url); - assert.ok( - exists(".activity-pub-route-nav.visible"), - "the activitypub nav button is visible" - ); + assert + .dom(".activity-pub-route-nav.visible") + .exists("the ActivityPub nav button is visible"); const categoryDrop = selectKit(".category-drop"); await categoryDrop.expand(); await categoryDrop.selectRowByValue(7); - assert.notOk( - exists(".activity-pub-route-nav.visible"), - "the activitypub nav button is not visible" - ); + assert + .dom(".activity-pub-route-nav.visible") + .doesNotExist("the ActivityPub nav button is not visible"); }); test("when routing from a tag with an actor to one without", async function (assert) { @@ -193,19 +180,17 @@ acceptance( await visit("/tag/monkey"); - assert.ok( - exists(".activity-pub-route-nav.visible"), - "the activitypub nav button is visible" - ); + assert + .dom(".activity-pub-route-nav.visible") + .exists("the ActivityPub nav button is visible"); const tagDrop = selectKit(".tag-drop"); await tagDrop.expand(); await tagDrop.selectRowByName("dog"); - assert.notOk( - exists(".activity-pub-route-nav.visible"), - "the activitypub nav button is not visible" - ); + assert + .dom(".activity-pub-route-nav.visible") + .doesNotExist("the ActivityPub nav button is not visible"); }); } ); @@ -230,16 +215,15 @@ acceptance( await visit(category.url); await click(".activity-pub-route-nav"); - assert.notOk( - exists(".activity-pub-banner"), - "the activitypub banner is not visible" - ); + assert + .dom(".activity-pub-banner") + .doesNotExist("the ActivityPub banner is not visible"); }); } ); acceptance( - "Discourse Activity Pub | Discovery activitypub followers route with publishing disabled", + "Discourse Activity Pub | Discovery ActivityPub followers route with publishing disabled", function (needs) { needs.user(); needs.site({ @@ -261,7 +245,7 @@ acceptance( ); acceptance( - "Discourse Activity Pub | Discovery activitypub followers route without followers", + "Discourse Activity Pub | Discovery ActivityPub followers route without followers", function (needs) { needs.user(); needs.site({ @@ -279,21 +263,18 @@ acceptance( test("with activity pub ready", async function (assert) { await visit(followersPath); - assert.notOk( - exists(".activity-pub-follow-table.followers"), - "the activitypub followers table is not visible" - ); - assert.equal( - query(".activity-pub-followers-container").innerText, - i18n("search.no_results"), - "no results shown" - ); + assert + .dom(".activity-pub-follow-table.followers") + .doesNotExist("the ActivityPub followers table is not visible"); + assert + .dom(".activity-pub-followers-container") + .hasText(i18n("search.no_results"), "no results shown"); }); } ); acceptance( - "Discourse Activity Pub | Discovery activitypub followers route with followers", + "Discourse Activity Pub | Discovery ActivityPub followers route with followers", function (needs) { needs.user(); needs.site({ @@ -311,64 +292,52 @@ acceptance( test("with activity pub ready", async function (assert) { await visit(followersPath); - assert.ok( - exists(".activity-pub-follow-table.followers"), - "the activitypub followers table is visible" - ); + assert + .dom(".activity-pub-follow-table.followers") + .exists("the ActivityPub followers table is visible"); assert.strictEqual( document.querySelectorAll(".activity-pub-follow-table-row").length, 2, "followers are visible" ); - assert.ok( - query(".activity-pub-actor-image img").src.includes( - "/images/avatar.png" - ), - "follower image is visible" - ); - assert.equal( - query(".activity-pub-actor-name").innerText, - "Angus", - "follower name is visible" - ); - assert.equal( - query(".activity-pub-actor-handle").innerText, - "@angus_ap@test.local", - "follower handle is visible" - ); - assert.ok( - query(".activity-pub-follow-table-user a.avatar").href.includes( - "/u/angus" - ), - "follower user avatar is visible" - ); - assert.equal( - query(".activity-pub-follow-table-followed-at").innerText, - "Feb 8, 2013", - "follower followed at is visible" - ); - assert.ok( - exists(".activity-pub-follow-btn"), - "the activitypub follow btn is visible" - ); + assert + .dom(".activity-pub-actor-image img") + .hasAttribute( + "src", + /\/images\/avatar\.png/, + "follower image is visible" + ); + assert + .dom(".activity-pub-actor-name") + .hasText("Angus", "follower name is visible"); + assert + .dom(".activity-pub-actor-handle") + .hasText("@angus_ap@test.local", "follower handle is visible"); + assert + .dom(".activity-pub-follow-table-user a.avatar") + .hasAttribute("href", /\/u\/angus/, "follower user avatar is visible"); + assert + .dom(".activity-pub-follow-table-followed-at") + .hasText("Feb 8, 2013", "follower followed at is visible"); + assert + .dom(".activity-pub-follow-btn") + .exists("the ActivityPub follow btn is visible"); await click(".activity-pub-follow-btn"); - assert.ok( - exists(".modal.activity-pub-follow-modal"), - "it shows the activitypub follow modal" - ); - assert.equal( - query("#discourse-modal-title").innerText, + assert + .dom(".modal.activity-pub-follow-modal") + .exists("shows the ActivityPub follow modal"); + assert.dom("#discourse-modal-title").hasText( i18n("discourse_activity_pub.follow.title", { actor: "Cat 2", }), - "activitypub modal has the right title" + "ActivityPub modal has the right title" ); }); } ); acceptance( - "Discourse Activity Pub | Discovery activitypub follows route with no create follow permission", + "Discourse Activity Pub | Discovery ActivityPub follows route with no create follow permission", function (needs) { needs.user(); needs.site({ @@ -390,7 +359,7 @@ acceptance( ); acceptance( - "Discourse Activity Pub | Discovery activitypub subcategory follows route with edit permission", + "Discourse Activity Pub | Discovery ActivityPub subcategory follows route with edit permission", function (needs) { needs.user(); needs.site({ @@ -410,16 +379,15 @@ acceptance( test("with activity pub ready", async function (assert) { await visit("/ap/local/actor/3/follows"); - assert.ok( - exists(".activity-pub-follows-container"), - "the activitypub follows route is visible" - ); + assert + .dom(".activity-pub-follows-container") + .exists("the ActivityPub follows route is visible"); }); } ); acceptance( - "Discourse Activity Pub | Discovery activitypub category follows route with edit permission with followers", + "Discourse Activity Pub | Discovery ActivityPub category follows route with edit permission with followers", function (needs) { needs.user(); needs.site({ @@ -437,75 +405,60 @@ acceptance( test("with activity pub ready", async function (assert) { await visit(followsPath); - assert.ok( - exists(".activity-pub-follow-table.follows"), - "the activitypub follows table is visible" - ); + assert + .dom(".activity-pub-follow-table.follows") + .exists("the ActivityPub follows table is visible"); assert.strictEqual( document.querySelectorAll(".activity-pub-follow-table-row").length, 2, "follows are visible" ); - assert.ok( - query(".activity-pub-actor-image img").src.includes( - "/images/avatar.png" - ), - "follower image is visible" - ); - assert.equal( - query(".activity-pub-actor-name").innerText, - "Angus", - "follower name is visible" - ); - assert.equal( - query(".activity-pub-actor-handle").innerText, - "@angus_ap@test.local", - "follow handle is visible" - ); - assert.ok( - query(".activity-pub-follow-table-user a.avatar").href.includes( - "/u/angus" - ), - "follow user avatar is visible" - ); - assert.equal( - query(".activity-pub-follow-table-followed-at").innerText, - "Feb 8, 2013", - "follower followed at is visible" - ); - - assert.ok( - exists(".activity-pub-actor-follow-btn"), - "the activitypub actor follow btn is visible" - ); + assert + .dom(".activity-pub-actor-image img") + .hasAttribute( + "src", + /\/images\/avatar\.png/, + "follower image is visible" + ); + assert + .dom(".activity-pub-actor-name") + .hasText("Angus", "follower name is visible"); + assert + .dom(".activity-pub-actor-handle") + .hasText("@angus_ap@test.local", "follow handle is visible"); + assert + .dom(".activity-pub-follow-table-user a.avatar") + .hasAttribute("href", /\/u\/angus/, "follow user avatar is visible"); + assert + .dom(".activity-pub-follow-table-followed-at") + .hasText("Feb 8, 2013", "follower followed at is visible"); + + assert + .dom(".activity-pub-actor-follow-btn") + .exists("the ActivityPub actor follow btn is visible"); await click(".activity-pub-actor-follow-btn"); - assert.ok( - exists(".modal.activity-pub-actor-follow-modal"), - "it shows the activitypub actor follow modal" - ); - assert.equal( - query("#discourse-modal-title").innerText, + assert + .dom(".modal.activity-pub-actor-follow-modal") + .exists("shows the ActivityPub actor follow modal"); + assert.dom("#discourse-modal-title").hasText( i18n("discourse_activity_pub.actor_follow.title", { actor: "Cat 2", }), - "activitypub actor follow modal has the right title" + "ActivityPub actor follow modal has the right title" ); - assert.ok( - exists(".activity-pub-actor-unfollow-btn"), - "the activitypub actor unfollow btn is visible" - ); + assert + .dom(".activity-pub-actor-unfollow-btn") + .exists("the ActivityPub actor unfollow btn is visible"); await click(".activity-pub-actor-unfollow-btn"); - assert.ok( - exists(".modal.activity-pub-actor-unfollow-modal"), - "it shows the activitypub actor unfollow modal" - ); - assert.equal( - query("#discourse-modal-title").innerText, + assert + .dom(".modal.activity-pub-actor-unfollow-modal") + .exists("shows the ActivityPub actor unfollow modal"); + assert.dom("#discourse-modal-title").hasText( i18n("discourse_activity_pub.actor_unfollow.modal_title", { actor: "Cat 2", }), - "activitypub actor unfollow modal has the right title" + "ActivityPub actor unfollow modal has the right title" ); }); } diff --git a/test/javascripts/acceptance/activity-pub-preferences-test.js b/test/javascripts/acceptance/activity-pub-preferences-test.js index a1fd5f2b..38f8b626 100644 --- a/test/javascripts/acceptance/activity-pub-preferences-test.js +++ b/test/javascripts/acceptance/activity-pub-preferences-test.js @@ -2,11 +2,9 @@ import { visit } from "@ember/test-helpers"; import { test } from "qunit"; import { acceptance, - exists, loggedInUser, - query, } from "discourse/tests/helpers/qunit-helpers"; -import { default as Authorizations } from "../fixtures/authorization-fixtures"; +import Authorizations from "../fixtures/authorization-fixtures"; acceptance("Discourse Activity Pub | Preferences", function (needs) { needs.user(); @@ -19,34 +17,30 @@ acceptance("Discourse Activity Pub | Preferences", function (needs) { test("displays account authorization section", async function (assert) { await visit(`/u/${loggedInUser().username}/preferences/activity-pub`); - assert.ok(exists(".activity-pub-authorize")); + assert.dom(".activity-pub-authorize").exists(); }); test("displays account authorizations", async function (assert) { await visit(`/u/${loggedInUser().username}/preferences/activity-pub`); - assert.ok( - exists(".activity-pub-authorizations .activity-pub-actor-table"), - "the authorizations table is visible" - ); - assert.strictEqual( - document.querySelectorAll(".activity-pub-actor-table-row").length, - 2, - "authorized actors are visible" - ); - assert.ok( - query(".activity-pub-actor-image img").src.includes("/images/avatar.png"), - "authorized actor image is visible" - ); - assert.equal( - query(".activity-pub-actor-name").innerText, - "Angus", - "authorized actor name is visible" - ); - assert.equal( - query(".activity-pub-actor-handle").innerText, - "@angus_ap@test.local", - "authorized actor handle is visible" - ); + assert + .dom(".activity-pub-authorizations .activity-pub-actor-table") + .exists("the authorizations table is visible"); + assert + .dom(".activity-pub-actor-table-row") + .exists({ count: 2 }, "authorized actors are visible"); + assert + .dom(".activity-pub-actor-image img") + .hasAttribute( + "src", + /\/images\/avatar\.png/, + "authorized actor image is visible" + ); + assert + .dom(".activity-pub-actor-name") + .hasText("Angus", "authorized actor name is visible"); + assert + .dom(".activity-pub-actor-handle") + .hasText("@angus_ap@test.local", "authorized actor handle is visible"); }); }); diff --git a/test/javascripts/acceptance/activity-pub-topic-test.js b/test/javascripts/acceptance/activity-pub-topic-test.js index 15ff41aa..d072fed1 100644 --- a/test/javascripts/acceptance/activity-pub-topic-test.js +++ b/test/javascripts/acceptance/activity-pub-topic-test.js @@ -6,12 +6,10 @@ import Site from "discourse/models/site"; import topicFixtures from "discourse/tests/fixtures/topic"; import { acceptance, - exists, publishToMessageBus, - query, } from "discourse/tests/helpers/qunit-helpers"; import { i18n } from "discourse-i18n"; -import { default as SiteActors } from "../fixtures/site-actors-fixtures"; +import SiteActors from "../fixtures/site-actors-fixtures"; const createdAt = moment().subtract(2, "days"); const scheduledAt = moment().add(3, "minutes"); @@ -80,14 +78,12 @@ acceptance( await visit("/t/280"); - assert.notOk( - exists(".topic-map__activity-pub"), - "the topic map is not visible" - ); - assert.notOk( - exists(".topic-post:nth-of-type(2) .post-info.activity-pub"), - "the post status is not visible" - ); + assert + .dom(".topic-map__activity-pub") + .doesNotExist("the topic map is not visible"); + assert + .dom(".topic-post:nth-of-type(2) .post-info.activity-pub") + .doesNotExist("the post status is not visible"); }); } ); @@ -119,10 +115,9 @@ acceptance( await visit("/t/280"); - assert.notOk( - exists(".topic-map__activity-pub"), - "the activity pub topic map is not visible" - ); + assert + .dom(".topic-map__activity-pub") + .doesNotExist("the activity pub topic map is not visible"); }); test("When the plugin is enabled", async function (assert) { @@ -134,11 +129,10 @@ acceptance( await visit("/t/280"); - assert.ok(exists(".topic-map__activity-pub"), "the topic map is visible"); - assert.ok( - exists(".topic-post:nth-of-type(3) .post-info.activity-pub"), - "is visible" - ); + assert.dom(".topic-map__activity-pub").exists("the topic map is visible"); + assert + .dom(".topic-post:nth-of-type(3) .post-info.activity-pub") + .exists("is visible"); }); test("post status update", async function (assert) { @@ -161,14 +155,13 @@ acceptance( }; await publishToMessageBus("/activity-pub", postStatusUpdate); - assert.ok( - exists( + assert + .dom( `.topic-post:nth-of-type(3) .activity-pub-post-status[title='Post was deleted via ActivityPub on ${deletedAt.format( i18n("dates.time_short_day") )}.']` - ), - "shows the right post status text" - ); + ) + .exists("shows the right post status text"); }); } ); @@ -199,10 +192,9 @@ acceptance( await visit("/t/280"); - assert.notOk( - exists(".topic-map__activity-pub"), - "the activity pub topic map is not visible" - ); + assert + .dom(".topic-map__activity-pub") + .doesNotExist("the activity pub topic map is not visible"); }); test("When the plugin is enabled", async function (assert) { @@ -214,11 +206,10 @@ acceptance( await visit("/t/280"); - assert.ok(exists(".topic-map__activity-pub"), "the topic map is visible"); - assert.ok( - exists(".topic-post:nth-of-type(3) .post-info.activity-pub"), - "is visible" - ); + assert.dom(".topic-map__activity-pub").exists("the topic map is visible"); + assert + .dom(".topic-post:nth-of-type(3) .post-info.activity-pub") + .exists("is visible"); }); } ); @@ -248,15 +239,14 @@ acceptance( await visit("/t/280"); - assert.strictEqual( - query( - ".topic-map__activity-pub .activity-pub-topic-status" - ).innerText.trim(), - `Topic is scheduled to be published via ActivityPub on ${scheduledAt.format( - i18n("dates.time_short_day") - )}.`, - "shows the right status text" - ); + assert + .dom(".topic-map__activity-pub .activity-pub-topic-status") + .hasText( + `Topic is scheduled to be published via ActivityPub on ${scheduledAt.format( + i18n("dates.time_short_day") + )}.`, + "shows the right status text" + ); }); } ); @@ -298,10 +288,9 @@ acceptance( await visit("/t/280"); - assert.notOk( - exists(".topic-map__activity-pub"), - "the topic map is not visible" - ); + assert + .dom(".topic-map__activity-pub") + .doesNotExist("the topic map is not visible"); }); test("topic map", async function (assert) { @@ -312,15 +301,14 @@ acceptance( await visit("/t/280"); - assert.strictEqual( - query( - ".topic-map__activity-pub .activity-pub-topic-status" - ).innerText.trim(), - `Topic was published via ActivityPub on ${publishedAt.format( - i18n("dates.time_short_day") - )}.`, - "shows the right status text" - ); + assert + .dom(".topic-map__activity-pub .activity-pub-topic-status") + .hasText( + `Topic was published via ActivityPub on ${publishedAt.format( + i18n("dates.time_short_day") + )}.`, + "shows the right status text" + ); }); test("topic status update", async function (assert) { @@ -341,15 +329,14 @@ acceptance( }; await publishToMessageBus("/activity-pub", topicStatusUpdate); - assert.strictEqual( - query( - ".topic-map__activity-pub .activity-pub-topic-status" - ).innerText.trim(), - `Topic was deleted via ActivityPub on ${deletedAt.format( - i18n("dates.time_short_day") - )}.`, - "shows the right status text" - ); + assert + .dom(".topic-map__activity-pub .activity-pub-topic-status") + .hasText( + `Topic was deleted via ActivityPub on ${deletedAt.format( + i18n("dates.time_short_day") + )}.`, + "shows the right status text" + ); }); test("topic info modal", async function (assert) { @@ -361,38 +348,34 @@ acceptance( await visit("/t/280"); await click(".topic-map__activity-pub .activity-pub-topic-status"); - assert.ok(exists(".activity-pub-topic-info-modal"), "shows the modal"); - - assert.strictEqual( - query( - ".activity-pub-topic-info-modal .activity-pub-topic-status" - ).innerText.trim(), - `Topic was published on ${publishedAt.format( - i18n("dates.long_with_year") - )}.`, - "shows the right topic status text" - ); - assert.strictEqual( - query( - ".activity-pub-topic-info-modal .activity-pub-post-status" - ).innerText.trim(), - `Post was published on ${publishedAt.format( - i18n("dates.long_with_year") - )}.`, - "shows the right post status text" - ); - assert.ok( - exists( + assert.dom(".activity-pub-topic-info-modal").exists("shows the modal"); + + assert + .dom(".activity-pub-topic-info-modal .activity-pub-topic-status") + .hasText( + `Topic was published on ${publishedAt.format( + i18n("dates.long_with_year") + )}.`, + "shows the right topic status text" + ); + assert + .dom(".activity-pub-topic-info-modal .activity-pub-post-status") + .hasText( + `Post was published on ${publishedAt.format( + i18n("dates.long_with_year") + )}.`, + "shows the right post status text" + ); + assert + .dom( ".activity-pub-topic-info-modal .activity-pub-attribute.object-type.collection" - ), - "shows the right topic object type attribute" - ); - assert.ok( - exists( + ) + .exists("shows the right topic object type attribute"); + assert + .dom( ".activity-pub-topic-info-modal .activity-pub-attribute.object-type.note" - ), - "shows the right post object type attribute" - ); + ) + .exists("shows the right post object type attribute"); const topicStatusUpdate = { model: { @@ -404,15 +387,14 @@ acceptance( }; await publishToMessageBus("/activity-pub", topicStatusUpdate); - assert.strictEqual( - query( - ".activity-pub-topic-info-modal .activity-pub-topic-status" - ).innerText.trim(), - `Topic was deleted on ${deletedAt.format( - i18n("dates.long_with_year") - )}.`, - "handles a status update" - ); + assert + .dom(".activity-pub-topic-info-modal .activity-pub-topic-status") + .hasText( + `Topic was deleted on ${deletedAt.format( + i18n("dates.long_with_year") + )}.`, + "handles a status update" + ); }); test("topic admin modal", async function (assert) { @@ -426,26 +408,25 @@ acceptance( await click(".topic-admin-menu-trigger"); await click(".show-activity-pub-topic-admin"); - assert.ok(exists(".activity-pub-topic-admin-modal"), "shows the modal"); - assert.ok( - query( + assert.dom(".activity-pub-topic-admin-modal").exists("shows the modal"); + assert + .dom( ".activity-pub-topic-admin-modal .activity-pub-topic-actions .action.publish-all" - ), - "shows the publish all posts action" - ); - assert.strictEqual( - query( + ) + .exists("shows the publish all posts action"); + assert + .dom( ".activity-pub-topic-admin-modal .activity-pub-topic-actions .action.publish-all .action-description" - ).innerText.trim(), - `Publish 18 unpublished posts in Topic #280. Posts will not be delivered to the followers of the Group Actors.`, - "shows the right publish all description" - ); - assert.ok( - query( + ) + .hasText( + "Publish 18 unpublished posts in Topic #280. Posts will not be delivered to the followers of the Group Actors.", + "shows the right publish all description" + ); + assert + .dom( ".activity-pub-topic-admin-modal .activity-pub-post-actions .action.deliver" - ), - "shows the post deliver action" - ); + ) + .exists("shows the post deliver action"); const topicStatusUpdate = { model: { @@ -456,13 +437,14 @@ acceptance( }, }; await publishToMessageBus("/activity-pub", topicStatusUpdate); - assert.strictEqual( - query( + assert + .dom( ".activity-pub-topic-admin-modal .activity-pub-topic-actions .action.publish-all .action-description" - ).innerText.trim(), - `Publish all posts is disabled. All posts in Topic #280 are already published.`, - "handles topic status updates" - ); + ) + .hasText( + "Publish all posts is disabled. All posts in Topic #280 are already published.", + "handles topic status updates" + ); }); test("post info modal", async function (assert) { @@ -474,24 +456,19 @@ acceptance( await visit("/t/280"); await click(".topic-post:nth-of-type(3) .activity-pub-post-status"); - assert.ok(exists(".activity-pub-post-info-modal"), "shows the modal"); - - assert.strictEqual( - query( - ".activity-pub-post-info-modal .activity-pub-post-status" - ).innerText.trim(), - `Post was published on ${publishedAt.format( - i18n("dates.long_with_year") - )}.`, - "shows the right status text" - ); - assert.strictEqual( - query( - ".activity-pub-post-info-modal .activity-pub-attribute.visibility" - ).innerText.trim(), - "Public", - "shows the right visibility text" - ); + assert.dom(".activity-pub-post-info-modal").exists("shows the modal"); + + assert + .dom(".activity-pub-post-info-modal .activity-pub-post-status") + .hasText( + `Post was published on ${publishedAt.format( + i18n("dates.long_with_year") + )}.`, + "shows the right status text" + ); + assert + .dom(".activity-pub-post-info-modal .activity-pub-attribute.visibility") + .hasText("Public", "shows the right visibility text"); }); test("post admin modal", async function (assert) { @@ -505,20 +482,20 @@ acceptance( await click(".topic-post:nth-of-type(4) .post-action-menu__show-more"); await click(".topic-post:nth-of-type(4) .post-action-menu__admin"); await click(".show-activity-pub-post-admin"); - assert.ok(exists(".activity-pub-post-admin-modal"), "shows the modal"); - assert.ok( - query( + assert.dom(".activity-pub-post-admin-modal").exists("shows the modal"); + assert + .dom( ".activity-pub-post-admin-modal .activity-pub-post-actions .action.publish" - ), - "shows the publish post action" - ); - assert.strictEqual( - query( + ) + .exists("shows the publish post action"); + assert + .dom( ".activity-pub-post-admin-modal .activity-pub-post-actions .action.publish .action-description" - ).innerText.trim(), - `Publish Post #3 without delivering it. The Group Actors have no followers to deliver to.`, - "shows the right publish description" - ); + ) + .hasText( + "Publish Post #3 without delivering it. The Group Actors have no followers to deliver to.", + "shows the right publish description" + ); const topicStatusUpdate = { model: { id: 280, @@ -527,13 +504,14 @@ acceptance( }, }; await publishToMessageBus("/activity-pub", topicStatusUpdate); - assert.strictEqual( - query( + assert + .dom( ".activity-pub-post-admin-modal .activity-pub-post-actions .action.publish .action-description" - ).innerText.trim(), - "Publish is disabled for Post #3. Topic #280 is not published.", - "handles topic status updates" - ); + ) + .hasText( + "Publish is disabled for Post #3. Topic #280 is not published.", + "handles topic status updates" + ); }); } ); @@ -567,38 +545,34 @@ acceptance( await visit("/t/280"); await click(".topic-map__activity-pub .activity-pub-topic-status"); - assert.ok(exists(".activity-pub-topic-info-modal"), "shows the modal"); - - assert.strictEqual( - query( - ".activity-pub-topic-info-modal .activity-pub-topic-status" - ).innerText.trim(), - `Topic was published on ${publishedAt.format( - i18n("dates.long_with_year") - )}.`, - "shows the right topic status text" - ); - assert.strictEqual( - query( - ".activity-pub-topic-info-modal .activity-pub-post-status" - ).innerText.trim(), - `Post was published on ${publishedAt.format( - i18n("dates.long_with_year") - )}.`, - "shows the right post status text" - ); - assert.notOk( - exists( + assert.dom(".activity-pub-topic-info-modal").exists("shows the modal"); + + assert + .dom(".activity-pub-topic-info-modal .activity-pub-topic-status") + .hasText( + `Topic was published on ${publishedAt.format( + i18n("dates.long_with_year") + )}.`, + "shows the right topic status text" + ); + assert + .dom(".activity-pub-topic-info-modal .activity-pub-post-status") + .hasText( + `Post was published on ${publishedAt.format( + i18n("dates.long_with_year") + )}.`, + "shows the right post status text" + ); + assert + .dom( ".activity-pub-topic-info-modal .activity-pub-attribute.object-type.collection" - ), - "does not show a topic object type attribute" - ); - assert.ok( - exists( + ) + .doesNotExist("does not show a topic object type attribute"); + assert + .dom( ".activity-pub-topic-info-modal .activity-pub-attribute.object-type.note" - ), - "shows the right post object type attribute" - ); + ) + .exists("shows the right post object type attribute"); }); test("ActivityPub topic admin modal", async function (assert) { @@ -612,12 +586,11 @@ acceptance( await click(".topic-admin-menu-trigger"); await click(".show-activity-pub-topic-admin"); - assert.notOk( - query( + assert + .dom( ".activity-pub-topic-admin-modal .activity-pub-topic-actions .action.publish-all" - ), - "does not show the publish all posts action" - ); + ) + .doesNotExist("does not show the publish all posts action"); }); } ); @@ -660,21 +633,21 @@ acceptance( await visit("/t/280"); - assert.strictEqual( - query(".activity-pub-topic-status").innerText.trim(), - `Topic was published via ActivityPub by @cat_1@test.local on ${publishedAt.format( - i18n("dates.time_short_day") - )}.`, - "shows the right topic status text" - ); - assert.ok( - exists( + assert + .dom(".activity-pub-topic-status") + .hasText( + `Topic was published via ActivityPub by @cat_1@test.local on ${publishedAt.format( + i18n("dates.time_short_day") + )}.`, + "shows the right topic status text" + ); + assert + .dom( `.topic-post:nth-of-type(3) .activity-pub-post-status[title='Post was published via ActivityPub by actor1@domain.com on ${publishedAt.format( i18n("dates.time_short_day") )}.']` - ), - "shows the right post status text" - ); + ) + .exists("shows the right post status text"); }); test("ActivityPub topic info modal", async function (assert) { @@ -686,35 +659,32 @@ acceptance( await visit("/t/280"); await click(".topic-map__activity-pub .activity-pub-topic-status"); - assert.ok(exists(".activity-pub-topic-info-modal"), "shows the modal"); - - assert.strictEqual( - query( - ".activity-pub-topic-info-modal .activity-pub-topic-status" - ).innerText.trim(), - `Topic was published on ${publishedAt.format( - i18n("dates.long_with_year") - )}.`, - "shows the right topic status text" - ); - assert.strictEqual( - query( - ".activity-pub-topic-info-modal .activity-pub-post-status" - ).innerText.trim(), - `Post was published on ${publishedAt.format( - i18n("dates.long_with_year") - )}.`, - "shows the right post status text" - ); - assert.strictEqual( - query( - ".activity-pub-topic-info-modal .activity-pub-post-status" - ).innerText.trim(), - `Post was published on ${publishedAt.format( - i18n("dates.long_with_year") - )}.`, - "shows the right post status text" - ); + assert.dom(".activity-pub-topic-info-modal").exists("shows the modal"); + + assert + .dom(".activity-pub-topic-info-modal .activity-pub-topic-status") + .hasText( + `Topic was published on ${publishedAt.format( + i18n("dates.long_with_year") + )}.`, + "shows the right topic status text" + ); + assert + .dom(".activity-pub-topic-info-modal .activity-pub-post-status") + .hasText( + `Post was published on ${publishedAt.format( + i18n("dates.long_with_year") + )}.`, + "shows the right post status text" + ); + assert + .dom(".activity-pub-topic-info-modal .activity-pub-post-status") + .hasText( + `Post was published on ${publishedAt.format( + i18n("dates.long_with_year") + )}.`, + "shows the right post status text" + ); }); test("ActivityPub post info modal", async function (assert) { @@ -726,23 +696,18 @@ acceptance( await visit("/t/280"); await click(".topic-post:nth-of-type(3) .activity-pub-post-status"); - assert.ok(exists(".activity-pub-post-info-modal"), "shows the modal"); - assert.strictEqual( - query( - ".activity-pub-post-info-modal .activity-pub-post-status" - ).innerText.trim(), - `Post was published on ${publishedAt.format( - i18n("dates.long_with_year") - )}.`, - "shows the right status text" - ); - assert.strictEqual( - query( - ".activity-pub-post-info-modal .activity-pub-attribute.visibility" - ).innerText.trim(), - "Public", - "shows the right visibility text" - ); + assert.dom(".activity-pub-post-info-modal").exists("shows the modal"); + assert + .dom(".activity-pub-post-info-modal .activity-pub-post-status") + .hasText( + `Post was published on ${publishedAt.format( + i18n("dates.long_with_year") + )}.`, + "shows the right status text" + ); + assert + .dom(".activity-pub-post-info-modal .activity-pub-attribute.visibility") + .hasText("Public", "shows the right visibility text"); }); } ); diff --git a/test/javascripts/components/activity-pub-authorize-test.js b/test/javascripts/components/activity-pub-authorize-test.gjs similarity index 72% rename from test/javascripts/components/activity-pub-authorize-test.js rename to test/javascripts/components/activity-pub-authorize-test.gjs index d3fa58ef..c94e1a0a 100644 --- a/test/javascripts/components/activity-pub-authorize-test.js +++ b/test/javascripts/components/activity-pub-authorize-test.gjs @@ -1,19 +1,16 @@ import { click, fillIn, render, triggerKeyEvent } from "@ember/test-helpers"; -import hbs from "htmlbars-inline-precompile"; import { module, test } from "qunit"; import sinon from "sinon"; import { setupRenderingTest } from "discourse/tests/helpers/component-test"; import pretender, { response } from "discourse/tests/helpers/create-pretender"; -import { exists, query } from "discourse/tests/helpers/qunit-helpers"; import selectKit from "discourse/tests/helpers/select-kit-helper"; +import ActivityPubAuthorize from "discourse/plugins/discourse-activity-pub/discourse/components/activity-pub-authorize"; module( "Discourse Activity Pub | Component | activity-pub-authorize", function (hooks) { setupRenderingTest(hooks); - const template = hbs``; - test("verifies a domain", async function (assert) { let domain = "test.com"; let authType = "discourse"; @@ -24,12 +21,12 @@ module( assert.strictEqual( request.requestBody, `domain=${domain}&auth_type=${authType}`, - "it sets correct request parameters" + "sets correct request parameters" ); return response({ success: true }); }); - await render(template); + await render(); const authTypes = selectKit("#user_activity_pub_authorize_auth_type"); await authTypes.expand(); @@ -39,19 +36,15 @@ module( await click("#user_activity_pub_authorize_verify_domain"); assert.strictEqual(requests, 1, "performs one request"); - assert.strictEqual( - query(".activity-pub-authorize-verified-domain span").textContent, - domain, - "displays the verified domain" - ); - assert.ok( - exists("#user_activity_pub_authorize_clear_domain"), - "displays the clear verified domain button" - ); - assert.ok( - exists("#user_activity_pub_authorize_authorize_domain"), - "displays the authorize domain button" - ); + assert + .dom(".activity-pub-authorize-verified-domain span") + .hasText(domain, "displays the verified domain"); + assert + .dom("#user_activity_pub_authorize_clear_domain") + .exists("displays the clear verified domain button"); + assert + .dom("#user_activity_pub_authorize_authorize_domain") + .exists("displays the authorize domain button"); }); test("pressing Enter in input triggers domain verification", async function (assert) { @@ -64,12 +57,12 @@ module( assert.strictEqual( request.requestBody, `domain=${domain}&auth_type=${authType}`, - "it sets correct request parameters" + "sets correct request parameters" ); return response({ success: true }); }); - await render(template); + await render(); const authTypes = selectKit("#user_activity_pub_authorize_auth_type"); await authTypes.expand(); @@ -90,7 +83,7 @@ module( return response({ success: true }); }); - await render(template); + await render(); const authTypes = selectKit("#user_activity_pub_authorize_auth_type"); await authTypes.expand(); @@ -100,19 +93,15 @@ module( await click("#user_activity_pub_authorize_verify_domain"); await click("#user_activity_pub_authorize_clear_domain"); - assert.ok( - exists("#user_activity_pub_authorize_domain"), - "displays the domain input" - ); - assert.strictEqual( - query("#user_activity_pub_authorize_domain").textContent, - "", - "the domain input is empty" - ); - assert.ok( - exists("#user_activity_pub_authorize_verify_domain"), - "displays the verify domain button" - ); + assert + .dom("#user_activity_pub_authorize_domain") + .exists("displays the domain input"); + assert + .dom("#user_activity_pub_authorize_domain") + .hasNoText("the domain input is empty"); + assert + .dom("#user_activity_pub_authorize_verify_domain") + .exists("displays the verify domain button"); }); test("authorizes a verified domain", async function (assert) { @@ -124,7 +113,7 @@ module( const openStub = sinon.stub(window, "open").returns(null); - await render(template); + await render(); const authTypes = selectKit("#user_activity_pub_authorize_auth_type"); await authTypes.expand(); @@ -136,7 +125,7 @@ module( assert.true( openStub.calledWith(`/ap/auth/authorize/${authType}`, "_self"), - "it loads the authorize route in the current tab" + "loads the authorize route in the current tab" ); }); } diff --git a/test/javascripts/components/activity-pub-follow-domain-test.js b/test/javascripts/components/activity-pub-follow-domain-test.gjs similarity index 61% rename from test/javascripts/components/activity-pub-follow-domain-test.js rename to test/javascripts/components/activity-pub-follow-domain-test.gjs index 231b40c5..4b80fc8a 100644 --- a/test/javascripts/components/activity-pub-follow-domain-test.js +++ b/test/javascripts/components/activity-pub-follow-domain-test.gjs @@ -1,5 +1,4 @@ import { click, fillIn, render } from "@ember/test-helpers"; -import hbs from "htmlbars-inline-precompile"; import { module, test } from "qunit"; import sinon from "sinon"; import DiscourseURL from "discourse/lib/url"; @@ -7,9 +6,9 @@ import Category from "discourse/models/category"; import Site from "discourse/models/site"; import { setupRenderingTest } from "discourse/tests/helpers/component-test"; import pretender, { response } from "discourse/tests/helpers/create-pretender"; -import { query } from "discourse/tests/helpers/qunit-helpers"; import { i18n } from "discourse-i18n"; -import { default as Mastodon } from "../fixtures/mastodon-fixtures"; +import ActivityPubFollowDomain from "discourse/plugins/discourse-activity-pub/discourse/components/activity-pub-follow-domain"; +import Mastodon from "../fixtures/mastodon-fixtures"; const mastodonAboutPath = "api/v2/instance"; @@ -27,41 +26,55 @@ module( this.model = category; }); - const template = hbs``; - test("with a non domain input", async function (assert) { + const self = this; + let domain = "notADomain"; - await render(template); + await render( + + ); await fillIn("#activity_pub_follow_domain_input", domain); await click("#activity_pub_follow_domain_button"); - assert.strictEqual( - query(".activity-pub-follow-domain-footer.error").textContent.trim(), - i18n("discourse_activity_pub.follow.domain.invalid"), - "displays an invalid message" - ); + assert + .dom(".activity-pub-follow-domain-footer.error") + .hasText( + i18n("discourse_activity_pub.follow.domain.invalid"), + "displays an invalid message" + ); }); - test("with a non activitypub domain", async function (assert) { + test("with a non ActivityPub domain", async function (assert) { + const self = this; + let domain = "google.com"; pretender.get(`https://${domain}/${mastodonAboutPath}`, () => { return response(404, "not found"); }); - await render(template); + await render( + + ); await fillIn("#activity_pub_follow_domain_input", domain); await click("#activity_pub_follow_domain_button"); - assert.strictEqual( - query(".activity-pub-follow-domain-footer.error")?.textContent.trim(), - i18n("discourse_activity_pub.follow.domain.invalid"), - "displays an invalid message" - ); + assert + .dom(".activity-pub-follow-domain-footer.error") + .hasText( + i18n("discourse_activity_pub.follow.domain.invalid"), + "displays an invalid message" + ); }); - test("with an activitypub domain", async function (assert) { + test("with an ActivityPub domain", async function (assert) { + const self = this; + let domain = "mastodon.social"; pretender.get(`https://${domain}/${mastodonAboutPath}`, () => { @@ -72,7 +85,11 @@ module( .stub(DiscourseURL, "redirectAbsolute") .returns(null); - await render(template); + await render( + + ); await fillIn("#activity_pub_follow_domain_input", domain); await click("#activity_pub_follow_domain_button"); @@ -81,7 +98,7 @@ module( )}`; assert.true( openStub.calledWith(url), - "it loads the mastodon authorize interaction route in a new tab" + "loads the mastodon authorize interaction route in a new tab" ); }); } diff --git a/test/javascripts/components/activity-pub-post-test.js b/test/javascripts/components/activity-pub-post-test.gjs similarity index 54% rename from test/javascripts/components/activity-pub-post-test.js rename to test/javascripts/components/activity-pub-post-test.gjs index 8758791d..defe6421 100644 --- a/test/javascripts/components/activity-pub-post-test.js +++ b/test/javascripts/components/activity-pub-post-test.gjs @@ -1,41 +1,54 @@ import { click, render } from "@ember/test-helpers"; -import hbs from "htmlbars-inline-precompile"; import { module, skip } from "qunit"; +import MountWidget from "discourse/components/mount-widget"; import { setupRenderingTest } from "discourse/tests/helpers/component-test"; -import { exists } from "discourse/tests/helpers/qunit-helpers"; module("Discourse Activity Pub | Component | Widget | post", function (hooks) { setupRenderingTest(hooks); skip("non activity pub topic", async function (assert) { + const self = this; + this.currentUser.admin = true; this.set("args", { canManage: true, activity_pub_enabled: false }); this.set("changePostOwner", () => (this.owned = true)); - await render(hbs` - - `); + await render( + + ); await click(".post-menu-area .show-post-admin-menu"); - assert.ok( - exists(".post-admin-menu button.change-owner"), - "the change owner button is visible" - ); + assert + .dom(".post-admin-menu button.change-owner") + .exists("the change owner button is visible"); }); skip("activity pub topic", async function (assert) { + const self = this; + this.currentUser.admin = true; this.set("args", { canManage: true, activity_pub_enabled: true }); this.set("changePostOwner", () => (this.owned = true)); - await render(hbs` - - `); + await render( + + ); await click(".post-menu-area .show-post-admin-menu"); - assert.ok( - !exists(".post-admin-menu button.change-owner"), - "the change owner button is not visible" - ); + assert + .dom(".post-admin-menu button.change-owner") + .doesNotExist("the change owner button is not visible"); }); }); diff --git a/test/javascripts/components/activity-pub-status-test.js b/test/javascripts/components/activity-pub-status-test.gjs similarity index 60% rename from test/javascripts/components/activity-pub-status-test.js rename to test/javascripts/components/activity-pub-status-test.gjs index ea092ffb..5870d39b 100644 --- a/test/javascripts/components/activity-pub-status-test.js +++ b/test/javascripts/components/activity-pub-status-test.gjs @@ -1,10 +1,8 @@ import { getOwner } from "@ember/application"; import { render } from "@ember/test-helpers"; -import hbs from "htmlbars-inline-precompile"; import { module, test } from "qunit"; import { cloneJSON } from "discourse/lib/object"; import Site from "discourse/models/site"; -import AppEvents from "discourse/services/app-events"; import { setupRenderingTest } from "discourse/tests/helpers/component-test"; import { currentUser, @@ -12,7 +10,8 @@ import { query, } from "discourse/tests/helpers/qunit-helpers"; import { i18n } from "discourse-i18n"; -import { default as SiteActors } from "../fixtures/site-actors-fixtures"; +import ActivityPubActorStatus from "discourse/plugins/discourse-activity-pub/discourse/components/activity-pub-actor-status"; +import SiteActors from "../fixtures/site-actors-fixtures"; function setSite(context, attrs = {}) { context.siteSettings.activity_pub_enabled = attrs.activity_pub_enabled; @@ -38,7 +37,7 @@ function setTag(context) { function setComposer(context, opts = {}) { opts.user ??= currentUser(); - opts.appEvents = AppEvents.create(); + opts.appEvents = getOwner(context).lookup("service:app-events"); const store = getOwner(context).lookup("service:store"); const composer = store.createRecord("composer", opts); context.set("composer", composer); @@ -48,9 +47,9 @@ module( "Discourse Activity Pub | Component | activity-pub-actor-status with category", function (hooks) { setupRenderingTest(hooks); - const template = hbs``; - test("with publishing disabled", async function (assert) { + const self = this; + setSite(this, { activity_pub_enabled: true, activity_pub_publishing_enabled: false, @@ -58,23 +57,35 @@ module( }); setCategory(this); - await render(template); + await render( + + ); const status = query(".activity-pub-actor-status.publishing-disabled"); assert.ok(status, "has the right class"); - assert.strictEqual( - status.title, - i18n("discourse_activity_pub.status.title.publishing_disabled"), - "has the right title" - ); - assert.strictEqual( - status.innerText.trim(), - i18n("discourse_activity_pub.status.label.publishing_disabled"), - "has the right label" - ); + assert + .dom(status) + .hasAttribute( + "title", + i18n("discourse_activity_pub.status.title.publishing_disabled"), + "has the right title" + ); + assert + .dom(status) + .hasText( + i18n("discourse_activity_pub.status.label.publishing_disabled"), + "has the right label" + ); }); test("with plugin disabled", async function (assert) { + const self = this; + setSite(this, { activity_pub_enabled: false, activity_pub_publishing_enabled: true, @@ -82,23 +93,35 @@ module( }); setCategory(this); - await render(template); + await render( + + ); const status = query(".activity-pub-actor-status.not-active"); assert.ok(status, "has the right class"); - assert.strictEqual( - status.title, - i18n("discourse_activity_pub.status.title.plugin_disabled"), - "has the right title" - ); - assert.strictEqual( - status.innerText.trim(), - i18n("discourse_activity_pub.status.label.not_active"), - "has the right label" - ); + assert + .dom(status) + .hasAttribute( + "title", + i18n("discourse_activity_pub.status.title.plugin_disabled"), + "has the right title" + ); + assert + .dom(status) + .hasText( + i18n("discourse_activity_pub.status.label.not_active"), + "has the right label" + ); }); test("with activity pub disabled on category", async function (assert) { + const self = this; + const categoryActors = cloneJSON(SiteActors.category); setSite(this, { activity_pub_enabled: true, @@ -114,25 +137,35 @@ module( }); setCategory(this); - await render(template); + await render( + + ); const status = query(".activity-pub-actor-status.not-active"); assert.ok(status, "has the right class"); - assert.strictEqual( - status.title, + assert.dom(status).hasAttribute( + "title", i18n("discourse_activity_pub.status.title.model_disabled", { model_type: "category", }), "has the right title" ); - assert.strictEqual( - status.innerText.trim(), - i18n("discourse_activity_pub.status.label.not_active"), - "has the right label" - ); + assert + .dom(status) + .hasText( + i18n("discourse_activity_pub.status.label.not_active"), + "has the right label" + ); }); test("with activity pub not ready on category", async function (assert) { + const self = this; + const categoryActors = cloneJSON(SiteActors.category); setSite(this, { activity_pub_enabled: true, @@ -149,25 +182,35 @@ module( }); setCategory(this); - await render(template); + await render( + + ); const status = query(".activity-pub-actor-status.not-active"); assert.ok(status, "has the right class"); - assert.strictEqual( - status.title, + assert.dom(status).hasAttribute( + "title", i18n("discourse_activity_pub.status.title.model_not_ready", { model_type: "category", }), "has the right title" ); - assert.strictEqual( - status.innerText.trim(), - i18n("discourse_activity_pub.status.label.not_active"), - "has the right label" - ); + assert + .dom(status) + .hasText( + i18n("discourse_activity_pub.status.label.not_active"), + "has the right label" + ); }); test("with active activity pub", async function (assert) { + const self = this; + setSite(this, { activity_pub_enabled: true, activity_pub_publishing_enabled: true, @@ -175,25 +218,35 @@ module( }); setCategory(this); - await render(template); + await render( + + ); const status = query(".activity-pub-actor-status.active"); assert.ok(status, "has the right class"); - assert.strictEqual( - status.title, + assert.dom(status).hasAttribute( + "title", i18n("discourse_activity_pub.status.title.model_active.first_post", { delay_minutes: this.siteSettings.activity_pub_delivery_delay_minutes, }), "has the right title" ); - assert.strictEqual( - status.innerText.trim(), - i18n("discourse_activity_pub.status.label.active"), - "has the right label" - ); + assert + .dom(status) + .hasText( + i18n("discourse_activity_pub.status.label.active"), + "has the right label" + ); }); test("updates correctly after messageBus message", async function (assert) { + const self = this; + setSite(this, { activity_pub_enabled: true, activity_pub_publishing_enabled: true, @@ -201,7 +254,14 @@ module( }); setCategory(this); - await render(template); + await render( + + ); await publishToMessageBus("/activity-pub", { model: { id: this.category.id, @@ -213,22 +273,23 @@ module( const status = query(".activity-pub-actor-status.not-active"); assert.ok(status, "has the right class"); - assert.strictEqual( - status.title, + assert.dom(status).hasAttribute( + "title", i18n("discourse_activity_pub.status.title.model_not_ready", { model_type: "category", }), "has the right title" ); - assert.strictEqual( - status.innerText.trim(), - i18n("discourse_activity_pub.status.label.not_active"), - "has the right label" - ); + assert + .dom(status) + .hasText( + i18n("discourse_activity_pub.status.label.not_active"), + "has the right label" + ); }); test("when in the composer", async function (assert) { - const composerTemplate = hbs``; + const self = this; setSite(this, { activity_pub_enabled: true, @@ -240,14 +301,21 @@ module( categoryId: this.category.id, }); - await render(composerTemplate); - - const label = query(".activity-pub-actor-status .label"); - assert.strictEqual( - label.innerText.trim(), - i18n("discourse_activity_pub.visibility.label.public"), - "has the right label text" + await render( + ); + + assert + .dom(".activity-pub-actor-status .label") + .hasText( + i18n("discourse_activity_pub.visibility.label.public"), + "has the right label text" + ); }); } ); @@ -256,9 +324,9 @@ module( "Discourse Activity Pub | Component | activity-pub-actor-status with tag", function (hooks) { setupRenderingTest(hooks); - const template = hbs``; - test("with publishing disabled", async function (assert) { + const self = this; + setSite(this, { activity_pub_enabled: true, activity_pub_publishing_enabled: false, @@ -266,23 +334,32 @@ module( }); setTag(this); - await render(template); + await render( + + ); const status = query(".activity-pub-actor-status.publishing-disabled"); assert.ok(status, "has the right class"); - assert.strictEqual( - status.title, - i18n("discourse_activity_pub.status.title.publishing_disabled"), - "has the right title" - ); - assert.strictEqual( - status.innerText.trim(), - i18n("discourse_activity_pub.status.label.publishing_disabled"), - "has the right label" - ); + assert + .dom(status) + .hasAttribute( + "title", + i18n("discourse_activity_pub.status.title.publishing_disabled"), + "has the right title" + ); + assert + .dom(status) + .hasText( + i18n("discourse_activity_pub.status.label.publishing_disabled"), + "has the right label" + ); }); test("with plugin disabled", async function (assert) { + const self = this; + setSite(this, { activity_pub_enabled: false, activity_pub_publishing_enabled: true, @@ -290,23 +367,32 @@ module( }); setTag(this); - await render(template); + await render( + + ); const status = query(".activity-pub-actor-status.not-active"); assert.ok(status, "has the right class"); - assert.strictEqual( - status.title, - i18n("discourse_activity_pub.status.title.plugin_disabled"), - "has the right title" - ); - assert.strictEqual( - status.innerText.trim(), - i18n("discourse_activity_pub.status.label.not_active"), - "has the right label" - ); + assert + .dom(status) + .hasAttribute( + "title", + i18n("discourse_activity_pub.status.title.plugin_disabled"), + "has the right title" + ); + assert + .dom(status) + .hasText( + i18n("discourse_activity_pub.status.label.not_active"), + "has the right label" + ); }); test("with activity pub disabled on tag", async function (assert) { + const self = this; + const tagActors = cloneJSON(SiteActors.tag); setSite(this, { activity_pub_enabled: true, @@ -322,25 +408,32 @@ module( }); setTag(this); - await render(template); + await render( + + ); const status = query(".activity-pub-actor-status.not-active"); assert.ok(status, "has the right class"); - assert.strictEqual( - status.title, + assert.dom(status).hasAttribute( + "title", i18n("discourse_activity_pub.status.title.model_disabled", { model_type: "tag", }), "has the right title" ); - assert.strictEqual( - status.innerText.trim(), - i18n("discourse_activity_pub.status.label.not_active"), - "has the right label" - ); + assert + .dom(status) + .hasText( + i18n("discourse_activity_pub.status.label.not_active"), + "has the right label" + ); }); test("with activity pub not ready on tag", async function (assert) { + const self = this; + const tagActors = cloneJSON(SiteActors.tag); setSite(this, { activity_pub_enabled: true, @@ -357,25 +450,32 @@ module( }); setTag(this); - await render(template); + await render( + + ); const status = query(".activity-pub-actor-status.not-active"); assert.ok(status, "has the right class"); - assert.strictEqual( - status.title, + assert.dom(status).hasAttribute( + "title", i18n("discourse_activity_pub.status.title.model_not_ready", { model_type: "tag", }), "has the right title" ); - assert.strictEqual( - status.innerText.trim(), - i18n("discourse_activity_pub.status.label.not_active"), - "has the right label" - ); + assert + .dom(status) + .hasText( + i18n("discourse_activity_pub.status.label.not_active"), + "has the right label" + ); }); test("with active activity pub", async function (assert) { + const self = this; + setSite(this, { activity_pub_enabled: true, activity_pub_publishing_enabled: true, @@ -383,25 +483,32 @@ module( }); setTag(this); - await render(template); + await render( + + ); const status = query(".activity-pub-actor-status.active"); assert.ok(status, "has the right class"); - assert.strictEqual( - status.title, + assert.dom(status).hasAttribute( + "title", i18n("discourse_activity_pub.status.title.model_active.first_post", { delay_minutes: this.siteSettings.activity_pub_delivery_delay_minutes, }), "has the right title" ); - assert.strictEqual( - status.innerText.trim(), - i18n("discourse_activity_pub.status.label.active"), - "has the right label" - ); + assert + .dom(status) + .hasText( + i18n("discourse_activity_pub.status.label.active"), + "has the right label" + ); }); test("updates correctly after messageBus message", async function (assert) { + const self = this; + setSite(this, { activity_pub_enabled: true, activity_pub_publishing_enabled: true, @@ -409,7 +516,11 @@ module( }); setTag(this); - await render(template); + await render( + + ); await publishToMessageBus("/activity-pub", { model: { id: this.tag.id, @@ -421,22 +532,23 @@ module( const status = query(".activity-pub-actor-status.not-active"); assert.ok(status, "has the right class"); - assert.strictEqual( - status.title, + assert.dom(status).hasAttribute( + "title", i18n("discourse_activity_pub.status.title.model_not_ready", { model_type: "tag", }), "has the right title" ); - assert.strictEqual( - status.innerText.trim(), - i18n("discourse_activity_pub.status.label.not_active"), - "has the right label" - ); + assert + .dom(status) + .hasText( + i18n("discourse_activity_pub.status.label.not_active"), + "has the right label" + ); }); test("when in the composer", async function (assert) { - const composerTemplate = hbs``; + const self = this; setSite(this, { activity_pub_enabled: true, @@ -448,14 +560,21 @@ module( tags: [this.tag.name], }); - await render(composerTemplate); - - const label = query(".activity-pub-actor-status .label"); - assert.strictEqual( - label.innerText.trim(), - i18n("discourse_activity_pub.visibility.label.public"), - "has the right label text" + await render( + ); + + assert + .dom(".activity-pub-actor-status .label") + .hasText( + i18n("discourse_activity_pub.visibility.label.public"), + "has the right label text" + ); }); } );