diff --git a/.gitignore b/.gitignore index 9a937f0..36e0153 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,8 @@ out/ # Local tool distributions .tooling/ + +# Node workspace artifacts +node_modules/ +packages/*/node_modules/ +packages/*/dist/ diff --git a/README.md b/README.md index 4de51da..61c98ce 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,15 @@ Requirements: - Java 17+ - Gradle 8+ +## Node Adapter Status + +Node.js adapter work is tracked in issue `#106` and lives under `packages/memory-server`. + +Current state: +- package scaffold exists (`@jongodb/memory-server`) +- runtime process manager is in progress (`#108`) +- Jest/Vitest helpers and compatibility smoke suites are planned (`#109`, `#110`) + ## Transaction Contract (Current) Supported in current scope: diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..0c7b2eb --- /dev/null +++ b/package-lock.json @@ -0,0 +1,57 @@ +{ + "name": "jongodb-workspace", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "jongodb-workspace", + "workspaces": [ + "packages/*" + ] + }, + "node_modules/@jongodb/memory-server": { + "resolved": "packages/memory-server", + "link": true + }, + "node_modules/@types/node": { + "version": "20.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz", + "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==", + "dev": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true + }, + "packages/memory-server": { + "name": "@jongodb/memory-server", + "version": "0.0.0-development", + "license": "Apache-2.0", + "devDependencies": { + "@types/node": "^20.17.57", + "typescript": "^5.9.2" + }, + "engines": { + "node": ">=20" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c10fd1f --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "name": "jongodb-workspace", + "private": true, + "description": "Workspace scripts for jongodb Node adapter packages.", + "workspaces": [ + "packages/*" + ], + "scripts": { + "node:build": "npm run --workspace @jongodb/memory-server build", + "node:test": "npm run --workspace @jongodb/memory-server test", + "node:typecheck": "npm run --workspace @jongodb/memory-server typecheck" + } +} diff --git a/packages/memory-server/README.md b/packages/memory-server/README.md new file mode 100644 index 0000000..d4a39f9 --- /dev/null +++ b/packages/memory-server/README.md @@ -0,0 +1,18 @@ +# @jongodb/memory-server + +Node.js adapter package for starting a `jongodb` test server and obtaining a MongoDB URI. + +Current status: +- package scaffold is in place +- runtime process manager is tracked in issue `#108` + +## Local Commands + +From repository root: + +```bash +npm ci +npm run node:build +npm run node:typecheck +npm run node:test +``` diff --git a/packages/memory-server/package.json b/packages/memory-server/package.json new file mode 100644 index 0000000..0cf877b --- /dev/null +++ b/packages/memory-server/package.json @@ -0,0 +1,34 @@ +{ + "name": "@jongodb/memory-server", + "version": "0.0.0-development", + "description": "Node.js launcher for jongodb in-memory server", + "keywords": [ + "mongodb", + "mongodb-memory-server", + "jongodb", + "integration-test", + "jest", + "vitest" + ], + "license": "Apache-2.0", + "type": "module", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "files": [ + "dist" + ], + "engines": { + "node": ">=20" + }, + "scripts": { + "build": "tsc -p tsconfig.json", + "clean": "rm -rf dist", + "typecheck": "tsc -p tsconfig.json --noEmit", + "pretest": "npm run build", + "test": "node --test dist/test/*.test.js" + }, + "devDependencies": { + "@types/node": "^20.17.57", + "typescript": "^5.9.2" + } +} diff --git a/packages/memory-server/src/index.ts b/packages/memory-server/src/index.ts new file mode 100644 index 0000000..31acc6c --- /dev/null +++ b/packages/memory-server/src/index.ts @@ -0,0 +1,28 @@ +export interface JongodbMemoryServerOptions { + host?: string; + port?: number; + databaseName?: string; + startupTimeoutMs?: number; + logLevel?: "silent" | "info" | "debug"; +} + +export interface JongodbMemoryServer { + readonly uri: string; + stop(): Promise; +} + +function notImplementedError(): Error { + return new Error( + "Runtime process manager is not implemented yet. Track progress in issue #108." + ); +} + +/** + * Starts a local jongodb-backed MongoDB-compatible endpoint for tests. + * Runtime process lifecycle is implemented in issue #108. + */ +export async function startJongodbMemoryServer( + _options: JongodbMemoryServerOptions = {} +): Promise { + throw notImplementedError(); +} diff --git a/packages/memory-server/src/test/scaffold.test.ts b/packages/memory-server/src/test/scaffold.test.ts new file mode 100644 index 0000000..cf0fcbc --- /dev/null +++ b/packages/memory-server/src/test/scaffold.test.ts @@ -0,0 +1,10 @@ +import { test } from "node:test"; +import assert from "node:assert/strict"; + +import { startJongodbMemoryServer } from "../index.js"; + +test("startJongodbMemoryServer is scaffolded and explicitly not implemented", async () => { + await assert.rejects(async () => { + await startJongodbMemoryServer(); + }, /not implemented/i); +}); diff --git a/packages/memory-server/tsconfig.json b/packages/memory-server/tsconfig.json new file mode 100644 index 0000000..0753a87 --- /dev/null +++ b/packages/memory-server/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "declaration": true, + "declarationMap": true, + "strict": true, + "rootDir": "src", + "outDir": "dist", + "types": [ + "node" + ], + "skipLibCheck": true + }, + "include": [ + "src/**/*.ts" + ] +}