Skip to content

Conversation

@kingston
Copy link
Collaborator

@kingston kingston commented Jul 12, 2025

Summary by CodeRabbit

  • New Features

    • Enhanced storage plugin with modular, registry-based file category management and type-safe lookups.
    • Support for If-None-Match HTTP header to prevent overwrites during S3 uploads.
    • Added React AdapterDialog component and improved UI for managing adapters and storage definitions.
    • Extended file input/upload components with renamed fields and enforced category types.
    • Introduced JSON deep clone utility function.
  • Improvements

    • Refined upload and read authorization patterns with separated permission checks.
    • Improved error handling and validation feedback across file operations.
    • Expanded storage adapter APIs with batch deletion, existence checks, metadata retrieval, and configurable presigned URLs.
    • Updated GraphQL schema to use enums for file categories and renamed fields for clarity.
    • Streamlined form handling and validation in model and storage configuration editors.
  • Bug Fixes

    • Corrected MIME type parsing and enhanced validation error messages for file uploads.
  • Refactor

    • Migrated storage plugin configuration from centralized categories to transformer-based file categories.
    • Modularized and reorganized storage plugin code structure and exports for maintainability.
    • Removed deprecated category editing UI and legacy utilities.
  • Chores

    • Updated dependencies and TypeScript/ESLint configurations for better compatibility and code quality.
  • Tests

    • Added comprehensive tests for JSON deep clone utility.

@vercel
Copy link

vercel bot commented Jul 12, 2025

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
baseplate-project-builder-web ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jul 12, 2025 8:11pm

@changeset-bot
Copy link

changeset-bot bot commented Jul 12, 2025

🦋 Changeset detected

Latest commit: 840c45f

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 17 packages
Name Type
@baseplate-dev/plugin-storage Patch
@baseplate-dev/utils Patch
@baseplate-dev/react-generators Patch
@baseplate-dev/tools Patch
@baseplate-dev/project-builder-common Patch
@baseplate-dev/core-generators Patch
@baseplate-dev/create-project Patch
@baseplate-dev/fastify-generators Patch
@baseplate-dev/project-builder-cli Patch
@baseplate-dev/project-builder-lib Patch
@baseplate-dev/project-builder-server Patch
@baseplate-dev/project-builder-test Patch
@baseplate-dev/project-builder-web Patch
@baseplate-dev/sync Patch
@baseplate-dev/ui-components Patch
@baseplate-dev/plugin-auth Patch
@baseplate-dev/code-morph Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@coderabbitai
Copy link

coderabbitai bot commented Jul 12, 2025

Walkthrough

This update refactors the storage plugin's file category system, migrating from a centralized array to a modular, registry-based structure with individual category files and a type-safe registry. Numerous naming and API changes are made across the storage plugin and its React components, including renaming fields, updating GraphQL schemas, and restructuring adapters and service logic. The plugin's migration and configuration APIs are updated, and new utility modules and validation logic are introduced for file uploads, adapters, and categories. ESLint and TypeScript configurations are also updated, and new tests and utilities are added.

Changes

