diff --git a/apps/admin/Dockerfile b/apps/admin/Dockerfile index a9dcf748..ffff74bc 100644 --- a/apps/admin/Dockerfile +++ b/apps/admin/Dockerfile @@ -65,6 +65,10 @@ COPY libs/tailwind-animation libs/tailwind-animation COPY libs/zod-utils libs/zod-utils COPY apps/admin apps/admin +# Synchronise injected workspace packages after copying source code. +# See: docs/decisions/002-workspace-package-injection.md +RUN pnpm install --frozen-lockfile --offline + # Build libs and app. RUN pnpm --filter admin... build @@ -99,4 +103,8 @@ COPY libs/prisma/migrations libs/prisma/migrations COPY libs/prisma/prisma.config.ts libs/prisma/prisma.config.ts COPY libs/prisma/schema.prisma libs/prisma/schema.prisma +# Synchronise injected workspace packages after copying build artifacts. +# See: docs/decisions/002-workspace-package-injection.md +RUN pnpm install --prod --frozen-lockfile --offline + CMD ["pnpm", "--filter", "admin", "start"] diff --git a/apps/show/Dockerfile b/apps/show/Dockerfile index e626f549..4cd53b92 100644 --- a/apps/show/Dockerfile +++ b/apps/show/Dockerfile @@ -36,6 +36,7 @@ COPY libs/core/package.json libs/core/ COPY libs/dev-tools/package.json libs/dev-tools/ COPY libs/file-storage/package.json libs/file-storage/ COPY libs/files-io/package.json libs/files-io/ +COPY libs/password/package.json libs/password/ COPY libs/prisma/package.json libs/prisma/ COPY libs/react-primitives/package.json libs/react-primitives/ COPY libs/search-params-io/package.json libs/search-params-io/ @@ -55,12 +56,17 @@ COPY libs/core libs/core COPY libs/dev-tools libs/dev-tools COPY libs/file-storage libs/file-storage COPY libs/files-io libs/files-io +COPY libs/password libs/password COPY libs/prisma libs/prisma COPY libs/react-primitives libs/react-primitives COPY libs/search-params-io libs/search-params-io COPY libs/zod-utils libs/zod-utils COPY apps/show apps/show +# Synchronise injected workspace packages after copying source code. +# See: docs/decisions/002-workspace-package-injection.md +RUN pnpm install --frozen-lockfile --offline + # Build libs and app. RUN pnpm --filter show... build @@ -95,4 +101,8 @@ COPY libs/prisma/migrations libs/prisma/migrations COPY libs/prisma/prisma.config.ts libs/prisma/prisma.config.ts COPY libs/prisma/schema.prisma libs/prisma/schema.prisma +# Synchronise injected workspace packages after copying build artifacts. +# See: docs/decisions/002-workspace-package-injection.md +RUN pnpm install --prod --frozen-lockfile --offline + CMD ["pnpm", "--filter", "show", "start"] diff --git a/apps/website/Dockerfile b/apps/website/Dockerfile index ccb61f95..1b305f3f 100644 --- a/apps/website/Dockerfile +++ b/apps/website/Dockerfile @@ -34,6 +34,7 @@ FROM base AS packages-json COPY package.json ./ COPY libs/core/package.json libs/core/ COPY libs/dev-tools/package.json libs/dev-tools/ +COPY libs/password/package.json libs/password/ COPY libs/prisma/package.json libs/prisma/ COPY libs/search-params-io/package.json libs/search-params-io/ COPY libs/zod-utils/package.json libs/zod-utils/ @@ -50,11 +51,16 @@ RUN pnpm install --frozen-lockfile --offline COPY libs/core libs/core COPY libs/dev-tools libs/dev-tools +COPY libs/password libs/password COPY libs/prisma libs/prisma COPY libs/search-params-io libs/search-params-io COPY libs/zod-utils libs/zod-utils COPY apps/website apps/website +# Synchronise injected workspace packages after copying source code. +# See: docs/decisions/002-workspace-package-injection.md +RUN pnpm install --frozen-lockfile --offline + # Build libs and app. RUN pnpm --filter website... build @@ -89,4 +95,8 @@ COPY libs/prisma/migrations libs/prisma/migrations COPY libs/prisma/prisma.config.ts libs/prisma/prisma.config.ts COPY libs/prisma/schema.prisma libs/prisma/schema.prisma +# Synchronise injected workspace packages after copying build artifacts. +# See: docs/decisions/002-workspace-package-injection.md +RUN pnpm install --prod --frozen-lockfile --offline + CMD ["pnpm", "--filter", "website", "start"] diff --git a/docs/decisions/001-file-extensions.md b/docs/decisions/001-file-extensions.md index d426cfea..8ac55bea 100644 --- a/docs/decisions/001-file-extensions.md +++ b/docs/decisions/001-file-extensions.md @@ -1,4 +1,4 @@ -# File Extensions in Imports +# File extensions in imports Date: **2026-03-22** diff --git a/docs/decisions/002-workspace-package-injection.md b/docs/decisions/002-workspace-package-injection.md new file mode 100644 index 00000000..105392eb --- /dev/null +++ b/docs/decisions/002-workspace-package-injection.md @@ -0,0 +1,181 @@ +# Force workspace package injection + +Date: **2026-04-03** + +Status: **Accepted** + +## Context + +We need to upgrade some dependencies (e.g. React, Remix / React Router, and +Tailwind CSS) but we can't update them in the entire workspace at once. The plan +is to upgrade them app by app. This means different apps can temporarily require +different versions of the same dependencies, and libs should work with different +versions of their peer dependencies. + +To support this, we already moved to [pnpm][pnpm], because it has the features +needed to manage app-specific dependency versions in a monorepo. + +By default, workspace packages are symlinked to consumers' `node_modules/` +folder and this works fine when they all share the same versions of +dependencies. But once we start staggered upgrades, this setup becomes risky. + +For example, even when `app-2` depends on React 18, `lib-1` may resolve React 19 +because `lib-1` is symlinked to its workspace location: + +``` +. +├─ apps +│ ├─ app-1 +│ │ ├─ package.json +│ │ │ └─ deps: lib-1, react@19 +│ │ └─ node_modules/ +│ │ ├─ lib-1/ -> ../../libs/lib-1/ +│ │ └─ react/ -> ../../../node_modules/.pnpm/react@19/node_modules/react/ +│ ├─ app-2/ +│ │ ├─ package.json +│ │ │ └─ deps: lib-1, react@18 +│ │ └─ node_modules/ +│ │ ├─ lib-1/ -> ../../libs/lib-1/ +│ │ └─ react/ -> ../../../node_modules/.pnpm/react@18/node_modules/react/ +├─ libs/ +│ └─ lib-1/ +│ ├─ package.json +│ │ └─ peer deps: react@18|19 +│ └─ node_modules/ +│ └─ react/ -> ../../../node_modules/.pnpm/react@19/node_modules/react/ +└─ node_modules/ + └─ .pnpm/ + ├─ react@18/ + └─ react@19/ +``` + +Because module resolution starts from the real location of `lib-1` (in `libs/`), +the peer dependency seen by the library can differ from the one installed in the +consumer app. + +## Decision + +We will use pnpm's workspace package injection feature to install workspace +libraries in the virtual store, treating them like regular dependencies. This +means a copy of each lib is created in the virtual store for each distinct peer +dependency context. + +This allows each lib to resolve its peer dependencies as defined by the app. + +For example, `lib-1` uses React 19 when imported in `app-1`, and React 18 when +imported in `app-2`. + +``` +. +├─ apps +│ ├─ app-1 +│ │ ├─ package.json +│ │ │ └─ deps: lib-1, react@19 +│ │ └─ node_modules/ +│ │ ├─ lib-1/ -> ../../../node_modules/.pnpm/lib-1@_react@19/node_modules/lib-1/ +│ │ └─ react/ -> ../../../node_modules/.pnpm/react@19/node_modules/react/ +│ ├─ app-2/ +│ │ ├─ package.json +│ │ │ └─ deps: lib-1, react@18 +│ │ └─ node_modules/ +│ │ ├─ lib-1/ -> ../../../node_modules/.pnpm/lib-1@_react@18/node_modules/lib-1/ +│ │ └─ react/ -> ../../../node_modules/.pnpm/react@18/node_modules/react/ +├─ libs/ +│ └─ lib-1/ +│ └─ package.json +│ └─ peer deps: react@18|19 +└─ node_modules/ + └─ .pnpm/ + ├─ lib-1@_react@18/ + │ └─ node_modules/ + │ ├─ lib-1/ + │ └─ react/ -> ../../react@18/node_modules/react/ + ├─ lib-1@_react@19/ + │ └─ node_modules/ + │ ├─ lib-1/ + │ └─ react/ -> ../../react@19/node_modules/react/ + ├─ react@18/ + └─ react@19/ +``` + +### How to inject packages + +We'll set [`injectWorkspacePackages`][inject-workspace-packages] to `true` in +`pnpm-workspace.yaml` so workspace packages are installed as injected copies in +the virtual store instead of simple symlinks. + +Also, we'll set [`dedupeInjectedDeps`][dedupe-injected-deps] to `false`. This +prevents pnpm from collapsing multiple injected copies back into a single +symlink when peer dependencies are compatible across different apps, which would +defeat the purpose of isolation. + +In each `package.json`, set the `files` field to list which files and folders +pnpm should synchronise into injected copies. This tells pnpm exactly which +contents from the source directory should be included when creating a copy. +Without the `files` field, pnpm will not include the `build/` folder in injected +copies, which means consumers will use stale or missing built artifacts. + +### How to synchronise injected packages + +The [`syncInjectedDepsAfterScripts`][sync-injected-deps-after-scripts] setting +in `pnpm-workspace.yaml` ensures pnpm automatically synchronises an injected +package with its source each time specified scripts finish. One-off scripts like +`build` are straightforward to track, but `dev` scripts are more complex: they +run once and keep tools in watch mode, so subsequent rebuilds by those tools are +not detected by pnpm and the synchronisation does not happen automatically. + +To solve this, we'll add a `dev:sync-workspace` script that watches the `build/` +folder and invokes a `sync-workspace` script each time the folder changes. The +`sync-workspace` script itself is a no-op, its only purpose is to trigger pnpm's +synchronisation mechanism. For consistency, configure +`syncInjectedDepsAfterScripts` to track only `sync-workspace`, and use +post-scripts (such as `postbuild`) for one-off builds, allowing each package to +control when synchronisation occurs. + +In app `Dockerfile`s, the virtual store and dependencies are copied before the +source code or `build/` folders to optimize layer caching. However, pnpm can +only synchronise packages when running configured scripts. Libraries without a +build script will not be synchronised during the build, and when the final image +is constructed with only the `build/` folders copied, injected packages will +have stale contents. To ensure injected packages stay synchronised with +workspace sources, we'll add extra `pnpm install` calls at the points where +source code or build outputs change. + +**Advantages**: + +- 👍 Enables app-by-app dependency upgrades. +- 👍 Reduces cross-app peer dependency interference. +- 👍 Improves reproducibility between local, CI, and Docker installs. + +**Drawbacks**: + +- 👎 Slightly larger install footprint compared to pure symlinks. +- 👎 Slightly more complex synchronisation configuration. + +## Consequences + +With workspace package injection enabled, we can safely upgrade dependencies app +by app without coordinating a single workspace-wide migration. Each app's +dependency graph is isolated in the virtual store, so different apps can use +different versions of the same peer dependencies without conflicts. + +The setup requires careful configuration: settings in `pnpm-workspace.yaml`, the +`files` field in each `package.json`, and explicit `pnpm install` calls in +`Dockerfile`s to ensure injected packages stay synchronised. Development scripts +must preserve synchronisation between the source and injected copies, which is +handled by the `sync-workspace` hook pattern described above. + +The positive consequence is that we can now upgrade dependencies incrementally, +reducing risk and allowing teams to work independently on different apps. + +## Considered options + +1. **Upgrade all apps and libraries in one global dependency migration** + - 👍 Avoids temporary mixed peer dependency states. + - 👎 High coordination cost and larger blast radius. + +[dedupe-injected-deps]: https://pnpm.io/workspaces#dedupeinjecteddeps +[inject-workspace-packages]: https://pnpm.io/workspaces#injectworkspacepackages +[pnpm]: https://pnpm.io/ +[sync-injected-deps-after-scripts]: + https://pnpm.io/workspaces#syncinjecteddepsafterscripts diff --git a/libs/core/package.json b/libs/core/package.json index d7f5dc10..a5b90982 100644 --- a/libs/core/package.json +++ b/libs/core/package.json @@ -4,6 +4,9 @@ "private": true, "sideEffects": false, "type": "module", + "files": [ + "build" + ], "exports": { ".": { "types": "./build/src/index.d.ts", @@ -15,17 +18,20 @@ "build": "run-s --print-label build:src build:paths", "build:paths": "tsc-alias -p ./tsconfig.build.json", "build:src": "tsc -p ./tsconfig.build.json", + "postbuild": "pnpm sync-workspace", "clean": "rm -rf ./build", "dev": "run-p --continue-on-error --print-label dev:*", "dev:paths": "pnpm build:paths --watch", "dev:src": "pnpm build:src --watch", + "dev:sync-workspace": "chokidar ./build --debounce --silent -c 'pnpm sync-workspace'", "lint": "run-p --continue-on-error --print-label lint:*", "lint:eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint --max-warnings 0 .", "lint:prettier": "prettier --list-different .", "lint:tsc": "tsc --noEmit", "lint-fix": "run-s --print-label lint-fix:eslint lint-fix:prettier", "lint-fix:eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint --fix .", - "lint-fix:prettier": "prettier --write ." + "lint-fix:prettier": "prettier --write .", + "sync-workspace": "# See /docs/decisions/002-workspace-package-injection.md" }, "dependencies": { "@animeaux/prisma": "workspace:*", @@ -42,6 +48,7 @@ "@types/luxon": "catalog:", "@types/node": "catalog:", "@types/react": "catalog:", + "chokidar-cli": "catalog:", "eslint": "catalog:", "npm-run-all": "catalog:", "prettier": "catalog:", diff --git a/libs/dev-tools/package.json b/libs/dev-tools/package.json index df11768e..48946b0e 100644 --- a/libs/dev-tools/package.json +++ b/libs/dev-tools/package.json @@ -4,6 +4,14 @@ "private": true, "sideEffects": false, "type": "module", + "files": [ + "eslint.config.js", + "prettier.config.js", + "reset.d.ts", + "tsconfig.app.json", + "tsconfig.base.json", + "tsconfig.lib.json" + ], "exports": { "./eslint": "./eslint.config.js", "./prettier": "./prettier.config.js", diff --git a/libs/file-storage/package.json b/libs/file-storage/package.json index 7fe2d45c..dbbe6794 100644 --- a/libs/file-storage/package.json +++ b/libs/file-storage/package.json @@ -4,6 +4,9 @@ "private": true, "sideEffects": false, "type": "module", + "files": [ + "build" + ], "exports": { ".": { "types": "./build/src/index.d.ts", @@ -19,17 +22,20 @@ "build": "run-s --print-label build:src build:paths", "build:paths": "tsc-alias -p ./tsconfig.build.json", "build:src": "tsc -p ./tsconfig.build.json", + "postbuild": "pnpm sync-workspace", "clean": "rm -rf ./build", "dev": "run-p --continue-on-error --print-label dev:*", "dev:paths": "pnpm build:paths --watch", "dev:src": "pnpm build:src --watch", + "dev:sync-workspace": "chokidar ./build --debounce --silent -c 'pnpm sync-workspace'", "lint": "run-p --continue-on-error --print-label lint:*", "lint:eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint --max-warnings 0 .", "lint:prettier": "prettier --list-different .", "lint:tsc": "tsc --noEmit", "lint-fix": "run-s --print-label lint-fix:eslint lint-fix:prettier", "lint-fix:eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint --fix .", - "lint-fix:prettier": "prettier --write ." + "lint-fix:prettier": "prettier --write .", + "sync-workspace": "# See /docs/decisions/002-workspace-package-injection.md" }, "dependencies": { "@animeaux/core": "workspace:*", @@ -52,6 +58,7 @@ "@animeaux/dev-tools": "workspace:*", "@types/node": "catalog:", "@types/uuid": "catalog:", + "chokidar-cli": "catalog:", "eslint": "catalog:", "npm-run-all": "catalog:", "prettier": "catalog:", diff --git a/libs/files-io/package.json b/libs/files-io/package.json index 275eb0f5..04845f35 100644 --- a/libs/files-io/package.json +++ b/libs/files-io/package.json @@ -4,6 +4,9 @@ "private": true, "sideEffects": false, "type": "module", + "files": [ + "build" + ], "exports": { ".": { "types": "./build/src/index.d.ts", @@ -15,23 +18,27 @@ "build": "run-s --print-label build:src build:paths", "build:paths": "tsc-alias -p ./tsconfig.build.json", "build:src": "tsc -p ./tsconfig.build.json", + "postbuild": "pnpm sync-workspace", "clean": "rm -rf ./build", "dev": "run-p --continue-on-error --print-label dev:*", "dev:paths": "pnpm build:paths --watch", "dev:src": "pnpm build:src --watch", + "dev:sync-workspace": "chokidar ./build --debounce --silent -c 'pnpm sync-workspace'", "lint": "run-p --continue-on-error --print-label lint:*", "lint:eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint --max-warnings 0 .", "lint:prettier": "prettier --list-different .", "lint:tsc": "tsc --noEmit", "lint-fix": "run-s --print-label lint-fix:eslint lint-fix:prettier", "lint-fix:eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint --fix .", - "lint-fix:prettier": "prettier --write ." + "lint-fix:prettier": "prettier --write .", + "sync-workspace": "# See /docs/decisions/002-workspace-package-injection.md" }, "dependencies": { "tiny-invariant": "catalog:" }, "devDependencies": { "@animeaux/dev-tools": "workspace:*", + "chokidar-cli": "catalog:", "eslint": "catalog:", "npm-run-all": "catalog:", "prettier": "catalog:", diff --git a/libs/form-data/package.json b/libs/form-data/package.json index f5a1e3e1..32cade13 100644 --- a/libs/form-data/package.json +++ b/libs/form-data/package.json @@ -4,6 +4,9 @@ "private": true, "sideEffects": false, "type": "module", + "files": [ + "build" + ], "exports": { ".": { "types": "./build/src/index.d.ts", @@ -15,23 +18,27 @@ "build": "run-s --print-label build:src build:paths", "build:paths": "tsc-alias -p ./tsconfig.build.json", "build:src": "tsc -p ./tsconfig.build.json", + "postbuild": "pnpm sync-workspace", "clean": "rm -rf ./build", "dev": "run-p --continue-on-error --print-label dev:*", "dev:paths": "pnpm build:paths --watch", "dev:src": "pnpm build:src --watch", + "dev:sync-workspace": "chokidar ./build --debounce --silent -c 'pnpm sync-workspace'", "lint": "run-p --continue-on-error --print-label lint:*", "lint:eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint --max-warnings 0 .", "lint:prettier": "prettier --list-different .", "lint:tsc": "tsc --noEmit", "lint-fix": "run-s --print-label lint-fix:eslint lint-fix:prettier", "lint-fix:eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint --fix .", - "lint-fix:prettier": "prettier --write ." + "lint-fix:prettier": "prettier --write .", + "sync-workspace": "# See /docs/decisions/002-workspace-package-injection.md" }, "dependencies": { "@animeaux/zod-utils": "workspace:*" }, "devDependencies": { "@animeaux/dev-tools": "workspace:*", + "chokidar-cli": "catalog:", "eslint": "catalog:", "npm-run-all": "catalog:", "prettier": "catalog:", diff --git a/libs/password/package.json b/libs/password/package.json index 9a8a158f..eb62badb 100644 --- a/libs/password/package.json +++ b/libs/password/package.json @@ -4,6 +4,9 @@ "private": true, "sideEffects": false, "type": "module", + "files": [ + "build" + ], "exports": { ".": { "types": "./build/src/index.d.ts", @@ -15,17 +18,20 @@ "build": "run-s --print-label build:src build:paths", "build:paths": "tsc-alias -p ./tsconfig.build.json", "build:src": "tsc -p ./tsconfig.build.json", + "postbuild": "pnpm sync-workspace", "clean": "rm -rf ./build", "dev": "run-p --continue-on-error --print-label dev:*", "dev:paths": "pnpm build:paths --watch", "dev:src": "pnpm build:src --watch", + "dev:sync-workspace": "chokidar ./build --debounce --silent -c 'pnpm sync-workspace'", "lint": "run-p --continue-on-error --print-label lint:*", "lint:eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint --max-warnings 0 .", "lint:prettier": "prettier --list-different .", "lint:tsc": "tsc --noEmit", "lint-fix": "run-s --print-label lint-fix:eslint lint-fix:prettier", "lint-fix:eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint --fix .", - "lint-fix:prettier": "prettier --write ." + "lint-fix:prettier": "prettier --write .", + "sync-workspace": "# See /docs/decisions/002-workspace-package-injection.md" }, "dependencies": { "tiny-invariant": "catalog:" @@ -33,6 +39,7 @@ "devDependencies": { "@animeaux/dev-tools": "workspace:*", "@types/node": "catalog:", + "chokidar-cli": "catalog:", "eslint": "catalog:", "npm-run-all": "catalog:", "prettier": "catalog:", diff --git a/libs/prisma/package.json b/libs/prisma/package.json index 9a2bada8..13b34639 100644 --- a/libs/prisma/package.json +++ b/libs/prisma/package.json @@ -4,6 +4,9 @@ "private": true, "sideEffects": false, "type": "module", + "files": [ + "build" + ], "exports": { ".": { "types": "./build/src/index.d.ts", @@ -20,12 +23,14 @@ "build:paths": "tsc-alias -p ./tsconfig.build.json", "build:prisma": "pnpm prisma-env generate", "build:src": "tsc -p ./tsconfig.build.json", + "postbuild": "pnpm sync-workspace", "clean": "rm -rf ./build ./src/generated", "copy-data": "tsx ./scripts/copy-data.ts", "dev": "run-p --continue-on-error --print-label dev:*", "dev:paths": "pnpm build:paths --watch", - "dev:prisma": "chokidar ./schema.prisma -c 'prisma generate'", + "dev:prisma": "chokidar ./schema.prisma --initial --silent -c 'pnpm build:prisma'", "dev:src": "pnpm build:src --watch", + "dev:sync-workspace": "chokidar ./build --debounce --silent -c 'pnpm sync-workspace'", "download-all-data": "tsx -r dotenv-flow/config ./scripts/download-all-data.ts", "lint": "run-p --continue-on-error --print-label lint:*", "lint:eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint --max-warnings 0 .", @@ -37,7 +42,8 @@ "migrate": "pnpm prisma-env migrate dev", "prisma-env": "NODE_OPTIONS=\"-r dotenv-flow/config\" prisma", "reset": "pnpm prisma-env migrate reset -f", - "studio": "pnpm prisma-env studio" + "studio": "pnpm prisma-env studio", + "sync-workspace": "# See /docs/decisions/002-workspace-package-injection.md" }, "dependencies": { "@prisma/adapter-pg": "catalog:", diff --git a/libs/react-primitives/package.json b/libs/react-primitives/package.json index 8ba43972..44660d3c 100644 --- a/libs/react-primitives/package.json +++ b/libs/react-primitives/package.json @@ -4,6 +4,9 @@ "private": true, "sideEffects": false, "type": "module", + "files": [ + "build" + ], "exports": { ".": { "types": "./build/src/index.d.ts", @@ -15,17 +18,20 @@ "build": "run-s --print-label build:src build:paths", "build:paths": "tsc-alias -p ./tsconfig.build.json", "build:src": "tsc -p ./tsconfig.build.json", + "postbuild": "pnpm sync-workspace", "clean": "rm -rf ./build", "dev": "run-p --continue-on-error --print-label dev:*", "dev:paths": "pnpm build:paths --watch", "dev:src": "pnpm build:src --watch", + "dev:sync-workspace": "chokidar ./build --debounce --silent -c 'pnpm sync-workspace'", "lint": "run-p --continue-on-error --print-label lint:*", "lint:eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint --max-warnings 0 .", "lint:prettier": "prettier --list-different .", "lint:tsc": "tsc --noEmit", "lint-fix": "run-s --print-label lint-fix:eslint lint-fix:prettier", "lint-fix:eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint --fix .", - "lint-fix:prettier": "prettier --write ." + "lint-fix:prettier": "prettier --write .", + "sync-workspace": "# See /docs/decisions/002-workspace-package-injection.md" }, "dependencies": { "@radix-ui/react-slot": "catalog:", @@ -34,6 +40,7 @@ "devDependencies": { "@animeaux/dev-tools": "workspace:*", "@types/react": "catalog:", + "chokidar-cli": "catalog:", "eslint": "catalog:", "npm-run-all": "catalog:", "prettier": "catalog:", diff --git a/libs/search-params-io/package.json b/libs/search-params-io/package.json index 776aab30..76653e14 100644 --- a/libs/search-params-io/package.json +++ b/libs/search-params-io/package.json @@ -4,6 +4,9 @@ "private": true, "sideEffects": false, "type": "module", + "files": [ + "build" + ], "exports": { ".": { "types": "./build/src/index.d.ts", @@ -15,17 +18,20 @@ "build": "run-s --print-label build:src build:paths", "build:paths": "tsc-alias -p ./tsconfig.build.json", "build:src": "tsc -p ./tsconfig.build.json", + "postbuild": "pnpm sync-workspace", "clean": "rm -rf ./build", "dev": "run-p --continue-on-error --print-label dev:*", "dev:paths": "pnpm build:paths --watch", "dev:src": "pnpm build:src --watch", + "dev:sync-workspace": "chokidar ./build --debounce --silent -c 'pnpm sync-workspace'", "lint": "run-p --continue-on-error --print-label lint:*", "lint:eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint --max-warnings 0 .", "lint:prettier": "prettier --list-different .", "lint:tsc": "tsc --noEmit", "lint-fix": "run-s --print-label lint-fix:eslint lint-fix:prettier", "lint-fix:eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint --fix .", - "lint-fix:prettier": "prettier --write ." + "lint-fix:prettier": "prettier --write .", + "sync-workspace": "# See /docs/decisions/002-workspace-package-injection.md" }, "dependencies": { "@remix-run/react": "catalog:", @@ -35,6 +41,7 @@ "devDependencies": { "@animeaux/dev-tools": "workspace:*", "@types/react": "catalog:", + "chokidar-cli": "catalog:", "eslint": "catalog:", "npm-run-all": "catalog:", "prettier": "catalog:", diff --git a/libs/tailwind-animation/package.json b/libs/tailwind-animation/package.json index 4ea63e80..5d2288e6 100644 --- a/libs/tailwind-animation/package.json +++ b/libs/tailwind-animation/package.json @@ -4,6 +4,9 @@ "private": true, "sideEffects": false, "type": "module", + "files": [ + "build" + ], "exports": { ".": { "types": "./build/src/index.d.ts", @@ -15,23 +18,27 @@ "build": "run-s --print-label build:src build:paths", "build:paths": "tsc-alias -p ./tsconfig.build.json", "build:src": "tsc -p ./tsconfig.build.json", + "postbuild": "pnpm sync-workspace", "clean": "rm -rf ./build", "dev": "run-p --continue-on-error --print-label dev:*", "dev:paths": "pnpm build:paths --watch", "dev:src": "pnpm build:src --watch", + "dev:sync-workspace": "chokidar ./build --debounce --silent -c 'pnpm sync-workspace'", "lint": "run-p --continue-on-error --print-label lint:*", "lint:eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint --max-warnings 0 .", "lint:prettier": "prettier --list-different .", "lint:tsc": "tsc --noEmit", "lint-fix": "run-s --print-label lint-fix:eslint lint-fix:prettier", "lint-fix:eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint --fix .", - "lint-fix:prettier": "prettier --write ." + "lint-fix:prettier": "prettier --write .", + "sync-workspace": "# See /docs/decisions/002-workspace-package-injection.md" }, "dependencies": { "tailwindcss": "catalog:" }, "devDependencies": { "@animeaux/dev-tools": "workspace:*", + "chokidar-cli": "catalog:", "eslint": "catalog:", "npm-run-all": "catalog:", "prettier": "catalog:", diff --git a/libs/zod-utils/package.json b/libs/zod-utils/package.json index e8664f79..176676f6 100644 --- a/libs/zod-utils/package.json +++ b/libs/zod-utils/package.json @@ -4,6 +4,9 @@ "private": true, "sideEffects": false, "type": "module", + "files": [ + "build" + ], "exports": { ".": { "types": "./build/src/index.d.ts", @@ -15,17 +18,20 @@ "build": "run-s --print-label build:src build:paths", "build:paths": "tsc-alias -p ./tsconfig.build.json", "build:src": "tsc -p ./tsconfig.build.json", + "postbuild": "pnpm sync-workspace", "clean": "rm -rf ./build", "dev": "run-p --continue-on-error --print-label dev:*", "dev:paths": "pnpm build:paths --watch", "dev:src": "pnpm build:src --watch", + "dev:sync-workspace": "chokidar ./build --debounce --silent -c 'pnpm sync-workspace'", "lint": "run-p --continue-on-error --print-label lint:*", "lint:eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint --max-warnings 0 .", "lint:prettier": "prettier --list-different .", "lint:tsc": "tsc --noEmit", "lint-fix": "run-s --print-label lint-fix:eslint lint-fix:prettier", "lint-fix:eslint": "eslint --cache --cache-location ./node_modules/.cache/eslint --fix .", - "lint-fix:prettier": "prettier --write ." + "lint-fix:prettier": "prettier --write .", + "sync-workspace": "# See /docs/decisions/002-workspace-package-injection.md" }, "dependencies": { "@opentelemetry/api": "catalog:", @@ -46,6 +52,7 @@ "devDependencies": { "@animeaux/dev-tools": "workspace:*", "@types/luxon": "catalog:", + "chokidar-cli": "catalog:", "eslint": "catalog:", "npm-run-all": "catalog:", "prettier": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3b5a6aaf..27dd202b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -377,7 +377,7 @@ importers: devDependencies: '@animeaux/dev-tools': specifier: workspace:* - version: link:libs/dev-tools + version: file:libs/dev-tools(@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(@typescript-eslint/utils@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(jiti@2.6.1)(typescript@5.4.5) eslint: specifier: 'catalog:' version: 9.39.3(jiti@2.6.1) @@ -398,28 +398,28 @@ importers: dependencies: '@animeaux/core': specifier: workspace:* - version: link:../../libs/core + version: file:libs/core(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(typescript@5.4.5) '@animeaux/file-storage': specifier: workspace:* - version: link:../../libs/file-storage + version: file:libs/file-storage(@types/react@18.3.3)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(typescript@5.4.5) '@animeaux/form-data': specifier: workspace:* - version: link:../../libs/form-data + version: file:libs/form-data(typescript@5.4.5) '@animeaux/password': specifier: workspace:* - version: link:../../libs/password + version: file:libs/password '@animeaux/prisma': specifier: workspace:* - version: link:../../libs/prisma + version: file:libs/prisma(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5) '@animeaux/react-primitives': specifier: workspace:* - version: link:../../libs/react-primitives + version: file:libs/react-primitives(@types/react@18.3.3) '@animeaux/search-params-io': specifier: workspace:* - version: link:../../libs/search-params-io + version: file:libs/search-params-io(react-dom@18.3.1(react@18.3.1))(typescript@5.4.5) '@animeaux/zod-utils': specifier: workspace:* - version: link:../../libs/zod-utils + version: file:libs/zod-utils(typescript@5.4.5) '@conform-to/react': specifier: 'catalog:' version: 1.2.2(react@18.3.1) @@ -537,10 +537,10 @@ importers: devDependencies: '@animeaux/dev-tools': specifier: workspace:* - version: link:../../libs/dev-tools + version: file:libs/dev-tools(@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(@typescript-eslint/utils@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(jiti@2.6.1)(typescript@5.4.5) '@animeaux/tailwind-animation': specifier: workspace:* - version: link:../../libs/tailwind-animation + version: file:libs/tailwind-animation '@faker-js/faker': specifier: 'catalog:' version: 8.4.1 @@ -624,25 +624,25 @@ importers: dependencies: '@animeaux/core': specifier: workspace:* - version: link:../../libs/core + version: file:libs/core(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(typescript@5.4.5) '@animeaux/file-storage': specifier: workspace:* - version: link:../../libs/file-storage + version: file:libs/file-storage(@types/react@18.3.3)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(typescript@5.4.5) '@animeaux/files-io': specifier: workspace:* - version: link:../../libs/files-io + version: file:libs/files-io '@animeaux/prisma': specifier: workspace:* - version: link:../../libs/prisma + version: file:libs/prisma(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5) '@animeaux/react-primitives': specifier: workspace:* - version: link:../../libs/react-primitives + version: file:libs/react-primitives(@types/react@18.3.3) '@animeaux/search-params-io': specifier: workspace:* - version: link:../../libs/search-params-io + version: file:libs/search-params-io(react-dom@18.3.1(react@18.3.1))(typescript@5.4.5) '@animeaux/zod-utils': specifier: workspace:* - version: link:../../libs/zod-utils + version: file:libs/zod-utils(typescript@5.4.5) '@conform-to/react': specifier: 'catalog:' version: 1.2.2(react@18.3.1) @@ -763,7 +763,7 @@ importers: devDependencies: '@animeaux/dev-tools': specifier: workspace:* - version: link:../../libs/dev-tools + version: file:libs/dev-tools(@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(@typescript-eslint/utils@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(jiti@2.6.1)(typescript@5.4.5) '@remix-run/dev': specifier: 'catalog:' version: 2.9.2(@remix-run/react@2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5))(@remix-run/serve@2.9.2(typescript@5.4.5))(@types/node@22.8.7)(typescript@5.4.5)(vite@5.2.12(@types/node@22.8.7)) @@ -841,13 +841,13 @@ importers: dependencies: '@animeaux/core': specifier: workspace:* - version: link:../../libs/core + version: file:libs/core(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(typescript@5.4.5) '@animeaux/prisma': specifier: workspace:* - version: link:../../libs/prisma + version: file:libs/prisma(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5) '@animeaux/zod-utils': specifier: workspace:* - version: link:../../libs/zod-utils + version: file:libs/zod-utils(typescript@5.4.5) '@remix-run/node': specifier: 'catalog:' version: 2.9.2(typescript@5.4.5) @@ -905,7 +905,7 @@ importers: devDependencies: '@animeaux/dev-tools': specifier: workspace:* - version: link:../../libs/dev-tools + version: file:libs/dev-tools(@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(@typescript-eslint/utils@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(jiti@2.6.1)(typescript@5.4.5) '@remix-run/dev': specifier: 'catalog:' version: 2.9.2(@remix-run/react@2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5))(@remix-run/serve@2.9.2(typescript@5.4.5))(@types/node@22.8.7)(typescript@5.4.5)(vite@5.2.12(@types/node@22.8.7)) @@ -974,10 +974,10 @@ importers: dependencies: '@animeaux/prisma': specifier: workspace:* - version: link:../prisma + version: file:libs/prisma(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5) '@animeaux/search-params-io': specifier: workspace:* - version: link:../search-params-io + version: file:libs/search-params-io(react-dom@18.3.1(react@18.3.1))(typescript@5.4.5) '@remix-run/react': specifier: 'catalog:' version: 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5) @@ -999,7 +999,7 @@ importers: devDependencies: '@animeaux/dev-tools': specifier: workspace:* - version: link:../dev-tools + version: file:libs/dev-tools(@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(@typescript-eslint/utils@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(jiti@2.6.1)(typescript@5.4.5) '@types/luxon': specifier: 'catalog:' version: 3.4.2 @@ -1009,6 +1009,9 @@ importers: '@types/react': specifier: 'catalog:' version: 18.3.3 + chokidar-cli: + specifier: 'catalog:' + version: 3.0.0 eslint: specifier: 'catalog:' version: 9.39.3(jiti@2.6.1) @@ -1073,10 +1076,10 @@ importers: dependencies: '@animeaux/core': specifier: workspace:* - version: link:../core + version: file:libs/core(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(typescript@5.4.5) '@animeaux/zod-utils': specifier: workspace:* - version: link:../zod-utils + version: file:libs/zod-utils(typescript@5.4.5) '@mjackson/form-data-parser': specifier: 'catalog:' version: 0.4.0 @@ -1119,13 +1122,16 @@ importers: devDependencies: '@animeaux/dev-tools': specifier: workspace:* - version: link:../dev-tools + version: file:libs/dev-tools(@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(@typescript-eslint/utils@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(jiti@2.6.1)(typescript@5.4.5) '@types/node': specifier: 'catalog:' version: 22.8.7 '@types/uuid': specifier: 'catalog:' version: 9.0.8 + chokidar-cli: + specifier: 'catalog:' + version: 3.0.0 eslint: specifier: 'catalog:' version: 9.39.3(jiti@2.6.1) @@ -1150,7 +1156,10 @@ importers: devDependencies: '@animeaux/dev-tools': specifier: workspace:* - version: link:../dev-tools + version: file:libs/dev-tools(@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(@typescript-eslint/utils@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(jiti@2.6.1)(typescript@5.4.5) + chokidar-cli: + specifier: 'catalog:' + version: 3.0.0 eslint: specifier: 'catalog:' version: 9.39.3(jiti@2.6.1) @@ -1171,11 +1180,14 @@ importers: dependencies: '@animeaux/zod-utils': specifier: workspace:* - version: link:../zod-utils + version: file:libs/zod-utils(typescript@5.4.5) devDependencies: '@animeaux/dev-tools': specifier: workspace:* - version: link:../dev-tools + version: file:libs/dev-tools(@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(@typescript-eslint/utils@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(jiti@2.6.1)(typescript@5.4.5) + chokidar-cli: + specifier: 'catalog:' + version: 3.0.0 eslint: specifier: 'catalog:' version: 9.39.3(jiti@2.6.1) @@ -1200,10 +1212,13 @@ importers: devDependencies: '@animeaux/dev-tools': specifier: workspace:* - version: link:../dev-tools + version: file:libs/dev-tools(@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(@typescript-eslint/utils@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(jiti@2.6.1)(typescript@5.4.5) '@types/node': specifier: 'catalog:' version: 22.8.7 + chokidar-cli: + specifier: 'catalog:' + version: 3.0.0 eslint: specifier: 'catalog:' version: 9.39.3(jiti@2.6.1) @@ -1234,10 +1249,10 @@ importers: devDependencies: '@animeaux/dev-tools': specifier: workspace:* - version: link:../dev-tools + version: file:libs/dev-tools(@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(@typescript-eslint/utils@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(jiti@2.6.1)(typescript@5.4.5) '@animeaux/password': specifier: workspace:* - version: link:../password + version: file:libs/password '@faker-js/faker': specifier: 'catalog:' version: 8.4.1 @@ -1307,10 +1322,13 @@ importers: devDependencies: '@animeaux/dev-tools': specifier: workspace:* - version: link:../dev-tools + version: file:libs/dev-tools(@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(@typescript-eslint/utils@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(jiti@2.6.1)(typescript@5.4.5) '@types/react': specifier: 'catalog:' version: 18.3.3 + chokidar-cli: + specifier: 'catalog:' + version: 3.0.0 eslint: specifier: 'catalog:' version: 9.39.3(jiti@2.6.1) @@ -1341,10 +1359,13 @@ importers: devDependencies: '@animeaux/dev-tools': specifier: workspace:* - version: link:../dev-tools + version: file:libs/dev-tools(@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(@typescript-eslint/utils@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(jiti@2.6.1)(typescript@5.4.5) '@types/react': specifier: 'catalog:' version: 18.3.3 + chokidar-cli: + specifier: 'catalog:' + version: 3.0.0 eslint: specifier: 'catalog:' version: 9.39.3(jiti@2.6.1) @@ -1369,7 +1390,10 @@ importers: devDependencies: '@animeaux/dev-tools': specifier: workspace:* - version: link:../dev-tools + version: file:libs/dev-tools(@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(@typescript-eslint/utils@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(jiti@2.6.1)(typescript@5.4.5) + chokidar-cli: + specifier: 'catalog:' + version: 3.0.0 eslint: specifier: 'catalog:' version: 9.39.3(jiti@2.6.1) @@ -1433,10 +1457,13 @@ importers: devDependencies: '@animeaux/dev-tools': specifier: workspace:* - version: link:../dev-tools + version: file:libs/dev-tools(@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(@typescript-eslint/utils@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(jiti@2.6.1)(typescript@5.4.5) '@types/luxon': specifier: 'catalog:' version: 3.4.2 + chokidar-cli: + specifier: 'catalog:' + version: 3.0.0 eslint: specifier: 'catalog:' version: 9.39.3(jiti@2.6.1) @@ -1457,10 +1484,10 @@ importers: devDependencies: '@animeaux/core': specifier: workspace:* - version: link:../libs/core + version: file:libs/core(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(typescript@5.4.5) '@animeaux/dev-tools': specifier: workspace:* - version: link:../libs/dev-tools + version: file:libs/dev-tools(@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(@typescript-eslint/utils@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(jiti@2.6.1)(typescript@5.4.5) '@types/node': specifier: 'catalog:' version: 22.8.7 @@ -1502,6 +1529,39 @@ packages: resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} engines: {node: '>=6.0.0'} + '@animeaux/core@file:libs/core': + resolution: {directory: libs/core, type: directory} + + '@animeaux/dev-tools@file:libs/dev-tools': + resolution: {directory: libs/dev-tools, type: directory} + + '@animeaux/file-storage@file:libs/file-storage': + resolution: {directory: libs/file-storage, type: directory} + + '@animeaux/files-io@file:libs/files-io': + resolution: {directory: libs/files-io, type: directory} + + '@animeaux/form-data@file:libs/form-data': + resolution: {directory: libs/form-data, type: directory} + + '@animeaux/password@file:libs/password': + resolution: {directory: libs/password, type: directory} + + '@animeaux/prisma@file:libs/prisma': + resolution: {directory: libs/prisma, type: directory} + + '@animeaux/react-primitives@file:libs/react-primitives': + resolution: {directory: libs/react-primitives, type: directory} + + '@animeaux/search-params-io@file:libs/search-params-io': + resolution: {directory: libs/search-params-io, type: directory} + + '@animeaux/tailwind-animation@file:libs/tailwind-animation': + resolution: {directory: libs/tailwind-animation, type: directory} + + '@animeaux/zod-utils@file:libs/zod-utils': + resolution: {directory: libs/zod-utils, type: directory} + '@babel/code-frame@7.23.5': resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} @@ -8494,6 +8554,160 @@ snapshots: '@jridgewell/gen-mapping': 0.1.1 '@jridgewell/trace-mapping': 0.3.25 + '@animeaux/core@file:libs/core(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(typescript@5.4.5)': + dependencies: + '@animeaux/prisma': file:libs/prisma(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5) + '@animeaux/search-params-io': file:libs/search-params-io(react-dom@18.3.1(react@18.3.1))(typescript@5.4.5) + '@remix-run/react': 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5) + es-toolkit: 1.45.1 + luxon: 3.4.4 + react: 18.3.1 + react-router: 6.23.1(react@18.3.1) + tiny-invariant: 1.3.3 + transitivePeerDependencies: + - '@types/react' + - better-sqlite3 + - magicast + - pg-native + - react-dom + - typescript + + '@animeaux/dev-tools@file:libs/dev-tools(@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(@typescript-eslint/utils@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(jiti@2.6.1)(typescript@5.4.5)': + dependencies: + '@total-typescript/ts-reset': 0.6.1 + eslint: 9.39.3(jiti@2.6.1) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(eslint@9.39.3(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.3(jiti@2.6.1)) + eslint-plugin-react: 7.37.5(eslint@9.39.3(jiti@2.6.1)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.39.3(jiti@2.6.1)) + eslint-plugin-simple-import-sort: 12.1.1(eslint@9.39.3(jiti@2.6.1)) + eslint-plugin-unused-imports: 4.4.1(@typescript-eslint/eslint-plugin@8.56.0(@typescript-eslint/parser@8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5))(eslint@9.39.3(jiti@2.6.1)) + globals: 15.15.0 + prettier: 3.3.0 + typescript-eslint: 8.56.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.4.5) + optionalDependencies: + prettier-plugin-tailwindcss: 0.6.1(prettier@3.3.0) + transitivePeerDependencies: + - '@ianvs/prettier-plugin-sort-imports' + - '@prettier/plugin-pug' + - '@shopify/prettier-plugin-liquid' + - '@trivago/prettier-plugin-sort-imports' + - '@typescript-eslint/eslint-plugin' + - '@typescript-eslint/utils' + - '@zackad/prettier-plugin-twig-melody' + - eslint-import-resolver-node + - jiti + - prettier-plugin-astro + - prettier-plugin-css-order + - prettier-plugin-import-sort + - prettier-plugin-jsdoc + - prettier-plugin-marko + - prettier-plugin-organize-attributes + - prettier-plugin-organize-imports + - prettier-plugin-sort-imports + - prettier-plugin-style-order + - prettier-plugin-svelte + - supports-color + - typescript + + '@animeaux/file-storage@file:libs/file-storage(@types/react@18.3.3)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(typescript@5.4.5)': + dependencies: + '@animeaux/core': file:libs/core(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(typescript@5.4.5) + '@animeaux/zod-utils': file:libs/zod-utils(typescript@5.4.5) + '@mjackson/form-data-parser': 0.4.0 + '@mjackson/lazy-file': 3.2.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.54.2(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@remix-run/node': 2.9.2(typescript@5.4.5) + '@remix-run/react': 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5) + '@sentry/remix': 8.37.1(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.27.0)(@remix-run/node@2.9.2(typescript@5.4.5))(@remix-run/react@2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5))(encoding@0.1.13)(react@18.3.1) + googleapis: 144.0.0(encoding@0.1.13) + react: 18.3.1 + uuid: 9.0.1 + transitivePeerDependencies: + - '@types/react' + - better-sqlite3 + - encoding + - magicast + - pg-native + - react-dom + - supports-color + - typescript + + '@animeaux/files-io@file:libs/files-io': + dependencies: + tiny-invariant: 1.3.3 + + '@animeaux/form-data@file:libs/form-data(typescript@5.4.5)': + dependencies: + '@animeaux/zod-utils': file:libs/zod-utils(typescript@5.4.5) + transitivePeerDependencies: + - supports-color + - typescript + + '@animeaux/password@file:libs/password': + dependencies: + tiny-invariant: 1.3.3 + + '@animeaux/prisma@file:libs/prisma(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5)': + dependencies: + '@prisma/adapter-pg': 7.5.0 + '@prisma/client': 7.5.0(prisma@7.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5))(typescript@5.4.5) + prisma: 7.5.0(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5) + transitivePeerDependencies: + - '@types/react' + - better-sqlite3 + - magicast + - pg-native + - react + - react-dom + - typescript + + '@animeaux/react-primitives@file:libs/react-primitives(@types/react@18.3.3)': + dependencies: + '@radix-ui/react-slot': 1.0.2(@types/react@18.3.3)(react@18.3.1) + react: 18.3.1 + transitivePeerDependencies: + - '@types/react' + + '@animeaux/search-params-io@file:libs/search-params-io(react-dom@18.3.1(react@18.3.1))(typescript@5.4.5)': + dependencies: + '@remix-run/react': 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5) + es-toolkit: 1.45.1 + react: 18.3.1 + transitivePeerDependencies: + - react-dom + - typescript + + '@animeaux/tailwind-animation@file:libs/tailwind-animation': + dependencies: + tailwindcss: 3.4.3 + transitivePeerDependencies: + - ts-node + + '@animeaux/zod-utils@file:libs/zod-utils(typescript@5.4.5)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.54.2(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.27.0 + '@remix-run/node': 2.9.2(typescript@5.4.5) + '@remix-run/react': 2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5) + '@sentry/remix': 8.37.1(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.27.0)(@remix-run/node@2.9.2(typescript@5.4.5))(@remix-run/react@2.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5))(encoding@0.1.13)(react@18.3.1) + encoding: 0.1.13 + luxon: 3.4.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + zod: 3.23.8 + zod-form-data: 2.0.2(zod@3.23.8) + transitivePeerDependencies: + - supports-color + - typescript + '@babel/code-frame@7.23.5': dependencies: '@babel/highlight': 7.23.4 @@ -9538,7 +9752,7 @@ snapshots: '@types/shimmer': 1.2.0 import-in-the-middle: 1.11.2 require-in-the-middle: 7.4.0 - semver: 7.6.3 + semver: 7.7.4 shimmer: 1.2.1 transitivePeerDependencies: - supports-color @@ -11013,9 +11227,9 @@ snapshots: dependencies: acorn: 8.11.3 - acorn-import-attributes@1.9.5(acorn@8.11.3): + acorn-import-attributes@1.9.5(acorn@8.16.0): dependencies: - acorn: 8.11.3 + acorn: 8.16.0 acorn-jsx@5.3.2(acorn@8.11.3): dependencies: @@ -12978,8 +13192,8 @@ snapshots: import-in-the-middle@1.11.2: dependencies: - acorn: 8.11.3 - acorn-import-attributes: 1.9.5(acorn@8.11.3) + acorn: 8.16.0 + acorn-import-attributes: 1.9.5(acorn@8.16.0) cjs-module-lexer: 1.4.1 module-details-from-path: 1.0.3 @@ -15162,7 +15376,7 @@ snapshots: proxy-agent@6.3.1: dependencies: agent-base: 7.1.1 - debug: 4.3.7 + debug: 4.4.3 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.4 lru-cache: 7.18.3 @@ -15513,7 +15727,7 @@ snapshots: require-in-the-middle@7.4.0: dependencies: - debug: 4.3.7 + debug: 4.4.3 module-details-from-path: 1.0.3 resolve: 1.22.8 transitivePeerDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 4e8580c8..a6b3bfaa 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,10 +2,22 @@ # See https://pnpm.io/settings#autoinstallpeers autoInstallPeers: false -# Allows app to use workspace packages with their expected peer dependencies. -# See https://pnpm.io/settings#injectworkspacepackages +# Don't use symlinks for workspace packages to ensure that peer dependencies are +# resolved correctly. +# See /docs/decisions/002-workspace-package-injection.md injectWorkspacePackages: true +# For consistency, ensure symlinks are never used, even when peer dependencies +# are compatible between workspace packages. +# See /docs/decisions/002-workspace-package-injection.md +dedupeInjectedDeps: false + +# Ensure injected workspace packages copies are always up to date after running +# this dedicated script. +# See /docs/decisions/002-workspace-package-injection.md +syncInjectedDepsAfterScripts: + - "sync-workspace" + packages: - apps/* - libs/*