Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .editorconfig
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# EditorConfig helps developers define and maintain consistent
# coding styles between different editors and IDEs
# editorconfig.org
# https://editorconfig.org/

root = true

Expand Down
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

# compiled output
/dist/
/declarations/
/tmp/

# dependencies
Expand Down
4 changes: 1 addition & 3 deletions .stylelintrc.cjs → .stylelintrc.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
'use strict';

module.exports = {
export default {
extends: ['stylelint-config-standard'],
rules: {
'at-rule-no-deprecated': [true, { ignoreAtRules: ['/^view/', 'apply'] }],
Expand Down
12 changes: 9 additions & 3 deletions app/components/alpha-input.gts
Original file line number Diff line number Diff line change
Expand Up @@ -55,18 +55,24 @@ export default class AlphaInputComponent extends Component<AlphaInputSignature>
}

@action
isComplete(buffer: Buffer, opts: { regex: string }): boolean {
isComplete(buffer: Array<string>, opts: { regex?: string }): boolean {
const value = buffer.join('');

return Boolean(value.length) && new RegExp(opts.regex).test(value);
return (
Boolean(value.length) && new RegExp(opts.regex as string).test(value)
);
Comment on lines +58 to +63

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

# First, let's locate and examine the file
fd "alpha-input" --type f

Repository: shipshapecode/swach

Length of output: 93


🏁 Script executed:

# Read the alpha-input.gts file to see the actual code
cat -n app/components/alpha-input.gts

Repository: shipshapecode/swach

Length of output: 3154


🏁 Script executed:

# Search for other uses of isComplete
rg "isComplete" --type ts --type gts -B 2 -A 2

Repository: shipshapecode/swach

Length of output: 90


🏁 Script executed:

# Search for isComplete with proper file types
rg "isComplete" -B 2 -A 2

Repository: shipshapecode/swach

Length of output: 1711


🏁 Script executed:

# Let's look at rgb-input.gts and hex-input.gts to see the pattern
cat -n app/components/rgb-input.gts | head -100

Repository: shipshapecode/swach

Length of output: 3231


🏁 Script executed:

# Check hex-input.gts
cat -n app/components/hex-input.gts | head -80

Repository: shipshapecode/swach

Length of output: 2796


🏁 Script executed:

# Test what happens with new RegExp(undefined)
node -e "console.log(new RegExp(undefined)); console.log(new RegExp(undefined).test('hello'));"

Repository: shipshapecode/swach

Length of output: 74


🏁 Script executed:

# Check if regex is always passed in the options, or could be undefined
rg "OneWayInputMask" -A 15 | grep -E "(regex|options)"

Repository: shipshapecode/swach

Length of output: 392


Fix type annotation and unsafe regex cast in completion validation.

The opts parameter is typed as { regex?: string } but receives a RegExp instance (line 38). When casting as string with opts.regex as string, if regex were undefined, new RegExp(undefined) would create /(?:)/, matching any input unexpectedly.

Update the type signature to accept RegExp | string | undefined, and handle each case explicitly with a fallback to this.alphaRegex:

Suggested fix
-  isComplete(buffer: Array<string>, opts: { regex?: string }): boolean {
+  isComplete(buffer: Array<string>, opts: { regex?: string | RegExp }): boolean {
     const value = buffer.join('');
-
-    return (
-      Boolean(value.length) && new RegExp(opts.regex as string).test(value)
-    );
+    const pattern =
+      opts.regex instanceof RegExp
+        ? opts.regex
+        : opts.regex
+          ? new RegExp(opts.regex)
+          : this.alphaRegex;
+
+    return Boolean(value.length) && pattern.test(value);
   }

Note: The same issue exists in rgb-input.gts (line 79) and hex-input.gts (line 54).

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
isComplete(buffer: Array<string>, opts: { regex?: string }): boolean {
const value = buffer.join('');
return Boolean(value.length) && new RegExp(opts.regex).test(value);
return (
Boolean(value.length) && new RegExp(opts.regex as string).test(value)
);
isComplete(buffer: Array<string>, opts: { regex?: string | RegExp }): boolean {
const value = buffer.join('');
const pattern =
opts.regex instanceof RegExp
? opts.regex
: opts.regex
? new RegExp(opts.regex)
: this.alphaRegex;
return Boolean(value.length) && pattern.test(value);
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/components/alpha-input.gts` around lines 58 - 63, Update the isComplete
signature and logic so opts.regex accepts RegExp|string|undefined and you don't
cast to string: change the parameter type in isComplete to opts: { regex?:
RegExp | string } (or include undefined) and then detect if opts.regex is a
RegExp, a string, or missing; construct the test RegExp by using opts.regex
directly when it's already a RegExp, new RegExp(opts.regex) when it's a string,
and fall back to this.alphaRegex when undefined/invalid before calling
.test(value); apply the same pattern to the analogous methods in rgb-input.gts
and hex-input.gts to avoid unsafe new RegExp(undefined) behavior.

}

/**
* When the rgb input value passes the regex, set the value, and update the hex values and color.
* @param {Event} event
*/
@action
onComplete(event: InputEvent): void {
onComplete(event?: InputEvent): void {
if (!event) {
return;
}

const { selectedColor } = this.args;
let value = parseFloat((<HTMLInputElement>event.target).value);

Expand Down
10 changes: 7 additions & 3 deletions app/components/hex-input.gts
Original file line number Diff line number Diff line change
Expand Up @@ -51,16 +51,20 @@ export default class HexInputComponent extends Component<HexInputSignature> {
}

@action
isComplete(buffer: Buffer, opts: { regex: string }): boolean {
return new RegExp(opts.regex).test(buffer.join(''));
isComplete(buffer: Array<string>, opts: { regex?: string }): boolean {
return new RegExp(opts.regex as string).test(buffer.join(''));
Comment on lines +54 to +55

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

# First, let's find and read the hex-input.gts file
find . -name "hex-input.gts" -type f

Repository: shipshapecode/swach

Length of output: 93


🏁 Script executed:

# Also search for any references to ember-inputmask in the codebase
rg "ember-inputmask" --type ts --type js --type gts -A 3 -B 3

Repository: shipshapecode/swach

Length of output: 90


🏁 Script executed:

# Check the package.json to confirm the version of ember-inputmask
cat package.json | grep -A 2 -B 2 "inputmask"

Repository: shipshapecode/swach

Length of output: 237


🏁 Script executed:

# Read the hex-input.gts file to see the isComplete method
cat -n ./app/components/hex-input.gts

Repository: shipshapecode/swach

Length of output: 3079


🏁 Script executed:

# Search for isComplete usage in the codebase to understand how it's called
rg "isComplete" -g "*.gts" -g "*.ts" -g "*.js" -A 5 -B 5

Repository: shipshapecode/swach

Length of output: 3806


🌐 Web query:

ember-inputmask v4.0.3 isComplete callback signature opts.regex documentation

💡 Result:

In Inputmask (the library wrapped by ember-inputmask), the isComplete option is a hook you can override with this signature:

  • isComplete(buffer: string[], opts: Options): boolean [1]

When you use the "Regex" mask/alias, the regex you configured is available as:

  • opts.regex (a string) [1]

The Inputmask docs/examples show opts.regex being used exactly this way:

$(selector).inputmask("Regex", {
  regex: "[0-9]*",
  isComplete: function (buffer, opts) {
    return new RegExp(opts.regex).test(buffer.join(""));
  }
});
``` [2]

**Sources:** [1] Type definitions for Inputmask options/signatures, including `isComplete(buffer, opts)` and `opts.regex`. [2] Inputmask documentation example showing `isComplete(buffer, opts)` using `opts.regex`.

---

🏁 Script executed:

```shell
# Let's verify the behavior of RegExp with undefined
node << 'EOF'
// Test what happens when RegExp is constructed with undefined
try {
  const result = new RegExp(undefined);
  console.log("RegExp(undefined):", result);
  console.log("Test 'undefined' string:", result.test("undefined"));
  console.log("Test other string:", result.test("hello"));
} catch (e) {
  console.log("Error:", e.message);
}
EOF

Repository: shipshapecode/swach

Length of output: 142


Guard optional opts.regex before building RegExp.

Line 55 force-casts an optional value (opts.regex as string) without checking if it's defined. If opts.regex is undefined, new RegExp(undefined) creates the permissive regex /(?:)/ that matches any string, causing completion checks to incorrectly succeed on invalid input.

Additionally, the type annotation declares regex?: string, but the component passes regex=this.hexRegex where hexRegex is a RegExp object, creating a type mismatch masked by the cast.

Suggested fix
-  isComplete(buffer: Array<string>, opts: { regex?: string }): boolean {
-    return new RegExp(opts.regex as string).test(buffer.join(''));
+  isComplete(buffer: Array<string>, opts: { regex?: string | RegExp }): boolean {
+    const pattern =
+      opts.regex instanceof RegExp
+        ? opts.regex
+        : opts.regex
+          ? new RegExp(opts.regex)
+          : this.hexRegex;
+
+    return pattern.test(buffer.join(''));
   }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
isComplete(buffer: Array<string>, opts: { regex?: string }): boolean {
return new RegExp(opts.regex as string).test(buffer.join(''));
isComplete(buffer: Array<string>, opts: { regex?: string | RegExp }): boolean {
const pattern =
opts.regex instanceof RegExp
? opts.regex
: opts.regex
? new RegExp(opts.regex)
: this.hexRegex;
return pattern.test(buffer.join(''));
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/components/hex-input.gts` around lines 54 - 55, The isComplete method
currently force-casts opts.regex to string and constructs a RegExp
unconditionally; instead, guard for undefined and accept a RegExp instance:
update the parameter type (regex?: string|RegExp) or handle both cases inside
isComplete, return false if opts.regex is not provided, and when provided, if
it's already a RegExp use it directly, otherwise construct a RegExp from the
string; reference the isComplete method and opts.regex and the component prop
hexRegex (which is a RegExp) so the fix prevents new RegExp(undefined) and
resolves the string/RegExp mismatch.

}

/**
* Executes whenever the hex value matches the regex. We can use this to change the color values only when valid.
* @param {Event} event The event when the hex matches the regex and is valid
*/
@action
onComplete(event: InputEvent): void {
onComplete(event?: InputEvent): void {
if (!event) {
return;
}

const tinyColor = new TinyColor((<HTMLInputElement>event.target).value);
const { r, g, b, a } = tinyColor.toRgb();
const hex = rgbaToHex(r, g, b, a);
Expand Down
12 changes: 9 additions & 3 deletions app/components/rgb-input.gts
Original file line number Diff line number Diff line change
Expand Up @@ -76,18 +76,24 @@ export default class RgbaInputComponent extends Component<RgbaInputSignature> {
}

@action
isComplete(buffer: Buffer, opts: { regex: string }): boolean {
isComplete(buffer: Array<string>, opts: { regex?: string }): boolean {
const value = buffer.join('');

return Boolean(value.length) && new RegExp(opts.regex).test(value);
return (
Boolean(value.length) && new RegExp(opts.regex as string).test(value)
);
}

/**
* When the rgb input value passes the regex, set the value, and update the hex values and color.
* @param {Event} event
*/
@action
onComplete(event: InputEvent): void {
onComplete(event?: InputEvent): void {
if (!event) {
return;
}

const selectedColor: SelectedColorModel = this.args
.selectedColor as SelectedColorModel;
const { type } = this.args;
Expand Down
Empty file removed app/services/.gitkeep
Empty file.
6 changes: 2 additions & 4 deletions app/services/nearest-color.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
import Service from '@ember/service';

import { colornames } from 'color-name-list';
import nearestColor from 'nearest-color';
import nearestColor, { type ColorMatch, type RGB } from 'nearest-color';

export default class NearestColorService extends Service {
nearest: ({ r, g, b }: { r: number; g: number; b: number }) => {
name: string;
};
nearest: (color: string | RGB) => ColorMatch;

constructor() {
super(...arguments);
Expand Down
12 changes: 10 additions & 2 deletions app/utils/view-transitions.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
import { isTesting } from '@embroider/macros';

export default function viewTransitions() {
if (!document.startViewTransition) {
if (isTesting() || !document.startViewTransition) {
return;
}

return new Promise<void>((resolve) => {
// eslint-disable-next-line @typescript-eslint/require-await
document.startViewTransition(async () => {
const transition = document.startViewTransition(async () => {
resolve();
});

// A transition gets skipped when another starts before it finishes;
// its `ready`/`finished` promises reject with an AbortError that would
// otherwise surface as an unhandled rejection.
transition.ready.catch(() => {});
transition.finished.catch(() => {});
});
}
14 changes: 8 additions & 6 deletions babel.config.cjs → babel.config.mjs
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
const {
import { dirname } from 'node:path';
import { fileURLToPath } from 'node:url';

import {
babelCompatSupport,
templateCompatSupport,
} = require('@embroider/compat/babel');
} from '@embroider/compat/babel';

module.exports = {
export default {
plugins: [
[
'@babel/plugin-transform-typescript',
Expand All @@ -16,7 +19,6 @@ module.exports = {
[
'babel-plugin-ember-template-compilation',
{
compilerPath: 'ember-source/dist/ember-template-compiler.js',
enableLegacyModules: [
'ember-cli-htmlbars',
'ember-cli-htmlbars-inline-precompile',
Expand All @@ -29,14 +31,14 @@ module.exports = {
'module:decorator-transforms',
{
runtime: {
import: require.resolve('decorator-transforms/runtime-esm'),
import: import.meta.resolve('decorator-transforms/runtime-esm'),
},
},
],
[
'@babel/plugin-transform-runtime',
{
absoluteRuntime: __dirname,
absoluteRuntime: dirname(fileURLToPath(import.meta.url)),
useESModules: true,
regenerator: false,
},
Expand Down
2 changes: 1 addition & 1 deletion config/ember-cli-update.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"packages": [
{
"name": "@ember/app-blueprint",
"version": "6.8.3",
"version": "6.11.0",
"blueprints": [
{
"name": "@ember/app-blueprint",
Expand Down
35 changes: 15 additions & 20 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,13 @@
* npx eslint --inspect-config
*
*/
import babelParser from '@babel/eslint-parser';
import babelParser from '@babel/eslint-parser/experimental-worker';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Check official Babel documentation for the experimental-worker parser entrypoint

# Check if the experimental-worker export exists in the package
if [ -f "node_modules/@babel/eslint-parser/package.json" ]; then
  echo "=== Package exports ==="
  cat node_modules/@babel/eslint-parser/package.json | jq -r '.exports'
fi

# Search for any documentation or usage of experimental-worker in the package
echo -e "\n=== Searching for experimental-worker references ==="
rg -n "experimental-worker" node_modules/@babel/eslint-parser/ --type md --type js -C 2 2>/dev/null || echo "No references found in package"

Repository: shipshapecode/swach

Length of output: 148


🌐 Web query:

Is @babel/eslint-parser/experimental-worker a stable and documented entrypoint for Babel ESLint parser version 7.28.6?

💡 Result:

The entrypoint @babel/eslint-parser/experimental-worker is a documented, yet explicitly labeled, experimental feature within the @babel/eslint-parser package [1][2]. While it is an officially supported entrypoint maintained by the Babel team, it is not considered a stable or production-default implementation [1]. It was introduced in version 7.15.0 to address limitations in how Babel configuration files (such as.mjs files) are loaded when using ESLint, which requires synchronous parsing [3][2]. Because ESLint only supports synchronous parsers, this experimental worker moves Babel configuration loading and parsing to a separate worker thread to allow for asynchronous configuration loading while keeping the main ESLint process synchronous [4][2]. Although it is documented in the official Babel documentation and has received updates—such as the inclusion of a meta object to support compatibility with ESLint's flat config system—it remains marked as experimental [1][5][6]. Users are advised that it is an experimental implementation and are encouraged to report any issues they encounter [1].

Citations:


In eslint.config.mjs (line 15), justify or avoid @babel/eslint-parser/experimental-worker

  • Babel documents @babel/eslint-parser/experimental-worker as an explicitly experimental entrypoint (worker-thread based), not the stable default @babel/eslint-parser; only keep it if you specifically need its behavior (e.g., async worker handling for Babel config loading in ESM setups). Otherwise switch to @babel/eslint-parser to reduce breakage risk from experimental changes.
  • If you keep it, add a brief comment near the import explaining why this experimental entrypoint is required for this repo’s setup.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@eslint.config.mjs` at line 15, The import of babelParser from
'`@babel/eslint-parser/experimental-worker`' is using an experimental entrypoint;
either switch the import to the stable '`@babel/eslint-parser`' to avoid relying
on experimental worker behavior, or if the worker entrypoint is actually
required (e.g., for async worker handling of ESM Babel configs), keep the
experimental import but add a concise comment directly above the import
explaining why the experimental-worker entrypoint is necessary for this repo’s
ESLint/Babel setup; update the import statement occurrence of babelParser to
reflect the chosen option.

import js from '@eslint/js';
import eslintConfigPrettier from 'eslint-config-prettier';
import ember from 'eslint-plugin-ember/recommended';
import n from 'eslint-plugin-n';
import qunit from 'eslint-plugin-qunit';
import { defineConfig, globalIgnores } from 'eslint/config';
import globals from 'globals';
import ts from 'typescript-eslint';

Expand All @@ -34,29 +35,20 @@ const parserOptions = {
},
};

export default ts.config(
export default defineConfig([
globalIgnores([
'.vite/**/*',
'dist/',
'coverage/',
'electron-app/dist/**/*',
'out/**/*',
'!**/.*',
]),
Comment on lines +39 to +46

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Check for common Ember build artifacts that might need ESLint ignores

# Check for common Ember directories
echo "=== Checking for Ember build directories ==="
for dir in tmp .ember-cli; do
  if [ -d "$dir" ]; then
    echo "Found: $dir/"
    echo "  Files: $(fd . "$dir" --type f | wc -l)"
  fi
done

# Check current gitignore for patterns that might inform ESLint ignores
echo -e "\n=== Current .gitignore patterns ==="
if [ -f ".gitignore" ]; then
  cat .gitignore | grep -E "^[^#]" | grep -E "(tmp|ember-cli|declarations|\.d\.ts)" || echo "No matching patterns"
fi

Repository: shipshapecode/swach

Length of output: 151


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== eslint.config.mjs (globalIgnores context) ==="
if [ -f "eslint.config.mjs" ]; then
  sed -n '1,120p' eslint.config.mjs | nl -ba | sed -n '1,120p'
else
  echo "Missing eslint.config.mjs"
fi

echo
echo "=== Locate common Ember-generated directories ==="
for pat in "tmp" ".ember-cli" "declarations" "build" ".tmp"; do
  echo "-- Looking for directories named '$pat' (any depth) --"
  find . -type d -name "$pat" 2>/dev/null | sed 's|^\./||' | head -n 50
done

echo
echo "=== Check .gitignore for Ember-ish patterns ==="
if [ -f ".gitignore" ]; then
  rg -n --hidden --no-ignore-vcs -S "tmp|ember-cli|declarations" .gitignore || true
else
  echo "Missing .gitignore"
fi

echo
echo "=== Search eslint config for other ignore patterns ==="
if [ -f "eslint.config.mjs" ]; then
  rg -n "ignore|globalIgnores|ignores" eslint.config.mjs || true
fi

Repository: shipshapecode/swach

Length of output: 174


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== eslint.config.mjs (globalIgnores context) ==="
if [ -f "eslint.config.mjs" ]; then
  sed -n '1,160p' eslint.config.mjs | awk '{printf "%d\t%s\n", NR, $0}' | sed -n '1,160p'
else
  echo "Missing eslint.config.mjs"
fi

echo
echo "=== Locate common Ember-generated directories ==="
for pat in "tmp" ".ember-cli" "declarations" "build" ".tmp"; do
  echo "-- Searching for directories named '$pat' (any depth) --"
  find . -type d -name "$pat" 2>/dev/null | sed 's|^\./||' | head -n 50 || true
done

echo
echo "=== Check .gitignore for Ember-ish patterns ==="
if [ -f ".gitignore" ]; then
  sed -n '1,200p' .gitignore
  echo
  rg -n --hidden --no-ignore-vcs -S "tmp|ember-cli|declarations" .gitignore || true
else
  echo "Missing .gitignore"
fi

echo
echo "=== Search eslint config for other ignore patterns ==="
if [ -f "eslint.config.mjs" ]; then
  rg -n "ignore|globalIgnores|ignores" eslint.config.mjs || true
else
  echo "Missing eslint.config.mjs"
fi

Repository: shipshapecode/swach

Length of output: 4687


Add missing ESLint ignores for Ember build artifacts

  • In eslint.config.mjs (globalIgnores around lines 39-46), tmp/ and .ember-cli/ are not ignored, even though /tmp/ is listed in .gitignore.
  • Add tmp/ (and .ember-cli/ if it’s generated) to globalIgnores so ESLint doesn’t lint local build caches/cooked outputs.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@eslint.config.mjs` around lines 39 - 46, Update the global ESLint ignore list
used by globalIgnores to include Ember build artifacts by adding "tmp/" and
".ember-cli/" to the array (the same array where '.vite/**/*', 'dist/', and
'coverage/' live); modify the invocation of globalIgnores so these two entries
are present to prevent linting of local Ember build caches and generated
outputs.

js.configs.recommended,
ember.configs.base,
ember.configs.gjs,
ember.configs.gts,
eslintConfigPrettier,
/**
* Ignores must be in their own object
* https://eslint.org/docs/latest/use/configure/ignore
*/
{
ignores: [
'.vite/**/*',
'coverage/**/*',
'declarations/**/*',
'dist/**/*',
'electron-app/dist/**/*',
'node_modules/**/*',
'out/**/*',
'types/**/*',
'!**/.*',
],
},
/**
* https://eslint.org/docs/latest/use/configure/configuration-files#configuring-linter-options
*/
Expand Down Expand Up @@ -85,6 +77,9 @@ export default ts.config(
languageOptions: {
parser: ember.parser,
parserOptions: parserOptions.esm.ts,
globals: {
...globals.browser,
},
},
extends: [...ts.configs.recommendedTypeChecked, ember.configs.gts],
rules: {
Expand Down Expand Up @@ -147,4 +142,4 @@ export default ts.config(
},
},
},
);
]);
22 changes: 10 additions & 12 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
"lint:hbs:fix": "ember-template-lint . --fix",
"lint:js": "eslint . --cache",
"lint:js:fix": "eslint . --fix",
"lint:types": "glint --build",
"lint:types": "ember-tsc --noEmit",
"make": "cross-env EMBER_CLI_ELECTRON=true electron-forge make",
"package": "cross-env EMBER_CLI_ELECTRON=true electron-forge package",
"publish": "electron-forge publish",
Expand Down Expand Up @@ -75,7 +75,7 @@
"ember-element-helper": "^0.8.8",
"ember-event-helpers": "^0.1.1",
"ember-inflector": "^6.0.0",
"ember-inputmask": "^4.0.1",
"ember-inputmask": "^4.0.3",
"ember-local-storage": "2.0.6",
"ember-math-helpers": "^5.0.0",
"ember-modifier": "^4.3.0",
Expand All @@ -88,8 +88,7 @@
"hue-hunter": "^0.4.1",
"indexeddb-export-import": "^2.1.5",
"menubar": "^9.5.2",
"throttle-debounce": "^5.0.2",
"tracked-built-ins": "^4.1.0"
"throttle-debounce": "^5.0.2"
},
"devDependencies": {
"@babel/core": "^7.29.0",
Expand Down Expand Up @@ -119,10 +118,9 @@
"@embroider/router": "^3.0.6",
"@embroider/vite": "^1.6.0",
"@eslint/js": "^9.39.3",
"@glint/core": "^1.5.2",
"@glint/environment-ember-loose": "^1.5.2",
"@glint/environment-ember-template-imports": "^1.5.2",
"@glint/template": "~1.5.2",
"@glint/ember-tsc": "^1.1.1",
"@glint/template": "~1.7.4",
"@glint/tsserver-plugin": "^2.1.0",
"@ianvs/prettier-plugin-sort-imports": "^4.7.1",
"@release-it-plugins/lerna-changelog": "^8.0.1",
"@rollup/plugin-babel": "^6.1.0",
Expand All @@ -135,13 +133,12 @@
"@types/qunit": "^2.19.13",
"@types/sinon": "^21.0.0",
"@vitest/ui": "^4.0.18",
"babel-plugin-ember-template-compilation": "^2.4.1",
"babel-plugin-ember-template-compilation": "^3.1.0",
"babel-preset-env": "^1.7.0",
"broccoli-asset-rev": "^3.0.0",
"concurrently": "^9.2.1",
"cross-env": "^10.1.0",
"electron": "^40.6.1",
"ember-auto-import": "^2.12.1",
"electron": "^40.10.3",
"ember-cli": "^6.11.0",
"ember-cli-babel": "^8.3.1",
"ember-cli-clean-css": "^3.0.0",
Expand Down Expand Up @@ -201,7 +198,8 @@
},
"pnpm": {
"overrides": {
"@ember/string": "^4.0.1"
"@ember/string": "^4.0.1",
"yauzl": "^3.3.1"
},
"patchedDependencies": {
"ember-local-storage": "patches/ember-local-storage.patch",
Expand Down
Loading
Loading