File(s) / Path(s) Change Summary
.changeset/*.md Documents high-level summaries of changes, including storage plugin refactor, JSON deep clone utility, and ESLint rule exceptions.
packages/utils/src/json/json-deep-clone.ts, json/index.ts, json-deep-clone.unit.test.ts Adds a robust jsonDeepClone utility and corresponding tests; re-exports in index.
packages/core-generators/src/generators/node/eslint/react-rules.ts, .../templates/eslint.config.js, packages/tools/eslint-configs/react.js, typescript.js Updates ESLint Unicorn rules: disables text-encoding-identifier-case, extends filename-case ignore patterns for $ and - prefixes.
packages/tools/tsconfig.vite.lib.json Adds NodeNext module and Node16 resolution to TypeScript config.
packages/project-builder-web/src/routes/data/models/-components/new-model-dialog.tsx, -hooks/use-edited-model-config.tsx, -hooks/use-model-form.ts, edit.$key/-components/fields/model-field-form.tsx, edit.$key/graphql.tsx, edit.$key/index.tsx, edit.$key/service.tsx Refactors model form logic: adopts react-hook-form with Zod, updates context providers, and unifies edit/create flows.
packages/react-generators/src/generators/core/react-components/templates/src/components/circular-progress/circular-progress.tsx Adds 'xs' size to circular progress component.
plugins/plugin-storage/package.json Adds es-toolkit dependency.
plugins/plugin-storage/src/generators/fastify/prisma-file-transformer/prisma-file-transformer.generator.ts Refactors to use registry-based file categories and updated validation function signatures.
.../storage-module/extractor.json Major reorganization and renaming of template groups, exports, and utility structure for adapters, categories, schemas, and services.
.../storage-module/storage-module.generator.ts Refactors generator to use config providers for categories, updates task dependencies and adapter handling.
.../storage-module/templates/module/adapters/index.ts, types.ts Removes centralized adapter index and legacy type interfaces.
.../adapters/s3.ts, adapters/url.ts Refactors and extends S3 and URL adapters: new methods, improved error handling, batch deletion, metadata, and streaming download support.
.../config/categories.config.ts, schema/file-category.enum.ts, types/file-category.ts, utils/create-file-category.ts Introduces modular, type-safe file category registry, enum types, and creation helpers.
.../constants/file-categories.ts Removes legacy file category interface and array.
.../schema/file-input.input-type.ts, public-url.field.ts, presigned.mutations.ts Renames and updates GraphQL input/output types and fields for clarity (hostedUrlpublicUrl, etc.), switches to enums.
.../services/create-presigned-download-url.ts, create-presigned-upload-url.ts, download-file.ts, upload-file.ts, validate-file-input.ts, validate-upload-input.ts Refactors service logic to use new registry, input types, and validation flows. Removes legacy validation and upload utilities.
.../utils/mime.ts, mime.unit.test.ts, upload.ts, utils/validate-file-upload-options.ts Improves MIME/encoding utilities, adds error classes, removes legacy upload prep, introduces new validation utility.
plugins/plugin-storage/src/generators/react/upload-components/templates/src/components/file-input/file-input.tsx, upload.gql Renames file input props and GraphQL fields for consistency; updates types.
plugins/plugin-storage/src/storage/core/schema/models.ts Renames and reorganizes File model fields for clarity and grouping.
.../components/file-transformer-form.tsx, admin-crud/admin-crud-input-form.tsx, admin-crud/node.ts, core/components/adapter-dialog.tsx, core/components/adapter-editor-form.tsx, core/components/storage-definition-editor.tsx, core/web.ts Updates internal types, introduces adapter dialog UI, refactors editor forms, and renames components for clarity.
.../core/components/category-editor-form.tsx Removes legacy category editor form component.
.../core/generators/file-categories/file-categories.generator.ts, core/node.ts, core/schema/migrations.ts, core/schema/plugin-definition.ts, core/transformers/common.ts, core/transformers/node.ts, core/transformers/schema/file-transformer.schema.ts, core/transformers/web.ts Refactors category generation, plugin config schema, migration, and transformer logic to new modular, registry-based approach.
packages/project-builder-lib/src/plugins/migrations/run-migrations.ts, spec/config-spec.ts Updates plugin migration API to accept both config and project definition; updates migration invocation and documentation.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant ReactComponent
  participant GraphQLAPI
  participant Service
  participant FileCategoryRegistry
  participant Adapter

  User->>ReactComponent: Upload file (selects category)
  ReactComponent->>GraphQLAPI: createPresignedUploadUrl(category: Enum, filename, size)
  GraphQLAPI->>Service: createPresignedUploadUrl(input)
  Service->>FileCategoryRegistry: getCategoryByNameOrThrow(category)
  FileCategoryRegistry-->>Service: FileCategory object
  Service->>Adapter: createPresignedUploadUrl(path, options)
  Adapter-->>Service: PresignedUploadUrl
  Service-->>GraphQLAPI: { url, method, fields, expiresAt, file }
  GraphQLAPI-->>ReactComponent: Presigned upload URL and file info
  ReactComponent->>User: Shows upload form/status
Loading
sequenceDiagram
  participant User
  participant ReactComponent
  participant GraphQLAPI
  participant Service
  participant FileCategoryRegistry
  participant Adapter

  User->>ReactComponent: Request file download (select file)
  ReactComponent->>GraphQLAPI: createPresignedDownloadUrl(category: Enum, fileId)
  GraphQLAPI->>Service: createPresignedDownloadUrl(input)
  Service->>FileCategoryRegistry: getCategoryByNameOrThrow(category)
  FileCategoryRegistry-->>Service: FileCategory object
  Service->>Adapter: createPresignedDownloadUrl(path)
  Adapter-->>Service: PresignedDownloadUrl
  Service-->>GraphQLAPI: Presigned download URL
  GraphQLAPI-->>ReactComponent: Download URL
  ReactComponent->>User: Initiates download
Loading

<!-- walkthrough_end -->


---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: .coderabbit.yaml**
**Review profile: CHILL**
**Plan: Pro**


<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 2764d7b1b4093d5ecb4da0c03a8f8396a55e2499 and 840c45f4ea1c985785003a842fd6c4658878f9b1.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `plugins/plugin-storage/src/index.ts` (1 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* plugins/plugin-storage/src/index.ts

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)</summary>

* GitHub Check: Test E2E

</details>

</details>
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=halfdomelabs/baseplate&utm_content=606):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 13

🔭 Outside diff range comments (2)
plugins/plugin-auth/src/auth/core/generators/auth-routes/templates/routes/auth_/register.tsx (1)

119-140: Enforce CSS class prefixing in auth plugin templates

Per our plugin component guidelines, all CSS classes in .tsx files under plugins/plugin-auth must be prefixed with auth- (including Tailwind utility classes used in className). This applies even to generator template files, since they produce the plugin’s UI code. Please update the following template files:

  • plugins/plugin-auth/src/auth/core/generators/auth-routes/templates/routes/auth_/route.tsx
  • plugins/plugin-auth/src/auth/core/generators/auth-routes/templates/routes/auth_/register.tsx
  • plugins/plugin-auth/src/auth/core/generators/auth-routes/templates/routes/auth_/login.tsx

For each className, prefix every class token with auth-. For example:

- className="flex flex-col gap-6"
+ className="auth-flex auth-flex-col auth-gap-6"

Repeat this for all div, Button, and Link elements in these templates.

plugins/plugin-storage/src/generators/react/upload-components/templates/src/components/file-input/file-input.tsx (1)

132-262: Missing storage- prefix on Tailwind classes.

According to the coding guidelines, all CSS classes in plugin components must be prefixed with the plugin name to avoid style conflicts. This component uses many Tailwind classes without the required storage- prefix.

All Tailwind classes need to be prefixed with storage-. For example:

-    <div className={cn('max-w-md', className)}>
+    <div className={cn('storage-max-w-md', className)}>
-              className="flex h-12 w-full max-w-md items-center justify-between rounded-md border bg-background px-3 py-2 shadow-sm"
+              className="storage-flex storage-h-12 storage-w-full storage-max-w-md storage-items-center storage-justify-between storage-rounded-md storage-border storage-bg-background storage-px-3 storage-py-2 storage-shadow-sm"

This applies to all Tailwind classes throughout the component.

♻️ Duplicate comments (5)
plugins/plugin-auth/src/auth/core/generators/auth-email-password/auth-email-password.generator.ts (1)

5-5: Same extension concern applies here

See previous comment – ensure generated/index.js exists (or is mapped) when this generator runs in dev mode.

plugins/plugin-auth/src/auth/core/generators/auth-module/auth-module.generator.ts (1)

15-15: Verify .js barrel is present before execution

Re-check dev-time execution path for generated/index.js as noted in earlier comment.

plugins/plugin-auth/src/auth/core/generators/react-session/react-session.generator.ts (1)

5-5: Ensure generated barrel compiled to .js

Same runtime availability check applies.

plugins/plugin-auth/src/placeholder-auth/core/generators/placeholder-auth-module/auth-module.generator.ts (1)

4-4: Placeholder generator: confirm compiled barrel path

Make sure placeholder-auth generated barrel is emitted as index.js before this file executes.

plugins/plugin-auth/src/auth/core/generators/auth-routes/templates/routes/auth_/login.tsx (1)

132-156: CSS class prefixing concern applies here too.

Same CSS class prefixing issue as in the register template. The classes should be prefixed with auth- according to plugin guidelines, unless template files are exempt from this requirement.

🧹 Nitpick comments (6)
plugins/plugin-auth/src/common/compiler/generator-creators.ts (1)

12-12: Prefer path-alias import over relative path

Great call adding the .js extension, but our guidelines favor alias-based imports (@src/...) to avoid brittle ../ hops and ease future refactors.

-import type { AuthRoleDefinition } from '../roles/index.js';
+import type { AuthRoleDefinition } from '@src/common/roles/index.js';
packages/tools/tsconfig.vite.lib.json (1)

8-9: Double-check module + moduleResolution combo is intentional
"module": "NodeNext" already implies Node-style resolution; explicitly adding "moduleResolution": "Node16" is redundant and occasionally causes confusing IntelliSense discrepancies when the base config also sets these options differently.

If the base config already defines either value, consider omitting the duplicate here to avoid config drift.

packages/project-builder-lib/tsconfig.json (1)

6-6: noEmit: true makes outDir & build scripts misleading
With noEmit enabled, tsc will never write to dist/, so keeping "outDir": "dist" suggests artefacts that never appear. Either:

-    "outDir": "dist",
-    "rootDir": "src",
-    "noEmit": true
+    "rootDir": "src",
+    "noEmit": true

or drop noEmit if this package is supposed to publish compiled JS.

packages/project-builder-web/src/routes/data/models/-hooks/use-model-form.ts (1)

31-42: Good separation of concerns: Hook now focused solely on editing.

The refactor successfully simplifies the hook by removing creation logic, making it single-purpose. The updated JSDoc clearly reflects this change.

Consider defining a named interface for the return type to improve readability:

+interface UseModelFormResult {
+  form: UseFormReturn<ModelConfigInput>;
+  onSubmit: () => Promise<void>;
+  originalModel: ModelConfig;
+  defaultValues: ModelConfigInput;
+}
+
 export function useModelForm({
   onSubmitSuccess,
   omit,
   modelKey,
-}: UseModelFormOptions): {
-  form: UseFormReturn<ModelConfigInput>;
-  onSubmit: () => Promise<void>;
-  originalModel: ModelConfig;
-  defaultValues: ModelConfigInput;
-} {
+}: UseModelFormOptions): UseModelFormResult {
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/services/create-presigned-upload-url.ts (1)

34-41: Use validated contentType for consistency.

Consider using the validated contentType from fileCreateInput.mimeType instead of input.contentType to ensure consistency with the validation logic.

  const result = await adapter.createPresignedUploadUrl({
    path: file.storagePath,
    contentLengthRange: [
      fileCategory.minFileSize ?? 0,
      fileCategory.maxFileSize,
    ],
-   contentType: input.contentType,
+   contentType: fileCreateInput.mimeType,
  });
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/mime.ts (1)

10-21: Reconsider encoding fallback behavior.

The fallback to 'utf-8' when an invalid charset is detected might not be appropriate for all content types. Consider returning undefined instead to let the caller decide the appropriate encoding.

  // Node.js uses Buffer.isEncoding for valid encodings
- return Buffer.isEncoding(charset) ? charset : 'utf-8';
+ return Buffer.isEncoding(charset) ? charset : undefined;
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between eb6a71f and b260567.

⛔ Files ignored due to path filters (5)
  • plugins/plugin-storage/src/generators/fastify/storage-module/generated/template-paths.ts is excluded by !**/generated/**, !**/generated/**
  • plugins/plugin-storage/src/generators/fastify/storage-module/generated/template-renderers.ts is excluded by !**/generated/**, !**/generated/**
  • plugins/plugin-storage/src/generators/fastify/storage-module/generated/ts-import-providers.ts is excluded by !**/generated/**, !**/generated/**
  • plugins/plugin-storage/src/generators/fastify/storage-module/generated/typed-templates.ts is excluded by !**/generated/**, !**/generated/**
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (69)
  • .changeset/dull-words-fold.md (1 hunks)
  • .changeset/plenty-mails-refuse.md (1 hunks)
  • .changeset/short-vans-judge.md (1 hunks)
  • packages/core-generators/src/generators/node/eslint/react-rules.ts (1 hunks)
  • packages/core-generators/src/generators/node/eslint/templates/eslint.config.js (1 hunks)
  • packages/project-builder-lib/tsconfig.json (1 hunks)
  • packages/project-builder-web/src/routes/data/models/-components/new-model-dialog.tsx (3 hunks)
  • packages/project-builder-web/src/routes/data/models/-hooks/use-edited-model-config.tsx (2 hunks)
  • packages/project-builder-web/src/routes/data/models/-hooks/use-model-form.ts (3 hunks)
  • packages/project-builder-web/src/routes/data/models/edit.$key/-components/fields/model-field-form.tsx (2 hunks)
  • packages/project-builder-web/src/routes/data/models/edit.$key/graphql.tsx (2 hunks)
  • packages/project-builder-web/src/routes/data/models/edit.$key/index.tsx (2 hunks)
  • packages/project-builder-web/src/routes/data/models/edit.$key/service.tsx (2 hunks)
  • packages/react-generators/src/generators/core/react-components/templates/src/components/circular-progress/circular-progress.tsx (2 hunks)
  • packages/react-generators/src/generators/core/react-config/react-config.generator.ts (0 hunks)
  • packages/tools/eslint-configs/react.js (1 hunks)
  • packages/tools/eslint-configs/typescript.js (1 hunks)
  • packages/tools/tsconfig.vite.lib.json (1 hunks)
  • packages/ui-components/.storybook/preview.tsx (1 hunks)
  • packages/ui-components/src/components/calendar/calendar.tsx (1 hunks)
  • packages/ui-components/src/components/combobox/combobox.test.tsx (1 hunks)
  • packages/utils/src/json/index.ts (1 hunks)
  • packages/utils/src/json/json-deep-clone.ts (1 hunks)
  • packages/utils/src/json/json-deep-clone.unit.test.ts (1 hunks)
  • plugins/plugin-auth/src/auth/core/generators/auth-apollo/auth-apollo.generator.ts (1 hunks)
  • plugins/plugin-auth/src/auth/core/generators/auth-apollo/index.ts (1 hunks)
  • plugins/plugin-auth/src/auth/core/generators/auth-apollo/templates/session-error-link.ts (1 hunks)
  • plugins/plugin-auth/src/auth/core/generators/auth-email-password/auth-email-password.generator.ts (1 hunks)
  • plugins/plugin-auth/src/auth/core/generators/auth-module/auth-module.generator.ts (1 hunks)
  • plugins/plugin-auth/src/auth/core/generators/auth-routes/auth-routes.generator.ts (1 hunks)
  • plugins/plugin-auth/src/auth/core/generators/auth-routes/templates/routes/auth_/login.tsx (1 hunks)
  • plugins/plugin-auth/src/auth/core/generators/auth-routes/templates/routes/auth_/register.tsx (1 hunks)
  • plugins/plugin-auth/src/auth/core/generators/index.ts (1 hunks)
  • plugins/plugin-auth/src/auth/core/generators/react-session/react-session.generator.ts (1 hunks)
  • plugins/plugin-auth/src/auth/core/node.ts (2 hunks)
  • plugins/plugin-auth/src/auth0/generators/react/react-auth0/react-auth0.generator.ts (1 hunks)
  • plugins/plugin-auth/src/common/compiler/generator-creators.ts (1 hunks)
  • plugins/plugin-auth/src/placeholder-auth/core/generators/placeholder-auth-module/auth-module.generator.ts (1 hunks)
  • plugins/plugin-storage/package.json (1 hunks)
  • plugins/plugin-storage/src/generators/fastify/prisma-file-transformer/prisma-file-transformer.generator.ts (1 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/extractor.json (7 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/storage-module.generator.ts (7 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/adapters/index.ts (0 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/adapters/s3.ts (3 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/adapters/types.ts (0 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/adapters/url.ts (1 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/config/categories.config.ts (1 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/constants/file-categories.ts (0 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/schema/file-category.enum.ts (1 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/schema/file-input.input-type.ts (1 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/schema/presigned.mutations.ts (2 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/schema/public-url.field.ts (1 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/services/create-presigned-download-url.ts (3 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/services/create-presigned-upload-url.ts (1 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/services/download-file.ts (3 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/services/upload-file.ts (1 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/services/validate-file-input.ts (1 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/services/validate-upload-input.ts (0 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/types/adapter.ts (1 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/types/file-category.ts (1 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/create-file-category.ts (1 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/mime.ts (1 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/mime.unit.test.ts (0 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/upload.ts (0 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/validate-file-upload-options.ts (1 hunks)
  • plugins/plugin-storage/src/generators/react/upload-components/templates/src/components/file-input/file-input.tsx (7 hunks)
  • plugins/plugin-storage/src/generators/react/upload-components/templates/src/components/file-input/upload.gql (1 hunks)
  • plugins/plugin-storage/src/storage/core/schema/models.ts (2 hunks)
  • plugins/plugin-storage/src/storage/transformers/components/file-transformer-form.tsx (1 hunks)
💤 Files with no reviewable changes (7)
  • packages/react-generators/src/generators/core/react-config/react-config.generator.ts
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/upload.ts
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/mime.unit.test.ts
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/adapters/index.ts
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/services/validate-upload-input.ts
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/adapters/types.ts
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/constants/file-categories.ts
🧰 Additional context used
📓 Path-based instructions (14)
**/*.{ts,tsx}

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • CLAUDE.md
**/*

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • CLAUDE.md
**/*.tsx

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • CLAUDE.md
plugins/*/**/*.tsx

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • CLAUDE.md
{packages,plugins}/**/*.{ts,tsx}

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • .cursor/rules/code-style.mdc
plugins/plugin-*/**/*.tsx

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • plugins/CLAUDE.md
**/*.test.{ts,tsx}

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • .cursor/rules/tests.mdc
.changeset/*.md

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • CLAUDE.md
**/index.{ts,tsx}

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • CLAUDE.md
**/*.{unit,int}.test.ts

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • CLAUDE.md
**/*.test.ts

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • CLAUDE.md
{packages,plugins}/**/*.unit.test.ts

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • .cursor/rules/code-style.mdc
{packages,plugins}/**/*.{unit,int}.test.ts

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • .cursor/rules/code-style.mdc
**/*.unit.test.{ts,tsx}

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • .cursor/rules/tests.mdc
🧠 Learnings (51)
📓 Common learnings
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
plugins/plugin-storage/src/storage/transformers/components/file-transformer-form.tsx (14)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Always use `.js` extensions in imports, even for TypeScript files
Learnt from: kingston
PR: halfdomelabs/baseplate#521
File: packages/react-generators/src/generators/admin/admin-crud-edit/admin-crud-edit.generator.ts:90-94
Timestamp: 2025-05-05T06:36:50.687Z
Learning: In this codebase, import paths can include `.ts` extensions, and the `resolveModuleSpecifier` function will handle them appropriately. There's no need to strip file extensions before passing paths to functions like `TsCodeUtils.importFragment`.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use PascalCase for types and classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use TypeScript with strict type checking enabled
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: plugins/CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:58.487Z
Learning: Applies to plugins/plugin-*/**/*.tsx : All CSS classes used in `className` attributes within plugin components MUST be prefixed with the plugin name to avoid style conflicts.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : TypeScript with strict type checking
packages/ui-components/src/components/combobox/combobox.test.tsx (16)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Import test functions from 'vitest' (no globals)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.unit.test.ts : Unit tests use `.unit.test.ts` suffix
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/tests.mdc:0-0
Timestamp: 2025-06-30T11:52:28.745Z
Learning: Applies to **/*.unit.test.{ts,tsx} : Unit tests are colocated with source files using `.unit.test.ts` suffix
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Focus on testing public methods and behaviors, not implementation details
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Leverage TypeScript for type-safe mocking in tests
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/tests.mdc:0-0
Timestamp: 2025-06-30T11:52:28.745Z
Learning: Applies to **/*.int.test.{ts,tsx} : Integration tests use `.int.test.ts` suffix
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: We use vitest for unit testing
Learnt from: kingston
PR: halfdomelabs/baseplate#510
File: packages/project-builder-server/src/sync/conflict-file-monitor.test.ts:19-24
Timestamp: 2025-04-23T06:44:30.952Z
Learning: When testing file operations in this codebase, the pattern is to use Vitest automocks for 'node:fs' and 'node:fs/promises' (without explicit implementation replacement) while populating a virtual filesystem with vol.fromJSON() from memfs. File operations in tests are performed directly via vol.promises methods.
Learnt from: kingston
PR: halfdomelabs/baseplate#510
File: packages/project-builder-server/src/sync/conflict-file-monitor.test.ts:19-24
Timestamp: 2025-04-23T06:44:30.952Z
Learning: In this codebase, when testing file operations, Vitest's automocks for 'node:fs' and 'node:fs/promises' are used in conjunction with memfs, but without replacing the mock implementation explicitly in each test file. The virtual filesystem is populated using vol.fromJSON or similar methods, which works seamlessly with the automocks.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/tests.mdc:0-0
Timestamp: 2025-06-30T11:52:28.745Z
Learning: Applies to **/*.test.{ts,tsx} : For file system operations in tests, use memfs and mock 'node:fs' and 'node:fs/promises' with vi.mock
Learnt from: kingston
PR: halfdomelabs/baseplate#510
File: packages/project-builder-server/src/sync/conflict-file-monitor.test.ts:19-24
Timestamp: 2025-04-23T06:44:30.952Z
Learning: In the project-builder-server test suite, Vitest automocks for 'node:fs' and 'node:fs/promises' are already configured to use memfs without needing explicit implementation replacement in each test file.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to src/tests/**/*.{ts,tsx} : Test helpers are located in `src/tests/` directory
plugins/plugin-auth/src/auth0/generators/react/react-auth0/react-auth0.generator.ts (12)
Learnt from: kingston
PR: halfdomelabs/baseplate#428
File: packages/project-builder-server/src/sync/index.ts:5-5
Timestamp: 2025-01-23T09:12:46.178Z
Learning: Avoid importing directly from 'dist' directories. Instead, expose functionality through the package's public API and import from the main package entry point.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Always include return types on top-level functions including React components (`React.ReactElement`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/index.{ts,tsx} : Prefer barrel exports e.g. `export * from './foo.js'` instead of individual named exports
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
.changeset/short-vans-judge.md (6)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: kingston
PR: halfdomelabs/baseplate#521
File: packages/react-generators/src/generators/admin/admin-components/admin-components.generator.ts:55-61
Timestamp: 2025-05-05T06:35:13.300Z
Learning: In generators, paths should be merged with forward slashes (/) only since JavaScript generated files use POSIX style separators. The system handles conversion to Windows style separators at later stages when writing out files.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/* : Use kebab-case for file names
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use PascalCase for types and classes
plugins/plugin-auth/src/auth/core/generators/auth-module/auth-module.generator.ts (11)
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: kingston
PR: halfdomelabs/baseplate#428
File: packages/project-builder-server/src/sync/index.ts:5-5
Timestamp: 2025-01-23T09:12:46.178Z
Learning: Avoid importing directly from 'dist' directories. Instead, expose functionality through the package's public API and import from the main package entry point.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping in tsconfig.json. Removing baseUrl and using explicit relative paths with "./" prefix (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/index.{ts,tsx} : Prefer barrel exports e.g. `export * from './foo.js'` instead of individual named exports
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
plugins/plugin-auth/src/auth/core/generators/react-session/react-session.generator.ts (11)
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
Learnt from: kingston
PR: halfdomelabs/baseplate#428
File: packages/project-builder-server/src/sync/index.ts:5-5
Timestamp: 2025-01-23T09:12:46.178Z
Learning: Avoid importing directly from 'dist' directories. Instead, expose functionality through the package's public API and import from the main package entry point.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/index.{ts,tsx} : Prefer barrel exports e.g. `export * from './foo.js'` instead of individual named exports
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: kingston
PR: halfdomelabs/baseplate#592
File: plugins/plugin-auth/src/auth0/generators/react/auth0-hooks/templates/src/hooks/use-required-user-id.ts:1-2
Timestamp: 2025-07-07T18:24:17.522Z
Learning: Files under templates/** directories can use `// @ts-nocheck` because they are templates meant for code generation, not direct type checking.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
packages/ui-components/src/components/calendar/calendar.tsx (8)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: kingston
PR: halfdomelabs/baseplate#428
File: packages/project-builder-server/src/sync/index.ts:5-5
Timestamp: 2025-01-23T09:12:46.178Z
Learning: Avoid importing directly from 'dist' directories. Instead, expose functionality through the package's public API and import from the main package entry point.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/index.{ts,tsx} : Prefer barrel exports e.g. `export * from './foo.js'` instead of individual named exports
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: plugins/CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:58.487Z
Learning: Applies to plugins/plugin-*/**/*.tsx : When using utility functions like `cn()`, all CSS classes passed to `cn()` in plugin components MUST be prefixed with the plugin name.
plugins/plugin-auth/src/auth/core/generators/auth-email-password/auth-email-password.generator.ts (6)
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: kingston
PR: halfdomelabs/baseplate#428
File: packages/project-builder-server/src/sync/index.ts:5-5
Timestamp: 2025-01-23T09:12:46.178Z
Learning: Avoid importing directly from 'dist' directories. Instead, expose functionality through the package's public API and import from the main package entry point.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: kingston
PR: halfdomelabs/baseplate#592
File: plugins/plugin-auth/src/auth0/generators/react/auth0-hooks/templates/src/hooks/use-required-user-id.ts:1-2
Timestamp: 2025-07-07T18:24:17.522Z
Learning: Files under templates/** directories can use `// @ts-nocheck` because they are templates meant for code generation, not direct type checking.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
plugins/plugin-auth/src/auth/core/generators/auth-apollo/index.ts (9)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/index.{ts,tsx} : Prefer barrel exports e.g. `export * from './foo.js'` instead of individual named exports
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: kingston
PR: halfdomelabs/baseplate#428
File: packages/project-builder-server/src/sync/index.ts:5-5
Timestamp: 2025-01-23T09:12:46.178Z
Learning: Avoid importing directly from 'dist' directories. Instead, expose functionality through the package's public API and import from the main package entry point.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Import test functions from 'vitest' (no globals)
plugins/plugin-storage/package.json (3)
Learnt from: kingston
PR: halfdomelabs/baseplate#539
File: scripts/check-changesets.ts:70-79
Timestamp: 2025-05-08T12:56:11.723Z
Learning: In the check-changesets.ts script for monorepo validation, `npm pack ${pkg.name}@latest` is intentionally used to pack the most recently published version (not local changes) for comparison purposes to determine if changes require new changesets.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
packages/project-builder-lib/tsconfig.json (13)
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping in tsconfig.json. Removing baseUrl and using explicit relative paths with "./" prefix (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping when using explicit relative paths (with "./"). Removing baseUrl from tsconfig.json while updating paths to use relative paths (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: kingston
PR: halfdomelabs/baseplate#562
File: plugins/plugin-auth/package.json:32-36
Timestamp: 2025-06-03T09:11:29.651Z
Learning: With TypeScript project references, TypeScript compilation is watched from the root level using "watch:tsc:root" script, so individual packages no longer need to include their "tsc:watch" scripts in their local "watch" commands. The local "tsc:watch" scripts are renamed from "watch:tsc" but are not meant to be run as part of the package's watch command since TypeScript watching is handled centrally at the workspace root.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : TypeScript with strict type checking
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use TypeScript with strict type checking enabled
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: kingston
PR: halfdomelabs/baseplate#592
File: plugins/plugin-auth/src/auth0/generators/react/auth0-hooks/templates/src/hooks/use-required-user-id.ts:1-2
Timestamp: 2025-07-07T18:24:17.522Z
Learning: Files under templates/** directories can use `// @ts-nocheck` because they are templates meant for code generation, not direct type checking.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/tests.mdc:0-0
Timestamp: 2025-06-30T11:52:28.745Z
Learning: Applies to src/__mocks__/**/*.{ts,tsx} : Manual mocks are in `src/__mocks__/` directory
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to src/__mocks__/**/*.{ts,tsx} : Manual mocks are in `src/__mocks__/` directory
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/tests.mdc:0-0
Timestamp: 2025-06-30T11:52:28.745Z
Learning: Applies to **/*.unit.test.{ts,tsx} : Unit tests are colocated with source files using `.unit.test.ts` suffix
plugins/plugin-auth/src/placeholder-auth/core/generators/placeholder-auth-module/auth-module.generator.ts (6)
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
Learnt from: kingston
PR: halfdomelabs/baseplate#428
File: packages/project-builder-server/src/sync/index.ts:5-5
Timestamp: 2025-01-23T09:12:46.178Z
Learning: Avoid importing directly from 'dist' directories. Instead, expose functionality through the package's public API and import from the main package entry point.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping in tsconfig.json. Removing baseUrl and using explicit relative paths with "./" prefix (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: kingston
PR: halfdomelabs/baseplate#592
File: plugins/plugin-auth/src/auth0/generators/react/auth0-hooks/templates/src/hooks/use-required-user-id.ts:1-2
Timestamp: 2025-07-07T18:24:17.522Z
Learning: Files under templates/** directories can use `// @ts-nocheck` because they are templates meant for code generation, not direct type checking.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
packages/core-generators/src/generators/node/eslint/templates/eslint.config.js (1)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use TypeScript with strict type checking enabled
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/services/download-file.ts (1)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
plugins/plugin-auth/src/auth/core/generators/auth-routes/templates/routes/auth_/register.tsx (3)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
plugins/plugin-auth/src/common/compiler/generator-creators.ts (10)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping in tsconfig.json. Removing baseUrl and using explicit relative paths with "./" prefix (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping when using explicit relative paths (with "./"). Removing baseUrl from tsconfig.json while updating paths to use relative paths (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
plugins/plugin-auth/src/auth/core/generators/auth-routes/templates/routes/auth_/login.tsx (3)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
packages/ui-components/.storybook/preview.tsx (10)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Always use `.js` extensions in imports, even for TypeScript files
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: kingston
PR: halfdomelabs/baseplate#521
File: packages/react-generators/src/generators/admin/admin-crud-edit/admin-crud-edit.generator.ts:90-94
Timestamp: 2025-05-05T06:36:50.687Z
Learning: In this codebase, import paths can include `.ts` extensions, and the `resolveModuleSpecifier` function will handle them appropriately. There's no need to strip file extensions before passing paths to functions like `TsCodeUtils.importFragment`.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : TypeScript with strict type checking
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Always import vitest globals explicitly (describe, it, expect)
plugins/plugin-auth/src/auth/core/node.ts (7)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: kingston
PR: halfdomelabs/baseplate#428
File: packages/project-builder-server/src/sync/index.ts:5-5
Timestamp: 2025-01-23T09:12:46.178Z
Learning: Avoid importing directly from 'dist' directories. Instead, expose functionality through the package's public API and import from the main package entry point.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
plugins/plugin-auth/src/auth/core/generators/auth-routes/auth-routes.generator.ts (12)
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: kingston
PR: halfdomelabs/baseplate#428
File: packages/project-builder-server/src/sync/index.ts:5-5
Timestamp: 2025-01-23T09:12:46.178Z
Learning: Avoid importing directly from 'dist' directories. Instead, expose functionality through the package's public API and import from the main package entry point.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping in tsconfig.json. Removing baseUrl and using explicit relative paths with "./" prefix (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping when using explicit relative paths (with "./"). Removing baseUrl from tsconfig.json while updating paths to use relative paths (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: kingston
PR: halfdomelabs/baseplate#592
File: plugins/plugin-auth/src/auth0/generators/react/auth0-hooks/templates/src/hooks/use-required-user-id.ts:1-2
Timestamp: 2025-07-07T18:24:17.522Z
Learning: Files under templates/** directories can use `// @ts-nocheck` because they are templates meant for code generation, not direct type checking.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: kingston
PR: halfdomelabs/baseplate#521
File: packages/react-generators/src/generators/admin/admin-components/admin-components.generator.ts:55-61
Timestamp: 2025-05-05T06:35:13.300Z
Learning: In generators, paths should be merged with forward slashes (/) only since JavaScript generated files use POSIX style separators. The system handles conversion to Windows style separators at later stages when writing out files.
packages/project-builder-web/src/routes/data/models/edit.$key/index.tsx (2)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
packages/tools/eslint-configs/typescript.js (10)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : TypeScript with strict type checking
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use TypeScript with strict type checking enabled
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use PascalCase for types and classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Use camelCase for variables/functions, PascalCase for types/classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping in tsconfig.json. Removing baseUrl and using explicit relative paths with "./" prefix (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Always use `.js` extensions in imports, even for TypeScript files
Learnt from: kingston
PR: halfdomelabs/baseplate#592
File: plugins/plugin-auth/src/auth0/generators/react/auth0-hooks/templates/src/hooks/use-required-user-id.ts:1-2
Timestamp: 2025-07-07T18:24:17.522Z
Learning: Files under templates/** directories can use `// @ts-nocheck` because they are templates meant for code generation, not direct type checking.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
plugins/plugin-auth/src/auth/core/generators/index.ts (12)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/index.{ts,tsx} : Prefer barrel exports e.g. `export * from './foo.js'` instead of individual named exports
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: kingston
PR: halfdomelabs/baseplate#428
File: packages/project-builder-server/src/sync/index.ts:5-5
Timestamp: 2025-01-23T09:12:46.178Z
Learning: Avoid importing directly from 'dist' directories. Instead, expose functionality through the package's public API and import from the main package entry point.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Import test functions from 'vitest' (no globals)
packages/utils/src/json/index.ts (15)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/index.{ts,tsx} : Prefer barrel exports e.g. `export * from './foo.js'` instead of individual named exports
Learnt from: kingston
PR: halfdomelabs/baseplate#428
File: packages/project-builder-server/src/sync/index.ts:5-5
Timestamp: 2025-01-23T09:12:46.178Z
Learning: Avoid importing directly from 'dist' directories. Instead, expose functionality through the package's public API and import from the main package entry point.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Sort imports by group: external libs first, then local imports
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: kingston
PR: halfdomelabs/baseplate#539
File: scripts/check-changesets.ts:10-13
Timestamp: 2025-05-08T12:56:59.222Z
Learning: Node.js 22.0.0 and later versions include both `glob` and `globSync` functionality in the core `node:fs` module, making `import { promises as fs, globSync } from 'node:fs';` valid syntax.
Learnt from: kingston
PR: halfdomelabs/baseplate#539
File: scripts/check-changesets.ts:10-13
Timestamp: 2025-05-08T12:56:59.222Z
Learning: Node.js 20.12.0 and above include `globSync` in the core `node:fs` module, so `import { promises as fs, globSync } from 'node:fs';` is valid syntax in projects using these Node.js versions.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Import test functions from 'vitest' (no globals)
Learnt from: kingston
PR: halfdomelabs/baseplate#511
File: packages/project-builder-server/src/service/builder-service.ts:19-20
Timestamp: 2025-04-23T16:41:00.321Z
Learning: The `execa` package exports `parseCommandString` as part of its public API in the version used by the project.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
packages/tools/tsconfig.vite.lib.json (16)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping in tsconfig.json. Removing baseUrl and using explicit relative paths with "./" prefix (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping when using explicit relative paths (with "./"). Removing baseUrl from tsconfig.json while updating paths to use relative paths (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : TypeScript with strict type checking
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use TypeScript with strict type checking enabled
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: kingston
PR: halfdomelabs/baseplate#562
File: plugins/plugin-auth/package.json:32-36
Timestamp: 2025-06-03T09:11:29.651Z
Learning: With TypeScript project references, TypeScript compilation is watched from the root level using "watch:tsc:root" script, so individual packages no longer need to include their "tsc:watch" scripts in their local "watch" commands. The local "tsc:watch" scripts are renamed from "watch:tsc" but are not meant to be run as part of the package's watch command since TypeScript watching is handled centrally at the workspace root.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Import test functions from 'vitest' (no globals)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Always use `.js` extensions in imports, even for TypeScript files
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Always include return types on top-level functions including React components (`React.ReactElement`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Sort imports by group: external libs first, then local imports
Learnt from: kingston
PR: halfdomelabs/baseplate#598
File: packages/fastify-generators/src/generators/yoga/yoga-plugin/templates/src/plugins/graphql/index.ts:18-18
Timestamp: 2025-07-10T06:49:07.714Z
Learning: In React projects using Vite, keep the .env file naming convention as .env.development, .env.production, etc. even when internal application environment values use shorter abbreviations like 'dev', 'stage', 'prod'. This follows Vite's mode conventions.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
plugins/plugin-storage/src/generators/fastify/prisma-file-transformer/prisma-file-transformer.generator.ts (1)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
packages/core-generators/src/generators/node/eslint/react-rules.ts (12)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use PascalCase for types and classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Use camelCase for variables/functions, PascalCase for types/classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: plugins/CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:58.487Z
Learning: Applies to plugins/plugin-*/**/*.tsx : When using utility functions like `cn()`, all CSS classes passed to `cn()` in plugin components MUST be prefixed with the plugin name.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.unit.test.ts : Unit tests use `.unit.test.ts` suffix
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/* : Use kebab-case for file names
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: plugins/CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:58.487Z
Learning: Applies to plugins/plugin-*/**/*.tsx : All CSS classes used in `className` attributes within plugin components MUST be prefixed with the plugin name to avoid style conflicts.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : TypeScript with strict type checking
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use TypeScript with strict type checking enabled
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Always use `.js` extensions in imports, even for TypeScript files
packages/tools/eslint-configs/react.js (15)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use PascalCase for types and classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.unit.test.ts : Unit tests use `.unit.test.ts` suffix
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: plugins/CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:58.487Z
Learning: Applies to plugins/plugin-*/**/*.tsx : When using utility functions like `cn()`, all CSS classes passed to `cn()` in plugin components MUST be prefixed with the plugin name.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Use camelCase for variables/functions, PascalCase for types/classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: plugins/CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:58.487Z
Learning: Applies to plugins/plugin-*/**/*.tsx : All CSS classes used in `className` attributes within plugin components MUST be prefixed with the plugin name to avoid style conflicts.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/* : Use kebab-case for file names
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : TypeScript with strict type checking
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use TypeScript with strict type checking enabled
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/tests.mdc:0-0
Timestamp: 2025-06-30T11:52:28.745Z
Learning: Applies to **/*.int.test.{ts,tsx} : Integration tests use `.int.test.ts` suffix
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/schema/public-url.field.ts (3)
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping in tsconfig.json. Removing baseUrl and using explicit relative paths with "./" prefix (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping when using explicit relative paths (with "./"). Removing baseUrl from tsconfig.json while updating paths to use relative paths (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/schema/file-category.enum.ts (5)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: kingston
PR: halfdomelabs/baseplate#592
File: plugins/plugin-auth/src/auth0/generators/react/auth0-hooks/templates/src/hooks/use-required-user-id.ts:1-2
Timestamp: 2025-07-07T18:24:17.522Z
Learning: Files under templates/** directories can use `// @ts-nocheck` because they are templates meant for code generation, not direct type checking.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : TypeScript with strict type checking
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use TypeScript with strict type checking enabled
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/create-file-category.ts (2)
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
Learnt from: kingston
PR: halfdomelabs/baseplate#592
File: plugins/plugin-auth/src/auth0/generators/react/auth0-hooks/templates/src/hooks/use-required-user-id.ts:1-2
Timestamp: 2025-07-07T18:24:17.522Z
Learning: Files under templates/** directories can use `// @ts-nocheck` because they are templates meant for code generation, not direct type checking.
packages/react-generators/src/generators/core/react-components/templates/src/components/circular-progress/circular-progress.tsx (2)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
packages/utils/src/json/json-deep-clone.unit.test.ts (15)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Include tests for error conditions and edge cases
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Leverage TypeScript for type-safe mocking in tests
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Each test should verify one specific behavior
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Each test should be independent and not rely on others
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Focus on testing public methods and behaviors, not implementation details
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.unit.test.ts : Unit tests use `.unit.test.ts` suffix
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{unit,int}.test.ts : Unit tests use `.unit.test.ts` suffix, integration tests use `.int.test.ts`
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Import test functions from 'vitest' (no globals)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Colocate tests with implementation files, e.g. for `./utils.ts`, add the test to `./utils.unit.test.ts`
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: We use vitest for unit testing
Learnt from: kingston
PR: halfdomelabs/baseplate#510
File: packages/project-builder-server/src/sync/conflict-file-monitor.test.ts:19-24
Timestamp: 2025-04-23T06:44:30.952Z
Learning: When testing file operations in this codebase, the pattern is to use Vitest automocks for 'node:fs' and 'node:fs/promises' (without explicit implementation replacement) while populating a virtual filesystem with vol.fromJSON() from memfs. File operations in tests are performed directly via vol.promises methods.
Learnt from: kingston
PR: halfdomelabs/baseplate#510
File: packages/project-builder-server/src/sync/conflict-file-monitor.test.ts:19-24
Timestamp: 2025-04-23T06:44:30.952Z
Learning: In this codebase, when testing file operations, Vitest's automocks for 'node:fs' and 'node:fs/promises' are used in conjunction with memfs, but without replacing the mock implementation explicitly in each test file. The virtual filesystem is populated using vol.fromJSON or similar methods, which works seamlessly with the automocks.
Learnt from: kingston
PR: halfdomelabs/baseplate#510
File: packages/project-builder-server/src/sync/conflict-file-monitor.test.ts:19-24
Timestamp: 2025-04-23T06:44:30.952Z
Learning: In the project-builder-server test suite, Vitest automocks for 'node:fs' and 'node:fs/promises' are already configured to use memfs without needing explicit implementation replacement in each test file.
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/schema/file-input.input-type.ts (1)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
packages/project-builder-web/src/routes/data/models/edit.$key/-components/fields/model-field-form.tsx (1)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/services/create-presigned-download-url.ts (4)
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping in tsconfig.json. Removing baseUrl and using explicit relative paths with "./" prefix (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: kingston
PR: halfdomelabs/baseplate#428
File: packages/project-builder-server/src/sync/index.ts:5-5
Timestamp: 2025-01-23T09:12:46.178Z
Learning: Avoid importing directly from 'dist' directories. Instead, expose functionality through the package's public API and import from the main package entry point.
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping when using explicit relative paths (with "./"). Removing baseUrl from tsconfig.json while updating paths to use relative paths (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: kingston
PR: halfdomelabs/baseplate#539
File: scripts/check-changesets.ts:10-13
Timestamp: 2025-05-08T12:56:59.222Z
Learning: Node.js 20.12.0 and above include `globSync` in the core `node:fs` module, so `import { promises as fs, globSync } from 'node:fs';` is valid syntax in projects using these Node.js versions.
packages/project-builder-web/src/routes/data/models/-hooks/use-edited-model-config.tsx (4)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/adapters/url.ts (4)
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping in tsconfig.json. Removing baseUrl and using explicit relative paths with "./" prefix (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping when using explicit relative paths (with "./"). Removing baseUrl from tsconfig.json while updating paths to use relative paths (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: kingston
PR: halfdomelabs/baseplate#510
File: packages/project-builder-server/src/sync/conflict-file-monitor.test.ts:19-24
Timestamp: 2025-04-23T06:44:30.952Z
Learning: When testing file operations in this codebase, the pattern is to use Vitest automocks for 'node:fs' and 'node:fs/promises' (without explicit implementation replacement) while populating a virtual filesystem with vol.fromJSON() from memfs. File operations in tests are performed directly via vol.promises methods.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/tests.mdc:0-0
Timestamp: 2025-06-30T11:52:28.745Z
Learning: Applies to **/*.test.{ts,tsx} : For file system operations in tests, use memfs and mock 'node:fs' and 'node:fs/promises' with vi.mock
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/types/file-category.ts (2)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: kingston
PR: halfdomelabs/baseplate#592
File: plugins/plugin-auth/src/auth0/generators/react/auth0-hooks/templates/src/hooks/use-required-user-id.ts:1-2
Timestamp: 2025-07-07T18:24:17.522Z
Learning: Files under templates/** directories can use `// @ts-nocheck` because they are templates meant for code generation, not direct type checking.
plugins/plugin-auth/src/auth/core/generators/auth-apollo/auth-apollo.generator.ts (1)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
packages/project-builder-web/src/routes/data/models/-hooks/use-model-form.ts (3)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
.changeset/dull-words-fold.md (1)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to .changeset/*.md : If you are adding a new feature or changing an existing feature, add a new Changeset in the `.changeset/` directory
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/config/categories.config.ts (10)
Learnt from: kingston
PR: halfdomelabs/baseplate#592
File: plugins/plugin-auth/src/auth0/generators/react/auth0-hooks/templates/src/hooks/use-required-user-id.ts:1-2
Timestamp: 2025-07-07T18:24:17.522Z
Learning: Files under templates/** directories can use `// @ts-nocheck` because they are templates meant for code generation, not direct type checking.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use TypeScript with strict type checking enabled
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : TypeScript with strict type checking
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use PascalCase for types and classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
packages/project-builder-web/src/routes/data/models/-components/new-model-dialog.tsx (3)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
plugins/plugin-storage/src/generators/react/upload-components/templates/src/components/file-input/file-input.tsx (8)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use PascalCase for types and classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: plugins/CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:58.487Z
Learning: Applies to plugins/plugin-*/**/*.tsx : All CSS classes used in `className` attributes within plugin components MUST be prefixed with the plugin name to avoid style conflicts.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Use camelCase for variables/functions, PascalCase for types/classes
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/mime.ts (1)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/validate-file-upload-options.ts (2)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: kingston
PR: halfdomelabs/baseplate#592
File: plugins/plugin-auth/src/auth0/generators/react/auth0-hooks/templates/src/hooks/use-required-user-id.ts:1-2
Timestamp: 2025-07-07T18:24:17.522Z
Learning: Files under templates/** directories can use `// @ts-nocheck` because they are templates meant for code generation, not direct type checking.
plugins/plugin-storage/src/generators/fastify/storage-module/storage-module.generator.ts (14)
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: kingston
PR: halfdomelabs/baseplate#521
File: plugins/baseplate-plugin-storage/src/generators/react/upload-components/upload-components.generator.ts:108-112
Timestamp: 2025-05-05T06:37:43.106Z
Learning: The template extractor in the baseplate codebase can automatically infer and determine the necessary import map providers for certain templates, making explicit specification of importMapProviders unnecessary in those cases.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: kingston
PR: halfdomelabs/baseplate#521
File: packages/react-generators/src/generators/admin/admin-crud-edit/admin-crud-edit.generator.ts:90-94
Timestamp: 2025-05-05T06:36:50.687Z
Learning: In this codebase, import paths can include `.ts` extensions, and the `resolveModuleSpecifier` function will handle them appropriately. There's no need to strip file extensions before passing paths to functions like `TsCodeUtils.importFragment`.
Learnt from: kingston
PR: halfdomelabs/baseplate#428
File: packages/project-builder-server/src/sync/index.ts:5-5
Timestamp: 2025-01-23T09:12:46.178Z
Learning: Avoid importing directly from 'dist' directories. Instead, expose functionality through the package's public API and import from the main package entry point.
Learnt from: kingston
PR: halfdomelabs/baseplate#521
File: packages/react-generators/src/generators/admin/admin-crud-list/admin-crud-list.generator.ts:163-166
Timestamp: 2025-05-05T06:37:51.001Z
Learning: For certain templates in the codebase, the `importMapProviders` property is not explicitly required as the template extractor will automatically determine and infer the necessary import map providers.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: kingston
PR: halfdomelabs/baseplate#510
File: packages/project-builder-server/src/sync/conflict-file-monitor.test.ts:19-24
Timestamp: 2025-04-23T06:44:30.952Z
Learning: In the project-builder-server test suite, Vitest automocks for 'node:fs' and 'node:fs/promises' are already configured to use memfs without needing explicit implementation replacement in each test file.
Learnt from: kingston
PR: halfdomelabs/baseplate#510
File: packages/project-builder-server/src/sync/conflict-file-monitor.test.ts:19-24
Timestamp: 2025-04-23T06:44:30.952Z
Learning: When testing file operations in this codebase, the pattern is to use Vitest automocks for 'node:fs' and 'node:fs/promises' (without explicit implementation replacement) while populating a virtual filesystem with vol.fromJSON() from memfs. File operations in tests are performed directly via vol.promises methods.
Learnt from: kingston
PR: halfdomelabs/baseplate#592
File: plugins/plugin-auth/src/auth0/generators/react/auth0-hooks/templates/src/hooks/use-required-user-id.ts:1-2
Timestamp: 2025-07-07T18:24:17.522Z
Learning: Files under templates/** directories can use `// @ts-nocheck` because they are templates meant for code generation, not direct type checking.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/types/adapter.ts (1)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
plugins/plugin-storage/src/generators/fastify/storage-module/extractor.json (22)
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: kingston
PR: halfdomelabs/baseplate#592
File: plugins/plugin-auth/src/auth0/generators/react/auth0-hooks/templates/src/hooks/use-required-user-id.ts:1-2
Timestamp: 2025-07-07T18:24:17.522Z
Learning: Files under templates/** directories can use `// @ts-nocheck` because they are templates meant for code generation, not direct type checking.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use PascalCase for types and classes
Learnt from: kingston
PR: halfdomelabs/baseplate#521
File: packages/react-generators/src/generators/admin/admin-crud-list/admin-crud-list.generator.ts:163-166
Timestamp: 2025-05-05T06:37:51.001Z
Learning: For certain templates in the codebase, the `importMapProviders` property is not explicitly required as the template extractor will automatically determine and infer the necessary import map providers.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping in tsconfig.json. Removing baseUrl and using explicit relative paths with "./" prefix (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping when using explicit relative paths (with "./"). Removing baseUrl from tsconfig.json while updating paths to use relative paths (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: kingston
PR: halfdomelabs/baseplate#562
File: plugins/plugin-auth/package.json:32-36
Timestamp: 2025-06-03T09:11:29.651Z
Learning: With TypeScript project references, TypeScript compilation is watched from the root level using "watch:tsc:root" script, so individual packages no longer need to include their "tsc:watch" scripts in their local "watch" commands. The local "tsc:watch" scripts are renamed from "watch:tsc" but are not meant to be run as part of the package's watch command since TypeScript watching is handled centrally at the workspace root.
Learnt from: kingston
PR: halfdomelabs/baseplate#521
File: plugins/baseplate-plugin-storage/src/generators/react/upload-components/upload-components.generator.ts:108-112
Timestamp: 2025-05-05T06:37:43.106Z
Learning: The template extractor in the baseplate codebase can automatically infer and determine the necessary import map providers for certain templates, making explicit specification of importMapProviders unnecessary in those cases.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.unit.test.ts : Unit tests use `.unit.test.ts` suffix
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{unit,int}.test.ts : Unit tests use `.unit.test.ts` suffix, integration tests use `.int.test.ts`
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/tests.mdc:0-0
Timestamp: 2025-06-30T11:52:28.745Z
Learning: Applies to **/*.unit.test.{ts,tsx} : Unit tests are colocated with source files using `.unit.test.ts` suffix
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/tests.mdc:0-0
Timestamp: 2025-06-30T11:52:28.745Z
Learning: Applies to **/*.test.{ts,tsx} : For file system operations in tests, use memfs and mock 'node:fs' and 'node:fs/promises' with vi.mock
Learnt from: kingston
PR: halfdomelabs/baseplate#521
File: packages/react-generators/src/generators/admin/admin-crud-edit/admin-crud-edit.generator.ts:90-94
Timestamp: 2025-05-05T06:36:50.687Z
Learning: In this codebase, import paths can include `.ts` extensions, and the `resolveModuleSpecifier` function will handle them appropriately. There's no need to strip file extensions before passing paths to functions like `TsCodeUtils.importFragment`.
🧬 Code Graph Analysis (21)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/services/download-file.ts (1)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/config/categories.config.ts (1)
  • getCategoryByNameOrThrow (17-23)
packages/project-builder-web/src/routes/data/models/edit.$key/service.tsx (1)
packages/project-builder-web/src/routes/data/models/-hooks/use-model-form.ts (1)
  • useModelForm (34-204)
plugins/plugin-auth/src/auth/core/node.ts (1)
plugins/plugin-auth/src/auth/core/generators/auth-apollo/auth-apollo.generator.ts (1)
  • authApolloGenerator (14-59)
packages/project-builder-web/src/routes/data/models/edit.$key/index.tsx (1)
packages/project-builder-web/src/routes/data/models/-hooks/use-model-form.ts (1)
  • useModelForm (34-204)
packages/project-builder-web/src/routes/data/models/edit.$key/graphql.tsx (1)
packages/project-builder-web/src/routes/data/models/-hooks/use-model-form.ts (1)
  • useModelForm (34-204)
plugins/plugin-storage/src/generators/fastify/prisma-file-transformer/prisma-file-transformer.generator.ts (1)
packages/utils/src/string/quot.ts (1)
  • quot (6-8)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/schema/presigned.mutations.ts (1)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/schema/file-category.enum.ts (1)
  • fileCategoryEnumType (7-9)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/schema/public-url.field.ts (1)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/config/adapters.config.ts (2)
  • STORAGE_ADAPTERS (3-3)
  • StorageAdapterKey (5-5)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/schema/file-category.enum.ts (1)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/config/categories.config.ts (1)
  • FILE_CATEGORIES (6-6)
packages/utils/src/json/json-deep-clone.unit.test.ts (1)
packages/utils/src/json/json-deep-clone.ts (1)
  • jsonDeepClone (9-52)
packages/project-builder-web/src/routes/data/models/edit.$key/-components/fields/model-field-form.tsx (1)
packages/project-builder-web/src/routes/data/models/-hooks/use-edited-model-config.tsx (1)
  • useEditedModelConfig (71-84)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/services/create-presigned-download-url.ts (1)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/config/categories.config.ts (1)
  • getCategoryByNameOrThrow (17-23)
packages/project-builder-web/src/routes/data/models/-hooks/use-edited-model-config.tsx (2)
packages/project-builder-lib/src/schema/models/index.ts (2)
  • ModelConfig (316-316)
  • ModelConfigInput (318-318)
packages/utils/src/json/json-deep-clone.ts (1)
  • jsonDeepClone (9-52)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/adapters/url.ts (1)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/types/adapter.ts (1)
  • StorageAdapter (51-167)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/types/file-category.ts (1)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/config/adapters.config.ts (1)
  • StorageAdapterKey (5-5)
packages/project-builder-web/src/routes/data/models/-hooks/use-model-form.ts (6)
packages/project-builder-lib/src/schema/models/index.ts (3)
  • ModelConfigInput (318-318)
  • ModelConfig (316-316)
  • createModelBaseSchema (275-307)
packages/project-builder-lib/src/web/hooks/use-project-definition.ts (1)
  • useProjectDefinition (80-88)
packages/project-builder-lib/src/schema/models/types.ts (1)
  • modelEntityType (3-3)
packages/project-builder-lib/src/definition/model/model-utils.ts (1)
  • ModelUtils (89-99)
packages/project-builder-lib/src/web/hooks/use-definition-schema.ts (1)
  • useDefinitionSchema (7-15)
packages/project-builder-web/src/hooks/use-definition-schema.ts (1)
  • useDefinitionSchema (9-17)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/config/categories.config.ts (1)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/types/file-category.ts (1)
  • FileCategory (12-54)
packages/project-builder-web/src/routes/data/models/-components/new-model-dialog.tsx (5)
packages/project-builder-lib/src/schema/models/index.ts (2)
  • ModelConfigInput (318-318)
  • createModelBaseSchema (275-307)
packages/project-builder-lib/src/schema/models/types.ts (2)
  • modelScalarFieldEntityType (5-10)
  • modelEntityType (3-3)
packages/ui-components/src/hooks/index.ts (1)
  • useControlledState (2-2)
packages/project-builder-lib/src/web/hooks/use-project-definition.ts (1)
  • useProjectDefinition (80-88)
packages/project-builder-lib/src/definition/feature/feature-utils.ts (1)
  • FeatureUtils (109-121)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/services/upload-file.ts (1)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/validate-file-upload-options.ts (2)
  • FileUploadOptions (55-55)
  • validateFileUploadOptions (125-188)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/services/create-presigned-upload-url.ts (2)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/validate-file-upload-options.ts (2)
  • FileUploadOptions (55-55)
  • validateFileUploadOptions (125-188)
packages/fastify-generators/src/generators/core/error-handler-service/templates/src/utils/http-errors.ts (1)
  • BadRequestError (14-22)
plugins/plugin-storage/src/generators/fastify/storage-module/storage-module.generator.ts (10)
packages/fastify-generators/src/writers/pothos/options.ts (1)
  • createPothosTypeReference (24-37)
packages/sync/src/generators/generators.ts (1)
  • createGeneratorTask (196-204)
packages/fastify-generators/src/generators/core/app-module/app-module.generator.ts (1)
  • appModuleProvider (43-44)
packages/fastify-generators/src/generators/pothos/pothos/pothos.generator.ts (1)
  • pothosSchemaProvider (66-67)
packages/fastify-generators/src/generators/pothos/_providers/pothos-type-output.ts (1)
  • pothosTypeOutputProvider (18-19)
packages/core-generators/src/renderers/typescript/utils/ts-code-utils.ts (3)
  • template (444-465)
  • TsCodeUtils (85-580)
  • tsTemplate (583-583)
packages/core-generators/src/renderers/typescript/fragments/creators.ts (1)
  • tsCodeFragment (73-83)
packages/core-generators/src/renderers/typescript/imports/builder.ts (1)
  • tsTypeImportBuilder (89-96)
packages/core-generators/src/renderers/typescript/fragments/types.ts (1)
  • TsCodeFragment (55-72)
packages/utils/src/string/quot.ts (1)
  • quot (6-8)
🪛 Biome (1.9.4)
packages/tools/tsconfig.vite.lib.json

[error] 7-7: JSON standard does not allow comments.

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

🪛 ESLint
plugins/plugin-auth/src/auth/core/generators/auth-apollo/templates/session-error-link.ts

[error] 1-1: Do not use "@ts-nocheck" because it alters compilation errors.

(@typescript-eslint/ban-ts-comment)


[error] 4-4: 'sessionErrorLink' is assigned a value but never used. Allowed unused vars must match /^_/u.

(unused-imports/no-unused-vars)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Test E2E
  • GitHub Check: Socket Security: Pull Request Alerts
🔇 Additional comments (95)
plugins/plugin-auth/src/auth0/generators/react/react-auth0/react-auth0.generator.ts (1)

26-26: Import now includes .js extension – fully ESM-compliant
Adding the explicit index.js satisfies the “include file extensions” rule for Node 16 module resolution and keeps tooling happy. 👍

packages/core-generators/src/generators/node/eslint/react-rules.ts (1)

53-62: LGTM! Proper filename casing exceptions for routing and Tanstack files.

The rule configuration correctly adds ignore patterns for special filename prefixes while maintaining kebab-case enforcement for regular files. The regex patterns are properly escaped using String.raw.

.changeset/short-vans-judge.md (1)

1-7: LGTM! Changeset properly documents the configuration changes.

The patch-level versioning is appropriate for ESLint rule adjustments, and the description accurately reflects the addition of filename casing exceptions.

packages/tools/eslint-configs/typescript.js (1)

223-225: LGTM! Disabling problematic text-encoding-identifier-case rule.

The rule is correctly disabled with proper justification referencing the WHATWG specification and the linked GitHub issue about unexpected autofix behavior.

packages/core-generators/src/generators/node/eslint/templates/eslint.config.js (1)

174-176: LGTM! Consistent rule configuration across templates.

The rule disable is correctly applied in the template with the same rationale as other ESLint configurations, ensuring consistency for generated projects.

packages/tools/eslint-configs/react.js (1)

66-66: LGTM! Consistent filename casing exceptions for Tanstack files.

The ignore pattern for $ prefixed files is correctly added alongside the existing - prefix pattern. The regex properly matches Tanstack camelCase files while maintaining kebab-case enforcement for regular files.

Also applies to: 73-76

plugins/plugin-storage/package.json (1)

55-57: es-toolkit is required at runtime by plugin-storage—keep it in dependencies

The generator code in plugins/plugin-storage imports from es-toolkit, which runs when the plugin is executed (e.g. via the CLI). Moving it to devDependencies would break consumers, since devDependencies aren’t installed for end-users.

• plugins/plugin-storage/src/generators/fastify/storage-module/storage-module.generator.ts:27
import { constantCase } from 'es-toolkit';

Likely an incorrect or invalid review comment.

plugins/plugin-auth/src/auth/core/generators/auth-routes/auth-routes.generator.ts (1)

5-5: Runtime check for generated/index.js in dev/watch mode

  • No imports from ./generated without a .js suffix were found under
    plugins/plugin-auth/src/auth/core/generators.
  • Please confirm that, during local development (e.g. via tsx or ts-node),
    requests for generated/index.js correctly resolve to the TypeScript source
    (either by transpiling ahead of execution or via your loader’s .js.ts mapping),
    to avoid a 404 at runtime.
plugins/plugin-auth/src/auth/core/generators/auth-apollo/index.ts (1)

1-1: LGTM: Correct barrel export implementation.

The barrel export follows the coding guidelines perfectly, using the required .js extension for TypeScript imports and the preferred export * pattern for index files.

plugins/plugin-auth/src/auth/core/generators/index.ts (1)

1-1: LGTM: Consistent integration of new generator.

The new auth-apollo export follows the established pattern and correctly uses the .js extension as required by the coding guidelines.

plugins/plugin-auth/src/auth/core/generators/auth-routes/templates/routes/auth_/register.tsx (1)

62-62: Good UX improvement with form validation.

Adding reValidateMode: 'onBlur' improves user experience by reducing validation noise while typing and providing feedback when users move between fields.

plugins/plugin-auth/src/auth/core/generators/auth-routes/templates/routes/auth_/login.tsx (1)

63-63: Consistent UX improvement across auth forms.

Adding reValidateMode: 'onBlur' here maintains consistency with the register form and provides the same UX benefits.

plugins/plugin-auth/src/auth/core/node.ts (3)

22-22: Correct import with proper file extension.

The import statement correctly uses the .js extension as required by the Node 16 module resolution guidelines.


69-69: Proper integration of Apollo generator.

The authApolloGenerator is correctly added to sharedWebGenerators, ensuring it's available for both web and admin app compilation. Based on the generator implementation, this adds valuable session-aware error handling to Apollo clients.


1-95: Flag potential inconsistency with PR objectives.

This file and all other files in this review are related to the auth plugin, but the PR objectives indicate this is about "Refactor storage plugin file category system to use registry-based pattern". Please verify if the PR summary is accurate or if these auth plugin changes are part of a larger refactor.

Likely an incorrect or invalid review comment.

plugins/plugin-auth/src/auth/core/generators/auth-apollo/templates/session-error-link.ts (1)

1-1: Remove @ts-nocheck and add proper TypeScript imports.

The @ts-nocheck directive violates the coding guidelines requiring strict TypeScript checking. This template file is missing essential imports that would cause compilation errors when the code is extracted.

Apply this diff to add proper typing and imports:

-// @ts-nocheck
-
-// SESSION_ERROR_LINK:START
+import { onError } from '@apollo/client/link/error';
+import type { ServerError } from '@apollo/client/link/http';
+
+// SESSION_ERROR_LINK:START

Note: The userSessionClient will need to be available in the context where this template is used.

⛔ Skipped due to learnings
Learnt from: kingston
PR: halfdomelabs/baseplate#592
File: plugins/plugin-auth/src/auth0/generators/react/auth0-hooks/templates/src/hooks/use-required-user-id.ts:1-2
Timestamp: 2025-07-07T18:24:17.522Z
Learning: Files under templates/** directories can use `// @ts-nocheck` because they are templates meant for code generation, not direct type checking.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : TypeScript with strict type checking
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Include tests for error conditions and edge cases
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use TypeScript with strict type checking enabled
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Specify explicit return types on all functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Always use `.js` extensions in imports, even for TypeScript files
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Use console.info/warn/error instead of console.log
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
plugins/plugin-auth/src/auth/core/generators/auth-apollo/auth-apollo.generator.ts (2)

1-11: LGTM - Import organization follows guidelines.

The imports are properly organized with external libraries first, then local imports with .js extensions as required by the coding guidelines.


14-59: Generator registration and template path verified

Both checks passed successfully:

  • authApolloGenerator is imported and registered in plugins/plugin-auth/src/auth/core/node.ts.
  • The template file exists at plugins/plugin-auth/src/auth/core/generators/auth-apollo/templates/session-error-link.ts.

No further action required.

packages/project-builder-web/src/routes/data/models/edit.$key/service.tsx (2)

38-38: Consistent with the refactoring pattern.

The change from defaultValues to originalModel aligns with the broader refactor mentioned in the AI summary, where the context provider now receives the complete original model instead of processed form values.


48-48: Prop update correctly reflects the variable rename.

The prop name change from initialModel to originalModel is consistent with the destructuring change and maintains the same data flow.

.changeset/plenty-mails-refuse.md (1)

1-6: Changeset correctly documents the new utility function.

The changeset properly categorizes this as a patch change and provides a clear description of the new JSON deep clone functionality.

packages/project-builder-web/src/routes/data/models/edit.$key/graphql.tsx (2)

22-22: Consistent with the established refactoring pattern.

The destructuring change mirrors the pattern used in other route files, maintaining consistency across the model editing interface.


33-33: Prop update maintains consistency with variable renaming.

The prop name change correctly reflects the destructuring update and ensures consistent data flow to the context provider.

packages/project-builder-web/src/routes/data/models/edit.$key/index.tsx (2)

37-37: Completes the consistent refactoring across all route files.

This change maintains the same pattern applied to service.tsx and graphql.tsx, ensuring uniform behavior across all model editing routes.


52-52: Final prop update completes the refactoring pattern.

The prop name change correctly aligns with the destructuring update and ensures all model editing routes use the same interface with the context provider.

packages/utils/src/json/index.ts (1)

1-1: LGTM! Barrel export follows established patterns.

The new export correctly uses the .js extension and follows the barrel export pattern preferred for index files.

packages/project-builder-web/src/routes/data/models/edit.$key/-components/fields/model-field-form.tsx (1)

51-56: Good optimization: More granular data selection reduces re-renders.

Breaking down the model selector into specific field selectors (primaryKeyFieldRefs and uniqueConstraints) improves performance by preventing unnecessary re-renders when unrelated model fields change.

packages/utils/src/json/json-deep-clone.unit.test.ts (1)

1-188: Excellent test coverage with proper structure and organization.

The test suite comprehensively covers all supported types, edge cases, and error conditions. Tests properly verify both value equality and reference inequality for cloned objects, ensuring deep cloning behavior is correct.

packages/project-builder-web/src/routes/data/models/-hooks/use-edited-model-config.tsx (1)

25-69: Clean refactor: Simplified dependencies and improved immutability handling.

The changes effectively simplify the component by:

  1. Removing external dependencies on ModelUtils and useProjectDefinition
  2. Using the passed originalModel directly instead of fetching
  3. Properly handling React Hook Form's mutable data with jsonDeepClone to prevent state mutation issues

The explanatory comment on line 58 is helpful for future maintainers.

packages/project-builder-web/src/routes/data/models/-components/new-model-dialog.tsx (3)

89-142: Well-implemented form submission logic!

The submission handler properly validates uniqueness, manages features, and maintains sorted model lists. Good error handling and navigation flow.


41-41: Add explicit return type to function

According to the coding guidelines, all functions must have explicit return types.

Apply this diff:

-function createNewModel(): ModelConfigInput {
+function createNewModel(): ModelConfigInput {

Wait, I see it already has the return type. Let me re-check... Yes, the function already has the correct return type ModelConfigInput.


1-1: Add .js extensions to project-builder-lib imports; verify others

We should update the two imports from @baseplate-dev/project-builder-lib to point at their exported .js entrypoints. For the remaining dependencies (@hookform/resolvers, @tanstack/react-router, es-toolkit), please confirm their package exports support .js extensions before applying the same change.

• File: packages/project-builder-web/src/routes/data/models/-components/new-model-dialog.tsx
Lines: 1–14

Apply this diff:

-import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib';
+import type { ModelConfigInput } from '@baseplate-dev/project-builder-lib/index.js';

-import {
-  createModelBaseSchema,
-  FeatureUtils,
-  modelEntityType,
-  modelScalarFieldEntityType,
-} from '@baseplate-dev/project-builder-lib';
+import {
+  createModelBaseSchema,
+  FeatureUtils,
+  modelEntityType,
+  modelScalarFieldEntityType,
+} from '@baseplate-dev/project-builder-lib/index.js';

-import {
-  useBlockBeforeContinue,
-  useDefinitionSchema,
-  useProjectDefinition,
-} from '@baseplate-dev/project-builder-lib/web';
+import {
+  useBlockBeforeContinue,
+  useDefinitionSchema,
+  useProjectDefinition,
+} from '@baseplate-dev/project-builder-lib/web/index.js';

Next steps:

  • ✅ Confirm that @baseplate-dev/project-builder-lib exports ./dist/index.js and ./dist/web/index.js (already verified).
  • 🔍 Manually inspect or script-verify the main/exports fields of the other packages to ensure their entrypoints end in .js (e.g. @hookform/resolvers/zod/index.js, @tanstack/react-router/index.js, es-toolkit/index.js).
packages/ui-components/src/components/combobox/combobox.test.tsx (1)

4-4: LGTM! Import consistency improvement.

The change from default to named import for userEvent aligns with modern ES6 module practices and improves import explicitness.

packages/ui-components/src/components/calendar/calendar.tsx (1)

12-12: LGTM! Follows module resolution guidelines.

Adding the .js extension aligns with the coding guidelines for Node 16 module resolution and TypeScript best practices.

packages/react-generators/src/generators/core/react-components/templates/src/components/circular-progress/circular-progress.tsx (2)

11-11: LGTM! Interface enhancement follows existing patterns.

Adding the 'xs' size option extends the component's flexibility while maintaining consistency with existing size options.


30-33: LGTM! Size configuration is logically consistent.

The 'xs' size configuration with size-8 container and text-xs follows the logical progression of existing size options and provides appropriate scaling for smaller progress indicators.

plugins/plugin-storage/src/storage/transformers/components/file-transformer-form.tsx (1)

10-10: LGTM! Import path follows module resolution guidelines.

Adding the .js extension to the import path aligns with the coding guidelines for explicit file extensions in TypeScript imports.

packages/ui-components/.storybook/preview.tsx (1)

13-13: LGTM! Import path follows module resolution guidelines.

Adding the .js extension to the import path aligns with the coding guidelines for explicit file extensions and Node 16 module resolution requirements.

plugins/plugin-storage/src/generators/react/upload-components/templates/src/components/file-input/upload.gql (1)

3-4: LGTM! Field renaming aligns with storage plugin refactoring.

The renaming from name to filename and hostedUrl to publicUrl is consistent with the broader refactoring to improve naming clarity and standardization across the storage plugin.

plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/schema/file-category.enum.ts (1)

7-9: LGTM! Proper enum type definition using builder pattern.

The implementation correctly creates a GraphQL enum type by mapping FILE_CATEGORIES values to their names, enforcing type safety for file categories in the schema.

plugins/plugin-storage/src/generators/fastify/prisma-file-transformer/prisma-file-transformer.generator.ts (1)

67-74: LGTM! Consistent function renaming aligns with validation service refactoring.

The rename from validateFileUploadInput to validateFileInput maintains the same functionality while improving naming clarity as part of the broader storage module refactoring.

plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/schema/file-input.input-type.ts (1)

5-6: LGTM! Improved naming and added helpful description.

The rename from FileUploadInput to FileInput provides better clarity, and the added description enhances schema documentation for API consumers.

plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/schema/public-url.field.ts (2)

5-7: LGTM! Import reorganization follows new config structure.

The updated imports correctly reference the new adapter configuration location, improving code organization.


9-22: LGTM! Comprehensive renaming improves API clarity.

The systematic renaming from hostedUrl to publicUrl, path to storagePath, and getHostedUrl to getPublicUrl enhances naming consistency and clarity across the storage adapter API while maintaining the same functionality and error handling.

plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/schema/presigned.mutations.ts (1)

7-7: LGTM! Enum type and field naming improvements enhance type safety.

The changes properly introduce the fileCategoryEnumType for the category field and align field names with the new conventions (filename, size). These improvements provide better type safety and consistency across the storage module.

Also applies to: 23-26

plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/services/download-file.ts (1)

9-11: Well-structured refactor with improved error handling and authorization.

The changes correctly implement the new category registry pattern and enhance the authorization flow:

  • Using getCategoryByNameOrThrow eliminates redundant error handling
  • System role bypass provides appropriate service account access
  • The new authorize?.presignedRead pattern aligns with the separated permission model
  • storagePath property usage matches the updated schema

Also applies to: 12-17, 29-34, 46-46

plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/services/create-presigned-download-url.ts (1)

7-8: Good implementation of the new category registry pattern.

The changes correctly adopt the new configuration-based imports and category lookup mechanism, with proper usage of storagePath.

Also applies to: 26-26, 48-48

plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/create-file-category.ts (3)

6-10: Helpful utilities for file size calculations.

The FileSize helper provides excellent readability improvements over raw byte calculations.


25-29: Robust validation for category naming convention.

The CONSTANT_CASE validation ensures consistent naming across all file categories, which is crucial for the registry-based pattern.


22-36: Add explicit return type per coding guidelines.

The function logic and validation are solid. However, per the coding guidelines, all functions should have explicit return types.

-export function createFileCategory<TName extends string>(
-  config: FileCategory<TName>,
-): FileCategory<TName> {
+export function createFileCategory<TName extends string>(
+  config: FileCategory<TName>,
+): FileCategory<TName> {

Wait, the return type is already specified. Let me re-read... Yes, the return type : FileCategory<TName> is already there. This is correct.

plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/services/upload-file.ts (2)

5-7: Clean refactor with improved parameter separation.

The function signature improvement with separate contents and options parameters provides better API clarity. The JSDoc documentation is helpful.

Also applies to: 9-15, 16-24


28-28: uploadFile is guaranteed by the StorageAdapter interface
The StorageAdapter definition in plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/types/adapter.ts declares uploadFile(...) as a required method (no ? suffix). You can safely call adapter.uploadFile(...) without an existence check.

plugins/plugin-storage/src/generators/react/upload-components/templates/src/components/file-input/file-input.tsx (6)

3-3: LGTM: Type safety improvement with FileCategory import.

The import of FileCategory type enhances type safety for the category prop.


21-25: LGTM: Property renaming aligns with broader refactor.

The renaming of name to filename and hostedUrl to publicUrl is consistent with the storage plugin refactor.


34-34: LGTM: Enhanced type safety with FileCategory type.

Using the imported FileCategory type instead of string provides better type safety and validation.


66-73: LGTM: GraphQL mutation parameters updated correctly.

The mutation parameters are correctly updated to match the new schema:

  • fileNamefilename
  • fileSizesize
  • Content type fallback updated to 'application/octet-stream'

89-92: LGTM: Response handling updated for new property names.

The file handling correctly uses the new property names filename and publicUrl.


208-208: LGTM: CircularProgress size updated correctly.

The size change from "sm" to "xs" is consistent with the CircularProgress component updates.

plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/config/categories.config.ts (4)

6-6: LGTM: Clean registry pattern implementation.

The readonly array export with template variable integration is well-designed for the registry-based approach.


9-9: LGTM: Type-safe category name extraction.

The type alias correctly extracts category names from the registry for type safety.


12-14: LGTM: Clean optional lookup function.

The getCategoryByName function provides a clean optional lookup with proper return typing.


17-23: LGTM: Good error handling in mandatory lookup.

The getCategoryByNameOrThrow function provides appropriate error handling for mandatory lookups with descriptive error messages.

plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/adapters/url.ts (6)

3-6: LGTM: Appropriate imports for enhanced functionality.

The addition of Readable stream type and axios import supports the new streaming download capability.


11-13: LGTM: Updated documentation reflects actual usage.

The comment correctly describes the adapter's purpose and limitations.


15-16: LGTM: Explicit rejection of unsupported upload operation.

Clear error message indicating the adapter doesn't support file uploads.


17-23: LGTM: Proper streaming download implementation.

The axios-based streaming download implementation is correct and follows best practices for handling external URLs.


24-31: LGTM: Clear rejection of unsupported operations.

Both fileExists and getFileMetadata appropriately reject with descriptive error messages.


32-33: LGTM: Correct implementation of URL-based methods.

Both getPublicUrl and createPresignedDownloadUrl correctly return the path as the URL, which is appropriate for this adapter type.

plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/types/file-category.ts (7)

3-6: LGTM: Appropriate imports for interface dependencies.

The imports correctly bring in ServiceContext, File model, and StorageAdapterKey types needed for the interface.


12-14: LGTM: Well-designed generic interface with clear constraints.

The generic type parameter with string constraint and readonly name property provides good type safety.


16-23: LGTM: Clear path prefix configuration.

The optional pathPrefix with detailed documentation explains the behavior clearly.


25-32: LGTM: Comprehensive file size constraints.

Both maximum and optional minimum file size constraints provide good flexibility for validation.


34-35: LGTM: Type-safe adapter specification.

Using StorageAdapterKey ensures only valid adapters can be specified.


37-48: LGTM: Well-designed authorization pattern.

The separation of upload and presigned read authorization functions provides fine-grained access control with clear documentation about default behavior.


50-54: LGTM: Clear relation specification.

The referencedByRelation property correctly constrains to valid model relation keys.

plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/services/validate-file-input.ts (9)

3-10: LGTM: Appropriate imports for validation service.

The imports correctly bring in required types for DataPipeOutput, ServiceContext, error handling, and file category.


12-14: LGTM: Clean interface definition.

The FileUploadInput interface is simple and focused, containing only the required id field.


24-33: LGTM: Efficient early return for unchanged IDs.

The optimization to skip validation when the file ID hasn't changed is a good performance improvement.


35-42: LGTM: Clear file existence validation.

The database lookup and error handling for non-existent files is appropriate with a descriptive error message.


44-52: LGTM: Proper authorization checks.

The authorization logic correctly handles both system users and file uploaders with clear security boundaries and descriptive error messages.


54-59: LGTM: Good reference status validation.

Preventing reuse of already referenced files is a good business rule with clear error messaging.


61-66: LGTM: Category validation ensures type safety.

The category matching validation prevents misuse of files and provides clear error messaging about expected vs actual categories.


68-74: LGTM: Upload completion verification via adapter.

Using the storage adapter to verify file metadata ensures the file was actually uploaded successfully, which is a good safety check.


76-89: LGTM: Well-designed return with post-operations.

The DataPipeOutput return pattern with post-operation updates to mark the file as referenced and update size is well-designed for the data pipeline pattern.

.changeset/dull-words-fold.md (1)

1-34: LGTM! Comprehensive changeset documentation.

The changeset properly follows the standard format and provides excellent documentation of the architectural changes, including breaking changes and migration guidance.

plugins/plugin-storage/src/storage/core/schema/models.ts (2)

9-73: LGTM! Well-organized schema improvements.

The field reorganization with logical grouping and semantic renamings (e.g., namefilename) significantly improves clarity. The addition of optional fields like encoding and status tracking fields enhances the model's capabilities.


108-111: GraphQL field exposure is consistent.

The GraphQL object type correctly exposes filename instead of the old name field, maintaining consistency with the schema changes.

plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/mime.ts (1)

37-61: Enhanced validation logic looks good.

The improved validation with stricter MIME type checking, better error messages, and extension validation enhances robustness.

plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/types/adapter.ts (1)

1-167: Excellent adapter interface design.

This comprehensive StorageAdapter interface provides a solid foundation with:

  • Well-documented methods with JSDoc and usage examples
  • Proper use of optional methods for adapter-specific features
  • Comprehensive type definitions for all operations
  • Good error handling guidance

The interface design promotes consistency across adapter implementations while allowing flexibility for different storage backends.

plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/validate-file-upload-options.ts (1)

22-22: Fix inconsistent variable naming.

The constant name uses inconsistent casing. It should follow the UPPER_SNAKE_CASE convention for constants.

-const MAX_filename_LENGTH = 128;
+const MAX_FILENAME_LENGTH = 128;
⛔ Skipped due to learnings
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Use camelCase for variables/functions, PascalCase for types/classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Use descriptive test names that explain what is being tested
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use PascalCase for types and classes
plugins/plugin-storage/src/generators/fastify/storage-module/storage-module.generator.ts (1)

277-293: LGTM! Well-structured file category creation.

The implementation correctly uses the new createFileCategory pattern with proper name transformation and conditional authorization setup.

plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/adapters/s3.ts (3)

46-77: Excellent enhancement to presigned upload URL generation.

The implementation includes important improvements:

  • Flexible options with sensible defaults
  • Prevention of overwrites with 'If-None-Match' header
  • Proper expiration time handling

109-144: Well-designed batch deletion with detailed results.

The implementation properly handles partial failures and provides detailed feedback about which operations succeeded or failed, which is much better than the all-or-nothing approach.


146-190: Robust implementation of file existence and metadata retrieval.

Both methods properly handle the 404 case and provide consistent error handling. The metadata normalization in getFileMetadata ensures consistent output regardless of S3's response format.

plugins/plugin-storage/src/generators/fastify/storage-module/extractor.json (1)

1-290: Skip review - configuration looks correct.

Comment on lines 4 to 15
const sessionErrorLink = onError(({ networkError }) => {
const serverError = networkError as ServerError | undefined;
if (
typeof serverError === 'object' &&
serverError.statusCode === 401 &&
typeof serverError.result === 'object' &&
serverError.result.code === 'invalid-session'
) {
userSessionClient.signOut();
}
return;
});
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Add explicit return type for the error link.

According to the coding guidelines, all functions require explicit return types. The error link should specify its return type for better type safety.

Apply this diff to add the return type:

-const sessionErrorLink = onError(({ networkError }) => {
+const sessionErrorLink = onError(({ networkError }): void => {
   const serverError = networkError as ServerError | undefined;
   if (
     typeof serverError === 'object' &&
     serverError.statusCode === 401 &&
     typeof serverError.result === 'object' &&
     serverError.result.code === 'invalid-session'
   ) {
     userSessionClient.signOut();
   }
   return;
 });
📝 Committable suggestion

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

Suggested change
const sessionErrorLink = onError(({ networkError }) => {
const serverError = networkError as ServerError | undefined;
if (
typeof serverError === 'object' &&
serverError.statusCode === 401 &&
typeof serverError.result === 'object' &&
serverError.result.code === 'invalid-session'
) {
userSessionClient.signOut();
}
return;
});
const sessionErrorLink = onError(({ networkError }): void => {
const serverError = networkError as ServerError | undefined;
if (
typeof serverError === 'object' &&
serverError.statusCode === 401 &&
typeof serverError.result === 'object' &&
serverError.result.code === 'invalid-session'
) {
userSessionClient.signOut();
}
return;
});
🧰 Tools
🪛 ESLint

[error] 4-4: 'sessionErrorLink' is assigned a value but never used. Allowed unused vars must match /^_/u.

(unused-imports/no-unused-vars)

🤖 Prompt for AI Agents
In
plugins/plugin-auth/src/auth/core/generators/auth-apollo/templates/session-error-link.ts
between lines 4 and 15, the sessionErrorLink function lacks an explicit return
type. To fix this, add the appropriate return type annotation to the
sessionErrorLink constant declaration to ensure type safety and comply with
coding guidelines.

Comment on lines 38 to 54
build: async (builder) => {
const linkTemplate = await builder.readTemplate(
'session-error-link.ts',
);
const sessionErrorLink = TsCodeUtils.extractTemplateSnippet(
linkTemplate,
'SESSION_ERROR_LINK',
);

reactApolloConfig.apolloLinks.add({
name: 'sessionErrorLink',
bodyFragment: tsCodeFragment(sessionErrorLink, [
tsImportBuilder(['onError']).from('@apollo/client/link/error'),
]),
priority: 'error',
});
},
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Add explicit return type for the async build function.

The build function is not a one-liner arrow function and should have an explicit return type according to the coding guidelines.

Apply this diff to add the return type:

-          build: async (builder) => {
+          build: async (builder): Promise<void> => {
🤖 Prompt for AI Agents
In
plugins/plugin-auth/src/auth/core/generators/auth-apollo/auth-apollo.generator.ts
between lines 38 and 54, the async build function lacks an explicit return type.
To fix this, add an explicit return type annotation to the build function
signature, specifying the appropriate Promise return type based on what the
function returns or resolves to, following the project's coding guidelines.

Comment on lines 24 to 32
run({ reactApolloConfig, reactSession }) {
reactApolloConfig.createApolloClientArguments.add({
name: 'userSessionClient',
type: reactSession.UserSessionClient.typeFragment(),
reactRenderBody: tsCodeFragment(
'const { client: userSessionClient } = useUserSessionClient();',
reactSession.useUserSessionClient.declaration(),
),
});
Copy link

@coderabbitai coderabbitai bot Jul 12, 2025

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Add explicit return type for the run function.

According to the coding guidelines, all functions (excluding one-liner arrow functions) require explicit return types. The run function spans multiple lines and should specify its return type.

Apply this diff to add the return type:

-      run({ reactApolloConfig, reactSession }) {
+      run({ reactApolloConfig, reactSession }): {
+        providers: { authApollo: {} };
+        build: (builder: any) => Promise<void>;
+      } {
📝 Committable suggestion

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

Suggested change
run({ reactApolloConfig, reactSession }) {
reactApolloConfig.createApolloClientArguments.add({
name: 'userSessionClient',
type: reactSession.UserSessionClient.typeFragment(),
reactRenderBody: tsCodeFragment(
'const { client: userSessionClient } = useUserSessionClient();',
reactSession.useUserSessionClient.declaration(),
),
});
run({ reactApolloConfig, reactSession }): {
providers: { authApollo: {} };
build: (builder: any) => Promise<void>;
} {
reactApolloConfig.createApolloClientArguments.add({
name: 'userSessionClient',
type: reactSession.UserSessionClient.typeFragment(),
reactRenderBody: tsCodeFragment(
'const { client: userSessionClient } = useUserSessionClient();',
reactSession.useUserSessionClient.declaration(),
),
});
🤖 Prompt for AI Agents
In
plugins/plugin-auth/src/auth/core/generators/auth-apollo/auth-apollo.generator.ts
around lines 24 to 32, the run function lacks an explicit return type as
required by coding guidelines. Add the appropriate explicit return type to the
run function signature to comply with the standards. Determine the correct
return type based on the function's implementation or context and specify it
explicitly before the function body.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

No need for explicit return types here as it's inferred. Arrow functions in this case do not need explicit return types. No need to check for it general though since there's an ESLint rule for that.

Copy link

Choose a reason for hiding this comment

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

@kingston, understood! You're absolutely right that the return type can be inferred here and ESLint rules should handle the enforcement of explicit return types where actually needed. I appreciate the clarification on when explicit return types are necessary versus when type inference is sufficient.


✏️ Learnings added
Learnt from: kingston
PR: halfdomelabs/baseplate#606
File: plugins/plugin-auth/src/auth/core/generators/auth-apollo/auth-apollo.generator.ts:24-32
Timestamp: 2025-07-12T19:56:08.518Z
Learning: For generator functions and configuration object methods like those in createGeneratorTask, inferred return types are acceptable when the structure is clear from the implementation. ESLint rules handle enforcement of explicit return types where truly needed, so manual review for this is not necessary.

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.


🧠 Learnings used
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components

Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable

Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : All functions (excluding one-liner arrow functions) require explicit return types

Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Specify explicit return types on all functions

Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Always include return types on top-level functions including React components (`React.ReactElement`)

Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : TypeScript with strict type checking

Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns

Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Prefer using nullish coalescing operator (`??`) instead of logical or (`||`)

Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Prefer functional programming patterns

Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions

Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Use camelCase for variables/functions, PascalCase for types/classes

Comment on lines +9 to +52
export function jsonDeepClone<T>(value: T): T {
if (
value === undefined ||
value === null ||
typeof value === 'boolean' ||
typeof value === 'string'
) {
return value;
}

if (typeof value === 'number') {
return value;
}

if (typeof value === 'object') {
if (value instanceof Date || value instanceof RegExp) {
throw new TypeError(
`Cannot clone value of unsupported type: ${value.constructor.name}`,
);
}

if (Array.isArray(value)) {
// Clone array elements
const copy: unknown[] = [];
for (const [i, element] of value.entries()) {
copy[i] = jsonDeepClone(element);
}
return copy as T;
}

// Clone plain object properties
const copy: Record<string, unknown> = {};
for (const key in value) {
if (Object.prototype.hasOwnProperty.call(value, key)) {
const prop = (value as Record<string, unknown>)[key];
copy[key] = jsonDeepClone(prop);
}
}
return copy as T;
}

// Reject functions, symbols, BigInt, etc.
throw new Error(`Cannot clone value of unsupported type: ${typeof value}`);
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Address circular references and consider special number values.

The implementation is solid for JSON-serializable data, but there are two potential issues:

  1. Circular references: The function will cause a stack overflow if the input contains circular references. Consider adding a WeakSet to track visited objects.

  2. Special number values: While NaN and Infinity are handled implicitly, they serialize to null in JSON. Consider explicit handling if this behavior is unexpected.

Here's an improved implementation that handles circular references:

+/**
+ * Recursively deep clones JSON-compatible values.
+ * Throws if the value is not JSON-serializable.
+ *
+ * @param value - The value to clone
+ * @param visited - Internal parameter to track circular references
+ * @returns A deep-cloned copy of the value
+ * @throws Error if a non-JSON value is encountered or circular reference detected
+ */
-export function jsonDeepClone<T>(value: T): T {
+export function jsonDeepClone<T>(value: T, visited = new WeakSet()): T {
   if (
     value === undefined ||
     value === null ||
     typeof value === 'boolean' ||
     typeof value === 'string'
   ) {
     return value;
   }

   if (typeof value === 'number') {
+    if (!Number.isFinite(value)) {
+      throw new Error(`Cannot clone non-finite number: ${value}`);
+    }
     return value;
   }

   if (typeof value === 'object') {
+    if (visited.has(value)) {
+      throw new Error('Cannot clone value with circular reference');
+    }
+    visited.add(value);
+
     if (value instanceof Date || value instanceof RegExp) {
       throw new TypeError(
         `Cannot clone value of unsupported type: ${value.constructor.name}`,
       );
     }

     if (Array.isArray(value)) {
       // Clone array elements
       const copy: unknown[] = [];
       for (const [i, element] of value.entries()) {
-        copy[i] = jsonDeepClone(element);
+        copy[i] = jsonDeepClone(element, visited);
       }
       return copy as T;
     }

     // Clone plain object properties
     const copy: Record<string, unknown> = {};
     for (const key in value) {
       if (Object.prototype.hasOwnProperty.call(value, key)) {
         const prop = (value as Record<string, unknown>)[key];
-        copy[key] = jsonDeepClone(prop);
+        copy[key] = jsonDeepClone(prop, visited);
       }
     }
     return copy as T;
   }

   // Reject functions, symbols, BigInt, etc.
   throw new Error(`Cannot clone value of unsupported type: ${typeof value}`);
 }
📝 Committable suggestion

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

Suggested change
export function jsonDeepClone<T>(value: T): T {
if (
value === undefined ||
value === null ||
typeof value === 'boolean' ||
typeof value === 'string'
) {
return value;
}
if (typeof value === 'number') {
return value;
}
if (typeof value === 'object') {
if (value instanceof Date || value instanceof RegExp) {
throw new TypeError(
`Cannot clone value of unsupported type: ${value.constructor.name}`,
);
}
if (Array.isArray(value)) {
// Clone array elements
const copy: unknown[] = [];
for (const [i, element] of value.entries()) {
copy[i] = jsonDeepClone(element);
}
return copy as T;
}
// Clone plain object properties
const copy: Record<string, unknown> = {};
for (const key in value) {
if (Object.prototype.hasOwnProperty.call(value, key)) {
const prop = (value as Record<string, unknown>)[key];
copy[key] = jsonDeepClone(prop);
}
}
return copy as T;
}
// Reject functions, symbols, BigInt, etc.
throw new Error(`Cannot clone value of unsupported type: ${typeof value}`);
}
/**
* Recursively deep clones JSON-compatible values.
* Throws if the value is not JSON-serializable.
*
* @param value - The value to clone
* @param visited - Internal parameter to track circular references
* @returns A deep-cloned copy of the value
* @throws Error if a non-JSON value is encountered or circular reference detected
*/
export function jsonDeepClone<T>(value: T, visited = new WeakSet()): T {
if (
value === undefined ||
value === null ||
typeof value === 'boolean' ||
typeof value === 'string'
) {
return value;
}
if (typeof value === 'number') {
if (!Number.isFinite(value)) {
throw new Error(`Cannot clone non-finite number: ${value}`);
}
return value;
}
if (typeof value === 'object') {
if (visited.has(value)) {
throw new Error('Cannot clone value with circular reference');
}
visited.add(value);
if (value instanceof Date || value instanceof RegExp) {
throw new TypeError(
`Cannot clone value of unsupported type: ${value.constructor.name}`,
);
}
if (Array.isArray(value)) {
// Clone array elements
const copy: unknown[] = [];
for (const [i, element] of value.entries()) {
copy[i] = jsonDeepClone(element, visited);
}
return copy as T;
}
// Clone plain object properties
const copy: Record<string, unknown> = {};
for (const key in value) {
if (Object.prototype.hasOwnProperty.call(value, key)) {
const prop = (value as Record<string, unknown>)[key];
copy[key] = jsonDeepClone(prop, visited);
}
}
return copy as T;
}
// Reject functions, symbols, BigInt, etc.
throw new Error(`Cannot clone value of unsupported type: ${typeof value}`);
}
🤖 Prompt for AI Agents
In packages/utils/src/json/json-deep-clone.ts between lines 9 and 52, the
current jsonDeepClone function does not handle circular references, which can
cause a stack overflow, and it does not explicitly handle special number values
like NaN and Infinity that JSON converts to null. To fix this, modify the
function to accept a WeakSet parameter to track visited objects and throw an
error if a circular reference is detected. Also, add explicit checks for NaN and
Infinity to handle them appropriately instead of relying on JSON serialization
behavior.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🔭 Outside diff range comments (2)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/mime.ts (1)

1-1: Remove @ts-nocheck and fix any resulting TypeScript errors.

The @ts-nocheck comment disables TypeScript checking entirely, which conflicts with the coding guidelines that require "TypeScript with strict type checking enabled" for plugin files.

Remove this directive and address any TypeScript errors that surface:

-// @ts-nocheck
plugins/plugin-storage/src/storage/transformers/web.ts (1)

21-25: Add explicit return type to function

Per the coding guidelines, all top-level functions require explicit return types.

-function findNonTransformedFileRelations(
-  definition: ProjectDefinition,
-  modelConfig: ModelConfigInput,
-  pluginId: string,
-): string[] {
+function findNonTransformedFileRelations(
+  definition: ProjectDefinition,
+  modelConfig: ModelConfigInput,
+  pluginId: string,
+): string[] {
🧹 Nitpick comments (5)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/mime.ts (1)

37-47: Enhance MIME type validation with more specific error handling.

Consider improving the validation to provide more helpful error messages and handle edge cases better.

  if (!mimeType || typeof mimeType !== 'string') {
-   throw new Error(
-     `Invalid mime type: ${mimeType}. Must be a valid MIME type string.`,
-   );
+   throw new InvalidMimeTypeError(
+     `Invalid mime type: ${mimeType}. Must be a valid MIME type string.`,
+     [],
+   );
  }

  if (!(mimeType in mime.extensions)) {
-   throw new Error(
-     `Unsupported mime type: ${mimeType}. Please use a supported file type.`,
-   );
+   throw new InvalidMimeTypeError(
+     `Unsupported mime type: ${mimeType}. Please use a supported file type.`,
+     [],
+   );
  }
packages/project-builder-lib/src/plugins/migrations/run-migrations.ts (1)

31-34: Verify migration implementations handle the project definition parameter safely.

The addition of the draft parameter enables migrations to access the entire project definition. While this provides powerful capabilities for cross-plugin migrations, ensure that migration implementations carefully handle this parameter to avoid unintended modifications to unrelated parts of the project.

Consider documenting best practices for migration authors on how to safely interact with the project definition parameter.

plugins/plugin-storage/src/storage/transformers/web.ts (1)

90-97: Consider making default category values configurable

The hardcoded defaults (20MB file size, 'user' role) might not suit all use cases. Consider:

  • Making these configurable through plugin settings
  • Or deriving them from the storage plugin configuration

Would you like me to suggest an approach for making these defaults configurable?

plugins/plugin-storage/src/storage/core/generators/file-categories/file-categories.generator.ts (2)

107-107: Address TODO comment for validation and MIME types.

The TODO indicates that validation should be implemented and allowed MIME types should be added to the file category configuration.

Would you like me to help implement the validation logic and add MIME type support to the file category creation, or open a new issue to track this task?


104-122: Consider extracting authorization logic for better readability.

While the implementation is correct, extracting the authorization object construction into a helper function would improve readability and maintainability.

+              const authorizationConfig = category.authorize.uploadRoles.length > 0
+                ? tsTemplate`{
+                    upload: ({ auth }) => auth.hasSomeRole(${TsCodeUtils.mergeFragmentsAsArrayPresorted(
+                      category.authorize.uploadRoles.map(quot).sort(),
+                    )})
+                  }`
+                : undefined;
+
               fileCategoryFragments.set(
                 category.name,
                 tsTemplate`
               export const ${getFileCategoryExportName(category.name)} = ${storageModuleImports.createFileCategory.fragment()}(${TsCodeUtils.mergeFragmentsAsObject(
                 {
                   // TODO [2025-07-13]: Remove once validation kicks in and add allowed Mime Types
                   name: quot(constantCase(category.name)),
                   maxFileSize: tsTemplate`${storageModuleImports.FileSize.fragment()}.MB(${category.maxFileSizeMb.toString()})`,
-                  authorize:
-                    category.authorize.uploadRoles.length > 0
-                      ? tsTemplate`{
-                        upload: ({ auth }) => auth.hasSomeRole(${TsCodeUtils.mergeFragmentsAsArrayPresorted(
-                          category.authorize.uploadRoles.map(quot).sort(),
-                        )})
-                      }`
-                      : undefined,
+                  authorize: authorizationConfig,
                   adapter: quot(category.adapter),
                   referencedByRelation: quot(category.referencedByRelation),
                 },
               )})`,
               );
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b260567 and 65776ad.

📒 Files selected for processing (22)
  • packages/project-builder-lib/src/plugins/migrations/run-migrations.ts (1 hunks)
  • packages/project-builder-lib/src/plugins/spec/config-spec.ts (1 hunks)
  • packages/project-builder-web/src/routes/data/models/-components/new-model-dialog.tsx (3 hunks)
  • packages/tools/tsconfig.vite.lib.json (1 hunks)
  • plugins/plugin-storage/src/generators/fastify/prisma-file-transformer/prisma-file-transformer.generator.ts (2 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/extractor.json (7 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/storage-module.generator.ts (6 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/mime.ts (1 hunks)
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/validate-file-upload-options.ts (1 hunks)
  • plugins/plugin-storage/src/storage/admin-crud/admin-crud-input-form.tsx (2 hunks)
  • plugins/plugin-storage/src/storage/admin-crud/node.ts (3 hunks)
  • plugins/plugin-storage/src/storage/core/components/category-editor-form.tsx (0 hunks)
  • plugins/plugin-storage/src/storage/core/components/storage-config.tsx (0 hunks)
  • plugins/plugin-storage/src/storage/core/generators/file-categories/file-categories.generator.ts (1 hunks)
  • plugins/plugin-storage/src/storage/core/node.ts (2 hunks)
  • plugins/plugin-storage/src/storage/core/schema/migrations.ts (2 hunks)
  • plugins/plugin-storage/src/storage/core/schema/plugin-definition.ts (0 hunks)
  • plugins/plugin-storage/src/storage/transformers/common.ts (1 hunks)
  • plugins/plugin-storage/src/storage/transformers/components/file-transformer-form.tsx (3 hunks)
  • plugins/plugin-storage/src/storage/transformers/node.ts (3 hunks)
  • plugins/plugin-storage/src/storage/transformers/schema/file-transformer.schema.ts (3 hunks)
  • plugins/plugin-storage/src/storage/transformers/web.ts (4 hunks)
💤 Files with no reviewable changes (3)
  • plugins/plugin-storage/src/storage/core/components/storage-config.tsx
  • plugins/plugin-storage/src/storage/core/schema/plugin-definition.ts
  • plugins/plugin-storage/src/storage/core/components/category-editor-form.tsx
✅ Files skipped from review due to trivial changes (1)
  • plugins/plugin-storage/src/storage/transformers/common.ts
🚧 Files skipped from review as they are similar to previous changes (4)
  • packages/tools/tsconfig.vite.lib.json
  • plugins/plugin-storage/src/generators/fastify/prisma-file-transformer/prisma-file-transformer.generator.ts
  • packages/project-builder-web/src/routes/data/models/-components/new-model-dialog.tsx
  • plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/validate-file-upload-options.ts
🧰 Additional context used
📓 Path-based instructions (6)
**/*.{ts,tsx}

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • CLAUDE.md
**/*

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • CLAUDE.md
{packages,plugins}/**/*.{ts,tsx}

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • .cursor/rules/code-style.mdc
**/*.tsx

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • CLAUDE.md
plugins/*/**/*.tsx

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • CLAUDE.md
plugins/plugin-*/**/*.tsx

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • plugins/CLAUDE.md
🧠 Learnings (13)
packages/project-builder-lib/src/plugins/spec/config-spec.ts (6)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : All functions (excluding one-liner arrow functions) require explicit return types
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use PascalCase for types and classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
plugins/plugin-storage/src/storage/admin-crud/admin-crud-input-form.tsx (8)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use PascalCase for types and classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : TypeScript with strict type checking
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
plugins/plugin-storage/src/storage/core/node.ts (10)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
Learnt from: kingston
PR: halfdomelabs/baseplate#428
File: packages/project-builder-server/src/sync/index.ts:5-5
Timestamp: 2025-01-23T09:12:46.178Z
Learning: Avoid importing directly from 'dist' directories. Instead, expose functionality through the package's public API and import from the main package entry point.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Sort imports by group: external libs first, then local imports
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use PascalCase for types and classes
Learnt from: kingston
PR: halfdomelabs/baseplate#521
File: plugins/baseplate-plugin-storage/src/generators/react/upload-components/upload-components.generator.ts:108-112
Timestamp: 2025-05-05T06:37:43.106Z
Learning: The template extractor in the baseplate codebase can automatically infer and determine the necessary import map providers for certain templates, making explicit specification of importMapProviders unnecessary in those cases.
plugins/plugin-storage/src/storage/transformers/components/file-transformer-form.tsx (8)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use PascalCase for types and classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
plugins/plugin-storage/src/storage/transformers/schema/file-transformer.schema.ts (1)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
plugins/plugin-storage/src/storage/admin-crud/node.ts (5)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
plugins/plugin-storage/src/storage/core/schema/migrations.ts (6)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use PascalCase for types and classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
plugins/plugin-storage/src/storage/transformers/node.ts (8)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping in tsconfig.json. Removing baseUrl and using explicit relative paths with "./" prefix (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/mime.ts (5)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.unit.test.ts : Unit tests use `.unit.test.ts` suffix
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use PascalCase for types and classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: plugins/CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:58.487Z
Learning: Applies to plugins/plugin-*/**/*.tsx : All CSS classes used in `className` attributes within plugin components MUST be prefixed with the plugin name to avoid style conflicts.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
plugins/plugin-storage/src/storage/core/generators/file-categories/file-categories.generator.ts (5)
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
Learnt from: kingston
PR: halfdomelabs/baseplate#521
File: packages/react-generators/src/generators/admin/admin-crud-edit/admin-crud-edit.generator.ts:90-94
Timestamp: 2025-05-05T06:36:50.687Z
Learning: In this codebase, import paths can include `.ts` extensions, and the `resolveModuleSpecifier` function will handle them appropriately. There's no need to strip file extensions before passing paths to functions like `TsCodeUtils.importFragment`.
Learnt from: kingston
PR: halfdomelabs/baseplate#592
File: plugins/plugin-auth/src/auth0/generators/react/auth0-hooks/templates/src/hooks/use-required-user-id.ts:1-2
Timestamp: 2025-07-07T18:24:17.522Z
Learning: Files under templates/** directories can use `// @ts-nocheck` because they are templates meant for code generation, not direct type checking.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
plugins/plugin-storage/src/generators/fastify/storage-module/storage-module.generator.ts (14)
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: kingston
PR: halfdomelabs/baseplate#539
File: scripts/check-changesets.ts:10-13
Timestamp: 2025-05-08T12:56:59.222Z
Learning: Node.js 20.12.0 and above include `globSync` in the core `node:fs` module, so `import { promises as fs, globSync } from 'node:fs';` is valid syntax in projects using these Node.js versions.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: kingston
PR: halfdomelabs/baseplate#428
File: packages/project-builder-server/src/sync/index.ts:5-5
Timestamp: 2025-01-23T09:12:46.178Z
Learning: Avoid importing directly from 'dist' directories. Instead, expose functionality through the package's public API and import from the main package entry point.
Learnt from: kingston
PR: halfdomelabs/baseplate#539
File: scripts/check-changesets.ts:10-13
Timestamp: 2025-05-08T12:56:59.222Z
Learning: Node.js 22.0.0 and later versions include both `glob` and `globSync` functionality in the core `node:fs` module, making `import { promises as fs, globSync } from 'node:fs';` valid syntax.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use PascalCase for types and classes
Learnt from: kingston
PR: halfdomelabs/baseplate#592
File: plugins/plugin-auth/src/auth0/generators/react/auth0-hooks/templates/src/hooks/use-required-user-id.ts:1-2
Timestamp: 2025-07-07T18:24:17.522Z
Learning: Files under templates/** directories can use `// @ts-nocheck` because they are templates meant for code generation, not direct type checking.
Learnt from: kingston
PR: halfdomelabs/baseplate#521
File: packages/react-generators/src/generators/admin/admin-crud-edit/admin-crud-edit.generator.ts:90-94
Timestamp: 2025-05-05T06:36:50.687Z
Learning: In this codebase, import paths can include `.ts` extensions, and the `resolveModuleSpecifier` function will handle them appropriately. There's no need to strip file extensions before passing paths to functions like `TsCodeUtils.importFragment`.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
plugins/plugin-storage/src/storage/transformers/web.ts (12)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use PascalCase for types and classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Use camelCase for variables/functions, PascalCase for types/classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use TypeScript with strict type checking enabled
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : TypeScript with strict type checking
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.unit.test.ts : Unit tests use `.unit.test.ts` suffix
plugins/plugin-storage/src/generators/fastify/storage-module/extractor.json (22)
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: kingston
PR: halfdomelabs/baseplate#521
File: packages/react-generators/src/generators/admin/admin-crud-list/admin-crud-list.generator.ts:163-166
Timestamp: 2025-05-05T06:37:51.001Z
Learning: For certain templates in the codebase, the `importMapProviders` property is not explicitly required as the template extractor will automatically determine and infer the necessary import map providers.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: kingston
PR: halfdomelabs/baseplate#592
File: plugins/plugin-auth/src/auth0/generators/react/auth0-hooks/templates/src/hooks/use-required-user-id.ts:1-2
Timestamp: 2025-07-07T18:24:17.522Z
Learning: Files under templates/** directories can use `// @ts-nocheck` because they are templates meant for code generation, not direct type checking.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use PascalCase for types and classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping in tsconfig.json. Removing baseUrl and using explicit relative paths with "./" prefix (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: kingston
PR: halfdomelabs/baseplate#505
File: packages/create-project/tsconfig.json:6-6
Timestamp: 2025-04-21T06:32:22.476Z
Learning: Since TypeScript 4.1, baseUrl is not required for paths mapping when using explicit relative paths (with "./"). Removing baseUrl from tsconfig.json while updating paths to use relative paths (e.g., changing "@src/*": ["src/*"] to "@src/*": ["./src/*"]) prevents bare path imports from node_modules while maintaining path alias functionality.
Learnt from: kingston
PR: halfdomelabs/baseplate#562
File: plugins/plugin-auth/package.json:32-36
Timestamp: 2025-06-03T09:11:29.651Z
Learning: With TypeScript project references, TypeScript compilation is watched from the root level using "watch:tsc:root" script, so individual packages no longer need to include their "tsc:watch" scripts in their local "watch" commands. The local "tsc:watch" scripts are renamed from "watch:tsc" but are not meant to be run as part of the package's watch command since TypeScript watching is handled centrally at the workspace root.
Learnt from: kingston
PR: halfdomelabs/baseplate#521
File: plugins/baseplate-plugin-storage/src/generators/react/upload-components/upload-components.generator.ts:108-112
Timestamp: 2025-05-05T06:37:43.106Z
Learning: The template extractor in the baseplate codebase can automatically infer and determine the necessary import map providers for certain templates, making explicit specification of importMapProviders unnecessary in those cases.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.unit.test.ts : Unit tests use `.unit.test.ts` suffix
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{unit,int}.test.ts : Unit tests use `.unit.test.ts` suffix, integration tests use `.int.test.ts`
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/tests.mdc:0-0
Timestamp: 2025-06-30T11:52:28.745Z
Learning: Applies to **/*.unit.test.{ts,tsx} : Unit tests are colocated with source files using `.unit.test.ts` suffix
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/tests.mdc:0-0
Timestamp: 2025-06-30T11:52:28.745Z
Learning: Applies to **/*.test.{ts,tsx} : For file system operations in tests, use memfs and mock 'node:fs' and 'node:fs/promises' with vi.mock
Learnt from: kingston
PR: halfdomelabs/baseplate#521
File: packages/react-generators/src/generators/admin/admin-crud-edit/admin-crud-edit.generator.ts:90-94
Timestamp: 2025-05-05T06:36:50.687Z
Learning: In this codebase, import paths can include `.ts` extensions, and the `resolveModuleSpecifier` function will handle them appropriately. There's no need to strip file extensions before passing paths to functions like `TsCodeUtils.importFragment`.
🧬 Code Graph Analysis (7)
plugins/plugin-storage/src/storage/admin-crud/admin-crud-input-form.tsx (1)
plugins/plugin-storage/src/storage/transformers/schema/file-transformer.schema.ts (1)
  • FileTransformerDefinition (55-57)
plugins/plugin-storage/src/storage/transformers/components/file-transformer-form.tsx (3)
plugins/plugin-storage/src/storage/transformers/schema/file-transformer.schema.ts (1)
  • FileTransformerDefinition (55-57)
packages/project-builder-lib/src/web/hooks/use-project-definition.ts (1)
  • useProjectDefinition (80-88)
packages/project-builder-lib/src/plugins/spec/auth-config-spec.ts (1)
  • authConfigSpec (26-29)
plugins/plugin-storage/src/storage/transformers/schema/file-transformer.schema.ts (4)
packages/utils/src/validators/case-validators.ts (1)
  • CASE_VALIDATORS (23-48)
packages/project-builder-lib/src/schema/auth/index.ts (1)
  • authRoleEntityType (3-3)
plugins/plugin-storage/src/storage/core/schema/plugin-definition.ts (1)
  • storageAdapterEntityType (12-14)
packages/project-builder-lib/src/schema/creator/infer-types.ts (1)
  • InferInput (7-9)
plugins/plugin-storage/src/storage/admin-crud/node.ts (3)
packages/project-builder-lib/src/compiler/admin-crud-input-spec.ts (1)
  • AdminCrudInputCompiler (12-25)
plugins/plugin-storage/src/storage/admin-crud/types.ts (1)
  • AdminCrudFileInputConfig (21-23)
plugins/plugin-storage/src/storage/transformers/schema/file-transformer.schema.ts (1)
  • FileTransformerDefinition (55-57)
plugins/plugin-storage/src/storage/core/schema/migrations.ts (1)
packages/project-builder-lib/src/schema/models/types.ts (1)
  • modelTransformerEntityType (27-30)
plugins/plugin-storage/src/storage/transformers/node.ts (1)
plugins/plugin-storage/src/storage/transformers/schema/file-transformer.schema.ts (1)
  • FileTransformerDefinition (55-57)
plugins/plugin-storage/src/storage/transformers/web.ts (4)
plugins/plugin-storage/src/storage/transformers/schema/file-transformer.schema.ts (1)
  • FileTransformerDefinition (55-57)
packages/project-builder-lib/src/definition/plugins/plugin-utils.ts (1)
  • PluginUtils (75-80)
plugins/plugin-storage/src/storage/core/schema/plugin-definition.ts (1)
  • StoragePluginDefinition (47-49)
packages/project-builder-lib/src/schema/models/types.ts (1)
  • modelTransformerEntityType (27-30)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Socket Security: Pull Request Alerts
🔇 Additional comments (26)
plugins/plugin-storage/src/generators/fastify/storage-module/templates/module/utils/mime.ts (5)

6-8: LGTM: Content type parsing is correctly implemented.

The function properly extracts the MIME type from content-type headers by splitting on semicolon and trimming whitespace, which correctly handles cases like "text/html; charset=UTF-8".


10-21: LGTM: Robust encoding extraction with proper validation.

The implementation correctly:

  • Uses regex to extract charset parameter from content-type headers
  • Validates the charset against Node.js supported encodings using Buffer.isEncoding
  • Provides a sensible fallback to 'utf-8' for unsupported charsets

23-31: LGTM: Error class is now correctly named.

The error class name and the this.name property are now consistent, resolving the previous naming mismatch issue. The class properly extends Error and includes useful context via expectedFileExtensions.


52-54: LGTM: File extension validation is appropriately strict.

The validation correctly ensures files have extensions, which is essential for proper MIME type matching and file handling.


57-60: LGTM: Comprehensive error messaging for extension mismatches.

The error provides clear, actionable feedback by listing all valid extensions for the given MIME type, making it easy for developers to understand what went wrong.

plugins/plugin-storage/src/storage/admin-crud/admin-crud-input-form.tsx (1)

7-7: Type migration looks good!

The update from FileTransformerConfig to FileTransformerDefinition correctly aligns with the new transformer schema structure.

Also applies to: 17-17

packages/project-builder-lib/src/plugins/spec/config-spec.ts (1)

10-19: Well-documented API change with appropriate TODO.

The JSDoc clearly explains the new migration API and parameters. The TODO appropriately highlights the need for a safer mutation pattern in the future.

plugins/plugin-storage/src/storage/core/node.ts (1)

50-96: Excellent refactor to dynamic file category generation!

This change significantly improves the architecture by:

  • Eliminating duplicate configuration between categories and transformers
  • Dynamically deriving categories from transformer definitions
  • Properly grouping by feature for better organization
  • Including validation for missing relations

The implementation correctly handles the extraction and transformation of data.

plugins/plugin-storage/src/storage/transformers/components/file-transformer-form.tsx (2)

4-14: Well-structured form setup with proper type safety.

The imports are correctly organized and the form control typing aligns with the new FileTransformerDefinition schema. The dynamic retrieval of auth roles and storage adapters provides good user experience.

Also applies to: 27-31, 48-62


74-121: Excellent UI implementation for file category configuration!

The form section is well-organized with:

  • Clear visual hierarchy and grouping
  • Helpful descriptions and placeholders
  • Proper Tailwind class prefixing with storage:
  • Responsive grid layout
  • Correct use of ShadCN UI components
plugins/plugin-storage/src/storage/transformers/schema/file-transformer.schema.ts (1)

25-40: Well-structured category schema with proper validation

The category object properly encapsulates all file category metadata with appropriate validation:

  • CONSTANT_CASE for category names ensures consistency
  • Entity references with RESTRICT delete policy prevent orphaned data
  • Authorization roles are properly typed
plugins/plugin-storage/src/storage/admin-crud/node.ts (2)

17-52: Clean refactor removing plugin configuration dependency

The simplified approach of accessing category directly from the transformer definition is cleaner and aligns well with the registry-based pattern. The type assertion and error handling remain robust.


14-14: Add explicit return type to function

Per the coding guidelines, all functions (excluding one-liner arrow functions) require explicit return types.

-function buildFileTransformerCompiler(): AdminCrudInputCompiler<AdminCrudFileInputConfig> {
+function buildFileTransformerCompiler(): AdminCrudInputCompiler<AdminCrudFileInputConfig> {
⛔ Skipped due to learnings
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Specify explicit return types on all functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : All functions (excluding one-liner arrow functions) require explicit return types
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Always include return types on top-level functions including React components (`React.ReactElement`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : TypeScript with strict type checking
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use TypeScript with strict type checking enabled
Learnt from: kingston
PR: halfdomelabs/baseplate#592
File: plugins/plugin-auth/src/auth0/generators/react/auth0-hooks/templates/src/hooks/use-required-user-id.ts:1-2
Timestamp: 2025-07-07T18:24:17.522Z
Learning: Files under templates/** directories can use `// @ts-nocheck` because they are templates meant for code generation, not direct type checking.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
plugins/plugin-storage/src/storage/transformers/node.ts (2)

15-33: Excellent simplification with proper feature isolation

The direct destructuring of category and addition of featureId properly isolates file transformers by feature, supporting the modular architecture.


12-12: Add explicit return type to function

Per the coding guidelines, all functions require explicit return types.

-function buildFileTransformerCompiler(): ModelTransformerCompiler<FileTransformerDefinition> {
+function buildFileTransformerCompiler(): ModelTransformerCompiler<FileTransformerDefinition> {
⛔ Skipped due to learnings
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Specify explicit return types on all functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : All functions (excluding one-liner arrow functions) require explicit return types
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Always include return types on top-level functions including React components (`React.ReactElement`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : TypeScript with strict type checking
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: kingston
PR: halfdomelabs/baseplate#592
File: plugins/plugin-auth/src/auth0/generators/react/auth0-hooks/templates/src/hooks/use-required-user-id.ts:1-2
Timestamp: 2025-07-07T18:24:17.522Z
Learning: Files under templates/** directories can use `// @ts-nocheck` because they are templates meant for code generation, not direct type checking.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use TypeScript with strict type checking enabled
plugins/plugin-storage/src/storage/core/schema/migrations.ts (1)

26-148: Well-designed migration with comprehensive error handling

The migration properly:

  • Handles both existing and new transformers
  • Converts category names to CONSTANT_CASE for consistency
  • Maintains data integrity with proper error messages
  • Uses typed interfaces for safety

The logic correctly maps old category structure to the new transformer-embedded format.

plugins/plugin-storage/src/storage/transformers/web.ts (1)

75-81: Good defensive programming with relation validation

The added validation ensures the relation exists before using it, preventing runtime errors.

plugins/plugin-storage/src/storage/core/generators/file-categories/file-categories.generator.ts (3)

1-38: Imports and schema definition look good!

The imports correctly use .js extensions following Node 16 module resolution, and the schema properly validates file category structure with appropriate constraints.


80-88: Add explicit return type to nested function.

The getFileCategoryImportFragment function should have an explicit return type.

-        function getFileCategoryImportFragment(name: string): TsCodeFragment {
+        function getFileCategoryImportFragment(name: string): TsCodeFragment {

Note: The function already has the correct return type, so no change is needed here.


47-49: Add explicit return type to function.

According to the coding guidelines, all functions (excluding one-liner arrow functions) require explicit return types.

-function getFileCategoryExportName(name: string) {
+function getFileCategoryExportName(name: string): string {
   return `${camelCase(name)}FileCategory`;
 }
⛔ Skipped due to learnings
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Specify explicit return types on all functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : All functions (excluding one-liner arrow functions) require explicit return types
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Always include return types on top-level functions including React components (`React.ReactElement`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Use camelCase for variables/functions, PascalCase for types/classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.test.ts : Use descriptive test names that explain what is being tested
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : TypeScript with strict type checking
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use PascalCase for types and classes
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
plugins/plugin-storage/src/generators/fastify/storage-module/storage-module.generator.ts (3)

57-72: Config provider setup looks good!

The new registry-based pattern using createConfigProviderTask with a Map for file categories aligns well with the PR's modularization objectives.


247-249: Correct implementation of publicUrl rename.

The change from hostedUrl to publicUrl is properly implemented and aligns with the adapter interface updates mentioned in the PR summary.


279-286: Proper implementation of registry-based file categories.

The code correctly retrieves file categories from the config provider and passes them as an array of fragments, implementing the new modular pattern effectively.

plugins/plugin-storage/src/generators/fastify/storage-module/extractor.json (3)

24-49: Well-structured config templates for registry pattern.

The new config-adapters and config-categories templates provide excellent type-safe exports including lookup functions (getCategoryByName, getCategoryByNameOrThrow) that support the new registry-based file category system.


50-109: Schema updates properly implement enum-based categories.

The changes from string-based to enum-based file categories (renaming to file-category.enum.ts) and addition of the public-url field enhance type safety and align with the GraphQL schema improvements mentioned in the PR.


182-287: Service and utility reorganization improves modularity.

The updates to service templates (especially validate-file-input) and the separation of types from utilities demonstrate good architectural practices, supporting the new validation patterns and authorization model.

modelLocalRelationEntityType,
modelTransformerEntityType,
} from '@baseplate-dev/project-builder-lib';
import { CASE_VALIDATORS } from '@baseplate-dev/utils';
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Add .js extension to import statement

Per the coding guidelines, always use .js extensions in imports, even for TypeScript files.

-import { CASE_VALIDATORS } from '@baseplate-dev/utils';
+import { CASE_VALIDATORS } from '@baseplate-dev/utils/index.js';
📝 Committable suggestion

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

Suggested change
import { CASE_VALIDATORS } from '@baseplate-dev/utils';
-import { CASE_VALIDATORS } from '@baseplate-dev/utils';
+import { CASE_VALIDATORS } from '@baseplate-dev/utils/index.js';
🤖 Prompt for AI Agents
In
plugins/plugin-storage/src/storage/transformers/schema/file-transformer.schema.ts
at line 11, the import statement for CASE_VALIDATORS is missing the required .js
extension. Update the import path to include the .js extension as per coding
guidelines, changing it to '@baseplate-dev/utils.js'.

import type { PluginConfigMigration } from '@baseplate-dev/project-builder-lib';

import { modelTransformerEntityType } from '@baseplate-dev/project-builder-lib';
import { constantCase } from 'es-toolkit';
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Add .js extension to import statement

Per the coding guidelines, always include .js extensions in imports.

-import { constantCase } from 'es-toolkit';
+import { constantCase } from 'es-toolkit/index.js';
📝 Committable suggestion

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

Suggested change
import { constantCase } from 'es-toolkit';
-import { constantCase } from 'es-toolkit';
+import { constantCase } from 'es-toolkit/index.js';
🤖 Prompt for AI Agents
In plugins/plugin-storage/src/storage/core/schema/migrations.ts at line 4, the
import statement for 'es-toolkit' is missing the '.js' extension. Update the
import to include the '.js' extension as 'es-toolkit.js' to comply with the
coding guidelines requiring explicit file extensions in import statements.

PluginUtils,
} from '@baseplate-dev/project-builder-lib';
import { modelTransformerWebSpec } from '@baseplate-dev/project-builder-lib/web';
import { constantCase } from 'es-toolkit';
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Add .js extension to import statement

Per the coding guidelines, always include .js extensions in imports.

-import { constantCase } from 'es-toolkit';
+import { constantCase } from 'es-toolkit/index.js';
📝 Committable suggestion

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

Suggested change
import { constantCase } from 'es-toolkit';
-import { constantCase } from 'es-toolkit';
+import { constantCase } from 'es-toolkit/index.js';
🤖 Prompt for AI Agents
In plugins/plugin-storage/src/storage/transformers/web.ts at line 12, the import
statement for 'es-toolkit' is missing the required '.js' extension. Update the
import to include the '.js' extension at the end of the module path to comply
with the coding guidelines.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🔭 Outside diff range comments (1)
plugins/plugin-storage/src/storage/core/components/storage-definition-editor.tsx (1)

39-43: Add explicit return type to the function.

According to the coding guidelines, all functions including React components should have explicit return types.

 export function StorageDefinitionEditor({
   definition: pluginMetadata,
   metadata,
   onSave,
-}: WebConfigProps): React.JSX.Element {
+}: WebConfigProps): React.ReactElement {
🧹 Nitpick comments (2)
plugins/plugin-storage/src/storage/core/components/adapter-dialog.tsx (1)

56-59: Remove unnecessary type assertion.

The type assertion is redundant since data from the form already has the correct type inferred from AdapterFormData.

   const onSubmit = handleSubmit((data) => {
-    onSave(data as StoragePluginDefinitionInput['s3Adapters'][0]);
+    onSave(data);
     onOpenChange?.(false);
   });
plugins/plugin-storage/src/storage/core/components/adapter-editor-form.tsx (1)

130-134: Simplify the isNew calculation.

The current logic is redundant - it checks if the adapter exists in the array when adapterToEdit is already set from that array.

           isNew={
-            adapterToEdit
-              ? !adapters.some((a) => a.id === adapterToEdit.id)
-              : true
+            !adapterToEdit || !adapters.some((a) => a.id === adapterToEdit.id)
           }
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 65776ad and 7ca3d37.

📒 Files selected for processing (5)
  • plugins/plugin-storage/package.json (1 hunks)
  • plugins/plugin-storage/src/storage/core/components/adapter-dialog.tsx (1 hunks)
  • plugins/plugin-storage/src/storage/core/components/adapter-editor-form.tsx (1 hunks)
  • plugins/plugin-storage/src/storage/core/components/storage-definition-editor.tsx (5 hunks)
  • plugins/plugin-storage/src/storage/core/web.ts (2 hunks)
✅ Files skipped from review due to trivial changes (1)
  • plugins/plugin-storage/src/storage/core/web.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • plugins/plugin-storage/package.json
🧰 Additional context used
📓 Path-based instructions (6)
**/*.{ts,tsx}

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • CLAUDE.md
**/*

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • CLAUDE.md
**/*.tsx

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • CLAUDE.md
plugins/*/**/*.tsx

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • CLAUDE.md
{packages,plugins}/**/*.{ts,tsx}

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • .cursor/rules/code-style.mdc
plugins/plugin-*/**/*.tsx

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • plugins/CLAUDE.md
🧠 Learnings (4)
📓 Common learnings
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
plugins/plugin-storage/src/storage/core/components/storage-definition-editor.tsx (4)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
plugins/plugin-storage/src/storage/core/components/adapter-dialog.tsx (4)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
plugins/plugin-storage/src/storage/core/components/adapter-editor-form.tsx (4)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
🧬 Code Graph Analysis (1)
plugins/plugin-storage/src/storage/core/components/adapter-dialog.tsx (2)
plugins/plugin-storage/src/storage/core/schema/plugin-definition.ts (1)
  • StoragePluginDefinitionInput (51-53)
packages/ui-components/src/components/button/button.tsx (1)
  • Button (51-51)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Lint
  • GitHub Check: test
  • GitHub Check: Test E2E
🔇 Additional comments (3)
plugins/plugin-storage/src/storage/core/components/adapter-dialog.tsx (1)

40-48: Add explicit return type to the function.

According to the coding guidelines, all functions should have explicit return types.

 export function AdapterDialog({
   open,
   onOpenChange,
   adapter,
   isNew = false,
   onSave,
   asChild,
   children,
-}: AdapterDialogProps): React.JSX.Element {
+}: AdapterDialogProps): React.ReactElement {
⛔ Skipped due to learnings
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Always include return types on top-level functions including React components (`React.ReactElement`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Specify explicit return types on all functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : All functions (excluding one-liner arrow functions) require explicit return types
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.tsx : Use ShadCN-based components from `@baseplate-dev/ui-components` instead of creating custom ones
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : TypeScript with strict type checking
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Prefer functional programming patterns
plugins/plugin-storage/src/storage/core/components/storage-definition-editor.tsx (1)

128-178: Well-structured UI with proper class prefixing.

The refactored UI structure using SectionList components provides better semantic organization, and all Tailwind classes are correctly prefixed with storage: as required.

plugins/plugin-storage/src/storage/core/components/adapter-editor-form.tsx (1)

42-53: Add explicit return type to the function.

According to the coding guidelines, all functions (excluding one-liner arrow functions) should have explicit return types.

   function handleSaveAdapter(
     newAdapter: StoragePluginDefinitionInput['s3Adapters'][0],
-  ): void {
+  ): void {

Wait, it already has : void. Let me re-check... Yes, it does have the return type. My mistake.

control: Control<StoragePluginDefinitionInput>;
}

function AdapterEditorForm({ className, control }: Props): React.JSX.Element {
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Add explicit return type to the function.

According to the coding guidelines, all functions should have explicit return types.

-function AdapterEditorForm({ className, control }: Props): React.JSX.Element {
+function AdapterEditorForm({ className, control }: Props): React.ReactElement {
📝 Committable suggestion

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

Suggested change
function AdapterEditorForm({ className, control }: Props): React.JSX.Element {
-function AdapterEditorForm({ className, control }: Props): React.JSX.Element {
+function AdapterEditorForm({ className, control }: Props): React.ReactElement {
🤖 Prompt for AI Agents
In plugins/plugin-storage/src/storage/core/components/adapter-editor-form.tsx at
line 29, the AdapterEditorForm function lacks an explicit return type. Add the
explicit return type React.JSX.Element to the function signature to comply with
coding guidelines requiring all functions to have explicit return types.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9e6211d and 2764d7b.

📒 Files selected for processing (6)
  • plugins/plugin-storage/src/index.ts (1 hunks)
  • plugins/plugin-storage/src/storage/core/generators/file-categories/file-categories.generator.ts (1 hunks)
  • plugins/plugin-storage/src/storage/core/generators/file-categories/index.ts (1 hunks)
  • plugins/plugin-storage/src/storage/core/generators/index.ts (1 hunks)
  • plugins/plugin-storage/src/storage/core/index.ts (1 hunks)
  • plugins/plugin-storage/src/storage/index.ts (1 hunks)
✅ Files skipped from review due to trivial changes (4)
  • plugins/plugin-storage/src/storage/core/index.ts
  • plugins/plugin-storage/src/storage/core/generators/file-categories/index.ts
  • plugins/plugin-storage/src/storage/index.ts
  • plugins/plugin-storage/src/storage/core/generators/index.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • plugins/plugin-storage/src/storage/core/generators/file-categories/file-categories.generator.ts
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{ts,tsx}

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • CLAUDE.md
**/*

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • CLAUDE.md
**/index.{ts,tsx}

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • CLAUDE.md
{packages,plugins}/**/*.{ts,tsx}

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • .cursor/rules/code-style.mdc
🧠 Learnings (2)
📓 Common learnings
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
plugins/plugin-storage/src/index.ts (13)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : If a particular interface or type is not exported, change the file so it is exported
Learnt from: kingston
PR: halfdomelabs/baseplate#428
File: packages/project-builder-server/src/sync/index.ts:5-5
Timestamp: 2025-01-23T09:12:46.178Z
Learning: Avoid importing directly from 'dist' directories. Instead, expose functionality through the package's public API and import from the main package entry point.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/index.{ts,tsx} : Prefer barrel exports e.g. `export * from './foo.js'` instead of individual named exports
Learnt from: kingston
PR: halfdomelabs/baseplate#571
File: packages/core-generators/src/renderers/extractor/plugins/typed-templates-file.ts:102-106
Timestamp: 2025-06-11T18:31:22.247Z
Learning: For `templateExtractorBarrelExportPlugin.addGeneratedBarrelExport`, the generated barrel exports are written into `generated/index.ts`, therefore the `moduleSpecifier` must be specified relative to that file (e.g., `./typed-templates.js`), not the project root.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to plugins/*/**/*.tsx : In plugins, prefix all Tailwind classes with the plugin name (e.g., `auth-`, `storage-`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Extract repeated components into distinct functions or components where applicable
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Node 16 module resolution - include file extensions in imports (`.js`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: CLAUDE.md:0-0
Timestamp: 2025-06-30T11:51:48.395Z
Learning: Applies to **/*.{ts,tsx} : Include absolute paths in import statements via tsconfig paths (`@src/` is the alias for `src/`)
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{ts,tsx} : Use camelCase for variables and functions
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/code-style.mdc:0-0
Timestamp: 2025-06-30T11:52:11.055Z
Learning: Applies to {packages,plugins}/**/*.{unit,int}.test.ts : Always import vitest globals explicitly (describe, it, expect)
Learnt from: kingston
PR: halfdomelabs/baseplate#539
File: scripts/check-changesets.ts:10-13
Timestamp: 2025-05-08T12:56:59.222Z
Learning: Node.js 22.0.0 and later versions include both `glob` and `globSync` functionality in the core `node:fs` module, making `import { promises as fs, globSync } from 'node:fs';` valid syntax.
Learnt from: kingston
PR: halfdomelabs/baseplate#539
File: scripts/check-changesets.ts:10-13
Timestamp: 2025-05-08T12:56:59.222Z
Learning: Node.js 20.12.0 and above include `globSync` in the core `node:fs` module, so `import { promises as fs, globSync } from 'node:fs';` is valid syntax in projects using these Node.js versions.
Learnt from: CR
PR: halfdomelabs/baseplate#0
File: .cursor/rules/ui-rules.mdc:0-0
Timestamp: 2025-06-30T11:52:33.318Z
Learning: Applies to *.{tsx},packages/project-builder-web/**,packages/ui-components/** : We use a rough analog of ShadCN components that can be imported from @baseplate-dev/ui-components
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Test E2E

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants