DEV: Overhaul typechecking configuration (#35794)

- Switches to typescript 'composite project' mode for improved
organization & performance
- Generates declarations from core modules, and outputs to a new
`@discourse/types` package
- Introduces tsconfigs for core plugins, which leans on that new
`@discourse/types` package
- In future, we plan to publish this discourse-types package for other
themes/plugins to use

The motivation at this stage is primarily to improve editor
autocompletion. We provide absolutely no guarantees about the accuracy
or stability of the generated types.

For now, some issues have been resolved by adding manual `@type`
declarations.

In particular, extensionless imports of `.gjs` files are broken when
running in composite-project mode, so in those cases we have to add
manual `@type {import("./the-file.gjs").default}` declarations.
Unfortunately this failure does not show up in IDEs. We hope to get this
resolved soon.

---------

Co-authored-by: David Taylor <david@taylorhq.com>
Co-authored-by: Chris Manson <chris@manson.ie>
This commit is contained in:
Jarek Radosz
2025-11-12 12:54:34 +00:00
committed by GitHub
co-authored by David Taylor Chris Manson
parent eb6df9785b
commit d10c1e57e8
127 changed files with 1664 additions and 684 deletions
+4
View File
@@ -121,6 +121,10 @@ openapi/*
# direnv.net
.direnv
# Types
frontend/discourse-types/declarations
*.tsbuildinfo
# discourse-ai evals
/plugins/discourse-ai/evals/cases
/plugins/discourse-ai/evals/log
+1 -1
View File
@@ -47,7 +47,7 @@ const pluginName =
if (
pluginName &&
fs.existsSync(`${discourseRoot}/plugins/${pluginName}/package.json`) &&
fs.existsSync(`${discourseRoot}/plugins/${pluginName}/pnpm-lock.yaml`) &&
!process.argv.includes("--ignore-workspace")
) {
console.log(
+21 -1
View File
@@ -2,6 +2,7 @@
# frozen_string_literal: true
require "pathname"
require "open3"
RAILS_ROOT = File.expand_path("../../", Pathname.new(__FILE__).realpath)
PORT = ENV["UNICORN_PORT"] ||= "3000"
@@ -94,9 +95,9 @@ if ARGV.include?("-u") || ARGV.include?("--unicorn")
unicorn_pid = spawn(unicorn_env, __dir__ + "/unicorn")
ember_cli_pid = nil
tsc_pid = nil
Thread.new do
require "open3"
Open3.popen2e(pnpm_env, "pnpm", *args.to_a.flatten) do |i, oe, t|
ember_cli_pid = t.pid
puts "Ember CLI running on PID: #{ember_cli_pid}"
@@ -115,6 +116,20 @@ if ARGV.include?("-u") || ARGV.include?("--unicorn")
end
end
Thread.new do
Open3.popen2e(pnpm_env, "pnpm", "ember-tsc", "-b", "--watch", "--preserveWatchOutput") do |i, oe, t|
tsc_pid = t.pid
puts "Ember TSC running on PID: #{tsc_pid}"
oe.each do |line|
puts "[ember-tsc] #{line}"
end
end
if process_running?(unicorn_pid)
puts "[bin/ember-cli] ember-tsc process stopped. Terminating unicorn."
Process.kill("TERM", unicorn_pid)
end
end
trap("SIGINT") do
# we got to swallow sigint to give time for
# children to handle it
@@ -126,6 +141,11 @@ if ARGV.include?("-u") || ARGV.include?("--unicorn")
puts "[bin/ember-cli] unicorn process stopped. Terminating ember-cli."
Process.kill("TERM", ember_cli_pid)
end
if tsc_pid && process_running?(tsc_pid)
puts "[bin/ember-cli] unicorn process stopped. Terminating ember-tsc."
Process.kill("TERM", tsc_pid)
end
else
exec(pnpm_env, "pnpm", *args.to_a.flatten)
end
+59
View File
@@ -0,0 +1,59 @@
/// <reference path="./node_modules/ember-source/types/stable/index.d.ts" />
declare module "@glimmer/component" {
export { default } from "@types/@glimmer__component";
}
declare module "@glint/template/-private/integration" {
export {
AnyFunction,
AnyContext,
AnyBlocks,
InvokeDirect,
DirectInvokable,
Invoke,
InvokableInstance,
Invokable,
Context,
HasContext,
ModifierReturn,
ComponentReturn,
TemplateContext,
FlattenBlockParams,
NamedArgs,
NamedArgsMarker,
NamedArgNames,
UnwrapNamedArgs,
} from "@types/@glint__template/-private/integration";
}
declare module "@glint/ember-tsc/-private/dsl" {
export {
resolve,
resolveOrReturn,
templateExpression,
Globals,
AnyFunction,
AnyContext,
AnyBlocks,
InvokeDirect,
DirectInvokable,
Invoke,
InvokableInstance,
Invokable,
Context,
HasContext,
ModifierReturn,
ComponentReturn,
TemplateContext,
FlattenBlockParams,
NamedArgs,
NamedArgsMarker,
NamedArgNames,
UnwrapNamedArgs,
} from "@types/@glint__ember-tsc/-private/dsl";
}
declare module "qunit" {
export { module, test } from "@types/qunit";
}
+34
View File
@@ -0,0 +1,34 @@
{
"name": "@discourse/types",
"version": "0.0.0",
"description": "Types only",
"license": "GPL-2.0-only",
"author": "Discourse",
"exports": {
"./tsconfig-plugin": "./tsconfig-plugin.json",
"./external-types": {
"types": "./external-types.d.ts"
},
"./tests/*": {
"types": "./declarations/tests/*.d.ts"
},
"./admin/*": {
"types": "./declarations/admin/*.d.ts"
},
"./*": {
"types": "./declarations/app/*.d.ts"
}
},
"dependencies": {
"ember-source": "~6.6.0",
"@types/@glimmer__component": "npm:@glimmer/component@^2.0.0",
"@types/@glint__ember-tsc": "npm:@glint/ember-tsc@^1.0.7",
"@types/@glint__template": "npm:@glint/template@^1.7.2"
},
"engines": {
"node": ">= 18",
"npm": "please-use-pnpm",
"yarn": "please-use-pnpm",
"pnpm": "^9"
}
}
@@ -0,0 +1,16 @@
{
"compilerOptions": {
"target": "es2021",
"module": "nodenext",
"moduleResolution": "nodenext",
"experimentalDecorators": true,
"allowJs": true,
"skipLibCheck": true,
"noEmit": true,
"noEmitOnError": false,
"declaration": true,
"outDir": "declarations",
"composite": true,
"types": ["discourse/external-types"],
}
}
@@ -1,5 +1,6 @@
import RestAdapter from "discourse/adapters/rest";
/** @returns {any} */
export default function buildPluginAdapter(pluginName) {
return class extends RestAdapter {
pathFor(store, type, findArgs) {
@@ -13,6 +13,7 @@ export default class AdminConfigAreasUserFieldsList extends Component {
@service toasts;
@service adminUserFields;
/** @type {any} */
fieldTypes = UserField.fieldTypes();
get fields() {
@@ -25,6 +25,7 @@ export default class AdminUserFieldsForm extends Component {
originalRequirement = this.args.userField.requirement;
userField;
/** @returns {any} */
get fieldTypes() {
return UserField.fieldTypes();
}
@@ -18,6 +18,7 @@ export default class EditCategoryPanel extends Component {
</template>
}
/** @returns { any } */
export function buildCategoryPanel(tab) {
@classNameBindings(
":edit-category-tab",
@@ -55,6 +55,7 @@ export default class ColorScheme extends EmberObject {
init() {
super.init(...arguments);
/** @type Array */
const colors = A(this.colors ?? []);
this.colors = colors.map((c) => {
return ColorSchemeColor.create(c);
@@ -103,6 +104,7 @@ export default class ColorScheme extends EmberObject {
const newScheme = ColorScheme.create({
name: this.name,
can_edit: true,
/** @type Array */
colors: A(),
});
this.colors.forEach((c) => {
@@ -206,6 +208,7 @@ export default class ColorScheme extends EmberObject {
});
}
/** @returns {any} */
destroy() {
if (this.id) {
return ajax(`/admin/color_schemes/${this.id}`, { type: "DELETE" });
@@ -11,6 +11,7 @@ export default class AdminWatchedWordsRoute extends DiscourseRoute {
return i18n("admin.config.watched_words.title");
}
/** @returns {any} */
model() {
return WatchedWord.findAll();
}
-4
View File
@@ -300,7 +300,3 @@ function printDebugInfo() {
}
export default Discourse;
/**
* @typedef {import('ember-source/types')} EmberTypes
*/
@@ -8,6 +8,7 @@ import { TrackedArray } from "@ember-compat/tracked-built-ins";
import autoFocus from "discourse/modifiers/auto-focus";
import preventScrollOnFocus from "discourse/modifiers/prevent-scroll-on-focus";
import { i18n } from "discourse-i18n";
/** @type {import("./slot.gjs").default} */
import Slot from "./slot";
const DEFAULT_SLOTS = 6;
@@ -39,6 +39,7 @@ export default class SignupPageController extends Controller {
accountChallenge = 0;
accountHoneypot = 0;
formSubmitted = false;
/** @type Array */
rejectedEmails = A();
prefilledUsername = null;
maskPassword = true;
+1 -1
View File
@@ -9,7 +9,7 @@ import { bind } from "discourse/lib/decorators";
* Whenever any autotracked state is changed, the cleanup function will be run, and your function
* will be re-evaluated.
*
* @param {(args: object, on: { cleanup: () => void } ) => any} fn - The helper function.
* @returns {typeof Helper} - A Helper subclass with cleanup logic.
*/
export default function helperFn(callback) {
return class extends Helper {
+14 -8
View File
@@ -23,11 +23,17 @@ class LazyHash {
// Like ember's builtin hash helper, but instead of returning a reified object
// every time its referenced, it returns a static proxy object with auto-trackable keys.
export default setInternalHelperManager(({ named: namedRefs }) => {
let instance;
return createComputeRef(
() => (instance ??= new LazyHash(namedRefs)),
null,
"lazy-hash"
);
}, {});
/**
* @type (opts: any) => any
*/
export default setInternalHelperManager(
({ named: namedRefs }) => {
let instance;
return createComputeRef(
() => (instance ??= new LazyHash(namedRefs)),
null,
"lazy-hash"
);
},
function lazyHash() {}
);
+1 -1
View File
@@ -6,7 +6,7 @@ let _apiInitializerId = 0;
/**
* Define an initializer which will execute a callback with a PluginApi object.
*
* @param {(api: import("discourse/lib/plugin-api").PluginApi, opts: object) => any} apiCodeCallback - The callback function to execute
* @param {(api: import("./plugin-api.gjs").PluginApi, opts: object) => any} apiCodeCallback - The callback function to execute
* @param {object} [opts] - Optional additional options to pass to the callback function.
*/
export function apiInitializer(apiCodeCallback, opts) {
@@ -6,10 +6,10 @@
* @property {number} topicId
* @property {number} categoryId
* @property {import("discourse/models/session").default} session
* @property {import("float-kit/services/menu").default} menu
* @property {import("discourse/float-kit/services/menu").default} menu
* @property {import("discourse/services/capabilities").default} capabilities
* @property {import("discourse/services/modal").default} modal
* @property {import("float-kit/services/toasts").default} toasts
* @property {import("discourse/float-kit/services/toasts").default} toasts
* @property {import("discourse/models/site").default} site
* @property {(toolbar: import("discourse/lib/composer/toolbar").ToolbarBase) => void} replaceToolbar
* @property {(nodeView: import("discourse/static/prosemirror/lib/glimmer-node-view").default) => void} addGlimmerNodeView
@@ -2,6 +2,9 @@
Plugins & themes are unable to async-import npm modules directly.
This wrapper provides them with a way to use morphlex, while keeping the `import()` in core's codebase.
*/
/**
* @returns {Promise<import("diff")>}
*/
export default async function loadJSDiff() {
return await import("diff");
}
+4 -4
View File
@@ -238,9 +238,9 @@ function wrapWithErrorHandler(func, messageKey) {
}
/**
* @typedef {PluginApi} PluginApi
* @typedef {_PluginApi} PluginApi
*/
class PluginApi {
class _PluginApi {
constructor(container) {
this.container = container;
this.h = h;
@@ -3460,7 +3460,7 @@ function getPluginApi() {
let pluginApi = owner.lookup("plugin-api:main");
if (!pluginApi) {
pluginApi = new PluginApi(owner);
pluginApi = new _PluginApi(owner);
owner.registry.register("plugin-api:main", pluginApi, {
instantiate: false,
});
@@ -3475,7 +3475,7 @@ function getPluginApi() {
/**
* Executes the provided callback function with the `PluginApi` object.
*
* @param {(api: PluginApi, opts: object) => any} apiCodeCallback - The callback function to execute
* @param {(api: _PluginApi, opts: object) => any} apiCodeCallback - The callback function to execute
* @param {object} [opts] - Optional additional options to pass to the callback function.
* @returns {any} The result of the `callback` function, if executed
*/
+1
View File
@@ -97,6 +97,7 @@ class RouteNode {
}
}
/** @returns {any} */
export function mapRoutes() {
const tree = new RouteNode("root");
const extras = [];
+6 -1
View File
@@ -578,7 +578,12 @@ export default class Category extends RestModel {
@discourseComputed("id")
searchContext(id) {
return { type: "category", id, category: this };
return {
type: "category",
id,
/** @type Category */
category: this,
};
}
@discourseComputed("parentCategory.ancestors")
+7 -1
View File
@@ -12,6 +12,12 @@ export default class Tag extends RestModel {
@discourseComputed("id")
searchContext(id) {
return { type: "tag", id, tag: this, name: id };
return {
type: "tag",
id,
/** @type Tag */
tag: this,
name: id,
};
}
}
+1
View File
@@ -314,6 +314,7 @@ export default class User extends RestModel.extend(Evented) {
return {
type: "user",
id: username,
/** @type User */
user: this,
};
}
@@ -170,6 +170,7 @@ class AbstractCategoryRoute extends DiscourseRoute {
}
// A helper function to create a category route with parameters
/** @returns {any} */
export default function buildCategoryRoute(routeConfig) {
return class extends AbstractCategoryRoute {
routeConfig = routeConfig;
@@ -1,6 +1,7 @@
import UserTopicListRoute from "discourse/routes/user-topic-list";
import { i18n } from "discourse-i18n";
/** @returns {any} */
export default (type) => {
return class BuildGroupMessagesRoute extends UserTopicListRoute {
titleToken() {
@@ -13,6 +13,7 @@ export const INBOX_FILTER = "inbox";
export const ARCHIVE_FILTER = "archive";
// A helper to build a user topic list route
/** @returns {any} */
export default (inboxType, path, filter) => {
return class BuildPrivateMessagesRoute extends UserTopicListRoute {
userActionType = UserAction.TYPES.messages_received;
@@ -148,6 +148,7 @@ class AbstractTopicRoute extends DiscourseRoute {
}
}
/** @returns {any} */
export default function buildTopicRoute(filter) {
return class extends AbstractTopicRoute {
routeConfig = { filter };
@@ -3,6 +3,7 @@ import { TrackedArray } from "@ember-compat/tracked-built-ins";
import DiscourseRoute from "discourse/routes/discourse";
import { i18n } from "discourse-i18n";
/** @returns {any} */
export function buildGroupPage(type) {
return class GroupActivityPosts extends DiscourseRoute {
type = type;
@@ -215,6 +215,7 @@ export default class TagShowRoute extends DiscourseRoute {
}
}
/** @returns {any} */
export function buildTagRoute(routeConfig = {}) {
return class extends TagShowRoute {
routeConfig = routeConfig;
@@ -147,6 +147,9 @@ export default class ComposerService extends Service {
this._showPreview = value;
}
/**
* @returns {import("discourse/controllers/topic").default};
*/
get topicController() {
return getOwner(this).lookup("controller:topic");
}
@@ -303,6 +303,7 @@ export default class PresenceService extends Service {
getChannel(channelName) {
return PresenceChannel.create({
name: channelName,
/** @type PresenceService */
presenceService: this,
});
}
+1
View File
@@ -275,6 +275,7 @@ export default class StoreService extends Service {
loadMoreUrl: pageTarget["load_more_" + typeName],
refreshUrl: pageTarget["refresh_" + typeName],
resultSetMeta: result.meta,
/** @type StoreService */
store: this,
__type: type,
};
+30
View File
@@ -0,0 +1,30 @@
{
"include": [
"./app/**/*",
"./tests/**/*",
"./admin/**/*",
"./select-kit/**/*",
"./float-kit/**/*",
"./truth-helpers/**/*",
"./dialog-holder/**/*",
"./config/environment.js"
],
"exclude": ["./tests/unit/utils/decorators-test.js"],
"extends": "../../tsconfig-base.json",
"compilerOptions": {
"composite": true,
"rootDir": "./",
"outDir": "../discourse-types/declarations",
"types": ["ember-source/types"],
"paths": {
"discourse/tests/*": ["./tests/*"],
"discourse/admin/*": ["./admin/*"],
"discourse/select-kit/*": ["./select-kit/*"],
"discourse/float-kit/*": ["./float-kit/*"],
"discourse/truth-helpers/*": ["./truth-helpers/*"],
"discourse/truth-helpers": ["./truth-helpers/index.js"],
"discourse/dialog-holder/*": ["./dialog-holder/*"],
"discourse/*": ["./app/*"],
}
}
}
-317
View File
@@ -1,317 +0,0 @@
// This file was generated by script/build_jsconfig.rb
{
"compilerOptions": {
"target": "es2021",
"module": "esnext",
"moduleResolution": "bundler",
"experimentalDecorators": true,
"allowJs": true,
"paths": {
"discourse/admin/*": [
"./frontend/discourse/admin/*"
],
"discourse/*": [
"./frontend/discourse/app/*"
],
"discourse/tests/*": [
"./frontend/discourse/tests/*"
],
"admin/*": [
"./frontend/discourse/admin/*"
],
"pretty-text/*": [
"./frontend/pretty-text/addon/*"
],
"select-kit/*": [
"./frontend/discourse/select-kit/*"
],
"float-kit/*": [
"./frontend/discourse/float-kit/*"
],
"truth-helpers/*": [
"./frontend/discourse/truth-helpers/*"
],
"dialog-holder/*": [
"./frontend/discourse/dialog-holder/*"
],
"discourse/plugins/automation/*": [
"./plugins/automation/assets/javascripts/*",
"./plugins/automation/test/javascripts/*"
],
"discourse/plugins/chat/*": [
"./plugins/chat/assets/javascripts/*",
"./plugins/chat/test/javascripts/*"
],
"discourse/plugins/checklist/*": [
"./plugins/checklist/assets/javascripts/*",
"./plugins/checklist/test/javascripts/*"
],
"discourse/plugins/discourse-adplugin/*": [
"./plugins/discourse-adplugin/assets/javascripts/*",
"./plugins/discourse-adplugin/test/javascripts/*"
],
"discourse/plugins/discourse-affiliate/*": [
"./plugins/discourse-affiliate/assets/javascripts/*",
"./plugins/discourse-affiliate/test/javascripts/*"
],
"discourse/plugins/discourse-ai/*": [
"./plugins/discourse-ai/assets/javascripts/*",
"./plugins/discourse-ai/test/javascripts/*"
],
"discourse/plugins/discourse-apple-auth/*": [
"./plugins/discourse-apple-auth/assets/javascripts/*",
"./plugins/discourse-apple-auth/test/javascripts/*"
],
"discourse/plugins/discourse-assign/*": [
"./plugins/discourse-assign/assets/javascripts/*",
"./plugins/discourse-assign/test/javascripts/*"
],
"discourse/plugins/discourse-cakeday/*": [
"./plugins/discourse-cakeday/assets/javascripts/*",
"./plugins/discourse-cakeday/test/javascripts/*"
],
"discourse/plugins/discourse-calendar/*": [
"./plugins/discourse-calendar/assets/javascripts/*",
"./plugins/discourse-calendar/test/javascripts/*"
],
"discourse/plugins/discourse-chat-integration/*": [
"./plugins/discourse-chat-integration/assets/javascripts/*",
"./plugins/discourse-chat-integration/test/javascripts/*"
],
"discourse/plugins/discourse-data-explorer/*": [
"./plugins/discourse-data-explorer/assets/javascripts/*",
"./plugins/discourse-data-explorer/test/javascripts/*"
],
"discourse/plugins/discourse-details/*": [
"./plugins/discourse-details/assets/javascripts/*",
"./plugins/discourse-details/test/javascripts/*"
],
"discourse/plugins/discourse-gamification/*": [
"./plugins/discourse-gamification/assets/javascripts/*",
"./plugins/discourse-gamification/test/javascripts/*"
],
"discourse/plugins/discourse-github/*": [
"./plugins/discourse-github/assets/javascripts/*",
"./plugins/discourse-github/test/javascripts/*"
],
"discourse/plugins/discourse-graphviz/*": [
"./plugins/discourse-graphviz/assets/javascripts/*",
"./plugins/discourse-graphviz/test/javascripts/*"
],
"discourse/plugins/discourse-hcaptcha/*": [
"./plugins/discourse-hcaptcha/assets/javascripts/*",
"./plugins/discourse-hcaptcha/test/javascripts/*"
],
"discourse/plugins/discourse-lazy-videos/*": [
"./plugins/discourse-lazy-videos/assets/javascripts/*",
"./plugins/discourse-lazy-videos/test/javascripts/*"
],
"discourse/plugins/discourse-local-dates/*": [
"./plugins/discourse-local-dates/assets/javascripts/*",
"./plugins/discourse-local-dates/test/javascripts/*"
],
"discourse/plugins/discourse-login-with-amazon/*": [
"./plugins/discourse-login-with-amazon/assets/javascripts/*",
"./plugins/discourse-login-with-amazon/test/javascripts/*"
],
"discourse/plugins/discourse-lti/*": [
"./plugins/discourse-lti/assets/javascripts/*",
"./plugins/discourse-lti/test/javascripts/*"
],
"discourse/plugins/discourse-math/*": [
"./plugins/discourse-math/assets/javascripts/*",
"./plugins/discourse-math/test/javascripts/*"
],
"discourse/plugins/discourse-microsoft-auth/*": [
"./plugins/discourse-microsoft-auth/assets/javascripts/*",
"./plugins/discourse-microsoft-auth/test/javascripts/*"
],
"discourse/plugins/discourse-narrative-bot/*": [
"./plugins/discourse-narrative-bot/assets/javascripts/*",
"./plugins/discourse-narrative-bot/test/javascripts/*"
],
"discourse/plugins/discourse-oauth2-basic/*": [
"./plugins/discourse-oauth2-basic/assets/javascripts/*",
"./plugins/discourse-oauth2-basic/test/javascripts/*"
],
"discourse/plugins/discourse-openid-connect/*": [
"./plugins/discourse-openid-connect/assets/javascripts/*",
"./plugins/discourse-openid-connect/test/javascripts/*"
],
"discourse/plugins/discourse-patreon/*": [
"./plugins/discourse-patreon/assets/javascripts/*",
"./plugins/discourse-patreon/test/javascripts/*"
],
"discourse/plugins/discourse-policy/*": [
"./plugins/discourse-policy/assets/javascripts/*",
"./plugins/discourse-policy/test/javascripts/*"
],
"discourse/plugins/discourse-post-voting/*": [
"./plugins/discourse-post-voting/assets/javascripts/*",
"./plugins/discourse-post-voting/test/javascripts/*"
],
"discourse/plugins/discourse-presence/*": [
"./plugins/discourse-presence/assets/javascripts/*",
"./plugins/discourse-presence/test/javascripts/*"
],
"discourse/plugins/discourse-reactions/*": [
"./plugins/discourse-reactions/assets/javascripts/*",
"./plugins/discourse-reactions/test/javascripts/*"
],
"discourse/plugins/discourse-rss-polling/*": [
"./plugins/discourse-rss-polling/assets/javascripts/*",
"./plugins/discourse-rss-polling/test/javascripts/*"
],
"discourse/plugins/discourse-solved/*": [
"./plugins/discourse-solved/assets/javascripts/*",
"./plugins/discourse-solved/test/javascripts/*"
],
"discourse/plugins/discourse-subscriptions/*": [
"./plugins/discourse-subscriptions/assets/javascripts/*",
"./plugins/discourse-subscriptions/test/javascripts/*"
],
"discourse/plugins/discourse-templates/*": [
"./plugins/discourse-templates/assets/javascripts/*",
"./plugins/discourse-templates/test/javascripts/*"
],
"discourse/plugins/discourse-topic-voting/*": [
"./plugins/discourse-topic-voting/assets/javascripts/*",
"./plugins/discourse-topic-voting/test/javascripts/*"
],
"discourse/plugins/discourse-user-notes/*": [
"./plugins/discourse-user-notes/assets/javascripts/*",
"./plugins/discourse-user-notes/test/javascripts/*"
],
"discourse/plugins/discourse-zendesk-plugin/*": [
"./plugins/discourse-zendesk-plugin/assets/javascripts/*",
"./plugins/discourse-zendesk-plugin/test/javascripts/*"
],
"discourse/plugins/footnote/*": [
"./plugins/footnote/assets/javascripts/*",
"./plugins/footnote/test/javascripts/*"
],
"discourse/plugins/poll/*": [
"./plugins/poll/assets/javascripts/*",
"./plugins/poll/test/javascripts/*"
],
"discourse/plugins/spoiler-alert/*": [
"./plugins/spoiler-alert/assets/javascripts/*",
"./plugins/spoiler-alert/test/javascripts/*"
],
"discourse/plugins/styleguide/*": [
"./plugins/styleguide/assets/javascripts/*",
"./plugins/styleguide/test/javascripts/*"
],
"discourse/themes/foundation/*": [
"./themes/foundation/javascripts/*",
"./themes/foundation/test/*"
],
"discourse/themes/horizon/*": [
"./themes/horizon/javascripts/*",
"./themes/horizon/test/*"
]
}
},
"include": [
"./frontend/discourse/admin",
"./frontend/discourse/app",
"./frontend/discourse/tests",
"./frontend/discourse/admin",
"./frontend/pretty-text/addon",
"./frontend/discourse/select-kit",
"./frontend/discourse/float-kit",
"./frontend/discourse/truth-helpers",
"./frontend/discourse/dialog-holder",
"./plugins/automation/assets/javascripts",
"./plugins/automation/test/javascripts",
"./plugins/chat/assets/javascripts",
"./plugins/chat/test/javascripts",
"./plugins/checklist/assets/javascripts",
"./plugins/checklist/test/javascripts",
"./plugins/discourse-adplugin/assets/javascripts",
"./plugins/discourse-adplugin/test/javascripts",
"./plugins/discourse-affiliate/assets/javascripts",
"./plugins/discourse-affiliate/test/javascripts",
"./plugins/discourse-ai/assets/javascripts",
"./plugins/discourse-ai/test/javascripts",
"./plugins/discourse-apple-auth/assets/javascripts",
"./plugins/discourse-apple-auth/test/javascripts",
"./plugins/discourse-assign/assets/javascripts",
"./plugins/discourse-assign/test/javascripts",
"./plugins/discourse-cakeday/assets/javascripts",
"./plugins/discourse-cakeday/test/javascripts",
"./plugins/discourse-calendar/assets/javascripts",
"./plugins/discourse-calendar/test/javascripts",
"./plugins/discourse-chat-integration/assets/javascripts",
"./plugins/discourse-chat-integration/test/javascripts",
"./plugins/discourse-data-explorer/assets/javascripts",
"./plugins/discourse-data-explorer/test/javascripts",
"./plugins/discourse-details/assets/javascripts",
"./plugins/discourse-details/test/javascripts",
"./plugins/discourse-gamification/assets/javascripts",
"./plugins/discourse-gamification/test/javascripts",
"./plugins/discourse-github/assets/javascripts",
"./plugins/discourse-github/test/javascripts",
"./plugins/discourse-graphviz/assets/javascripts",
"./plugins/discourse-graphviz/test/javascripts",
"./plugins/discourse-hcaptcha/assets/javascripts",
"./plugins/discourse-hcaptcha/test/javascripts",
"./plugins/discourse-lazy-videos/assets/javascripts",
"./plugins/discourse-lazy-videos/test/javascripts",
"./plugins/discourse-local-dates/assets/javascripts",
"./plugins/discourse-local-dates/test/javascripts",
"./plugins/discourse-login-with-amazon/assets/javascripts",
"./plugins/discourse-login-with-amazon/test/javascripts",
"./plugins/discourse-lti/assets/javascripts",
"./plugins/discourse-lti/test/javascripts",
"./plugins/discourse-math/assets/javascripts",
"./plugins/discourse-math/test/javascripts",
"./plugins/discourse-microsoft-auth/assets/javascripts",
"./plugins/discourse-microsoft-auth/test/javascripts",
"./plugins/discourse-narrative-bot/assets/javascripts",
"./plugins/discourse-narrative-bot/test/javascripts",
"./plugins/discourse-oauth2-basic/assets/javascripts",
"./plugins/discourse-oauth2-basic/test/javascripts",
"./plugins/discourse-openid-connect/assets/javascripts",
"./plugins/discourse-openid-connect/test/javascripts",
"./plugins/discourse-patreon/assets/javascripts",
"./plugins/discourse-patreon/test/javascripts",
"./plugins/discourse-policy/assets/javascripts",
"./plugins/discourse-policy/test/javascripts",
"./plugins/discourse-post-voting/assets/javascripts",
"./plugins/discourse-post-voting/test/javascripts",
"./plugins/discourse-presence/assets/javascripts",
"./plugins/discourse-presence/test/javascripts",
"./plugins/discourse-reactions/assets/javascripts",
"./plugins/discourse-reactions/test/javascripts",
"./plugins/discourse-rss-polling/assets/javascripts",
"./plugins/discourse-rss-polling/test/javascripts",
"./plugins/discourse-solved/assets/javascripts",
"./plugins/discourse-solved/test/javascripts",
"./plugins/discourse-subscriptions/assets/javascripts",
"./plugins/discourse-subscriptions/test/javascripts",
"./plugins/discourse-templates/assets/javascripts",
"./plugins/discourse-templates/test/javascripts",
"./plugins/discourse-topic-voting/assets/javascripts",
"./plugins/discourse-topic-voting/test/javascripts",
"./plugins/discourse-user-notes/assets/javascripts",
"./plugins/discourse-user-notes/test/javascripts",
"./plugins/discourse-zendesk-plugin/assets/javascripts",
"./plugins/discourse-zendesk-plugin/test/javascripts",
"./plugins/footnote/assets/javascripts",
"./plugins/footnote/test/javascripts",
"./plugins/poll/assets/javascripts",
"./plugins/poll/test/javascripts",
"./plugins/spoiler-alert/assets/javascripts",
"./plugins/spoiler-alert/test/javascripts",
"./plugins/styleguide/assets/javascripts",
"./plugins/styleguide/test/javascripts",
"./themes/foundation/javascripts",
"./themes/foundation/test",
"./themes/horizon/javascripts",
"./themes/horizon/test"
],
"exclude": [
"frontend/discourse/tests/unit/utils/decorators-test.js"
]
}
+2 -2
View File
@@ -1,5 +1,4 @@
{
"name": "discourse",
"private": true,
"repository": "https://github.com/discourse/discourse",
"author": "Discourse",
@@ -10,6 +9,7 @@
"@discourse/moment-timezone-names-translations": "^1.0.0",
"@fortawesome/fontawesome-free": "6.7.2",
"@glint/ember-tsc": "^1.0.7",
"@glint/tsserver-plugin": "^2.0.7",
"@rdil/parallel-prettier": "^3.0.0",
"@swc/core": "^1.15.0",
"chrome-launcher": "^1.2.1",
@@ -43,7 +43,7 @@
"lint:hbs:fix": "ember-template-lint 'frontend/**/*.{gjs,hbs}' 'plugins/*/assets/javascripts/**/*.{gjs,hbs}' 'plugins/*/admin/assets/javascripts/**/*.{gjs,hbs}' 'themes/**/*.{gjs,hbs}' --fix",
"lint:prettier": "pnpm pprettier --list-different 'app/assets/stylesheets/**/*.scss' 'frontend/**/*.{js,gjs,hbs,css}' $(script/list_bundled_plugins '/assets/stylesheets/**/*.scss') $(script/list_bundled_plugins '/{assets,admin/assets,test}/javascripts/**/*.{js,gjs,hbs}') 'themes/**/*.{js,gjs,hbs,scss}'",
"lint:prettier:fix": "pnpm prettier -w --no-error-on-unmatched-pattern 'app/assets/stylesheets/**/*.scss' 'frontend/**/*.{js,gjs,hbs,css}' $(script/list_bundled_plugins '/assets/stylesheets/**/*.scss') $(script/list_bundled_plugins '/{assets,admin/assets,test}/javascripts/**/*.{js,gjs,hbs}') 'themes/**/*.{js,gjs,hbs,scss}'",
"lint:glint": "ember-tsc -p jsconfig.json --noEmit",
"lint:glint": "ember-tsc -b",
"lttf:ignore": "lint-to-the-future ignore",
"lttf:output": "lint-to-the-future output -o ./lint-progress/",
"lint-progress": "pnpm lttf:output && npx html-pages ./lint-progress --no-cache",
+6
View File
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/automation/*": ["./assets/javascripts/*"]
}
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/chat/*": ["./assets/javascripts/*"]
}
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/checklist/*": ["./assets/javascripts/*"]
}
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-adplugin/*": ["./assets/javascripts/*"]
}
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
+13
View File
@@ -0,0 +1,13 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./package.json",
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-affiliate/*": ["./assets/javascripts/*"]
}
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-ai/*": ["./assets/javascripts/*"]
}
}
}
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
@@ -0,0 +1,13 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./package.json",
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-apple-auth/*": ["./assets/javascripts/*"]
}
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-assign/*": ["./assets/javascripts/*"]
}
}
}
@@ -1,5 +1,6 @@
import DiscourseRoute from "discourse/routes/discourse";
/** @returns {any} */
export default (storeName, filter) => {
return class BuildCakedayRoute extends DiscourseRoute {
model(params) {
+6
View File
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-cakeday/*": ["./assets/javascripts/*"]
}
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-calendar/*": ["./assets/javascripts/*"]
}
}
}
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-chat-integration/*": ["./assets/javascripts/*"]
}
}
}
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-data-explorer/*": ["./assets/javascripts/*"]
}
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-details/*": ["./assets/javascripts/*"]
}
}
}
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-gamification/*": ["./assets/javascripts/*"]
}
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
+13
View File
@@ -0,0 +1,13 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./package.json",
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-github/*": ["./assets/javascripts/*"]
}
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-graphviz/*": ["./assets/javascripts/*"]
}
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-hcaptcha/*": ["./assets/javascripts/*"]
}
}
}
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-lazy-videos/*": ["./assets/javascripts/*"]
}
}
}
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-local-dates/*": ["./assets/javascripts/*"]
}
}
}
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
@@ -0,0 +1,13 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./package.json",
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-login-with-amazon/*": ["./assets/javascripts/*"]
}
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-lti/*": ["./assets/javascripts/*"]
}
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-math/*": ["./assets/javascripts/*"]
}
}
}
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
@@ -0,0 +1,13 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./package.json",
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-microsoft-auth/*": ["./assets/javascripts/*"]
}
}
}
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
@@ -0,0 +1,13 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./package.json",
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-narrative-bot/*": ["./assets/javascripts/*"]
}
}
}
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
@@ -0,0 +1,13 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./package.json",
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-oauth2-basic/*": ["./assets/javascripts/*"]
}
}
}
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
@@ -0,0 +1,13 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./package.json",
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-openid-connect/*": ["./assets/javascripts/*"]
}
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-patreon/*": ["./assets/javascripts/*"]
}
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-policy/*": ["./assets/javascripts/*"]
}
}
}
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-post-voting/*": ["./assets/javascripts/*"]
}
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-presence/*": ["./assets/javascripts/*"]
}
}
}
+6
View File
@@ -0,0 +1,6 @@
{
"private": true,
"dependencies": {
"discourse": "workspace:@discourse/types@0.0.0"
}
}
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "discourse/tsconfig-plugin",
"include": [
"./assets/javascripts/**/*",
"./test/javascripts/**/*"
],
"compilerOptions": {
"paths": {
"discourse/plugins/discourse-reactions/*": ["./assets/javascripts/*"]
}
}
}

Some files were not shown because too many files have changed in this diff Show More