diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.js index 86236ebba..07df8ef80 100644 --- a/frontend/.eslintrc.js +++ b/frontend/.eslintrc.js @@ -1,17 +1,107 @@ "use-strict"; module.exports = { - extends: ["@adfinis/eslint-config/ember-app"], + root: true, + parser: "@typescript-eslint/parser", + parserOptions: { + ecmaVersion: "latest", + }, + plugins: ["ember", "@typescript-eslint", "import"], + extends: [ + "eslint:recommended", + "plugin:ember/recommended", + "plugin:prettier/recommended", + ], + env: { + browser: true, + }, rules: { - "ember/no-actions-hash": "warn", - "ember/no-component-lifecycle-hooks": "warn", - "ember/no-mixins": "warn", - "ember/no-new-mixins": "warn", - "ember/no-classic-classes": "warn", - "ember/no-classic-components": "warn", - "ember/no-get": "warn", - "ember/no-observers": "warn", - "qunit/no-assert-equal": "warn", - "ember/require-tagless-components": "warn", + // possible errors + "no-await-in-loop": "error", + + // best practices + "array-callback-return": "error", + "dot-notation": "error", + eqeqeq: "error", + "no-alert": "error", + "no-else-return": "error", + "no-eval": "error", + "no-extend-native": "error", + "no-extra-bind": "error", + "no-floating-decimal": "error", + "one-var": ["error", "never"], + curly: ["error", "multi-line"], + + // ES6 + "no-var": "error", + "object-shorthand": "error", + "prefer-const": "error", + "prefer-destructuring": [ + "error", + { AssignmentExpression: { array: false, object: false } }, + ], + "prefer-rest-params": "error", + "prefer-spread": "error", + "prefer-template": "error", + + // import + "import/no-duplicates": "error", + "import/no-unresolved": "off", + "import/order": [ + "error", + { + "newlines-between": "always", + alphabetize: { order: "asc", caseInsensitive: true }, + }, + ], + + // tooling + "no-console": ["error", { allow: ["warn", "error"] }], + "no-debugger": "error", }, + overrides: [ + // js files + { + files: ["**/*.js"], + extends: [ + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + ], + rules: {}, + }, + // ts files + { + files: ["**/*.ts"], + extends: [ + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + ], + rules: {}, + }, + // node files + { + files: [ + "./.eslintrc.js", + "./.prettierrc.js", + "./.stylelintrc.js", + "./.template-lintrc.js", + "./ember-cli-build.js", + "./testem.js", + "./blueprints/*/index.js", + "./config/**/*.js", + "./lib/*/index.js", + "./server/**/*.js", + ], + env: { + browser: false, + node: true, + }, + extends: ["plugin:n/recommended"], + }, + { + // test files + files: ["tests/**/*-test.{js,ts}"], + extends: ["plugin:qunit/recommended"], + }, + ], }; diff --git a/frontend/app/adapters/activity-block.js b/frontend/app/adapters/activity-block.ts similarity index 67% rename from frontend/app/adapters/activity-block.js rename to frontend/app/adapters/activity-block.ts index ae5488ce2..8ae348561 100644 --- a/frontend/app/adapters/activity-block.js +++ b/frontend/app/adapters/activity-block.ts @@ -12,7 +12,7 @@ import ApplicationAdapter from "timed/adapters/application"; * @extends ApplicationAdapter * @public */ -export default ApplicationAdapter.extend({ +export default class ActivityBlockAdapter extends ApplicationAdapter { /** * Custom url for updating records * @@ -24,8 +24,8 @@ export default ApplicationAdapter.extend({ * @public */ urlForUpdateRecord(...args) { - return `${this._super(...args)}?include=activity`; - }, + return `${super.urlForUpdateRecord(...args)}?include=activity`; + } /** * Custom url for creating records @@ -38,6 +38,12 @@ export default ApplicationAdapter.extend({ * @public */ urlForCreateRecord(...args) { - return `${this._super(...args)}?include=activity`; - }, -}); + return `${super.urlForCreateRecord(...args)}?include=activity`; + } +} + +declare module "ember-data/types/registries/adapter" { + export default interface AdapterRegistry { + "activity-block": ActivityBlockAdapter; + } +} diff --git a/frontend/app/adapters/application.js b/frontend/app/adapters/application.ts similarity index 100% rename from frontend/app/adapters/application.js rename to frontend/app/adapters/application.ts diff --git a/frontend/app/config/environment.d.ts b/frontend/app/config/environment.d.ts new file mode 100644 index 000000000..be4017478 --- /dev/null +++ b/frontend/app/config/environment.d.ts @@ -0,0 +1,14 @@ +/** + * Type declarations for + * import config from 'timed/config/environment' + */ +declare const config: { + environment: string; + modulePrefix: string; + podModulePrefix: string; + locationType: "history" | "hash" | "none"; + rootURL: string; + APP: Record; +}; + +export default config; diff --git a/frontend/app/models/absence-balance.js b/frontend/app/models/absence-balance.js deleted file mode 100644 index ad425b658..000000000 --- a/frontend/app/models/absence-balance.js +++ /dev/null @@ -1,12 +0,0 @@ -import Model, { attr, belongsTo, hasMany } from "@ember-data/model"; - -export default class AbsenceBalance extends Model { - @attr("number") credit; - @attr("number") usedDays; - @attr("django-duration") usedDuration; - @attr("number") balance; - @belongsTo("user", { async: false, inverse: "absenceBalances" }) user; - @belongsTo("absence-type", { async: false, inverse: "absenceBalances" }) - absenceType; - @hasMany("absence-credit", { async: true, inverse: null }) absenceCredits; -} diff --git a/frontend/app/models/absence-balance.ts b/frontend/app/models/absence-balance.ts new file mode 100644 index 000000000..6528f3d26 --- /dev/null +++ b/frontend/app/models/absence-balance.ts @@ -0,0 +1,29 @@ +import type { AsyncHasMany } from "@ember-data/model"; +import Model, { attr, belongsTo, hasMany } from "@ember-data/model"; +import type { Duration } from "moment"; +import type AbsenceCredit from "timed/models/absence-credit"; +import type AbsenceType from "timed/models/absence-type"; +import type User from "timed/models/user"; + +export default class AbsenceBalance extends Model { + @attr("number") + declare credit?: number; + @attr("number") + declare usedDays?: number; + @attr("django-duration") + declare usedDuration?: Duration; + @attr("number") + declare balance?: number; + @belongsTo("user", { async: false, inverse: "absenceBalances" }) + declare user: User; + @belongsTo("absence-type", { async: false, inverse: "absenceBalances" }) + declare absenceType: AbsenceType; + @hasMany("absence-credit", { async: true, inverse: null }) + declare absenceCredits: AsyncHasMany; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + "absence-balance": AbsenceBalance; + } +} diff --git a/frontend/app/models/absence-credit.js b/frontend/app/models/absence-credit.ts similarity index 54% rename from frontend/app/models/absence-credit.js rename to frontend/app/models/absence-credit.ts index 417c3960c..2dc9969d1 100644 --- a/frontend/app/models/absence-credit.js +++ b/frontend/app/models/absence-credit.ts @@ -1,9 +1,12 @@ +import Model, { attr, belongsTo } from "@ember-data/model"; +import type { Moment } from "moment"; +import type AbsenceType from "timed/models/absence-type"; +import type User from "timed/models/user"; /** * @module timed * @submodule timed-models * @public */ -import Model, { attr, belongsTo } from "@ember-data/model"; /** * The absence credit model @@ -19,7 +22,8 @@ export default class AbsenceCredit extends Model { * @property {Number} days * @public */ - @attr("number") days; + @attr("number") + declare days?: number; /** * The date @@ -27,7 +31,8 @@ export default class AbsenceCredit extends Model { * @property {moment} date * @public */ - @attr("django-date") date; + @attr("django-date") + declare date?: Moment; /** * The comment @@ -35,7 +40,8 @@ export default class AbsenceCredit extends Model { * @property {String} comment * @public */ - @attr("string", { defaultValue: "" }) comment; + @attr("string", { defaultValue: "" }) + declare comment: string; /** * The absence type for which this credit counts @@ -43,7 +49,8 @@ export default class AbsenceCredit extends Model { * @property {AbsenceType} absenceType * @public */ - @belongsTo("absence-type", { async: false, inverse: null }) absenceType; + @belongsTo("absence-type", { async: false, inverse: null }) + declare absenceType: AbsenceType; /** * The user to which this credit belongs to @@ -51,5 +58,12 @@ export default class AbsenceCredit extends Model { * @property {User} user * @public */ - @belongsTo("user", { async: false, inverse: null }) user; + @belongsTo("user", { async: false, inverse: null }) + declare user: User; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + "absence-credit": AbsenceCredit; + } } diff --git a/frontend/app/models/absence-type.js b/frontend/app/models/absence-type.ts similarity index 63% rename from frontend/app/models/absence-type.js rename to frontend/app/models/absence-type.ts index 21b97249e..313aa9c63 100644 --- a/frontend/app/models/absence-type.js +++ b/frontend/app/models/absence-type.ts @@ -1,9 +1,11 @@ +import type { AsyncHasMany } from "@ember-data/model"; /** * @module timed * @submodule timed-models * @public */ import Model, { attr, hasMany } from "@ember-data/model"; +import type AbsenceBalance from "timed/models/absence-balance"; /** * The absence type model @@ -21,7 +23,8 @@ export default class AbsenceType extends Model { * @property {String} name * @public */ - @attr("string") name; + @attr("string") + declare name?: string; /** * Whether the absence type only fills the worktime @@ -29,7 +32,8 @@ export default class AbsenceType extends Model { * @property {Boolean} fillWorktime * @public */ - @attr("boolean") fillWorktime; + @attr("boolean") + declare fillWorktime?: boolean; /** * The balances for this type @@ -38,5 +42,11 @@ export default class AbsenceType extends Model { * @public */ @hasMany("absence-balance", { async: true, inverse: "absenceType" }) - absenceBalances; + declare absenceBalances: AsyncHasMany; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + "absence-type": AbsenceType; + } } diff --git a/frontend/app/models/absence.js b/frontend/app/models/absence.ts similarity index 53% rename from frontend/app/models/absence.js rename to frontend/app/models/absence.ts index 630f1b91c..e315788d7 100644 --- a/frontend/app/models/absence.js +++ b/frontend/app/models/absence.ts @@ -1,10 +1,14 @@ +import type { AsyncBelongsTo } from "@ember-data/model"; +import Model, { attr, belongsTo } from "@ember-data/model"; +import type { Moment, Duration } from "moment"; /** * @module timed * @submodule timed-models * @public */ -import Model, { attr, belongsTo } from "@ember-data/model"; import moment from "moment"; +import type AbsenceType from "timed/models/absence-type"; +import type User from "timed/models/user"; /** * The report model @@ -20,7 +24,8 @@ export default class Absence extends Model { * @property {String} comment * @public */ - @attr("string", { defaultValue: "" }) comment; + @attr("string", { defaultValue: "" }) + declare comment: string; /** * The duration @@ -28,7 +33,8 @@ export default class Absence extends Model { * @property {moment.duration} duration * @public */ - @attr("django-duration", { defaultValue: () => moment.duration() }) duration; + @attr("django-duration", { defaultValue: () => moment.duration() }) + declare duration: Duration; /** * The date @@ -36,7 +42,8 @@ export default class Absence extends Model { * @property {moment} date * @public */ - @attr("django-date") date; + @attr("django-date") + declare date?: Moment; /** * The type of the absence @@ -44,7 +51,8 @@ export default class Absence extends Model { * @property {AbsenceType} absenceType * @public */ - @belongsTo("absence-type", { async: false, inverse: null }) absenceType; + @belongsTo("absence-type", { async: false, inverse: null }) + declare absenceType: AbsenceType; /** * The user @@ -52,5 +60,12 @@ export default class Absence extends Model { * @property {User} user * @public */ - @belongsTo("user", { async: true, inverse: null }) user; + @belongsTo("user", { async: true, inverse: null }) + declare user: AsyncBelongsTo; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + absence: Absence; + } } diff --git a/frontend/app/models/activity.js b/frontend/app/models/activity.ts similarity index 71% rename from frontend/app/models/activity.js rename to frontend/app/models/activity.ts index e92782c43..82d58f175 100644 --- a/frontend/app/models/activity.js +++ b/frontend/app/models/activity.ts @@ -1,21 +1,36 @@ import { service } from "@ember/service"; +import type { AsyncBelongsTo } from "@ember-data/model"; import Model, { attr, belongsTo } from "@ember-data/model"; +import type StoreService from "@ember-data/store"; +import type NotifyService from "ember-notify"; +import type { Moment } from "moment"; import moment from "moment"; import { all } from "rsvp"; +import type Task from "timed/models/task"; +import type User from "timed/models/user"; export default class Activity extends Model { - @attr("django-time") fromTime; - @attr("django-time") toTime; - @attr("string", { defaultValue: "" }) comment; - @attr("django-date") date; - @attr("boolean", { defaultValue: false }) transferred; - @attr("boolean", { defaultValue: false }) review; - @attr("boolean", { defaultValue: false }) notBillable; - @belongsTo("task", { async: true, inverse: null }) task; - @belongsTo("user", { async: true, inverse: null }) user; - - @service notify; - @service store; + @attr("django-time") + declare fromTime?: Moment; + @attr("django-time") + declare toTime?: Moment; + @attr("string", { defaultValue: "" }) + declare comment: string; + @attr("django-date") + declare date?: Moment; + @attr("boolean", { defaultValue: false }) + declare transferred: boolean; + @attr("boolean", { defaultValue: false }) + declare review: boolean; + @attr("boolean", { defaultValue: false }) + declare notBillable: boolean; + @belongsTo("task", { async: true, inverse: null }) + declare task: AsyncBelongsTo; + @belongsTo("user", { async: true, inverse: null }) + declare user: AsyncBelongsTo; + + @service declare notify: NotifyService; + @service declare store: StoreService; get active() { return !this.toTime && !!this.id; @@ -137,3 +152,9 @@ export default class Activity extends Model { } } } + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + activity: Activity; + } +} diff --git a/frontend/app/models/attendance.js b/frontend/app/models/attendance.ts similarity index 67% rename from frontend/app/models/attendance.js rename to frontend/app/models/attendance.ts index 34a6e8acc..848fc3280 100644 --- a/frontend/app/models/attendance.js +++ b/frontend/app/models/attendance.ts @@ -1,10 +1,13 @@ +import type { AsyncBelongsTo } from "@ember-data/model"; /** * @module timed * @submodule timed-models * @public */ import Model, { attr, belongsTo } from "@ember-data/model"; +import type { Moment } from "moment"; import moment from "moment"; +import type User from "timed/models/user"; /** * The attendance model @@ -20,7 +23,8 @@ export default class Attendance extends Model { * @property {moment} date * @public */ - @attr("django-date") date; + @attr("django-date") + declare date?: Moment; /** * The start time @@ -28,7 +32,8 @@ export default class Attendance extends Model { * @property {moment} from * @public */ - @attr("django-time") from; + @attr("django-time") + declare from?: Moment; /** * The end time @@ -36,7 +41,8 @@ export default class Attendance extends Model { * @property {moment} to * @public */ - @attr("django-time") to; + @attr("django-time") + declare to?: Moment; /** * The user @@ -45,7 +51,8 @@ export default class Attendance extends Model { * @type {User} * @public */ - @belongsTo("user", { async: true, inverse: null }) user; + @belongsTo("user", { async: true, inverse: null }) + declare user: AsyncBelongsTo; /** * The duration between start and end time @@ -65,3 +72,9 @@ export default class Attendance extends Model { return moment.duration(calcTo.diff(this.from)); } } + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + attendance: Attendance; + } +} diff --git a/frontend/app/models/billing-type.js b/frontend/app/models/billing-type.ts similarity index 64% rename from frontend/app/models/billing-type.js rename to frontend/app/models/billing-type.ts index de59d7548..b98463638 100644 --- a/frontend/app/models/billing-type.js +++ b/frontend/app/models/billing-type.ts @@ -19,5 +19,12 @@ export default class BillingType extends Model { * @property {String} name * @public */ - @attr("string") name; + @attr("string") + declare name?: string; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + "billing-type": BillingType; + } } diff --git a/frontend/app/models/cost-center.js b/frontend/app/models/cost-center.js deleted file mode 100644 index a1b80fb56..000000000 --- a/frontend/app/models/cost-center.js +++ /dev/null @@ -1,6 +0,0 @@ -import Model, { attr } from "@ember-data/model"; - -export default class CostCenter extends Model { - @attr("string") name; - @attr("string") reference; -} diff --git a/frontend/app/models/cost-center.ts b/frontend/app/models/cost-center.ts new file mode 100644 index 000000000..55a69c05a --- /dev/null +++ b/frontend/app/models/cost-center.ts @@ -0,0 +1,14 @@ +import Model, { attr } from "@ember-data/model"; + +export default class CostCenter extends Model { + @attr("string") + declare name?: string; + @attr("string") + declare reference?: string; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + "cost-center": CostCenter; + } +} diff --git a/frontend/app/models/customer-assignee.js b/frontend/app/models/customer-assignee.ts similarity index 53% rename from frontend/app/models/customer-assignee.js rename to frontend/app/models/customer-assignee.ts index 678ea0ef4..aa10c5924 100644 --- a/frontend/app/models/customer-assignee.js +++ b/frontend/app/models/customer-assignee.ts @@ -1,9 +1,12 @@ +import type { AsyncBelongsTo } from "@ember-data/model"; /** * @module timed * @submodule timed-models * @public */ import Model, { attr, belongsTo } from "@ember-data/model"; +import type Customer from "timed/models/customer"; +import type User from "timed/models/user"; /** * The customer assignee model @@ -20,7 +23,8 @@ export default class CustomerAssignee extends Model { * @type {Customer} * @public */ - @belongsTo("customer", { async: true, inverse: null }) customer; + @belongsTo("customer", { async: true, inverse: null }) + declare customer: AsyncBelongsTo; /** * The user * @@ -28,7 +32,8 @@ export default class CustomerAssignee extends Model { * @type {User} * @public */ - @belongsTo("user", { async: true, inverse: null }) user; + @belongsTo("user", { async: true, inverse: null }) + declare user: AsyncBelongsTo; /** * Whether the assignee is a reviewer @@ -37,7 +42,8 @@ export default class CustomerAssignee extends Model { * @type {Boolean} * @public */ - @attr("boolean", { defaultValue: false }) isReviewer; + @attr("boolean", { defaultValue: false }) + declare isReviewer: boolean; /** * Whether the assignee is a manager @@ -46,7 +52,8 @@ export default class CustomerAssignee extends Model { * @type {Boolean} * @public */ - @attr("boolean", { defaultValue: false }) isManager; + @attr("boolean", { defaultValue: false }) + declare isManager: boolean; /** * Whether the assignee is a resource @@ -55,5 +62,12 @@ export default class CustomerAssignee extends Model { * @type {Boolean} * @public */ - @attr("boolean", { defaultValue: false }) isResource; + @attr("boolean", { defaultValue: false }) + declare isResource: boolean; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + "customer-assignee": CustomerAssignee; + } } diff --git a/frontend/app/models/customer-statistic.js b/frontend/app/models/customer-statistic.js deleted file mode 100644 index 315e0a950..000000000 --- a/frontend/app/models/customer-statistic.js +++ /dev/null @@ -1,6 +0,0 @@ -import Model, { attr } from "@ember-data/model"; - -export default class CustomerStatistics extends Model { - @attr("django-duration") duration; - @attr name; -} diff --git a/frontend/app/models/customer-statistic.ts b/frontend/app/models/customer-statistic.ts new file mode 100644 index 000000000..9228708b8 --- /dev/null +++ b/frontend/app/models/customer-statistic.ts @@ -0,0 +1,15 @@ +import Model, { attr } from "@ember-data/model"; +import type { Duration } from "moment"; + +export default class CustomerStatistics extends Model { + @attr("django-duration") + declare duration?: Duration; + @attr + declare name?: string; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + "customer-statistic": CustomerStatistics; + } +} diff --git a/frontend/app/models/customer.js b/frontend/app/models/customer.ts similarity index 56% rename from frontend/app/models/customer.js rename to frontend/app/models/customer.ts index 49444cf6f..1494dc9a4 100644 --- a/frontend/app/models/customer.js +++ b/frontend/app/models/customer.ts @@ -1,9 +1,12 @@ +import type { AsyncHasMany } from "@ember-data/model"; +import Model, { attr, hasMany } from "@ember-data/model"; +import type CustomerAssignee from "timed/models/customer-assignee"; +import type Project from "timed/models/project"; /** * @module timed * @submodule timed-models * @public */ -import Model, { attr, hasMany } from "@ember-data/model"; /** * The customer model @@ -20,7 +23,8 @@ export default class Customer extends Model { * @type {String} * @public */ - @attr("string", { defaultValue: "" }) name; + @attr("string", { defaultValue: "" }) + declare name: string; /** * Whether the project is archived @@ -29,7 +33,8 @@ export default class Customer extends Model { * @type {Boolean} * @public */ - @attr("boolean", { defaultValue: false }) archived; + @attr("boolean", { defaultValue: false }) + declare archived: boolean; /** * The projects @@ -38,7 +43,8 @@ export default class Customer extends Model { * @type {Project[]} * @public */ - @hasMany("project", { async: true, inverse: "customer" }) projects; + @hasMany("project", { async: true, inverse: "customer" }) + declare projects: AsyncHasMany; /** * Long name - alias for name, used for filtering in the customer box @@ -57,5 +63,12 @@ export default class Customer extends Model { * @type {CustomerAssignee[]} * @public */ - @hasMany("customer-assignee", { async: true, inverse: null }) assignees; + @hasMany("customer-assignee", { async: true, inverse: null }) + declare assignees: AsyncHasMany; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + customer: Customer; + } } diff --git a/frontend/app/models/employment.js b/frontend/app/models/employment.ts similarity index 52% rename from frontend/app/models/employment.js rename to frontend/app/models/employment.ts index 560ce4013..e1894bf97 100644 --- a/frontend/app/models/employment.js +++ b/frontend/app/models/employment.ts @@ -1,9 +1,13 @@ +import type { AsyncBelongsTo } from "@ember-data/model"; +import Model, { attr, belongsTo } from "@ember-data/model"; +import type { Moment, Duration } from "moment"; +import type Location from "timed/models/location"; /** * @module timed * @submodule timed-models * @public */ -import Model, { attr, belongsTo } from "@ember-data/model"; +import type User from "timed/models/user"; /** * The employment model @@ -19,7 +23,8 @@ export default class Employment extends Model { * @property {Number} percentage * @public */ - @attr("number") percentage; + @attr("number") + declare percentage?: number; /** * The time the user has to work every day @@ -27,7 +32,8 @@ export default class Employment extends Model { * @property {moment.duration} worktimePerDay * @public */ - @attr("django-duration") worktimePerDay; + @attr("django-duration") + declare worktimePerDay?: Duration; /** * The start date @@ -35,7 +41,8 @@ export default class Employment extends Model { * @property {moment} start * @public */ - @attr("django-date") start; + @attr("django-date") + declare start?: Moment; /** * Whether the employment is of an external employee @@ -43,7 +50,8 @@ export default class Employment extends Model { * @property {Boolean} isExternal * @public */ - @attr("boolean", { defaultValue: false }) isExternal; + @attr("boolean", { defaultValue: false }) + declare isExternal: boolean; /** * The end date @@ -51,7 +59,8 @@ export default class Employment extends Model { * @property {moment} end * @public */ - @attr("django-date") end; + @attr("django-date") + declare end?: Moment; /** * The employed user @@ -59,7 +68,8 @@ export default class Employment extends Model { * @property {User} user * @public */ - @belongsTo("user", { async: true, inverse: "employments" }) user; + @belongsTo("user", { async: true, inverse: "employments" }) + declare user: AsyncBelongsTo; /** * The work location @@ -67,5 +77,12 @@ export default class Employment extends Model { * @property {Location} location * @public */ - @belongsTo("location", { async: true, inverse: null }) location; + @belongsTo("location", { async: true, inverse: null }) + declare location: AsyncBelongsTo; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + employment: Employment; + } } diff --git a/frontend/app/models/location.js b/frontend/app/models/location.ts similarity index 66% rename from frontend/app/models/location.js rename to frontend/app/models/location.ts index fe7c35580..8ce571d0e 100644 --- a/frontend/app/models/location.js +++ b/frontend/app/models/location.ts @@ -19,7 +19,8 @@ export default class Location extends Model { * @property {String} name * @public */ - @attr("string") name; + @attr("string") + declare name?: string; /** * The days on which users in this location need to work @@ -27,5 +28,12 @@ export default class Location extends Model { * @property {Number[]} workdays * @public */ - @attr("django-workdays") workdays; + @attr("django-workdays") + declare workdays?: number[]; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + location: Location; + } } diff --git a/frontend/app/models/month-statistic.js b/frontend/app/models/month-statistic.js deleted file mode 100644 index bd36d4ea6..000000000 --- a/frontend/app/models/month-statistic.js +++ /dev/null @@ -1,7 +0,0 @@ -import Model, { attr } from "@ember-data/model"; - -export default class MonthStatistic extends Model { - @attr("number") year; - @attr("number") month; - @attr("django-duration") duration; -} diff --git a/frontend/app/models/month-statistic.ts b/frontend/app/models/month-statistic.ts new file mode 100644 index 000000000..785afce8f --- /dev/null +++ b/frontend/app/models/month-statistic.ts @@ -0,0 +1,17 @@ +import Model, { attr } from "@ember-data/model"; +import type { Duration } from "moment"; + +export default class MonthStatistic extends Model { + @attr("number") + declare year?: number; + @attr("number") + declare month?: number; + @attr("django-duration") + declare duration?: Duration; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + "month-statistic": MonthStatistic; + } +} diff --git a/frontend/app/models/overtime-credit.js b/frontend/app/models/overtime-credit.js deleted file mode 100644 index ba06c6308..000000000 --- a/frontend/app/models/overtime-credit.js +++ /dev/null @@ -1,8 +0,0 @@ -import Model, { attr, belongsTo } from "@ember-data/model"; - -export default class OvertimeCredit extends Model { - @attr("django-date") date; - @attr("django-duration") duration; - @attr("string", { defaultValue: "" }) comment; - @belongsTo("user", { async: false, inverse: null }) user; -} diff --git a/frontend/app/models/overtime-credit.ts b/frontend/app/models/overtime-credit.ts new file mode 100644 index 000000000..c5ecc905e --- /dev/null +++ b/frontend/app/models/overtime-credit.ts @@ -0,0 +1,20 @@ +import Model, { attr, belongsTo } from "@ember-data/model"; +import type { Moment, Duration } from "moment"; +import type User from "timed/models/user"; + +export default class OvertimeCredit extends Model { + @attr("django-date") + declare date?: Moment; + @attr("django-duration") + declare duration?: Duration; + @attr("string", { defaultValue: "" }) + declare comment: string; + @belongsTo("user", { async: false, inverse: null }) + declare user: User; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + "overtime-credit": OvertimeCredit; + } +} diff --git a/frontend/app/models/project-assignee.js b/frontend/app/models/project-assignee.ts similarity index 53% rename from frontend/app/models/project-assignee.js rename to frontend/app/models/project-assignee.ts index 58a3b844e..efca09400 100644 --- a/frontend/app/models/project-assignee.js +++ b/frontend/app/models/project-assignee.ts @@ -1,9 +1,12 @@ +import type { AsyncBelongsTo } from "@ember-data/model"; /** * @module timed * @submodule timed-models * @public */ import Model, { attr, belongsTo } from "@ember-data/model"; +import type Project from "timed/models/project"; +import type User from "timed/models/user"; /** * The project assignee model @@ -20,7 +23,8 @@ export default class ProjectAssignee extends Model { * @type {Project} * @public */ - @belongsTo("project", { async: true, inverse: null }) project; + @belongsTo("project", { async: true, inverse: null }) + declare project: AsyncBelongsTo; /** * The user @@ -29,7 +33,8 @@ export default class ProjectAssignee extends Model { * @type {User} * @public */ - @belongsTo("user", { async: true, inverse: null }) user; + @belongsTo("user", { async: true, inverse: null }) + declare user: AsyncBelongsTo; /** * Whether the assignee is a reviewer @@ -38,7 +43,8 @@ export default class ProjectAssignee extends Model { * @type {Boolean} * @public */ - @attr("boolean", { defaultValue: false }) isReviewer; + @attr("boolean", { defaultValue: false }) + declare isReviewer: boolean; /** * Whether the assignee is a manager @@ -47,7 +53,8 @@ export default class ProjectAssignee extends Model { * @type {Boolean} * @public */ - @attr("boolean", { defaultValue: false }) isManager; + @attr("boolean", { defaultValue: false }) + declare isManager: boolean; /** * Whether the assignee is a resource @@ -56,5 +63,12 @@ export default class ProjectAssignee extends Model { * @type {Boolean} * @public */ - @attr("boolean", { defaultValue: false }) isResource; + @attr("boolean", { defaultValue: false }) + declare isResource: boolean; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + "project-assignee": ProjectAssignee; + } } diff --git a/frontend/app/models/project-statistic.js b/frontend/app/models/project-statistic.js deleted file mode 100644 index 12a607a84..000000000 --- a/frontend/app/models/project-statistic.js +++ /dev/null @@ -1,9 +0,0 @@ -import Model, { attr, belongsTo } from "@ember-data/model"; - -export default class ProjectStatistics extends Model { - @attr name; - @attr("django-duration") estimatedTime; - @attr("django-duration") duration; - @attr("django-duration") totalRemainingEffort; - @belongsTo("customer", { async: true, inverse: null }) customer; -} diff --git a/frontend/app/models/project-statistic.ts b/frontend/app/models/project-statistic.ts new file mode 100644 index 000000000..0b9c5c10e --- /dev/null +++ b/frontend/app/models/project-statistic.ts @@ -0,0 +1,23 @@ +import type { AsyncBelongsTo } from "@ember-data/model"; +import Model, { attr, belongsTo } from "@ember-data/model"; +import type { Duration } from "moment"; +import type Customer from "timed/models/customer"; + +export default class ProjectStatistics extends Model { + @attr + declare name?: string; + @attr("django-duration") + declare estimatedTime?: Duration; + @attr("django-duration") + declare duration?: Duration; + @attr("django-duration") + declare totalRemainingEffort?: Duration; + @belongsTo("customer", { async: true, inverse: null }) + declare customer: AsyncBelongsTo; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + "project-statistic": ProjectStatistics; + } +} diff --git a/frontend/app/models/project.js b/frontend/app/models/project.ts similarity index 51% rename from frontend/app/models/project.js rename to frontend/app/models/project.ts index a5a0bb80f..1a9c52335 100644 --- a/frontend/app/models/project.js +++ b/frontend/app/models/project.ts @@ -1,9 +1,15 @@ +import type { AsyncBelongsTo, AsyncHasMany } from "@ember-data/model"; +import Model, { attr, belongsTo, hasMany } from "@ember-data/model"; +import type { Duration } from "moment"; +import type BillingType from "timed/models/billing-type"; +import type Customer from "timed/models/customer"; +import type ProjectAssignee from "timed/models/project-assignee"; +import type Task from "timed/models/task"; /** * @module timed * @submodule timed-models * @public */ -import Model, { attr, belongsTo, hasMany } from "@ember-data/model"; /** * The project model @@ -20,7 +26,8 @@ export default class Project extends Model { * @type {String} * @public */ - @attr("string", { defaultValue: "" }) name; + @attr("string", { defaultValue: "" }) + declare name: string; /** * Whether the project is archived @@ -29,7 +36,8 @@ export default class Project extends Model { * @type {Boolean} * @public */ - @attr("boolean", { defaultValue: false }) archived; + @attr("boolean", { defaultValue: false }) + declare archived: boolean; /** * The estimated time for this project @@ -37,7 +45,8 @@ export default class Project extends Model { * @property {moment.duration} estimatedTime * @public */ - @attr("django-duration") estimatedTime; + @attr("django-duration") + declare estimatedTime?: Duration; /** * Boolean indicating if the remainig effort should be trackable @@ -45,14 +54,16 @@ export default class Project extends Model { * @type {Boolean} * @public */ - @attr("boolean", { defaultValue: false }) remainingEffortTracking; + @attr("boolean", { defaultValue: false }) + declare remainingEffortTracking: boolean; /** * Total remainig effort for this project * @property {moment.duration} estimatedtime * @public */ - @attr("django-duration") totalRemainingEffort; + @attr("django-duration") + declare totalRemainingEffort?: Duration; /** * The customer @@ -61,7 +72,8 @@ export default class Project extends Model { * @type {Customer} * @public */ - @belongsTo("customer", { async: true, inverse: "projects" }) customer; + @belongsTo("customer", { async: true, inverse: "projects" }) + declare customer: AsyncBelongsTo; /** * Whether the project's comments are visible to the customer @@ -70,7 +82,8 @@ export default class Project extends Model { * @type {Boolean} * @public */ - @attr("boolean", { defaultValue: false }) customerVisible; + @attr("boolean", { defaultValue: false }) + declare customerVisible: boolean; /** * The billing @@ -78,7 +91,8 @@ export default class Project extends Model { * @property {BillingType} billingType * @public */ - @belongsTo("billing-type", { async: false, inverse: null }) billingType; + @belongsTo("billing-type", { async: false, inverse: null }) + declare billingType: BillingType; /** * The tasks @@ -87,7 +101,8 @@ export default class Project extends Model { * @type {Task[]} * @public */ - @hasMany("task", { async: true, inverse: "project" }) tasks; + @hasMany("task", { async: true, inverse: "project" }) + declare tasks: AsyncHasMany; /** * Assigned users to this project @@ -96,5 +111,12 @@ export default class Project extends Model { * @type {ProjectAssignee[]} * @public */ - @hasMany("project-assignee", { async: true, inverse: null }) assignees; + @hasMany("project-assignee", { async: true, inverse: null }) + declare assignees: AsyncHasMany; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + project: Project; + } } diff --git a/frontend/app/models/public-holiday.js b/frontend/app/models/public-holiday.ts similarity index 51% rename from frontend/app/models/public-holiday.js rename to frontend/app/models/public-holiday.ts index 2bca8babc..3d7c10902 100644 --- a/frontend/app/models/public-holiday.js +++ b/frontend/app/models/public-holiday.ts @@ -1,9 +1,12 @@ +import type { AsyncBelongsTo } from "@ember-data/model"; /** * @module timed * @submodule timed-models * @public */ import Model, { attr, belongsTo } from "@ember-data/model"; +import type { Moment } from "moment"; +import type Location from "timed/models/location"; /** * The public holiday model @@ -19,7 +22,8 @@ export default class PublicHoliday extends Model { * @property {String} name * @public */ - @attr("string") name; + @attr("string") + declare name?: string; /** * The date @@ -27,7 +31,8 @@ export default class PublicHoliday extends Model { * @property {moment} date * @public */ - @attr("django-date") date; + @attr("django-date") + declare date?: Moment; /** * The location @@ -35,5 +40,12 @@ export default class PublicHoliday extends Model { * @property {Location} location * @public */ - @belongsTo("location", { async: true, inverse: null }) location; + @belongsTo("location", { async: true, inverse: null }) + declare location: AsyncBelongsTo; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + "public-holiday": PublicHoliday; + } } diff --git a/frontend/app/models/report-intersection.js b/frontend/app/models/report-intersection.js deleted file mode 100644 index 8b3f2eb5c..000000000 --- a/frontend/app/models/report-intersection.js +++ /dev/null @@ -1,15 +0,0 @@ -import Model, { attr, belongsTo } from "@ember-data/model"; - -export default class ReportIntersection extends Model { - @attr("string") comment; - @attr("boolean", { allowNull: true, defaultValue: null }) notBillable; - @attr("boolean", { allowNull: true, defaultValue: false }) rejected; - @attr("boolean", { allowNull: true, defaultValue: null }) review; - @attr("boolean", { allowNull: true, defaultValue: null }) billed; - @attr("boolean", { allowNull: true, defaultValue: null }) verified; - - @belongsTo("customer", { async: true, inverse: null }) customer; - @belongsTo("project", { async: true, inverse: null }) project; - @belongsTo("task", { async: true, inverse: null }) task; - @belongsTo("user", { async: true, inverse: null }) user; -} diff --git a/frontend/app/models/report-intersection.ts b/frontend/app/models/report-intersection.ts new file mode 100644 index 000000000..cb91c7c9e --- /dev/null +++ b/frontend/app/models/report-intersection.ts @@ -0,0 +1,36 @@ +import type { AsyncBelongsTo } from "@ember-data/model"; +import Model, { attr, belongsTo } from "@ember-data/model"; +import type Customer from "timed/models/customer"; +import type Project from "timed/models/project"; +import type Task from "timed/models/task"; +import type User from "timed/models/user"; + +export default class ReportIntersection extends Model { + @attr("string") + declare comment?: string; + @attr("boolean", { allowNull: true, defaultValue: null }) + declare notBillable: boolean | null; + @attr("boolean", { allowNull: true, defaultValue: false }) + declare rejected: boolean | null; + @attr("boolean", { allowNull: true, defaultValue: null }) + declare review: boolean | null; + @attr("boolean", { allowNull: true, defaultValue: null }) + declare billed: boolean | null; + @attr("boolean", { allowNull: true, defaultValue: null }) + declare verified: boolean | null; + + @belongsTo("customer", { async: true, inverse: null }) + declare customer: AsyncBelongsTo; + @belongsTo("project", { async: true, inverse: null }) + declare project: AsyncBelongsTo; + @belongsTo("task", { async: true, inverse: null }) + declare task: AsyncBelongsTo; + @belongsTo("user", { async: true, inverse: null }) + declare user: AsyncBelongsTo; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + "report-intersection": ReportIntersection; + } +} diff --git a/frontend/app/models/report.js b/frontend/app/models/report.ts similarity index 58% rename from frontend/app/models/report.js rename to frontend/app/models/report.ts index 1407ecbff..2d46b3057 100644 --- a/frontend/app/models/report.js +++ b/frontend/app/models/report.ts @@ -1,10 +1,14 @@ +import type { AsyncBelongsTo } from "@ember-data/model"; +import Model, { attr, belongsTo } from "@ember-data/model"; +import type { Moment, Duration } from "moment"; /** * @module timed * @submodule timed-models * @public */ -import Model, { attr, belongsTo } from "@ember-data/model"; import moment from "moment"; +import type Task from "timed/models/task"; +import type User from "timed/models/user"; /** * The report model @@ -20,7 +24,8 @@ export default class Report extends Model { * @property {String} comment * @public */ - @attr("string", { defaultValue: "" }) comment; + @attr("string", { defaultValue: "" }) + declare comment: string; /** * The date @@ -28,7 +33,8 @@ export default class Report extends Model { * @property {moment} date * @public */ - @attr("django-date") date; + @attr("django-date") + declare date?: Moment; /** * The duration @@ -36,7 +42,8 @@ export default class Report extends Model { * @property {moment.duration} duration * @public */ - @attr("django-duration", { defaultValue: () => moment.duration() }) duration; + @attr("django-duration", { defaultValue: () => moment.duration() }) + declare duration: Duration; /** * The remaining effort for the underlying task @@ -46,7 +53,7 @@ export default class Report extends Model { */ @attr("django-duration", { defaultValue: () => moment.duration() }) - remainingEffort; + declare remainingEffort: Duration; /** * Whether the report needs to be reviewed @@ -54,7 +61,8 @@ export default class Report extends Model { * @property {Boolean} review * @public */ - @attr("boolean", { defaultValue: false }) review; + @attr("boolean", { defaultValue: false }) + declare review: boolean; /** * Whether the report got rejected by the reviewer @@ -62,7 +70,8 @@ export default class Report extends Model { * @property {Boolean} reject * @public */ - @attr("boolean", { defaultValue: false }) rejected; + @attr("boolean", { defaultValue: false }) + declare rejected: boolean; /** * Whether the report is not billable @@ -70,7 +79,8 @@ export default class Report extends Model { * @property {Boolean} notBillable * @public */ - @attr("boolean", { defaultValue: false }) notBillable; + @attr("boolean", { defaultValue: false }) + declare notBillable: boolean; /** * Whether the report has been marked as billed @@ -78,7 +88,8 @@ export default class Report extends Model { * @property {Boolean} billed * @public */ - @attr("boolean", { defaultValue: false }) billed; + @attr("boolean", { defaultValue: false }) + declare billed: boolean; /** * The task @@ -86,7 +97,8 @@ export default class Report extends Model { * @property {Task} task * @public */ - @belongsTo("task", { async: false, inverse: null }) task; + @belongsTo("task", { async: false, inverse: null }) + declare task: Task; /** * The user @@ -94,7 +106,8 @@ export default class Report extends Model { * @property {User} user * @public */ - @belongsTo("user", { async: false, inverse: null }) user; + @belongsTo("user", { async: false, inverse: null }) + declare user: User; /** * The user which verified this report @@ -102,5 +115,12 @@ export default class Report extends Model { * @property {User} verifiedBy * @public */ - @belongsTo("user", { async: true, inverse: null }) verifiedBy; + @belongsTo("user", { async: true, inverse: null }) + declare verifiedBy: AsyncBelongsTo; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + report: Report; + } } diff --git a/frontend/app/models/task-assignee.js b/frontend/app/models/task-assignee.ts similarity index 53% rename from frontend/app/models/task-assignee.js rename to frontend/app/models/task-assignee.ts index 4f8a58bbe..b0aa65f5c 100644 --- a/frontend/app/models/task-assignee.js +++ b/frontend/app/models/task-assignee.ts @@ -1,9 +1,12 @@ +import type { AsyncBelongsTo } from "@ember-data/model"; /** * @module timed * @submodule timed-models * @public */ import Model, { attr, belongsTo } from "@ember-data/model"; +import type Task from "timed/models/task"; +import type User from "timed/models/user"; /** * The task assignee model @@ -20,7 +23,8 @@ export default class TaskAssignee extends Model { * @type {Task} * @public */ - @belongsTo("task", { async: true, inverse: "assignees" }) task; + @belongsTo("task", { async: true, inverse: "assignees" }) + declare task: AsyncBelongsTo; /** * The user * @@ -28,7 +32,8 @@ export default class TaskAssignee extends Model { * @type {User} * @public */ - @belongsTo("user", { async: true, inverse: null }) user; + @belongsTo("user", { async: true, inverse: null }) + declare user: AsyncBelongsTo; /** * Whether the assignee is a reviewer @@ -37,7 +42,8 @@ export default class TaskAssignee extends Model { * @type {Boolean} * @public */ - @attr("boolean", { defaultValue: false }) isReviewer; + @attr("boolean", { defaultValue: false }) + declare isReviewer: boolean; /** * Whether the assignee is a manager @@ -46,7 +52,8 @@ export default class TaskAssignee extends Model { * @type {Boolean} * @public */ - @attr("boolean", { defaultValue: false }) isManager; + @attr("boolean", { defaultValue: false }) + declare isManager: boolean; /** * Whether the assignee is a resource @@ -55,5 +62,12 @@ export default class TaskAssignee extends Model { * @type {Boolean} * @public */ - @attr("boolean", { defaultValue: false }) isResource; + @attr("boolean", { defaultValue: false }) + declare isResource: boolean; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + "task-assignee": TaskAssignee; + } } diff --git a/frontend/app/models/task-statistic.js b/frontend/app/models/task-statistic.js deleted file mode 100644 index b9a234e25..000000000 --- a/frontend/app/models/task-statistic.js +++ /dev/null @@ -1,9 +0,0 @@ -import Model, { attr, belongsTo } from "@ember-data/model"; - -export default class TaskStatistics extends Model { - @attr name; - @attr("django-duration") duration; - @attr("django-duration") estimatedTime; - @attr("django-duration") mostRecentRemainingEffort; - @belongsTo("project", { async: true, inverse: null }) project; -} diff --git a/frontend/app/models/task-statistic.ts b/frontend/app/models/task-statistic.ts new file mode 100644 index 000000000..f29748873 --- /dev/null +++ b/frontend/app/models/task-statistic.ts @@ -0,0 +1,23 @@ +import type { AsyncBelongsTo } from "@ember-data/model"; +import Model, { attr, belongsTo } from "@ember-data/model"; +import type { Duration } from "moment"; +import type Project from "timed/models/project"; + +export default class TaskStatistics extends Model { + @attr + declare name?: string; + @attr("django-duration") + declare duration?: Duration; + @attr("django-duration") + declare estimatedTime?: Duration; + @attr("django-duration") + declare mostRecentRemainingEffort?: Duration; + @belongsTo("project", { async: true, inverse: null }) + declare project: AsyncBelongsTo; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + "task-statistic": TaskStatistics; + } +} diff --git a/frontend/app/models/task.js b/frontend/app/models/task.js deleted file mode 100644 index 9882f902b..000000000 --- a/frontend/app/models/task.js +++ /dev/null @@ -1,40 +0,0 @@ -import Model, { attr, belongsTo, hasMany } from "@ember-data/model"; - -export default class Task extends Model { - @attr("string", { defaultValue: "" }) name; - @attr("django-duration") estimatedTime; - @attr("django-duration") mostRecentRemainingEffort; - @attr("boolean", { defaultValue: false }) archived; - @attr("string", { defaultValue: "" }) reference; - - @belongsTo("project", { - async: true, - inverse: "tasks", - }) - project; - @hasMany("task-assignee", { - async: true, - inverse: "task", - }) - assignees; - - /** - * Flag saying that this is a task. - * Used in /app/customer-suggestion/template.hbs - * We're using this as a workaround for the fact that one - * can't seem to use helpers like "(eq" in inline templates - * - * @property project - * @type {Project} - * @public - */ - isTask = true; - - get longName() { - const taskName = this.name; - const projectName = this.project.get("name"); - const customerName = this.project.get("customer.name"); - - return `${customerName} > ${projectName} > ${taskName}`; - } -} diff --git a/frontend/app/models/task.ts b/frontend/app/models/task.ts new file mode 100644 index 000000000..ef4174f54 --- /dev/null +++ b/frontend/app/models/task.ts @@ -0,0 +1,60 @@ +import Model, { + attr, + belongsTo, + hasMany, + type AsyncBelongsTo, + type AsyncHasMany, +} from "@ember-data/model"; +import type { Duration } from "moment"; +import type Project from "timed/models/project"; +import type TaskAssignee from "timed/models/task-assignee"; + +export default class Task extends Model { + @attr("string", { defaultValue: "" }) + declare name: string; + @attr("django-duration") + declare estimatedTime?: Duration; + @attr("django-duration") + declare mostRecentRemainingEffort?: Duration; + @attr("boolean", { defaultValue: false }) + declare archived: boolean; + @attr("string", { defaultValue: "" }) + declare reference: string; + + @belongsTo("project", { + async: true, + inverse: "tasks", + }) + declare project: AsyncBelongsTo; + @hasMany("task-assignee", { + async: true, + inverse: "task", + }) + declare assignees: AsyncHasMany; + + /** + * Flag saying that this is a task. + * Used in /app/customer-suggestion/template.hbs + * We're using this as a workaround for the fact that one + * can't seem to use helpers like "(eq" in inline templates + * + * @property project + * @type {Project} + * @public + */ + isTask = true; + + get longName() { + const taskName = this.name; + const projectName = this.project.get("name"); + const customerName = this.project.get("customer.name"); + + return `${customerName} > ${projectName} > ${taskName}`; + } +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + task: Task; + } +} diff --git a/frontend/app/models/user-statistic.js b/frontend/app/models/user-statistic.js deleted file mode 100644 index 1785551fe..000000000 --- a/frontend/app/models/user-statistic.js +++ /dev/null @@ -1,7 +0,0 @@ -import Model, { attr, belongsTo } from "@ember-data/model"; - -export default class UserStatistic extends Model { - @attr("django-duration") duration; - - @belongsTo("user", { async: true, inverse: null }) user; -} diff --git a/frontend/app/models/user-statistic.ts b/frontend/app/models/user-statistic.ts new file mode 100644 index 000000000..4fff5d017 --- /dev/null +++ b/frontend/app/models/user-statistic.ts @@ -0,0 +1,18 @@ +import type { AsyncBelongsTo } from "@ember-data/model"; +import Model, { attr, belongsTo } from "@ember-data/model"; +import type { Duration } from "moment"; +import type User from "timed/models/user"; + +export default class UserStatistic extends Model { + @attr("django-duration") + declare duration?: Duration; + + @belongsTo("user", { async: true, inverse: null }) + declare user: AsyncBelongsTo; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + "user-statistic": UserStatistic; + } +} diff --git a/frontend/app/models/user.js b/frontend/app/models/user.ts similarity index 68% rename from frontend/app/models/user.js rename to frontend/app/models/user.ts index 3db1a1a6c..19f3eb5c2 100644 --- a/frontend/app/models/user.js +++ b/frontend/app/models/user.ts @@ -1,11 +1,16 @@ +import { service } from "@ember/service"; +import type { SyncHasMany, AsyncHasMany } from "@ember-data/model"; /** * @module timed * @submodule timed-models * @public */ -import { service } from "@ember/service"; import Model, { attr, hasMany } from "@ember-data/model"; +import type StoreService from "@ember-data/store"; import moment from "moment"; +import type AbsenceBalance from "timed/models/absence-balance"; +import type Employment from "timed/models/employment"; +import type WorktimeBalance from "timed/models/worktime-balance"; /** * The user model * @@ -14,14 +19,15 @@ import moment from "moment"; * @public */ export default class User extends Model { - @service store; + @service declare store: StoreService; /** * The username * * @property {String} username * @public */ - @attr("string") username; + @attr("string") + declare username?: string; /** * The first name @@ -29,7 +35,8 @@ export default class User extends Model { * @property {String} firstName * @public */ - @attr("string") firstName; + @attr("string") + declare firstName?: string; /** * The last name @@ -37,7 +44,8 @@ export default class User extends Model { * @property {String} lastName * @public */ - @attr("string") lastName; + @attr("string") + declare lastName?: string; /** * The email address @@ -45,7 +53,8 @@ export default class User extends Model { * @property {String} email * @public */ - @attr("string") email; + @attr("string") + declare email?: string; /** * Defines if the user is a superuser @@ -53,7 +62,8 @@ export default class User extends Model { * @property {Boolean} isSuperuser * @public */ - @attr("boolean") isSuperuser; + @attr("boolean") + declare isSuperuser?: boolean; /** * Whether a user is active @@ -61,7 +71,8 @@ export default class User extends Model { * @property {Boolean} isActive * @public */ - @attr("boolean") isActive; + @attr("boolean") + declare isActive?: boolean; /** * Whether the user is a reviewer in a project @@ -69,12 +80,14 @@ export default class User extends Model { * @property {Boolean} isReviewer * @public */ - @attr("boolean") isReviewer; + @attr("boolean") + declare isReviewer?: boolean; /** * Whether the user is an accountant */ - @attr("boolean", { defaultValue: false }) isAccountant; + @attr("boolean", { defaultValue: false }) + declare isAccountant: boolean; /** * Whether the user completed the app tour @@ -82,7 +95,8 @@ export default class User extends Model { * @property {Boolean} tourDone * @public */ - @attr("boolean") tourDone; + @attr("boolean") + declare tourDone?: boolean; /** * The users supervisors @@ -90,7 +104,8 @@ export default class User extends Model { * @property {User[]} supervisors * @public */ - @hasMany("user", { inverse: "supervisees", async: false }) supervisors; + @hasMany("user", { inverse: "supervisees", async: false }) + declare supervisors: SyncHasMany; /** * The users supervisees @@ -98,7 +113,8 @@ export default class User extends Model { * @property {User[]} supervisees * @public */ - @hasMany("user", { inverse: "supervisors", async: false }) supervisees; + @hasMany("user", { inverse: "supervisors", async: false }) + declare supervisees: SyncHasMany; /** * The users employments @@ -106,7 +122,8 @@ export default class User extends Model { * @property {Employment[]} employments * @public */ - @hasMany("employment", { async: true, inverse: "user" }) employments; + @hasMany("employment", { async: true, inverse: "user" }) + declare employments: AsyncHasMany; /** * The users worktime balances @@ -114,8 +131,8 @@ export default class User extends Model { * @property {WorktimeBalance[]} worktimeBalances * @public */ - @hasMany("worktime-balances", { async: true, inverse: "user" }) - worktimeBalances; + @hasMany("worktime-balance", { async: true, inverse: "user" }) + declare worktimeBalances: AsyncHasMany; /** * The users absence balances @@ -123,7 +140,8 @@ export default class User extends Model { * @property {AbsenceBalance[]} absenceBalances * @public */ - @hasMany("absence-balance", { async: true, inverse: "user" }) absenceBalances; + @hasMany("absence-balance", { async: true, inverse: "user" }) + declare absenceBalances: AsyncHasMany; /** * The full name @@ -200,3 +218,9 @@ export default class User extends Model { }; } } + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + user: User; + } +} diff --git a/frontend/app/models/worktime-balance.js b/frontend/app/models/worktime-balance.js deleted file mode 100644 index f7cb73ead..000000000 --- a/frontend/app/models/worktime-balance.js +++ /dev/null @@ -1,7 +0,0 @@ -import Model, { attr, belongsTo } from "@ember-data/model"; - -export default class WorktimeBalance extends Model { - @attr("django-date") date; - @attr("django-duration") balance; - @belongsTo("user", { async: true, inverse: "worktimeBalances" }) user; -} diff --git a/frontend/app/models/worktime-balance.ts b/frontend/app/models/worktime-balance.ts new file mode 100644 index 000000000..6c78a1bf5 --- /dev/null +++ b/frontend/app/models/worktime-balance.ts @@ -0,0 +1,19 @@ +import type { AsyncBelongsTo } from "@ember-data/model"; +import Model, { attr, belongsTo } from "@ember-data/model"; +import type { Moment, Duration } from "moment"; +import type User from "timed/models/user"; + +export default class WorktimeBalance extends Model { + @attr("django-date") + declare date?: Moment; + @attr("django-duration") + declare balance?: Duration; + @belongsTo("user", { async: true, inverse: "worktimeBalances" }) + declare user: AsyncBelongsTo; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + "worktime-balance": WorktimeBalance; + } +} diff --git a/frontend/app/models/year-statistic.js b/frontend/app/models/year-statistic.js deleted file mode 100644 index 54108d33d..000000000 --- a/frontend/app/models/year-statistic.js +++ /dev/null @@ -1,6 +0,0 @@ -import Model, { attr } from "@ember-data/model"; - -export default class YearStatistic extends Model { - @attr("number") year; - @attr("django-duration") duration; -} diff --git a/frontend/app/models/year-statistic.ts b/frontend/app/models/year-statistic.ts new file mode 100644 index 000000000..efc322677 --- /dev/null +++ b/frontend/app/models/year-statistic.ts @@ -0,0 +1,15 @@ +import Model, { attr } from "@ember-data/model"; +import type { Duration } from "moment"; + +export default class YearStatistic extends Model { + @attr("number") + declare year?: number; + @attr("django-duration") + declare duration?: Duration; +} + +declare module "ember-data/types/registries/model" { + export default interface ModelRegistry { + "year-statistic": YearStatistic; + } +} diff --git a/frontend/app/serializers/application.js b/frontend/app/serializers/application.ts similarity index 100% rename from frontend/app/serializers/application.js rename to frontend/app/serializers/application.ts diff --git a/frontend/app/serializers/attendance.js b/frontend/app/serializers/attendance.ts similarity index 68% rename from frontend/app/serializers/attendance.js rename to frontend/app/serializers/attendance.ts index d2ddaf624..2eb787613 100644 --- a/frontend/app/serializers/attendance.js +++ b/frontend/app/serializers/attendance.ts @@ -12,7 +12,7 @@ import ApplicationSerializer from "timed/serializers/application"; * @extends ApplicationSerializer * @public */ -export default ApplicationSerializer.extend({ +export default class AttendanceSerializer extends ApplicationSerializer { /** * The attribute mapping * @@ -24,8 +24,14 @@ export default ApplicationSerializer.extend({ * @property {String} to * @public */ - attrs: { + attrs = { from: "from-time", to: "to-time", - }, -}); + }; +} + +declare module "ember-data/types/registries/serializer" { + export default interface SerializerRegistry { + attendance: AttendanceSerializer; + } +} diff --git a/frontend/app/serializers/employment.js b/frontend/app/serializers/employment.ts similarity index 69% rename from frontend/app/serializers/employment.js rename to frontend/app/serializers/employment.ts index de54c6c2b..17ad424e9 100644 --- a/frontend/app/serializers/employment.js +++ b/frontend/app/serializers/employment.ts @@ -12,7 +12,7 @@ import ApplicationSerializer from "timed/serializers/application"; * @extends ApplicationSerializer * @public */ -export default ApplicationSerializer.extend({ +export default class EmploymentSerializer extends ApplicationSerializer { /** * The attribute mapping * @@ -24,8 +24,14 @@ export default ApplicationSerializer.extend({ * @property {String} end * @public */ - attrs: { + attrs = { start: "start-date", end: "end-date", - }, -}); + }; +} + +declare module "ember-data/types/registries/serializer" { + export default interface SerializerRegistry { + employment: EmploymentSerializer; + } +} diff --git a/frontend/app/services/autostart-tour.js b/frontend/app/services/autostart-tour.ts similarity index 88% rename from frontend/app/services/autostart-tour.js rename to frontend/app/services/autostart-tour.ts index 65e326a6b..cbb4d433e 100644 --- a/frontend/app/services/autostart-tour.js +++ b/frontend/app/services/autostart-tour.ts @@ -37,3 +37,9 @@ export default class AutostartTourService extends Service { return this.undoneTours.length === 0; } } + +declare module "@ember/service" { + interface Registry { + "autostart-tour": AutostartTourService; + } +} diff --git a/frontend/app/services/current-user.js b/frontend/app/services/current-user.ts similarity index 62% rename from frontend/app/services/current-user.js rename to frontend/app/services/current-user.ts index d2e6524e2..2e5dc37f6 100644 --- a/frontend/app/services/current-user.js +++ b/frontend/app/services/current-user.ts @@ -1,11 +1,15 @@ +import type RouterService from "@ember/routing/router-service"; import Service, { service } from "@ember/service"; +import type StoreService from "@ember-data/store"; +import type SessionService from "ember-simple-auth-oidc/services/session"; import moment from "moment"; +import type FetchService from "timed/services/fetch"; export default class CurrentUserService extends Service { - @service session; - @service fetch; - @service store; - @service router; + @service declare session: SessionService; + @service declare fetch: FetchService; + @service declare store: StoreService; + @service declare router: RouterService; async load() { if (!this.session.isAuthenticated) { @@ -38,3 +42,9 @@ export default class CurrentUserService extends Service { this.user = usermodel; } } + +declare module "@ember/service" { + interface Registry { + "current-user": CurrentUserService; + } +} diff --git a/frontend/app/services/fetch.js b/frontend/app/services/fetch.ts similarity index 92% rename from frontend/app/services/fetch.js rename to frontend/app/services/fetch.ts index e950f900f..46e2f3ccb 100644 --- a/frontend/app/services/fetch.js +++ b/frontend/app/services/fetch.ts @@ -2,6 +2,7 @@ import Service, { service } from "@ember/service"; import { isEmpty } from "@ember/utils"; import { isUnauthorizedResponse } from "ember-fetch/errors"; import { handleUnauthorized } from "ember-simple-auth-oidc"; +import type SessionService from "ember-simple-auth-oidc/services/session"; import fetch from "fetch"; const CONTENT_TYPE = "application/vnd.api+json"; @@ -40,7 +41,7 @@ const stringifyBodyData = (obj) => { }; export default class FetchService extends Service { - @service session; + @service declare session: SessionService; async fetch(resource, init = {}) { await this.session.refreshAuthentication.perform(); @@ -97,3 +98,9 @@ export default class FetchService extends Service { }; } } + +declare module "@ember/service" { + interface Registry { + fetch: FetchService; + } +} diff --git a/frontend/app/services/metadata-fetcher.js b/frontend/app/services/metadata-fetcher.ts similarity index 92% rename from frontend/app/services/metadata-fetcher.js rename to frontend/app/services/metadata-fetcher.ts index eeb9f7429..7312781fa 100644 --- a/frontend/app/services/metadata-fetcher.js +++ b/frontend/app/services/metadata-fetcher.ts @@ -1,6 +1,7 @@ import Service, { service } from "@ember/service"; import { camelize, capitalize, dasherize } from "@ember/string"; import { restartableTask } from "ember-concurrency"; +import type FetchService from "timed/services/fetch"; import DjangoDurationTransform from "timed/transforms/django-duration"; const DJANGO_DURATION_TRANSFORM = DjangoDurationTransform.create(); @@ -45,7 +46,7 @@ export default class MetadataFetcherService extends Service { * @property {Emberfetch} fetch * @public */ - @service fetch; + @service declare fetch: FetchService; /** * Task to fetch a single records metadata @@ -95,3 +96,9 @@ export default class MetadataFetcherService extends Service { return { ...attributesValues, ...metaValues }; } } + +declare module "@ember/service" { + interface Registry { + "metadata-fetcher": MetadataFetcherService; + } +} diff --git a/frontend/app/services/rejected-reports.js b/frontend/app/services/rejected-reports.ts similarity index 73% rename from frontend/app/services/rejected-reports.js rename to frontend/app/services/rejected-reports.ts index 88197b3ae..06bbb9dc4 100644 --- a/frontend/app/services/rejected-reports.js +++ b/frontend/app/services/rejected-reports.ts @@ -1,15 +1,18 @@ import Service, { service } from "@ember/service"; +import type StoreService from "@ember-data/store"; import { macroCondition, isTesting } from "@embroider/macros"; import { tracked } from "@glimmer/tracking"; +import type NotifyService from "ember-notify"; +import type CurrentUserService from "timed/services/current-user"; const INTERVAL_DELAY = 10 * 60000; // 10 Minutes export default class RejectedReportsService extends Service { - @service store; + @service declare store: StoreService; - @service currentUser; + @service declare currentUser: CurrentUserService; - @service notify; + @service declare notify: NotifyService; @tracked amountReports = 0; @tracked intervalId; @@ -53,3 +56,9 @@ export default class RejectedReportsService extends Service { clearInterval(this.intervalId); } } + +declare module "@ember/service" { + interface Registry { + "rejected-reports": RejectedReportsService; + } +} diff --git a/frontend/app/services/tour.js b/frontend/app/services/tour.ts similarity index 87% rename from frontend/app/services/tour.js rename to frontend/app/services/tour.ts index d57f0ac1f..2d4f32200 100644 --- a/frontend/app/services/tour.js +++ b/frontend/app/services/tour.ts @@ -1,17 +1,21 @@ +import type RouterService from "@ember/routing/router-service"; import { schedule, later } from "@ember/runloop"; import { service } from "@ember/service"; import { waitFor } from "@ember/test-waiters"; import { isTesting, macroCondition } from "@embroider/macros"; import { tracked } from "@glimmer/tracking"; +import type NotifyService from "ember-notify"; import Tour from "ember-shepherd/services/tour"; +import type AutostartTourService from "timed/services/autostart-tour"; +import type MediaService from "timed/services/media"; import TOURS from "timed/tours"; import { cached } from "tracked-toolbox"; export default class TourService extends Tour { - @service notify; - @service media; - @service router; - @service autostartTour; + @service declare notify: NotifyService; + @service declare media: MediaService; + @service declare router: RouterService; + @service declare autostartTour: AutostartTourService; @tracked model; constructor(...args) { @@ -51,8 +55,7 @@ export default class TourService extends Tour { super.willDestroy(...args); } - @cached - get routeName() { + @cached get routeName() { return this.router.currentRouteName.replace(/\.index$/, ""); } @@ -132,8 +135,7 @@ export default class TourService extends Tour { } } - @waitFor - async startTour() { + @waitFor async startTour() { if (this._wantsTour && this.hasTourForRoute) { await this.prepareTourForCurrentRoute(); schedule("afterRender", this, () => { @@ -172,3 +174,9 @@ export default class TourService extends Tour { } } } + +declare module "@ember/service" { + interface Registry { + tour: TourService; + } +} diff --git a/frontend/app/services/tracking.js b/frontend/app/services/tracking.ts similarity index 96% rename from frontend/app/services/tracking.js rename to frontend/app/services/tracking.ts index 0df09deef..9f9569e5f 100644 --- a/frontend/app/services/tracking.js +++ b/frontend/app/services/tracking.ts @@ -2,9 +2,11 @@ import { getOwner } from "@ember/application"; import { scheduleOnce } from "@ember/runloop"; import Service, { service } from "@ember/service"; import { camelize, capitalize } from "@ember/string"; +import type StoreService from "@ember-data/store"; import { isTesting, macroCondition } from "@embroider/macros"; import { tracked } from "@glimmer/tracking"; import { dropTask, task, timeout } from "ember-concurrency"; +import type NotifyService from "ember-notify"; import { trackedTask } from "ember-resources/util/ember-concurrency"; import moment from "moment"; import formatDuration from "timed/utils/format-duration"; @@ -25,7 +27,7 @@ export default class TrackingService extends Service { * @property {Ember.Store} store * @public */ - @service store; + @service declare store: StoreService; /** * The notify service @@ -33,7 +35,7 @@ export default class TrackingService extends Service { * @property {EmberNotify.NotifyService} notify * @public */ - @service notify; + @service declare notify: NotifyService; /** * Flag indicating if the tracking reports is currently generated. @@ -363,3 +365,9 @@ export default class TrackingService extends Service { return; } } + +declare module "@ember/service" { + interface Registry { + tracking: TrackingService; + } +} diff --git a/frontend/app/services/unverified-reports.js b/frontend/app/services/unverified-reports.ts similarity index 77% rename from frontend/app/services/unverified-reports.js rename to frontend/app/services/unverified-reports.ts index b320b70e8..b6579c8d2 100644 --- a/frontend/app/services/unverified-reports.js +++ b/frontend/app/services/unverified-reports.ts @@ -1,7 +1,10 @@ import Service, { service } from "@ember/service"; +import type StoreService from "@ember-data/store"; import { isTesting, macroCondition } from "@embroider/macros"; import { tracked } from "@glimmer/tracking"; +import type NotifyService from "ember-notify"; import moment from "moment"; +import type CurrentUserService from "timed/services/current-user"; const INTERVAL_DELAY = 10 * 60000; // 10 Minutes @@ -16,11 +19,11 @@ const INTERVAL_DELAY = 10 * 60000; // 10 Minutes * @public */ export default class UnverifiedReportsService extends Service { - @service store; + @service declare store: StoreService; - @service currentUser; + @service declare currentUser: CurrentUserService; - @service notify; + @service declare notify: NotifyService; @tracked amountReports = 0; @@ -65,3 +68,9 @@ export default class UnverifiedReportsService extends Service { clearInterval(this.intervalId); } } + +declare module "@ember/service" { + interface Registry { + "unverified-reports": UnverifiedReportsService; + } +} diff --git a/frontend/app/transforms/django-date.ts b/frontend/app/transforms/django-date.ts new file mode 100644 index 000000000..1a0f042bc --- /dev/null +++ b/frontend/app/transforms/django-date.ts @@ -0,0 +1,26 @@ +import MomentTransform from "timed/transforms/moment"; + +/** + * The django date transform + * + * This transforms a django date into a moment date + * + * @class DjangoDateTransform + * @extends MomentTransform + * @public + */ +export default class DjangoDateTransform extends MomentTransform { + /** + * The date format + * + * @property {String} format + * @public + */ + format = "YYYY-MM-DD"; +} + +declare module "ember-data/types/registries/transform" { + export default interface TransformRegistry { + "django-date": DjangoDateTransform; + } +} diff --git a/frontend/app/transforms/django-datetime.ts b/frontend/app/transforms/django-datetime.ts new file mode 100644 index 000000000..dc4137ee4 --- /dev/null +++ b/frontend/app/transforms/django-datetime.ts @@ -0,0 +1,26 @@ +import MomentTransform from "timed/transforms/moment"; + +/** + * The django datetime transform + * + * This transforms a django datetime into a moment datetime + * + * @class DjangoDatetimeTransform + * @extends MomentTransform + * @public + */ +export default class DjangoDatetimeTransform extends MomentTransform { + /** + * The date format + * + * @property {String} format + * @public + */ + format = "YYYY-MM-DDTHH:mm:ss.SSSSZ"; +} + +declare module "ember-data/types/registries/transform" { + export default interface TransformRegistry { + "django-datetime": DjangoDatetimeTransform; + } +} diff --git a/frontend/app/transforms/django-duration.ts b/frontend/app/transforms/django-duration.ts new file mode 100644 index 000000000..4d0db9033 --- /dev/null +++ b/frontend/app/transforms/django-duration.ts @@ -0,0 +1,98 @@ +import Transform from "@ember-data/serializer/transform"; +import moment from "moment"; +import { pad2joincolon } from "timed/utils/pad"; +import parseDjangoDuration from "timed/utils/parse-django-duration"; + +const { round } = Math; + +/** + * The django duration transform + * + * This transforms a django duration into a moment duration + * + * Django formats the timedelta like this: `DD HH:MM:ss.uuuuuu`. However, + * days and microseconds are optional. + * + * @see http://www.django-rest-framework.org/api-guide/fields/#durationfield + * @see https://github.com/django/django/blob/main/django/utils/duration.py + * + * @class DjangoDurationTransform + * @extends DS.Transform + * @public + */ +export default class DjangoDurationTransform extends Transform { + /** + * Deserialize the django duration into a moment duration + * + * @method deserialize + * @param {String} serialized The django duration + * @return {moment.duration} The deserialized moment duration + * @public + */ + deserialize(serialized) { + return parseDjangoDuration(serialized); + } + + /** + * Get the duration components from the duration like pythons timedelta does + * it. + * + * This means that a duration of -1 hour becomes a duration of -1 day +23 + * hours, so we never have a negative hour, minute, second or millisecond. + * ONLY days can be negative! + * + * @method _getDurationComponentsTimedeltaLike + * @param {moment.duration} duration The duration to parse + * @returns {Object} An object containing all needed components as number + * @private + */ + _getDurationComponentsTimedeltaLike(duration) { + const days = Math.floor(duration.asDays()); + const milliseconds = Math.abs(moment.duration({ days }) - duration); + + const positiveDuration = moment.duration(milliseconds); + + return { + days, + hours: positiveDuration.hours(), + minutes: positiveDuration.minutes(), + seconds: positiveDuration.seconds(), + microseconds: round(positiveDuration.milliseconds() * 1000), + }; + } + + /** + * Serialize the moment duration into a django duration + * + * @method serialize + * @param {moment.duration} deserialized The moment duration + * @return {String} The serialized django duration + * @public + */ + serialize(deserialized) { + if (!moment.isDuration(deserialized)) { + return null; + } + + const { days, hours, minutes, seconds, microseconds } = + this._getDurationComponentsTimedeltaLike(deserialized); + + let string = pad2joincolon(hours, minutes, seconds); + + if (days) { + string = `${days} ${string}`; + } + + if (microseconds) { + string += `.${String(microseconds).padStart(6, "0")}`; + } + + return string; + } +} + +declare module "ember-data/types/registries/transform" { + export default interface TransformRegistry { + "django-duration": DjangoDurationTransform; + } +} diff --git a/frontend/app/transforms/django-time.ts b/frontend/app/transforms/django-time.ts new file mode 100644 index 000000000..86b26e98c --- /dev/null +++ b/frontend/app/transforms/django-time.ts @@ -0,0 +1,26 @@ +import MomentTransform from "timed/transforms/moment"; + +/** + * The django time transform + * + * This transforms a django time into a moment object + * + * @class DjangoTimeTransform + * @extends MomentTransform + * @public + */ +export default class DjangoTimeTransform extends MomentTransform { + /** + * The time format + * + * @property {String} format + * @public + */ + format = "HH:mm:ss"; +} + +declare module "ember-data/types/registries/transform" { + export default interface TransformRegistry { + "django-time": DjangoTimeTransform; + } +} diff --git a/frontend/app/transforms/django-workdays.ts b/frontend/app/transforms/django-workdays.ts new file mode 100644 index 000000000..a31ebb4a8 --- /dev/null +++ b/frontend/app/transforms/django-workdays.ts @@ -0,0 +1,42 @@ +import Transform from "@ember-data/serializer/transform"; + +/** + * Django worktime transform + * + * This transforms a string like '1,2,3' into an array of numbers + * + * @class DjangoWorktimeTransform + * @extends DS.Transform + * @public + */ +export default class DjangoWorkdaysTransform extends Transform { + /** + * Deserialize the string separated by comma into an array of numbers + * + * @method deserialize + * @param {String} serialized The string + * @return {Number[]} The deserialized array + * @public + */ + deserialize(serialized) { + return serialized.split(",").map(Number); + } + + /** + * Serialize the array of numbers into a string separated by comma + * + * @method serialize + * @param {Number[]} deserialized The number array + * @return {String} The serialized string + * @public + */ + serialize(deserialized) { + return deserialized.join(); + } +} + +declare module "ember-data/types/registries/transform" { + export default interface TransformRegistry { + "django-workdays": DjangoWorkdaysTransform; + } +} diff --git a/frontend/app/transforms/moment.ts b/frontend/app/transforms/moment.ts new file mode 100644 index 000000000..296ce5bca --- /dev/null +++ b/frontend/app/transforms/moment.ts @@ -0,0 +1,53 @@ +import Transform from "@ember-data/serializer/transform"; +import moment from "moment"; + +/** + * The moment transform + * + * This transforms any string into a moment object + * + * @class MomentTransform + * @extends DS.Transform + * @public + */ +export default class MomentTransform extends Transform { + /** + * The default date string format + * + * @property {String} format + * @public + */ + format = moment.defaultFormat; + + /** + * Deserialize the string into a moment object + * + * @method deserialize + * @param {String} serialized The date string + * @return {moment.duration} The deserialized moment object + * @public + */ + deserialize(serialized) { + return serialized ? moment(serialized, this.format) : null; + } + + /** + * Serialize the moment object into a string + * + * @method serialize + * @param {String} deserialized The moment object + * @return {moment.duration} The serialized date string + * @public + */ + serialize(deserialized) { + return deserialized && deserialized.isValid() + ? deserialized.format(this.format) + : null; + } +} + +declare module "ember-data/types/registries/transform" { + export default interface TransformRegistry { + moment: MomentTransform; + } +} diff --git a/frontend/ember-cli-build.js b/frontend/ember-cli-build.js index a83d50b35..e5a16e666 100644 --- a/frontend/ember-cli-build.js +++ b/frontend/ember-cli-build.js @@ -6,20 +6,28 @@ const EmberApp = require("ember-cli/lib/broccoli/ember-app"); module.exports = function (defaults) { const app = new EmberApp(defaults, { + "ember-cli-babel": { + enableTypeScriptTransform: true, + }, + babel: { plugins: [ require.resolve("ember-concurrency/async-arrow-task-transform"), ], }, + sassOptions: { onlyIncluded: true, }, + "ember-fetch": { preferNative: true, }, + "ember-simple-auth": { useSessionSetupMethod: true, }, + "ember-validated-form": { theme: "bootstrap", }, diff --git a/frontend/package.json b/frontend/package.json index f2f7c05f5..7d5e5ce48 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -21,7 +21,8 @@ "lint:js:fix": "eslint --config .eslintrc.js . --fix", "start": "ember server --proxy https://timed.localhost --secure-proxy=false", "test": "concurrently \"npm:lint\" \"npm:test:*\" --names \"lint,test:\"", - "test:ember": "ember test" + "test:ember": "ember test", + "lint:types": "glint" }, "devDependencies": { "@adfinis/eslint-config": "^2.1.1", @@ -42,8 +43,43 @@ "@fortawesome/free-solid-svg-icons": "^6.4.2", "@glimmer/component": "1.1.2", "@glimmer/tracking": "1.1.2", + "@glint/core": "^1.4.0", + "@glint/environment-ember-loose": "^1.4.0", + "@glint/environment-ember-template-imports": "^1.4.0", + "@glint/template": "^1.4.0", "@html-next/vertical-collection": "4.0.2", "@sentry/ember": "^7.98.0", + "@tsconfig/ember": "^3.0.8", + "@types/ember": "^4.0.11", + "@types/ember-data": "^4.4.16", + "@types/ember-data__adapter": "^4.0.6", + "@types/ember-data__model": "^4.0.5", + "@types/ember-data__serializer": "^4.0.6", + "@types/ember-data__store": "^4.0.7", + "@types/ember__application": "^4.0.11", + "@types/ember__array": "^4.0.10", + "@types/ember__component": "^4.0.22", + "@types/ember__controller": "^4.0.12", + "@types/ember__debug": "^4.0.8", + "@types/ember__destroyable": "^4.0.5", + "@types/ember__engine": "^4.0.11", + "@types/ember__error": "^4.0.6", + "@types/ember__helper": "^4.0.8", + "@types/ember__modifier": "^4.0.9", + "@types/ember__object": "^4.0.12", + "@types/ember__owner": "^4.0.9", + "@types/ember__polyfills": "^4.0.6", + "@types/ember__routing": "^4.0.22", + "@types/ember__runloop": "^4.0.10", + "@types/ember__service": "^4.0.9", + "@types/ember__string": "^3.0.15", + "@types/ember__template": "^4.0.7", + "@types/ember__test": "^4.0.6", + "@types/ember__utils": "^4.0.7", + "@types/qunit": "^2.19.10", + "@types/rsvp": "^4.0.9", + "@typescript-eslint/eslint-plugin": "^8.6.0", + "@typescript-eslint/parser": "^8.6.0", "broccoli-asset-rev": "^3.0.0", "broccoli-funnel": "^3.0.8", "concurrently": "^8.0.1", @@ -125,6 +161,7 @@ "stylelint-scss": "^6.3.0", "tracked-built-ins": "3.1.1", "tracked-toolbox": "2.0.0", + "typescript": "^5.6.2", "webpack": "5.92.1" }, "engines": { @@ -143,7 +180,11 @@ "allowAny": [ "marked" ] + }, + "overrides": { + "@glimmer/manager": ">= 0.84.3", + "@glimmer/validator": ">= 0.84.3" } }, "packageManager": "pnpm@9.5.0-beta.0+sha512.c2e60e7ed04e459591c982f2760cd8f7d1f48fe1ca4d46ccbbf8377df1eb2d077ace1e9d334b06250dddf23c03b4562858f77992b9a3bb4a93355aefd173df32" -} \ No newline at end of file +} diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index ebb84ee46..78d380c7e 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -4,13 +4,17 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + '@glimmer/manager': '>= 0.84.3' + '@glimmer/validator': '>= 0.84.3' + importers: .: devDependencies: '@adfinis/eslint-config': specifier: ^2.1.1 - version: 2.1.1(@babel/core@7.22.9)(@babel/eslint-parser@7.21.3(@babel/core@7.22.9)(eslint@8.46.0))(@babel/plugin-proposal-decorators@7.24.7(@babel/core@7.22.9))(eslint-config-prettier@8.8.0(eslint@8.46.0))(eslint-plugin-ember@11.12.0(eslint@8.46.0))(eslint-plugin-import@2.28.1(eslint@8.46.0))(eslint-plugin-n@15.7.0(eslint@8.46.0))(eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0(eslint@8.46.0))(eslint@8.46.0)(prettier@2.8.8))(eslint-plugin-qunit@7.3.4(eslint@8.46.0))(eslint@8.46.0)(prettier@2.8.8) + version: 2.1.1(@babel/core@7.22.9)(@babel/eslint-parser@7.21.3(@babel/core@7.22.9)(eslint@8.46.0))(@babel/plugin-proposal-decorators@7.24.7(@babel/core@7.22.9))(eslint-config-prettier@8.8.0(eslint@8.46.0))(eslint-plugin-ember@11.12.0(eslint@8.46.0))(eslint-plugin-import@2.28.1(@typescript-eslint/parser@8.6.0(eslint@8.46.0)(typescript@5.6.2))(eslint@8.46.0))(eslint-plugin-n@15.7.0(eslint@8.46.0))(eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0(eslint@8.46.0))(eslint@8.46.0)(prettier@2.8.8))(eslint-plugin-qunit@7.3.4(eslint@8.46.0))(eslint@8.46.0)(prettier@2.8.8) '@apollo/client': specifier: 3.8.6 version: 3.8.6(graphql@16.8.1) @@ -34,13 +38,13 @@ importers: version: 3.1.1 '@ember/test-helpers': specifier: 2.9.3 - version: 2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + version: 2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) '@embroider/macros': specifier: ^1.13.1 version: 1.16.5(@glint/template@1.4.0) '@embroider/util': specifier: ^1.12.0 - version: 1.13.1(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + version: 1.13.1(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) '@fontsource/source-sans-pro': specifier: 4.5.11 version: 4.5.11 @@ -62,12 +66,117 @@ importers: '@glimmer/tracking': specifier: 1.1.2 version: 1.1.2 + '@glint/core': + specifier: ^1.4.0 + version: 1.4.0(typescript@5.6.2) + '@glint/environment-ember-loose': + specifier: ^1.4.0 + version: 1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))) + '@glint/environment-ember-template-imports': + specifier: ^1.4.0 + version: 1.4.0(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__helper@4.0.8(@babel/core@7.22.9))(@types/ember__modifier@4.0.9(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9)) + '@glint/template': + specifier: ^1.4.0 + version: 1.4.0 '@html-next/vertical-collection': specifier: 4.0.2 version: 4.0.2 '@sentry/ember': specifier: ^7.98.0 version: 7.118.0(@glint/template@1.4.0)(webpack@5.92.1) + '@tsconfig/ember': + specifier: ^3.0.8 + version: 3.0.8 + '@types/ember': + specifier: ^4.0.11 + version: 4.0.11(@babel/core@7.22.9) + '@types/ember-data': + specifier: ^4.4.16 + version: 4.4.16(@babel/core@7.22.9) + '@types/ember-data__adapter': + specifier: ^4.0.6 + version: 4.0.6(@babel/core@7.22.9) + '@types/ember-data__model': + specifier: ^4.0.5 + version: 4.0.5(@babel/core@7.22.9) + '@types/ember-data__serializer': + specifier: ^4.0.6 + version: 4.0.6(@babel/core@7.22.9) + '@types/ember-data__store': + specifier: ^4.0.7 + version: 4.0.7(@babel/core@7.22.9) + '@types/ember__application': + specifier: ^4.0.11 + version: 4.0.11(@babel/core@7.22.9) + '@types/ember__array': + specifier: ^4.0.10 + version: 4.0.10(@babel/core@7.22.9) + '@types/ember__component': + specifier: ^4.0.22 + version: 4.0.22(@babel/core@7.22.9) + '@types/ember__controller': + specifier: ^4.0.12 + version: 4.0.12(@babel/core@7.22.9) + '@types/ember__debug': + specifier: ^4.0.8 + version: 4.0.8(@babel/core@7.22.9) + '@types/ember__destroyable': + specifier: ^4.0.5 + version: 4.0.5 + '@types/ember__engine': + specifier: ^4.0.11 + version: 4.0.11(@babel/core@7.22.9) + '@types/ember__error': + specifier: ^4.0.6 + version: 4.0.6 + '@types/ember__helper': + specifier: ^4.0.8 + version: 4.0.8(@babel/core@7.22.9) + '@types/ember__modifier': + specifier: ^4.0.9 + version: 4.0.9(@babel/core@7.22.9) + '@types/ember__object': + specifier: ^4.0.12 + version: 4.0.12(@babel/core@7.22.9) + '@types/ember__owner': + specifier: ^4.0.9 + version: 4.0.9 + '@types/ember__polyfills': + specifier: ^4.0.6 + version: 4.0.6 + '@types/ember__routing': + specifier: ^4.0.22 + version: 4.0.22(@babel/core@7.22.9) + '@types/ember__runloop': + specifier: ^4.0.10 + version: 4.0.10(@babel/core@7.22.9) + '@types/ember__service': + specifier: ^4.0.9 + version: 4.0.9(@babel/core@7.22.9) + '@types/ember__string': + specifier: ^3.0.15 + version: 3.0.15 + '@types/ember__template': + specifier: ^4.0.7 + version: 4.0.7 + '@types/ember__test': + specifier: ^4.0.6 + version: 4.0.6(@babel/core@7.22.9) + '@types/ember__utils': + specifier: ^4.0.7 + version: 4.0.7(@babel/core@7.22.9) + '@types/qunit': + specifier: ^2.19.10 + version: 2.19.10 + '@types/rsvp': + specifier: ^4.0.9 + version: 4.0.9 + '@typescript-eslint/eslint-plugin': + specifier: ^8.6.0 + version: 8.6.0(@typescript-eslint/parser@8.6.0(eslint@8.46.0)(typescript@5.6.2))(eslint@8.46.0)(typescript@5.6.2) + '@typescript-eslint/parser': + specifier: ^8.6.0 + version: 8.6.0(eslint@8.46.0)(typescript@5.6.2) broccoli-asset-rev: specifier: ^3.0.0 version: 3.0.0 @@ -85,7 +194,7 @@ importers: version: 2.7.4(@glint/template@1.4.0)(webpack@5.92.1) ember-basic-dropdown: specifier: ^8.2.0 - version: 8.2.0(@ember/string@3.1.1)(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + version: 8.2.0(iiwnxvgjf2o7m2x6rb3pedhjre) ember-can: specifier: 4.2.0 version: 4.2.0 @@ -124,7 +233,7 @@ importers: version: 2.1.0 ember-cli-mirage: specifier: ^3.0.0 - version: 3.0.3(v25oimjh6f57n7utzp4lxy4uye) + version: 3.0.3(k3fuotcktandt4x7arunel64ma) ember-cli-nouislider: specifier: derrabauke/ember-cli-nouislider#cf0d87986cf25d5795e1edd6c8b9f008c5b39872 version: https://codeload.github.com/derrabauke/ember-cli-nouislider/tar.gz/cf0d87986cf25d5795e1edd6c8b9f008c5b39872 @@ -178,16 +287,16 @@ importers: version: 7.0.0 ember-power-calendar: specifier: ^1.0.2 - version: 1.1.0(@babel/core@7.22.9)(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-concurrency@4.0.2(@babel/core@7.22.9)(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + version: 1.1.0(6tk3uxl3ogw7dn6fq4ufzf4bhm) ember-power-calendar-moment: specifier: ^1.0.2 - version: 1.0.2(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-power-calendar@1.1.0(@babel/core@7.22.9)(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-concurrency@4.0.2(@babel/core@7.22.9)(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(moment-timezone@0.5.45)(moment@2.30.1) + version: 1.0.2(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-power-calendar@1.1.0(6tk3uxl3ogw7dn6fq4ufzf4bhm))(moment-timezone@0.5.45)(moment@2.30.1) ember-power-select: specifier: ^8.3.0 - version: 8.3.0(fmdhslceguiv4ekgl3vuztw5xq) + version: 8.3.0(jznhez6bdfxkcebwcgs7mem6my) ember-qunit: specifier: 6.2.0 - version: 6.2.0(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(qunit@2.19.4)(webpack@5.92.1) + version: 6.2.0(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(qunit@2.19.4)(webpack@5.92.1) ember-resolver: specifier: 10.0.0 version: 10.0.0(@ember/string@3.1.1)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) @@ -202,10 +311,10 @@ importers: version: 15.0.0(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(webpack@5.92.1) ember-simple-auth: specifier: 6.0.0 - version: 6.0.0(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glint/template@1.4.0) + version: 6.0.0(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glint/template@1.4.0) ember-simple-auth-oidc: specifier: 6.0.1 - version: 6.0.1(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(encoding@0.1.13)(graphql@16.8.1)(webpack@5.92.1) + version: 6.0.1(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(encoding@0.1.13)(graphql@16.8.1)(webpack@5.92.1) ember-sinon-qunit: specifier: ^6.0.0 version: 6.0.0 @@ -229,7 +338,7 @@ importers: version: 3.1.1 ember-validated-form: specifier: 6.2.0 - version: 6.2.0(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-data@4.12.8(@babel/core@7.22.9)(@ember/string@3.1.1)(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(webpack@5.92.1))(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(webpack@5.92.1) + version: 6.2.0(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-data@4.12.8(@babel/core@7.22.9)(@ember/string@3.1.1)(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(webpack@5.92.1))(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(webpack@5.92.1) eslint: specifier: 8.46.0 version: 8.46.0 @@ -241,7 +350,7 @@ importers: version: 11.12.0(eslint@8.46.0) eslint-plugin-import: specifier: 2.28.1 - version: 2.28.1(eslint@8.46.0) + version: 2.28.1(@typescript-eslint/parser@8.6.0(eslint@8.46.0)(typescript@5.6.2))(eslint@8.46.0) eslint-plugin-n: specifier: 15.7.0 version: 15.7.0(eslint@8.46.0) @@ -292,25 +401,28 @@ importers: version: 6.2.7 stylelint: specifier: ^16.4.0 - version: 16.6.1(typescript@5.5.2) + version: 16.6.1(typescript@5.6.2) stylelint-config-standard: specifier: ^32.0.0 - version: 32.0.0(stylelint@16.6.1(typescript@5.5.2)) + version: 32.0.0(stylelint@16.6.1(typescript@5.6.2)) stylelint-config-standard-scss: specifier: ^13.1.0 - version: 13.1.0(postcss@8.4.39)(stylelint@16.6.1(typescript@5.5.2)) + version: 13.1.0(postcss@8.4.39)(stylelint@16.6.1(typescript@5.6.2)) stylelint-prettier: specifier: ^3.0.0 - version: 3.0.0(prettier@2.8.8)(stylelint@16.6.1(typescript@5.5.2)) + version: 3.0.0(prettier@2.8.8)(stylelint@16.6.1(typescript@5.6.2)) stylelint-scss: specifier: ^6.3.0 - version: 6.3.2(stylelint@16.6.1(typescript@5.5.2)) + version: 6.3.2(stylelint@16.6.1(typescript@5.6.2)) tracked-built-ins: specifier: 3.1.1 version: 3.1.1 tracked-toolbox: specifier: 2.0.0 version: 2.0.0(@babel/core@7.22.9)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + typescript: + specifier: ^5.6.2 + version: 5.6.2 webpack: specifier: 5.92.1 version: 5.92.1 @@ -1433,9 +1545,6 @@ packages: '@glimmer/util@0.84.3': resolution: {integrity: sha512-qFkh6s16ZSRuu2rfz3T4Wp0fylFj3HBsONGXQcrAdZjdUaIS6v3pNj6mecJ71qRgcym9Hbaq/7/fefIwECUiKw==} - '@glimmer/validator@0.44.0': - resolution: {integrity: sha512-i01plR0EgFVz69GDrEuFgq1NheIjZcyTy3c7q+w7d096ddPVeVcRzU3LKaqCfovvLJ+6lJx40j45ecycASUUyw==} - '@glimmer/validator@0.84.3': resolution: {integrity: sha512-RTBV4TokUB0vI31UC7ikpV7lOYpWUlyqaKV//pRC4pexYMlmqnVhkFrdiimB/R1XyNdUOQUmnIAcdic39NkbhQ==} @@ -1451,6 +1560,59 @@ packages: '@glimmer/wire-format@0.84.3': resolution: {integrity: sha512-aZVfQhqv4k7tTo2vwjy+b4mAxKt7cHH75JR3zAeCilimApa+yYTYUyY73NDNSUVbelgAlQ5s6vTiMSQ55WwVow==} + '@glint/core@1.4.0': + resolution: {integrity: sha512-nq27a/1R6kc3lsuciz8z9IZO1NQCbNkEBxf5KJI7AUrnps6RzQzmq3pmwO24zQYmFcH4sqpod8fleNIpg8YEqg==} + hasBin: true + peerDependencies: + typescript: '>=4.8.0' + + '@glint/environment-ember-loose@1.4.0': + resolution: {integrity: sha512-vFR3qgPTisGzS36e04195wTUrtUc6GuVwm6hsC/XXx6PeRw/6rtMxhK08Aw/VtDc00UqQzM9sIEghPVKHwqVVQ==} + peerDependencies: + '@glimmer/component': ^1.1.2 + '@glint/template': ^1.4.0 + '@types/ember__array': ^4.0.2 + '@types/ember__component': ^4.0.10 + '@types/ember__controller': ^4.0.2 + '@types/ember__object': ^4.0.4 + '@types/ember__routing': ^4.0.11 + ember-cli-htmlbars: ^6.0.1 + ember-modifier: ^3.2.7 || ^4.0.0 + peerDependenciesMeta: + '@types/ember__array': + optional: true + '@types/ember__component': + optional: true + '@types/ember__controller': + optional: true + '@types/ember__object': + optional: true + '@types/ember__routing': + optional: true + ember-cli-htmlbars: + optional: true + ember-modifier: + optional: true + + '@glint/environment-ember-template-imports@1.4.0': + resolution: {integrity: sha512-VXcUgea92l7NFShU26rpQn+hYUZ7ex/rNtU9vnw2BAVZaPfxZROokW8ABj8aMaCUDe60CoMVZ1/QSeONSCln3w==} + peerDependencies: + '@glint/environment-ember-loose': ^1.4.0 + '@glint/template': ^1.4.0 + '@types/ember__component': ^4.0.10 + '@types/ember__helper': ^4.0.1 + '@types/ember__modifier': ^4.0.3 + '@types/ember__routing': ^4.0.12 + peerDependenciesMeta: + '@types/ember__component': + optional: true + '@types/ember__helper': + optional: true + '@types/ember__modifier': + optional: true + '@types/ember__routing': + optional: true + '@glint/template@1.4.0': resolution: {integrity: sha512-yD271NhLei/HSQ6utm6hKgoU+B5D5DY+B1irPvgI4KsDEcZI7v/INf5HAMJfzCg92bP1sIxSOuXu5DU6VsY7Mw==} @@ -1629,6 +1791,9 @@ packages: '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@tsconfig/ember@3.0.8': + resolution: {integrity: sha512-OVnIsZIt/8q0VEtcdz3rRryNrm6gdJTxXlxefkGIrkZnME0wqslmwHlUEZ7mvh377df9FqBhNKrYNarhCW8zJA==} + '@types/acorn@4.0.6': resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} @@ -1654,6 +1819,84 @@ packages: '@types/cors@2.8.17': resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + '@types/ember-data@4.4.16': + resolution: {integrity: sha512-plFqPkgw7n4YlkzvApkQAIhvvYTERlx8PeI2J5gSFtMtsKuoaIo8fXm4w22ZdBQtTzeh/kwvpO2WY8R/d5Ttfg==} + + '@types/ember-data__adapter@4.0.6': + resolution: {integrity: sha512-vSrx1cqz8jO0cBYwu98SrwFk5s722C+BGpw++NregwQio3g9VbNoymx+HsYeXvsWvGUsoRewxu9K7TwAOJSsvw==} + + '@types/ember-data__model@4.0.5': + resolution: {integrity: sha512-zyfHh3tQiMdpbPZ1/RFxi4m9TdwsZxDmVY0e7V1UYp7pWvm/DeqEXqoy3WS9xa/O01xoJFpQtJHyasdXvVTfbg==} + + '@types/ember-data__serializer@4.0.6': + resolution: {integrity: sha512-ebxxySSvTiay1/hgN4fElahSuL0MX+1sMMwx/RQyy7z98ifV8wafW62BwlYtbH44aeTIdcaSBE2pm3R1aP2yUA==} + + '@types/ember-data__store@4.0.7': + resolution: {integrity: sha512-0S3Etr32i4aGvhXhZM6CXaosvX8E6c+RCx8pCxUXVdn+SmICm8jqFXsDC6Gnqq4bJeTkf9cglqz46prOVR1Tcg==} + + '@types/ember@4.0.11': + resolution: {integrity: sha512-v7VIex0YILK8fP87LkIfzeeYKNnu74+xwf6U56v6MUDDGfSs9q/6NCxiUfwkxD+z5nQiUcwvfKVokX8qzZFRLw==} + + '@types/ember__application@4.0.11': + resolution: {integrity: sha512-U1S7XW0V70nTWbFckWoraJbYGBJK69muP/CsPFLeAuUYHfkkDiwh1SfqgAUN9aHtrEJM5SuSYVYp2YsTI2yLuA==} + + '@types/ember__array@4.0.10': + resolution: {integrity: sha512-UrhDbopLI3jB0MqV14y8yji2IuPNmeDrtT1PRYJL4CThLHrRkfeYyFvxqvrxWxn0wXKjbbjfH1gOe7BU57QrLQ==} + + '@types/ember__component@4.0.22': + resolution: {integrity: sha512-m72EtmBN/RxOChXqRsyOg4RR5+AiB4LQ8s1CEKNYAfvANt18m4hjqxtA7QZYLTq2ZjEVJGpdMsrdDuONWjwRSQ==} + + '@types/ember__controller@4.0.12': + resolution: {integrity: sha512-80rdnSC0UJBqoUX5/vkQcM2xkRdTPTvY0dPXEfY5cC5OZITbcSeRo5qa7ZGhgNBfH6XYyh55Lo/b811LwU3N9w==} + + '@types/ember__debug@4.0.8': + resolution: {integrity: sha512-9wF7STmDHDsUxSjyCq2lpMq/03QOPkBQMGJnV8yOBnVZxB6f+FJH/kxaCprdMkUe7iwAPNEC2zrFFx1tzH75Kg==} + + '@types/ember__destroyable@4.0.5': + resolution: {integrity: sha512-spJyZxpvecssbXkaOQYcbnlWgb+TasFaKrgAYVbykZY6saMwUdMOGDDoW6uP/y/+A8Jj/fUIatPWJLepeSfgww==} + + '@types/ember__engine@4.0.11': + resolution: {integrity: sha512-ryR4Q1Xm3kQ3Ap58w10CxV3+vb3hs1cJqi7UZ5IlSdLRql7AbpS6hIjxSQ3EQ4zadeeJ6/D8JJcSwqR7eX3PFA==} + + '@types/ember__error@4.0.6': + resolution: {integrity: sha512-vYrLaGGjHkN14K89Vm8yqB2mkpJQefE5w7QJkkgYyV+smzns1vKlPbvuFevRtoeYNn4u4yY0JyF7HceNkm3H0Q==} + + '@types/ember__helper@4.0.8': + resolution: {integrity: sha512-IhHkZHmwPx7zjabIr315qpQwgje+ASq5y6If1ZtRSwjm/0rL2Qa9FQu+h4cYW5jWdn2ptJ1pZZJTCe2uEVxsIQ==} + + '@types/ember__modifier@4.0.9': + resolution: {integrity: sha512-npIlSh17198HHKKGtuVkhkGNKnFYJ4hpyy5ttmIEsPIm5N2zuNkl5YJd70i6j2ePLyKxpdfKz1GZqbJkrtTuVg==} + + '@types/ember__object@4.0.12': + resolution: {integrity: sha512-ZEpikPjZ02m1QCBiTPTayMJwVwF4UBlHlGDoScRB3IP/SUS1O5mmn1/CnSQDxzzF3ctfmhNuTZzVBBc1Y8OC1A==} + + '@types/ember__owner@4.0.9': + resolution: {integrity: sha512-iyBda4aUIjBmeiKTKmPow/EJO7xWn8m85CnQTOCqQzTWJyJpgfObbXSHahOHXOfMm279Oa5NlbmS/EontB+XiQ==} + + '@types/ember__polyfills@4.0.6': + resolution: {integrity: sha512-hbds3Qv+oVm/QKIaY1E6atvrCoJTH/MPSl4swOhX6P0RiMB2fOfFCrFSD1mP1KrU1LqpHJ2Rzs7XLe53SWVzgw==} + + '@types/ember__routing@4.0.22': + resolution: {integrity: sha512-qLk9Vd2GMxdlGmX9xbzg4Farths+AQGzYDH901Wo2Nsre+Cwv1Tk1rbCiay2V3ICYZYufytdWT6V++DISF3nvw==} + + '@types/ember__runloop@4.0.10': + resolution: {integrity: sha512-9MZfOJBXuUP7RqLjovmzy1yY2xKTxVpqHMapqy6QJ8mjAekRmq9IJ+ni2zJ5CWftyb3Lqu3Eks05CL7fnbhcJA==} + + '@types/ember__service@4.0.9': + resolution: {integrity: sha512-DrepocL/4hH5YxbDWbxEKMDcAchBPSGGa4g+LEINW1Po81RmSdKw5GZV4UO0mvRWgkdu3EbWUxbTzB4gmbDSeQ==} + + '@types/ember__string@3.0.15': + resolution: {integrity: sha512-SxoaweAJUJKSIt82clIwpi/Fm0IfeisozLnXthnBp/hE2JyVcnOb1wMIbw0CCfzercmyWG1njV45VBqy8SrLDQ==} + + '@types/ember__template@4.0.7': + resolution: {integrity: sha512-jv4hhG+8d1zdma+jhbCdJ3Ak7C22YNatGyWWvB3N9zbXq358AAPXaJoyNY8QTDbD/RIR9P6yoRk4u9vLbF6zfA==} + + '@types/ember__test@4.0.6': + resolution: {integrity: sha512-Nswm/epfTepXknT8scZvWyyop1aqJcZcyzY4THGHFcXvYQQfA9rgmgrx6vo9vCJmYHh3jm0TTAIAIfoCvGaX5g==} + + '@types/ember__utils@4.0.7': + resolution: {integrity: sha512-qQPBeWRyIPigKnZ68POlkqI5e6XA78Q4G3xHo687wQTcEtfoL/iZyPC4hn70mdijcZq8Hjch2Y3E5yhsEMzK+g==} + '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -1714,6 +1957,9 @@ packages: '@types/qs@6.9.15': resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + '@types/qunit@2.19.10': + resolution: {integrity: sha512-gVB+rxvxmbyPFWa6yjjKgcumWal3hyqoTXI0Oil161uWfo1OCzWZ/rnEumsx+6uVgrwPrCrhpQbLkzfildkSbg==} + '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -1723,6 +1969,9 @@ packages: '@types/rimraf@2.0.5': resolution: {integrity: sha512-YyP+VfeaqAyFmXoTh3HChxOQMyjByRMsHU7kc5KOJkSlXudhMhQIALbYV7rHh/l8d2lX3VUQzprrcAgWdRuU8g==} + '@types/rsvp@4.0.9': + resolution: {integrity: sha512-F6vaN5mbxw2MBCu/AD9fSKwrhnto2pE77dyUsi415qz9IP9ni9ZOWXHxnXfsM4NW9UjW+it189jvvqnhv37Z7Q==} + '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} @@ -1735,6 +1984,63 @@ packages: '@types/ungap__structured-clone@0.3.3': resolution: {integrity: sha512-RNmhIPwoip6K/zZOv3ypksTAqaqLEXvlNSXKyrC93xMSOAHZCR7PifW6xKZCwkbbnbM9dwB9X56PPoNTlNwEqw==} + '@typescript-eslint/eslint-plugin@8.6.0': + resolution: {integrity: sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@8.6.0': + resolution: {integrity: sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@8.6.0': + resolution: {integrity: sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.6.0': + resolution: {integrity: sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@8.6.0': + resolution: {integrity: sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.6.0': + resolution: {integrity: sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@8.6.0': + resolution: {integrity: sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + '@typescript-eslint/visitor-keys@8.6.0': + resolution: {integrity: sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@0.3.4': resolution: {integrity: sha512-TSVh8CpnwNAsPC5wXcIyh92Bv1gq6E9cNDeeLu7Z4h8V4/qWtXJp7y42qljRkqcpmsve1iozwv1wr+3BNdILCg==} @@ -3010,6 +3316,9 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} + content-tag@2.0.1: + resolution: {integrity: sha512-jxsETSDs5NbNwyiDuIp672fUMhUyu8Qxc5MOBOJOcgW/fQESI6o5K1LBDrnEE7Bh810a685lWEZHTF4jQYGEEw==} + content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -4427,7 +4736,7 @@ packages: resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} engines: {node: '>= 4.0'} os: [darwin] - deprecated: The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2 + deprecated: Upgrade to fsevents v2 to mitigate potential security issues fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -5557,6 +5866,10 @@ packages: resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -7250,6 +7563,12 @@ packages: resolution: {integrity: sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==} engines: {node: '>=0.10.0'} + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + ts-invariant@0.10.3: resolution: {integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==} engines: {node: '>=8'} @@ -7315,8 +7634,8 @@ packages: typescript-memoize@1.1.1: resolution: {integrity: sha512-GQ90TcKpIH4XxYTI2F98yEQYZgjNMOGPpOgdjIBhaLaWji5HPWlRnZ4AeA1hfBxtY7bCGDJsqDDHk/KaHOl5bA==} - typescript@5.5.2: - resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} + typescript@5.6.2: + resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} engines: {node: '>=14.17'} hasBin: true @@ -7466,6 +7785,26 @@ packages: vm-browserify@1.1.2: resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + vscode-jsonrpc@8.1.0: + resolution: {integrity: sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.3: + resolution: {integrity: sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.3: + resolution: {integrity: sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==} + + vscode-languageserver@8.1.0: + resolution: {integrity: sha512-eUt8f1z2N2IEUDBsKaNapkz7jl5QpskN2Y0G01T/ItMxBxw1fJwvtySGB9QMecatne8jFIWJGWI61dWjyTLQsw==} + hasBin: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + walk-sync@0.2.7: resolution: {integrity: sha512-OH8GdRMowEFr0XSHQeX5fGweO6zSVHo7bG/0yJQx6LAj9Oukz0C8heI3/FYectT66gY0IPGe89kOvU410/UNpg==} @@ -7665,14 +8004,14 @@ packages: snapshots: - '@adfinis/eslint-config@2.1.1(@babel/core@7.22.9)(@babel/eslint-parser@7.21.3(@babel/core@7.22.9)(eslint@8.46.0))(@babel/plugin-proposal-decorators@7.24.7(@babel/core@7.22.9))(eslint-config-prettier@8.8.0(eslint@8.46.0))(eslint-plugin-ember@11.12.0(eslint@8.46.0))(eslint-plugin-import@2.28.1(eslint@8.46.0))(eslint-plugin-n@15.7.0(eslint@8.46.0))(eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0(eslint@8.46.0))(eslint@8.46.0)(prettier@2.8.8))(eslint-plugin-qunit@7.3.4(eslint@8.46.0))(eslint@8.46.0)(prettier@2.8.8)': + '@adfinis/eslint-config@2.1.1(@babel/core@7.22.9)(@babel/eslint-parser@7.21.3(@babel/core@7.22.9)(eslint@8.46.0))(@babel/plugin-proposal-decorators@7.24.7(@babel/core@7.22.9))(eslint-config-prettier@8.8.0(eslint@8.46.0))(eslint-plugin-ember@11.12.0(eslint@8.46.0))(eslint-plugin-import@2.28.1(@typescript-eslint/parser@8.6.0(eslint@8.46.0)(typescript@5.6.2))(eslint@8.46.0))(eslint-plugin-n@15.7.0(eslint@8.46.0))(eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0(eslint@8.46.0))(eslint@8.46.0)(prettier@2.8.8))(eslint-plugin-qunit@7.3.4(eslint@8.46.0))(eslint@8.46.0)(prettier@2.8.8)': dependencies: '@babel/core': 7.22.9 '@babel/eslint-parser': 7.21.3(@babel/core@7.22.9)(eslint@8.46.0) '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.22.9) eslint: 8.46.0 eslint-config-prettier: 8.8.0(eslint@8.46.0) - eslint-plugin-import: 2.28.1(eslint@8.46.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@8.6.0(eslint@8.46.0)(typescript@5.6.2))(eslint@8.46.0) eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.8.0(eslint@8.46.0))(eslint@8.46.0)(prettier@2.8.8) prettier: 2.8.8 optionalDependencies: @@ -9610,11 +9949,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))': + '@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))': dependencies: '@ember/test-waiters': 3.1.0 '@embroider/macros': 1.16.5(@glint/template@1.4.0) - '@embroider/util': 1.13.1(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + '@embroider/util': 1.13.1(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) broccoli-debug: 0.6.5 broccoli-funnel: 3.0.8 ember-cli-babel: 7.26.11 @@ -9686,24 +10025,26 @@ snapshots: transitivePeerDependencies: - supports-color - '@embroider/util@1.13.1(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))': + '@embroider/util@1.13.1(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))': dependencies: '@embroider/macros': 1.16.5(@glint/template@1.4.0) broccoli-funnel: 3.0.8 ember-cli-babel: 7.26.11 ember-source: 5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1) optionalDependencies: + '@glint/environment-ember-loose': 1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))) '@glint/template': 1.4.0 transitivePeerDependencies: - supports-color - '@embroider/util@1.13.2(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))': + '@embroider/util@1.13.2(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))': dependencies: '@embroider/macros': 1.16.5(@glint/template@1.4.0) broccoli-funnel: 3.0.8 ember-cli-babel: 7.26.11 ember-source: 5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1) optionalDependencies: + '@glint/environment-ember-loose': 1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))) '@glint/template': 1.4.0 transitivePeerDependencies: - supports-color @@ -9928,7 +10269,7 @@ snapshots: '@glimmer/tracking@1.1.2': dependencies: '@glimmer/env': 0.1.7 - '@glimmer/validator': 0.44.0 + '@glimmer/validator': 0.84.3 '@glimmer/util@0.27.0': {} @@ -9940,8 +10281,6 @@ snapshots: '@glimmer/interfaces': 0.84.3 '@simple-dom/interface': 1.4.0 - '@glimmer/validator@0.44.0': {} - '@glimmer/validator@0.84.3': dependencies: '@glimmer/env': 0.1.7 @@ -9967,6 +10306,45 @@ snapshots: '@glimmer/interfaces': 0.84.3 '@glimmer/util': 0.84.3 + '@glint/core@1.4.0(typescript@5.6.2)': + dependencies: + '@glimmer/syntax': 0.84.3 + escape-string-regexp: 4.0.0 + semver: 7.6.2 + silent-error: 1.1.1 + typescript: 5.6.2 + uuid: 8.3.2 + vscode-languageserver: 8.1.0 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + '@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))': + dependencies: + '@glimmer/component': 1.1.2(@babel/core@7.22.9) + '@glint/template': 1.4.0 + optionalDependencies: + '@types/ember__array': 4.0.10(@babel/core@7.22.9) + '@types/ember__component': 4.0.22(@babel/core@7.22.9) + '@types/ember__controller': 4.0.12(@babel/core@7.22.9) + '@types/ember__object': 4.0.12(@babel/core@7.22.9) + '@types/ember__routing': 4.0.22(@babel/core@7.22.9) + ember-cli-htmlbars: 6.3.0 + ember-modifier: 4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + + '@glint/environment-ember-template-imports@1.4.0(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__helper@4.0.8(@babel/core@7.22.9))(@types/ember__modifier@4.0.9(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))': + dependencies: + '@glint/environment-ember-loose': 1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))) + '@glint/template': 1.4.0 + content-tag: 2.0.1 + optionalDependencies: + '@types/ember__component': 4.0.22(@babel/core@7.22.9) + '@types/ember__helper': 4.0.8(@babel/core@7.22.9) + '@types/ember__modifier': 4.0.9(@babel/core@7.22.9) + '@types/ember__routing': 4.0.22(@babel/core@7.22.9) + '@glint/template@1.4.0': {} '@graphql-typed-document-node/core@3.2.0(graphql@16.8.1)': @@ -10189,6 +10567,8 @@ snapshots: '@socket.io/component-emitter@3.1.2': {} + '@tsconfig/ember@3.0.8': {} + '@types/acorn@4.0.6': dependencies: '@types/estree': 1.0.5 @@ -10220,6 +10600,193 @@ snapshots: dependencies: '@types/node': 20.14.9 + '@types/ember-data@4.4.16(@babel/core@7.22.9)': + dependencies: + '@types/ember': 4.0.11(@babel/core@7.22.9) + '@types/ember__error': 4.0.6 + '@types/ember__object': 4.0.12(@babel/core@7.22.9) + '@types/rsvp': 4.0.9 + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@types/ember-data__adapter@4.0.6(@babel/core@7.22.9)': + dependencies: + '@types/ember-data': 4.4.16(@babel/core@7.22.9) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@types/ember-data__model@4.0.5(@babel/core@7.22.9)': + dependencies: + '@types/ember-data': 4.4.16(@babel/core@7.22.9) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@types/ember-data__serializer@4.0.6(@babel/core@7.22.9)': + dependencies: + '@types/ember-data': 4.4.16(@babel/core@7.22.9) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@types/ember-data__store@4.0.7(@babel/core@7.22.9)': + dependencies: + '@types/ember-data': 4.4.16(@babel/core@7.22.9) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@types/ember@4.0.11(@babel/core@7.22.9)': + dependencies: + '@types/ember__application': 4.0.11(@babel/core@7.22.9) + '@types/ember__array': 4.0.10(@babel/core@7.22.9) + '@types/ember__component': 4.0.22(@babel/core@7.22.9) + '@types/ember__controller': 4.0.12(@babel/core@7.22.9) + '@types/ember__debug': 4.0.8(@babel/core@7.22.9) + '@types/ember__engine': 4.0.11(@babel/core@7.22.9) + '@types/ember__error': 4.0.6 + '@types/ember__object': 4.0.12(@babel/core@7.22.9) + '@types/ember__polyfills': 4.0.6 + '@types/ember__routing': 4.0.22(@babel/core@7.22.9) + '@types/ember__runloop': 4.0.10(@babel/core@7.22.9) + '@types/ember__service': 4.0.9(@babel/core@7.22.9) + '@types/ember__string': 3.0.15 + '@types/ember__template': 4.0.7 + '@types/ember__test': 4.0.6(@babel/core@7.22.9) + '@types/ember__utils': 4.0.7(@babel/core@7.22.9) + '@types/rsvp': 4.0.9 + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@types/ember__application@4.0.11(@babel/core@7.22.9)': + dependencies: + '@glimmer/component': 1.1.2(@babel/core@7.22.9) + '@types/ember': 4.0.11(@babel/core@7.22.9) + '@types/ember__engine': 4.0.11(@babel/core@7.22.9) + '@types/ember__object': 4.0.12(@babel/core@7.22.9) + '@types/ember__owner': 4.0.9 + '@types/ember__routing': 4.0.22(@babel/core@7.22.9) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@types/ember__array@4.0.10(@babel/core@7.22.9)': + dependencies: + '@types/ember': 4.0.11(@babel/core@7.22.9) + '@types/ember__object': 4.0.12(@babel/core@7.22.9) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@types/ember__component@4.0.22(@babel/core@7.22.9)': + dependencies: + '@types/ember': 4.0.11(@babel/core@7.22.9) + '@types/ember__object': 4.0.12(@babel/core@7.22.9) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@types/ember__controller@4.0.12(@babel/core@7.22.9)': + dependencies: + '@types/ember__object': 4.0.12(@babel/core@7.22.9) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@types/ember__debug@4.0.8(@babel/core@7.22.9)': + dependencies: + '@types/ember__object': 4.0.12(@babel/core@7.22.9) + '@types/ember__owner': 4.0.9 + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@types/ember__destroyable@4.0.5': {} + + '@types/ember__engine@4.0.11(@babel/core@7.22.9)': + dependencies: + '@types/ember__object': 4.0.12(@babel/core@7.22.9) + '@types/ember__owner': 4.0.9 + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@types/ember__error@4.0.6': {} + + '@types/ember__helper@4.0.8(@babel/core@7.22.9)': + dependencies: + '@glimmer/manager': 0.84.3 + '@glimmer/runtime': 0.84.3 + '@types/ember': 4.0.11(@babel/core@7.22.9) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@types/ember__modifier@4.0.9(@babel/core@7.22.9)': + dependencies: + '@types/ember': 4.0.11(@babel/core@7.22.9) + '@types/ember__owner': 4.0.9 + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@types/ember__object@4.0.12(@babel/core@7.22.9)': + dependencies: + '@types/ember': 4.0.11(@babel/core@7.22.9) + '@types/rsvp': 4.0.9 + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@types/ember__owner@4.0.9': {} + + '@types/ember__polyfills@4.0.6': {} + + '@types/ember__routing@4.0.22(@babel/core@7.22.9)': + dependencies: + '@types/ember': 4.0.11(@babel/core@7.22.9) + '@types/ember__controller': 4.0.12(@babel/core@7.22.9) + '@types/ember__object': 4.0.12(@babel/core@7.22.9) + '@types/ember__service': 4.0.9(@babel/core@7.22.9) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@types/ember__runloop@4.0.10(@babel/core@7.22.9)': + dependencies: + '@types/ember': 4.0.11(@babel/core@7.22.9) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@types/ember__service@4.0.9(@babel/core@7.22.9)': + dependencies: + '@types/ember__object': 4.0.12(@babel/core@7.22.9) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@types/ember__string@3.0.15': {} + + '@types/ember__template@4.0.7': {} + + '@types/ember__test@4.0.6(@babel/core@7.22.9)': + dependencies: + '@types/ember__application': 4.0.11(@babel/core@7.22.9) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + '@types/ember__utils@4.0.7(@babel/core@7.22.9)': + dependencies: + '@types/ember': 4.0.11(@babel/core@7.22.9) + transitivePeerDependencies: + - '@babel/core' + - supports-color + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 8.56.10 @@ -10290,6 +10857,8 @@ snapshots: '@types/qs@6.9.15': {} + '@types/qunit@2.19.10': {} + '@types/range-parser@1.2.7': {} '@types/resolve@1.20.2': {} @@ -10299,6 +10868,8 @@ snapshots: '@types/glob': 8.1.0 '@types/node': 20.14.9 + '@types/rsvp@4.0.9': {} + '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 @@ -10314,6 +10885,87 @@ snapshots: '@types/ungap__structured-clone@0.3.3': {} + '@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@8.46.0)(typescript@5.6.2))(eslint@8.46.0)(typescript@5.6.2)': + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 8.6.0(eslint@8.46.0)(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.6.0 + '@typescript-eslint/type-utils': 8.6.0(eslint@8.46.0)(typescript@5.6.2) + '@typescript-eslint/utils': 8.6.0(eslint@8.46.0)(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.6.0 + eslint: 8.46.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.6.0(eslint@8.46.0)(typescript@5.6.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.6.0 + '@typescript-eslint/types': 8.6.0 + '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.6.0 + debug: 4.3.5 + eslint: 8.46.0 + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.6.0': + dependencies: + '@typescript-eslint/types': 8.6.0 + '@typescript-eslint/visitor-keys': 8.6.0 + + '@typescript-eslint/type-utils@8.6.0(eslint@8.46.0)(typescript@5.6.2)': + dependencies: + '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) + '@typescript-eslint/utils': 8.6.0(eslint@8.46.0)(typescript@5.6.2) + debug: 4.3.5 + ts-api-utils: 1.3.0(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - eslint + - supports-color + + '@typescript-eslint/types@8.6.0': {} + + '@typescript-eslint/typescript-estree@8.6.0(typescript@5.6.2)': + dependencies: + '@typescript-eslint/types': 8.6.0 + '@typescript-eslint/visitor-keys': 8.6.0 + debug: 4.3.5 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.6.2) + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.6.0(eslint@8.46.0)(typescript@5.6.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0) + '@typescript-eslint/scope-manager': 8.6.0 + '@typescript-eslint/types': 8.6.0 + '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) + eslint: 8.46.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@8.6.0': + dependencies: + '@typescript-eslint/types': 8.6.0 + eslint-visitor-keys: 3.4.3 + '@ungap/structured-clone@0.3.4': {} '@webassemblyjs/ast@1.12.1': @@ -12078,6 +12730,8 @@ snapshots: dependencies: safe-buffer: 5.2.1 + content-tag@2.0.1: {} + content-type@1.0.5: {} continuable-cache@0.3.1: {} @@ -12122,14 +12776,14 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig@9.0.0(typescript@5.5.2): + cosmiconfig@9.0.0(typescript@5.6.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.5.2 + typescript: 5.6.2 create-ecdh@4.0.4: dependencies: @@ -12485,18 +13139,18 @@ snapshots: - supports-color - webpack - ember-basic-dropdown@8.2.0(@ember/string@3.1.1)(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)): + ember-basic-dropdown@8.2.0(iiwnxvgjf2o7m2x6rb3pedhjre): dependencies: '@babel/core': 7.25.2 - '@ember/test-helpers': 2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + '@ember/test-helpers': 2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) '@embroider/addon-shim': 1.8.9 '@embroider/macros': 1.16.5(@glint/template@1.4.0) - '@embroider/util': 1.13.2(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + '@embroider/util': 1.13.2(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) '@glimmer/component': 1.1.2(@babel/core@7.22.9) '@glimmer/tracking': 1.1.2 decorator-transforms: 2.0.0(@babel/core@7.25.2) - ember-element-helper: 0.8.6(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) - ember-lifeline: 7.0.0(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))) + ember-element-helper: 0.8.6(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + ember-lifeline: 7.0.0(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))) ember-modifier: 4.2.0(@babel/core@7.25.2)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) ember-source: 5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1) ember-style-modifier: 4.4.0(@babel/core@7.25.2)(@ember/string@3.1.1)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) @@ -12753,7 +13407,7 @@ snapshots: ember-cli-lodash-subset@2.0.1: {} - ember-cli-mirage@3.0.3(v25oimjh6f57n7utzp4lxy4uye): + ember-cli-mirage@3.0.3(k3fuotcktandt4x7arunel64ma): dependencies: '@babel/core': 7.24.7 '@embroider/macros': 1.16.5(@glint/template@1.4.0) @@ -12768,9 +13422,9 @@ snapshots: miragejs: 0.1.48 optionalDependencies: '@ember-data/model': 4.12.8(@babel/core@7.22.9)(@ember-data/debug@4.12.8)(@ember-data/graph@4.12.8)(@ember-data/json-api@4.12.8)(@ember-data/legacy-compat@4.12.8)(@ember-data/store@4.12.8)(@ember-data/tracking@4.12.8(@glint/template@1.4.0))(@ember/string@3.1.1)(@glint/template@1.4.0)(ember-inflector@4.0.2)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) - '@ember/test-helpers': 2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + '@ember/test-helpers': 2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) ember-data: 4.12.8(@babel/core@7.22.9)(@ember/string@3.1.1)(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(webpack@5.92.1) - ember-qunit: 6.2.0(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(qunit@2.19.4)(webpack@5.92.1) + ember-qunit: 6.2.0(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(qunit@2.19.4)(webpack@5.92.1) transitivePeerDependencies: - '@glint/template' - supports-color @@ -13196,10 +13850,10 @@ snapshots: - '@babel/core' - supports-color - ember-element-helper@0.8.6(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)): + ember-element-helper@0.8.6(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)): dependencies: '@embroider/addon-shim': 1.8.9 - '@embroider/util': 1.13.1(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + '@embroider/util': 1.13.1(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) ember-source: 5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1) transitivePeerDependencies: - '@glint/environment-ember-loose' @@ -13272,11 +13926,11 @@ snapshots: transitivePeerDependencies: - supports-color - ember-lifeline@7.0.0(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))): + ember-lifeline@7.0.0(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))): dependencies: '@embroider/addon-shim': 1.8.9 optionalDependencies: - '@ember/test-helpers': 2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + '@ember/test-helpers': 2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) transitivePeerDependencies: - supports-color @@ -13372,12 +14026,12 @@ snapshots: transitivePeerDependencies: - supports-color - ember-power-calendar-moment@1.0.2(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-power-calendar@1.1.0(@babel/core@7.22.9)(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-concurrency@4.0.2(@babel/core@7.22.9)(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(moment-timezone@0.5.45)(moment@2.30.1): + ember-power-calendar-moment@1.0.2(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-power-calendar@1.1.0(6tk3uxl3ogw7dn6fq4ufzf4bhm))(moment-timezone@0.5.45)(moment@2.30.1): dependencies: '@embroider/addon-shim': 1.8.9 '@embroider/macros': 1.16.5(@glint/template@1.4.0) decorator-transforms: 1.2.1(@babel/core@7.22.9) - ember-power-calendar: 1.1.0(@babel/core@7.22.9)(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-concurrency@4.0.2(@babel/core@7.22.9)(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + ember-power-calendar: 1.1.0(6tk3uxl3ogw7dn6fq4ufzf4bhm) optionalDependencies: moment: 2.30.1 moment-timezone: 0.5.45 @@ -13386,18 +14040,18 @@ snapshots: - '@glint/template' - supports-color - ember-power-calendar@1.1.0(@babel/core@7.22.9)(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-concurrency@4.0.2(@babel/core@7.22.9)(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)): + ember-power-calendar@1.1.0(6tk3uxl3ogw7dn6fq4ufzf4bhm): dependencies: - '@ember/test-helpers': 2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + '@ember/test-helpers': 2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) '@embroider/addon-shim': 1.8.9 '@embroider/macros': 1.16.5(@glint/template@1.4.0) - '@embroider/util': 1.13.1(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + '@embroider/util': 1.13.1(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) '@glimmer/component': 1.1.2(@babel/core@7.22.9) '@glimmer/tracking': 1.1.2 decorator-transforms: 1.2.1(@babel/core@7.22.9) ember-assign-helper: 0.5.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) ember-concurrency: 4.0.2(@babel/core@7.22.9)(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) - ember-element-helper: 0.8.6(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + ember-element-helper: 0.8.6(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) ember-source: 5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1) ember-truth-helpers: 4.0.3(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) transitivePeerDependencies: @@ -13406,18 +14060,18 @@ snapshots: - '@glint/template' - supports-color - ember-power-select@8.3.0(fmdhslceguiv4ekgl3vuztw5xq): + ember-power-select@8.3.0(jznhez6bdfxkcebwcgs7mem6my): dependencies: - '@ember/test-helpers': 2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + '@ember/test-helpers': 2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) '@embroider/addon-shim': 1.8.9 - '@embroider/util': 1.13.2(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + '@embroider/util': 1.13.2(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) '@glimmer/component': 1.1.2(@babel/core@7.22.9) '@glimmer/tracking': 1.1.2 decorator-transforms: 2.0.0(@babel/core@7.22.9) ember-assign-helper: 0.5.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) - ember-basic-dropdown: 8.2.0(@ember/string@3.1.1)(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + ember-basic-dropdown: 8.2.0(iiwnxvgjf2o7m2x6rb3pedhjre) ember-concurrency: 4.0.2(@babel/core@7.22.9)(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) - ember-lifeline: 7.0.0(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))) + ember-lifeline: 7.0.0(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))) ember-modifier: 4.2.0(@babel/core@7.22.9)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) ember-source: 5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1) ember-truth-helpers: 4.0.3(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) @@ -13427,9 +14081,9 @@ snapshots: - '@glint/template' - supports-color - ember-qunit@6.2.0(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(qunit@2.19.4)(webpack@5.92.1): + ember-qunit@6.2.0(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(qunit@2.19.4)(webpack@5.92.1): dependencies: - '@ember/test-helpers': 2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + '@ember/test-helpers': 2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) broccoli-funnel: 3.0.8 broccoli-merge-trees: 3.0.2 common-tags: 1.8.2 @@ -13505,7 +14159,7 @@ snapshots: - supports-color - webpack - ember-simple-auth-oidc@6.0.1(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(encoding@0.1.13)(graphql@16.8.1)(webpack@5.92.1): + ember-simple-auth-oidc@6.0.1(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(encoding@0.1.13)(graphql@16.8.1)(webpack@5.92.1): dependencies: '@apollo/client': 3.10.8(graphql@16.8.1) '@babel/core': 7.24.7 @@ -13515,7 +14169,7 @@ snapshots: ember-cli-babel: 8.2.0(@babel/core@7.24.7) ember-concurrency: 3.1.1(@babel/core@7.24.7)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) ember-fetch: 8.1.2(encoding@0.1.13) - ember-simple-auth: 6.0.0(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glint/template@1.4.0) + ember-simple-auth: 6.0.0(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glint/template@1.4.0) ember-source: 5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1) js-sha256: 0.10.1 tracked-built-ins: 3.3.0 @@ -13533,7 +14187,7 @@ snapshots: - supports-color - webpack - ember-simple-auth@6.0.0(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glint/template@1.4.0): + ember-simple-auth@6.0.0(@ember/test-helpers@2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)))(@glint/template@1.4.0): dependencies: '@ember/test-waiters': 3.1.0 '@embroider/addon-shim': 1.8.9 @@ -13542,7 +14196,7 @@ snapshots: ember-cookies: 1.1.2 silent-error: 1.1.1 optionalDependencies: - '@ember/test-helpers': 2.9.3(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + '@ember/test-helpers': 2.9.3(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) transitivePeerDependencies: - '@glint/template' - supports-color @@ -13731,10 +14385,10 @@ snapshots: transitivePeerDependencies: - supports-color - ember-validated-form@6.2.0(@babel/core@7.22.9)(@glint/template@1.4.0)(ember-data@4.12.8(@babel/core@7.22.9)(@ember/string@3.1.1)(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(webpack@5.92.1))(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(webpack@5.92.1): - dependencies: + ? ember-validated-form@6.2.0(@babel/core@7.22.9)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-data@4.12.8(@babel/core@7.22.9)(@ember/string@3.1.1)(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(webpack@5.92.1))(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(webpack@5.92.1) + : dependencies: '@embroider/macros': 1.16.5(@glint/template@1.4.0) - '@embroider/util': 1.13.1(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) + '@embroider/util': 1.13.1(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.22.9))(@types/ember__component@4.0.22(@babel/core@7.22.9))(@types/ember__controller@4.0.12(@babel/core@7.22.9))(@types/ember__object@4.0.12(@babel/core@7.22.9))(@types/ember__routing@4.0.22(@babel/core@7.22.9))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))))(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1)) '@glimmer/component': 1.1.2(@babel/core@7.22.9) '@glimmer/tracking': 1.1.2 ember-changeset: 4.1.2(@glint/template@1.4.0)(ember-data@4.12.8(@babel/core@7.22.9)(@ember/string@3.1.1)(@glimmer/tracking@1.1.2)(@glint/template@1.4.0)(ember-source@5.4.1(@babel/core@7.22.9)(@glimmer/component@1.1.2(@babel/core@7.22.9))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.92.1))(webpack@5.92.1))(webpack@5.92.1) @@ -13925,10 +14579,11 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.1(eslint-import-resolver-node@0.3.9)(eslint@8.46.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@8.6.0(eslint@8.46.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@8.46.0): dependencies: debug: 3.2.7 optionalDependencies: + '@typescript-eslint/parser': 8.6.0(eslint@8.46.0)(typescript@5.6.2) eslint: 8.46.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: @@ -13959,7 +14614,7 @@ snapshots: eslint-utils: 2.1.0 regexpp: 3.2.0 - eslint-plugin-import@2.28.1(eslint@8.46.0): + eslint-plugin-import@2.28.1(@typescript-eslint/parser@8.6.0(eslint@8.46.0)(typescript@5.6.2))(eslint@8.46.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 @@ -13969,7 +14624,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.46.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(eslint-import-resolver-node@0.3.9)(eslint@8.46.0) + eslint-module-utils: 2.8.1(@typescript-eslint/parser@8.6.0(eslint@8.46.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@8.46.0) has: 1.0.4 is-core-module: 2.14.0 is-glob: 4.0.3 @@ -13979,6 +14634,8 @@ snapshots: object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.6.0(eslint@8.46.0)(typescript@5.6.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -15785,6 +16442,10 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + minimist@1.2.8: {} minipass@2.9.0: @@ -17242,57 +17903,57 @@ snapshots: styled_string@0.0.1: {} - stylelint-config-recommended-scss@14.0.0(postcss@8.4.39)(stylelint@16.6.1(typescript@5.5.2)): + stylelint-config-recommended-scss@14.0.0(postcss@8.4.39)(stylelint@16.6.1(typescript@5.6.2)): dependencies: postcss-scss: 4.0.9(postcss@8.4.39) - stylelint: 16.6.1(typescript@5.5.2) - stylelint-config-recommended: 14.0.1(stylelint@16.6.1(typescript@5.5.2)) - stylelint-scss: 6.3.2(stylelint@16.6.1(typescript@5.5.2)) + stylelint: 16.6.1(typescript@5.6.2) + stylelint-config-recommended: 14.0.1(stylelint@16.6.1(typescript@5.6.2)) + stylelint-scss: 6.3.2(stylelint@16.6.1(typescript@5.6.2)) optionalDependencies: postcss: 8.4.39 - stylelint-config-recommended@11.0.0(stylelint@16.6.1(typescript@5.5.2)): + stylelint-config-recommended@11.0.0(stylelint@16.6.1(typescript@5.6.2)): dependencies: - stylelint: 16.6.1(typescript@5.5.2) + stylelint: 16.6.1(typescript@5.6.2) - stylelint-config-recommended@14.0.1(stylelint@16.6.1(typescript@5.5.2)): + stylelint-config-recommended@14.0.1(stylelint@16.6.1(typescript@5.6.2)): dependencies: - stylelint: 16.6.1(typescript@5.5.2) + stylelint: 16.6.1(typescript@5.6.2) - stylelint-config-standard-scss@13.1.0(postcss@8.4.39)(stylelint@16.6.1(typescript@5.5.2)): + stylelint-config-standard-scss@13.1.0(postcss@8.4.39)(stylelint@16.6.1(typescript@5.6.2)): dependencies: - stylelint: 16.6.1(typescript@5.5.2) - stylelint-config-recommended-scss: 14.0.0(postcss@8.4.39)(stylelint@16.6.1(typescript@5.5.2)) - stylelint-config-standard: 36.0.1(stylelint@16.6.1(typescript@5.5.2)) + stylelint: 16.6.1(typescript@5.6.2) + stylelint-config-recommended-scss: 14.0.0(postcss@8.4.39)(stylelint@16.6.1(typescript@5.6.2)) + stylelint-config-standard: 36.0.1(stylelint@16.6.1(typescript@5.6.2)) optionalDependencies: postcss: 8.4.39 - stylelint-config-standard@32.0.0(stylelint@16.6.1(typescript@5.5.2)): + stylelint-config-standard@32.0.0(stylelint@16.6.1(typescript@5.6.2)): dependencies: - stylelint: 16.6.1(typescript@5.5.2) - stylelint-config-recommended: 11.0.0(stylelint@16.6.1(typescript@5.5.2)) + stylelint: 16.6.1(typescript@5.6.2) + stylelint-config-recommended: 11.0.0(stylelint@16.6.1(typescript@5.6.2)) - stylelint-config-standard@36.0.1(stylelint@16.6.1(typescript@5.5.2)): + stylelint-config-standard@36.0.1(stylelint@16.6.1(typescript@5.6.2)): dependencies: - stylelint: 16.6.1(typescript@5.5.2) - stylelint-config-recommended: 14.0.1(stylelint@16.6.1(typescript@5.5.2)) + stylelint: 16.6.1(typescript@5.6.2) + stylelint-config-recommended: 14.0.1(stylelint@16.6.1(typescript@5.6.2)) - stylelint-prettier@3.0.0(prettier@2.8.8)(stylelint@16.6.1(typescript@5.5.2)): + stylelint-prettier@3.0.0(prettier@2.8.8)(stylelint@16.6.1(typescript@5.6.2)): dependencies: prettier: 2.8.8 prettier-linter-helpers: 1.0.0 - stylelint: 16.6.1(typescript@5.5.2) + stylelint: 16.6.1(typescript@5.6.2) - stylelint-scss@6.3.2(stylelint@16.6.1(typescript@5.5.2)): + stylelint-scss@6.3.2(stylelint@16.6.1(typescript@5.6.2)): dependencies: known-css-properties: 0.31.0 postcss-media-query-parser: 0.2.3 postcss-resolve-nested-selector: 0.1.1 postcss-selector-parser: 6.1.0 postcss-value-parser: 4.2.0 - stylelint: 16.6.1(typescript@5.5.2) + stylelint: 16.6.1(typescript@5.6.2) - stylelint@16.6.1(typescript@5.5.2): + stylelint@16.6.1(typescript@5.6.2): dependencies: '@csstools/css-parser-algorithms': 2.7.0(@csstools/css-tokenizer@2.3.2) '@csstools/css-tokenizer': 2.3.2 @@ -17301,7 +17962,7 @@ snapshots: '@dual-bundle/import-meta-resolve': 4.1.0 balanced-match: 2.0.0 colord: 2.9.3 - cosmiconfig: 9.0.0(typescript@5.5.2) + cosmiconfig: 9.0.0(typescript@5.6.2) css-functions-list: 3.2.2 css-tree: 2.3.1 debug: 4.3.5 @@ -17673,6 +18334,10 @@ snapshots: trim-right@1.0.1: {} + ts-api-utils@1.3.0(typescript@5.6.2): + dependencies: + typescript: 5.6.2 + ts-invariant@0.10.3: dependencies: tslib: 2.6.3 @@ -17747,8 +18412,7 @@ snapshots: typescript-memoize@1.1.1: {} - typescript@5.5.2: - optional: true + typescript@5.6.2: {} uc.micro@1.0.6: {} @@ -17881,6 +18545,23 @@ snapshots: vm-browserify@1.1.2: {} + vscode-jsonrpc@8.1.0: {} + + vscode-languageserver-protocol@3.17.3: + dependencies: + vscode-jsonrpc: 8.1.0 + vscode-languageserver-types: 3.17.3 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.3: {} + + vscode-languageserver@8.1.0: + dependencies: + vscode-languageserver-protocol: 3.17.3 + + vscode-uri@3.0.8: {} + walk-sync@0.2.7: dependencies: ensure-posix-path: 1.1.1 diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 000000000..5d70eb7c4 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "@tsconfig/ember/tsconfig.json", + "compilerOptions": { + // The combination of `baseUrl` with `paths` allows Ember's classic package + // layout, which is not resolvable with the Node resolution algorithm, to + // work with TypeScript. + "baseUrl": ".", + "paths": { + "timed/tests/*": ["tests/*"], + "timed/*": ["app/*"], + "*": ["types/*"] + } + }, + "glint": { + "environment": ["ember-loose", "ember-template-imports"] + } +} \ No newline at end of file diff --git a/frontend/types/ember-data/registries/model.d.ts b/frontend/types/ember-data/registries/model.d.ts new file mode 100644 index 000000000..bdd8c0f17 --- /dev/null +++ b/frontend/types/ember-data/registries/model.d.ts @@ -0,0 +1,7 @@ +/** + * Catch-all for ember-data. + */ +export default interface ModelRegistry { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [key: string]: any; +} diff --git a/frontend/types/glint.d.ts b/frontend/types/glint.d.ts new file mode 100644 index 000000000..17bdace04 --- /dev/null +++ b/frontend/types/glint.d.ts @@ -0,0 +1,12 @@ +// Setup Glint Globals +import "@glint/environment-ember-loose"; +import "@glint/environment-ember-template-imports"; + +declare module "@glint/environment-ember-loose/registry" { + // Remove this once entries have been added! 👇 + // eslint-disable-next-line @typescript-eslint/no-empty-interface + export default interface Registry { + // Add any registry entries from other addons here that your addon itself uses (in non-strict mode templates) + // See https://typed-ember.gitbook.io/glint/using-glint/ember/using-addons + } +}