fix/docs build starlight topics#37
Conversation
- Add new React Router example with authentication, API routes, and Prisma integration - Add new Solid.js example with TanStack Router setup and Tailwind CSS - Add new Node.js authentication example using Better Auth and Effect - Add new React Remix example with Effect integration - Remove old solid-app-start and react-app-router examples - Update global .gitignore and .npmrc configurations - Add project configuration files for all new examples - Set up database configurations, environment examples, and development tooling
- Remove pnpm override for vite in react-router-example - Add tsconfig files for solid-example app and test environments - Update root package.json pnpm settings with additional built dependencies - Clean up unused imports in solid-example Header component - Fix vite config type issues in react-router-example - Standardize solid-example dependencies to use workspace catalog - Update pnpm workspace catalog with latest package versions
…ect zod dep; ensure sidebar topics plugin builds
📝 WalkthroughWalkthroughRemoves two apps (react-app-router, solid-app-start), adds a new Solid example app (solid-example) with server functions and routing, renames several app packages, updates workspace and package metadata, adjusts TypeScript/Vite configs, and deletes assorted tooling/scripts and generated artifacts. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
participant Browser as Browser
participant Router as Router (Solid)
participant ServerFn as Server Function
participant FS as File System
Browser->>Router: Navigate to /demo/start/server-funcs (loader)
Router->>ServerFn: invoke getCount()
ServerFn->>FS: read `count.txt` (if missing -> return 0)
FS-->>ServerFn: currentCount
ServerFn-->>Router: loader response { count }
Router-->>Browser: render page with count
Browser->>ServerFn: POST updateCount({ increment:1 })
ServerFn->>FS: read `count.txt` -> parse -> add 1 -> write updated count
FS-->>ServerFn: write ack
ServerFn-->>Router: success response
Router->>Browser: invalidate route -> re-request loader
Router->>ServerFn: getCount() (repeat)
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 1 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches🧪 Generate unit tests (beta)
No actionable comments were generated in the recent review. 🎉 Comment |
- Add @prisma/client-runtime-utils dependency to prisma package - Add typecheck script to solid-example package for TypeScript validation - Update TypeScript version in cli tsconfig build info
|
View your CI Pipeline Execution ↗ for commit 2a47011
☁️ Nx Cloud last updated this comment at |
There was a problem hiding this comment.
Nx Cloud is proposing a fix for your failed CI:
These changes restore the Sharp dependency that was unintentionally removed during the zod import fix. Astro requires Sharp as a direct dependency to optimize images during the build process, and without it, the build fails with a MissingSharp error when generating optimized images.
Warning
❌ We could not verify this fix.
Suggested Fix changes
diff --git a/apps/docs/package.json b/apps/docs/package.json
index 59c42d5..9709ecb 100644
--- a/apps/docs/package.json
+++ b/apps/docs/package.json
@@ -14,6 +14,7 @@
"@astrojs/starlight-tailwind": "catalog:",
"@tailwindcss/vite": "catalog:",
"astro": "catalog:",
+ "sharp": "catalog:",
"tailwindcss": "catalog:",
"starlight-theme-nova": "catalog:",
"starlight-sidebar-topics": "catalog:",
diff --git a/nx.json b/nx.json
index 84ae30f..929ab53 100644
--- a/nx.json
+++ b/nx.json
@@ -5,10 +5,7 @@
"packageManager": "pnpm"
},
"namedInputs": {
- "default": [
- "{projectRoot}/**/*",
- "sharedGlobals"
- ],
+ "default": ["{projectRoot}/**/*", "sharedGlobals"],
"production": [
"default",
"!{projectRoot}/**/?(*.)+(spec|test).[jt]s?(x)?(.snap)",
@@ -35,10 +32,7 @@
},
{
"plugin": "@nx/vite/plugin",
- "exclude": [
- "apps/solid-app-start/**/*",
- "apps/react-app-remix/**/*"
- ],
+ "exclude": ["apps/solid-app-start/**/*", "apps/react-app-remix/**/*"],
"options": {
"buildTargetName": "build",
"serveTargetName": "serve",
@@ -72,10 +66,7 @@
"options": {
"testTargetName": "test"
},
- "exclude": [
- "apps/solid-app-start/**/*",
- "apps/react-app-remix/**/*"
- ]
+ "exclude": ["apps/solid-app-start/**/*", "apps/react-app-remix/**/*"]
}
],
"release": {
@@ -110,9 +101,7 @@
}
},
"sync": {
- "disabledTaskSyncGenerators": [
- "@nx/js:typescript-sync"
- ]
+ "disabledTaskSyncGenerators": ["@nx/js:typescript-sync"]
},
"targets": {
"local-registry": {
@@ -148,45 +137,26 @@
"targetDefaults": {
"dev": {
"cache": false,
- "dependsOn": [
- "^build"
- ]
+ "dependsOn": ["^build"]
},
"build": {
"cache": true,
- "inputs": [
- "production",
- "^production"
- ],
- "dependsOn": [
- "^build"
- ]
+ "inputs": ["production", "^production"],
+ "dependsOn": ["^build"]
},
"serve": {
"cache": false,
- "dependsOn": [
- "^build"
- ]
+ "dependsOn": ["^build"]
},
"@nx/esbuild:esbuild": {
"cache": true,
- "dependsOn": [
- "^build"
- ],
- "inputs": [
- "production",
- "^production"
- ]
+ "dependsOn": ["^build"],
+ "inputs": ["production", "^production"]
},
"@nx/js:tsc": {
"cache": true,
- "dependsOn": [
- "^build"
- ],
- "inputs": [
- "production",
- "^production"
- ]
+ "dependsOn": ["^build"],
+ "inputs": ["production", "^production"]
}
},
"generators": {
Or Apply changes locally with:
npx nx-cloud apply-locally QRxb-uTx6
Apply fix locally with your editor ↗ View interactive diff ↗
🎓 Learn more about Self-Healing CI on nx.dev
Add sharp as a production dependency to enable optimized image processing in the docs application. This provides better performance for image transformations compared to default tools.
There was a problem hiding this comment.
Actionable comments posted: 16
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
apps/react-remix-example/vite.config.ts (1)
1-12:⚠️ Potential issue | 🟠 MajorReplace
__dirnamewith the root path derived fromimport.meta.url.The project is configured as ESM (
"type": "module"in package.json), where__dirnameis undefined. Using it in the alias will throw a ReferenceError when Vite loads the config. ThefileURLToPathimport is already present; use it to define a root variable and apply it to the alias resolution.🔧 Proposed fix
import path from "node:path" import { vitePlugin as remix } from "@remix-run/dev" import { defineConfig } from "vite" import { fileURLToPath } from "node:url" +const root = fileURLToPath(new URL(".", import.meta.url)) + export default defineConfig({ - root: fileURLToPath(new URL(".", import.meta.url)), + root, plugins: [remix()], resolve: { alias: { - "~": path.resolve(__dirname, "app"), + "~": path.resolve(root, "app"), }, }, })
🤖 Fix all issues with AI agents
In @.gitignore:
- Around line 71-81: The .gitignore contains duplicate patterns; remove repeated
entries and keep only truly new patterns (e.g., preserve "generated/" and
".wrangler" if they are not present earlier) while deleting any duplicates of
existing entries like "node_modules", ".DS_Store", "dist", "dist-ssr",
"*.local", ".env", ".nitro", ".tanstack". Scan the file for existing occurrences
of these patterns and deduplicate so each ignore pattern appears once, leaving
only the unique additions mentioned in the PR.
In `@apps/cli/tsconfig.tsbuildinfo`:
- Line 1: The committed tsbuild info file tsconfig.tsbuildinfo appears to be an
auto-generated TypeScript incremental build cache; decide whether it should be
versioned: if not, remove tsconfig.tsbuildinfo from the repo and add
tsconfig.tsbuildinfo to .gitignore so it no longer appears in commits (verify
after removal that builds still work for entries in "root" like src/main.ts and
src/commands/*), otherwise add a short note to the repository docs (e.g.,
CONTRIBUTING or README) explaining why tsconfig.tsbuildinfo is intentionally
versioned for caching and CI reproducibility so reviewers understand the
decision.
In `@apps/node-auth-example/package.json`:
- Line 2: Replace every occurrence of the old package name
'@effectify/node-auth-app' with the new '@effectify/node-auth-example' across
the docs (including titles, MDX frontmatter, headings, and any filenames/links
that reference the old name), and update installation commands and import
statements (npm/yarn/pnpm and ES/CJS import examples) to use the new package
name; also mirror these changes in the Spanish translations and any
package-specific docs/pages so links and filenames (e.g., package docs page
names) remain consistent with '@effectify/node-auth-example'.
In `@apps/react-router-example/vite.config.ts`:
- Around line 8-15: The plugins array currently casts nxViteTsPaths() to Plugin
which can hide type mismatches; change the typing to accept PluginOption instead
of Plugin (e.g., update the import/typing to use PluginOption and remove the
unsafe cast on nxViteTsPaths()), so nxViteTsPaths() is included as a
PluginOption in the plugins array without forcing it to Plugin; adjust the
declaration that references plugins and any imports (replace Plugin with
PluginOption where used) so type checking is preserved for nxViteTsPaths().
In `@apps/solid-example/package.json`:
- Around line 1-4: Add a top-level "private": true field to the package.json for
the package named "@effectify/solid-example" to prevent accidental npm
publishing; update the existing object that contains "name" and "type" (e.g.,
insert "private": true next to "type": "module") so the package is explicitly
marked private.
In `@apps/solid-example/src/components/Header.tsx`:
- Around line 12-41: The two menu buttons are missing explicit types and can act
as form submit buttons; update the open-menu and close-menu button elements (the
JSX buttons that call setIsOpen(true) and setIsOpen(false) respectively in
Header.tsx) to include type="button" so they won’t trigger form
submission—locate the button with onClick={() => setIsOpen(true)} and the button
with onClick={() => setIsOpen(false)} and add the type attribute to each.
- Around line 30-74: The off-canvas <aside> remains focusable when closed;
update the aside and its child interactive elements so they are removed from the
accessibility/tab order when isOpen() is false: add aria-hidden={ !isOpen() } to
the <aside>, conditionally set inert (if available) or set pointer-events-none
and aria-hidden plus add tabindex={isOpen() ? undefined : -1} to the <nav> and
each <Link> (or wrap links in a container that gets tabindex=-1 when closed) and
ensure the close button and X icon are also excluded when closed; use the
existing isOpen() / setIsOpen to toggle these attributes so invisible links
cannot receive keyboard focus.
In `@apps/solid-example/src/routes/__root.tsx`:
- Line 20: The <html> element in the root component must include a lang
attribute for accessibility; update the <html> tag in the __root.tsx root
component (where the JSX renders <html>) to include an appropriate lang value
(e.g., lang="en" or derive from app locale/i18n) so screen readers can determine
pronunciation.
- Line 30: Wrap the TanStackRouterDevtools JSX so it only renders in development
(e.g. guard with import.meta.env.DEV or process.env.NODE_ENV !== 'production')
to avoid shipping the devtool in production; update the render inside the root
component where <TanStackRouterDevtools /> appears to be conditionally included
(e.g. {import.meta.env.DEV && <TanStackRouterDevtools />}), or dynamically
import it behind the same dev check to ensure it is tree-shaken out of
production bundles.
In `@apps/solid-example/src/routes/demo.start.server-funcs.tsx`:
- Around line 37-46: The button currently lacks an explicit type and will
default to type="submit", which can unintentionally submit surrounding forms;
update the JSX for the button that calls updateCount(...) and
router.invalidate() (the element that renders "Add 1 to {state()}?") to include
an explicit type="button" attribute so it never triggers form submission when
nested inside a form.
- Line 5: The filePath constant uses a relative path ("count.txt") which can
resolve differently across environments; change the code so that filePath is
derived from a stable, absolute location: read an environment variable (e.g.
COUNT_FILE_PATH or DATA_DIR) and, if absent, resolve to an absolute path built
from process.cwd() or a dedicated data directory (using Node's
path.resolve/path.join) to ensure consistent file resolution; update the const
filePath and any callers that reference filePath in this module (e.g., functions
in demo.start.server-funcs.tsx) to use the new env-backed, absolute path
approach.
- Around line 19-24: The inputValidator for createServerFn (updateCount) is a
no-op and must perform runtime validation: change inputValidator to verify the
incoming value is a finite number (e.g., typeof d === "number" &&
Number.isFinite(d)) and reject or throw a clear error when validation fails so
the handler won't receive invalid data; update references in updateCount (and
any related handler logic that assumes a number, e.g., readCount and filePath
usage) to rely on this runtime check before writing to the file.
In `@apps/solid-example/src/routes/index.tsx`:
- Around line 8-42: The features array is static and should be moved out of the
App component to avoid recreating it on every render; pull the const features
declaration to top-level scope (e.g., const FEATURES = [...]) above the App
function, keep the same icon JSX entries and name, and update the App component
to reference FEATURES (or retain the features name) instead of the in-function
variable; ensure any icon imports used in the array remain in scope after moving
it.
In `@apps/solid-example/src/styles.css`:
- Around line 1-10: The Biome CSS parser configuration is missing Tailwind
directives support which causes lint errors for the `@apply` usage in styles.css;
open the Biome config where the CSS parser is defined (the "css" -> "parser"
section) and add the tailwindDirectives flag by setting "tailwindDirectives":
true alongside any existing keys like "cssModules" so the parser accepts
Tailwind directives.
In `@apps/solid-example/tsconfig.json`:
- Around line 1-10: The root tsconfig.json is missing a project reference for
the app declared in apps/solid-example/tsconfig.json; either add a references
entry { "path": "./apps/solid-example" } to the root tsconfig.json so tsc -b
(solution builds) includes solid-example, or add a clear comment/docstring in
the root config and your repo README explaining you rely on Nx task
orchestration (not tsc -b) for building apps; update the root tsconfig.json
references array or documentation accordingly and ensure the referenced path
matches the existing apps/solid-example/tsconfig.json.
In `@packages/prisma/package.json`:
- Line 52: Update the dependency entry for "@prisma/client-runtime-utils" in
package.json to use the monorepo catalog versioning scheme by replacing the
hardcoded version "7.3.0" with "catalog:" so it matches the other Prisma
packages (e.g., "@prisma/adapter-better-sqlite3", "@prisma/generator",
"@prisma/internals").
| @@ -1 +1 @@ | |||
| {"root":["./src/main.ts","./src/commands/add.ts","./src/commands/create.ts","./src/commands/init.ts","./src/commands/registry.ts"],"version":"5.9.2"} No newline at end of file | |||
| {"root":["./src/main.ts","./src/commands/add.ts","./src/commands/create.ts","./src/commands/init.ts","./src/commands/registry.ts"],"version":"5.9.3"} No newline at end of file | |||
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Confirm committing tsconfig.tsbuildinfo is intentional.
If this file isn’t meant to be versioned, consider ignoring it to avoid churn; if it is intentional for caching, document that decision.
🤖 Prompt for AI Agents
In `@apps/cli/tsconfig.tsbuildinfo` at line 1, The committed tsbuild info file
tsconfig.tsbuildinfo appears to be an auto-generated TypeScript incremental
build cache; decide whether it should be versioned: if not, remove
tsconfig.tsbuildinfo from the repo and add tsconfig.tsbuildinfo to .gitignore so
it no longer appears in commits (verify after removal that builds still work for
entries in "root" like src/main.ts and src/commands/*), otherwise add a short
note to the repository docs (e.g., CONTRIBUTING or README) explaining why
tsconfig.tsbuildinfo is intentionally versioned for caching and CI
reproducibility so reviewers understand the decision.
There was a problem hiding this comment.
@kattsushi, thanks for clarifying! I've noted that tsconfig.tsbuildinfo is intentionally versioned in this project.
✏️ Learnings added
Learnt from: kattsushi
Repo: devx-op/effectify PR: 37
File: apps/cli/tsconfig.tsbuildinfo:1-1
Timestamp: 2026-02-08T23:51:14.382Z
Learning: In the effectify repository, the file `apps/cli/tsconfig.tsbuildinfo` is intentionally committed and versioned (not ignored), as confirmed by the maintainer.
Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.
| @@ -1,5 +1,5 @@ | |||
| { | |||
| "name": "@effectify/node-auth-app", | |||
| "name": "@effectify/node-auth-example", | |||
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Search for references to the old package name
rg -n "@effectify/node-auth-app" -SRepository: devx-op/effectify
Length of output: 2584
Update all references to the old package name in documentation.
The package rename to @effectify/node-auth-example was not applied to the documentation. The old name @effectify/node-auth-app still appears in 26 references across:
apps/docs/src/content/docs/backend/index.mdxapps/docs/src/content/docs/backend/installation.mdapps/docs/src/content/docs/backend/packages/node-auth-app.mdapps/docs/src/content/docs/backend/getting-started.md- Spanish equivalents in
apps/docs/src/content/docs/es/backend/
Update package names, installation commands, import statements, and page titles in these files.
🤖 Prompt for AI Agents
In `@apps/node-auth-example/package.json` at line 2, Replace every occurrence of
the old package name '@effectify/node-auth-app' with the new
'@effectify/node-auth-example' across the docs (including titles, MDX
frontmatter, headings, and any filenames/links that reference the old name), and
update installation commands and import statements (npm/yarn/pnpm and ES/CJS
import examples) to use the new package name; also mirror these changes in the
Spanish translations and any package-specific docs/pages so links and filenames
(e.g., package docs page names) remain consistent with
'@effectify/node-auth-example'.
| import { defineConfig, Plugin } from "vite" | ||
|
|
||
| const __filename = fileURLToPath(import.meta.url) | ||
| const __dirname = dirname(__filename) | ||
|
|
||
| const plugins = [ | ||
| ...(process.env.VITEST ? [] : [reactRouter()]), | ||
| nxViteTsPaths(), | ||
| nxViteTsPaths() as Plugin, |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Avoid the unsafe cast to Plugin; prefer PluginOption typing.
nxViteTsPaths() is a plugin option; narrowing it to Plugin can mask type mismatches.
♻️ Suggested typing fix
-import { defineConfig, Plugin } from "vite"
+import { defineConfig, type PluginOption } from "vite"
@@
- nxViteTsPaths() as Plugin,
+ nxViteTsPaths() as PluginOption,📝 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.
| import { defineConfig, Plugin } from "vite" | |
| const __filename = fileURLToPath(import.meta.url) | |
| const __dirname = dirname(__filename) | |
| const plugins = [ | |
| ...(process.env.VITEST ? [] : [reactRouter()]), | |
| nxViteTsPaths(), | |
| nxViteTsPaths() as Plugin, | |
| import { defineConfig, type PluginOption } from "vite" | |
| const __filename = fileURLToPath(import.meta.url) | |
| const __dirname = dirname(__filename) | |
| const plugins = [ | |
| ...(process.env.VITEST ? [] : [reactRouter()]), | |
| nxViteTsPaths() as PluginOption, |
🤖 Prompt for AI Agents
In `@apps/react-router-example/vite.config.ts` around lines 8 - 15, The plugins
array currently casts nxViteTsPaths() to Plugin which can hide type mismatches;
change the typing to accept PluginOption instead of Plugin (e.g., update the
import/typing to use PluginOption and remove the unsafe cast on
nxViteTsPaths()), so nxViteTsPaths() is included as a PluginOption in the
plugins array without forcing it to Plugin; adjust the declaration that
references plugins and any imports (replace Plugin with PluginOption where used)
so type checking is preserved for nxViteTsPaths().
| { | ||
| "name": "@effectify/solid-example", | ||
| "type": "module", | ||
| "dependencies": { |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Consider adding "private": true to prevent accidental publishing.
Since this is an example application within a monorepo and not intended for npm publication, marking it as private provides a safeguard against accidental publishing.
♻️ Suggested addition
{
"name": "@effectify/solid-example",
+ "private": true,
"type": "module",📝 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.
| { | |
| "name": "@effectify/solid-example", | |
| "type": "module", | |
| "dependencies": { | |
| { | |
| "name": "@effectify/solid-example", | |
| "private": true, | |
| "type": "module", | |
| "dependencies": { |
🤖 Prompt for AI Agents
In `@apps/solid-example/package.json` around lines 1 - 4, Add a top-level
"private": true field to the package.json for the package named
"@effectify/solid-example" to prevent accidental npm publishing; update the
existing object that contains "name" and "type" (e.g., insert "private": true
next to "type": "module") so the package is explicitly marked private.
| <button | ||
| onClick={() => { | ||
| updateCount({ data: 1 }).then(() => { | ||
| router.invalidate() | ||
| }) | ||
| }} | ||
| class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded" | ||
| > | ||
| Add 1 to {state()}? | ||
| </button> |
There was a problem hiding this comment.
Add explicit type="button" to prevent unintended form submission.
Without an explicit type, buttons default to type="submit", which can cause unintended form submissions if this component is ever placed inside a form element.
🔧 Suggested fix
<button
+ type="button"
onClick={() => {
updateCount({ data: 1 }).then(() => {
router.invalidate()
})
}}📝 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.
| <button | |
| onClick={() => { | |
| updateCount({ data: 1 }).then(() => { | |
| router.invalidate() | |
| }) | |
| }} | |
| class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded" | |
| > | |
| Add 1 to {state()}? | |
| </button> | |
| <button | |
| type="button" | |
| onClick={() => { | |
| updateCount({ data: 1 }).then(() => { | |
| router.invalidate() | |
| }) | |
| }} | |
| class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded" | |
| > | |
| Add 1 to {state()}? | |
| </button> |
🧰 Tools
🪛 Biome (2.3.13)
[error] 37-44: Provide an explicit type prop for the button element.
The default type of a button is submit, which causes the submission of a form when placed inside a form element. This is likely not the behaviour that you want inside a React application.
Allowed button types are: submit, button or reset
(lint/a11y/useButtonType)
🤖 Prompt for AI Agents
In `@apps/solid-example/src/routes/demo.start.server-funcs.tsx` around lines 37 -
46, The button currently lacks an explicit type and will default to
type="submit", which can unintentionally submit surrounding forms; update the
JSX for the button that calls updateCount(...) and router.invalidate() (the
element that renders "Add 1 to {state()}?") to include an explicit type="button"
attribute so it never triggers form submission when nested inside a form.
| const features = [ | ||
| { | ||
| icon: <Zap class="w-12 h-12 text-cyan-400" />, | ||
| title: "Powerful Server Functions", | ||
| description: | ||
| "Write server-side code that seamlessly integrates with your client components. Type-safe, secure, and simple.", | ||
| }, | ||
| { | ||
| icon: <Server class="w-12 h-12 text-cyan-400" />, | ||
| title: "Flexible Server Side Rendering", | ||
| description: | ||
| "Full-document SSR, streaming, and progressive enhancement out of the box. Control exactly what renders where.", | ||
| }, | ||
| { | ||
| icon: <RouteIcon class="w-12 h-12 text-cyan-400" />, | ||
| title: "API Routes", | ||
| description: "Build type-safe API endpoints alongside your application. No separate backend needed.", | ||
| }, | ||
| { | ||
| icon: <Shield class="w-12 h-12 text-cyan-400" />, | ||
| title: "Strongly Typed Everything", | ||
| description: "End-to-end type safety from server to client. Catch errors before they reach production.", | ||
| }, | ||
| { | ||
| icon: <Waves class="w-12 h-12 text-cyan-400" />, | ||
| title: "Full Streaming Support", | ||
| description: | ||
| "Stream data from server to client progressively. Perfect for AI applications and real-time updates.", | ||
| }, | ||
| { | ||
| icon: <Sparkles class="w-12 h-12 text-cyan-400" />, | ||
| title: "Next Generation Ready", | ||
| description: "Built from the ground up for modern web applications. Deploy anywhere JavaScript runs.", | ||
| }, | ||
| ] |
There was a problem hiding this comment.
🧹 Nitpick | 🔵 Trivial
Consider moving static data outside the component.
The features array is static and doesn't depend on props or reactive state. Defining it inside the App function means it's recreated on every render. Moving it outside the component scope would be a minor optimization.
♻️ Suggested refactor
+const features = [
+ {
+ icon: <Zap class="w-12 h-12 text-cyan-400" />,
+ title: "Powerful Server Functions",
+ description:
+ "Write server-side code that seamlessly integrates with your client components. Type-safe, secure, and simple.",
+ },
+ // ... rest of features
+]
+
function App() {
- const features = [
- // ...
- ]
return (🤖 Prompt for AI Agents
In `@apps/solid-example/src/routes/index.tsx` around lines 8 - 42, The features
array is static and should be moved out of the App component to avoid recreating
it on every render; pull the const features declaration to top-level scope
(e.g., const FEATURES = [...]) above the App function, keep the same icon JSX
entries and name, and update the App component to reference FEATURES (or retain
the features name) instead of the in-function variable; ensure any icon imports
used in the array remain in scope after moving it.
| @import "tailwindcss"; | ||
|
|
||
| body { | ||
| @apply m-0; | ||
| font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", | ||
| "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", | ||
| sans-serif; | ||
| -webkit-font-smoothing: antialiased; | ||
| -moz-osx-font-smoothing: grayscale; | ||
| } |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# Locate Biome config file
fd -a 'biome\.(json|jsonc|toml)$' .Repository: devx-op/effectify
Length of output: 90
🏁 Script executed:
cat biome.jsonRepository: devx-op/effectify
Length of output: 1844
🏁 Script executed:
cat -n apps/solid-example/src/styles.css | head -15Repository: devx-op/effectify
Length of output: 556
Enable Tailwind directives in Biome's CSS parser configuration.
The CSS parser in biome.json does not have tailwindDirectives enabled, which will cause linting errors on the @apply directive used in this file (line 4). Add "tailwindDirectives": true to the CSS parser configuration:
"css": {
"parser": {
"cssModules": true,
"tailwindDirectives": true
}
}🧰 Tools
🪛 Biome (2.3.13)
[error] 4-4: Tailwind-specific syntax is disabled.
Enable tailwindDirectives in the css parser options, or remove this if you are not using Tailwind CSS.
(parse)
🤖 Prompt for AI Agents
In `@apps/solid-example/src/styles.css` around lines 1 - 10, The Biome CSS parser
configuration is missing Tailwind directives support which causes lint errors
for the `@apply` usage in styles.css; open the Biome config where the CSS parser
is defined (the "css" -> "parser" section) and add the tailwindDirectives flag
by setting "tailwindDirectives": true alongside any existing keys like
"cssModules" so the parser accepts Tailwind directives.
| { | ||
| "extends": "../../tsconfig.base.json", | ||
| "files": [], | ||
| "include": [], | ||
| "references": [ | ||
| { "path": "./tsconfig.app.json" } | ||
| ], | ||
| "compilerOptions": { | ||
| "strict": true | ||
| } |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
rg -n "solid-example" --type jsonRepository: devx-op/effectify
Length of output: 276
🏁 Script executed:
# Check for root tsconfig files
find . -maxdepth 1 -name "tsconfig*.json" -type f | head -5
# Look at root tsconfig.base.json to see if it has references section
echo "=== ROOT TSCONFIG.BASE.JSON ===" && head -40 tsconfig.base.json 2>/dev/null
# Check for tsconfig.json at root
echo "=== ROOT TSCONFIG.JSON ===" && head -40 tsconfig.json 2>/dev/null
# Check Nx configuration (nx.json or workspace.json)
echo "=== NX/WORKSPACE CONFIG ===" && (cat nx.json 2>/dev/null || cat workspace.json 2>/dev/null || echo "Not found")Repository: devx-op/effectify
Length of output: 6920
Add solid-example to the root tsconfig.json references or clarify the build strategy.
The apps/solid-example/tsconfig.json is correctly configured with empty files/include and a reference to ./tsconfig.app.json, but it is not referenced in the root tsconfig.json. The root configuration only references ./packages/solid/query, ./packages/node/better-auth, and ./apps/node-auth-app.
If using tsc -b (TypeScript solution builds), add { "path": "./apps/solid-example" } to the root tsconfig.json references. If relying on Nx task orchestration instead, this may be acceptable, but the build strategy should be explicit.
🤖 Prompt for AI Agents
In `@apps/solid-example/tsconfig.json` around lines 1 - 10, The root tsconfig.json
is missing a project reference for the app declared in
apps/solid-example/tsconfig.json; either add a references entry { "path":
"./apps/solid-example" } to the root tsconfig.json so tsc -b (solution builds)
includes solid-example, or add a clear comment/docstring in the root config and
your repo README explaining you rely on Nx task orchestration (not tsc -b) for
building apps; update the root tsconfig.json references array or documentation
accordingly and ensure the referenced path matches the existing
apps/solid-example/tsconfig.json.
| "@effect/language-service": "catalog:", | ||
| "@effect/vitest": "catalog:", | ||
| "@prisma/adapter-better-sqlite3": "catalog:", | ||
| "@prisma/client-runtime-utils": "7.3.0", |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Check where `@prisma/client-runtime-utils` is imported/used
rg "@prisma/client-runtime-utils" --type js --type ts --type json -nRepository: devx-op/effectify
Length of output: 137
🏁 Script executed:
#!/bin/bash
# Check the current dependency section in package.json
cat packages/prisma/package.json | sed -n '40,65p'Repository: devx-op/effectify
Length of output: 895
🏁 Script executed:
#!/bin/bash
# Search more broadly for runtime-utils references
rg "runtime-utils" --type js --type ts -nRepository: devx-op/effectify
Length of output: 43
🏁 Script executed:
#!/bin/bash
# Check if there's a monorepo catalog/versions file
fd -name "catalog" -o -name "pnpm-lock.yaml" -o -name "pnpm-workspace.yaml" | head -5Repository: devx-op/effectify
Length of output: 291
🏁 Script executed:
#!/bin/bash
# Check package.json structure for any versioning patterns
cat packages/prisma/package.json | grep -A 2 -B 2 "catalog:" | head -20Repository: devx-op/effectify
Length of output: 664
🏁 Script executed:
#!/bin/bash
# Check if there's any documentation or comments about this dependency
cat packages/prisma/package.json | grep -C 5 "runtime-utils"Repository: devx-op/effectify
Length of output: 492
Update @prisma/client-runtime-utils to use the monorepo's catalog versioning scheme for consistency.
Change "7.3.0" to "catalog:" to align with all other dependencies in the project (e.g., @prisma/adapter-better-sqlite3, @prisma/generator, @prisma/internals).
🤖 Prompt for AI Agents
In `@packages/prisma/package.json` at line 52, Update the dependency entry for
"@prisma/client-runtime-utils" in package.json to use the monorepo catalog
versioning scheme by replacing the hardcoded version "7.3.0" with "catalog:" so
it matches the other Prisma packages (e.g., "@prisma/adapter-better-sqlite3",
"@prisma/generator", "@prisma/internals").
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
…s; fix CI test failure
There was a problem hiding this comment.
Actionable comments posted: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
pnpm-workspace.yaml (1)
117-136:⚠️ Potential issue | 🔴 CriticalDowngrade Vite or upgrade vite-plugin-solid for Vite 7.3.1 compatibility.
vite-plugin-solid2.11.10 officially supports Vite 3–6 only; Vite 7 support is not finalized (upstream issue#221in solidjs/vite-plugin-solid). This incompatibility will likely cause build failures or runtime issues. Either downgradeviteto 6.x or wait forvite-plugin-solidto release Vite 7 support and upgrade accordingly.(
@tailwindcss/vite4.1.18 is compatible with Vite 7.3.1; solid-js 1.9.9 is compatible with vite-plugin-solid 2.11.10.)
🤖 Fix all issues with AI agents
In `@package.json`:
- Around line 77-94: The onlyBuiltDependencies list currently omits the native
module "sharp", causing its platform-specific native binaries not to be built;
update the onlyBuiltDependencies array to include "sharp" (so its native build
scripts run) or remove "sharp" as a workspace dependency from
apps/docs/package.json; locate the onlyBuiltDependencies entry in package.json
and add "sharp" to that array (or remove the workspace reference in
apps/docs/package.json) to ensure the native binaries from the lockfile (e.g.,
`@img/sharp-`*) are built.
- Around line 62-66: The peer dependency for the package
"starlight-sidebar-topics" is too permissive ("astro": "*"); update its
peerDependencies entry to require Astro v5+ by changing the "astro" range to
"^5.0.0" so that installation fails on incompatible Astro v4 versions; locate
the "starlight-sidebar-topics" object in package.json and modify its
"peerDependencies" -> "astro" value accordingly.
In `@packages/node/better-auth/package.json`:
- Around line 40-43: Remove the unused "zod" entry from the dependencies block
in package.json (the "zod": "catalog:" key) since none of the module sources
(auth-service.ts, handler.ts, better-auth-error.ts) import or use zod and
validation is handled by effect/Schema; simply delete that dependency key from
the "dependencies" object so zod is no longer declared here (it will still be
available transitively via the peer dependency if needed).
In `@pnpm-workspace.yaml`:
- Around line 53-68: The TanStack router packages are version-misaligned:
`@tanstack/router-plugin` uses a caret range resolving to 1.159.3 while
`@tanstack/react-router` is pinned to 1.139.3, which can cause API/type skew;
update the pnpm-workspace.yaml entries so router-related packages
(`@tanstack/router-plugin`, `@tanstack/react-router`,
`@tanstack/react-router-devtools`, `@tanstack/solid-router`,
`@tanstack/solid-router-devtools`, etc.) are explicitly aligned to the same
compatible version (either pin them all to the tested version like 1.159.3 or
use the same caret range across all), then regenerate the lockfile (pnpm
install) and run the test/build to confirm compatibility.
| "starlight-sidebar-topics": { | ||
| "peerDependencies": { | ||
| "astro": "*" | ||
| } | ||
| }, |
There was a problem hiding this comment.
🧩 Analysis chain
🌐 Web query:
starlight-sidebar-topics npm package astro peer dependency supported versions
💡 Result:
For starlight-sidebar-topics, the changelog indicates that Astro v5 is supported and Astro v4 is not (“adds support for Astro v5, drops support for Astro v4”), starting with v0.3.0+ of the plugin. [1]
Current published versions are in the 0.6.x line (e.g., 0.6.2). [2]
Sources: [1] [2]
Set Astro peer range to "^5.0.0" for starlight-sidebar-topics.
starlight-sidebar-topics v0.3.0+ explicitly supports only Astro v5+ and dropped support for Astro v4. Using "astro": "*" allows installation with incompatible versions (e.g., Astro v4), defeating peer dependency checks. Bound the range to "^5.0.0" to match the plugin's documented support matrix.
🤖 Prompt for AI Agents
In `@package.json` around lines 62 - 66, The peer dependency for the package
"starlight-sidebar-topics" is too permissive ("astro": "*"); update its
peerDependencies entry to require Astro v5+ by changing the "astro" range to
"^5.0.0" so that installation fails on incompatible Astro v4 versions; locate
the "starlight-sidebar-topics" object in package.json and modify its
"peerDependencies" -> "astro" value accordingly.
| "onlyBuiltDependencies": [ | ||
| "@parcel/watcher", | ||
| "@prisma/client", | ||
| "@prisma/engines", | ||
| "@swc/core", | ||
| "@tailwindcss/oxide", | ||
| "better-sqlite3", | ||
| "core-js", | ||
| "dprint", | ||
| "esbuild", | ||
| "msgpackr-extract", | ||
| "nx", | ||
| "sharp" | ||
| "prisma", | ||
| "unrs-resolver" | ||
| ], | ||
| "ignoredBuiltDependencies": [ | ||
| "bun" | ||
| ] |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Locate any remaining sharp dependency or usage
rg -n --glob 'package.json' '"sharp"'
echo "---"
rg -n 'sharp' pnpm-lock.yamlRepository: devx-op/effectify
Length of output: 3975
Add sharp to onlyBuiltDependencies.
sharp is declared as a dependency in apps/docs/package.json and present in the lockfile with platform-specific native binaries (@img/sharp-darwin-arm64, @img/sharp-linux-x64, etc.). Omitting it from onlyBuiltDependencies will skip its native build scripts, causing runtime failures. Either re-add it to the list or remove it as a workspace dependency.
🤖 Prompt for AI Agents
In `@package.json` around lines 77 - 94, The onlyBuiltDependencies list currently
omits the native module "sharp", causing its platform-specific native binaries
not to be built; update the onlyBuiltDependencies array to include "sharp" (so
its native build scripts run) or remove "sharp" as a workspace dependency from
apps/docs/package.json; locate the onlyBuiltDependencies entry in package.json
and add "sharp" to that array (or remove the workspace reference in
apps/docs/package.json) to ensure the native binaries from the lockfile (e.g.,
`@img/sharp-`*) are built.
| "dependenciesMeta": {}, | ||
| "dependencies": { | ||
| "zod": "catalog:" | ||
| }, |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Search for zod imports and usage in the better-auth package
rg -n 'from\s+"zod"|require\("zod"\)' packages/node/better-auth/ --type ts --type tsx --type js --type jsxRepository: devx-op/effectify
Length of output: 88
🏁 Script executed:
#!/bin/bash
# Search for zod imports and usage in the better-auth package
rg -n 'from\s+"zod"|require\("zod"\)' packages/node/better-auth/Repository: devx-op/effectify
Length of output: 43
🏁 Script executed:
#!/bin/bash
# List files in the better-auth package
find packages/node/better-auth -type f \( -name "*.ts" -o -name "*.js" -o -name "*.json" \) | head -20
echo "---"
# Search for any mention of zod
rg 'zod' packages/node/better-auth/ -A 2 -B 2Repository: devx-op/effectify
Length of output: 807
🏁 Script executed:
#!/bin/bash
# Check the main source files
echo "=== index.ts ==="
cat packages/node/better-auth/src/index.ts
echo -e "\n=== auth-service.ts ==="
head -50 packages/node/better-auth/src/lib/auth-service.ts
echo -e "\n=== better-auth-error.ts ==="
cat packages/node/better-auth/src/lib/better-auth-error.ts
echo -e "\n=== handler.ts ==="
cat packages/node/better-auth/src/lib/handler.tsRepository: devx-op/effectify
Length of output: 5862
🏁 Script executed:
#!/bin/bash
cat packages/node/better-auth/package.jsonRepository: devx-op/effectify
Length of output: 1140
Remove unused zod dependency.
The package declares zod as a dependency but does not import or use it anywhere. All source files (auth-service.ts, handler.ts, better-auth-error.ts) rely on effect/Schema for validation. If better-auth requires zod, it will be installed as a transitive dependency of the peer dependency better-auth. Remove this unused entry from dependencies.
🤖 Prompt for AI Agents
In `@packages/node/better-auth/package.json` around lines 40 - 43, Remove the
unused "zod" entry from the dependencies block in package.json (the "zod":
"catalog:" key) since none of the module sources (auth-service.ts, handler.ts,
better-auth-error.ts) import or use zod and validation is handled by
effect/Schema; simply delete that dependency key from the "dependencies" object
so zod is no longer declared here (it will still be available transitively via
the peer dependency if needed).
| "@tailwindcss/vite": "4.1.18" | ||
| "@tanstack/query-core": "5.90.20" | ||
| "@tanstack/react-form": "1.25.0" | ||
| "@tanstack/react-query": "5.90.10" | ||
| "@tanstack/react-query-devtools": "5.91.0" | ||
| "@tanstack/react-router": "1.139.3" | ||
| "@tanstack/react-router-devtools": "1.139.3" | ||
| "@tanstack/router-plugin": "1.139.3" | ||
| "@tanstack/router-plugin": "^1.133.21" | ||
| "@tanstack/solid-form": "1.25.0" | ||
| "@tanstack/solid-query": "5.90.23" | ||
| "@tanstack/solid-query-devtools": "5.91.0" | ||
| "@tanstack/solid-router": "1.139.3" | ||
| "@tanstack/solid-router-devtools": "1.139.3" | ||
| "@tanstack/solid-start": "1.139.3" | ||
| "@tanstack/solid-router": "^1.133.20" | ||
| "@tanstack/solid-router-devtools": "^1.133.20" | ||
| "@tanstack/devtools-vite": "^0.3.11" | ||
| "@tanstack/solid-start": "^1.132.25" | ||
| "@tanstack/solid-router-ssr-query": "^1.132.25" |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Check if pnpm-lock.yaml exists and look for TanStack packages
if [ ! -f pnpm-lock.yaml ]; then
echo "pnpm-lock.yaml not found"
exit 1
fi
echo "=== TanStack router-related packages in lockfile ==="
rg -A 2 '@tanstack/(router-plugin|solid-router|react-router|react-router-devtools|solid-router-devtools|solid-router-ssr-query)@' pnpm-lock.yaml | head -100Repository: devx-op/effectify
Length of output: 2480
🏁 Script executed:
#!/bin/bash
# Check if there are any build files or lockfile integrity checks
# Also look for any recent issues or version compatibility notes
echo "=== Checking TanStack versions from the lockfile ==="
echo "react-router pinned: 1.139.3"
echo "router-plugin resolved: 1.159.3"
echo ""
echo "=== Version gap: $(( 1159 - 1139 )) minor versions ==="
echo ""
echo "=== Searching for version constraints or compatibility notes in source ==="
rg -i 'tanstack.*compat|compat.*tanstack|version.*skip|skip.*version' . --type yaml --type json | head -20Repository: devx-op/effectify
Length of output: 290
Align TanStack router package versions to avoid API skew.
The lockfile confirms @tanstack/router-plugin resolves to 1.159.3 (due to caret range) while @tanstack/react-router is pinned at 1.139.3 — a 20-version gap. Build tooling (router-plugin) operating against a significantly older runtime version (react-router) can cause type mismatches and devtools incompatibilities. Please verify this combination is tested and compatible, or align versions explicitly.
🤖 Prompt for AI Agents
In `@pnpm-workspace.yaml` around lines 53 - 68, The TanStack router packages are
version-misaligned: `@tanstack/router-plugin` uses a caret range resolving to
1.159.3 while `@tanstack/react-router` is pinned to 1.139.3, which can cause
API/type skew; update the pnpm-workspace.yaml entries so router-related packages
(`@tanstack/router-plugin`, `@tanstack/react-router`,
`@tanstack/react-router-devtools`, `@tanstack/solid-router`,
`@tanstack/solid-router-devtools`, etc.) are explicitly aligned to the same
compatible version (either pin them all to the tested version like 1.159.3 or
use the same caret range across all), then regenerate the lockfile (pnpm
install) and run the test/build to confirm compatibility.
Update zod dependency from version 3.x to 4.3.6 to maintain compatibility with better-auth ecosystem packages that now require zod ^4.0.0
The nxCloudId is no longer needed as the project is not using Nx Cloud or has migrated to a different setup.
* feat(examples): add new example applications and update configurations - Add new React Router example with authentication, API routes, and Prisma integration - Add new Solid.js example with TanStack Router setup and Tailwind CSS - Add new Node.js authentication example using Better Auth and Effect - Add new React Remix example with Effect integration - Remove old solid-app-start and react-app-router examples - Update global .gitignore and .npmrc configurations - Add project configuration files for all new examples - Set up database configurations, environment examples, and development tooling * chore: update workspace dependencies and configuration - Remove pnpm override for vite in react-router-example - Add tsconfig files for solid-example app and test environments - Update root package.json pnpm settings with additional built dependencies - Clean up unused imports in solid-example Header component - Fix vite config type issues in react-router-example - Standardize solid-example dependencies to use workspace catalog - Update pnpm workspace catalog with latest package versions * fix(docs): resolve astro/zod import via packageExtensions, remove direct zod dep; ensure sidebar topics plugin builds * chore: update dependencies and add typecheck script - Add @prisma/client-runtime-utils dependency to prisma package - Add typecheck script to solid-example package for TypeScript validation - Update TypeScript version in cli tsconfig build info * build(docs): add sharp dependency for image processing Add sharp as a production dependency to enable optimized image processing in the docs application. This provides better performance for image transformations compared to default tools. * Update .gitignore Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * test(node-better-auth): ensure zod v4 resolution via packageExtensions; fix CI test failure * build(deps): upgrade zod from v3 to v4 Update zod dependency from version 3.x to 4.3.6 to maintain compatibility with better-auth ecosystem packages that now require zod ^4.0.0 * chore: remove nxCloudId from nx.json configuration The nxCloudId is no longer needed as the project is not using Nx Cloud or has migrated to a different setup. --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Summary by CodeRabbit
New Features
Refactoring
Dependencies
Chores