ember-cli-update to 6.11#2532
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughConvert configs to ES modules, update ESLint and Babel configs, migrate Glint tooling to ember-tsc, change several TypeScript declaration shapes and lint directives, adjust package versions/scripts, update input component signatures, and add view-transition test guards. ChangesTooling, declarations, and component typing updates
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (2)
types/throttle-debounce/index.d.ts (1)
1-8: Consider using a more specific function type.The
Functiontype is overly permissive. A more type-safe alternative would be(...args: unknown[]) => unknownor even a generic signature. However, this is acceptable for a third-party library shim.♻️ Optional: More specific callback type
-/* eslint-disable `@typescript-eslint/no-unsafe-function-type` */ declare module 'throttle-debounce' { + type AnyFunction = (...args: unknown[]) => unknown; + export function debounce( delay: number, atBegin?: boolean, - callback?: Function + callback?: AnyFunction ); - export function debounce(delay: number, callback?: Function); + export function debounce(delay: number, callback?: AnyFunction); }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@types/throttle-debounce/index.d.ts` around lines 1 - 8, Replace the overly-broad Function type in the throttle-debounce declaration with a more specific callback signature: change the callback parameter types in both overloaded declarations of debounce (the exported function debounce) from Function to a typed function such as (...args: unknown[]) => unknown or a generic like <T extends any[]>(...args: T) => unknown; update both overloads (debounce(delay: number, atBegin?: boolean, callback?: Function) and debounce(delay: number, callback?: Function)) to use the chosen specific signature so callers get better type safety.package.json (1)
121-123: Inconsistent version constraint on@glint/template.Line 122 uses a tilde (
~1.7.4) constraint while the other@glint/*packages use caret (^). This restricts@glint/templateto only patch updates. If this is intentional (e.g., to avoid a known issue in newer minor versions), consider adding a comment explaining why. Otherwise, align with the caret constraint for consistency.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@package.json` around lines 121 - 123, The package constraint for `@glint/template` is inconsistent (uses "~1.7.4") compared to the other `@glint` packages (`@glint/ember-tsc` and `@glint/tsserver-plugin` which use "^"); either change the `@glint/template` version constraint to "^1.7.4" to match the caret semantics used by the other `@glint` packages, or if the tilde is deliberate, add an inline comment in package.json explaining the reason for pinning to patch-only versions to avoid future confusion.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@types/nearest-color/index.d.ts`:
- Around line 2-4: Add a proper exported ColorMatch type and tighten the
availableColors parameter: declare and export an interface ColorMatch with
properties name: string, value: string, rgb: [number, number, number], and
distance: number, change the from function signature to accept availableColors:
Array<string> | Record<string, string> (instead of object), and keep the return
type (string) => ColorMatch | string so TypeScript recognizes the returned match
shape for the exported from function.
---
Nitpick comments:
In `@package.json`:
- Around line 121-123: The package constraint for `@glint/template` is
inconsistent (uses "~1.7.4") compared to the other `@glint` packages
(`@glint/ember-tsc` and `@glint/tsserver-plugin` which use "^"); either change the
`@glint/template` version constraint to "^1.7.4" to match the caret semantics used
by the other `@glint` packages, or if the tilde is deliberate, add an inline
comment in package.json explaining the reason for pinning to patch-only versions
to avoid future confusion.
In `@types/throttle-debounce/index.d.ts`:
- Around line 1-8: Replace the overly-broad Function type in the
throttle-debounce declaration with a more specific callback signature: change
the callback parameter types in both overloaded declarations of debounce (the
exported function debounce) from Function to a typed function such as (...args:
unknown[]) => unknown or a generic like <T extends any[]>(...args: T) =>
unknown; update both overloads (debounce(delay: number, atBegin?: boolean,
callback?: Function) and debounce(delay: number, callback?: Function)) to use
the chosen specific signature so callers get better type safety.
ℹ️ Review info
Configuration used: defaults
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (15)
.editorconfig.gitignore.stylelintrc.mjsapp/services/.gitkeepbabel.config.mjsconfig/ember-cli-update.jsoneslint.config.mjspackage.jsonpublic/robots.txttsconfig.jsontypes/ember-animated/motions/move.d.tstypes/ember-set-body-class/helpers/set-body-class.d.tstypes/global.d.tstypes/nearest-color/index.d.tstypes/throttle-debounce/index.d.ts
💤 Files with no reviewable changes (1)
- .gitignore
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
types/nearest-color/index.d.ts (1)
2-11: LGTM! TheColorMatchinterface and improved type safety address the previous review concerns.The interface correctly defines all properties (
name,value,rgb,distance) matching the library's actual return structure, andRecord<string, string>is appropriately more specific thanobject.Optional: Consider adding
exportto the interface so consumers can directly importColorMatchfor explicit type annotations:- interface ColorMatch { + export interface ColorMatch {Without the export, the type is still correctly inferred when using the
from()function, so this is a nice-to-have rather than a requirement.,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@types/nearest-color/index.d.ts` around lines 2 - 11, Add an export to the ColorMatch interface so consumers can import the type directly: update the declaration of ColorMatch to be exported (export interface ColorMatch) alongside the existing exported from() function; this is a non-breaking, type-only change that enables explicit annotations and improves DX when referencing ColorMatch in user code or tests.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@types/ember-cognito/test-support/index.d.ts`:
- Line 12: Change the ambient declaration for mockCognitoUser by removing the
default parameter initializer; replace `options: object = {}` with an optional
parameter `options?: object` in the declaration of the function
`mockCognitoUser` so the `.d.ts` file does not contain a parameter default value
and still conveys that the argument is optional and returns `MockUser`.
In `@types/ember-local-storage/index.d.ts`:
- Line 5: The ambient declaration uses an invalid default parameter initializer
`options: object = {}`; replace it with optional parameter syntax (e.g.,
`options?: object`) in the declaration so the `.d.ts` file compiles—locate the
function/constructor declaration that contains the `options` parameter and
change its signature from using `= {}` to `?` (reference the `options` parameter
in the types/ember-local-storage index.d.ts diff).
---
Nitpick comments:
In `@types/nearest-color/index.d.ts`:
- Around line 2-11: Add an export to the ColorMatch interface so consumers can
import the type directly: update the declaration of ColorMatch to be exported
(export interface ColorMatch) alongside the existing exported from() function;
this is a non-breaking, type-only change that enables explicit annotations and
improves DX when referencing ColorMatch in user code or tests.
ℹ️ Review info
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (5)
types/ember-cognito/test-support/index.d.tstypes/ember-event-helpers/helpers/stop-propagation.d.tstypes/ember-local-storage/index.d.tstypes/nearest-color/index.d.tstypes/swach/index.d.ts
💤 Files with no reviewable changes (1)
- types/swach/index.d.ts
| export const MockUser = EmberObject.extend({ create() {} }); | ||
| export const mockAuth = any; | ||
| export declare function mockCognitoUser(options: {} = {}): MockUser; | ||
| export declare function mockCognitoUser(options: object = {}): MockUser; |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# First, let's check the specific file mentioned
cd . && ls -la types/ember-cognito/test-support/index.d.ts 2>/dev/null && cat -n types/ember-cognito/test-support/index.d.tsRepository: shipshapecode/swach
Length of output: 820
🏁 Script executed:
# Also run the verification script to check for similar issues
rg -nP --glob '*.d.ts' '\b(?:export\s+)?(?:declare\s+)?function\b[^\n]*\([^)]*=\s*[^)]*\)'Repository: shipshapecode/swach
Length of output: 184
🌐 Web query:
TypeScript declaration files .d.ts default parameter initializer best practices
💡 Result:
Key rule: you can’t encode runtime default values in .d.ts
In a declaration file, parameter initializers are not allowed (because there’s no implementation), so alpha = 1.0 is a syntax error in .d.ts. Use types + docs instead. [1], [5], [10]
Recommended patterns
1) Model “has a default” as an optional parameter
// implementation: function axpy(x, y, alpha = 1.0) { ... }
export function axpy(x: Float32Array, y: Float32Array, alpha?: number): void;This matches how TypeScript models “argument may be omitted”. [7]
2) If there are multiple optional knobs, prefer an options bag
export interface AxpyOptions {
alpha?: number; // default: 1.0
}
export function axpy(x: Float32Array, y: Float32Array, options?: AxpyOptions): void;This keeps call sites readable as options grow (and avoids long ordered optional params). [1]
3) Document the default value (since the type system won’t)
Use JSDoc (works well in editors/tooling):
/** `@param` alpha Default is 1.0 */
export function axpy(x: Float32Array, y: Float32Array, alpha?: number): void;The need for documentation here is exactly because .d.ts files are type-only. [10]
4) Avoid overload explosions; use optional params where possible
Prefer alpha?: number (or an options bag) over many overloads that only differ by presence/absence of trailing args. [2]
5) Don’t try to “fake” defaults with types
Avoid patterns like alpha: number | undefined unless you specifically need to allow explicit undefined in a non-optional position; in most APIs, alpha?: number is the cleanest declaration for a defaulted parameter. (TypeScript treats omitted args as undefined at runtime anyway.) [7]
Sources
[1] Google TypeScript Style Guide – parameter initializers & guidance on using them sparingly / prefer destructuring for many optional params: https://google.github.io/styleguide/tsguide.html
[2] TypeScript Handbook (Declaration Files) – “Do’s and Don’ts” (optional params vs overloads): https://deepwiki.com/microsoft/TypeScript-Handbook/5-declaration-files
[5] Stack Overflow – “A parameter initializer is only allowed in a function or constructor implementation” in .d.ts: https://stackoverflow.com/questions/41057285/is-it-possible-to-declare-default-function-parameters-in-typescript-declaration
[7] TypeScript Handbook (New Handbook) – optional parameters & default parameters behavior: https://microsoft.github.io/TypeScript-New-Handbook/everything/
[10] TypeScript Handbook – .d.ts files are type-only and don’t emit JS: https://www.typescriptlang.org/docs/handbook/2/type-declarations
Remove default parameter initializer from ambient declaration.
On Line 12, options: object = {} violates TypeScript declaration file rules. Parameter initializers are not allowed in .d.ts files; use an optional parameter instead.
Proposed fix
- export declare function mockCognitoUser(options: object = {}): MockUser;
+ export declare function mockCognitoUser(options?: object): MockUser;📝 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.
| export declare function mockCognitoUser(options: object = {}): MockUser; | |
| export declare function mockCognitoUser(options?: object): MockUser; |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@types/ember-cognito/test-support/index.d.ts` at line 12, Change the ambient
declaration for mockCognitoUser by removing the default parameter initializer;
replace `options: object = {}` with an optional parameter `options?: object` in
the declaration of the function `mockCognitoUser` so the `.d.ts` file does not
contain a parameter default value and still conveys that the argument is
optional and returns `MockUser`.
| key: string, | ||
| modelName?: string, | ||
| options: {} = {} | ||
| options: object = {} |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# First, let's find and examine the specific file
find . -name "index.d.ts" -path "*/ember-local-storage/*" -type fRepository: shipshapecode/swach
Length of output: 101
🏁 Script executed:
# Run the verification script from the review comment
rg -nP --glob '*.d.ts' '\b(?:export\s+)?(?:declare\s+)?function\b[^\n]*\([^)]*=\s*[^)]*\)' | head -20Repository: shipshapecode/swach
Length of output: 184
🏁 Script executed:
# Also let's search more broadly for declare functions with initializers
rg -n 'declare function' --glob '*.d.ts' -A 2 | head -50Repository: shipshapecode/swach
Length of output: 1400
🏁 Script executed:
# Let's read the actual ember-local-storage declaration file
cat -n types/ember-local-storage/index.d.tsRepository: shipshapecode/swach
Length of output: 261
🏁 Script executed:
# Let's also check if TypeScript actually allows default parameters in declare functions
# by looking at the tsconfig and any compilation settings
find . -name "tsconfig.json" -o -name "tsconfig.*.json" | head -5Repository: shipshapecode/swach
Length of output: 387
🏁 Script executed:
# Let's check the tsconfig to see if there are any settings that might affect this
cat tsconfig.jsonRepository: shipshapecode/swach
Length of output: 586
🏁 Script executed:
# Let's verify if TypeScript would actually flag this as an error
# by looking for any compilation errors or test output
find . -type f -name "*.json" -path "*/node_modules/.bin" -prune -o -type f -name "*.log" -print | grep -i "error\|test" | head -10Repository: shipshapecode/swach
Length of output: 45
🌐 Web query:
TypeScript declaration file default parameters ambient function declare syntax rules
💡 Result:
In TypeScript declaration files (.d.ts), you generally cannot write runtime default parameter initializers (e.g. alpha = 1.0) because declarations describe types only and have no function body/implementation.
1) Ambient/overload signatures: no = value
In a .d.ts, this is not allowed:
declare function axpy(x: Float32Array, y: Float32Array, alpha = 1.0): void;
// ❌ parameter initializer only allowed in an implementationAmbient function declarations do not permit default parameter values; use optional parameters (?) instead. [1]
2) What to do instead: mark the parameter optional (and/or overload)
Option A — optional parameter
declare function axpy(
x: Float32Array,
y: Float32Array,
alpha?: number
): void;Option B — overloads (most explicit call shapes)
declare function axpy(x: Float32Array, y: Float32Array): void;
declare function axpy(x: Float32Array, y: Float32Array, alpha: number): void;Also note: overload signatures cannot specify default values either—only optional (?) is allowed. [1]
3) If you want to communicate the default value
TypeScript has no standard type-level way to encode “defaults to 1.0” in a .d.ts. Common practice is to document it with comments/JSDoc (for editor hints), while keeping the type as optional. (This limitation is the same issue described in the VS Code error you saw.) [2]
4) What is allowed in .d.ts: default generic type parameters
Don’t confuse value defaults with generic type parameter defaults—those are allowed in declarations:
declare function create<T = HTMLDivElement>(element?: T): T;[3]
Sources: ambient declarations / no default parameter values [1], .d.ts default parameter question + error context [2], generic type parameter defaults in declarations [3].
[1] https://gist.github.com/robertknight/9ec6ea9f32d2c120cb1c
[2] https://stackoverflow.com/questions/41057285/is-it-possible-to-declare-default-function-parameters-in-typescript-declaration
[3] https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-3.html
🏁 Script executed:
# Let's check if there are TypeScript compilation errors in the project
# Look for any .tsbuildinfo or compilation output
find . -name "*.tsbuildinfo" -o -name "dist" -type d | head -5Repository: shipshapecode/swach
Length of output: 479
🏁 Script executed:
# Let's specifically look at the ember-cognito file which also has the same issue
cat -n types/ember-cognito/test-support/index.d.tsRepository: shipshapecode/swach
Length of output: 728
🏁 Script executed:
# Check if there's any build or test output that shows TypeScript errors
ls -la | grep -i "build\|dist\|error"Repository: shipshapecode/swach
Length of output: 133
Use optional parameter syntax in declaration files.
On Line 5, the parameter syntax options: object = {} is invalid in ambient function declarations. TypeScript does not allow default parameter initializers in .d.ts files; use optional parameter syntax instead.
Proposed fix
- options: object = {}
+ options?: object📝 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.
| options: object = {} | |
| options?: object |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@types/ember-local-storage/index.d.ts` at line 5, The ambient declaration uses
an invalid default parameter initializer `options: object = {}`; replace it with
optional parameter syntax (e.g., `options?: object`) in the declaration so the
`.d.ts` file compiles—locate the function/constructor declaration that contains
the `options` parameter and change its signature from using `= {}` to `?`
(reference the `options` parameter in the types/ember-local-storage index.d.ts
diff).
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (3)
package.json (2)
91-91: Removethrottle-debouncefrom eitherdependenciesordevDependencies.It is declared in both sections with the same version (
^5.0.2). Packages needed only at runtime should be independencies; those needed only during development should be indevDependencies. Keep one source of truth to prevent future version drift.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@package.json` at line 91, The package "throttle-debounce" is declared twice; remove the duplicate entry so it exists only in the appropriate section (either dependencies or devDependencies) depending on runtime need — locate "throttle-debounce": "^5.0.2" in package.json and delete the occurrence in the incorrect section so there is a single source of truth for that dependency.
33-33: Consider completing the Glint v2 migration by updating ambient types from v1 to v2 environment setup.
@glint/ember-tscis installed and@glint/ember-tsc/typesis correctly wired intsconfig.json. However,types/global.d.tscurrently imports@glint/environment-ember-loose, which is the v1 environment. For a complete v2 migration, update to@glint/environment-ember-template-importsor@glint/environment-ember-loose/v2(whichever matches your template strategy) to align with the v2 tooling.Since the repository contains no standalone
.hbstemplates, this update is compatible with your current setup.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@package.json` at line 33, Update the ambient Glint environment import in types/global.d.ts from the v1 package to a v2 package: replace the current import of '@glint/environment-ember-loose' with either '@glint/environment-ember-template-imports' or '@glint/environment-ember-loose/v2' (choose the one matching your template strategy) so the ambient types align with the installed '@glint/ember-tsc' v2 wiring referenced in tsconfig.json; ensure the import statement in types/global.d.ts is the only change and run the type checker (ember-tsc) to verify no remaining ambient type errors.eslint.config.mjs (1)
15-15: Update the parser import to the main entrypoint before Babel 8 upgrades.
@babel/eslint-parser/experimental-workeris removed in Babel 8. Change to@babel/eslint-parseron line 15. No constraints inbabel.config.mjsrequire the worker entrypoint, and this repo already uses ESLint 9.39.3, which satisfies Babel 8's requirement.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@eslint.config.mjs` at line 15, Replace the experimental worker parser import with the main entrypoint: update the import statement that currently references '@babel/eslint-parser/experimental-worker' to import from '@babel/eslint-parser' (i.e., change the module specifier in the existing import declaration so the parser uses the main '@babel/eslint-parser' package).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@app/components/alpha-input.gts`:
- Around line 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.
In `@app/components/hex-input.gts`:
- Around line 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.
In `@app/components/rgb-input.gts`:
- Around line 79-82: The isComplete method currently force-casts opts.regex and
builds a RegExp from it which fails if opts.regex is undefined; update
isComplete to use a safe fallback pattern when opts.regex is missing (e.g., a
regex string that matches three comma-separated integers for RGB), e.g. compute
const pattern = opts.regex ?? '...default pattern...' and then use new
RegExp(pattern).test(buffer.join('')) so isComplete uses opts.regex when
provided and a robust default otherwise; reference the isComplete(buffer, opts)
function and the opts.regex parameter when making the change.
---
Nitpick comments:
In `@eslint.config.mjs`:
- Line 15: Replace the experimental worker parser import with the main
entrypoint: update the import statement that currently references
'@babel/eslint-parser/experimental-worker' to import from '@babel/eslint-parser'
(i.e., change the module specifier in the existing import declaration so the
parser uses the main '@babel/eslint-parser' package).
In `@package.json`:
- Line 91: The package "throttle-debounce" is declared twice; remove the
duplicate entry so it exists only in the appropriate section (either
dependencies or devDependencies) depending on runtime need — locate
"throttle-debounce": "^5.0.2" in package.json and delete the occurrence in the
incorrect section so there is a single source of truth for that dependency.
- Line 33: Update the ambient Glint environment import in types/global.d.ts from
the v1 package to a v2 package: replace the current import of
'@glint/environment-ember-loose' with either
'@glint/environment-ember-template-imports' or
'@glint/environment-ember-loose/v2' (choose the one matching your template
strategy) so the ambient types align with the installed '@glint/ember-tsc' v2
wiring referenced in tsconfig.json; ensure the import statement in
types/global.d.ts is the only change and run the type checker (ember-tsc) to
verify no remaining ambient type errors.
ℹ️ Review info
Configuration used: defaults
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (5)
app/components/alpha-input.gtsapp/components/hex-input.gtsapp/components/rgb-input.gtseslint.config.mjspackage.json
| 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) | ||
| ); |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# First, let's locate and examine the file
fd "alpha-input" --type fRepository: 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.gtsRepository: shipshapecode/swach
Length of output: 3154
🏁 Script executed:
# Search for other uses of isComplete
rg "isComplete" --type ts --type gts -B 2 -A 2Repository: shipshapecode/swach
Length of output: 90
🏁 Script executed:
# Search for isComplete with proper file types
rg "isComplete" -B 2 -A 2Repository: 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 -100Repository: shipshapecode/swach
Length of output: 3231
🏁 Script executed:
# Check hex-input.gts
cat -n app/components/hex-input.gts | head -80Repository: 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.
| 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.
| isComplete(buffer: Array<string>, opts: { regex?: string }): boolean { | ||
| return new RegExp(opts.regex as string).test(buffer.join('')); |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# First, let's find and read the hex-input.gts file
find . -name "hex-input.gts" -type fRepository: 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 3Repository: 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.gtsRepository: 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 5Repository: 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(astring) [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);
}
EOFRepository: 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.
| 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.
| 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); |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# First, let's locate and examine the file
find . -name "rgb-input.gts" -type fRepository: shipshapecode/swach
Length of output: 93
🏁 Script executed:
# Let's examine the rgb-input.gts file
cat -n ./app/components/rgb-input.gtsRepository: shipshapecode/swach
Length of output: 4024
🏁 Script executed:
# Let's check the ember-inputmask package.json or dependency info
find . -name "package.json" -type f -exec grep -l "ember-inputmask" {} \;Repository: shipshapecode/swach
Length of output: 77
🏁 Script executed:
# Let's check the package.json for ember-inputmask version
cat ./package.json | grep -A 2 -B 2 "ember-inputmask"Repository: shipshapecode/swach
Length of output: 237
🌐 Web query:
ember-inputmask v4.0.3 isComplete callback opts.regex parameter
💡 Result:
In Inputmask v4.0.3 (which ember-inputmask wraps), the isComplete hook is called as:
isComplete(buffer, opts) -> booleanoptsis the resolved Inputmask options object for the current mask- When you use the
"Regex"mask/alias and pass aregexoption, that value is available asopts.regexinsideisComplete(so you can re-test the buffer against the configured regex). Example from the Inputmask docs:new RegExp(opts.regex).test(buffer.join('')). [1]
Source
- Inputmask docs / README section “isComplete” showing
Args => buffer, optsand the"Regex"example usingopts.regex. [1]
🌐 Web query:
ember-inputmask OneWayInputMask isComplete callback options parameter passed
💡 Result:
In ember-inputmask, the OneWayInputMask component is just passing your config through to Inputmask, so the isComplete hook uses Inputmask’s native signature. The 2nd parameter (options / opts) is the resolved Inputmask options object for that mask instance (your passed options merged with defaults/alias options, etc.). [1][2]
Signature:
isComplete(buffer, opts) { ... }buffer: the current mask buffer (array of characters)opts: the Inputmask options object (mask/alias + merged defaults/options) [2]
Example:
<Inputmask
`@mask`="99/99/9999"
`@isComplete`={{(buffer, opts) => {
// opts.mask, opts.placeholder, opts.clearIncomplete, opts.alias, etc.
return buffer.join('').indexOf('_') === -1;
}}}
/>Sources:
[1] https://github.com/brandynbennett/ember-inputmask
[2] https://github.com/trendyminds/jquery.inputmask (docs excerpt showing isComplete(buffer, opts))
🌐 Web query:
Inputmask v4.0.3 isComplete callback opts.regex type RegExp string
💡 Result:
In Inputmask 4.x (including v4.0.3), the Regex/regex option is treated as a string pattern, so inside callbacks like isComplete(buffer, opts) you should expect opts.regex to be a string, not a RegExp object. The docs’ own example builds a RegExp from that string: new RegExp(opts.regex). [1]
If you start with a RegExp, pass its .source (and handle flags yourself), e.g.:
const re = /^[0-9]*$/i;
$(el).inputmask("Regex", {
regex: re.source, // <- string
isComplete(buffer, opts) {
return new RegExp(opts.regex, re.flags).test(buffer.join(""));
}
});@types/inputmask also models regex?: string, matching this behavior. [2]
Sources: [1] [2]
🏁 Script executed:
# Let's search for other uses of isComplete in the codebase to understand the pattern
rg "isComplete" -A 3 -B 3Repository: shipshapecode/swach
Length of output: 2341
🏁 Script executed:
# Let's examine the alpha-input.gts to see how it implements isComplete
cat -n ./app/components/alpha-input.gts | sed -n '1,100p'Repository: shipshapecode/swach
Length of output: 3154
Add fallback regex handling for optional opts.regex parameter.
The isComplete method declares opts.regex as optional but the component always provides it. However, the type signature and the force cast create ambiguity. The current code lacks a fallback if opts.regex is ever undefined—new RegExp(undefined as string) would not validate RGB values correctly.
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.rgbRegex;
+
+ 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/rgb-input.gts` around lines 79 - 82, The isComplete method
currently force-casts opts.regex and builds a RegExp from it which fails if
opts.regex is undefined; update isComplete to use a safe fallback pattern when
opts.regex is missing (e.g., a regex string that matches three comma-separated
integers for RGB), e.g. compute const pattern = opts.regex ?? '...default
pattern...' and then use new RegExp(pattern).test(buffer.join('')) so isComplete
uses opts.regex when provided and a robust default otherwise; reference the
isComplete(buffer, opts) function and the opts.regex parameter when making the
change.
- Make oncomplete handlers accept optional InputEvent to match ember-inputmask types - Type nearest-color from() with overloads accepting string or RGB input Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
fcd638c to
a98a987
Compare
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (1)
app/components/rgb-input.gts (1)
79-84:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winReplace force cast with safe fallback pattern.
The force cast
opts.regex as stringon line 83 is unsafe: ifopts.regexis undefined,new RegExp(undefined as string)creates a regex matching the literal string"undefined", causing incorrect validation. Even though the template always passesregex=this.rgbRegex(line 59), the type signature declares it optional, so TypeScript won't catch this hazard.🛡️ Proposed fix using fallback regex
isComplete(buffer: Array<string>, opts: { regex?: string }): boolean { const value = buffer.join(''); - - return ( - Boolean(value.length) && new RegExp(opts.regex as string).test(value) - ); + const pattern = opts.regex ? new RegExp(opts.regex) : this.rgbRegex; + return Boolean(value.length) && pattern.test(value); }🤖 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 `@app/components/rgb-input.gts` around lines 79 - 84, The isComplete method uses a forced cast new RegExp(opts.regex as string) which makes RegExp("undefined") when opts.regex is missing; change this to a safe fallback by reading const pattern = opts.regex ?? '' (or return false early if no regex) and then use new RegExp(pattern) so you never cast; update the isComplete implementation (method isComplete in rgb-input.gts) to use pattern = opts.regex ?? '' (or guard if undefined) before constructing the RegExp.
🤖 Prompt for all review comments with 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.
Inline comments:
In `@eslint.config.mjs`:
- 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.
- Around line 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.
---
Duplicate comments:
In `@app/components/rgb-input.gts`:
- Around line 79-84: The isComplete method uses a forced cast new
RegExp(opts.regex as string) which makes RegExp("undefined") when opts.regex is
missing; change this to a safe fallback by reading const pattern = opts.regex ??
'' (or return false early if no regex) and then use new RegExp(pattern) so you
never cast; update the isComplete implementation (method isComplete in
rgb-input.gts) to use pattern = opts.regex ?? '' (or guard if undefined) before
constructing the RegExp.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: ca7e780d-733c-44b7-9bd7-c5e3a325e149
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (23)
.editorconfig.gitignore.stylelintrc.mjsapp/components/alpha-input.gtsapp/components/hex-input.gtsapp/components/rgb-input.gtsapp/services/.gitkeepapp/services/nearest-color.tsbabel.config.mjsconfig/ember-cli-update.jsoneslint.config.mjspackage.jsonpublic/robots.txttsconfig.jsontypes/ember-animated/motions/move.d.tstypes/ember-cognito/test-support/index.d.tstypes/ember-event-helpers/helpers/stop-propagation.d.tstypes/ember-local-storage/index.d.tstypes/ember-set-body-class/helpers/set-body-class.d.tstypes/global.d.tstypes/nearest-color/index.d.tstypes/swach/index.d.tstypes/throttle-debounce/index.d.ts
💤 Files with no reviewable changes (2)
- types/swach/index.d.ts
- .gitignore
✅ Files skipped from review due to trivial changes (7)
- types/ember-set-body-class/helpers/set-body-class.d.ts
- types/throttle-debounce/index.d.ts
- types/global.d.ts
- types/ember-animated/motions/move.d.ts
- tsconfig.json
- types/ember-event-helpers/helpers/stop-propagation.d.ts
- .editorconfig
🚧 Files skipped from review as they are similar to previous changes (9)
- types/ember-local-storage/index.d.ts
- config/ember-cli-update.json
- public/robots.txt
- .stylelintrc.mjs
- app/components/hex-input.gts
- types/ember-cognito/test-support/index.d.ts
- babel.config.mjs
- app/components/alpha-input.gts
- package.json
| * | ||
| */ | ||
| import babelParser from '@babel/eslint-parser'; | ||
| import babelParser from '@babel/eslint-parser/experimental-worker'; |
There was a problem hiding this comment.
🧩 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:
- 1: https://babeljs.io/docs/babel-eslint-parser
- 2: https://babeljs.io/blog/2021/07/26/7.15.0.html
- 3: https://github.com/babel/babel/pull/13398/files
- 4: [babel 8] Move ESLint parsing to a Worker babel/babel#13199
- 5: fix: export
metafromeslint-parser/experimental-workerbabel/babel#15747 - 6: babel/babel@7fec154
In eslint.config.mjs (line 15), justify or avoid @babel/eslint-parser/experimental-worker
- Babel documents
@babel/eslint-parser/experimental-workeras 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-parserto 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.
| globalIgnores([ | ||
| '.vite/**/*', | ||
| 'dist/', | ||
| 'coverage/', | ||
| 'electron-app/dist/**/*', | ||
| 'out/**/*', | ||
| '!**/.*', | ||
| ]), |
There was a problem hiding this comment.
🧩 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"
fiRepository: 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
fiRepository: 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"
fiRepository: shipshapecode/swach
Length of output: 4687
Add missing ESLint ignores for Ember build artifacts
- In
eslint.config.mjs(globalIgnoresaround 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) toglobalIgnoresso 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.
Rapid successive route transitions cause the View Transitions API to skip the in-flight transition, rejecting its ready/finished promises with 'AbortError: Transition was skipped'. Catch those rejections and skip view transitions entirely in tests, where they only add timing nondeterminism. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
extract-zip's yauzl 2.x silently aborts extraction on Node 24.16.0+, leaving node_modules/electron without its binary and path.txt (electron/electron#51619). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Electron >= 40.10.3 replaces extract-zip with a fixed extractor in its install script (electron/electron#51886). The yauzl override stays: @electron/packager 18.4.4 (pinned by electron-forge) still extracts the Electron zip with extract-zip + yauzl 2, which is broken on Node 24.16+. Drop the override once forge ships @electron/packager >= 19. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Summary by CodeRabbit
Chores
Style / Docs
Types
Behavior