From 0da0eeea735722f919225b77e08fafd22fc0d8e0 Mon Sep 17 00:00:00 2001 From: Frederik Wallner Date: Wed, 8 Oct 2025 20:57:24 +0200 Subject: [PATCH 1/8] feat(nx-cloud): setup nx cloud workspace This commit sets up Nx Cloud for your Nx workspace, enabling distributed caching and the Nx Cloud GitHub integration for fast CI and improved developer experience. You can access your Nx Cloud workspace by going to https://cloud.nx.app/orgs/68e6b404f7826232ae8fc153/workspaces/68e6b41204d3d892e997c97b **Note:** This commit attempts to maintain formatting of the nx.json file, however you may need to correct formatting by running an nx format command and committing the changes. --- nx.json | 30 +++++++----------------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/nx.json b/nx.json index 624986ed..60c2744f 100644 --- a/nx.json +++ b/nx.json @@ -17,9 +17,7 @@ { "plugin": "@nx/js/typescript", "options": { - "typecheck": { - "targetName": "typecheck" - }, + "typecheck": { "targetName": "typecheck" }, "build": { "targetName": "build", "configName": "tsconfig.lib.json", @@ -29,12 +27,7 @@ }, "exclude": ["tests/*"] }, - { - "plugin": "@nx/eslint/plugin", - "options": { - "targetName": "lint" - } - }, + { "plugin": "@nx/eslint/plugin", "options": { "targetName": "lint" } }, { "plugin": "@nx/vite/plugin", "options": { @@ -52,22 +45,13 @@ { "plugin": "@nx/js/typescript", "include": ["tests/*"], - "options": { - "typecheck": { - "targetName": "typecheck" - } - } + "options": { "typecheck": { "targetName": "typecheck" } } } ], - "targetDefaults": { - "test": { - "dependsOn": ["^build"] - } - }, + "targetDefaults": { "test": { "dependsOn": ["^build"] } }, "release": { "projects": ["!utils", "!@effect-firebase/source"], - "version": { - "preVersionCommand": "pnpm dlx nx run-many -t build" - } - } + "version": { "preVersionCommand": "pnpm dlx nx run-many -t build" } + }, + "nxCloudId": "68e6b41204d3d892e997c97b" } From 636d30bec40b9a9f6b3685bb2f80a74291304f7d Mon Sep 17 00:00:00 2001 From: Frederik Wallner Date: Wed, 8 Oct 2025 21:02:57 +0200 Subject: [PATCH 2/8] Enable task distribution --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 24a3dede..74f6a3e8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: # Run this command as early as possible, before dependencies are installed # Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun # Uncomment this line to enable task distribution - # - run: pnpm dlx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build" + - run: pnpm dlx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build" # Cache node_modules - uses: actions/setup-node@v4 From c9cc0297552be077e91de72040ec30a3f0d6aa5f Mon Sep 17 00:00:00 2001 From: Frederik Wallner Date: Wed, 8 Oct 2025 21:14:53 +0200 Subject: [PATCH 3/8] Fix tests and lint errors --- example/backend/project.json | 1 - example/backend/src/lib/backend.ts | 5 +-- example/backend/src/lib/on-request.ts | 17 ---------- packages/admin/eslint.config.mjs | 4 +-- packages/admin/package.json | 4 ++- .../src/lib/firebase/firestore-service.ts | 2 +- packages/admin/tsconfig.spec.json | 34 ------------------- packages/admin/vite.config.ts | 23 ------------- packages/client/tsconfig.spec.json | 34 ------------------- packages/client/vite.config.ts | 23 ------------- packages/effect-firebase/tsconfig.spec.json | 34 ------------------- packages/effect-firebase/vite.config.ts | 23 ------------- .../src/lib/firestore/types/timestamp.spec.ts | 8 +++++ 13 files changed, 15 insertions(+), 197 deletions(-) delete mode 100644 example/backend/src/lib/on-request.ts delete mode 100644 packages/admin/tsconfig.spec.json delete mode 100644 packages/admin/vite.config.ts delete mode 100644 packages/client/tsconfig.spec.json delete mode 100644 packages/client/vite.config.ts delete mode 100644 packages/effect-firebase/tsconfig.spec.json delete mode 100644 packages/effect-firebase/vite.config.ts create mode 100644 packages/mock/src/lib/firestore/types/timestamp.spec.ts diff --git a/example/backend/project.json b/example/backend/project.json index 7bf9061b..1b1edef9 100644 --- a/example/backend/project.json +++ b/example/backend/project.json @@ -17,7 +17,6 @@ "platform": "node", "format": ["esm"], "bundle": true, - "generatePackageJson": true, "assets": [ { "glob": "example/backend/README.md", diff --git a/example/backend/src/lib/backend.ts b/example/backend/src/lib/backend.ts index 8d6a37e0..8940ac20 100644 --- a/example/backend/src/lib/backend.ts +++ b/example/backend/src/lib/backend.ts @@ -2,7 +2,6 @@ import { HttpsFunction, HttpsOptions, Request, - onCall, onRequest, } from 'firebase-functions/v2/https'; import { Response } from 'express'; @@ -12,7 +11,7 @@ import { logger } from 'firebase-functions'; function makeRuntime() { const cloudLogger = Logger.replace( Logger.defaultLogger, - Logger.make(({ logLevel, message }) => { + Logger.make(({ message }) => { logger.log(message); }) ); @@ -36,8 +35,6 @@ function onRequestEffect( }); } -function onCallEffect() {} - export const functionB = onRequestEffect( { region: 'europe-north1', diff --git a/example/backend/src/lib/on-request.ts b/example/backend/src/lib/on-request.ts deleted file mode 100644 index 301a5c2f..00000000 --- a/example/backend/src/lib/on-request.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Effect } from 'effect'; -import { - HttpsFunction, - HttpsOptions, - onRequest, -} from 'firebase-functions/https'; -import { run } from './runner.js'; - -function onRequestEffect( - options: HttpsOptions, - handler: (request: Request, response: Response) => Effect.Effect -): HttpsFunction { - return onRequest(options, async (request, response) => { - const result = await run(handler(request, response)); - response.send(result); - }); -} diff --git a/packages/admin/eslint.config.mjs b/packages/admin/eslint.config.mjs index 0803ef73..518b8c18 100644 --- a/packages/admin/eslint.config.mjs +++ b/packages/admin/eslint.config.mjs @@ -9,14 +9,14 @@ export default [ { files: ['*.json'], languageOptions: { - parser: jsoncEslintParser, + parser: await import('jsonc-eslint-parser'), }, rules: { '@nx/dependency-checks': [ 'error', { ignoredFiles: ['{projectRoot}/eslint.config.{js,cjs,mjs,ts,cts,mts}'], - ignoredDependencies: ['@effect-firebase/core'], + ignoredDependencies: ['effect-firebase'], }, ], }, diff --git a/packages/admin/package.json b/packages/admin/package.json index 37bdb123..d27f17e8 100644 --- a/packages/admin/package.json +++ b/packages/admin/package.json @@ -19,6 +19,8 @@ "!**/*.tsbuildinfo" ], "dependencies": { - "tslib": "^2.3.0" + "tslib": "^2.3.0", + "effect": "^3.17.3", + "firebase-admin": "^13.4.0" } } diff --git a/packages/admin/src/lib/firebase/firestore-service.ts b/packages/admin/src/lib/firebase/firestore-service.ts index a66741aa..5752af21 100644 --- a/packages/admin/src/lib/firebase/firestore-service.ts +++ b/packages/admin/src/lib/firebase/firestore-service.ts @@ -9,7 +9,7 @@ import { export const layer = () => Layer.succeed(FirestoreService, { - get: (path: string) => { + get: () => { return Effect.succeed(getFirestore()); }, convertToTimestamp: (date: Date) => { diff --git a/packages/admin/tsconfig.spec.json b/packages/admin/tsconfig.spec.json deleted file mode 100644 index f68d9d3b..00000000 --- a/packages/admin/tsconfig.spec.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "outDir": "./out-tsc/vitest", - "types": [ - "vitest/globals", - "vitest/importMeta", - "vite/client", - "node", - "vitest" - ], - "forceConsistentCasingInFileNames": true - }, - "include": [ - "vite.config.ts", - "vite.config.mts", - "vitest.config.ts", - "vitest.config.mts", - "src/**/*.test.ts", - "src/**/*.spec.ts", - "src/**/*.test.tsx", - "src/**/*.spec.tsx", - "src/**/*.test.js", - "src/**/*.spec.js", - "src/**/*.test.jsx", - "src/**/*.spec.jsx", - "src/**/*.d.ts" - ], - "references": [ - { - "path": "./tsconfig.lib.json" - } - ] -} diff --git a/packages/admin/vite.config.ts b/packages/admin/vite.config.ts deleted file mode 100644 index 8607bd7f..00000000 --- a/packages/admin/vite.config.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { defineConfig } from 'vite'; - -export default defineConfig(() => ({ - root: __dirname, - cacheDir: '../../node_modules/.vite/packages/client', - plugins: [], - // Uncomment this if you are using workers. - // worker: { - // plugins: [ nxViteTsPaths() ], - // }, - test: { - name: '@effect-firebase/admin', - watch: false, - globals: true, - environment: 'node', - include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - reporters: ['default'], - coverage: { - reportsDirectory: './test-output/vitest/coverage', - provider: 'v8' as const, - }, - }, -})); diff --git a/packages/client/tsconfig.spec.json b/packages/client/tsconfig.spec.json deleted file mode 100644 index f68d9d3b..00000000 --- a/packages/client/tsconfig.spec.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "outDir": "./out-tsc/vitest", - "types": [ - "vitest/globals", - "vitest/importMeta", - "vite/client", - "node", - "vitest" - ], - "forceConsistentCasingInFileNames": true - }, - "include": [ - "vite.config.ts", - "vite.config.mts", - "vitest.config.ts", - "vitest.config.mts", - "src/**/*.test.ts", - "src/**/*.spec.ts", - "src/**/*.test.tsx", - "src/**/*.spec.tsx", - "src/**/*.test.js", - "src/**/*.spec.js", - "src/**/*.test.jsx", - "src/**/*.spec.jsx", - "src/**/*.d.ts" - ], - "references": [ - { - "path": "./tsconfig.lib.json" - } - ] -} diff --git a/packages/client/vite.config.ts b/packages/client/vite.config.ts deleted file mode 100644 index 3450837f..00000000 --- a/packages/client/vite.config.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { defineConfig } from 'vite'; - -export default defineConfig(() => ({ - root: __dirname, - cacheDir: '../../node_modules/.vite/packages/client', - plugins: [], - // Uncomment this if you are using workers. - // worker: { - // plugins: [ nxViteTsPaths() ], - // }, - test: { - name: '@effect-firebase/client', - watch: false, - globals: true, - environment: 'node', - include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - reporters: ['default'], - coverage: { - reportsDirectory: './test-output/vitest/coverage', - provider: 'v8' as const, - }, - }, -})); diff --git a/packages/effect-firebase/tsconfig.spec.json b/packages/effect-firebase/tsconfig.spec.json deleted file mode 100644 index f68d9d3b..00000000 --- a/packages/effect-firebase/tsconfig.spec.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "outDir": "./out-tsc/vitest", - "types": [ - "vitest/globals", - "vitest/importMeta", - "vite/client", - "node", - "vitest" - ], - "forceConsistentCasingInFileNames": true - }, - "include": [ - "vite.config.ts", - "vite.config.mts", - "vitest.config.ts", - "vitest.config.mts", - "src/**/*.test.ts", - "src/**/*.spec.ts", - "src/**/*.test.tsx", - "src/**/*.spec.tsx", - "src/**/*.test.js", - "src/**/*.spec.js", - "src/**/*.test.jsx", - "src/**/*.spec.jsx", - "src/**/*.d.ts" - ], - "references": [ - { - "path": "./tsconfig.lib.json" - } - ] -} diff --git a/packages/effect-firebase/vite.config.ts b/packages/effect-firebase/vite.config.ts deleted file mode 100644 index 65933195..00000000 --- a/packages/effect-firebase/vite.config.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { defineConfig } from 'vite'; - -export default defineConfig(() => ({ - root: __dirname, - cacheDir: '../../node_modules/.vite/packages/effect-firebase', - plugins: [], - // Uncomment this if you are using workers. - // worker: { - // plugins: [ nxViteTsPaths() ], - // }, - test: { - name: 'effect-firebase', - watch: false, - globals: true, - environment: 'node', - include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - reporters: ['default'], - coverage: { - reportsDirectory: './test-output/vitest/coverage', - provider: 'v8' as const, - }, - }, -})); diff --git a/packages/mock/src/lib/firestore/types/timestamp.spec.ts b/packages/mock/src/lib/firestore/types/timestamp.spec.ts new file mode 100644 index 00000000..4f686e65 --- /dev/null +++ b/packages/mock/src/lib/firestore/types/timestamp.spec.ts @@ -0,0 +1,8 @@ +import { MockTimestamp } from './timestamp.js'; + +describe('MockTimestamp', () => { + it('should be able to create a timestamp', () => { + const timestamp = MockTimestamp.now(); + expect(timestamp).toBeDefined(); + }); +}); From 1ee6470d21eeecdd9707948333ee8a79aa2a1b5c Mon Sep 17 00:00:00 2001 From: Frederik Wallner Date: Wed, 8 Oct 2025 21:16:29 +0200 Subject: [PATCH 4/8] Update lockfile --- pnpm-lock.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ab33811..d6176c0c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -171,6 +171,12 @@ importers: packages/admin: dependencies: + effect: + specifier: ^3.17.3 + version: 3.17.3 + firebase-admin: + specifier: ^13.4.0 + version: 13.4.0(encoding@0.1.13) tslib: specifier: ^2.3.0 version: 2.8.1 From 61cdaf66eb02c1b5da67bd494f27dbcd0a67fa83 Mon Sep 17 00:00:00 2001 From: Frederik Wallner Date: Wed, 8 Oct 2025 21:23:57 +0200 Subject: [PATCH 5/8] Add effect dev dependencies --- packages/admin/package.json | 3 +++ packages/client/package.json | 3 +++ packages/mock/package.json | 3 ++- pnpm-lock.yaml | 11 +++++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/admin/package.json b/packages/admin/package.json index d27f17e8..b6f6dec3 100644 --- a/packages/admin/package.json +++ b/packages/admin/package.json @@ -22,5 +22,8 @@ "tslib": "^2.3.0", "effect": "^3.17.3", "firebase-admin": "^13.4.0" + }, + "devDependencies": { + "effect-firebase": "workspace:*" } } diff --git a/packages/client/package.json b/packages/client/package.json index 742da653..ff2ef543 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -20,5 +20,8 @@ ], "dependencies": { "tslib": "^2.3.0" + }, + "devDependencies": { + "effect-firebase": "workspace:*" } } diff --git a/packages/mock/package.json b/packages/mock/package.json index 6acfb73a..d92f0a0c 100644 --- a/packages/mock/package.json +++ b/packages/mock/package.json @@ -23,6 +23,7 @@ "tslib": "^2.3.0" }, "devDependencies": { - "vite": "^7.0.0" + "vite": "^7.0.0", + "effect-firebase": "workspace:*" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d6176c0c..62619b0d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -180,12 +180,20 @@ importers: tslib: specifier: ^2.3.0 version: 2.8.1 + devDependencies: + effect-firebase: + specifier: workspace:* + version: link:../effect-firebase packages/client: dependencies: tslib: specifier: ^2.3.0 version: 2.8.1 + devDependencies: + effect-firebase: + specifier: workspace:* + version: link:../effect-firebase packages/effect-firebase: dependencies: @@ -202,6 +210,9 @@ importers: specifier: ^2.3.0 version: 2.8.1 devDependencies: + effect-firebase: + specifier: workspace:* + version: link:../effect-firebase vite: specifier: ^7.0.0 version: 7.1.8(@types/node@22.17.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.0) From 8953293c02277cb45dfa7168179249b8b5769dfa Mon Sep 17 00:00:00 2001 From: "nx-cloud[bot]" <71083854+nx-cloud[bot]@users.noreply.github.com> Date: Wed, 8 Oct 2025 19:35:53 +0000 Subject: [PATCH 6/8] Add effect-firebase dependencies to tests package --- tests/package.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/package.json b/tests/package.json index d56cccc6..6960080d 100644 --- a/tests/package.json +++ b/tests/package.json @@ -13,5 +13,9 @@ }, "./package.json": "./package.json" }, - "dependencies": {} + "dependencies": {}, + "devDependencies": { + "effect-firebase": "workspace:*", + "@effect-firebase/mock": "workspace:*" + } } From 793a64408f63c63d7ef779db45907c32c4a9ac47 Mon Sep 17 00:00:00 2001 From: Frederik Wallner Date: Wed, 8 Oct 2025 21:37:34 +0200 Subject: [PATCH 7/8] Update lockfile --- pnpm-lock.yaml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 62619b0d..908a1e5e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -217,7 +217,14 @@ importers: specifier: ^7.0.0 version: 7.1.8(@types/node@22.17.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.0) - tests: {} + tests: + devDependencies: + '@effect-firebase/mock': + specifier: workspace:* + version: link:../packages/mock + effect-firebase: + specifier: workspace:* + version: link:../packages/effect-firebase packages: From eeda333e0afbafe5d05ad7a9559cb37ffb903fab Mon Sep 17 00:00:00 2001 From: Frederik Wallner Date: Wed, 8 Oct 2025 21:40:06 +0200 Subject: [PATCH 8/8] Formatting and ignore lock --- .prettierignore | 3 ++- tests/src/lib/firestore/schema/date.spec.ts | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.prettierignore b/.prettierignore index e26f0b3f..63c387c9 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,4 +2,5 @@ /dist /coverage /.nx/cache -/.nx/workspace-data \ No newline at end of file +/.nx/workspace-data +pnpm-lock.yaml diff --git a/tests/src/lib/firestore/schema/date.spec.ts b/tests/src/lib/firestore/schema/date.spec.ts index 3acaa671..d818f83f 100644 --- a/tests/src/lib/firestore/schema/date.spec.ts +++ b/tests/src/lib/firestore/schema/date.spec.ts @@ -1,7 +1,6 @@ import { Effect, Schema } from 'effect'; import { describe, it, expect } from '@effect/vitest'; -import { DateFromFirestore, - UnexpectedTypeError, } from 'effect-firebase'; +import { DateFromFirestore, UnexpectedTypeError } from 'effect-firebase'; import { firestoreService } from '@effect-firebase/mock'; describe('DateFromFirestore', () => {