diff --git a/.discourse-compatibility b/.discourse-compatibility index 80226093..e49c5796 100644 --- a/.discourse-compatibility +++ b/.discourse-compatibility @@ -1,3 +1,4 @@ +< 3.5.0.beta5-dev: 086ef9023b1d1ea19546a267d85514da7b3bdf0f < 3.5.0.beta1-dev: fd96988e07ef19017d29c739802e2e6aeacc05a1 <= 3.4.0.beta3: 6fc7971d3e0af57e1e9bf88de9c177de13e20e17 < 3.4.0.beta2-dev: e3f5c953d3bce66f875374728172712bdc66fe74 diff --git a/Gemfile.lock b/Gemfile.lock index 6cc132b9..c5be1a92 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) - base64 (0.2.0) - benchmark (0.4.0) - bigdecimal (3.1.9) + ast (2.4.3) + base64 (0.3.0) + benchmark (0.4.1) + bigdecimal (3.2.0) concurrent-ruby (1.3.5) - connection_pool (2.5.0) - drb (2.2.1) + connection_pool (2.5.3) + drb (2.2.3) i18n (1.14.7) concurrent-ruby (~> 1.0) - json (2.10.2) - language_server-protocol (3.17.0.4) + json (2.12.2) + 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.15) rainbow (3.1.1) regexp_parser (2.10.0) - rubocop (1.74.0) + rubocop (1.75.8) 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.32.0) activesupport (>= 4.2.0) lint_roller (~> 1.1) rack (>= 1.1) - rubocop (>= 1.72.1, < 2.0) - rubocop-ast (>= 1.38.0, < 2.0) - rubocop-rspec (3.5.0) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.44.0, < 2.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.9 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/connectors/composer-action-after/activity-pub-category-status.gjs b/assets/javascripts/discourse/connectors/composer-action-after/activity-pub-category-status.gjs new file mode 100644 index 00000000..7ff143c0 --- /dev/null +++ b/assets/javascripts/discourse/connectors/composer-action-after/activity-pub-category-status.gjs @@ -0,0 +1,42 @@ +import Component from "@ember/component"; +import { classNames, tagName } from "@ember-decorators/component"; +import ActivityPubActorStatus from "../../components/activity-pub-actor-status"; +import ActivityPubActor from "../../models/activity-pub-actor"; + +function showStatus(attrs, component) { + const actor = ActivityPubActor.findByModel( + attrs.model.get("category"), + "category" + ); + return ( + actor && + actor.ready && + attrs.model.get("action") === "createTopic" && + component.site.activity_pub_publishing_enabled + ); +} + +@tagName("") +@classNames("composer-action-after-outlet", "activity-pub-category-status") +export default class ActivityPubCategoryStatus extends Component { + static shouldRender(_, context) { + return context.site.activity_pub_enabled; + } + + init() { + super.init(...arguments); + this.set("showStatus", showStatus(this, this)); + this.model.addObserver("category", () => { + if (this._state === "destroying") { + return; + } + this.set("showStatus", showStatus(this, this)); + }); + } + + +} diff --git a/assets/javascripts/discourse/connectors/composer-action-after/activity-pub-category-status.hbs b/assets/javascripts/discourse/connectors/composer-action-after/activity-pub-category-status.hbs deleted file mode 100644 index 55a5c172..00000000 --- a/assets/javascripts/discourse/connectors/composer-action-after/activity-pub-category-status.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{{#if this.showStatus}} - -{{/if}} \ No newline at end of file diff --git a/assets/javascripts/discourse/connectors/composer-action-after/activity-pub-category-status.js b/assets/javascripts/discourse/connectors/composer-action-after/activity-pub-category-status.js deleted file mode 100644 index 8ae7da18..00000000 --- a/assets/javascripts/discourse/connectors/composer-action-after/activity-pub-category-status.js +++ /dev/null @@ -1,30 +0,0 @@ -import ActivityPubActor from "../../models/activity-pub-actor"; - -function showStatus(attrs, component) { - const actor = ActivityPubActor.findByModel( - attrs.model.get("category"), - "category" - ); - return ( - actor && - actor.ready && - attrs.model.get("action") === "createTopic" && - component.site.activity_pub_publishing_enabled - ); -} - -export default { - shouldRender(_, ctx) { - return ctx.site.activity_pub_enabled; - }, - - setupComponent(attrs, component) { - component.set("showStatus", showStatus(attrs, component)); - attrs.model.addObserver("category", () => { - if (this._state === "destroying") { - return; - } - component.set("showStatus", showStatus(attrs, component)); - }); - }, -}; diff --git a/assets/javascripts/discourse/connectors/extra-nav-item/activity-pub-navigation.gjs b/assets/javascripts/discourse/connectors/extra-nav-item/activity-pub-navigation.gjs new file mode 100644 index 00000000..e16d788d --- /dev/null +++ b/assets/javascripts/discourse/connectors/extra-nav-item/activity-pub-navigation.gjs @@ -0,0 +1,15 @@ +import Component from "@ember/component"; +import { classNames, tagName } from "@ember-decorators/component"; +import ActivityPubNavItem from "../../components/activity-pub-nav-item"; + +@tagName("span") +@classNames("extra-nav-item-outlet", "activity-pub-navigation") +export default class ActivityPubNavigation extends Component { + static shouldRender(attrs, context) { + return context.site.activity_pub_enabled; + } + + +} diff --git a/assets/javascripts/discourse/connectors/extra-nav-item/activity-pub-navigation.hbs b/assets/javascripts/discourse/connectors/extra-nav-item/activity-pub-navigation.hbs deleted file mode 100644 index e492f1c8..00000000 --- a/assets/javascripts/discourse/connectors/extra-nav-item/activity-pub-navigation.hbs +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/javascripts/discourse/connectors/extra-nav-item/activity-pub-navigation.js b/assets/javascripts/discourse/connectors/extra-nav-item/activity-pub-navigation.js deleted file mode 100644 index ad801d45..00000000 --- a/assets/javascripts/discourse/connectors/extra-nav-item/activity-pub-navigation.js +++ /dev/null @@ -1,5 +0,0 @@ -export default { - shouldRender(attrs, ctx) { - return ctx.site.activity_pub_enabled; - }, -}; diff --git a/assets/javascripts/discourse/connectors/user-preferences-nav/user-nav-preferences-activity-pub.gjs b/assets/javascripts/discourse/connectors/user-preferences-nav/user-nav-preferences-activity-pub.gjs new file mode 100644 index 00000000..0640fde8 --- /dev/null +++ b/assets/javascripts/discourse/connectors/user-preferences-nav/user-nav-preferences-activity-pub.gjs @@ -0,0 +1,18 @@ +import Component from "@ember/component"; +import { LinkTo } from "@ember/routing"; +import { classNames, tagName } from "@ember-decorators/component"; +import icon from "discourse/helpers/d-icon"; +import { i18n } from "discourse-i18n"; + +@tagName("li") +@classNames("user-preferences-nav-outlet", "user-nav-preferences-activity-pub") +export default class UserNavPreferencesActivityPub extends Component { + +} diff --git a/assets/javascripts/discourse/connectors/user-preferences-nav/user-nav-preferences-activity-pub.hbs b/assets/javascripts/discourse/connectors/user-preferences-nav/user-nav-preferences-activity-pub.hbs deleted file mode 100644 index cf1e72a9..00000000 --- a/assets/javascripts/discourse/connectors/user-preferences-nav/user-nav-preferences-activity-pub.hbs +++ /dev/null @@ -1,6 +0,0 @@ -{{#if this.site.activity_pub_enabled}} - - {{d-icon "discourse-activity-pub"}} - {{i18n "user.discourse_activity_pub.title"}} - -{{/if}} \ No newline at end of file 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..d2bf07e3 --- /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..d49f363a 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.23.0", + "ember-template-lint": "7.7.0", + "eslint": "9.28.0", "prettier": "3.5.3", - "stylelint": "16.16.0" + "stylelint": "16.20.0" }, "engines": { "node": ">= 22", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ae987b46..702c80a7 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.23.0 + version: 2.23.0(ember-template-lint@7.7.0(@babel/core@7.27.4))(eslint@9.28.0)(postcss@8.5.4)(prettier@3.5.3)(stylelint@16.20.0(typescript@5.8.3)) ember-template-lint: - specifier: 7.0.1 - version: 7.0.1(@babel/core@7.26.10) + specifier: 7.7.0 + version: 7.7.0(@babel/core@7.27.4) eslint: - specifier: 9.22.0 - version: 9.22.0 + specifier: 9.28.0 + version: 9.28.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.20.0 + version: 16.20.0(typescript@5.8.3) packages: @@ -30,148 +30,148 @@ 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.3': + resolution: {integrity: sha512-V42wFfx1ymFte+ecf6iXghnnP8kWTO+ZLXIyZq+1LAXHHvTZdVxicn4yiVYdYMGaCO3tmqub11AorKkv+iodqw==} engines: {node: '>=6.9.0'} - '@babel/core@7.26.10': - resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + '@babel/core@7.27.4': + resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} 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.3': + resolution: {integrity: sha512-xnlJYj5zepml8NXtjkG0WquFUv8RskFqyFcVgTBp5k+NaA/8uw/K+OSVf8AMGw5e9HKP2ETd5xpK5MLZQD6b4Q==} 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.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} 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.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} 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.4': + resolution: {integrity: sha512-Y+bO6U+I7ZKaM5G5rDUZiYfUvQPUibYmAFe7EnKdnKBbVXDZxvp+MWOH5gYciY0EPk4EScsuFMQBbEfpdRKSCQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.10': - resolution: {integrity: sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==} + '@babel/parser@7.27.4': + resolution: {integrity: sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==} 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.4': + resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.10': - resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} + '@babel/types@7.27.3': + resolution: {integrity: sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==} engines: {node: '>=6.9.0'} - '@csstools/css-parser-algorithms@3.0.4': - resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} engines: {node: '>=18'} peerDependencies: - '@csstools/css-tokenizer': ^3.0.3 + '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-tokenizer@3.0.3': - resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} - '@csstools/media-query-list-parser@4.0.2': - resolution: {integrity: sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==} + '@csstools/media-query-list-parser@4.0.3': + resolution: {integrity: sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==} engines: {node: '>=18'} peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.4 - '@csstools/css-tokenizer': ^3.0.3 + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 '@csstools/selector-specificity@5.0.0': resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} @@ -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.23.0': + resolution: {integrity: sha512-3V6imqOtbSM/Xa+gmpBReY1GurrrQFcLFxMHWitDVKwzjZ+zDUZx/RkRlG8ZquWZNqF58Wp/DQQNifo4LZkIJA==} peerDependencies: - ember-template-lint: 7.0.1 - eslint: 9.22.0 + ember-template-lint: 7.7.0 + eslint: 9.28.0 prettier: 3.5.3 - stylelint: 16.16.0 + stylelint: 16.20.0 '@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.14.0': + resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} 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.28.0': + resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==} 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.3.1': + resolution: {integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==} 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': @@ -340,8 +340,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==} @@ -392,8 +392,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: @@ -449,8 +449,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.25.0: + resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -460,8 +460,8 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - cacheable@1.8.9: - resolution: {integrity: sha512-FicwAUyWnrtnd4QqYAoRlNs44/a1jTL7XDKqm5gJ90wz1DQPlC7U2Rd1Tydpv+E7WAr4sQHuw8Q8M3nZMAyecQ==} + 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 +479,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.30001720: + resolution: {integrity: sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -538,8 +538,8 @@ 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==} convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -601,8 +601,8 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -639,8 +639,8 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - electron-to-chromium@1.5.118: - resolution: {integrity: sha512-yNDUus0iultYyVoEFLnQeei7LOQkL8wg8GQpkPCRrOlJXlcCwa6eGKZkxQ9ciHsqZyYbj8Jd94X1CTPzGm+uIA==} + electron-to-chromium@1.5.161: + resolution: {integrity: sha512-hwtetwfKNZo/UlwHIVBlKZVdy7o8bIZxxKs0Mv/ROPiQQQmDgdm5a+KvKtBsxM8ZjFzTaCeLoodZ8jiBE3o9rA==} ember-eslint-parser@0.5.9: resolution: {integrity: sha512-IW4/3cEiFp49M2LiKyzi7VcT1egogOe8UxQ9eUKTooenC7Q4qNhzTD6rOZ8j51m8iJC+8hCzjbNCa3K4CN0Hhg==} @@ -655,8 +655,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.7.0: + resolution: {integrity: sha512-KVQNeCdZHglpMm0YY4itu18xzw+IYeLLceWlL9tplCNcsQLSDYynyOvkzuQQH+y4JYN7aFnlxlxSGPyCOpBLZg==} engines: {node: ^18.18.0 || >= 20.9.0} hasBin: true @@ -675,8 +675,8 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.9: - resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -813,8 +813,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.28.0: + resolution: {integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -870,8 +870,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==} @@ -893,8 +893,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==} @@ -969,8 +969,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.2.0: + resolution: {integrity: sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==} engines: {node: '>=18'} globalthis@1.0.4: @@ -1022,8 +1022,8 @@ 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==} @@ -1036,8 +1036,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: @@ -1121,6 +1121,10 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -1221,15 +1225,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,8 +1292,8 @@ 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==} meow@13.2.0: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} @@ -1319,8 +1323,8 @@ 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 @@ -1460,16 +1464,16 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + postcss@8.5.4: + resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: 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' @@ -1625,6 +1629,10 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1656,58 +1664,46 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - stylelint-config-recommended-scss@14.1.0: - resolution: {integrity: sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg==} - engines: {node: '>=18.12.0'} + stylelint-config-recommended-scss@15.0.1: + resolution: {integrity: sha512-V24bxkNkFGggqPVJlP9iXaBabwSGEG7QTz+PyxrRtjPkcF+/NsWtB3tKYvFYEmczRkWiIEfuFMhGpJFj9Fxe6Q==} + engines: {node: '>=20'} peerDependencies: postcss: ^8.3.3 - stylelint: ^16.6.1 + stylelint: ^16.16.0 peerDependenciesMeta: postcss: optional: true - stylelint-config-recommended@14.0.1: - resolution: {integrity: sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==} - engines: {node: '>=18.12.0'} - 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==} - engines: {node: '>=18.12.0'} + stylelint-config-standard-scss@15.0.1: + resolution: {integrity: sha512-8pmmfutrMlPHukLp+Th9asmk21tBXMVGxskZCzkRVWt1d8Z0SrXjUUQ3vn9KcBj1bJRd5msk6yfEFM0UYHBRdg==} + engines: {node: '>=20'} peerDependencies: postcss: ^8.3.3 - stylelint: ^16.11.0 + stylelint: ^16.18.0 peerDependenciesMeta: postcss: optional: true - stylelint-config-standard@36.0.1: - resolution: {integrity: sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw==} - engines: {node: '>=18.12.0'} - 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.20.0: + resolution: {integrity: sha512-B5Myu9WRxrgKuLs3YyUXLP2H0mrbejwNxPmyADlACWwFsrL8Bmor/nTSh4OMae5sHjOz6gkSeccQH34gM4/nAw==} engines: {node: '>=18.12.0'} hasBin: true @@ -1764,8 +1760,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 @@ -1866,8 +1862,8 @@ 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'} snapshots: @@ -1877,223 +1873,224 @@ 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.3': {} - '@babel/core@7.26.10': + '@babel/core@7.27.4': 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.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helpers': 7.27.4 + '@babel/parser': 7.27.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.3 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 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.4)(eslint@9.28.0)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 9.22.0 + eslint: 9.28.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 - '@babel/generator@7.26.10': + '@babel/generator@7.27.3': dependencies: - '@babel/parser': 7.26.10 - '@babel/types': 7.26.10 + '@babel/parser': 7.27.4 + '@babel/types': 7.27.3 '@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.3': dependencies: - '@babel/types': 7.26.10 + '@babel/types': 7.27.3 - '@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.3 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.0 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.4)': 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.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@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.4) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.27.4 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.4 + '@babel/types': 7.27.3 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.4 + '@babel/types': 7.27.3 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': + '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': 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.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.4 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.3 - '@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.4)': 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.4 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.27.4 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.4 + '@babel/types': 7.27.3 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.4': dependencies: - '@babel/template': 7.26.9 - '@babel/types': 7.26.10 + '@babel/template': 7.27.2 + '@babel/types': 7.27.3 - '@babel/parser@7.26.10': + '@babel/parser@7.27.4': dependencies: - '@babel/types': 7.26.10 + '@babel/types': 7.27.3 - '@babel/plugin-proposal-decorators@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-proposal-decorators@7.27.1(@babel/core@7.27.4)': 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.4 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.27.4) 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.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@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.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 + '@babel/core': 7.27.4 + '@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.4)': 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.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) + '@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.4) 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.4 + '@babel/types': 7.27.3 - '@babel/traverse@7.26.10': + '@babel/traverse@7.27.4': 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 - debug: 4.4.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.3 + '@babel/parser': 7.27.4 + '@babel/template': 7.27.2 + '@babel/types': 7.27.3 + debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.26.10': + '@babel/types@7.27.3': 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)': + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': dependencies: - '@csstools/css-tokenizer': 3.0.3 + '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-tokenizer@3.0.3': {} + '@csstools/css-tokenizer@3.0.4': {} - '@csstools/media-query-list-parser@4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + '@csstools/media-query-list-parser@4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) - '@csstools/css-tokenizer': 3.0.3 + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0)': 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.23.0(ember-template-lint@7.7.0(@babel/core@7.27.4))(eslint@9.28.0)(postcss@8.5.4)(prettier@3.5.3)(stylelint@16.20.0(typescript@5.8.3))': + dependencies: + '@babel/core': 7.27.4 + '@babel/eslint-parser': 7.27.1(@babel/core@7.27.4)(eslint@9.28.0) + '@babel/plugin-proposal-decorators': 7.27.1(@babel/core@7.27.4) + ember-template-lint: 7.7.0(@babel/core@7.27.4) + eslint: 9.28.0 + eslint-plugin-decorator-position: 6.0.0(@babel/eslint-parser@7.27.1(@babel/core@7.27.4)(eslint@9.28.0))(eslint@9.28.0) + eslint-plugin-ember: 12.5.0(@babel/core@7.27.4)(eslint@9.28.0) + eslint-plugin-import: 2.31.0(eslint@9.28.0) + eslint-plugin-qunit: 8.1.2(eslint@9.28.0) + eslint-plugin-simple-import-sort: 12.1.1(eslint@9.28.0) + eslint-plugin-sort-class-members: 1.21.0(eslint@9.28.0) + globals: 16.2.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.20.0(typescript@5.8.3) + stylelint-config-standard: 38.0.0(stylelint@16.20.0(typescript@5.8.3)) + stylelint-config-standard-scss: 15.0.1(postcss@8.5.4)(stylelint@16.20.0(typescript@5.8.3)) + stylelint-scss: 6.12.0(stylelint@16.20.0(typescript@5.8.3)) + typescript: 5.8.3 transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-typescript @@ -2105,31 +2102,31 @@ 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.28.0)': dependencies: - eslint: 9.22.0 + eslint: 9.28.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 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.1.0': {} + '@eslint/config-helpers@0.2.2': {} - '@eslint/core@0.12.0': + '@eslint/core@0.14.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 + debug: 4.4.1 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -2140,13 +2137,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.22.0': {} + '@eslint/js@9.28.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.7': + '@eslint/plugin-kit@0.3.1': dependencies: - '@eslint/core': 0.12.0 + '@eslint/core': 0.14.0 levn: 0.4.1 '@glimmer/env@0.1.7': {} @@ -2220,7 +2217,7 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.2': {} + '@humanwhocodes/retry@0.4.3': {} '@jridgewell/gen-mapping@0.3.8': dependencies: @@ -2277,10 +2274,10 @@ 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': {} @@ -2325,18 +2322,19 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 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-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -2345,14 +2343,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.4: @@ -2360,7 +2358,7 @@ snapshots: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 @@ -2407,12 +2405,12 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.24.4: + browserslist@4.25.0: dependencies: - caniuse-lite: 1.0.30001704 - electron-to-chromium: 1.5.118 + caniuse-lite: 1.0.30001720 + electron-to-chromium: 1.5.161 node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.4) + update-browserslist-db: 1.1.3(browserslist@4.25.0) buffer@5.7.1: dependencies: @@ -2424,10 +2422,10 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - cacheable@1.8.9: + 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 +2446,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001704: {} + caniuse-lite@1.0.30001720: {} chalk@4.1.2: dependencies: @@ -2489,22 +2487,22 @@ snapshots: 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: {} convert-source-map@2.0.0: {} - cosmiconfig@9.0.0(typescript@5.8.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: @@ -2549,7 +2547,7 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0: + debug@4.4.1: dependencies: ms: 2.1.3 @@ -2590,12 +2588,12 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - electron-to-chromium@1.5.118: {} + electron-to-chromium@1.5.161: {} - 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.4)(eslint@9.28.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.4 + '@babel/eslint-parser': 7.27.1(@babel/core@7.27.4)(eslint@9.28.0) '@glimmer/syntax': 0.92.3 content-tag: 2.0.3 eslint-scope: 7.2.2 @@ -2607,18 +2605,18 @@ snapshots: ember-rfc176-data@0.3.18: {} - ember-template-lint@7.0.1(@babel/core@7.26.10): + ember-template-lint@7.7.0(@babel/core@7.27.4): 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.3 + '@babel/parser': 7.27.4 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/traverse': 7.27.4 '@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 @@ -2661,7 +2659,7 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.9: + es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 @@ -2690,7 +2688,9 @@ snapshots: is-array-buffer: 3.0.5 is-callable: 1.2.7 is-data-view: 1.0.2 + is-negative-zero: 2.0.3 is-regex: 1.2.1 + is-set: 2.0.3 is-shared-array-buffer: 1.0.4 is-string: 1.1.1 is-typed-array: 1.1.15 @@ -2705,6 +2705,7 @@ snapshots: safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 @@ -2754,36 +2755,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.28.0): dependencies: debug: 3.2.7 optionalDependencies: - eslint: 9.22.0 + eslint: 9.28.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.4)(eslint@9.28.0))(eslint@9.28.0): dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/plugin-proposal-decorators': 7.27.1(@babel/core@7.27.4) '@ember-data/rfc395-data': 0.0.4 ember-rfc176-data: 0.3.18 - eslint: 9.22.0 + eslint: 9.28.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.4)(eslint@9.28.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.4)(eslint@9.28.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.4)(eslint@9.28.0) ember-rfc176-data: 0.3.18 - eslint: 9.22.0 - eslint-utils: 3.0.0(eslint@9.22.0) + eslint: 9.28.0 + eslint-utils: 3.0.0(eslint@9.28.0) estraverse: 5.3.0 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 @@ -2792,18 +2793,18 @@ snapshots: transitivePeerDependencies: - '@babel/core' - eslint-plugin-import@2.31.0(eslint@9.22.0): + eslint-plugin-import@2.31.0(eslint@9.28.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.28.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.28.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -2819,20 +2820,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.28.0): dependencies: - eslint-utils: 3.0.0(eslint@9.22.0) + eslint-utils: 3.0.0(eslint@9.28.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.28.0): dependencies: - eslint: 9.22.0 + eslint: 9.28.0 - eslint-plugin-sort-class-members@1.21.0(eslint@9.22.0): + eslint-plugin-sort-class-members@1.21.0(eslint@9.28.0): dependencies: - eslint: 9.22.0 + eslint: 9.28.0 eslint-scope@5.1.1: dependencies: @@ -2849,9 +2850,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.28.0): dependencies: - eslint: 9.22.0 + eslint: 9.28.0 eslint-visitor-keys: 2.1.0 eslint-visitor-keys@2.1.0: {} @@ -2860,25 +2861,25 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.22.0: + eslint@9.28.0: dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.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.14.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.28.0 + '@eslint/plugin-kit': 0.3.1 '@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 + '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.1 escape-string-regexp: 4.0.0 eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 @@ -2942,9 +2943,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: @@ -2970,11 +2971,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: {} @@ -3056,7 +3057,7 @@ snapshots: globals@14.0.0: {} - globals@16.0.0: {} + globals@16.2.0: {} globalthis@1.0.4: dependencies: @@ -3076,7 +3077,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,7 +3110,7 @@ snapshots: dependencies: function-bind: 1.1.2 - hookified@1.8.1: {} + hookified@1.9.0: {} html-tags@3.3.1: {} @@ -3117,7 +3118,7 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.3: {} + ignore@7.0.4: {} import-fresh@3.3.1: dependencies: @@ -3201,6 +3202,8 @@ snapshots: is-map@2.0.3: {} + is-negative-zero@2.0.3: {} + is-number-object@1.1.1: dependencies: call-bound: 1.0.4 @@ -3289,13 +3292,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,7 +3350,7 @@ snapshots: mdn-data@2.12.2: {} - mdn-data@2.18.0: {} + mdn-data@2.21.0: {} meow@13.2.0: {} @@ -3370,7 +3373,7 @@ snapshots: ms@2.1.3: {} - nanoid@3.3.9: {} + nanoid@3.3.11: {} natural-compare@1.4.0: {} @@ -3400,14 +3403,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 object.values@1.2.1: dependencies: @@ -3453,7 +3456,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,7 +3472,7 @@ 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 @@ -3496,13 +3499,13 @@ snapshots: postcss-resolve-nested-selector@0.1.6: {} - postcss-safe-parser@7.0.1(postcss@8.5.3): + postcss-safe-parser@7.0.1(postcss@8.5.4): dependencies: - postcss: 8.5.3 + postcss: 8.5.4 - postcss-scss@4.0.9(postcss@8.5.3): + postcss-scss@4.0.9(postcss@8.5.4): dependencies: - postcss: 8.5.3 + postcss: 8.5.4 postcss-selector-parser@7.1.0: dependencies: @@ -3511,18 +3514,18 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.3: + postcss@8.5.4: 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.4 + content-tag: 3.1.3 prettier: 3.5.3 transitivePeerDependencies: - supports-color @@ -3549,7 +3552,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -3696,6 +3699,11 @@ snapshots: source-map-js@1.2.1: {} + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -3708,7 +3716,7 @@ snapshots: call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 @@ -3737,85 +3745,76 @@ 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@15.0.1(postcss@8.5.4)(stylelint@16.20.0(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)) + postcss-scss: 4.0.9(postcss@8.5.4) + stylelint: 16.20.0(typescript@5.8.3) + stylelint-config-recommended: 16.0.0(stylelint@16.20.0(typescript@5.8.3)) + stylelint-scss: 6.12.0(stylelint@16.20.0(typescript@5.8.3)) optionalDependencies: - postcss: 8.5.3 - - stylelint-config-recommended@14.0.1(stylelint@16.16.0(typescript@5.8.2)): - dependencies: - stylelint: 16.16.0(typescript@5.8.2) + postcss: 8.5.4 - stylelint-config-recommended@15.0.0(stylelint@16.16.0(typescript@5.8.2)): + stylelint-config-recommended@16.0.0(stylelint@16.20.0(typescript@5.8.3)): dependencies: - stylelint: 16.16.0(typescript@5.8.2) + stylelint: 16.20.0(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@15.0.1(postcss@8.5.4)(stylelint@16.20.0(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.20.0(typescript@5.8.3) + stylelint-config-recommended-scss: 15.0.1(postcss@8.5.4)(stylelint@16.20.0(typescript@5.8.3)) + stylelint-config-standard: 38.0.0(stylelint@16.20.0(typescript@5.8.3)) optionalDependencies: - postcss: 8.5.3 - - stylelint-config-standard@36.0.1(stylelint@16.16.0(typescript@5.8.2)): - dependencies: - stylelint: 16.16.0(typescript@5.8.2) - stylelint-config-recommended: 14.0.1(stylelint@16.16.0(typescript@5.8.2)) + postcss: 8.5.4 - stylelint-config-standard@37.0.0(stylelint@16.16.0(typescript@5.8.2)): + stylelint-config-standard@38.0.0(stylelint@16.20.0(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.20.0(typescript@5.8.3) + stylelint-config-recommended: 16.0.0(stylelint@16.20.0(typescript@5.8.3)) - stylelint-scss@6.11.1(stylelint@16.16.0(typescript@5.8.2)): + stylelint-scss@6.12.0(stylelint@16.20.0(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.20.0(typescript@5.8.3) - stylelint@16.16.0(typescript@5.8.2): + stylelint@16.20.0(typescript@5.8.3): dependencies: - '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) - '@csstools/css-tokenizer': 3.0.3 - '@csstools/media-query-list-parser': 4.0.2(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) '@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 + debug: 4.4.1 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 normalize-path: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.3 + postcss: 8.5.4 postcss-resolve-nested-selector: 0.1.6 - postcss-safe-parser: 7.0.1(postcss@8.5.3) + postcss-safe-parser: 7.0.1(postcss@8.5.4) postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 resolve-from: 5.0.0 @@ -3901,7 +3900,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: @@ -3918,9 +3917,9 @@ snapshots: upath@2.0.1: {} - update-browserslist-db@1.1.3(browserslist@4.24.4): + update-browserslist-db@1.1.3(browserslist@4.25.0): dependencies: - browserslist: 4.24.4 + browserslist: 4.25.0 escalade: 3.2.0 picocolors: 1.1.1 @@ -4018,4 +4017,4 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.2.0: {} + yocto-queue@1.2.1: {} 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" + ); }); } );