diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6598ce1..d663b35 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,6 +14,19 @@ jobs: - uses: actions/checkout@v4 - uses: wyvox/action-setup-pnpm@v3 + + + lint: + name: lint + env: + CI: true + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: wyvox/action-setup-pnpm@v3 + - run: pnpm build + - run: pnpm lint + test-default: name: Test env: diff --git a/ember-composable-helpers/.eslintrc.js b/ember-composable-helpers/.eslintrc.js index a76e519..a81b3f9 100644 --- a/ember-composable-helpers/.eslintrc.js +++ b/ember-composable-helpers/.eslintrc.js @@ -1,6 +1,6 @@ module.exports = { root: true, - parser: 'babel-eslint', + parser: '@typescript-eslint/parser', parserOptions: { ecmaVersion: 2018, sourceType: 'module', @@ -22,6 +22,18 @@ module.exports = { 'ember/no-jquery': 'error' }, overrides: [ + // ts files + { + files: ['**/*.ts', '**/*.gts'], + extends: [ + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + ], + rules: { + // Add any custom rules here + 'prefer-const': 'off', + }, + }, // node files { files: [ diff --git a/ember-composable-helpers/babel.config.json b/ember-composable-helpers/babel.config.json index c8ff140..ebf9633 100644 --- a/ember-composable-helpers/babel.config.json +++ b/ember-composable-helpers/babel.config.json @@ -1,5 +1,6 @@ { "plugins": [ + ["@babel/plugin-transform-typescript", { "allExtensions": true, "onlyRemoveTypeImports": true, "allowDeclareFields": true }], "@embroider/addon-dev/template-colocation-plugin", ["@babel/plugin-proposal-decorators", { "version": "legacy" }], "@babel/plugin-transform-class-properties" diff --git a/ember-composable-helpers/package.json b/ember-composable-helpers/package.json index 392353f..148afb7 100644 --- a/ember-composable-helpers/package.json +++ b/ember-composable-helpers/package.json @@ -3,13 +3,19 @@ "version": "5.1.1", "description": "Composable helpers for Ember", "scripts": { - "build": "rollup --config", + "build": "concurrently 'pnpm:build:*'", + "build:js": "rollup --config", + "build:types": "glint --declaration", "contributors": "npx contributor-faces -e \"(*-bot|*\\[bot\\]|*-tomster|homu|bors)\"", + "lint": "concurrently \"npm:lint:*(!fix)\" --names \"lint:\"", "lint:hbs": "ember-template-lint .", "lint:js": "eslint .", + "lint:types": "glint", "node-test": "mocha test --recursive --reporter spec", - "prepack": "rollup --config", - "start": "rollup --config --watch", + "prepack": "concurrently 'pnpm:build:*'", + "start": "concurrently 'pnpm:start:*'", + "start:js": "rollup --config --watch --no-watch.clearScreen", + "start:types": "glint --declaration --watch", "test": "echo 'A v2 addon does not have tests, run tests in test-app'", "test:all": "ember try:each" }, @@ -21,12 +27,24 @@ "@babel/core": "^7.0.0", "@babel/plugin-proposal-decorators": "^7.22.15", "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-typescript": "^7.23.6", "@babel/runtime": "^7.22.15", "@embroider/addon-dev": "^4.1.0", + "@glint/core": "^1.2.1", + "@glint/environment-ember-loose": "^1.2.1", + "@glint/environment-ember-template-imports": "^1.2.1", + "@glint/template": "^1.2.1", "@rollup/plugin-babel": "^6.0.3", + "@tsconfig/ember": "^3.0.2", + "@types/rsvp": "^4.0.9", + "@typescript-eslint/eslint-plugin": "^6.14.0", + "@typescript-eslint/parser": "^6.14.0", "concurrently": "^8.2.1", + "ember-source": "~5.8.0", "rollup": "^3.29.1", - "rollup-plugin-copy": "^3.5.0" + "rollup-plugin-copy": "^3.5.0", + "typescript": "^5.3.3", + "webpack": "^5.88.1" }, "keywords": [ "ember-addon", @@ -47,12 +65,25 @@ "@embroider/addon-shim": "^1.8.8" }, "exports": { - ".": "./dist/index.js", - "./*": "./dist/*.js", + ".": { + "types": "./declarations/index.d.ts", + "default": "./dist/index.js" + }, + "./*": { + "types": "./declarations/*.d.ts", + "default": "./dist/*.js" + }, "./addon-main.js": "./addon-main.cjs", "./addon-main.cjs": "./addon-main.cjs", "./addon-main": "./addon-main.cjs" }, + "typesVersions": { + "*": { + "*": [ + "declarations/*" + ] + } + }, "files": [ "addon-main.cjs", "dist", diff --git a/ember-composable-helpers/rollup.config.mjs b/ember-composable-helpers/rollup.config.mjs index 9aedca5..c0625b9 100644 --- a/ember-composable-helpers/rollup.config.mjs +++ b/ember-composable-helpers/rollup.config.mjs @@ -21,6 +21,7 @@ export default { 'helpers/**/*.js', 'index.js', 'utils/**/*.js', + 'template-registry.js' ]), // These are the modules that should get reexported into the traditional @@ -43,7 +44,7 @@ export default { // babel.config.json. babel({ babelHelpers: 'bundled', - extensions: ['.js'], + extensions: ['.js', '.ts'], }), // Ensure that standalone .hbs files are properly integrated as Javascript. diff --git a/ember-composable-helpers/src/-private/closure-action.js b/ember-composable-helpers/src/-private/closure-action.ts similarity index 100% rename from ember-composable-helpers/src/-private/closure-action.js rename to ember-composable-helpers/src/-private/closure-action.ts diff --git a/ember-composable-helpers/src/-private/get-value-array-and-use-deep-equal-from-params.js b/ember-composable-helpers/src/-private/get-value-array-and-use-deep-equal-from-params.ts similarity index 54% rename from ember-composable-helpers/src/-private/get-value-array-and-use-deep-equal-from-params.js rename to ember-composable-helpers/src/-private/get-value-array-and-use-deep-equal-from-params.ts index ad28ddd..f810903 100644 --- a/ember-composable-helpers/src/-private/get-value-array-and-use-deep-equal-from-params.js +++ b/ember-composable-helpers/src/-private/get-value-array-and-use-deep-equal-from-params.ts @@ -1,4 +1,4 @@ -export default function getValueArrayAndUseDeepEqualFromParams(params) { +export default function getValueArrayAndUseDeepEqualFromParams(params: [T, boolean | T[], T[]?]) { let currentValue = params[0]; let array; @@ -6,8 +6,8 @@ export default function getValueArrayAndUseDeepEqualFromParams(params) { if (params.length === 2) { array = params[1]; } else { - useDeepEqual = params[1]; - array = params[2]; + useDeepEqual = params[1] as boolean; + array = params[2] as T[]; } return { diff --git a/ember-composable-helpers/src/helpers/append.js b/ember-composable-helpers/src/helpers/append.ts similarity index 100% rename from ember-composable-helpers/src/helpers/append.js rename to ember-composable-helpers/src/helpers/append.ts diff --git a/ember-composable-helpers/src/helpers/call.js b/ember-composable-helpers/src/helpers/call.ts similarity index 88% rename from ember-composable-helpers/src/helpers/call.js rename to ember-composable-helpers/src/helpers/call.ts index ec2913c..d8c7c4b 100644 --- a/ember-composable-helpers/src/helpers/call.js +++ b/ember-composable-helpers/src/helpers/call.ts @@ -13,7 +13,7 @@ import Helper from '@ember/component/helper'; * @param {Array} fn - The function to be called * @param {*=} thisArg - An optional `this` context */ -export function call([fn, thisArg]) { +export function call([fn, thisArg]: [(...args: never[]) => unknown, unknown?]) { if (fn) { if (thisArg) { return fn.apply(thisArg); diff --git a/ember-composable-helpers/src/helpers/chunk.js b/ember-composable-helpers/src/helpers/chunk.ts similarity index 72% rename from ember-composable-helpers/src/helpers/chunk.js rename to ember-composable-helpers/src/helpers/chunk.ts index 915ec48..8874588 100644 --- a/ember-composable-helpers/src/helpers/chunk.js +++ b/ember-composable-helpers/src/helpers/chunk.ts @@ -1,10 +1,10 @@ import { helper } from '@ember/component/helper'; import { isArray as isEmberArray } from '@ember/array'; const { max, ceil } = Math; -import asArray from '../utils/as-array'; +import asArray from '../utils/as-array.ts'; -export function chunk(num, array) { - let integer = parseInt(num, 10); +export function chunk(num: number | string, array: T[]) { + let integer = parseInt(num as string, 10); let size = max(integer, 0); let length = 0; @@ -29,6 +29,6 @@ export function chunk(num, array) { } } -export default helper(function([num, array]) { +export default helper(function([num, array]: [number | string, T[]]) { return chunk(num, array); }); diff --git a/ember-composable-helpers/src/helpers/compact.js b/ember-composable-helpers/src/helpers/compact.ts similarity index 86% rename from ember-composable-helpers/src/helpers/compact.js rename to ember-composable-helpers/src/helpers/compact.ts index 01135c6..f932aef 100644 --- a/ember-composable-helpers/src/helpers/compact.js +++ b/ember-composable-helpers/src/helpers/compact.ts @@ -1,7 +1,7 @@ import { helper } from '@ember/component/helper'; import { isPresent } from '@ember/utils'; import { isArray } from '@ember/array'; -export function compact([value]) { +export function compact([value]: [T[]]): T[] { let array; if (Array.isArray(value) || isArray(value)) { array = value; diff --git a/ember-composable-helpers/src/helpers/compute.js b/ember-composable-helpers/src/helpers/compute.ts similarity index 58% rename from ember-composable-helpers/src/helpers/compute.js rename to ember-composable-helpers/src/helpers/compute.ts index 7e68137..5eec87e 100644 --- a/ember-composable-helpers/src/helpers/compute.js +++ b/ember-composable-helpers/src/helpers/compute.ts @@ -1,6 +1,6 @@ import { helper } from '@ember/component/helper'; -export function compute([action, ...params]) { +export function compute([action, ...params]: [(...args: never[]) => unknown]) { return action(...params); } diff --git a/ember-composable-helpers/src/helpers/dec.js b/ember-composable-helpers/src/helpers/dec.ts similarity index 80% rename from ember-composable-helpers/src/helpers/dec.js rename to ember-composable-helpers/src/helpers/dec.ts index 8bd00d6..a64872e 100644 --- a/ember-composable-helpers/src/helpers/dec.js +++ b/ember-composable-helpers/src/helpers/dec.ts @@ -1,7 +1,7 @@ import { helper } from '@ember/component/helper'; import { isEmpty } from '@ember/utils'; -export function dec([step, val]) { +export function dec([step, val]: [number | undefined, number | undefined]) { if (isEmpty(val)) { val = step; step = undefined; diff --git a/ember-composable-helpers/src/helpers/drop.js b/ember-composable-helpers/src/helpers/drop.ts similarity index 54% rename from ember-composable-helpers/src/helpers/drop.js rename to ember-composable-helpers/src/helpers/drop.ts index 680196c..d0cd4aa 100644 --- a/ember-composable-helpers/src/helpers/drop.js +++ b/ember-composable-helpers/src/helpers/drop.ts @@ -1,8 +1,8 @@ import { helper } from '@ember/component/helper'; -import asArray from '../utils/as-array'; +import asArray from '../utils/as-array.ts'; -export function drop([dropAmount, array]) { +export function drop([dropAmount, array]: [number, T[]]) { return asArray(array).slice(dropAmount); } diff --git a/ember-composable-helpers/src/helpers/entries.js b/ember-composable-helpers/src/helpers/entries.ts similarity index 65% rename from ember-composable-helpers/src/helpers/entries.js rename to ember-composable-helpers/src/helpers/entries.ts index fdc6dd5..b4cb350 100644 --- a/ember-composable-helpers/src/helpers/entries.js +++ b/ember-composable-helpers/src/helpers/entries.ts @@ -1,6 +1,6 @@ import { helper } from '@ember/component/helper'; -export function entries([object]) { +export function entries([object]: [Record | null | undefined]) { if (!object) { return object; } diff --git a/ember-composable-helpers/src/helpers/filter-by.js b/ember-composable-helpers/src/helpers/filter-by.ts similarity index 60% rename from ember-composable-helpers/src/helpers/filter-by.js rename to ember-composable-helpers/src/helpers/filter-by.ts index f8331fc..b01bdd1 100644 --- a/ember-composable-helpers/src/helpers/filter-by.js +++ b/ember-composable-helpers/src/helpers/filter-by.ts @@ -2,14 +2,14 @@ import { helper } from '@ember/component/helper'; import { isArray as isEmberArray } from '@ember/array'; import { isEmpty } from '@ember/utils'; import { get } from '@ember/object'; -import isEqual from '../utils/is-equal'; -import asArray from '../utils/as-array'; +import isEqual from '../utils/is-equal.ts'; +import asArray from '../utils/as-array.ts'; -export function filterBy([byPath, value, array]) { +export function filterBy([byPath, value, array]: [string, T | T[] | undefined, T[]]) { let isPresent = true; if (!isEmberArray(array) && isEmberArray(value)) { - array = value; + array = value as T[]; value = undefined; isPresent = false; } @@ -24,12 +24,12 @@ export function filterBy([byPath, value, array]) { if (isPresent) { if (typeof value === 'function') { - filterFn = (item) => value(get(item, byPath)); + filterFn = (item: T) => value(get(item, byPath)); } else { - filterFn = (item) => isEqual(get(item, byPath), value); + filterFn = (item: T) => isEqual(get(item, byPath), value); } } else { - filterFn = (item) => !!get(item, byPath); + filterFn = (item: T) => !!get(item, byPath); } return array.filter(filterFn); diff --git a/ember-composable-helpers/src/helpers/filter.js b/ember-composable-helpers/src/helpers/filter.ts similarity index 59% rename from ember-composable-helpers/src/helpers/filter.js rename to ember-composable-helpers/src/helpers/filter.ts index fe26655..e9fc1c1 100644 --- a/ember-composable-helpers/src/helpers/filter.js +++ b/ember-composable-helpers/src/helpers/filter.ts @@ -1,8 +1,8 @@ import { helper } from '@ember/component/helper'; import { isEmpty } from '@ember/utils'; -import asArray from '../utils/as-array'; +import asArray from '../utils/as-array.ts'; -export function filter([callback, array]) { +export function filter([callback, array]: [(value: T, index: number, array: T[]) => value is T, T[]]) { if (isEmpty(callback) || !array) { return []; } diff --git a/ember-composable-helpers/src/helpers/find-by.js b/ember-composable-helpers/src/helpers/find-by.ts similarity index 69% rename from ember-composable-helpers/src/helpers/find-by.js rename to ember-composable-helpers/src/helpers/find-by.ts index 030c334..da385a9 100644 --- a/ember-composable-helpers/src/helpers/find-by.js +++ b/ember-composable-helpers/src/helpers/find-by.ts @@ -1,9 +1,9 @@ import { helper } from '@ember/component/helper'; import { isEmpty } from '@ember/utils'; import { A as emberArray } from '@ember/array'; -import asArray from '../utils/as-array'; +import asArray from '../utils/as-array.ts'; -export function findBy([byPath, value, array]) { +export function findBy([byPath, value, array]: [keyof T, T[keyof T], T[]]) { if (isEmpty(byPath)) { return []; } diff --git a/ember-composable-helpers/src/helpers/flatten.js b/ember-composable-helpers/src/helpers/flatten.js deleted file mode 100644 index 0b655c0..0000000 --- a/ember-composable-helpers/src/helpers/flatten.js +++ /dev/null @@ -1,17 +0,0 @@ -import { helper } from '@ember/component/helper'; -import { isArray as isEmberArray } from '@ember/array'; -import asArray from '../utils/as-array'; - -export function flatten(array) { - if (!isEmberArray(array)) { - return array; - } - - return asArray(array).reduce((flattened, el) => { - return flattened.concat(flatten(el)); - }, []); -} - -export default helper(function([array]) { - return flatten(array); -}); diff --git a/ember-composable-helpers/src/helpers/flatten.ts b/ember-composable-helpers/src/helpers/flatten.ts new file mode 100644 index 0000000..4a41546 --- /dev/null +++ b/ember-composable-helpers/src/helpers/flatten.ts @@ -0,0 +1,17 @@ +import { helper } from '@ember/component/helper'; +import { isArray as isEmberArray } from '@ember/array'; +import asArray from '../utils/as-array.ts'; + +export function flatten(array: T[]): T[] { + if (!isEmberArray(array)) { + return array; + } + + return asArray(array).reduce((flattened, el) => { + return flattened.concat(flatten(el as T[])); + }, []); +} + +export default helper(function([array]: [T[]]) { + return flatten(array); +}); diff --git a/ember-composable-helpers/src/helpers/from-entries.js b/ember-composable-helpers/src/helpers/from-entries.ts similarity index 72% rename from ember-composable-helpers/src/helpers/from-entries.js rename to ember-composable-helpers/src/helpers/from-entries.ts index 5fff521..087e0de 100644 --- a/ember-composable-helpers/src/helpers/from-entries.js +++ b/ember-composable-helpers/src/helpers/from-entries.ts @@ -1,6 +1,6 @@ import { helper } from '@ember/component/helper'; -export function fromEntries([entries]) { +export function fromEntries([entries]: [[unknown, unknown][]]) { if (!entries) { return entries; } diff --git a/ember-composable-helpers/src/helpers/group-by.js b/ember-composable-helpers/src/helpers/group-by.ts similarity index 62% rename from ember-composable-helpers/src/helpers/group-by.js rename to ember-composable-helpers/src/helpers/group-by.ts index 8963858..c1d7064 100644 --- a/ember-composable-helpers/src/helpers/group-by.js +++ b/ember-composable-helpers/src/helpers/group-by.ts @@ -1,12 +1,12 @@ import { helper } from '@ember/component/helper'; import { get } from '@ember/object'; -import asArray from '../utils/as-array'; +import asArray from '../utils/as-array.ts'; -export function groupBy([byPath, array]) { - let groups = {}; +export function groupBy([byPath, array]: [string, T[]]) { + let groups: { [key: string]: T[] } = {}; asArray(array).forEach((item) => { - let groupName = get(item, byPath); + let groupName = get(item, byPath) as string; let group = groups[groupName]; if (!Array.isArray(group)) { diff --git a/ember-composable-helpers/src/helpers/has-next.js b/ember-composable-helpers/src/helpers/has-next.ts similarity index 54% rename from ember-composable-helpers/src/helpers/has-next.js rename to ember-composable-helpers/src/helpers/has-next.ts index 4e2b79a..527eb05 100644 --- a/ember-composable-helpers/src/helpers/has-next.js +++ b/ember-composable-helpers/src/helpers/has-next.ts @@ -1,11 +1,11 @@ import { helper } from '@ember/component/helper'; import { isPresent } from '@ember/utils'; -import { next } from './next'; -import isEqual from '../utils/is-equal'; -import getValueArrayAndUseDeepEqualFromParams from '../-private/get-value-array-and-use-deep-equal-from-params'; -import asArray from '../utils/as-array'; +import { next } from './next.ts'; +import isEqual from '../utils/is-equal.ts'; +import getValueArrayAndUseDeepEqualFromParams from '../-private/get-value-array-and-use-deep-equal-from-params.ts'; +import asArray from '../utils/as-array.ts'; -export function hasNext(currentValue, maybeArray, useDeepEqual = false) { +export function hasNext(currentValue: T, maybeArray: T[], useDeepEqual = false) { let array = asArray(maybeArray); let nextValue = next(currentValue, array, useDeepEqual); let isNotSameValue = !isEqual(nextValue, currentValue, useDeepEqual); @@ -13,8 +13,8 @@ export function hasNext(currentValue, maybeArray, useDeepEqual = false) { return isNotSameValue && isPresent(nextValue); } -export default helper(function(params) { +export default helper(function(params: [T, boolean | T[], T[]?]) { let { currentValue, array, useDeepEqual } = getValueArrayAndUseDeepEqualFromParams(params); - return hasNext(currentValue, array, useDeepEqual); + return hasNext(currentValue, array as T[], useDeepEqual); }); diff --git a/ember-composable-helpers/src/helpers/has-previous.js b/ember-composable-helpers/src/helpers/has-previous.ts similarity index 54% rename from ember-composable-helpers/src/helpers/has-previous.js rename to ember-composable-helpers/src/helpers/has-previous.ts index 4b049bb..53594df 100644 --- a/ember-composable-helpers/src/helpers/has-previous.js +++ b/ember-composable-helpers/src/helpers/has-previous.ts @@ -1,11 +1,11 @@ import { helper } from '@ember/component/helper'; import { isPresent } from '@ember/utils'; -import { previous } from './previous'; -import isEqual from '../utils/is-equal'; -import getValueArrayAndUseDeepEqualFromParams from '../-private/get-value-array-and-use-deep-equal-from-params'; -import asArray from '../utils/as-array'; +import { previous } from './previous.ts'; +import isEqual from '../utils/is-equal.ts'; +import getValueArrayAndUseDeepEqualFromParams from '../-private/get-value-array-and-use-deep-equal-from-params.ts'; +import asArray from '../utils/as-array.ts'; -export function hasPrevious(currentValue, maybeArray, useDeepEqual = false) { +export function hasPrevious(currentValue: T, maybeArray: T[], useDeepEqual = false) { let array = asArray(maybeArray); let previousValue = previous(currentValue, array, useDeepEqual); let isNotSameValue = !isEqual(previousValue, currentValue, useDeepEqual); @@ -13,8 +13,8 @@ export function hasPrevious(currentValue, maybeArray, useDeepEqual = false) { return isNotSameValue && isPresent(previousValue); } -export default helper(function(params) { +export default helper(function(params: [T, boolean | T[], T[]?]) { let { currentValue, array, useDeepEqual } = getValueArrayAndUseDeepEqualFromParams(params); - return hasPrevious(currentValue, array, useDeepEqual); + return hasPrevious(currentValue, array as T[], useDeepEqual); }); diff --git a/ember-composable-helpers/src/helpers/inc.js b/ember-composable-helpers/src/helpers/inc.ts similarity index 80% rename from ember-composable-helpers/src/helpers/inc.js rename to ember-composable-helpers/src/helpers/inc.ts index a25d3f8..4f7127e 100644 --- a/ember-composable-helpers/src/helpers/inc.js +++ b/ember-composable-helpers/src/helpers/inc.ts @@ -1,7 +1,7 @@ import { helper } from '@ember/component/helper'; import { isEmpty } from '@ember/utils'; -export function inc([step, val]) { +export function inc([step, val]: [number | undefined, number | undefined]) { if (isEmpty(val)) { val = step; step = undefined; diff --git a/ember-composable-helpers/src/helpers/includes.js b/ember-composable-helpers/src/helpers/includes.ts similarity index 65% rename from ember-composable-helpers/src/helpers/includes.js rename to ember-composable-helpers/src/helpers/includes.ts index c91c394..4c0ff1e 100644 --- a/ember-composable-helpers/src/helpers/includes.js +++ b/ember-composable-helpers/src/helpers/includes.ts @@ -1,9 +1,9 @@ import { A as emberArray } from '@ember/array'; import { isArray as isEmberArray } from '@ember/array'; import { helper } from '@ember/component/helper'; -import asArray from '../utils/as-array'; +import asArray from '../utils/as-array.ts'; -export function includes(needleOrNeedles, haystack) { +export function includes(needleOrNeedles: T | T[], haystack: T[]) { if (!isEmberArray(haystack)) { return false; } @@ -11,11 +11,11 @@ export function includes(needleOrNeedles, haystack) { let needles = isEmberArray(needleOrNeedles) ? needleOrNeedles : [needleOrNeedles]; let haystackAsEmberArray = emberArray(asArray(haystack)); - return asArray(needles).every((needle) => { + return asArray(needles as T[]).every((needle) => { return haystackAsEmberArray.includes(needle); }); } -export default helper(function([needle, haystack]) { +export default helper(function([needle, haystack]: [T | T[], T[]]) { return includes(needle, haystack); }); diff --git a/ember-composable-helpers/src/helpers/intersect.js b/ember-composable-helpers/src/helpers/intersect.ts similarity index 73% rename from ember-composable-helpers/src/helpers/intersect.js rename to ember-composable-helpers/src/helpers/intersect.ts index fa46141..3d3094c 100644 --- a/ember-composable-helpers/src/helpers/intersect.js +++ b/ember-composable-helpers/src/helpers/intersect.ts @@ -1,16 +1,16 @@ import { helper } from '@ember/component/helper'; import { isArray as isEmberArray } from '@ember/array'; -import asArray from '../utils/as-array'; +import asArray from '../utils/as-array.ts'; -export function intersect([...arrays]) { +export function intersect([...arrays]: [...T[]]) { let confirmedArrays = asArray(arrays).map(array => { - return isEmberArray(array) ? array : []; + return isEmberArray(array) ? array as T[] : []; }); // copied from https://github.com/emberjs/ember.js/blob/315ec6472ff542ac714432036cc96fe4bd62bd1f/packages/%40ember/object/lib/computed/reduce_computed_macros.js#L1063-L1100 - let results = confirmedArrays.pop().filter(candidate => { + let results = confirmedArrays.pop()!.filter(candidate => { for (let i = 0; i < confirmedArrays.length; i++) { let found = false; - let array = confirmedArrays[i]; + let array = confirmedArrays[i] as T[]; for (let j = 0; j < array.length; j++) { if (array[j] === candidate) { found = true; diff --git a/ember-composable-helpers/src/helpers/invoke.js b/ember-composable-helpers/src/helpers/invoke.ts similarity index 70% rename from ember-composable-helpers/src/helpers/invoke.js rename to ember-composable-helpers/src/helpers/invoke.ts index d05c9ce..18e6e1f 100644 --- a/ember-composable-helpers/src/helpers/invoke.js +++ b/ember-composable-helpers/src/helpers/invoke.ts @@ -4,8 +4,8 @@ import RSVP from 'rsvp'; const { all } = RSVP; -export function invoke([methodName, ...args]) { - let obj = args.pop(); +export function invoke void>>([methodName, ...args]: [K, T, ...unknown[]]) { + let obj = args.pop() as T | T[]; if (isEmberArray(obj)) { return function() { diff --git a/ember-composable-helpers/src/helpers/join.js b/ember-composable-helpers/src/helpers/join.ts similarity index 55% rename from ember-composable-helpers/src/helpers/join.js rename to ember-composable-helpers/src/helpers/join.ts index 24dfcf5..6967820 100644 --- a/ember-composable-helpers/src/helpers/join.js +++ b/ember-composable-helpers/src/helpers/join.ts @@ -1,12 +1,12 @@ import { helper } from '@ember/component/helper'; import { isArray as isEmberArray } from '@ember/array'; -import asArray from '../utils/as-array'; +import asArray from '../utils/as-array.ts'; -export function join([separator, rawArray]) { - let array = asArray(rawArray); +export function join([separator, rawArray]: [string | T[], T[]?]): string { + let array = asArray(rawArray!); if (isEmberArray(separator)) { - array = separator; + array = separator as T[]; separator = ','; } diff --git a/ember-composable-helpers/src/helpers/keys.js b/ember-composable-helpers/src/helpers/keys.ts similarity index 65% rename from ember-composable-helpers/src/helpers/keys.js rename to ember-composable-helpers/src/helpers/keys.ts index ff60d80..d20dc97 100644 --- a/ember-composable-helpers/src/helpers/keys.js +++ b/ember-composable-helpers/src/helpers/keys.ts @@ -1,6 +1,6 @@ import { helper } from '@ember/component/helper'; -export function keys([object]) { +export function keys([object]: [Record | null | undefined]) { if (!object) { return object; } diff --git a/ember-composable-helpers/src/helpers/map-by.js b/ember-composable-helpers/src/helpers/map-by.ts similarity index 53% rename from ember-composable-helpers/src/helpers/map-by.js rename to ember-composable-helpers/src/helpers/map-by.ts index 7f5d625..70cc1e1 100644 --- a/ember-composable-helpers/src/helpers/map-by.js +++ b/ember-composable-helpers/src/helpers/map-by.ts @@ -1,14 +1,14 @@ import { helper } from '@ember/component/helper'; import { get } from '@ember/object'; import { isEmpty } from '@ember/utils'; -import asArray from '../utils/as-array'; +import asArray from '../utils/as-array.ts'; -export function mapBy([byPath, array]) { +export function mapBy([byPath, array]: [keyof T, T[]]) { if (isEmpty(byPath)) { return []; } - return asArray(array).map(item => get(item, byPath)); + return asArray(array).map(item => get(item as object, byPath as string)); } export default helper(mapBy); diff --git a/ember-composable-helpers/src/helpers/map.js b/ember-composable-helpers/src/helpers/map.ts similarity index 59% rename from ember-composable-helpers/src/helpers/map.js rename to ember-composable-helpers/src/helpers/map.ts index a6f77d9..415f19c 100644 --- a/ember-composable-helpers/src/helpers/map.js +++ b/ember-composable-helpers/src/helpers/map.ts @@ -1,8 +1,8 @@ import { helper } from '@ember/component/helper'; import { isEmpty } from '@ember/utils'; -import asArray from '../utils/as-array'; +import asArray from '../utils/as-array.ts'; -export function map([callback, array]) { +export function map([callback, array]: [(value: T, index: number, array: T[]) => T, T[]]) { if (isEmpty(callback)) { return []; } diff --git a/ember-composable-helpers/src/helpers/next.js b/ember-composable-helpers/src/helpers/next.ts similarity index 61% rename from ember-composable-helpers/src/helpers/next.js rename to ember-composable-helpers/src/helpers/next.ts index 9492a8c..6f0b49f 100644 --- a/ember-composable-helpers/src/helpers/next.js +++ b/ember-composable-helpers/src/helpers/next.ts @@ -1,13 +1,13 @@ import { helper } from '@ember/component/helper'; -import getIndex from '../utils/get-index'; +import getIndex from '../utils/get-index.ts'; import { isEmpty } from '@ember/utils'; import { A as emberArray } from '@ember/array'; -import getValueArrayAndUseDeepEqualFromParams from '../-private/get-value-array-and-use-deep-equal-from-params'; -import asArray from '../utils/as-array'; +import getValueArrayAndUseDeepEqualFromParams from '../-private/get-value-array-and-use-deep-equal-from-params.ts'; +import asArray from '../utils/as-array.ts'; -export function next(currentValue, maybeArray, useDeepEqual = false) { +export function next(currentValue: T, maybeArray: T[], useDeepEqual = false) { let array = asArray(maybeArray); - let currentIndex = getIndex(array, currentValue, useDeepEqual); + let currentIndex = getIndex(array, currentValue, useDeepEqual) as number; let lastIndex = array.length - 1; if (isEmpty(currentIndex)) { @@ -17,8 +17,8 @@ export function next(currentValue, maybeArray, useDeepEqual = false) { return currentIndex === lastIndex ? currentValue : emberArray(array).objectAt(currentIndex + 1); } -export default helper(function(params) { +export default helper(function(params: [T, boolean | T[], T[]?]) { let { currentValue, array, useDeepEqual } = getValueArrayAndUseDeepEqualFromParams(params); - return next(currentValue, array, useDeepEqual); + return next(currentValue, array as T[], useDeepEqual); }); diff --git a/ember-composable-helpers/src/helpers/noop.js b/ember-composable-helpers/src/helpers/noop.ts similarity index 100% rename from ember-composable-helpers/src/helpers/noop.js rename to ember-composable-helpers/src/helpers/noop.ts diff --git a/ember-composable-helpers/src/helpers/object-at.js b/ember-composable-helpers/src/helpers/object-at.ts similarity index 56% rename from ember-composable-helpers/src/helpers/object-at.js rename to ember-composable-helpers/src/helpers/object-at.ts index 547df35..72f677e 100644 --- a/ember-composable-helpers/src/helpers/object-at.js +++ b/ember-composable-helpers/src/helpers/object-at.ts @@ -1,16 +1,16 @@ import { helper } from '@ember/component/helper'; import { A, isArray as isEmberArray } from '@ember/array'; -export function objectAt(index, array) { +export function objectAt(index: number | string, array: T[]) { if (!isEmberArray(array)) { return undefined; } - index = parseInt(index, 10); + index = parseInt(index as string, 10); return A(array).objectAt(index); } -export default helper(function([index, array]) { +export default helper(function([index, array]: [number, T[]]): T | undefined { return objectAt(index, array); }); diff --git a/ember-composable-helpers/src/helpers/optional.js b/ember-composable-helpers/src/helpers/optional.ts similarity index 65% rename from ember-composable-helpers/src/helpers/optional.js rename to ember-composable-helpers/src/helpers/optional.ts index 1b9663f..3bfdbfd 100644 --- a/ember-composable-helpers/src/helpers/optional.js +++ b/ember-composable-helpers/src/helpers/optional.ts @@ -1,11 +1,11 @@ import { helper } from '@ember/component/helper'; -export function optional([action]) { +export function optional([action]: [() => void]) { if (typeof action === 'function') { return action; } - return (i) => i; + return (i: never) => i; } export default helper(optional); diff --git a/ember-composable-helpers/src/helpers/pick.js b/ember-composable-helpers/src/helpers/pick.ts similarity index 67% rename from ember-composable-helpers/src/helpers/pick.js rename to ember-composable-helpers/src/helpers/pick.ts index 59af374..d503eca 100644 --- a/ember-composable-helpers/src/helpers/pick.js +++ b/ember-composable-helpers/src/helpers/pick.ts @@ -1,8 +1,8 @@ import { helper } from '@ember/component/helper'; import { get } from '@ember/object'; -export function pick([path, action]/*, hash*/) { - return function(event) { +export function pick([path, action]: [string, (value: unknown) => void]) { + return function(event: Event) { let value = get(event, path); if (!action) { diff --git a/ember-composable-helpers/src/helpers/pipe-action.js b/ember-composable-helpers/src/helpers/pipe-action.js deleted file mode 100644 index a92ba97..0000000 --- a/ember-composable-helpers/src/helpers/pipe-action.js +++ /dev/null @@ -1,10 +0,0 @@ -import { helper } from '@ember/component/helper'; -import { pipe } from './pipe'; -import ACTION from '../-private/closure-action'; - -const closurePipe = pipe; -if (ACTION) { - closurePipe[ACTION] = true; -} - -export default helper(closurePipe); diff --git a/ember-composable-helpers/src/helpers/pipe-action.ts b/ember-composable-helpers/src/helpers/pipe-action.ts new file mode 100644 index 0000000..d68a7f8 --- /dev/null +++ b/ember-composable-helpers/src/helpers/pipe-action.ts @@ -0,0 +1,10 @@ +import { helper } from '@ember/component/helper'; +import { pipe } from './pipe.ts'; +import ACTION from '../-private/closure-action.ts'; + +const closurePipe = pipe; +if (ACTION) { + closurePipe[ACTION] = true as never; // TODO: remove never +} + +export default helper(closurePipe as any); // TODO: remove any diff --git a/ember-composable-helpers/src/helpers/pipe.js b/ember-composable-helpers/src/helpers/pipe.js deleted file mode 100644 index 4f834a3..0000000 --- a/ember-composable-helpers/src/helpers/pipe.js +++ /dev/null @@ -1,24 +0,0 @@ -import { helper } from "@ember/component/helper"; -import isPromise from "../utils/is-promise"; - -export function invokeFunction(acc, curr) { - if (isPromise(acc)) { - return acc.then(curr); - } - - return curr(acc); -} - -export function pipe(actions = []) { - return function (...args) { - return actions.reduce((acc, curr, idx) => { - if (idx === 0) { - return curr(...args); - } - - return invokeFunction(acc, curr); - }, undefined); - }; -} - -export default helper(pipe); diff --git a/ember-composable-helpers/src/helpers/pipe.ts b/ember-composable-helpers/src/helpers/pipe.ts new file mode 100644 index 0000000..f15f8a7 --- /dev/null +++ b/ember-composable-helpers/src/helpers/pipe.ts @@ -0,0 +1,24 @@ +import { helper } from "@ember/component/helper"; +import isPromise from "../utils/is-promise.ts"; + +export function invokeFunction(acc: T, curr: (...args: unknown[]) => void) { + if (isPromise(acc)) { + return acc.then(curr); + } + + return curr(acc as T); +} + +export function pipe(actions: [...((...args1: unknown[]) => unknown)[]] = []) { + return function (...args: [...unknown[]]) { + return actions.reduce>((acc, curr, idx) => { + if (idx === 0) { + return curr(...args); + } + + return invokeFunction(acc, curr); + }, undefined); + }; +} + +export default helper(pipe as (actions: unknown[]) => unknown); diff --git a/ember-composable-helpers/src/helpers/previous.js b/ember-composable-helpers/src/helpers/previous.ts similarity index 61% rename from ember-composable-helpers/src/helpers/previous.js rename to ember-composable-helpers/src/helpers/previous.ts index ec4a8e1..588ff0c 100644 --- a/ember-composable-helpers/src/helpers/previous.js +++ b/ember-composable-helpers/src/helpers/previous.ts @@ -1,11 +1,11 @@ import { helper } from '@ember/component/helper'; -import getIndex from '../utils/get-index'; +import getIndex from '../utils/get-index.ts'; import { isEmpty } from '@ember/utils'; import { A as emberArray } from '@ember/array'; -import getValueArrayAndUseDeepEqualFromParams from '../-private/get-value-array-and-use-deep-equal-from-params'; +import getValueArrayAndUseDeepEqualFromParams from '../-private/get-value-array-and-use-deep-equal-from-params.ts'; -export function previous(currentValue, array, useDeepEqual = false) { - let currentIndex = getIndex(array, currentValue, useDeepEqual); +export function previous(currentValue: T, array: T[], useDeepEqual = false) { + let currentIndex = getIndex(array, currentValue, useDeepEqual) as number; if (isEmpty(currentIndex)) { return; @@ -14,8 +14,8 @@ export function previous(currentValue, array, useDeepEqual = false) { return currentIndex === 0 ? currentValue : emberArray(array).objectAt(currentIndex - 1); } -export default helper(function(params) { +export default helper(function(params: [T, boolean | T[], T[]?]) { let { currentValue, array, useDeepEqual } = getValueArrayAndUseDeepEqualFromParams(params); - return previous(currentValue, array, useDeepEqual); + return previous(currentValue, array as T[], useDeepEqual); }); diff --git a/ember-composable-helpers/src/helpers/queue.js b/ember-composable-helpers/src/helpers/queue.js deleted file mode 100644 index 5905a67..0000000 --- a/ember-composable-helpers/src/helpers/queue.js +++ /dev/null @@ -1,28 +0,0 @@ -import { helper } from '@ember/component/helper'; -import isPromise from '../utils/is-promise'; - -function invokeMaybeNullable(curr, args) { - return curr == null ? undefined : curr(...args); -} - -export function queue(actions = []) { - return function(...args) { - let invokeWithArgs = function(acc, curr) { - if (isPromise(acc)) { - return acc.then(() => invokeMaybeNullable(curr, args)); - } - - return invokeMaybeNullable(curr, args); - }; - - return actions.reduce((acc, curr, idx) => { - if (idx === 0) { - return invokeMaybeNullable(curr, args); - } - - return invokeWithArgs(acc, curr); - }, undefined); - }; -} - -export default helper(queue); diff --git a/ember-composable-helpers/src/helpers/queue.ts b/ember-composable-helpers/src/helpers/queue.ts new file mode 100644 index 0000000..ff38bb7 --- /dev/null +++ b/ember-composable-helpers/src/helpers/queue.ts @@ -0,0 +1,28 @@ +import { helper } from '@ember/component/helper'; +import isPromise from '../utils/is-promise.ts'; + +function invokeMaybeNullable(curr: (...args1: unknown[]) => void | null, args: unknown[]) { + return curr == null ? undefined : curr(...args); +} + +export function queue(actions: (() => void)[] = []) { + return function(...args: unknown[]) { + let invokeWithArgs = function(acc: unknown, curr: () => void) { + if (isPromise(acc)) { + return acc.then(() => invokeMaybeNullable(curr, args)); + } + + return invokeMaybeNullable(curr, args); + }; + + return actions.reduce>((acc, curr, idx) => { + if (idx === 0) { + return invokeMaybeNullable(curr, args); + } + + return invokeWithArgs(acc, curr); + }, undefined); + }; +} + +export default helper(queue as (actions: unknown[]) => unknown); diff --git a/ember-composable-helpers/src/helpers/range.js b/ember-composable-helpers/src/helpers/range.ts similarity index 77% rename from ember-composable-helpers/src/helpers/range.js rename to ember-composable-helpers/src/helpers/range.ts index 76ddf39..1cab290 100644 --- a/ember-composable-helpers/src/helpers/range.js +++ b/ember-composable-helpers/src/helpers/range.ts @@ -1,10 +1,10 @@ import { helper } from '@ember/component/helper'; import { typeOf } from '@ember/utils'; -import { gte, lte, gt, lt } from '../utils/comparison'; +import { gte, lte, gt, lt } from '../utils/comparison.ts'; -export function range([min, max, isInclusive]) { +export function range([min, max, isInclusive]: [number, number, boolean?]) { isInclusive = typeOf(isInclusive) === 'boolean' ? isInclusive : false; - let numbers = []; + let numbers: number[] = []; if (min < max) { let testFn = isInclusive ? lte : lt; diff --git a/ember-composable-helpers/src/helpers/reduce.js b/ember-composable-helpers/src/helpers/reduce.ts similarity index 54% rename from ember-composable-helpers/src/helpers/reduce.js rename to ember-composable-helpers/src/helpers/reduce.ts index 1b42260..af10de1 100644 --- a/ember-composable-helpers/src/helpers/reduce.js +++ b/ember-composable-helpers/src/helpers/reduce.ts @@ -1,8 +1,8 @@ import { helper } from '@ember/component/helper'; import { isEmpty } from '@ember/utils'; -import asArray from '../utils/as-array'; +import asArray from '../utils/as-array.ts'; -export function reduce([callback, initialValue, array]) { +export function reduce([callback, initialValue, array]: [(previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, T, T[]]) { if (isEmpty(callback)) { return []; } diff --git a/ember-composable-helpers/src/helpers/reject-by.js b/ember-composable-helpers/src/helpers/reject-by.ts similarity index 56% rename from ember-composable-helpers/src/helpers/reject-by.js rename to ember-composable-helpers/src/helpers/reject-by.ts index 493f7c0..8e52c16 100644 --- a/ember-composable-helpers/src/helpers/reject-by.js +++ b/ember-composable-helpers/src/helpers/reject-by.ts @@ -2,12 +2,12 @@ import { helper } from '@ember/component/helper'; import { isArray as isEmberArray } from '@ember/array'; import { isPresent } from '@ember/utils'; import { get } from '@ember/object'; -import isEqual from '../utils/is-equal'; -import asArray from '../utils/as-array'; +import isEqual from '../utils/is-equal.ts'; +import asArray from '../utils/as-array.ts'; -export function rejectBy([byPath, value, array]) { +export function rejectBy([byPath, value, array]: [string, T | T[] | undefined, T[]]) { if (!isEmberArray(array) && isEmberArray(value)) { - array = value; + array = value as T[]; value = undefined; } array = asArray(array); @@ -16,12 +16,12 @@ export function rejectBy([byPath, value, array]) { if (isPresent(value)) { if (typeof value === 'function') { - filterFn = (item) => !value(get(item, byPath)); + filterFn = (item: T) => !value(get(item, byPath)); } else { - filterFn = (item) => !isEqual(get(item, byPath), value); + filterFn = (item: T) => !isEqual(get(item, byPath), value); } } else { - filterFn = (item) => !get(item, byPath); + filterFn = (item: T) => !get(item, byPath); } return array.filter(filterFn); diff --git a/ember-composable-helpers/src/helpers/repeat.js b/ember-composable-helpers/src/helpers/repeat.ts similarity index 55% rename from ember-composable-helpers/src/helpers/repeat.js rename to ember-composable-helpers/src/helpers/repeat.ts index abf3503..db064d2 100644 --- a/ember-composable-helpers/src/helpers/repeat.js +++ b/ember-composable-helpers/src/helpers/repeat.ts @@ -1,11 +1,11 @@ import { helper } from '@ember/component/helper'; import { typeOf } from '@ember/utils'; -export function repeat([length, value]) { +export function repeat([length, value]: [number, T]): T[] { if (typeOf(length) !== 'number') { return [value]; } - return Array.apply(null, { length }).map(() => value); // eslint-disable-line + return Array.apply(null, { length } as []).map(() => value); // eslint-disable-line } export default helper(repeat); diff --git a/ember-composable-helpers/src/helpers/reverse.js b/ember-composable-helpers/src/helpers/reverse.ts similarity index 85% rename from ember-composable-helpers/src/helpers/reverse.js rename to ember-composable-helpers/src/helpers/reverse.ts index 0abe25f..e6af668 100644 --- a/ember-composable-helpers/src/helpers/reverse.js +++ b/ember-composable-helpers/src/helpers/reverse.ts @@ -1,7 +1,7 @@ import { helper } from '@ember/component/helper'; import { A as emberArray, isArray as isEmberArray } from '@ember/array'; -export function reverse([array]) { +export function reverse([array]: [T[]]) { if (!isEmberArray(array)) { return [array]; } diff --git a/ember-composable-helpers/src/helpers/shuffle.js b/ember-composable-helpers/src/helpers/shuffle.ts similarity index 63% rename from ember-composable-helpers/src/helpers/shuffle.js rename to ember-composable-helpers/src/helpers/shuffle.ts index b8e9ac0..458e407 100644 --- a/ember-composable-helpers/src/helpers/shuffle.js +++ b/ember-composable-helpers/src/helpers/shuffle.ts @@ -2,7 +2,7 @@ import { helper } from '@ember/component/helper'; import { isArray as isEmberArray } from '@ember/array'; import { typeOf } from '@ember/utils'; -export function shuffle(array, randomizer) { +export function shuffle(array: T[], randomizer?: () => number) { array = array.slice(0); let count = array.length; let rand, temp; @@ -12,15 +12,15 @@ export function shuffle(array, randomizer) { rand = Math.floor(randomizer() * (count--)); temp = array[count]; - array[count] = array[rand]; - array[rand] = temp; + array[count] = array[rand]!; + array[rand] = temp!; } return array; } -export default helper(function([randomizer, array]) { +export default helper(function([randomizer, array]: [(() => number) | T[] | undefined, T[]?]) { if (array === undefined) { - array = randomizer; + array = randomizer as T[]; randomizer = undefined; } @@ -28,5 +28,5 @@ export default helper(function([randomizer, array]) { return [array]; } - return shuffle(array, randomizer) + return shuffle(array, randomizer as () => number) }); diff --git a/ember-composable-helpers/src/helpers/slice.js b/ember-composable-helpers/src/helpers/slice.ts similarity index 82% rename from ember-composable-helpers/src/helpers/slice.js rename to ember-composable-helpers/src/helpers/slice.ts index 2aceff8..9fcdef8 100644 --- a/ember-composable-helpers/src/helpers/slice.js +++ b/ember-composable-helpers/src/helpers/slice.ts @@ -1,5 +1,5 @@ import { helper } from '@ember/component/helper'; -import asArray from '../utils/as-array'; +import asArray from '../utils/as-array.ts'; export function slice([...args]) { let array = args.pop(); diff --git a/ember-composable-helpers/src/helpers/sort-by.js b/ember-composable-helpers/src/helpers/sort-by.ts similarity index 69% rename from ember-composable-helpers/src/helpers/sort-by.js rename to ember-composable-helpers/src/helpers/sort-by.ts index 0d1511d..3e40755 100644 --- a/ember-composable-helpers/src/helpers/sort-by.js +++ b/ember-composable-helpers/src/helpers/sort-by.ts @@ -1,13 +1,14 @@ import { get } from '@ember/object'; import { isEmpty } from '@ember/utils'; import { helper } from '@ember/component/helper'; -import asArray from '../utils/as-array'; +import EmberArray from '@ember/array'; +import asArray from '../utils/as-array.ts'; const collator = new Intl.Collator(undefined, { sensitivity: 'base' }); -function normalizeToBoolean(val) { +function normalizeToBoolean(val: boolean | number | void): boolean { if (typeof val === 'boolean') { return val; } @@ -20,23 +21,23 @@ function normalizeToBoolean(val) { } } - return val; + return val as unknown as boolean; } -function safeValueForKey(ctx, key) { +function safeValueForKey(ctx: unknown, key: string) { if (ctx === null || ctx === undefined) { return ctx; } return get(ctx, key); } -function sortDesc(key, a, b) { +function sortDesc(key: string, a: T, b: T) { if (isEmpty(key)) { return 0; } - const aValue = safeValueForKey(a, key); - const bValue = safeValueForKey(b, key); + const aValue = safeValueForKey(a, key) as any; + const bValue = safeValueForKey(b, key) as any; const isANullable = typeof aValue == 'undefined' || aValue === null; const isBNullable = typeof bValue == 'undefined' || bValue === null; @@ -68,13 +69,13 @@ function sortDesc(key, a, b) { return 0; } -function sortAsc(key, a, b) { +function sortAsc(key: string, a: T, b: T) { if (isEmpty(key)) { return 0; } - const aValue = safeValueForKey(a, key); - const bValue = safeValueForKey(b, key); + const aValue = safeValueForKey(a, key) as any; + const bValue = safeValueForKey(b, key) as any; const isANullable = typeof aValue == 'undefined' || aValue === null; const isBNullable = typeof bValue == 'undefined' || bValue === null; @@ -106,27 +107,29 @@ function sortAsc(key, a, b) { return 0; } -class SortBy { - constructor(...args) { +class SortBy { + array: T[]; + + constructor(...args: [T[] | EmberArray]) { let [array] = args; - if (typeof array.toArray === "function") { - array = array.toArray(); + if (typeof (array as EmberArray).toArray === "function") { + array = (array as EmberArray).toArray(); } - this.array = [...array]; + this.array = [...array as T[]]; } - comparator(key) { + comparator(key: string | ((a: T, b: T) => number)) { return (typeof key === 'function') ? key : this.defaultSort(key); } - defaultSort(sortKey) { + defaultSort(sortKey: string) { let func = sortAsc; if (sortKey.match(':desc')) { func = sortDesc; } - return (a, b) => func(sortKey.replace(/:desc|:asc/, ''), a, b); + return (a: T, b: T) => func(sortKey.replace(/:desc|:asc/, ''), a, b); } } @@ -138,14 +141,14 @@ class SortBy { * @class BubbleSort * @extends SortBy */ -class BubbleSort extends SortBy { - perform(keys = []) { +class BubbleSort extends SortBy { + perform(keys: string[] = []) { let swapped = false; let compFuncs = keys.map(key => this.comparator(key)); - let compFunc = (a, b) => { + let compFunc = (a: T, b: T) => { for (let i = 0; i < compFuncs.length; i += 1) { - let result = compFuncs[i](a,b); + let result = compFuncs[i]?.(a,b); if (result === 0) { continue; } @@ -155,9 +158,9 @@ class BubbleSort extends SortBy { }; for (let i = 1; i < this.array.length; i += 1) { for (let j = 0; j < this.array.length - i; j += 1) { - let shouldSwap = normalizeToBoolean(compFunc(this.array[j+1], this.array[j])); + let shouldSwap = normalizeToBoolean(compFunc(this.array[j+1]!, this.array[j]!)); if (shouldSwap) { - [this.array[j], this.array[j+1]] = [this.array[j+1], this.array[j]]; + [this.array[j], this.array[j+1]] = [this.array[j+1]!, this.array[j]!]; swapped = true; } @@ -171,11 +174,11 @@ class BubbleSort extends SortBy { } } -export function sortBy(params) { +export function sortBy(params: [...K[], T[]]) { // slice params to avoid mutating the provided params let sortParams = params.slice(); - let array = asArray(sortParams.pop()); - let sortKeys = sortParams; + let array = asArray(sortParams.pop() as T[]); + let sortKeys = sortParams as K[]; if (!array || (!sortKeys || sortKeys.length === 0)) { return []; diff --git a/ember-composable-helpers/src/helpers/take.js b/ember-composable-helpers/src/helpers/take.ts similarity index 54% rename from ember-composable-helpers/src/helpers/take.js rename to ember-composable-helpers/src/helpers/take.ts index f4dd246..4c5a202 100644 --- a/ember-composable-helpers/src/helpers/take.js +++ b/ember-composable-helpers/src/helpers/take.ts @@ -1,7 +1,7 @@ import { helper } from '@ember/component/helper'; -import asArray from '../utils/as-array'; +import asArray from '../utils/as-array.ts'; -export function take([takeAmount, array]) { +export function take([takeAmount, array]: [number, T[]]) { return asArray(array).slice(0, takeAmount); } diff --git a/ember-composable-helpers/src/helpers/toggle-action.js b/ember-composable-helpers/src/helpers/toggle-action.js deleted file mode 100644 index 6739126..0000000 --- a/ember-composable-helpers/src/helpers/toggle-action.js +++ /dev/null @@ -1,10 +0,0 @@ -import { helper } from '@ember/component/helper'; -import { toggle } from './toggle'; -import ACTION from '../-private/closure-action'; - -const closureToggle = toggle; -if (ACTION) { - closureToggle[ACTION] = true; -} - -export default helper(closureToggle); diff --git a/ember-composable-helpers/src/helpers/toggle-action.ts b/ember-composable-helpers/src/helpers/toggle-action.ts new file mode 100644 index 0000000..1868903 --- /dev/null +++ b/ember-composable-helpers/src/helpers/toggle-action.ts @@ -0,0 +1,10 @@ +import { helper } from '@ember/component/helper'; +import { toggle } from './toggle.ts'; +import ACTION from '../-private/closure-action.ts'; + +const closureToggle = toggle; +if (ACTION) { + closureToggle[ACTION] = true as never; // TODO: remove never +} + +export default helper(closureToggle); diff --git a/ember-composable-helpers/src/helpers/toggle.js b/ember-composable-helpers/src/helpers/toggle.ts similarity index 51% rename from ember-composable-helpers/src/helpers/toggle.js rename to ember-composable-helpers/src/helpers/toggle.ts index 4d6042d..a9706c8 100644 --- a/ember-composable-helpers/src/helpers/toggle.js +++ b/ember-composable-helpers/src/helpers/toggle.ts @@ -3,7 +3,7 @@ import { get } from '@ember/object'; import { set } from '@ember/object'; import { isPresent } from '@ember/utils'; -function nextIndex(length, currentIdx) { +function nextIndex(length: number, currentIdx: number) { if (currentIdx === -1 || currentIdx + 1 === length) { return 0; } @@ -11,18 +11,18 @@ function nextIndex(length, currentIdx) { return currentIdx + 1; } -export function toggle([prop, obj, ...values]) { +export function toggle([prop, obj, ...values]: [keyof T, T, ...(T[keyof T])[]]) { return function() { - let currentValue = get(obj, prop); + let currentValue = get(obj as object, prop as string); if (isPresent(values)) { - let currentIdx = values.indexOf(currentValue); + let currentIdx = values.indexOf(currentValue as T[keyof T]); let nextIdx = nextIndex(values.length, currentIdx); - return set(obj, prop, values[nextIdx]); + return set(obj as object, prop as string, values[nextIdx]!); } - return set(obj, prop, !currentValue); + return set(obj as object, prop as string, !currentValue); }; } diff --git a/ember-composable-helpers/src/helpers/union.js b/ember-composable-helpers/src/helpers/union.ts similarity index 84% rename from ember-composable-helpers/src/helpers/union.js rename to ember-composable-helpers/src/helpers/union.ts index 1a19f0b..31249a3 100644 --- a/ember-composable-helpers/src/helpers/union.js +++ b/ember-composable-helpers/src/helpers/union.ts @@ -1,5 +1,5 @@ import { helper } from '@ember/component/helper'; -import asArray from '../utils/as-array'; +import asArray from '../utils/as-array.ts'; export function union([...arrays]) { let items = [].concat(...arrays); diff --git a/ember-composable-helpers/src/helpers/values.js b/ember-composable-helpers/src/helpers/values.ts similarity index 65% rename from ember-composable-helpers/src/helpers/values.js rename to ember-composable-helpers/src/helpers/values.ts index 8b9929b..4fa15e9 100644 --- a/ember-composable-helpers/src/helpers/values.js +++ b/ember-composable-helpers/src/helpers/values.ts @@ -1,6 +1,6 @@ import { helper } from '@ember/component/helper'; -export function values([object]) { +export function values([object]: [Record | null | undefined]) { if (!object) { return object; } diff --git a/ember-composable-helpers/src/helpers/without.js b/ember-composable-helpers/src/helpers/without.ts similarity index 56% rename from ember-composable-helpers/src/helpers/without.js rename to ember-composable-helpers/src/helpers/without.ts index 67b7356..d2a339a 100644 --- a/ember-composable-helpers/src/helpers/without.js +++ b/ember-composable-helpers/src/helpers/without.ts @@ -1,24 +1,24 @@ import { helper } from '@ember/component/helper'; import { A as emberArray, isArray as isEmberArray } from '@ember/array'; -function contains(needle, haystack) { +function contains(needle: T, haystack: T[]) { return emberArray(haystack).includes(needle); } -export function without(needle, haystack) { +export function without(needle: T, haystack: T[]) { if (!isEmberArray(haystack)) { return false; } if (isEmberArray(needle) && needle.length) { - return haystack.reduce((acc, val) => { - return contains(val, needle) ? acc : acc.concat(val); + return haystack.reduce((acc, val) => { + return contains(val, needle as T[]) ? acc : acc.concat(val); }, []); } return emberArray(haystack).without(needle); } -export default helper(function([needle, haystack]) { +export default helper(function([needle, haystack]: [T | T[], T[]]) { return without(needle, haystack); }); diff --git a/ember-composable-helpers/src/index.js b/ember-composable-helpers/src/index.js index 9a6755d..3dd8dd1 100644 --- a/ember-composable-helpers/src/index.js +++ b/ember-composable-helpers/src/index.js @@ -1,41 +1,41 @@ -export { default as AppendHelper } from './helpers/append'; -// export { default as ArrayHelper } from './helpers/array'; -export { default as ChunkHelper } from './helpers/chunk'; -export { default as CompactHelper } from './helpers/compact'; -export { default as ComputeHelper } from './helpers/compute'; -// export { default as ContainsHelper } from './helpers/contains'; -export { default as DecHelper } from './helpers/dec'; -export { default as DropHelper } from './helpers/drop'; -export { default as FilterByHelper } from './helpers/filter-by'; -export { default as FilterHelper } from './helpers/filter'; -export { default as FindByHelper } from './helpers/find-by'; -export { default as FlattenHelper } from './helpers/flatten'; -export { default as GroupByHelper } from './helpers/group-by'; -export { default as HasNextHelper } from './helpers/has-next'; -export { default as HasPreviousHelper } from './helpers/has-previous'; -export { default as IncHelper } from './helpers/inc'; -export { default as IntersectHelper } from './helpers/intersect'; -export { default as InvokeHelper } from './helpers/invoke'; -export { default as JoinHelper } from './helpers/join'; -export { default as MapByHelper } from './helpers/map-by'; -export { default as MapHelper } from './helpers/map'; -export { default as NextHelper } from './helpers/next'; -export { default as ObjectAtHelper } from './helpers/object-at'; -export { default as OptionalHelper } from './helpers/optional'; -export { default as PipeActionHelper } from './helpers/pipe-action'; -export { default as PipeHelper } from './helpers/pipe'; -export { default as PreviousHelper } from './helpers/previous'; -export { default as QueueHelper } from './helpers/queue'; -export { default as RangeHelper } from './helpers/range'; -export { default as ReduceHelper } from './helpers/reduce'; -export { default as RejectByHelper } from './helpers/reject-by'; -export { default as RepeatHelper } from './helpers/repeat'; -export { default as ReverseHelper } from './helpers/reverse'; -export { default as ShuffleHelper } from './helpers/shuffle'; -export { default as SliceHelper } from './helpers/slice'; -export { default as SortByHelper } from './helpers/sort-by'; -export { default as TakeHelper } from './helpers/take'; -export { default as ToggleActionHelper } from './helpers/toggle-action'; -export { default as ToggleHelper } from './helpers/toggle'; -export { default as UnionHelper } from './helpers/union'; -export { default as WithoutHelper } from './helpers/without'; +export { default as AppendHelper } from './helpers/append.ts'; +// export { default as ArrayHelper } from './helpers/array.ts'; +export { default as ChunkHelper } from './helpers/chunk.ts'; +export { default as CompactHelper } from './helpers/compact.ts'; +export { default as ComputeHelper } from './helpers/compute.ts'; +// export { default as ContainsHelper } from './helpers/contains.ts'; +export { default as DecHelper } from './helpers/dec.ts'; +export { default as DropHelper } from './helpers/drop.ts'; +export { default as FilterByHelper } from './helpers/filter-by.ts'; +export { default as FilterHelper } from './helpers/filter.ts'; +export { default as FindByHelper } from './helpers/find-by.ts'; +export { default as FlattenHelper } from './helpers/flatten.ts'; +export { default as GroupByHelper } from './helpers/group-by.ts'; +export { default as HasNextHelper } from './helpers/has-next.ts'; +export { default as HasPreviousHelper } from './helpers/has-previous.ts'; +export { default as IncHelper } from './helpers/inc.ts'; +export { default as IntersectHelper } from './helpers/intersect.ts'; +export { default as InvokeHelper } from './helpers/invoke.ts'; +export { default as JoinHelper } from './helpers/join.ts'; +export { default as MapByHelper } from './helpers/map-by.ts'; +export { default as MapHelper } from './helpers/map.ts'; +export { default as NextHelper } from './helpers/next.ts'; +export { default as ObjectAtHelper } from './helpers/object-at.ts'; +export { default as OptionalHelper } from './helpers/optional.ts'; +export { default as PipeActionHelper } from './helpers/pipe-action.ts'; +export { default as PipeHelper } from './helpers/pipe.ts'; +export { default as PreviousHelper } from './helpers/previous.ts'; +export { default as QueueHelper } from './helpers/queue.ts'; +export { default as RangeHelper } from './helpers/range.ts'; +export { default as ReduceHelper } from './helpers/reduce.ts'; +export { default as RejectByHelper } from './helpers/reject-by.ts'; +export { default as RepeatHelper } from './helpers/repeat.ts'; +export { default as ReverseHelper } from './helpers/reverse.ts'; +export { default as ShuffleHelper } from './helpers/shuffle.ts'; +export { default as SliceHelper } from './helpers/slice.ts'; +export { default as SortByHelper } from './helpers/sort-by.ts'; +export { default as TakeHelper } from './helpers/take.ts'; +export { default as ToggleActionHelper } from './helpers/toggle-action.ts'; +export { default as ToggleHelper } from './helpers/toggle.ts'; +export { default as UnionHelper } from './helpers/union.ts'; +export { default as WithoutHelper } from './helpers/without.ts'; diff --git a/ember-composable-helpers/src/template-registry.ts b/ember-composable-helpers/src/template-registry.ts new file mode 100644 index 0000000..a109b0f --- /dev/null +++ b/ember-composable-helpers/src/template-registry.ts @@ -0,0 +1,85 @@ +import type AppendHelper from './helpers/append'; +// import type ArrayHelper from './helpers/array'; +import type ChunkHelper from './helpers/chunk'; +import type CompactHelper from './helpers/compact'; +import type ComputeHelper from './helpers/compute'; +// import type ContainsHelper from './helpers/contains'; +import type DecHelper from './helpers/dec'; +import type DropHelper from './helpers/drop'; +import type FilterByHelper from './helpers/filter-by'; +import type FilterHelper from './helpers/filter'; +import type FindByHelper from './helpers/find-by'; +import type FlattenHelper from './helpers/flatten'; +import type GroupByHelper from './helpers/group-by'; +import type HasNextHelper from './helpers/has-next'; +import type HasPreviousHelper from './helpers/has-previous'; +import type IncHelper from './helpers/inc'; +import type IntersectHelper from './helpers/intersect'; +import type InvokeHelper from './helpers/invoke'; +import type JoinHelper from './helpers/join'; +import type MapByHelper from './helpers/map-by'; +import type MapHelper from './helpers/map'; +import type NextHelper from './helpers/next'; +import type ObjectAtHelper from './helpers/object-at'; +import type OptionalHelper from './helpers/optional'; +import type PipeActionHelper from './helpers/pipe-action'; +import type PipeHelper from './helpers/pipe'; +import type PreviousHelper from './helpers/previous'; +import type QueueHelper from './helpers/queue'; +import type RangeHelper from './helpers/range'; +import type ReduceHelper from './helpers/reduce'; +import type RejectByHelper from './helpers/reject-by'; +import type RepeatHelper from './helpers/repeat'; +import type ReverseHelper from './helpers/reverse'; +import type ShuffleHelper from './helpers/shuffle'; +import type SliceHelper from './helpers/slice'; +import type SortByHelper from './helpers/sort-by'; +import type TakeHelper from './helpers/take'; +import type ToggleActionHelper from './helpers/toggle-action'; +import type ToggleHelper from './helpers/toggle'; +import type UnionHelper from './helpers/union'; +import type WithoutHelper from './helpers/without'; + +export default interface Registry { + append: typeof AppendHelper; + // array: typeof ArrayHelper; + chunk: typeof ChunkHelper; + compact: typeof CompactHelper; + compute: typeof ComputeHelper; + // contains: typeof ContainsHelper; + dec: typeof DecHelper; + drop: typeof DropHelper; + 'filter-by': typeof FilterByHelper; + filter: typeof FilterHelper; + 'find-by': typeof FindByHelper; + flatten: typeof FlattenHelper; + 'group-by': typeof GroupByHelper; + 'has-next': typeof HasNextHelper; + 'has-previous': typeof HasPreviousHelper; + 'inc': typeof IncHelper; + intersect: typeof IntersectHelper; + invoke: typeof InvokeHelper; + join: typeof JoinHelper; + 'map-by': typeof MapByHelper; + map: typeof MapHelper; + next: typeof NextHelper; + 'object-at': typeof ObjectAtHelper; + optional: typeof OptionalHelper; + 'pipe-action': typeof PipeActionHelper; + pipe: typeof PipeHelper; + previous: typeof PreviousHelper; + queue: typeof QueueHelper; + range: typeof RangeHelper; + reduce: typeof ReduceHelper; + 'reject-by': typeof RejectByHelper; + repeat: typeof RepeatHelper; + reverse: typeof ReverseHelper; + shuffle: typeof ShuffleHelper; + slice: typeof SliceHelper; + 'sort-by': typeof SortByHelper; + take: typeof TakeHelper; + 'toggle-action': typeof ToggleActionHelper; + toggle: typeof ToggleHelper; + union: typeof UnionHelper; + without: typeof WithoutHelper; +} diff --git a/ember-composable-helpers/src/utils/as-array.js b/ember-composable-helpers/src/utils/as-array.ts similarity index 71% rename from ember-composable-helpers/src/utils/as-array.js rename to ember-composable-helpers/src/utils/as-array.ts index 3890b8f..883a534 100644 --- a/ember-composable-helpers/src/utils/as-array.js +++ b/ember-composable-helpers/src/utils/as-array.ts @@ -1,24 +1,25 @@ -import { isArray } from '@ember/array'; +import EmberArray, { isArray } from '@ember/array'; +import ArrayProxy from '@ember/array/proxy'; import EmberObject, { get } from '@ember/object'; -function isIterable(value) { +function isIterable(value: unknown) { return Symbol.iterator in Object(value); } // from https://github.com/flexyford/ember-power-select/blob/78a5430c1ac89daf315d0801fd5201e444e82434/addon/components/power-select.ts -function isArrayable(thing) { - return typeof thing.toArray === 'function'; +function isArrayable(thing: unknown): thing is EmberArray { + return typeof (thing as EmberArray).toArray === 'function'; } -function isPromiseLike(thing) { - return typeof thing.then === 'function'; +function isPromiseLike(thing: unknown) { + return typeof (thing as Promise).then === 'function'; } -function isPromiseProxyLike(thing) { - return isPromiseLike(thing) && Object.hasOwnProperty.call(thing, 'content'); +function isPromiseProxyLike(thing: unknown): thing is ArrayProxy { + return isPromiseLike(thing as Promise) && Object.hasOwnProperty.call(thing, 'content'); } -function toExtendable(array) { +function toExtendable(array: T[]) { if (!Object.isExtensible(array)) { return Array.from(array); } else { @@ -26,22 +27,22 @@ function toExtendable(array) { } } -export default function asArray(maybeArray) { +export default function asArray(maybeArray: T[]): T[] { return toExtendable(_asArray(maybeArray)); } -function _asArray(maybeArray) { +function _asArray(maybeArray: unknown): T[] { if (typeof maybeArray === 'number') { throw new Error('Numbers not supported as arrays [ember-composable-helpers]'); } if (typeof maybeArray === 'string') { - return maybeArray.split(''); + return maybeArray.split('') as T[]; } // for perf-reasons falling back to e-array, instead of using it first if (Array.isArray(maybeArray)) { return maybeArray; } else if (isArray(maybeArray)) { - return maybeArray; + return maybeArray as T[]; } else if (typeof maybeArray === 'object' && maybeArray === null) { return []; } else if (typeof maybeArray === 'undefined') { @@ -61,7 +62,7 @@ function _asArray(maybeArray) { throw new Error('Unknown content type in array-like object [ember-composable-helpers]'); } if (isArrayable(content)) { - return content.toArray(); + return (content as EmberArray).toArray(); } else { return _asArray(content); } @@ -70,7 +71,7 @@ function _asArray(maybeArray) { throw new Error('Promise-like objects is not supported as arrays [ember-composable-helpers]'); } if (isArrayable(maybeArray)) { - return maybeArray.toArray(); + return (maybeArray as EmberArray).toArray(); } if (maybeArray instanceof EmberObject) { throw new Error('EmberObjects is not supported as arrays [ember-composable-helpers]') @@ -83,5 +84,5 @@ function _asArray(maybeArray) { if (!isIterable(maybeArray)) { throw new Error('Argument, passed as array is not iterable [ember-composable-helpers]'); } - return maybeArray; + return maybeArray as T[]; } diff --git a/ember-composable-helpers/src/utils/comparison.js b/ember-composable-helpers/src/utils/comparison.js deleted file mode 100644 index 622eb88..0000000 --- a/ember-composable-helpers/src/utils/comparison.js +++ /dev/null @@ -1,15 +0,0 @@ -export function lte(a, b) { - return a <= b; -} - -export function lt(a, b) { - return a < b; -} - -export function gte(a, b) { - return a >= b; -} - -export function gt(a, b) { - return a > b; -} diff --git a/ember-composable-helpers/src/utils/comparison.ts b/ember-composable-helpers/src/utils/comparison.ts new file mode 100644 index 0000000..e5e132f --- /dev/null +++ b/ember-composable-helpers/src/utils/comparison.ts @@ -0,0 +1,15 @@ +export function lte(a: number, b: number) { + return a <= b; +} + +export function lt(a: number, b: number) { + return a < b; +} + +export function gte(a: number, b: number) { + return a >= b; +} + +export function gt(a: number, b: number) { + return a > b; +} diff --git a/ember-composable-helpers/src/utils/get-index.js b/ember-composable-helpers/src/utils/get-index.ts similarity index 67% rename from ember-composable-helpers/src/utils/get-index.js rename to ember-composable-helpers/src/utils/get-index.ts index cfaf535..aebd2b8 100644 --- a/ember-composable-helpers/src/utils/get-index.js +++ b/ember-composable-helpers/src/utils/get-index.ts @@ -1,13 +1,13 @@ import { A as emberArray } from '@ember/array'; -import isEqual from '../utils/is-equal'; +import isEqual from '../utils/is-equal.ts'; -export default function getIndex(array, currentValue, useDeepEqual) { +export default function getIndex(array: T[], currentValue: T, useDeepEqual: boolean) { let needle = currentValue; if (useDeepEqual) { needle = emberArray(array).find((object) => { return isEqual(object, currentValue, useDeepEqual); - }); + }) as T; } let index = emberArray(array).indexOf(needle); diff --git a/ember-composable-helpers/src/utils/is-equal.js b/ember-composable-helpers/src/utils/is-equal.ts similarity index 72% rename from ember-composable-helpers/src/utils/is-equal.js rename to ember-composable-helpers/src/utils/is-equal.ts index 3d912a0..0033cd9 100644 --- a/ember-composable-helpers/src/utils/is-equal.js +++ b/ember-composable-helpers/src/utils/is-equal.ts @@ -1,6 +1,6 @@ import { isEqual as emberIsEqual } from '@ember/utils'; -export default function isEqual(firstValue, secondValue, useDeepEqual = false) { +export default function isEqual(firstValue: unknown, secondValue: unknown, useDeepEqual = false) { if (useDeepEqual) { return JSON.stringify(firstValue) === JSON.stringify(secondValue); } else { diff --git a/ember-composable-helpers/src/utils/is-object.js b/ember-composable-helpers/src/utils/is-object.ts similarity index 68% rename from ember-composable-helpers/src/utils/is-object.js rename to ember-composable-helpers/src/utils/is-object.ts index ff1015d..75ec0f2 100644 --- a/ember-composable-helpers/src/utils/is-object.js +++ b/ember-composable-helpers/src/utils/is-object.ts @@ -1,5 +1,5 @@ import { typeOf } from '@ember/utils'; -export default function isObject(val) { +export default function isObject(val: unknown) { return typeOf(val) === 'object' || typeOf(val) === 'instance'; } diff --git a/ember-composable-helpers/src/utils/is-promise.js b/ember-composable-helpers/src/utils/is-promise.js deleted file mode 100644 index 6c0e865..0000000 --- a/ember-composable-helpers/src/utils/is-promise.js +++ /dev/null @@ -1,10 +0,0 @@ -import { typeOf } from '@ember/utils'; -import isObject from './is-object'; - -function isPromiseLike(obj = {}) { - return typeOf(obj.then) === 'function' && typeOf(obj.catch) === 'function'; -} - -export default function isPromise(obj) { - return isObject(obj) && isPromiseLike(obj); -} diff --git a/ember-composable-helpers/src/utils/is-promise.ts b/ember-composable-helpers/src/utils/is-promise.ts new file mode 100644 index 0000000..76c1ce5 --- /dev/null +++ b/ember-composable-helpers/src/utils/is-promise.ts @@ -0,0 +1,10 @@ +import { typeOf } from '@ember/utils'; +import isObject from './is-object.ts'; + +function isPromiseLike(obj: unknown = {}) { + return typeOf((obj as Promise).then) === 'function' && typeOf((obj as Promise).catch) === 'function'; +} + +export default function isPromise(obj: unknown): obj is Promise { + return isObject(obj) && isPromiseLike(obj); +} diff --git a/ember-composable-helpers/tsconfig.json b/ember-composable-helpers/tsconfig.json new file mode 100644 index 0000000..a80eff6 --- /dev/null +++ b/ember-composable-helpers/tsconfig.json @@ -0,0 +1,53 @@ +{ + "extends": "@tsconfig/ember/tsconfig.json", + "include": [ + "src/**/*", + "unpublished-development-types/**/*" + ], + "glint": { + "environment": ["ember-loose", "ember-template-imports"] + }, + "compilerOptions": { + "allowJs": true, + "declarationDir": "declarations", + /** + https://www.typescriptlang.org/tsconfig#noEmit + + We want to emit declarations, so this option must be set to `false`. + @tsconfig/ember sets this to `true`, which is incompatible with our need to set `emitDeclarationOnly`. + @tsconfig/ember is more optimized for apps, which wouldn't emit anything, only type check. + */ + "noEmit": false, + /** + https://www.typescriptlang.org/tsconfig#emitDeclarationOnly + We want to only emit declarations as we use Rollup to emit JavaScript. + */ + "emitDeclarationOnly": true, + + /** + https://www.typescriptlang.org/tsconfig#noEmitOnError + Do not block emit on TS errors. + */ + "noEmitOnError": false, + + /** + https://www.typescriptlang.org/tsconfig#rootDir + "Default: The longest common path of all non-declaration input files." + + Because we want our declarations' structure to match our rollup output, + we need this "rootDir" to match the "srcDir" in the rollup.config.mjs. + + This way, we can have simpler `package.json#exports` that matches + imports to files on disk + */ + "rootDir": "./src", + + /** + https://www.typescriptlang.org/tsconfig#allowImportingTsExtensions + + We want our tooling to know how to resolve our custom files so the appropriate plugins + can do the proper transformations on those files. + */ + "allowImportingTsExtensions": true + } +} diff --git a/ember-composable-helpers/unpublished-development-types/index.d.ts b/ember-composable-helpers/unpublished-development-types/index.d.ts new file mode 100644 index 0000000..2dc1cef --- /dev/null +++ b/ember-composable-helpers/unpublished-development-types/index.d.ts @@ -0,0 +1,16 @@ +// Add any types here that you need for local development only. +// These will *not* be published as part of your addon, so be careful that your published code does not rely on them! + +import 'ember-source/types'; + +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 + } +} diff --git a/package.json b/package.json index b3494ec..5e79fd3 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "test": "pnpm --workspaces --if-present test" }, "devDependencies": { + "@glint/core": "^1.4.0", "concurrently": "^8.2.1", "release-plan": "^0.9.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 132ed46..fb94e7a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: devDependencies: + '@glint/core': + specifier: ^1.4.0 + version: 1.4.0(typescript@5.5.3) concurrently: specifier: ^8.2.1 version: 8.2.2 @@ -30,36 +33,66 @@ importers: '@babel/plugin-transform-class-properties': specifier: ^7.22.5 version: 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-typescript': + specifier: ^7.23.6 + version: 7.24.5(@babel/core@7.24.5) '@babel/runtime': specifier: ^7.22.15 version: 7.24.5 '@embroider/addon-dev': specifier: ^4.1.0 - version: 4.3.1(rollup@3.29.4) + version: 4.3.1(@glint/template@1.4.0)(rollup@3.29.4) + '@glint/core': + specifier: ^1.2.1 + version: 1.4.0(typescript@5.5.3) + '@glint/environment-ember-loose': + specifier: ^1.2.1 + version: 1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.24.5))(@types/ember__component@4.0.22(@babel/core@7.24.5))(@types/ember__controller@4.0.12(@babel/core@7.24.5))(@types/ember__object@4.0.12(@babel/core@7.24.5))(@types/ember__routing@4.0.22(@babel/core@7.24.5))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0))) + '@glint/environment-ember-template-imports': + specifier: ^1.2.1 + version: 1.4.0(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.24.5))(@types/ember__component@4.0.22(@babel/core@7.24.5))(@types/ember__controller@4.0.12(@babel/core@7.24.5))(@types/ember__object@4.0.12(@babel/core@7.24.5))(@types/ember__routing@4.0.22(@babel/core@7.24.5))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0))))(@glint/template@1.4.0)(@types/ember__component@4.0.22(@babel/core@7.24.5))(@types/ember__helper@4.0.8(@babel/core@7.24.5))(@types/ember__modifier@4.0.9(@babel/core@7.24.5))(@types/ember__routing@4.0.22(@babel/core@7.24.5)) + '@glint/template': + specifier: ^1.2.1 + version: 1.4.0 '@rollup/plugin-babel': specifier: ^6.0.3 version: 6.0.4(@babel/core@7.24.5)(rollup@3.29.4) + '@tsconfig/ember': + specifier: ^3.0.2 + version: 3.0.8 + '@types/rsvp': + specifier: ^4.0.9 + version: 4.0.9 + '@typescript-eslint/eslint-plugin': + specifier: ^6.14.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/parser': + specifier: ^6.14.0 + version: 6.21.0(eslint@8.57.0)(typescript@5.5.3) concurrently: specifier: ^8.2.1 version: 8.2.2 + ember-source: + specifier: ~5.8.0 + version: 5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0) rollup: specifier: ^3.29.1 version: 3.29.4 rollup-plugin-copy: specifier: ^3.5.0 version: 3.5.0 + typescript: + specifier: ^5.3.3 + version: 5.5.3 + webpack: + specifier: ^5.88.1 + version: 5.91.0 test-app: devDependencies: '@babel/core': specifier: ^7.24.4 version: 7.24.5 - '@babel/eslint-parser': - specifier: ^7.24.1 - version: 7.24.5(@babel/core@7.24.5)(eslint@8.57.0) - '@babel/plugin-proposal-decorators': - specifier: ^7.24.1 - version: 7.24.1(@babel/core@7.24.5) '@ember/optional-features': specifier: ^2.1.0 version: 2.1.0 @@ -68,19 +101,40 @@ importers: version: 3.1.1 '@ember/test-helpers': specifier: ^3.3.0 - version: 3.3.0(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(rsvp@4.8.5)(webpack@5.91.0))(webpack@5.91.0) + version: 3.3.0(@glint/template@1.4.0)(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0))(webpack@5.91.0) '@embroider/compat': specifier: ^3.4.8 - version: 3.5.0(@embroider/core@3.4.9) + version: 3.5.0(@embroider/core@3.4.9(@glint/template@1.4.0))(@glint/template@1.4.0) '@embroider/core': specifier: ^3.4.8 - version: 3.4.9 + version: 3.4.9(@glint/template@1.4.0) '@embroider/webpack': specifier: ^4.0.0 - version: 4.0.0(@embroider/core@3.4.9)(webpack@5.91.0) + version: 4.0.0(@embroider/core@3.4.9(@glint/template@1.4.0))(webpack@5.91.0) + '@glint/environment-ember-loose': + specifier: ^1.4.0 + version: 1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.24.5))(@types/ember__component@4.0.22(@babel/core@7.24.5))(@types/ember__controller@4.0.12(@babel/core@7.24.5))(@types/ember__object@4.0.12(@babel/core@7.24.5))(@types/ember__routing@4.0.22(@babel/core@7.24.5))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0))) + '@glint/template': + specifier: ^1.4.0 + version: 1.4.0 '@nullvoxpopuli/ember-composable-helpers': specifier: workspace:* version: link:../ember-composable-helpers + '@tsconfig/ember': + specifier: ^3.0.8 + version: 3.0.8 + '@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: ^6.21.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/parser': + specifier: ^6.21.0 + version: 6.21.0(eslint@8.57.0)(typescript@5.5.3) chai: specifier: ^3.5.0 version: 3.5.0 @@ -89,10 +143,10 @@ importers: version: 8.2.2 ember-auto-import: specifier: 2.7.2 - version: 2.7.2(webpack@5.91.0) + version: 2.7.2(@glint/template@1.4.0)(webpack@5.91.0) ember-cli: specifier: ~5.8.0 - version: 5.8.1(babel-core@6.26.3)(handlebars@4.7.8)(jade@0.26.3)(underscore@1.13.6) + version: 5.8.1(babel-core@6.26.3)(handlebars@4.7.8)(underscore@1.13.6) ember-cli-babel: specifier: ^8.2.0 version: 8.2.0(@babel/core@7.24.5) @@ -101,7 +155,7 @@ importers: version: 3.0.0 ember-cli-dependency-checker: specifier: ^3.3.2 - version: 3.3.2(ember-cli@5.8.1(babel-core@6.26.3)(handlebars@4.7.8)(jade@0.26.3)(underscore@1.13.6)) + version: 3.3.2(ember-cli@5.8.1(babel-core@6.26.3)(handlebars@4.7.8)(underscore@1.13.6)) ember-cli-htmlbars: specifier: ^6.3.0 version: 6.3.0 @@ -119,19 +173,19 @@ importers: version: 2.1.2(@babel/core@7.24.5) ember-modifier: specifier: ^4.1.0 - version: 4.1.0(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(rsvp@4.8.5)(webpack@5.91.0)) + version: 4.1.0(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0)) ember-qunit: specifier: ^8.0.2 - version: 8.0.2(@ember/test-helpers@3.3.0(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(rsvp@4.8.5)(webpack@5.91.0))(webpack@5.91.0))(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(rsvp@4.8.5)(webpack@5.91.0))(qunit@2.20.1) + version: 8.0.2(@ember/test-helpers@3.3.0(@glint/template@1.4.0)(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0))(webpack@5.91.0))(@glint/template@1.4.0)(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0))(qunit@2.20.1) ember-resolver: specifier: ^11.0.1 - version: 11.0.1(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(rsvp@4.8.5)(webpack@5.91.0)) + version: 11.0.1(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0)) ember-sinon: specifier: ^3.0.0 version: 3.1.0 ember-source: specifier: ~5.8.0 - version: 5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(rsvp@4.8.5)(webpack@5.91.0) + version: 5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0) ember-source-channel-url: specifier: ^2.0.1 version: 2.0.1 @@ -161,16 +215,19 @@ importers: version: 2.0.0 stylelint: specifier: ^15.11.0 - version: 15.11.0 + version: 15.11.0(typescript@5.5.3) stylelint-config-standard: specifier: ^34.0.0 - version: 34.0.0(stylelint@15.11.0) + version: 34.0.0(stylelint@15.11.0(typescript@5.5.3)) stylelint-prettier: specifier: ^4.1.0 - version: 4.1.0(prettier@2.8.8)(stylelint@15.11.0) + version: 4.1.0(prettier@2.8.8)(stylelint@15.11.0(typescript@5.5.3)) tracked-built-ins: specifier: ^3.3.0 version: 3.3.0 + typescript: + specifier: ^5.4.5 + version: 5.5.3 webpack: specifier: ^5.91.0 version: 5.91.0 @@ -182,16 +239,19 @@ importers: version: 2.1.0 '@ember/test-helpers': specifier: ^2.4.2 - version: 2.9.4(@babel/core@7.24.5)(ember-source@3.28.12(@babel/core@7.24.5)) + version: 2.9.4(@babel/core@7.24.5)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(ember-cli-htmlbars@6.3.0))(@glint/template@1.4.0)(ember-source@3.28.12(@babel/core@7.24.5)) '@embroider/compat': specifier: ^3.4.8 - version: 3.5.0(@embroider/core@3.4.9) + version: 3.5.0(@embroider/core@3.4.9(@glint/template@1.4.0))(@glint/template@1.4.0) '@embroider/core': specifier: ^3.4.8 - version: 3.4.9 + version: 3.4.9(@glint/template@1.4.0) '@embroider/webpack': specifier: ^4.0.0 - version: 4.0.0(@embroider/core@3.4.9)(webpack@5.91.0) + version: 4.0.0(@embroider/core@3.4.9(@glint/template@1.4.0))(webpack@5.91.0) + '@glimmer/component': + specifier: ^1.1.2 + version: 1.1.2(@babel/core@7.24.5) '@nullvoxpopuli/ember-composable-helpers': specifier: workspace:* version: link:../ember-composable-helpers @@ -206,19 +266,19 @@ importers: version: 3.5.0 ember-auto-import: specifier: 2.6.3 - version: 2.6.3(webpack@5.91.0) + version: 2.6.3(@glint/template@1.4.0)(webpack@5.91.0) ember-cli: specifier: ~3.28.0 - version: 3.28.6(babel-core@6.26.3)(encoding@0.1.13)(handlebars@4.7.8)(jade@0.26.3)(lodash@4.17.21)(underscore@1.13.6) + version: 3.28.6(babel-core@6.26.3)(encoding@0.1.13)(handlebars@4.7.8)(lodash@4.17.21)(underscore@1.13.6) ember-cli-babel: specifier: ^7.26.3 version: 7.26.11 ember-cli-dependency-checker: specifier: ^3.0.0 - version: 3.3.2(ember-cli@3.28.6(babel-core@6.26.3)(encoding@0.1.13)(handlebars@4.7.8)(jade@0.26.3)(lodash@4.17.21)(underscore@1.13.6)) + version: 3.3.2(ember-cli@3.28.6(babel-core@6.26.3)(encoding@0.1.13)(handlebars@4.7.8)(lodash@4.17.21)(underscore@1.13.6)) ember-cli-htmlbars: - specifier: ^5.7.1 - version: 5.7.2 + specifier: ^6.3.0 + version: 6.3.0 ember-cli-inject-live-reload: specifier: ^1.8.2 version: 1.10.2 @@ -248,7 +308,7 @@ importers: version: 0.1.6(@babel/core@7.24.5) ember-qunit: specifier: ^5.1.4 - version: 5.1.5(@ember/test-helpers@2.9.4(@babel/core@7.24.5)(ember-source@3.28.12(@babel/core@7.24.5)))(qunit@2.20.1) + version: 5.1.5(@ember/test-helpers@2.9.4(@babel/core@7.24.5)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(ember-cli-htmlbars@6.3.0))(@glint/template@1.4.0)(ember-source@3.28.12(@babel/core@7.24.5)))(qunit@2.20.1) ember-resolver: specifier: ^8.0.2 version: 8.1.0(@babel/core@7.24.5) @@ -299,16 +359,19 @@ importers: version: 2.1.0 '@ember/test-helpers': specifier: ^2.4.2 - version: 2.9.4(@babel/core@7.24.5)(ember-source@3.28.12(@babel/core@7.24.5)) + version: 2.9.4(@babel/core@7.24.5)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(ember-cli-htmlbars@5.7.2))(@glint/template@1.4.0)(ember-source@3.28.12(@babel/core@7.24.5)) '@embroider/compat': specifier: ^3.4.8 - version: 3.5.0(@embroider/core@3.4.9) + version: 3.5.0(@embroider/core@3.4.9(@glint/template@1.4.0))(@glint/template@1.4.0) '@embroider/core': specifier: ^3.4.8 - version: 3.4.9 + version: 3.4.9(@glint/template@1.4.0) '@embroider/webpack': specifier: ^4.0.0 - version: 4.0.0(@embroider/core@3.4.9)(webpack@5.91.0) + version: 4.0.0(@embroider/core@3.4.9(@glint/template@1.4.0))(webpack@5.91.0) + '@glimmer/component': + specifier: ^1.1.2 + version: 1.1.2(@babel/core@7.24.5) '@nullvoxpopuli/ember-composable-helpers': specifier: workspace:* version: link:../ember-composable-helpers @@ -323,16 +386,16 @@ importers: version: 3.5.0 ember-auto-import: specifier: 2.6.3 - version: 2.6.3(webpack@5.91.0) + version: 2.6.3(@glint/template@1.4.0)(webpack@5.91.0) ember-cli: specifier: ~3.28.0 - version: 3.28.6(babel-core@6.26.3)(encoding@0.1.13)(handlebars@4.7.8)(jade@0.26.3)(lodash@4.17.21)(underscore@1.13.6) + version: 3.28.6(babel-core@6.26.3)(encoding@0.1.13)(handlebars@4.7.8)(lodash@4.17.21)(underscore@1.13.6) ember-cli-babel: specifier: ^7.26.3 version: 7.26.11 ember-cli-dependency-checker: specifier: ^3.0.0 - version: 3.3.2(ember-cli@3.28.6(babel-core@6.26.3)(encoding@0.1.13)(handlebars@4.7.8)(jade@0.26.3)(lodash@4.17.21)(underscore@1.13.6)) + version: 3.3.2(ember-cli@3.28.6(babel-core@6.26.3)(encoding@0.1.13)(handlebars@4.7.8)(lodash@4.17.21)(underscore@1.13.6)) ember-cli-htmlbars: specifier: ^5.7.1 version: 5.7.2 @@ -365,7 +428,7 @@ importers: version: 0.1.6(@babel/core@7.24.5) ember-qunit: specifier: ^5.1.4 - version: 5.1.5(@ember/test-helpers@2.9.4(@babel/core@7.24.5)(ember-source@3.28.12(@babel/core@7.24.5)))(qunit@2.20.1) + version: 5.1.5(@ember/test-helpers@2.9.4(@babel/core@7.24.5)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(ember-cli-htmlbars@5.7.2))(@glint/template@1.4.0)(ember-source@3.28.12(@babel/core@7.24.5)))(qunit@2.20.1) ember-resolver: specifier: ^8.0.2 version: 8.1.0(@babel/core@7.24.5) @@ -427,13 +490,6 @@ packages: resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} engines: {node: '>=6.9.0'} - '@babel/eslint-parser@7.24.5': - resolution: {integrity: sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ==} - engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} - peerDependencies: - '@babel/core': ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - '@babel/generator@7.24.5': resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} engines: {node: '>=6.9.0'} @@ -1340,6 +1396,62 @@ packages: '@glimmer/wire-format@0.87.1': resolution: {integrity: sha512-O3W1HDfRGX7wHZqvP8UzI/nWyZ2GIMFolU7l6WcLGU9HIdzqfxsc7ae2Icob/fq2kV9meHti4yDEdTMlBVK9AQ==} + '@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==} + '@handlebars/parser@1.1.0': resolution: {integrity: sha512-rR7tJoSwJ2eooOpYGxGGW95sLq6GXUaS1UtWvN7pei6n2/okYvCGld9vsUTvkl2migxbkszsycwtMf/GEc1k1A==} @@ -1406,9 +1518,6 @@ packages: resolution: {integrity: sha512-SkAyKAByB9l93Slyg8AUHGuM2kjvWioUTCckT/03J09jYnfEzMO/wSXmEhnKGYs6qx9De8TH4yJCl0Y9lRgnyQ==} engines: {node: '>=14.18.0'} - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1577,6 +1686,9 @@ packages: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} + '@tsconfig/ember@3.0.8': + resolution: {integrity: sha512-OVnIsZIt/8q0VEtcdz3rRryNrm6gdJTxXlxefkGIrkZnME0wqslmwHlUEZ7mvh377df9FqBhNKrYNarhCW8zJA==} + '@types/babel__code-frame@7.0.6': resolution: {integrity: sha512-Anitqkl3+KrzcW2k77lRlg/GfLZLWXBuNgbEcIOU6M92yw42vsd3xV/Z/yAHEj8m+KUjL6bWOVOFqX8PFPJ4LA==} @@ -1598,6 +1710,66 @@ packages: '@types/cors@2.8.17': resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + '@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__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.16.3': + resolution: {integrity: sha512-0T9ofzm9LL/bSG5u1SxKx/j2h/bHKkl5NKjGCNbFQxEKBw4f2cs6+AMDgWke9z+qrRRIz9vGEtMXnA3yJrO2xA==} + + '@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==} @@ -1664,6 +1836,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==} @@ -1673,6 +1848,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/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -1694,6 +1872,64 @@ packages: '@types/yargs@17.0.32': resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -4533,6 +4769,7 @@ packages: glob@5.0.15: resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} + deprecated: Glob versions prior to v9 are no longer supported glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -5771,6 +6008,10 @@ packages: resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.4: resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} @@ -6834,6 +7075,7 @@ packages: rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@3.0.2: @@ -7632,6 +7874,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' + tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -7704,6 +7952,11 @@ packages: typescript-memoize@1.1.1: resolution: {integrity: sha512-GQ90TcKpIH4XxYTI2F98yEQYZgjNMOGPpOgdjIBhaLaWji5HPWlRnZ4AeA1hfBxtY7bCGDJsqDDHk/KaHOl5bA==} + typescript@5.5.3: + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} + engines: {node: '>=14.17'} + hasBin: true + uc.micro@1.0.6: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} @@ -7863,6 +8116,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.11: + resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} + + 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==} + w3c-hr-time@1.0.2: resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} deprecated: Use your platform's native performance.now() and performance.timeOrigin. @@ -8176,14 +8449,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/eslint-parser@7.24.5(@babel/core@7.24.5)(eslint@8.57.0)': - dependencies: - '@babel/core': 7.24.5 - '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.57.0 - eslint-visitor-keys: 2.1.0 - semver: 6.3.1 - '@babel/generator@7.24.5': dependencies: '@babel/types': 7.24.5 @@ -9559,11 +9824,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@ember/test-helpers@2.9.4(@babel/core@7.24.5)(ember-source@3.28.12(@babel/core@7.24.5))': + '@ember/test-helpers@2.9.4(@babel/core@7.24.5)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(ember-cli-htmlbars@5.7.2))(@glint/template@1.4.0)(ember-source@3.28.12(@babel/core@7.24.5))': dependencies: '@ember/test-waiters': 3.1.0 - '@embroider/macros': 1.16.1 - '@embroider/util': 1.13.1(ember-source@3.28.12(@babel/core@7.24.5)) + '@embroider/macros': 1.16.1(@glint/template@1.4.0) + '@embroider/util': 1.13.1(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(ember-cli-htmlbars@5.7.2))(@glint/template@1.4.0)(ember-source@3.28.12(@babel/core@7.24.5)) broccoli-debug: 0.6.5 broccoli-funnel: 3.0.8 ember-cli-babel: 7.26.11 @@ -9576,18 +9841,35 @@ snapshots: - '@glint/template' - supports-color - '@ember/test-helpers@3.3.0(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(rsvp@4.8.5)(webpack@5.91.0))(webpack@5.91.0)': + '@ember/test-helpers@2.9.4(@babel/core@7.24.5)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(ember-cli-htmlbars@6.3.0))(@glint/template@1.4.0)(ember-source@3.28.12(@babel/core@7.24.5))': dependencies: '@ember/test-waiters': 3.1.0 - '@embroider/macros': 1.16.1 + '@embroider/macros': 1.16.1(@glint/template@1.4.0) + '@embroider/util': 1.13.1(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(ember-cli-htmlbars@6.3.0))(@glint/template@1.4.0)(ember-source@3.28.12(@babel/core@7.24.5)) + broccoli-debug: 0.6.5 + broccoli-funnel: 3.0.8 + ember-cli-babel: 7.26.11 + ember-cli-htmlbars: 6.3.0 + ember-destroyable-polyfill: 2.0.3(@babel/core@7.24.5) + ember-source: 3.28.12(@babel/core@7.24.5) + transitivePeerDependencies: + - '@babel/core' + - '@glint/environment-ember-loose' + - '@glint/template' + - supports-color + + '@ember/test-helpers@3.3.0(@glint/template@1.4.0)(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0))(webpack@5.91.0)': + dependencies: + '@ember/test-waiters': 3.1.0 + '@embroider/macros': 1.16.1(@glint/template@1.4.0) '@simple-dom/interface': 1.4.0 broccoli-debug: 0.6.5 broccoli-funnel: 3.0.8 dom-element-descriptors: 0.5.0 - ember-auto-import: 2.7.2(webpack@5.91.0) + ember-auto-import: 2.7.2(@glint/template@1.4.0)(webpack@5.91.0) ember-cli-babel: 7.26.11 ember-cli-htmlbars: 6.3.0 - ember-source: 5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(rsvp@4.8.5)(webpack@5.91.0) + ember-source: 5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0) transitivePeerDependencies: - '@glint/template' - supports-color @@ -9602,9 +9884,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@embroider/addon-dev@4.3.1(rollup@3.29.4)': + '@embroider/addon-dev@4.3.1(@glint/template@1.4.0)(rollup@3.29.4)': dependencies: - '@embroider/core': 3.4.9 + '@embroider/core': 3.4.9(@glint/template@1.4.0) '@rollup/pluginutils': 4.2.1 content-tag: 2.0.1 fs-extra: 10.1.0 @@ -9630,16 +9912,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@embroider/babel-loader-9@3.1.1(@embroider/core@3.4.9)(supports-color@8.1.1)(webpack@5.91.0)': + '@embroider/babel-loader-9@3.1.1(@embroider/core@3.4.9(@glint/template@1.4.0))(supports-color@8.1.1)(webpack@5.91.0)': dependencies: '@babel/core': 7.24.5(supports-color@8.1.1) - '@embroider/core': 3.4.9 + '@embroider/core': 3.4.9(@glint/template@1.4.0) babel-loader: 9.1.3(@babel/core@7.24.5(supports-color@8.1.1))(webpack@5.91.0) transitivePeerDependencies: - supports-color - webpack - '@embroider/compat@3.5.0(@embroider/core@3.4.9)': + '@embroider/compat@3.5.0(@embroider/core@3.4.9(@glint/template@1.4.0))(@glint/template@1.4.0)': dependencies: '@babel/code-frame': 7.24.2 '@babel/core': 7.24.5 @@ -9648,8 +9930,8 @@ snapshots: '@babel/preset-env': 7.24.5(@babel/core@7.24.5) '@babel/runtime': 7.24.5 '@babel/traverse': 7.24.5(supports-color@8.1.1) - '@embroider/core': 3.4.9 - '@embroider/macros': 1.16.1 + '@embroider/core': 3.4.9(@glint/template@1.4.0) + '@embroider/macros': 1.16.1(@glint/template@1.4.0) '@types/babel__code-frame': 7.0.6 '@types/yargs': 17.0.32 assert-never: 1.2.1 @@ -9690,12 +9972,12 @@ snapshots: - supports-color - utf-8-validate - '@embroider/core@3.4.9': + '@embroider/core@3.4.9(@glint/template@1.4.0)': dependencies: '@babel/core': 7.24.5 '@babel/parser': 7.24.5 '@babel/traverse': 7.24.5(supports-color@8.1.1) - '@embroider/macros': 1.16.1 + '@embroider/macros': 1.16.1(@glint/template@1.4.0) '@embroider/shared-internals': 2.6.0(supports-color@8.1.1) assert-never: 1.2.1 babel-plugin-ember-template-compilation: 2.2.5 @@ -9723,12 +10005,12 @@ snapshots: - supports-color - utf-8-validate - '@embroider/hbs-loader@3.0.3(@embroider/core@3.4.9)(webpack@5.91.0)': + '@embroider/hbs-loader@3.0.3(@embroider/core@3.4.9(@glint/template@1.4.0))(webpack@5.91.0)': dependencies: - '@embroider/core': 3.4.9 + '@embroider/core': 3.4.9(@glint/template@1.4.0) webpack: 5.91.0 - '@embroider/macros@1.16.1': + '@embroider/macros@1.16.1(@glint/template@1.4.0)': dependencies: '@embroider/shared-internals': 2.6.0(supports-color@8.1.1) assert-never: 1.2.1 @@ -9738,6 +10020,8 @@ snapshots: lodash: 4.17.21 resolve: 1.22.8 semver: 7.6.2 + optionalDependencies: + '@glint/template': 1.4.0 transitivePeerDependencies: - supports-color @@ -9767,22 +10051,37 @@ snapshots: transitivePeerDependencies: - supports-color - '@embroider/util@1.13.1(ember-source@3.28.12(@babel/core@7.24.5))': + '@embroider/util@1.13.1(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(ember-cli-htmlbars@5.7.2))(@glint/template@1.4.0)(ember-source@3.28.12(@babel/core@7.24.5))': + dependencies: + '@embroider/macros': 1.16.1(@glint/template@1.4.0) + broccoli-funnel: 3.0.8 + ember-cli-babel: 7.26.11 + ember-source: 3.28.12(@babel/core@7.24.5) + optionalDependencies: + '@glint/environment-ember-loose': 1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(ember-cli-htmlbars@5.7.2) + '@glint/template': 1.4.0 + transitivePeerDependencies: + - supports-color + + '@embroider/util@1.13.1(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(ember-cli-htmlbars@6.3.0))(@glint/template@1.4.0)(ember-source@3.28.12(@babel/core@7.24.5))': dependencies: - '@embroider/macros': 1.16.1 + '@embroider/macros': 1.16.1(@glint/template@1.4.0) broccoli-funnel: 3.0.8 ember-cli-babel: 7.26.11 ember-source: 3.28.12(@babel/core@7.24.5) + optionalDependencies: + '@glint/environment-ember-loose': 1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.24.5))(@types/ember__component@4.0.22(@babel/core@7.24.5))(@types/ember__controller@4.0.12(@babel/core@7.24.5))(@types/ember__object@4.0.12(@babel/core@7.24.5))(@types/ember__routing@4.0.22(@babel/core@7.24.5))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0))) + '@glint/template': 1.4.0 transitivePeerDependencies: - supports-color - '@embroider/webpack@4.0.0(@embroider/core@3.4.9)(webpack@5.91.0)': + '@embroider/webpack@4.0.0(@embroider/core@3.4.9(@glint/template@1.4.0))(webpack@5.91.0)': dependencies: '@babel/core': 7.24.5(supports-color@8.1.1) '@babel/preset-env': 7.24.5(@babel/core@7.24.5(supports-color@8.1.1))(supports-color@8.1.1) - '@embroider/babel-loader-9': 3.1.1(@embroider/core@3.4.9)(supports-color@8.1.1)(webpack@5.91.0) - '@embroider/core': 3.4.9 - '@embroider/hbs-loader': 3.0.3(@embroider/core@3.4.9)(webpack@5.91.0) + '@embroider/babel-loader-9': 3.1.1(@embroider/core@3.4.9(@glint/template@1.4.0))(supports-color@8.1.1)(webpack@5.91.0) + '@embroider/core': 3.4.9(@glint/template@1.4.0) + '@embroider/hbs-loader': 3.0.3(@embroider/core@3.4.9(@glint/template@1.4.0))(webpack@5.91.0) '@embroider/shared-internals': 2.6.0(supports-color@8.1.1) '@types/supports-color': 8.1.3 assert-never: 1.2.1 @@ -9913,7 +10212,7 @@ snapshots: '@glimmer/interfaces': 0.87.1 '@glimmer/reference': 0.87.1 '@glimmer/util': 0.87.1 - '@glimmer/validator': 0.84.3 + '@glimmer/validator': 0.87.1 '@glimmer/vm': 0.87.1 '@glimmer/node@0.87.1': @@ -9973,7 +10272,7 @@ snapshots: '@glimmer/global-context': 0.87.1 '@glimmer/interfaces': 0.87.1 '@glimmer/util': 0.87.1 - '@glimmer/validator': 0.84.3 + '@glimmer/validator': 0.87.1 '@glimmer/runtime@0.87.1': dependencies: @@ -10070,6 +10369,55 @@ snapshots: '@glimmer/interfaces': 0.87.1 '@glimmer/util': 0.87.1 + '@glint/core@1.4.0(typescript@5.5.3)': + dependencies: + '@glimmer/syntax': 0.84.3 + escape-string-regexp: 4.0.0 + semver: 7.6.2 + silent-error: 1.1.1 + typescript: 5.5.3 + uuid: 8.3.2 + vscode-languageserver: 8.1.0 + vscode-languageserver-textdocument: 1.0.11 + 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.24.5))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.24.5))(@types/ember__component@4.0.22(@babel/core@7.24.5))(@types/ember__controller@4.0.12(@babel/core@7.24.5))(@types/ember__object@4.0.12(@babel/core@7.24.5))(@types/ember__routing@4.0.22(@babel/core@7.24.5))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0)))': + dependencies: + '@glimmer/component': 1.1.2(@babel/core@7.24.5) + '@glint/template': 1.4.0 + optionalDependencies: + '@types/ember__array': 4.0.10(@babel/core@7.24.5) + '@types/ember__component': 4.0.22(@babel/core@7.24.5) + '@types/ember__controller': 4.0.12(@babel/core@7.24.5) + '@types/ember__object': 4.0.12(@babel/core@7.24.5) + '@types/ember__routing': 4.0.22(@babel/core@7.24.5) + ember-cli-htmlbars: 6.3.0 + ember-modifier: 4.1.0(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0)) + + '@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(ember-cli-htmlbars@5.7.2)': + dependencies: + '@glimmer/component': 1.1.2(@babel/core@7.24.5) + '@glint/template': 1.4.0 + optionalDependencies: + ember-cli-htmlbars: 5.7.2 + optional: true + + '@glint/environment-ember-template-imports@1.4.0(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.24.5))(@types/ember__component@4.0.22(@babel/core@7.24.5))(@types/ember__controller@4.0.12(@babel/core@7.24.5))(@types/ember__object@4.0.12(@babel/core@7.24.5))(@types/ember__routing@4.0.22(@babel/core@7.24.5))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0))))(@glint/template@1.4.0)(@types/ember__component@4.0.22(@babel/core@7.24.5))(@types/ember__helper@4.0.8(@babel/core@7.24.5))(@types/ember__modifier@4.0.9(@babel/core@7.24.5))(@types/ember__routing@4.0.22(@babel/core@7.24.5))': + dependencies: + '@glint/environment-ember-loose': 1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(@types/ember__array@4.0.10(@babel/core@7.24.5))(@types/ember__component@4.0.22(@babel/core@7.24.5))(@types/ember__controller@4.0.12(@babel/core@7.24.5))(@types/ember__object@4.0.12(@babel/core@7.24.5))(@types/ember__routing@4.0.22(@babel/core@7.24.5))(ember-cli-htmlbars@6.3.0)(ember-modifier@4.1.0(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0))) + '@glint/template': 1.4.0 + content-tag: 2.0.1 + optionalDependencies: + '@types/ember__component': 4.0.22(@babel/core@7.24.5) + '@types/ember__helper': 4.0.8(@babel/core@7.24.5) + '@types/ember__modifier': 4.0.9(@babel/core@7.24.5) + '@types/ember__routing': 4.0.22(@babel/core@7.24.5) + + '@glint/template@1.4.0': {} + '@handlebars/parser@1.1.0': {} '@handlebars/parser@2.0.0': {} @@ -10151,10 +10499,6 @@ snapshots: jju: 1.4.0 read-yaml-file: 1.1.0 - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - dependencies: - eslint-scope: 5.1.1 - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -10357,6 +10701,8 @@ snapshots: '@tootallnate/once@1.1.2': {} + '@tsconfig/ember@3.0.8': {} + '@types/babel__code-frame@7.0.6': {} '@types/body-parser@1.19.5': @@ -10380,6 +10726,197 @@ snapshots: dependencies: '@types/node': 20.12.12 + '@types/ember@4.0.11': + dependencies: + '@types/ember__application': 4.0.11(@babel/core@7.24.5) + '@types/ember__array': 4.0.10(@babel/core@7.24.5) + '@types/ember__component': 4.0.22(@babel/core@7.24.5) + '@types/ember__controller': 4.0.12(@babel/core@7.24.5) + '@types/ember__debug': 4.0.8 + '@types/ember__engine': 4.0.11 + '@types/ember__error': 4.0.6 + '@types/ember__object': 4.0.12(@babel/core@7.24.5) + '@types/ember__polyfills': 4.0.6 + '@types/ember__routing': 4.0.22(@babel/core@7.24.5) + '@types/ember__runloop': 4.0.10 + '@types/ember__service': 4.0.9 + '@types/ember__string': 3.16.3 + '@types/ember__template': 4.0.7 + '@types/ember__test': 4.0.6(@babel/core@7.24.5) + '@types/ember__utils': 4.0.7 + '@types/rsvp': 4.0.9 + optional: true + + '@types/ember@4.0.11(@babel/core@7.24.5)': + dependencies: + '@types/ember__application': 4.0.11(@babel/core@7.24.5) + '@types/ember__array': 4.0.10(@babel/core@7.24.5) + '@types/ember__component': 4.0.22(@babel/core@7.24.5) + '@types/ember__controller': 4.0.12(@babel/core@7.24.5) + '@types/ember__debug': 4.0.8 + '@types/ember__engine': 4.0.11 + '@types/ember__error': 4.0.6 + '@types/ember__object': 4.0.12(@babel/core@7.24.5) + '@types/ember__polyfills': 4.0.6 + '@types/ember__routing': 4.0.22(@babel/core@7.24.5) + '@types/ember__runloop': 4.0.10(@babel/core@7.24.5) + '@types/ember__service': 4.0.9 + '@types/ember__string': 3.16.3 + '@types/ember__template': 4.0.7 + '@types/ember__test': 4.0.6(@babel/core@7.24.5) + '@types/ember__utils': 4.0.7(@babel/core@7.24.5) + '@types/rsvp': 4.0.9 + transitivePeerDependencies: + - '@babel/core' + - supports-color + optional: true + + '@types/ember__application@4.0.11(@babel/core@7.24.5)': + dependencies: + '@glimmer/component': 1.1.2(@babel/core@7.24.5) + '@types/ember': 4.0.11 + '@types/ember__engine': 4.0.11 + '@types/ember__object': 4.0.12(@babel/core@7.24.5) + '@types/ember__owner': 4.0.9 + '@types/ember__routing': 4.0.22(@babel/core@7.24.5) + transitivePeerDependencies: + - '@babel/core' + - supports-color + optional: true + + '@types/ember__array@4.0.10(@babel/core@7.24.5)': + dependencies: + '@types/ember': 4.0.11(@babel/core@7.24.5) + '@types/ember__object': 4.0.12(@babel/core@7.24.5) + transitivePeerDependencies: + - '@babel/core' + - supports-color + optional: true + + '@types/ember__component@4.0.22(@babel/core@7.24.5)': + dependencies: + '@types/ember': 4.0.11(@babel/core@7.24.5) + '@types/ember__object': 4.0.12(@babel/core@7.24.5) + transitivePeerDependencies: + - '@babel/core' + - supports-color + optional: true + + '@types/ember__controller@4.0.12(@babel/core@7.24.5)': + dependencies: + '@types/ember__object': 4.0.12(@babel/core@7.24.5) + transitivePeerDependencies: + - '@babel/core' + - supports-color + optional: true + + '@types/ember__debug@4.0.8': + dependencies: + '@types/ember__object': 4.0.12(@babel/core@7.24.5) + '@types/ember__owner': 4.0.9 + optional: true + + '@types/ember__engine@4.0.11': + dependencies: + '@types/ember__object': 4.0.12(@babel/core@7.24.5) + '@types/ember__owner': 4.0.9 + optional: true + + '@types/ember__error@4.0.6': + optional: true + + '@types/ember__helper@4.0.8(@babel/core@7.24.5)': + dependencies: + '@glimmer/manager': 0.87.1 + '@glimmer/runtime': 0.87.1 + '@types/ember': 4.0.11(@babel/core@7.24.5) + transitivePeerDependencies: + - '@babel/core' + - supports-color + optional: true + + '@types/ember__modifier@4.0.9(@babel/core@7.24.5)': + dependencies: + '@types/ember': 4.0.11(@babel/core@7.24.5) + '@types/ember__owner': 4.0.9 + transitivePeerDependencies: + - '@babel/core' + - supports-color + optional: true + + '@types/ember__object@4.0.12(@babel/core@7.24.5)': + dependencies: + '@types/ember': 4.0.11(@babel/core@7.24.5) + '@types/rsvp': 4.0.9 + transitivePeerDependencies: + - '@babel/core' + - supports-color + optional: true + + '@types/ember__owner@4.0.9': + optional: true + + '@types/ember__polyfills@4.0.6': + optional: true + + '@types/ember__routing@4.0.22(@babel/core@7.24.5)': + dependencies: + '@types/ember': 4.0.11(@babel/core@7.24.5) + '@types/ember__controller': 4.0.12(@babel/core@7.24.5) + '@types/ember__object': 4.0.12(@babel/core@7.24.5) + '@types/ember__service': 4.0.9 + transitivePeerDependencies: + - '@babel/core' + - supports-color + optional: true + + '@types/ember__runloop@4.0.10': + dependencies: + '@types/ember': 4.0.11 + optional: true + + '@types/ember__runloop@4.0.10(@babel/core@7.24.5)': + dependencies: + '@types/ember': 4.0.11(@babel/core@7.24.5) + transitivePeerDependencies: + - '@babel/core' + - supports-color + optional: true + + '@types/ember__service@4.0.9': + dependencies: + '@types/ember__object': 4.0.12(@babel/core@7.24.5) + optional: true + + '@types/ember__string@3.16.3': + dependencies: + '@types/ember__template': 4.0.7 + optional: true + + '@types/ember__template@4.0.7': + optional: true + + '@types/ember__test@4.0.6(@babel/core@7.24.5)': + dependencies: + '@types/ember__application': 4.0.11(@babel/core@7.24.5) + transitivePeerDependencies: + - '@babel/core' + - supports-color + optional: true + + '@types/ember__utils@4.0.7': + dependencies: + '@types/ember': 4.0.11 + optional: true + + '@types/ember__utils@4.0.7(@babel/core@7.24.5)': + dependencies: + '@types/ember': 4.0.11(@babel/core@7.24.5) + transitivePeerDependencies: + - '@babel/core' + - supports-color + optional: true + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 8.56.10 @@ -10459,6 +10996,8 @@ snapshots: '@types/qs@6.9.15': {} + '@types/qunit@2.19.10': {} + '@types/range-parser@1.2.7': {} '@types/responselike@1.0.3': @@ -10470,6 +11009,8 @@ snapshots: '@types/glob': 8.1.0 '@types/node': 20.12.12 + '@types/rsvp@4.0.9': {} + '@types/semver@7.5.8': {} '@types/send@0.17.4': @@ -10493,6 +11034,92 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.5.3) + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.57.0 + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.3) + debug: 4.3.4(supports-color@8.1.1) + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.5.3) + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@6.21.0': {} + + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.3)': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.4(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.5.3) + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.3) + eslint: 8.57.0 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 + '@ungap/structured-clone@1.2.0': {} '@webassemblyjs/ast@1.12.1': @@ -12599,13 +13226,12 @@ snapshots: ora: 3.4.0 through2: 3.0.2 - consolidate@0.16.0(babel-core@6.26.3)(handlebars@4.7.8)(jade@0.26.3)(lodash@4.17.21)(mustache@4.2.0)(underscore@1.13.6): + consolidate@0.16.0(babel-core@6.26.3)(handlebars@4.7.8)(lodash@4.17.21)(mustache@4.2.0)(underscore@1.13.6): dependencies: bluebird: 3.7.2 optionalDependencies: babel-core: 6.26.3 handlebars: 4.7.8 - jade: 0.26.3 lodash: 4.17.21 mustache: 4.2.0 underscore: 1.13.6 @@ -12664,12 +13290,14 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig@8.3.6: + cosmiconfig@8.3.6(typescript@5.5.3): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 + optionalDependencies: + typescript: 5.5.3 create-ecdh@4.0.4: dependencies: @@ -13016,13 +13644,13 @@ snapshots: - webpack-cli - webpack-command - ember-auto-import@2.6.3(webpack@5.91.0): + ember-auto-import@2.6.3(@glint/template@1.4.0)(webpack@5.91.0): dependencies: '@babel/core': 7.24.5 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.5) '@babel/plugin-proposal-decorators': 7.24.1(@babel/core@7.24.5) '@babel/preset-env': 7.24.5(@babel/core@7.24.5) - '@embroider/macros': 1.16.1 + '@embroider/macros': 1.16.1(@glint/template@1.4.0) '@embroider/shared-internals': 2.6.0(supports-color@8.1.1) babel-loader: 8.3.0(@babel/core@7.24.5)(webpack@5.91.0) babel-plugin-ember-modules-api-polyfill: 3.5.0 @@ -13054,7 +13682,7 @@ snapshots: - supports-color - webpack - ember-auto-import@2.7.2(webpack@5.91.0): + ember-auto-import@2.7.2(@glint/template@1.4.0)(webpack@5.91.0): dependencies: '@babel/core': 7.24.5 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.5) @@ -13062,7 +13690,7 @@ snapshots: '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.24.5) '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.5) '@babel/preset-env': 7.24.5(@babel/core@7.24.5) - '@embroider/macros': 1.16.1 + '@embroider/macros': 1.16.1(@glint/template@1.4.0) '@embroider/shared-internals': 2.6.0(supports-color@8.1.1) babel-loader: 8.3.0(@babel/core@7.24.5)(webpack@5.91.0) babel-plugin-ember-modules-api-polyfill: 3.5.0 @@ -13192,10 +13820,10 @@ snapshots: transitivePeerDependencies: - supports-color - ember-cli-dependency-checker@3.3.2(ember-cli@3.28.6(babel-core@6.26.3)(encoding@0.1.13)(handlebars@4.7.8)(jade@0.26.3)(lodash@4.17.21)(underscore@1.13.6)): + ember-cli-dependency-checker@3.3.2(ember-cli@3.28.6(babel-core@6.26.3)(encoding@0.1.13)(handlebars@4.7.8)(lodash@4.17.21)(underscore@1.13.6)): dependencies: chalk: 2.4.2 - ember-cli: 3.28.6(babel-core@6.26.3)(encoding@0.1.13)(handlebars@4.7.8)(jade@0.26.3)(lodash@4.17.21)(underscore@1.13.6) + ember-cli: 3.28.6(babel-core@6.26.3)(encoding@0.1.13)(handlebars@4.7.8)(lodash@4.17.21)(underscore@1.13.6) find-yarn-workspace-root: 1.2.1 is-git-url: 1.0.0 resolve: 1.22.8 @@ -13203,10 +13831,10 @@ snapshots: transitivePeerDependencies: - supports-color - ember-cli-dependency-checker@3.3.2(ember-cli@5.8.1(babel-core@6.26.3)(handlebars@4.7.8)(jade@0.26.3)(underscore@1.13.6)): + ember-cli-dependency-checker@3.3.2(ember-cli@5.8.1(babel-core@6.26.3)(handlebars@4.7.8)(underscore@1.13.6)): dependencies: chalk: 2.4.2 - ember-cli: 5.8.1(babel-core@6.26.3)(handlebars@4.7.8)(jade@0.26.3)(underscore@1.13.6) + ember-cli: 5.8.1(babel-core@6.26.3)(handlebars@4.7.8)(underscore@1.13.6) find-yarn-workspace-root: 1.2.1 is-git-url: 1.0.0 resolve: 1.22.8 @@ -13391,7 +14019,7 @@ snapshots: transitivePeerDependencies: - supports-color - ember-cli@3.28.6(babel-core@6.26.3)(encoding@0.1.13)(handlebars@4.7.8)(jade@0.26.3)(lodash@4.17.21)(underscore@1.13.6): + ember-cli@3.28.6(babel-core@6.26.3)(encoding@0.1.13)(handlebars@4.7.8)(lodash@4.17.21)(underscore@1.13.6): dependencies: '@babel/core': 7.24.5 '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.5) @@ -13476,7 +14104,7 @@ snapshots: sort-package-json: 1.57.0 symlink-or-copy: 1.3.1 temp: 0.9.4 - testem: 3.13.0(babel-core@6.26.3)(handlebars@4.7.8)(jade@0.26.3)(lodash@4.17.21)(underscore@1.13.6) + testem: 3.13.0(babel-core@6.26.3)(handlebars@4.7.8)(lodash@4.17.21)(underscore@1.13.6) tiny-lr: 2.0.0 tree-sync: 2.1.0 uuid: 8.3.2 @@ -13543,7 +14171,7 @@ snapshots: - walrus - whiskers - ember-cli@5.8.1(babel-core@6.26.3)(handlebars@4.7.8)(jade@0.26.3)(underscore@1.13.6): + ember-cli@5.8.1(babel-core@6.26.3)(handlebars@4.7.8)(underscore@1.13.6): dependencies: '@pnpm/find-workspace-dir': 6.0.3 broccoli: 3.5.2 @@ -13622,7 +14250,7 @@ snapshots: sort-package-json: 1.57.0 symlink-or-copy: 1.3.1 temp: 0.9.4 - testem: 3.13.0(babel-core@6.26.3)(handlebars@4.7.8)(jade@0.26.3)(lodash@4.17.21)(underscore@1.13.6) + testem: 3.13.0(babel-core@6.26.3)(handlebars@4.7.8)(lodash@4.17.21)(underscore@1.13.6) tiny-lr: 2.0.0 tree-sync: 2.1.0 walk-sync: 3.0.0 @@ -13735,19 +14363,19 @@ snapshots: - '@babel/core' - supports-color - ember-modifier@4.1.0(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(rsvp@4.8.5)(webpack@5.91.0)): + ember-modifier@4.1.0(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0)): dependencies: '@embroider/addon-shim': 1.8.8 ember-cli-normalize-entity-name: 1.0.0 ember-cli-string-utils: 1.1.0 optionalDependencies: - ember-source: 5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(rsvp@4.8.5)(webpack@5.91.0) + ember-source: 5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0) transitivePeerDependencies: - supports-color - ember-qunit@5.1.5(@ember/test-helpers@2.9.4(@babel/core@7.24.5)(ember-source@3.28.12(@babel/core@7.24.5)))(qunit@2.20.1): + ember-qunit@5.1.5(@ember/test-helpers@2.9.4(@babel/core@7.24.5)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(ember-cli-htmlbars@5.7.2))(@glint/template@1.4.0)(ember-source@3.28.12(@babel/core@7.24.5)))(qunit@2.20.1): dependencies: - '@ember/test-helpers': 2.9.4(@babel/core@7.24.5)(ember-source@3.28.12(@babel/core@7.24.5)) + '@ember/test-helpers': 2.9.4(@babel/core@7.24.5)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(ember-cli-htmlbars@5.7.2))(@glint/template@1.4.0)(ember-source@3.28.12(@babel/core@7.24.5)) broccoli-funnel: 3.0.8 broccoli-merge-trees: 3.0.2 common-tags: 1.8.2 @@ -13763,23 +14391,41 @@ snapshots: - webpack-cli - webpack-command - ember-qunit@8.0.2(@ember/test-helpers@3.3.0(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(rsvp@4.8.5)(webpack@5.91.0))(webpack@5.91.0))(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(rsvp@4.8.5)(webpack@5.91.0))(qunit@2.20.1): + ember-qunit@5.1.5(@ember/test-helpers@2.9.4(@babel/core@7.24.5)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(ember-cli-htmlbars@6.3.0))(@glint/template@1.4.0)(ember-source@3.28.12(@babel/core@7.24.5)))(qunit@2.20.1): dependencies: - '@ember/test-helpers': 3.3.0(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(rsvp@4.8.5)(webpack@5.91.0))(webpack@5.91.0) + '@ember/test-helpers': 2.9.4(@babel/core@7.24.5)(@glint/environment-ember-loose@1.4.0(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(ember-cli-htmlbars@6.3.0))(@glint/template@1.4.0)(ember-source@3.28.12(@babel/core@7.24.5)) + broccoli-funnel: 3.0.8 + broccoli-merge-trees: 3.0.2 + common-tags: 1.8.2 + ember-auto-import: 1.12.2 + ember-cli-babel: 7.26.11 + ember-cli-test-loader: 3.1.0 + qunit: 2.20.1 + resolve-package-path: 3.1.0 + silent-error: 1.1.1 + validate-peer-dependencies: 1.2.0 + transitivePeerDependencies: + - supports-color + - webpack-cli + - webpack-command + + ember-qunit@8.0.2(@ember/test-helpers@3.3.0(@glint/template@1.4.0)(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0))(webpack@5.91.0))(@glint/template@1.4.0)(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0))(qunit@2.20.1): + dependencies: + '@ember/test-helpers': 3.3.0(@glint/template@1.4.0)(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0))(webpack@5.91.0) '@embroider/addon-shim': 1.8.8 - '@embroider/macros': 1.16.1 + '@embroider/macros': 1.16.1(@glint/template@1.4.0) ember-cli-test-loader: 3.1.0 - ember-source: 5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(rsvp@4.8.5)(webpack@5.91.0) + ember-source: 5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0) qunit: 2.20.1 transitivePeerDependencies: - '@glint/template' - supports-color - ember-resolver@11.0.1(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(rsvp@4.8.5)(webpack@5.91.0)): + ember-resolver@11.0.1(ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0)): dependencies: ember-cli-babel: 7.26.11 optionalDependencies: - ember-source: 5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(rsvp@4.8.5)(webpack@5.91.0) + ember-source: 5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0) transitivePeerDependencies: - supports-color @@ -13856,7 +14502,7 @@ snapshots: - '@babel/core' - supports-color - ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(rsvp@4.8.5)(webpack@5.91.0): + ember-source@5.8.0(@babel/core@7.24.5)(@glimmer/component@1.1.2(@babel/core@7.24.5))(@glint/template@1.4.0)(rsvp@4.8.5)(webpack@5.91.0): dependencies: '@babel/helper-module-imports': 7.24.3 '@ember/edition-utils': 1.2.0 @@ -13889,7 +14535,7 @@ snapshots: broccoli-funnel: 3.0.8 broccoli-merge-trees: 4.2.0 chalk: 4.1.2 - ember-auto-import: 2.7.2(webpack@5.91.0) + ember-auto-import: 2.7.2(@glint/template@1.4.0)(webpack@5.91.0) ember-cli-babel: 7.26.11 ember-cli-get-component-path-option: 1.0.0 ember-cli-is-package-missing: 1.0.0 @@ -16466,6 +17112,10 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.4: dependencies: brace-expansion: 2.0.1 @@ -18227,22 +18877,22 @@ snapshots: styled_string@0.0.1: {} - stylelint-config-recommended@13.0.0(stylelint@15.11.0): + stylelint-config-recommended@13.0.0(stylelint@15.11.0(typescript@5.5.3)): dependencies: - stylelint: 15.11.0 + stylelint: 15.11.0(typescript@5.5.3) - stylelint-config-standard@34.0.0(stylelint@15.11.0): + stylelint-config-standard@34.0.0(stylelint@15.11.0(typescript@5.5.3)): dependencies: - stylelint: 15.11.0 - stylelint-config-recommended: 13.0.0(stylelint@15.11.0) + stylelint: 15.11.0(typescript@5.5.3) + stylelint-config-recommended: 13.0.0(stylelint@15.11.0(typescript@5.5.3)) - stylelint-prettier@4.1.0(prettier@2.8.8)(stylelint@15.11.0): + stylelint-prettier@4.1.0(prettier@2.8.8)(stylelint@15.11.0(typescript@5.5.3)): dependencies: prettier: 2.8.8 prettier-linter-helpers: 1.0.0 - stylelint: 15.11.0 + stylelint: 15.11.0(typescript@5.5.3) - stylelint@15.11.0: + stylelint@15.11.0(typescript@5.5.3): dependencies: '@csstools/css-parser-algorithms': 2.6.3(@csstools/css-tokenizer@2.3.1) '@csstools/css-tokenizer': 2.3.1 @@ -18250,7 +18900,7 @@ snapshots: '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.0.16) balanced-match: 2.0.0 colord: 2.9.3 - cosmiconfig: 8.3.6 + cosmiconfig: 8.3.6(typescript@5.5.3) css-functions-list: 3.2.2 css-tree: 2.3.1 debug: 4.3.4(supports-color@8.1.1) @@ -18416,7 +19066,7 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - testem@3.13.0(babel-core@6.26.3)(handlebars@4.7.8)(jade@0.26.3)(lodash@4.17.21)(underscore@1.13.6): + testem@3.13.0(babel-core@6.26.3)(handlebars@4.7.8)(lodash@4.17.21)(underscore@1.13.6): dependencies: '@xmldom/xmldom': 0.8.10 backbone: 1.6.0 @@ -18424,7 +19074,7 @@ snapshots: charm: 1.0.2 commander: 2.20.3 compression: 1.7.4 - consolidate: 0.16.0(babel-core@6.26.3)(handlebars@4.7.8)(jade@0.26.3)(lodash@4.17.21)(mustache@4.2.0)(underscore@1.13.6) + consolidate: 0.16.0(babel-core@6.26.3)(handlebars@4.7.8)(lodash@4.17.21)(mustache@4.2.0)(underscore@1.13.6) execa: 1.0.0 express: 4.19.2 fireworm: 0.7.2 @@ -18654,6 +19304,10 @@ snapshots: trim-right@1.0.1: {} + ts-api-utils@1.3.0(typescript@5.5.3): + dependencies: + typescript: 5.5.3 + tslib@1.14.1: {} tslib@2.6.2: {} @@ -18727,6 +19381,8 @@ snapshots: typescript-memoize@1.1.1: {} + typescript@5.5.3: {} + uc.micro@1.0.6: {} uglify-js@3.17.4: @@ -18870,6 +19526,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.11: {} + + vscode-languageserver-types@3.17.3: {} + + vscode-languageserver@8.1.0: + dependencies: + vscode-languageserver-protocol: 3.17.3 + + vscode-uri@3.0.8: {} + w3c-hr-time@1.0.2: dependencies: browser-process-hrtime: 1.0.0 diff --git a/test-app-min-supported-classic/package.json b/test-app-min-supported-classic/package.json index 2969e6f..0660b51 100644 --- a/test-app-min-supported-classic/package.json +++ b/test-app-min-supported-classic/package.json @@ -24,6 +24,7 @@ "@embroider/compat": "^3.4.8", "@embroider/core": "^3.4.8", "@embroider/webpack": "^4.0.0", + "@glimmer/component": "^1.1.2", "babel-eslint": "^10.0.3", "broccoli-asset-rev": "^3.0.0", "chai": "^3.5.0", diff --git a/test-app-min-supported/package.json b/test-app-min-supported/package.json index 64d703d..9d4fcc6 100644 --- a/test-app-min-supported/package.json +++ b/test-app-min-supported/package.json @@ -24,6 +24,7 @@ "@embroider/compat": "^3.4.8", "@embroider/core": "^3.4.8", "@embroider/webpack": "^4.0.0", + "@glimmer/component": "^1.1.2", "babel-eslint": "^10.0.3", "broccoli-asset-rev": "^3.0.0", "chai": "^3.5.0", @@ -31,7 +32,7 @@ "ember-cli": "~3.28.0", "ember-cli-babel": "^7.26.3", "ember-cli-dependency-checker": "^3.0.0", - "ember-cli-htmlbars": "^5.7.1", + "ember-cli-htmlbars": "^6.3.0", "ember-cli-inject-live-reload": "^1.8.2", "ember-cli-release": "^0.2.9", "ember-cli-sri": "^2.1.1", diff --git a/test-app/.ember-cli b/test-app/.ember-cli index 465c405..4defd28 100644 --- a/test-app/.ember-cli +++ b/test-app/.ember-cli @@ -3,5 +3,5 @@ Setting `isTypeScriptProject` to true will force the blueprint generators to generate TypeScript rather than JavaScript by default, when a TypeScript version of a given blueprint is available. */ - "isTypeScriptProject": false + "isTypeScriptProject": true } diff --git a/test-app/.eslintrc.js b/test-app/.eslintrc.js index 25ceaab..121ac75 100644 --- a/test-app/.eslintrc.js +++ b/test-app/.eslintrc.js @@ -2,18 +2,11 @@ module.exports = { root: true, - parser: '@babel/eslint-parser', + parser: '@typescript-eslint/parser', parserOptions: { ecmaVersion: 'latest', - sourceType: 'module', - requireConfigFile: false, - babelOptions: { - plugins: [ - ['@babel/plugin-proposal-decorators', { decoratorsBeforeExport: true }], - ], - }, }, - plugins: ['ember'], + plugins: ['ember', '@typescript-eslint'], extends: [ 'eslint:recommended', 'plugin:ember/recommended', @@ -24,6 +17,15 @@ module.exports = { }, rules: {}, overrides: [ + // ts files + { + files: ['**/*.ts'], + extends: [ + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + ], + rules: {}, + }, // node files { files: [ @@ -38,9 +40,6 @@ module.exports = { './lib/*/index.js', './server/**/*.js', ], - parserOptions: { - sourceType: 'script', - }, env: { browser: false, node: true, diff --git a/test-app/app/app.js b/test-app/app/app.ts similarity index 100% rename from test-app/app/app.js rename to test-app/app/app.ts diff --git a/test-app/app/config/environment.d.ts b/test-app/app/config/environment.d.ts new file mode 100644 index 0000000..a1d67fd --- /dev/null +++ b/test-app/app/config/environment.d.ts @@ -0,0 +1,14 @@ +/** + * Type declarations for + * import config from 'test-app/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/test-app/app/resolver.js b/test-app/app/resolver.ts similarity index 100% rename from test-app/app/resolver.js rename to test-app/app/resolver.ts diff --git a/test-app/ember-cli-build.js b/test-app/ember-cli-build.js index 29c343e..fc6542a 100644 --- a/test-app/ember-cli-build.js +++ b/test-app/ember-cli-build.js @@ -4,6 +4,7 @@ const EmberApp = require("ember-cli/lib/broccoli/ember-app"); module.exports = function (defaults) { const app = new EmberApp(defaults, { + 'ember-cli-babel': { enableTypeScriptTransform: true }, // Add options here autoImport: { watchDependencies: ["ember-composable-helpers"], diff --git a/test-app/package.json b/test-app/package.json index 1636d59..072f751 100644 --- a/test-app/package.json +++ b/test-app/package.json @@ -4,10 +4,12 @@ "description": "Composable helpers for Ember", "scripts": { "build": "ember build", + "lint": "concurrently \"npm:lint:*(!fix)\" --names \"lint:\"", "lint:css": "stylelint \"**/*.css\"", "lint:css:fix": "concurrently \"npm:lint:css -- --fix\"", "lint:hbs": "ember-template-lint .", "lint:js": "eslint .", + "lint:types": "glint", "start": "ember serve", "test": "ember test", "node-test": "mocha test --recursive --reporter spec", @@ -22,14 +24,19 @@ ], "devDependencies": { "@babel/core": "^7.24.4", - "@babel/eslint-parser": "^7.24.1", - "@babel/plugin-proposal-decorators": "^7.24.1", "@ember/optional-features": "^2.1.0", "@ember/string": "^3.1.1", "@ember/test-helpers": "^3.3.0", "@embroider/compat": "^3.4.8", "@embroider/core": "^3.4.8", "@embroider/webpack": "^4.0.0", + "@glint/environment-ember-loose": "^1.4.0", + "@glint/template": "^1.4.0", + "@tsconfig/ember": "^3.0.8", + "@types/qunit": "^2.19.10", + "@types/rsvp": "^4.0.9", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", "chai": "^3.5.0", "concurrently": "^8.2.2", "ember-auto-import": "2.7.2", @@ -61,6 +68,7 @@ "stylelint-config-standard": "^34.0.0", "stylelint-prettier": "^4.1.0", "tracked-built-ins": "^3.3.0", + "typescript": "^5.4.5", "webpack": "^5.91.0" }, "keywords": [ diff --git a/test-app/tests/helpers/index.js b/test-app/tests/helpers/index.ts similarity index 81% rename from test-app/tests/helpers/index.js rename to test-app/tests/helpers/index.ts index d37dd68..74e32bc 100644 --- a/test-app/tests/helpers/index.js +++ b/test-app/tests/helpers/index.ts @@ -2,13 +2,14 @@ import { setupApplicationTest as upstreamSetupApplicationTest, setupRenderingTest as upstreamSetupRenderingTest, setupTest as upstreamSetupTest, + type SetupTestOptions, } from 'ember-qunit'; // This file exists to provide wrappers around ember-qunit's // test setup functions. This way, you can easily extend the setup that is // needed per test type. -function setupApplicationTest(hooks, options) { +function setupApplicationTest(hooks: NestedHooks, options?: SetupTestOptions) { upstreamSetupApplicationTest(hooks, options); // Additional setup for application tests can be done here. @@ -27,13 +28,13 @@ function setupApplicationTest(hooks, options) { // setupMirage(hooks); // ember-cli-mirage } -function setupRenderingTest(hooks, options) { +function setupRenderingTest(hooks: NestedHooks, options?: SetupTestOptions) { upstreamSetupRenderingTest(hooks, options); // Additional setup for rendering tests can be done here. } -function setupTest(hooks, options) { +function setupTest(hooks: NestedHooks, options?: SetupTestOptions) { upstreamSetupTest(hooks, options); // Additional setup for unit tests can be done here. diff --git a/test-app/tsconfig.json b/test-app/tsconfig.json new file mode 100644 index 0000000..833cd62 --- /dev/null +++ b/test-app/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": { + "test-app/tests/*": ["tests/*"], + "test-app/*": ["app/*"], + "*": ["types/*"] + } + }, + "glint": { + "environment": "ember-loose" + } +} diff --git a/test-app/types/ember-data/types/registries/model.d.ts b/test-app/types/ember-data/types/registries/model.d.ts new file mode 100644 index 0000000..bdd8c0f --- /dev/null +++ b/test-app/types/ember-data/types/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/test-app/types/global.d.ts b/test-app/types/global.d.ts new file mode 100644 index 0000000..2c531e2 --- /dev/null +++ b/test-app/types/global.d.ts @@ -0,0 +1 @@ +import '@glint/environment-ember-loose';