diff --git a/app/assets/javascripts/discourse-ensure-deprecation-order/index.js b/app/assets/javascripts/discourse-ensure-deprecation-order/index.js deleted file mode 100644 index c5dd687c47c..00000000000 --- a/app/assets/javascripts/discourse-ensure-deprecation-order/index.js +++ /dev/null @@ -1,5 +0,0 @@ -"use strict"; - -module.exports = { - name: require("./package").name, -}; diff --git a/app/assets/javascripts/discourse-ensure-deprecation-order/package.json b/app/assets/javascripts/discourse-ensure-deprecation-order/package.json deleted file mode 100644 index 90326e832e8..00000000000 --- a/app/assets/javascripts/discourse-ensure-deprecation-order/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "discourse-ensure-deprecation-order", - "version": "1.0.0", - "description": "A dummy addon which ensures ember-cli-deprecation-workflow is loaded before @ember/jquery", - "author": "Discourse", - "license": "GPL-2.0-only", - "keywords": [ - "ember-addon" - ], - "ember-addon": { - "before": "@ember/jquery", - "after": "ember-cli-deprecation-workflow" - } -} diff --git a/app/assets/javascripts/discourse/app/lib/ember-events.js b/app/assets/javascripts/discourse/app/lib/ember-events.js index dbd6dce9766..de8b6a69e6b 100644 --- a/app/assets/javascripts/discourse/app/lib/ember-events.js +++ b/app/assets/javascripts/discourse/app/lib/ember-events.js @@ -2,6 +2,7 @@ import Component from "@ember/component"; import EmberObject from "@ember/object"; import { actionModifier } from "./ember-action-modifier"; +import Ember from "ember"; /** * Classic Ember components (i.e. "@ember/component") rely upon "event diff --git a/app/assets/javascripts/discourse/app/pre-initializers/deprecate-jquery-integration.js b/app/assets/javascripts/discourse/app/pre-initializers/deprecate-jquery-integration.js new file mode 100644 index 00000000000..4e04f43d984 --- /dev/null +++ b/app/assets/javascripts/discourse/app/pre-initializers/deprecate-jquery-integration.js @@ -0,0 +1,46 @@ +import { assert, deprecate } from "@ember/debug"; +import EmberObject from "@ember/object"; +import Component from "@ember/component"; +import jQuery from "jquery"; + +let done = false; + +// Adapted from https://github.com/emberjs/ember-jquery/blob/master/vendor/jquery/component.dollar.js +// but implemented in a module to avoid transpiled version triggering the Ember Global deprecation. +// To be dropped when we remove the jquery integration as part of the 4.x update. +export default { + name: "deprecate-jquery-integration", + + initialize() { + if (done) { + return; + } + + EmberObject.reopen.call(Component, { + $(sel) { + assert( + "You cannot access this.$() on a component with `tagName: ''` specified.", + this.tagName !== "" + ); + + deprecate( + "Using this.$() in a component has been deprecated, consider using this.element", + false, + { + id: "ember-views.curly-components.jquery-element", + since: "3.4.0", + until: "4.0.0", + url: "https://emberjs.com/deprecations/v3.x#toc_jquery-apis", + for: "ember-source", + } + ); + + if (this.element) { + return sel ? jQuery(sel, this.element) : jQuery(this.element); + } + }, + }); + + done = true; + }, +}; diff --git a/app/assets/javascripts/discourse/config/deprecation-workflow.js b/app/assets/javascripts/discourse/config/deprecation-workflow.js index 23e96363920..e4d622f1bb7 100644 --- a/app/assets/javascripts/discourse/config/deprecation-workflow.js +++ b/app/assets/javascripts/discourse/config/deprecation-workflow.js @@ -3,7 +3,6 @@ globalThis.deprecationWorkflow.config = { // We're using RAISE_ON_DEPRECATION in environment.js instead of // `throwOnUnhandled` here since it is easier to toggle. workflow: [ - { handler: "silence", matchId: "ember-global" }, { handler: "silence", matchId: "ember.built-in-components.reopen" }, { handler: "silence", matchId: "ember.built-in-components.import" }, { handler: "silence", matchId: "implicit-injections" }, diff --git a/app/assets/javascripts/discourse/ember-cli-build.js b/app/assets/javascripts/discourse/ember-cli-build.js index e273e21ccaa..c7723168e80 100644 --- a/app/assets/javascripts/discourse/ember-cli-build.js +++ b/app/assets/javascripts/discourse/ember-cli-build.js @@ -163,6 +163,16 @@ module.exports = function (defaults) { } }; + // @ember/jquery introduces a shim which triggers the ember-global deprecation. + // We remove that shim, and re-implement ourselves in the deprecate-jquery-integration pre-initializer + const vendorScripts = app._scriptOutputFiles["/assets/vendor.js"]; + const componentDollarShimIndex = vendorScripts.indexOf( + "vendor/jquery/component.dollar.js" + ); + if (componentDollarShimIndex) { + vendorScripts.splice(componentDollarShimIndex, 1); + } + // WARNING: We should only import scripts here if they are not in NPM. // For example: our very specific version of bootstrap-modal. app.import(vendorJs + "bootbox.js"); diff --git a/app/assets/javascripts/discourse/package.json b/app/assets/javascripts/discourse/package.json index d47ba3b5e39..88d9075eb03 100644 --- a/app/assets/javascripts/discourse/package.json +++ b/app/assets/javascripts/discourse/package.json @@ -46,7 +46,6 @@ "deepmerge": "^4.3.0", "dialog-holder": "1.0.0", "discourse-common": "1.0.0", - "discourse-ensure-deprecation-order": "1.0.0", "discourse-hbr": "1.0.0", "discourse-plugins": "1.0.0", "discourse-widget-hbs": "1.0.0", diff --git a/app/assets/javascripts/discourse/public/assets/scripts/discourse-boot.js b/app/assets/javascripts/discourse/public/assets/scripts/discourse-boot.js index 964fb0b5bf5..b1f30b2b1c2 100644 --- a/app/assets/javascripts/discourse/public/assets/scripts/discourse-boot.js +++ b/app/assets/javascripts/discourse/public/assets/scripts/discourse-boot.js @@ -3,6 +3,13 @@ throw "Unsupported browser detected"; } + // In Ember 3.28, the `ember` package is responsible for configuring `Helper.helper`, + // so we need to require('ember') before setting up any helpers. + // https://github.com/emberjs/ember.js/blob/744e536d37/packages/ember/index.js#L493-L493 + // In modern Ember, the Helper.helper definition has moved to the helper module itself + // https://github.com/emberjs/ember.js/blob/0c5518ea7b/packages/%40ember/-internals/glimmer/lib/helper.ts#L134-L138 + require("ember"); + window.__widget_helpers = require("discourse-widget-hbs/helpers").default; // TODO: Eliminate this global diff --git a/app/assets/javascripts/package.json b/app/assets/javascripts/package.json index e066ad97ad8..706adf6474c 100644 --- a/app/assets/javascripts/package.json +++ b/app/assets/javascripts/package.json @@ -6,7 +6,6 @@ "dialog-holder", "discourse", "discourse-common", - "discourse-ensure-deprecation-order", "discourse-hbr", "discourse-plugins", "discourse-widget-hbs",