nx
Nx
GitHub
Nx
Workspace
GitHub
CI Pipeline Executions
Filtered
Runs
Demo
Insights
Compare tasks
Analytics
Sign in
Toggle sidebar
Overview
⌘K
Nx
Loading workspace stats
Loading workspace insights...
Statistics interval
7 days
30 days
Latest CI Pipeline Executions
Status
Fix filter
Filter
Fuzzy
Filter range
Sort by
Sort by
Start time
Sort ascending
Sort descending
Succeeded
35089
d3224f81 fix(core): retry an unloadable TypeScript config on any failure, not two codes The redispatch added earlier today only fired for `ERR_REQUIRE_ESM` and `ERR_REQUIRE_ASYNC_MODULE`, on the assumption that a top-level-await config always surfaces as one of them. Measured: it does not. Depending on whether swc/ts-node ends up registered, the same `oxfmt.config.mts` fails as `ERR_REQUIRE_ASYNC_MODULE` or as a transpile artifact - `exports is not defined` - and the code-gated retry silently skipped the second shape. Any load failure is now retried through `import()`, which handles a top-level-await `.mts` directly (verified in plain Node). If the retry also fails the *original* error is rethrown, so a genuine syntax error is still reported as itself rather than as whatever `import()` says about it - the property the narrow gate was there to protect.
by Jason Jean
J
Canceled
35089
9da3664d fix(core): restore the ESM redispatch and stop the skew fallback breaking workspaces Three defects from the previous round, each measured rather than argued. `loadTsOxfmtConfig`'s `import()` fallback was deleted on the premise that `loadTsFile` recovers from `ERR_REQUIRE_ESM`. It does not, and its own JSDoc says so: those codes "bubble unchanged ... so async-aware callers can dispatch to `import()`", and a module using top-level await "must be loaded with dynamic `import()` instead". This was that caller. Measured: an `oxfmt.config.mts` with top-level await throws `ERR_REQUIRE_ASYNC_MODULE`, so every generator refused to format a workspace the oxfmt CLI handles fine - and the error text told the user to use `import()`, which is exactly what had been removed. Restored, narrowed to those two codes so every other failure is still reported as itself. The orphaned JSDoc left behind by the deleted JS loader is gone too. `@nx/js`'s skew fallback named a single canonical config file, which inverted the trade it claimed to make. Measured: with a workspace that has `.oxfmtrc.jsonc`, writing `.oxfmtrc.json` alongside it makes every oxfmt invocation fail with "Both '.oxfmtrc.json' and '.oxfmtrc.jsonc' found" - and on the prettier side `.prettierrc` outranks `.prettierrc.json`, so the user's own settings are silently replaced. A loud `TypeError` was traded for a quiet broken workspace. The fallback now repeats the whole list, preserving the never-write-a-second-config invariant, and warns when it fires. The `.swcrc` filter fix from the previous round made `writeWithPrettier` reachable with an empty pattern list, because only the `.swcrc` branch was length-guarded. Measured: prettier with no file arguments prints "No parser and no file path given" and, with stdin held open, blocks indefinitely - so `nx format:write` on a `.swcrc`-only change set hangs. The split is gone entirely: prettier's own language table maps `.swcrc` to the json parser, so the `--parser json` branch bought nothing. The filter now reads prettier's published `filenames` list rather than hardcoding one name. Also quotes the binary path with the same helper as the patterns, and passes `--` to both formatters so a file named like a flag is an operand.
by Jason Jean
J
Canceled
35089
9da3664d fix(core): restore the ESM redispatch and stop the skew fallback breaking workspaces Three defects from the previous round, each measured rather than argued. `loadTsOxfmtConfig`'s `import()` fallback was deleted on the premise that `loadTsFile` recovers from `ERR_REQUIRE_ESM`. It does not, and its own JSDoc says so: those codes "bubble unchanged ... so async-aware callers can dispatch to `import()`", and a module using top-level await "must be loaded with dynamic `import()` instead". This was that caller. Measured: an `oxfmt.config.mts` with top-level await throws `ERR_REQUIRE_ASYNC_MODULE`, so every generator refused to format a workspace the oxfmt CLI handles fine - and the error text told the user to use `import()`, which is exactly what had been removed. Restored, narrowed to those two codes so every other failure is still reported as itself. The orphaned JSDoc left behind by the deleted JS loader is gone too. `@nx/js`'s skew fallback named a single canonical config file, which inverted the trade it claimed to make. Measured: with a workspace that has `.oxfmtrc.jsonc`, writing `.oxfmtrc.json` alongside it makes every oxfmt invocation fail with "Both '.oxfmtrc.json' and '.oxfmtrc.jsonc' found" - and on the prettier side `.prettierrc` outranks `.prettierrc.json`, so the user's own settings are silently replaced. A loud `TypeError` was traded for a quiet broken workspace. The fallback now repeats the whole list, preserving the never-write-a-second-config invariant, and warns when it fires. The `.swcrc` filter fix from the previous round made `writeWithPrettier` reachable with an empty pattern list, because only the `.swcrc` branch was length-guarded. Measured: prettier with no file arguments prints "No parser and no file path given" and, with stdin held open, blocks indefinitely - so `nx format:write` on a `.swcrc`-only change set hangs. The split is gone entirely: prettier's own language table maps `.swcrc` to the json parser, so the `--parser json` branch bought nothing. The filter now reads prettier's published `filenames` list rather than hardcoding one name. Also quotes the binary path with the same helper as the patterns, and passes `--` to both formatters so a file named like a flag is an operand.
by Jason Jean
J
Failed
35089
Flaky task
→
c4afc3bc cleanup(core): let the types carry the formatter invariants Four places where a convention was holding something the compiler could. Each verified by mutation, since the guarantee is the whole point. The setup table now pairs each formatter with its own npm package name through a mapped type, and `@nx/js:init` installs `formatterSetup .packageName` instead of re-deriving it from `schema.formatter`. A key that disagrees with its package name is TS2322; a missing entry is still TS2741. `create-nx-workspace` cannot import nx's `FormatterType` - it has no `nx` dependency - so its list is checked against a local union with `satisfies` plus an exhaustiveness assertion. Deleting a member is TS2322 and a typo is TS2820. Deriving the union from the array, which is what I tried first, does not catch either: nothing assigns the dropped literal, so a subset type-checks clean. `preset/schema.d.ts` typed `formatter?: string` while its own schema.json declared the three-value enum; it now matches, so a value the generator would reject at runtime fails to compile. `getGeneratedOxfmtConfig` keyed a Set by path and then re-read the file through `tree.read`, reintroducing a `string | null` the caller's filtering had already ruled out. It now reads the Buffer out of that same set, which also drops the `tree` argument.
by Jason Jean
J
Canceled
35089
c4afc3bc cleanup(core): let the types carry the formatter invariants Four places where a convention was holding something the compiler could. Each verified by mutation, since the guarantee is the whole point. The setup table now pairs each formatter with its own npm package name through a mapped type, and `@nx/js:init` installs `formatterSetup .packageName` instead of re-deriving it from `schema.formatter`. A key that disagrees with its package name is TS2322; a missing entry is still TS2741. `create-nx-workspace` cannot import nx's `FormatterType` - it has no `nx` dependency - so its list is checked against a local union with `satisfies` plus an exhaustiveness assertion. Deleting a member is TS2322 and a typo is TS2820. Deriving the union from the array, which is what I tried first, does not catch either: nothing assigns the dropped literal, so a subset type-checks clean. `preset/schema.d.ts` typed `formatter?: string` while its own schema.json declared the three-value enum; it now matches, so a value the generator would reject at runtime fails to compile. `getGeneratedOxfmtConfig` keyed a Set by path and then re-read the file through `tree.read`, reintroducing a `string | null` the caller's filtering had already ruled out. It now reads the Buffer out of that same set, which also drops the `tree` argument.
by Jason Jean
J
Succeeded
35089
5a3aea98 fix(core): stop recommending the prettier extension to non-prettier workspaces `files-integrated-repo`'s `.vscode/extensions.json` template hardcoded `esbenp.prettier-vscode`, so every integrated workspace recommended the Prettier extension regardless of `--formatter`. Correct before this PR, when prettier was the only option; wrong for an oxfmt workspace. The template already uses EJS conditionals, so the recommendation is now conditional too. `formatter` is passed explicitly after the options spread because it is optional on the schema, and EJS raises a ReferenceError on an absent key rather than treating it as undefined. The two snapshot tests covering this were identical to each other (the one labelled "angular" set no angular options) and would not have said why the output changed. Replaced with assertions parameterised over the formatter. Also corrects three things the review measured: - the docs said Nx formats code "in two places"; this PR makes it four - `OxfmtFormat.codeframe` was typed optional; oxfmt's own `index.d.ts` declares it `string | null` - the dot-nx comment explaining which files are deliberately not recorded sat next to the one write that is
by Jason Jean
J
Canceled
35089
5a3aea98 fix(core): stop recommending the prettier extension to non-prettier workspaces `files-integrated-repo`'s `.vscode/extensions.json` template hardcoded `esbenp.prettier-vscode`, so every integrated workspace recommended the Prettier extension regardless of `--formatter`. Correct before this PR, when prettier was the only option; wrong for an oxfmt workspace. The template already uses EJS conditionals, so the recommendation is now conditional too. `formatter` is passed explicitly after the options spread because it is optional on the schema, and EJS raises a ReferenceError on an absent key rather than treating it as undefined. The two snapshot tests covering this were identical to each other (the one labelled "angular" set no angular options) and would not have said why the output changed. Replaced with assertions parameterised over the formatter. Also corrects three things the review measured: - the docs said Nx formats code "in two places"; this PR makes it four - `OxfmtFormat.codeframe` was typed optional; oxfmt's own `index.d.ts` declares it `string | null` - the dot-nx comment explaining which files are deliberately not recorded sat next to the one write that is
by Jason Jean
J
Canceled
35089
fa21fda0 fix(core): correct claims the review measured as false Round 6 of review turned up four comments asserting things the tooling does not do, plus a test that could not fail. The worst was mine, written this round: `formatInitWrites` claimed passing `cwd` pins oxfmt's config lookup to the repo root. Measured - it does not. oxfmt discovers a nested `.oxfmtrc.json` per directory, so a file under `apps/web` takes that config even when the command runs from the root. Only `--disable-nested-config` pins it. The `.editorconfig` half of the claim is true and stays. The others: - `loadTsOxfmtConfig` stated Node strips types on `import()` flatly; that needs Node >=22.18/>=23.6, and oxfmt supports runtimes below it. - `ResolvedOxfmtConfig` claimed a caller cannot read options off a failed config. `strict: false` erases the `| undefined` that would enforce it - the "never both" half is real, the read guard is convention. - `FormatterType` told maintainers no compile-time help exists. A `never` assertion in a `default` arm is enforced even under `strict: false`, so the two dispatch sites that return a value now carry one - verified by adding a third member and watching both fail to compile. - The jest oxfmt mock claimed to make production's codeframe branch reachable. Under `--stdin-filepath` oxfmt emits a single stderr line, so it never is. The test: both formatters emit byte-identical `package.json` on default options, so the oxfmt row proved nothing - dispatching every oxfmt workspace to prettier left the suite green. Each row now gets a config only its own formatter reads, which fails in both directions. Also pins the `hasOwnProperty` lookup guard and that a formatter failure still warns; both were unguarded.
by Jason Jean
J
Canceled
35089
fa21fda0 fix(core): correct claims the review measured as false Round 6 of review turned up four comments asserting things the tooling does not do, plus a test that could not fail. The worst was mine, written this round: `formatInitWrites` claimed passing `cwd` pins oxfmt's config lookup to the repo root. Measured - it does not. oxfmt discovers a nested `.oxfmtrc.json` per directory, so a file under `apps/web` takes that config even when the command runs from the root. Only `--disable-nested-config` pins it. The `.editorconfig` half of the claim is true and stays. The others: - `loadTsOxfmtConfig` stated Node strips types on `import()` flatly; that needs Node >=22.18/>=23.6, and oxfmt supports runtimes below it. - `ResolvedOxfmtConfig` claimed a caller cannot read options off a failed config. `strict: false` erases the `| undefined` that would enforce it - the "never both" half is real, the read guard is convention. - `FormatterType` told maintainers no compile-time help exists. A `never` assertion in a `default` arm is enforced even under `strict: false`, so the two dispatch sites that return a value now carry one - verified by adding a third member and watching both fail to compile. - The jest oxfmt mock claimed to make production's codeframe branch reachable. Under `--stdin-filepath` oxfmt emits a single stderr line, so it never is. The test: both formatters emit byte-identical `package.json` on default options, so the oxfmt row proved nothing - dispatching every oxfmt workspace to prettier left the suite green. Each row now gets a config only its own formatter reads, which fails in both directions. Also pins the `hasOwnProperty` lookup guard and that a formatter failure still warns; both were unguarded.
by Jason Jean
J
Failed
35089
33544747 feat(core): format the files nx init writes with the configured formatter Formatting during init happened in exactly one place: the Turborepo flow, which formatted only nx.json and only through a hardcoded prettier import. Every other flow wrote through `writeJsonFile`, which is `JSON.stringify` with a fixed 2-space indent and no trailing newline - so package.json, nx.json and .vscode/extensions.json came out ignoring whatever the repo is actually configured for. Each flow now records the files it creates or modifies, and init runs the repo's own formatter over exactly those at the end. Nothing else is touched: an existing repo's other files are not init's to reformat. The Turborepo path drops its hardcoded prettier, so an oxfmt workspace no longer gets its nx.json prettier-formatted. `.gitignore` and the vendored `.nx` wrapper scripts are deliberately not recorded - two of them have no formatter at all. Failure stays non-fatal: the repo is already initialised by that point, so a formatter that cannot run costs a warning, not the setup. NX_SKIP_FORMAT is honoured, matching generators. `writeWithOxfmt` and `writeWithPrettier` take an optional cwd so init can pass repo-relative paths, which also pins oxfmt's config and .editorconfig lookup to the repo root rather than wherever the command was invoked.
by Jason Jean
J
Failed
35089
Flaky task
→
9d7d8759 fix(core): keep the formatting failure reason when removing error.log When `nx format` produced no output of its own, the warning's entire body was a pointer to the log file that the next statement deleted, so the reason was lost. The log is now read into the warning before it is removed. The removal itself is also no longer able to fail a workspace that was created successfully - a locked file on Windows is left in place instead.
by Jason Jean
J
Canceled
35089
9d7d8759 fix(core): keep the formatting failure reason when removing error.log When `nx format` produced no output of its own, the warning's entire body was a pointer to the log file that the next statement deleted, so the reason was lost. The log is now read into the warning before it is removed. The removal itself is also no longer able to fail a workspace that was created successfully - a locked file on Windows is left in place instead.
by Jason Jean
J
Failed
35089
8b03bc23 fix(core): correct the editorconfig resolution the docs describe Measured against oxfmt: root = true is not consulted, and the chain is not merged. A parent .editorconfig applies whenever the workspace root has none of its own, and any file at the root stops the search - even an empty one - so the escape hatch the page described does not exist. Derives devkit's detectFormatterInTree type from the in-repo nx like the two symbols beside it, and types the formatter table as a partial record so a missing entry is caught where the table is written rather than silently resolving to no formatter.
by Jason Jean
J
Canceled
35089
3fe59b22 fix(core): size format chunks against the quoted pattern length Master quoted the patterns before chunking, so the budget covered the quotes. Moving the quoting into the prettier writers left chunkify measuring raw paths and every entry growing by two characters afterwards, eating the headroom the budget leaves for the rest of the command. chunkify takes an optional measure so a caller that transforms its entries on the way to the shell can size against what is actually spawned. oxfmt keeps the raw length - it goes through execFile with an args array and is never quoted.
by Jason Jean
J
Canceled
35089
3fe59b22 fix(core): size format chunks against the quoted pattern length Master quoted the patterns before chunking, so the budget covered the quotes. Moving the quoting into the prettier writers left chunkify measuring raw paths and every entry growing by two characters afterwards, eating the headroom the budget leaves for the rest of the command. chunkify takes an optional measure so a caller that transforms its entries on the way to the shell can size against what is actually spawned. oxfmt keeps the raw length - it goes through execFile with an args array and is never quoted.
by Jason Jean
J
Canceled
35089
1846dc32 revert(js): keep oxfmt's sortPackageJson default Pinning it off was the wrong layer. The e2e that surfaced it asks for prettier and should never have been formatting with oxfmt at all - the apps preset drops the formatter choice, so js:init's default decides instead.
by Jason Jean
J
Canceled
35089
1846dc32 revert(js): keep oxfmt's sortPackageJson default Pinning it off was the wrong layer. The e2e that surfaced it asks for prettier and should never have been formatting with oxfmt at all - the apps preset drops the formatter choice, so js:init's default decides instead.
by Jason Jean
J
Canceled
35089
1846dc32 revert(js): keep oxfmt's sortPackageJson default Pinning it off was the wrong layer. The e2e that surfaced it asks for prettier and should never have been formatting with oxfmt at all - the apps preset drops the formatter choice, so js:init's default decides instead.
by Jason Jean
J
Canceled
35089
1846dc32 revert(js): keep oxfmt's sortPackageJson default Pinning it off was the wrong layer. The e2e that surfaced it asks for prettier and should never have been formatting with oxfmt at all - the apps preset drops the formatter choice, so js:init's default decides instead.
by Jason Jean
J
Canceled
35089
e42896db fix(misc): declare the formatter option in the app generator schemas [Self-Healing CI Rerun]
by nx-cloud[bot]
n
Previous page
Previous
Next
Next page