{"_id":"longcelot-sheet-db","_rev":"44-005f333e76dcf48cd099eacb6f66fcea","name":"longcelot-sheet-db","dist-tags":{"latest":"0.1.48"},"versions":{"0.1.0":{"name":"longcelot-sheet-db","version":"0.1.0","keywords":["google-sheets","database","staging","adapter","schema"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.0","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"988723dbdbd7c29d8c002bdec059b993e05a4a01","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.0.tgz","fileCount":97,"integrity":"sha512-dWXv21Zf1UFg2/rllpKCHArfm250bA8vsRq4W132VuzgEznpkwvhg/Hrjva+hSNOKxYlHn7rCkwZDoZBYACh0g==","signatures":[{"sig":"MEQCIFWkCn/eiRdeFiyskkE6NTLMvrg2LjhUzIXvsniuYiE/AiASwA6zwS2xG1xSaMeBYSsfa5VtwayRE+Xwuf+txSsEnA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":155005},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"f14ee8bb043994c01817c98a0251156fe9ba5875","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.3","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.19.0","dependencies":{"zod":"^4.3.6","chalk":"^4.1.2","nanoid":"^3.3.7","bcryptjs":"^2.4.3","inquirer":"^8.2.6","commander":"^11.1.0","googleapis":"^128.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","jsdom":"^28.1.0","eslint":"^10.0.0","ts-jest":"^29.4.6","prettier":"^3.8.1","typescript":"^5.3.3","@types/jest":"^30.0.0","@types/node":"^20.10.5","lint-staged":"^16.2.7","@types/bcryptjs":"^2.4.6","@types/inquirer":"^8.2.10","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.0_1772187960821_0.9354641275056088","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"longcelot-sheet-db","version":"0.1.2","keywords":["google-sheets","database","staging","adapter","schema"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.2","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"785288006aca9019586be226472d4556ee14d5d2","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.2.tgz","fileCount":97,"integrity":"sha512-R7onSu8G2E4Br+9HYa5N2LWYODSxm5jofeg2o7wX4LMlXkTvNVMdJSD8e8b7NSFo2mvI8QygcNN2/VW1TdLIRg==","signatures":[{"sig":"MEQCIHx6IzQLTDgrZF8NSYBXU6NSmmHre1lUkOOGEDIH2803AiBCZZV0A2HE2p3u1zNprnHgApZizaJIjMYqCgXzXYLvgg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":155019},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.2.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/94a9ae3e078df34b2bf85bdb1ccc9437/longcelot-sheet-db-0.1.2.tgz","_integrity":"sha512-R7onSu8G2E4Br+9HYa5N2LWYODSxm5jofeg2o7wX4LMlXkTvNVMdJSD8e8b7NSFo2mvI8QygcNN2/VW1TdLIRg==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.8.2","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^4.3.6","chalk":"^4.1.2","nanoid":"^3.3.7","bcryptjs":"^2.4.3","inquirer":"^8.2.6","commander":"^11.1.0","googleapis":"^128.0.0","google-auth-library":"^9.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","jsdom":"^28.1.0","eslint":"^9.39.3","ts-jest":"^29.4.6","prettier":"^3.8.1","typescript":"^5.3.3","@types/jest":"^30.0.0","@types/node":"^20.10.5","lint-staged":"^16.2.7","@types/bcryptjs":"^2.4.6","@types/inquirer":"^8.2.10","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.2_1772243483058_0.09059167126848755","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"longcelot-sheet-db","version":"0.1.3","keywords":["google-sheets","database","staging","adapter","schema"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.3","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"355ce5192af06a52d74f32f8638c2aa8f2cfc5ea","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.3.tgz","fileCount":97,"integrity":"sha512-UMMMYQHao0crqyIAx/1Bw2xqph7PGRgQjclaSzrb8GyUKXH7e0LqOlPKD9oCgR1SJnA40nl/8T7ojSGb2qMZMA==","signatures":[{"sig":"MEYCIQCvbPFbizlmRr9OHzaKPFy17lpw/6vS3eqljDRqR68zKgIhAMES5KZ0lzAIW1++r9hO5wKzojC5IFh8+9jl8hX7OdVm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":157043},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.3.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/5a4c9e0e5601359e102e37d2174e4ec5/longcelot-sheet-db-0.1.3.tgz","_integrity":"sha512-UMMMYQHao0crqyIAx/1Bw2xqph7PGRgQjclaSzrb8GyUKXH7e0LqOlPKD9oCgR1SJnA40nl/8T7ojSGb2qMZMA==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.8.2","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^4.3.6","chalk":"^4.1.2","nanoid":"^3.3.7","bcryptjs":"^2.4.3","inquirer":"^8.2.6","commander":"^11.1.0","googleapis":"^128.0.0","google-auth-library":"^9.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","jsdom":"^28.1.0","eslint":"^9.39.3","ts-jest":"^29.4.6","prettier":"^3.8.1","typescript":"^5.3.3","@types/jest":"^30.0.0","@types/node":"^20.10.5","lint-staged":"^16.2.7","@types/bcryptjs":"^2.4.6","@types/inquirer":"^8.2.10","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.3_1772248121763_0.06427164905496197","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"longcelot-sheet-db","version":"0.1.4","keywords":["google-sheets","database","staging","adapter","schema"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.4","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"9b0c348fb18b38a57aab5a2b7d15c82b44fcb6a1","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.4.tgz","fileCount":97,"integrity":"sha512-5UDBdg/0GKspw+Scb3zLhrkr7lsbGSbozCtBjGOf9kYG/Ai1bnyNne2KI+jpJlTYC9dPB5tUWYsqcYBEC5grpg==","signatures":[{"sig":"MEUCIQDLs6ZDk82ZgbBD6iOhYXbsXXGM4uc2AvlifaZInwpitwIgUMwSnA1AUdH1vrq2BeH8461NT9+G0cmu9hWeFqiE+Cw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156882},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.4.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/4143902b4c3636e18f432cc2eea50d8e/longcelot-sheet-db-0.1.4.tgz","_integrity":"sha512-5UDBdg/0GKspw+Scb3zLhrkr7lsbGSbozCtBjGOf9kYG/Ai1bnyNne2KI+jpJlTYC9dPB5tUWYsqcYBEC5grpg==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.8.2","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^4.3.6","chalk":"^4.1.2","nanoid":"^3.3.7","bcryptjs":"^2.4.3","inquirer":"^8.2.6","commander":"^11.1.0","googleapis":"^128.0.0","google-auth-library":"^9.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","jsdom":"^28.1.0","eslint":"^9.39.3","ts-jest":"^29.4.6","prettier":"^3.8.1","typescript":"^5.3.3","@types/jest":"^30.0.0","@types/node":"^20.10.5","lint-staged":"^16.2.7","@types/bcryptjs":"^2.4.6","@types/inquirer":"^8.2.10","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.4_1772249162242_0.48195737887909984","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"longcelot-sheet-db","version":"0.1.5","keywords":["google-sheets","database","staging","adapter","schema"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.5","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"2516a528941d2a1679847f19c6c66265b8604cec","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.5.tgz","fileCount":97,"integrity":"sha512-JB/wtu9gur5thXwvkGsdbc8ZuO7Sv+XiFUABSYsstJAwQsvhhK+RGv+BE+23qnPvbCzQefCeNVISB/405tNg3w==","signatures":[{"sig":"MEYCIQCIf4/pM7hmYnWXdefXWaw/+duqSQFXyy7YuXohm0ReHgIhAN6zRF1NPYRNNn8f57WwBLKKJZD17N4X/9eithR33A/i","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":156882},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.5.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/11c4c1844484cf190666dc79293722ef/longcelot-sheet-db-0.1.5.tgz","_integrity":"sha512-JB/wtu9gur5thXwvkGsdbc8ZuO7Sv+XiFUABSYsstJAwQsvhhK+RGv+BE+23qnPvbCzQefCeNVISB/405tNg3w==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.8.2","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^4.3.6","chalk":"^4.1.2","nanoid":"^3.3.7","bcryptjs":"^2.4.3","inquirer":"^8.2.6","commander":"^11.1.0","googleapis":"^128.0.0","google-auth-library":"^9.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","jsdom":"^28.1.0","eslint":"^9.39.3","ts-jest":"^29.4.6","prettier":"^3.8.1","typescript":"^5.3.3","@types/jest":"^30.0.0","@types/node":"^20.10.5","lint-staged":"^16.2.7","@types/bcryptjs":"^2.4.6","@types/inquirer":"^8.2.10","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.5_1772249265882_0.4022256979005965","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"longcelot-sheet-db","version":"0.1.7","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.7","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"5bb813b7adab5ba2d3027a7b708c7550f6208873","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.7.tgz","fileCount":106,"integrity":"sha512-xtovSM5ARWQFeazlORHbDlFzUQz3IL3lqSJxiye4BHvDi/r3ibeSzqW6FaVbF0uR2+xgfRVPRimWp1T9Cnnlxw==","signatures":[{"sig":"MEUCIA7rgjlPklmqGFi7qGUTIUPe7wNIeusEvw4Sl2P9FEIEAiEArmeBU1LZi2y9P7ttABYoooZ8ahAGh8wxu1t81N87G/I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208519},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.7.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/26f9c4ed1104c7225ddb473d125a1c14/longcelot-sheet-db-0.1.7.tgz","_integrity":"sha512-xtovSM5ARWQFeazlORHbDlFzUQz3IL3lqSJxiye4BHvDi/r3ibeSzqW6FaVbF0uR2+xgfRVPRimWp1T9Cnnlxw==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.8.2","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"20.20.1","dependencies":{"zod":"^4.3.6","chalk":"^4.1.2","nanoid":"^3.3.7","bcryptjs":"^2.4.3","inquirer":"^8.2.6","commander":"^11.1.0","googleapis":"^128.0.0","google-auth-library":"^9.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","jsdom":"^28.1.0","eslint":"^9.39.3","ts-jest":"^29.4.6","prettier":"^3.8.1","typescript":"^5.3.3","@types/jest":"^30.0.0","@types/node":"^20.10.5","lint-staged":"^16.2.7","@types/bcryptjs":"^2.4.6","@types/inquirer":"^8.2.10","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.7_1774450204616_0.12139793368282636","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"longcelot-sheet-db","version":"0.1.8","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.8","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"18352c348d2e6f64813d9f353f01a71a3d05742d","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.8.tgz","fileCount":110,"integrity":"sha512-sgZSK66FqcQVNaG9cINxWRLyQU5gdqclCb1PCKXvrpZmLrJL8FhdlaTYYcbRRc0T3rWq28WBY5W9ykb7xBX3Vw==","signatures":[{"sig":"MEUCIFrZ51vKUJhzFc12kAtJIVVzy+MdzNXvIF4f3fEegyjOAiEA/XKtMSO4Un5MgjT5iBMlLuedWYdqgdtT97nGVXZOWPw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":232523},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.8.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/26b3db774993222e116defdeb43a4543/longcelot-sheet-db-0.1.8.tgz","_integrity":"sha512-sgZSK66FqcQVNaG9cINxWRLyQU5gdqclCb1PCKXvrpZmLrJL8FhdlaTYYcbRRc0T3rWq28WBY5W9ykb7xBX3Vw==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.8.2","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^4.3.6","chalk":"^4.1.2","nanoid":"^3.3.7","bcryptjs":"^2.4.3","inquirer":"^8.2.6","commander":"^11.1.0","googleapis":"^128.0.0","google-auth-library":"^9.15.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","husky":"^9.1.7","jsdom":"^28.1.0","eslint":"^9.39.3","ts-jest":"^29.4.6","prettier":"^3.8.1","typescript":"^5.3.3","@types/jest":"^30.0.0","@types/node":"^20.10.5","lint-staged":"^16.2.7","@types/bcryptjs":"^2.4.6","@types/inquirer":"^8.2.10","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.56.0","@typescript-eslint/eslint-plugin":"^8.56.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.8_1777824355482_0.689571554977116","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"longcelot-sheet-db","version":"0.1.11","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.11","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"7c3340526c057c2421a2fb0b2c7d8b41a6e4db3a","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.11.tgz","fileCount":118,"integrity":"sha512-yoYNkij6LZafVCvMm4lvmJ9lHQOAa6OwH6hjKlLPC/sjwcjhY9/rnwhEZNaG5iRtPcO09UtFPPdm7GCwQMN70A==","signatures":[{"sig":"MEYCIQDNgk24vmKeKFETu1E06dnjDkFbXzoHz5Z/+nUGRS/jjwIhAMlU4cTI3E4PLAN16nW1qT5YVW4gqWAKROyzkS+QgJEe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":269419},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.11.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/d02def4615fbf76df58b6f330462581c/longcelot-sheet-db-0.1.11.tgz","_integrity":"sha512-yoYNkij6LZafVCvMm4lvmJ9lHQOAa6OwH6hjKlLPC/sjwcjhY9/rnwhEZNaG5iRtPcO09UtFPPdm7GCwQMN70A==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.11_1779733611067_0.9879543885480002","host":"s3://npm-registry-packages-npm-production"}},"0.1.12":{"name":"longcelot-sheet-db","version":"0.1.12","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.12","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"89b019ef2f15f5c3bfa2fc67ee3910bf56e332e5","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.12.tgz","fileCount":118,"integrity":"sha512-wq6GKBwqHz3YqXDzBw+eREIbnJpZp1k2mTHU915WfzxZK9Szw/X8y5up2Wu3zUQhZF885MtHEjuPJxLRiC3z7A==","signatures":[{"sig":"MEUCIGoyGTmYV89PxYkVMEtqYcdeV7am5xC5qvU778WSQDZpAiEA9aAtoPQzIfQXwFdoMXUcrpJd4/MJ37vSNQ/Y8eZED/8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":276659},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.12.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/70414e342098d79dc1fa7404f8f5c01c/longcelot-sheet-db-0.1.12.tgz","_integrity":"sha512-wq6GKBwqHz3YqXDzBw+eREIbnJpZp1k2mTHU915WfzxZK9Szw/X8y5up2Wu3zUQhZF885MtHEjuPJxLRiC3z7A==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.12_1779768248185_0.897334191414165","host":"s3://npm-registry-packages-npm-production"}},"0.1.13":{"name":"longcelot-sheet-db","version":"0.1.13","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.13","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"8d0670c2fd10a934c75a905426ae62d8ce1ac6f6","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.13.tgz","fileCount":122,"integrity":"sha512-c3VXNxGrAkyYnqW6YLofaGkUaiL4R3+nYj4HucYNayPeDOmZfr2grrDkbvyjnp36/ibh/i+1FMuyp0Rw/CoFOA==","signatures":[{"sig":"MEQCIHi+VyRDE7UgWbn6amm6Ct9z9QJhA+a4VJqn3nObpP4BAiA2bQrwbD3OrD1mMFOdRzooSXtzxGTOnxy6eWXq30itag==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":299795},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.13.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/04edebe4ae5cd6d96b407872d60fe38a/longcelot-sheet-db-0.1.13.tgz","_integrity":"sha512-c3VXNxGrAkyYnqW6YLofaGkUaiL4R3+nYj4HucYNayPeDOmZfr2grrDkbvyjnp36/ibh/i+1FMuyp0Rw/CoFOA==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.13_1779774771206_0.9739497264679733","host":"s3://npm-registry-packages-npm-production"}},"0.1.14":{"name":"longcelot-sheet-db","version":"0.1.14","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.14","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"71e80a8d532945e0b64b73ed705a39210a29270c","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.14.tgz","fileCount":122,"integrity":"sha512-hHRUc3/39itH9yihFbfNHpBPNjue/SMpQdrE4VtFoBv2Ma1J+PgQtpX9qFo6r+HBy2TAx0kk6JrVGfUwdNg/Qw==","signatures":[{"sig":"MEYCIQDCQCBjoMw5/ZUxlRkAWYoze4DKNtClshnhMq6IuprBnAIhANee6s9BZmEghVS7JxTKv1yqiU8dNlvn4rZINeJdeJ4Q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":299795},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.14.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/d352e8e6c25cb8dbb40881a3fce8aba5/longcelot-sheet-db-0.1.14.tgz","_integrity":"sha512-hHRUc3/39itH9yihFbfNHpBPNjue/SMpQdrE4VtFoBv2Ma1J+PgQtpX9qFo6r+HBy2TAx0kk6JrVGfUwdNg/Qw==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.14_1779775936955_0.010951497287786216","host":"s3://npm-registry-packages-npm-production"}},"0.1.15":{"name":"longcelot-sheet-db","version":"0.1.15","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.15","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"bdee4ecbb3d83675772657cd3d06759d51c443c4","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.15.tgz","fileCount":122,"integrity":"sha512-ouw5IqESYkD4z7wW4d0clZKKoCL59dkYNCMw5afTp3g/JcfXsqkRPBmHWJf/szBIUDkIz3rfeoHcXu8zoPPVXA==","signatures":[{"sig":"MEUCIQD4/nxH0ttDyqIvVxq/kKscgNzQvwQBPvUFv/nFGO+tvgIgZF9xMx+YVuC3AeUpoJRluBeSMsS8SyNKUcGnzx4FM6M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":300102},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.15.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/16a4d72b3011dd77af55f72b3ae42b52/longcelot-sheet-db-0.1.15.tgz","_integrity":"sha512-ouw5IqESYkD4z7wW4d0clZKKoCL59dkYNCMw5afTp3g/JcfXsqkRPBmHWJf/szBIUDkIz3rfeoHcXu8zoPPVXA==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.15_1779776922786_0.6527476107684953","host":"s3://npm-registry-packages-npm-production"}},"0.1.16":{"name":"longcelot-sheet-db","version":"0.1.16","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.16","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"cd7b1e7f4178319c960a3bf7549ff27df84908e2","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.16.tgz","fileCount":129,"integrity":"sha512-K+3WWo3VzqbQ/blGGFTP3sdnRIjlPvqrdZ/kRcg62m5TaCF1njZG/pO2YaEwZJh8v43NIvlXQDkcnRwNplFGCg==","signatures":[{"sig":"MEUCIQDpU6IwoOH2im/52AMr/gBkGzRK3WKwfaYyji0hKDSVigIgFhQ5r2qvPbQ0OqiFiXw/0Eg6bCTnJNDZS507bpjOOqI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":370591},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.16.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/5311e2795b1635ea79dd4072d93add14/longcelot-sheet-db-0.1.16.tgz","_integrity":"sha512-K+3WWo3VzqbQ/blGGFTP3sdnRIjlPvqrdZ/kRcg62m5TaCF1njZG/pO2YaEwZJh8v43NIvlXQDkcnRwNplFGCg==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.16_1780410453768_0.7067200708442225","host":"s3://npm-registry-packages-npm-production"}},"0.1.17":{"name":"longcelot-sheet-db","version":"0.1.17","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.17","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"0175c4aa5ad83469f0a65ef94f4c2977a66bcc7b","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.17.tgz","fileCount":129,"integrity":"sha512-DlGUOI0Sl4oe9s6PloeGHDYypfUWTdsRdxr/Y7ZFjm9PmnHMPE2x4kHCp9rnKgPR40u1BsowJTyHbgL9MByVSw==","signatures":[{"sig":"MEQCIFWtnD3oY50t9KdDTJrAHFE7XW6iOJtNJU384qBvfslcAiBFzTB6xIcwG5q4/ibQ9/a+IeO0EQrExDGnct8lXzjEig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":370929},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.17.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/c883353144b573c8c050caa064d53eda/longcelot-sheet-db-0.1.17.tgz","_integrity":"sha512-DlGUOI0Sl4oe9s6PloeGHDYypfUWTdsRdxr/Y7ZFjm9PmnHMPE2x4kHCp9rnKgPR40u1BsowJTyHbgL9MByVSw==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.17_1780421917335_0.568158146140596","host":"s3://npm-registry-packages-npm-production"}},"0.1.18":{"name":"longcelot-sheet-db","version":"0.1.18","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.18","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"2f2bf6973f3ff3045d012bf12299f84242949bc8","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.18.tgz","fileCount":129,"integrity":"sha512-lxpzSq8CgPCRt6vrSw00kLuJxGALSCJI9lg21LcbcWQlrzCs1z0ZnhqINNB0T0fFTzZbc/Y8ZNuyhPZVcsjAPg==","signatures":[{"sig":"MEUCIQCckLXBcorfUWZU/sDLwAItANipKiHqEYUqOZZ/9jz3ogIgNc4ugStU7VbEFsGfoS3tlsOwNs75yfm7F2riDAxzBpg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":373994},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.18.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/991553577a058f3c9c5b7f4e0427c4f9/longcelot-sheet-db-0.1.18.tgz","_integrity":"sha512-lxpzSq8CgPCRt6vrSw00kLuJxGALSCJI9lg21LcbcWQlrzCs1z0ZnhqINNB0T0fFTzZbc/Y8ZNuyhPZVcsjAPg==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.18_1781606027736_0.11143633271429132","host":"s3://npm-registry-packages-npm-production"}},"0.1.20":{"name":"longcelot-sheet-db","version":"0.1.20","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.20","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"afecc9ef78aeafda4142d610dd5da085136b6db3","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.20.tgz","fileCount":134,"integrity":"sha512-X5BAaJDBBPA+CaJxWDuw4g8ZJhWhinCJjJy7E1Bix3eH4TcPUIHSEZWH7vX2LFVgcH/zHLa+JpYOu3ZI89m+VQ==","signatures":[{"sig":"MEYCIQCNqq2hG1w21iDrUPHM73619OSaSQT6z61wGJFLcoR8mwIhALyr0CRvndurB4b6mpTueyYbJ3iWU4R2Tn1mWfqObLQi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":418618},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.20.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/190989f859e8c6ded661edb2e73ded03/longcelot-sheet-db-0.1.20.tgz","_integrity":"sha512-X5BAaJDBBPA+CaJxWDuw4g8ZJhWhinCJjJy7E1Bix3eH4TcPUIHSEZWH7vX2LFVgcH/zHLa+JpYOu3ZI89m+VQ==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.20_1781845603665_0.2797483735619888","host":"s3://npm-registry-packages-npm-production"}},"0.1.21":{"name":"longcelot-sheet-db","version":"0.1.21","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.21","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"5aabf89e83d368182de1868c07677214c948bd43","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.21.tgz","fileCount":138,"integrity":"sha512-qJVh9vl9JXo+wbc6qGwQviIFyZZP7n6CAQDvMNy5HMIEZtKqTwE8J7DewwlBX3Hjxt5Ce1w/dfInxlDzYDuPtg==","signatures":[{"sig":"MEUCIA0vKjJR9FAeXJti1iuCdNwhYB9V9kp/3mU5RgbdfNTBAiEAjzQfM3NlD/WKOuQllEZxPR+unXGUFZ44sHquOST0z+8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":441728},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.21.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/516beea1928b7d6dd6068206e72056ac/longcelot-sheet-db-0.1.21.tgz","_integrity":"sha512-qJVh9vl9JXo+wbc6qGwQviIFyZZP7n6CAQDvMNy5HMIEZtKqTwE8J7DewwlBX3Hjxt5Ce1w/dfInxlDzYDuPtg==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.21_1782058659662_0.23242367927416274","host":"s3://npm-registry-packages-npm-production"}},"0.1.22":{"name":"longcelot-sheet-db","version":"0.1.22","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.22","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"9427957e6a17a171c07240474da639b5d01e7b17","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.22.tgz","fileCount":142,"integrity":"sha512-EItwfqm1DFSw8KVsYRqWiLOYrimXYkXZERLey6vY4tfb61hYv1t8ZWs9kg8rYOIMrKiqswcRG60c3YeDWeadcA==","signatures":[{"sig":"MEUCIQDdE7PXrSCjVnuGh2a18/b4taWTm6Ket0sv7plLAG8SBwIgODw3AQG0mASFZo0PymXXN55Sv4efKWSARgHu9/22kOM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":464908},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.22.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/67306d038da65370218e392517f5da44/longcelot-sheet-db-0.1.22.tgz","_integrity":"sha512-EItwfqm1DFSw8KVsYRqWiLOYrimXYkXZERLey6vY4tfb61hYv1t8ZWs9kg8rYOIMrKiqswcRG60c3YeDWeadcA==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.22.3","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.22_1782380342973_0.7595670735744511","host":"s3://npm-registry-packages-npm-production"}},"0.1.23":{"name":"longcelot-sheet-db","version":"0.1.23","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.23","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"cf3220272d835a16b938072d63cf62951e5aa398","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.23.tgz","fileCount":142,"integrity":"sha512-wAEBfmpmTt1n2ir9NWTW/WcPflVSdxzPtwQoWjckvLtaSFP5zYPl5uZAEdZhQJnRTta02IqHFgwPzKT4wxhkGQ==","signatures":[{"sig":"MEQCIBU62/ItjtVgOPCubep22kuwnrH0J3P49Gfi3ibsbJq9AiAuoIUvuEeARri97+K3oFh54ye3ri4NwXZpjoX+dhG9gA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":471259},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.23.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/757496743b282f5b8d9723a38d60969f/longcelot-sheet-db-0.1.23.tgz","_integrity":"sha512-wAEBfmpmTt1n2ir9NWTW/WcPflVSdxzPtwQoWjckvLtaSFP5zYPl5uZAEdZhQJnRTta02IqHFgwPzKT4wxhkGQ==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.0","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.23_1782564687541_0.9514351618662467","host":"s3://npm-registry-packages-npm-production"}},"0.1.24":{"name":"longcelot-sheet-db","version":"0.1.24","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.24","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"a3d942aa19b05c8e838ecdea66e6b7a0df0207a8","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.24.tgz","fileCount":146,"integrity":"sha512-rtkHY6LQpjREXIMPLuFvwjcqoc+p6LYxZpBiCxCm0/k4e1dTs9fR+ewi+TQKs9ZVNqy3jzPs3Sy1SZa5XvPErQ==","signatures":[{"sig":"MEQCIGtXvsCJnt8N8wbaUSj7sj1hjn5Ruilqu7kA01HN+7AjAiBCqMamzCk2iMEGkemtNlWp9VPsw7qcNjespuLB8vrY3w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":489792},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.24.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/a988226152bf050bf1e26206ae9f14ac/longcelot-sheet-db-0.1.24.tgz","_integrity":"sha512-rtkHY6LQpjREXIMPLuFvwjcqoc+p6LYxZpBiCxCm0/k4e1dTs9fR+ewi+TQKs9ZVNqy3jzPs3Sy1SZa5XvPErQ==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.0","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.24_1782588589460_0.7530860132626946","host":"s3://npm-registry-packages-npm-production"}},"0.1.25":{"name":"longcelot-sheet-db","version":"0.1.25","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.25","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"sheet-db":"dist/cli/index.js"},"dist":{"shasum":"11f508e676dbd4414a22337b771f22a9be640af9","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.25.tgz","fileCount":146,"integrity":"sha512-m5dx8zwbKrdN1RU/NcW9xmobW6xN7wAdHHpbGJJ5I4v456HT1FWSOoK7w+41FRtKGd+w0DF0wDVOT0IzZE/UmA==","signatures":[{"sig":"MEQCIF9a5w6DNrwqgXT5tMc4OMW8ztUaNKkQ0pjRSX9mgu28AiBeBuupYcLffA2n4iQ7mY67OmfTyXagZYGv/SDikTdcVg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":491702},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.25.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/c58be8c1812a44adb36c5f2899c09330/longcelot-sheet-db-0.1.25.tgz","_integrity":"sha512-m5dx8zwbKrdN1RU/NcW9xmobW6xN7wAdHHpbGJJ5I4v456HT1FWSOoK7w+41FRtKGd+w0DF0wDVOT0IzZE/UmA==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.0","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.25_1782652562763_0.1672242699590496","host":"s3://npm-registry-packages-npm-production"}},"0.1.26":{"name":"longcelot-sheet-db","version":"0.1.26","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.26","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"191b4063dd725c624b4b07bd235c8fd3d4c5ad9b","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.26.tgz","fileCount":150,"integrity":"sha512-S99/PEZw7d7PELdpNy5FqRkxMZJa7xTcuD2Dc5h4Yd4WPEU+BLo/PFrmI4YFTn+67ICJsZxKyHsDKw/ggEox4Q==","signatures":[{"sig":"MEYCIQDVToFhlSgpg3zUzZkpAOLr6pPlPL4FsZoKF01rpGQpFAIhAJfv7i7vsR4Wc+sumPDNd9G81jsmWixZsyqNHXBZntCN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":497832},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.26.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/afd7622c49a3a126c4559e69a63d3339/longcelot-sheet-db-0.1.26.tgz","_integrity":"sha512-S99/PEZw7d7PELdpNy5FqRkxMZJa7xTcuD2Dc5h4Yd4WPEU+BLo/PFrmI4YFTn+67ICJsZxKyHsDKw/ggEox4Q==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.0","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.26_1782761564193_0.5526322507924137","host":"s3://npm-registry-packages-npm-production"}},"0.1.27":{"name":"longcelot-sheet-db","version":"0.1.27","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.27","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"f8975af0a2037d4c1b01b56a4c742479d2dbec04","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.27.tgz","fileCount":150,"integrity":"sha512-jTXu7RCguGOlLG5O9ydPOMhnsbOW+si/LbmfBHeDKJjCCybUsZsTLJnJWxwKEzxTJUZs8C2Vk/BGEM16r0f3ZA==","signatures":[{"sig":"MEYCIQDyK5ZIaSqvYeugudzH7Q+gn0XIl98fazjH6pjHPh6fWwIhAKb45E++OsMHrbIYE3cb01PWLIrRhfp5pwy1xz6SkQ88","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":498393},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.27.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/3e4665e69dcec22b63357e5dfc3aed89/longcelot-sheet-db-0.1.27.tgz","_integrity":"sha512-jTXu7RCguGOlLG5O9ydPOMhnsbOW+si/LbmfBHeDKJjCCybUsZsTLJnJWxwKEzxTJUZs8C2Vk/BGEM16r0f3ZA==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.0","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.27_1782762232353_0.5932187257957386","host":"s3://npm-registry-packages-npm-production"}},"0.1.28":{"name":"longcelot-sheet-db","version":"0.1.28","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.28","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"b050f010b77cfa22cc3199336a1d896ccb79b21a","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.28.tgz","fileCount":150,"integrity":"sha512-o/QVX/b1+3DYnuEXAKNScafzTdqaXmlAHF6vyZh9Z4LZB2SKo7MLl5GO7KgfteAGKi6XmQalsKqgt/64PIoWhA==","signatures":[{"sig":"MEUCIHGOzlWps/kjhUBanxg8eLZ3zKer1hD6ja/SxfWJm3QcAiEAwBBplQZHlTViLX9eCahUt3xWaiS58VereCwEpQV/fjo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":510180},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.28.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/e37552fb3776b7428d58dca4b2c46040/longcelot-sheet-db-0.1.28.tgz","_integrity":"sha512-o/QVX/b1+3DYnuEXAKNScafzTdqaXmlAHF6vyZh9Z4LZB2SKo7MLl5GO7KgfteAGKi6XmQalsKqgt/64PIoWhA==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.28_1783495892387_0.7039117884395907","host":"s3://npm-registry-packages-npm-production"}},"0.1.29":{"name":"longcelot-sheet-db","version":"0.1.29","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.29","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"34d39b13a81bae2b145fb3470abf58ad4f46e4e2","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.29.tgz","fileCount":198,"integrity":"sha512-k65j5uMsisfwWgK+TGojpgVkFbshCf2T7HGvFXy96A9/llj1/HlqcCEowGJJSF37Xb3MZlhXXfLPXATWIvpF3g==","signatures":[{"sig":"MEUCIQCyTC79UCUvtIs6HO97oH5ItDK8rQ4Tr+8yVVuY33tnPAIgG2FYX5TkX5FiBi76btIP31g2b4rQTgvfeZof3Wm8+dw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":625333},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.29.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/b5fdcb4a5d9e2e5116c4b9e051554c75/longcelot-sheet-db-0.1.29.tgz","_integrity":"sha512-k65j5uMsisfwWgK+TGojpgVkFbshCf2T7HGvFXy96A9/llj1/HlqcCEowGJJSF37Xb3MZlhXXfLPXATWIvpF3g==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.29_1783501702987_0.7850400066886021","host":"s3://npm-registry-packages-npm-production"}},"0.1.30":{"name":"longcelot-sheet-db","version":"0.1.30","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.30","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"4520a0ec70a49742e16c1162e6a073e80ac584d5","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.30.tgz","fileCount":202,"integrity":"sha512-iIs/YF89zLgFtAlXVgJh08ig14H4/jOyBCNIlBzoEawKvazsRT5CJY6x4HqJNKmAe0klNnyc3Q7CTR+8moqwlQ==","signatures":[{"sig":"MEQCIGl5LTEGWCf7QMyEZQ6gvNFOQrXvP4Ndl2STD48Xvtt5AiBXfQegfL1FQd/MfzYTTSh06Ut0/YnGv7hXS1kZGk5K6g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":641302},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.30.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/540cf958a0eac2c01cba193fc5af2091/longcelot-sheet-db-0.1.30.tgz","_integrity":"sha512-iIs/YF89zLgFtAlXVgJh08ig14H4/jOyBCNIlBzoEawKvazsRT5CJY6x4HqJNKmAe0klNnyc3Q7CTR+8moqwlQ==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.30_1783594365240_0.5140448463107776","host":"s3://npm-registry-packages-npm-production"}},"0.1.31":{"name":"longcelot-sheet-db","version":"0.1.31","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.31","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"cc1ff78f33356c584e9c078ac68fd3b6ddc9e69d","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.31.tgz","fileCount":202,"integrity":"sha512-uelZvl7Pm1y+BNsMIDX5IwbUPGMLgOp1Jf2SkV/QFZpDaK6mrCp+CrYby5pEQFQ52Mj/suhPsiB29a4DcnaHPg==","signatures":[{"sig":"MEUCIQCcrqH2k2VIGZ0uYBxq1UsRIn0e3YgOSzVqaMz6+FBHxAIgEHexKBlYMgYsuUjhCFFurEFl+9km40ztBe2V2KBtW9A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":646099},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.31.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/b1b1f53c92d08b331a67e7d9b6340efe/longcelot-sheet-db-0.1.31.tgz","_integrity":"sha512-uelZvl7Pm1y+BNsMIDX5IwbUPGMLgOp1Jf2SkV/QFZpDaK6mrCp+CrYby5pEQFQ52Mj/suhPsiB29a4DcnaHPg==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","ts-jest":"^29.4.11","prettier":"^3.8.3","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.31_1783681090933_0.5635913616615134","host":"s3://npm-registry-packages-npm-production"}},"0.1.32":{"name":"longcelot-sheet-db","version":"0.1.32","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.32","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"41b751fe8679c276d578ecf8a8f7f3bc7d95be4b","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.32.tgz","fileCount":266,"integrity":"sha512-RwU53dQ6HT0ql55rwo4+Ly/MUZEsnL74Gs9I/D+2U2T6vCl/Fqq0jsbMUoVLW8pwgGXP74kPLUFfa8x5h3JJ+Q==","signatures":[{"sig":"MEYCIQDOOom9XkfHCRf2c8HMXln/9YiXI9QHnaQ+iz0PsBSiIgIhAP6zoZ5LqAUNVNGOA2pFSnXh8NOAb3haNIUNE0rBUj+3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":855638},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.32.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/8292a9e9fdc8e074482be40acf5840fa/longcelot-sheet-db-0.1.32.tgz","_integrity":"sha512-RwU53dQ6HT0ql55rwo4+Ly/MUZEsnL74Gs9I/D+2U2T6vCl/Fqq0jsbMUoVLW8pwgGXP74kPLUFfa8x5h3JJ+Q==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","mysql2":"^3.15.3","prisma":"^6.19.3","ts-jest":"^29.4.11","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@prisma/client":"^6.19.3","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"peerDependencies":{"pg":">=8","mysql2":">=3"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.32_1783873239519_0.7667084755756406","host":"s3://npm-registry-packages-npm-production"}},"0.1.33":{"name":"longcelot-sheet-db","version":"0.1.33","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.33","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"fdf5442bbbbad063f352586045674e54f74a6df0","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.33.tgz","fileCount":270,"integrity":"sha512-r02Z0mMx9b/0iMjZV3x6/vlUqyOLGue1auahyCyRRCKl1Wu3MwiRtAe/xiHHQVyztM5FRTFtLdgwy78XRV4A3w==","signatures":[{"sig":"MEUCIQDvUGIKhIGFD6Fu4rBhCAmNF7n/s6gtyBqrQheepeyovQIgcovkuN8OIENv5sjiDN+u3ETG5C18583CBj2Qm/LWJdE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":860495},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.33.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/a06f2dd35695298bf0d8bdf95e1cf50f/longcelot-sheet-db-0.1.33.tgz","_integrity":"sha512-r02Z0mMx9b/0iMjZV3x6/vlUqyOLGue1auahyCyRRCKl1Wu3MwiRtAe/xiHHQVyztM5FRTFtLdgwy78XRV4A3w==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","mysql2":"^3.15.3","prisma":"^6.19.3","ts-jest":"^29.4.11","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@prisma/client":"^6.19.3","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"peerDependencies":{"pg":">=8","mysql2":">=3"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.33_1783955634740_0.5390127927100954","host":"s3://npm-registry-packages-npm-production"}},"0.1.34":{"name":"longcelot-sheet-db","version":"0.1.34","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.34","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"96a61851395f71d4427551bdbe69e5b4bb2cab37","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.34.tgz","fileCount":270,"integrity":"sha512-qGCcs5abSm0XKWTSWv6oSQXCb0R66/DJ2RIuK13R1vvP7dOfKgxwQRp9tquj2kXQEyoeft2m+qgY9UOIdWAYaw==","signatures":[{"sig":"MEQCIF+N1F6XtquodN0b3T7shBcjWtE/bYm196oBoaPwVsBmAiBpvBnrNqj8v8Zm8UHva2X0/oDVTX/yRCkrSrjisJlOtg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":864743},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.34.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/fe854e9a1fe57e8693a9e153aa080ed7/longcelot-sheet-db-0.1.34.tgz","_integrity":"sha512-qGCcs5abSm0XKWTSWv6oSQXCb0R66/DJ2RIuK13R1vvP7dOfKgxwQRp9tquj2kXQEyoeft2m+qgY9UOIdWAYaw==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","mysql2":"^3.15.3","prisma":"^6.19.3","ts-jest":"^29.4.11","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@prisma/client":"^6.19.3","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"peerDependencies":{"pg":">=8","mysql2":">=3"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.34_1783958031755_0.8845179328736743","host":"s3://npm-registry-packages-npm-production"}},"0.1.35":{"name":"longcelot-sheet-db","version":"0.1.35","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.35","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"aac52ba67699049f302a0173e89590ee1925a27a","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.35.tgz","fileCount":270,"integrity":"sha512-yIrKAJKRsLtXjssejs7PtSZSgSbKyX/keJezndOWV8e1FriAE9+oil7HecK63knbW9lWLVZOHD0R6Sn6bKx4gw==","signatures":[{"sig":"MEQCIGXZd+IXxdfckLq6uIDK1kftj+Xv+LB1Lakh/J/pYMIgAiAqheie1+JAMuaq3GxbkwPkxL3JxsNOdoFWeOl9zY9gEg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":873038},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.35.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/0a7607a457d1736508820f147177f68d/longcelot-sheet-db-0.1.35.tgz","_integrity":"sha512-yIrKAJKRsLtXjssejs7PtSZSgSbKyX/keJezndOWV8e1FriAE9+oil7HecK63knbW9lWLVZOHD0R6Sn6bKx4gw==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","mysql2":"^3.15.3","prisma":"^6.19.3","ts-jest":"^29.4.11","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@prisma/client":"^6.19.3","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"peerDependencies":{"pg":">=8","mysql2":">=3"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.35_1783960768838_0.5907264992125769","host":"s3://npm-registry-packages-npm-production"}},"0.1.36":{"name":"longcelot-sheet-db","version":"0.1.36","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.36","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"451f950f7009d6f0043f1c460b1b8c995e2c8d94","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.36.tgz","fileCount":270,"integrity":"sha512-c49tdQOkMlfxms3wSpwrN5wxjziwTuUfxT2tfeg7lyFSqFTEnBCdOYRv9moynnyJG6+nVYRG/otdY+nG2h1EbA==","signatures":[{"sig":"MEUCIAuH5IUql2iMRhEVwEhHed4uumykjlcxdvZDFzeAZOvXAiEAy41e3q3arne84+q+DLzWMGd+bs3zaiqZvNrpw8bcuP4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":878193},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.36.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/3baca9ef0aa7f6060b3e85d4fd22484c/longcelot-sheet-db-0.1.36.tgz","_integrity":"sha512-c49tdQOkMlfxms3wSpwrN5wxjziwTuUfxT2tfeg7lyFSqFTEnBCdOYRv9moynnyJG6+nVYRG/otdY+nG2h1EbA==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","mysql2":"^3.15.3","prisma":"^6.19.3","ts-jest":"^29.4.11","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@prisma/client":"^6.19.3","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"peerDependencies":{"pg":">=8","mysql2":">=3"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.36_1783962073808_0.4294109861188131","host":"s3://npm-registry-packages-npm-production"}},"0.1.37":{"name":"longcelot-sheet-db","version":"0.1.37","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.37","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"06171d63b9fd12c5132f9fb5165619e26f745b07","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.37.tgz","fileCount":270,"integrity":"sha512-vJupZSp6Dym0yti9BKEt+VCR788mJWFY6qSkLuDMNm05YK3J7VtI8PgSg0lheG83XUigvhM1k7EVW9gzrVqF/Q==","signatures":[{"sig":"MEUCIHv+NtoS4rnchXxwRRM3Ocjm8hDelW6IyZcS1q1EPZ3pAiEArH+p7ad7XPVE53Be6A19hpbqvl/u7aWiuq84cPld5Jk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":880435},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.37.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/ff1fce86c94a9fe3b7c19a5ea82aae77/longcelot-sheet-db-0.1.37.tgz","_integrity":"sha512-vJupZSp6Dym0yti9BKEt+VCR788mJWFY6qSkLuDMNm05YK3J7VtI8PgSg0lheG83XUigvhM1k7EVW9gzrVqF/Q==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","mysql2":"^3.15.3","prisma":"^6.19.3","ts-jest":"^29.4.11","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@prisma/client":"^6.19.3","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"peerDependencies":{"pg":">=8","mysql2":">=3"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.37_1783963246294_0.4236845260200204","host":"s3://npm-registry-packages-npm-production"}},"0.1.38":{"name":"longcelot-sheet-db","version":"0.1.38","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.38","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"106f18156635b154d2911e4cd1bbdb560a84891b","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.38.tgz","fileCount":270,"integrity":"sha512-+55kpiIOKEjUslgwerzqHJhkbf98R0mNkpYlmax4TqH8U25N3Dz8+8qDRy0VZ9sIx7pzkhfmv0P2UZi8peJDtw==","signatures":[{"sig":"MEUCIQDG7zoO3WTifMYy79Xt0nbz/PbebajmJOD6Y7TJuZe/UwIgJG84uLEYTiNIVLmhDi3LgkOmKTo3vK6u9D3Kh/WhgB0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":883975},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.38.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/f478a7bc79b11ba4a8e9b1f0f42115bb/longcelot-sheet-db-0.1.38.tgz","_integrity":"sha512-+55kpiIOKEjUslgwerzqHJhkbf98R0mNkpYlmax4TqH8U25N3Dz8+8qDRy0VZ9sIx7pzkhfmv0P2UZi8peJDtw==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","mysql2":"^3.15.3","prisma":"^6.19.3","ts-jest":"^29.4.11","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@prisma/client":"^6.19.3","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"peerDependencies":{"pg":">=8","mysql2":">=3"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.38_1783964757585_0.7114325210228885","host":"s3://npm-registry-packages-npm-production"}},"0.1.39":{"name":"longcelot-sheet-db","version":"0.1.39","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.39","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"dc54a32598cccc7670a0c7aef85e3a17525f9f46","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.39.tgz","fileCount":270,"integrity":"sha512-wZgXhspFdCAIjNHAGqjfzrCibVtJSjk9wpnnWpunf4A3PwzrTTmO+OXAB/d9tksrWntQTs3edYXQY6jk0SJX/A==","signatures":[{"sig":"MEQCICKhzPhp1i4T45OLjtFcVpn8vi863vQY+NiO2YeqSn2QAiBL0snHgot+8sv9zEgrybcUcpfJYfpSSwvJNUrx6Nptrg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":886682},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.39.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/38fa24cfddf0db6cecf17ad7720be324/longcelot-sheet-db-0.1.39.tgz","_integrity":"sha512-wZgXhspFdCAIjNHAGqjfzrCibVtJSjk9wpnnWpunf4A3PwzrTTmO+OXAB/d9tksrWntQTs3edYXQY6jk0SJX/A==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","mysql2":"^3.15.3","prisma":"^6.19.3","ts-jest":"^29.4.11","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@prisma/client":"^6.19.3","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"peerDependencies":{"pg":">=8","mysql2":">=3"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.39_1783966505833_0.7936996240675185","host":"s3://npm-registry-packages-npm-production"}},"0.1.40":{"name":"longcelot-sheet-db","version":"0.1.40","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.40","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"aafdd61869e47751ae88da9a4c928a9a635944a7","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.40.tgz","fileCount":274,"integrity":"sha512-JfUsOit3bMq7tKsv+H4G3wAFAaI/qm89EExlhG8PMdbswxOxaxeBDVtvnn8o2aMb4+N2O0vY+b3i1ow5fEhqyA==","signatures":[{"sig":"MEUCIFPOK3w4U5/+sEMwIJDKq1c44awfwN+bjxDd5nfgVxHpAiEA0sK7h8Hy+L7YG15IJjORPGWzkMLvsZhcDFJbxrh9+z4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":903994},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.40.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/d2922ef0baf3bce9a98d417d7cf32065/longcelot-sheet-db-0.1.40.tgz","_integrity":"sha512-JfUsOit3bMq7tKsv+H4G3wAFAaI/qm89EExlhG8PMdbswxOxaxeBDVtvnn8o2aMb4+N2O0vY+b3i1ow5fEhqyA==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","mysql2":"^3.15.3","prisma":"^6.19.3","ts-jest":"^29.4.11","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@prisma/client":"^6.19.3","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"peerDependencies":{"pg":">=8","mysql2":">=3"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.40_1785062632627_0.7202330612933148","host":"s3://npm-registry-packages-npm-production"}},"0.1.41":{"name":"longcelot-sheet-db","version":"0.1.41","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.41","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"18fcfc67e34363eabcc7c513e66d7bdaa8a7a4dd","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.41.tgz","fileCount":274,"integrity":"sha512-MbzEhe/+R1VViIM1jfm9PTA6Kwp84EGPNsNBNoqunjViGZZqw3p5aJirr5u6ey9Pl5alcDqfRfLAL0ySWfk9og==","signatures":[{"sig":"MEYCIQDUV9WPlx9s0ubk88zjgv3Yba/ey3q0wX6lTye2nGdqxAIhAPJLQCHDWs1uYZ9acOncROC9gDEhJMgoRwnkR+Byqyhd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":924628},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.41.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/d5f68b03753560c0d18d823046c7a250/longcelot-sheet-db-0.1.41.tgz","_integrity":"sha512-MbzEhe/+R1VViIM1jfm9PTA6Kwp84EGPNsNBNoqunjViGZZqw3p5aJirr5u6ey9Pl5alcDqfRfLAL0ySWfk9og==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","mysql2":"^3.15.3","prisma":"^6.19.3","ts-jest":"^29.4.11","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@prisma/client":"^6.19.3","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"peerDependencies":{"pg":">=8","mysql2":">=3"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.41_1785766368357_0.7852496781348706","host":"s3://npm-registry-packages-npm-production"}},"0.1.42":{"name":"longcelot-sheet-db","version":"0.1.42","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.42","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"8429d2129b21d6d22a87416a24112890ecfefed5","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.42.tgz","fileCount":274,"integrity":"sha512-g2WVUEUsT6HcelF41w5C5kW2aWHeK+I5SzYdsLrHhKArXQLqCLUFKLueRqsQSMfZeD9P/cD5JFKxm/S//nI9RQ==","signatures":[{"sig":"MEUCIAhxkf2FLwg92AVQumvN6hrJuD0tjOMhe8axYCw6qXqhAiEA6GpuyblSuhfnUjwr0JW7DhQHxvXmqD3so6HyuaaSoxQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":928737},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.42.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/49ef6f49c72623d30fd72843b458243d/longcelot-sheet-db-0.1.42.tgz","_integrity":"sha512-g2WVUEUsT6HcelF41w5C5kW2aWHeK+I5SzYdsLrHhKArXQLqCLUFKLueRqsQSMfZeD9P/cD5JFKxm/S//nI9RQ==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.1","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","mysql2":"^3.15.3","prisma":"^6.19.3","ts-jest":"^29.4.11","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@prisma/client":"^6.19.3","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"peerDependencies":{"pg":">=8","mysql2":">=3"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.42_1786683348009_0.6941096611808584","host":"s3://npm-registry-packages-npm-production"}},"0.1.43":{"name":"longcelot-sheet-db","version":"0.1.43","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.43","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"f933972258ba2d106dc4f5551272925fe10ed3a2","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.43.tgz","fileCount":274,"integrity":"sha512-dm6xDAnKgaoJNoPwAIY8+QAx1AqF4NrdCrKsS3Crjpkfg2F+JyZ+/w9NX4MTr+zuqXWX2L5Y8FnUI4UFGOcPaQ==","signatures":[{"sig":"MEUCIQCfcCmU8hIOWWs6wtOmYrOA4oQxQjQWCjr+G6uU0qXT3QIgQSeEaswm5PDN3Zz+SKLBIgPy6FTbO422tVKVsYYcFrg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":940794},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.43.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/c4195374fdc23666ec53e37d8279c165/longcelot-sheet-db-0.1.43.tgz","_integrity":"sha512-dm6xDAnKgaoJNoPwAIY8+QAx1AqF4NrdCrKsS3Crjpkfg2F+JyZ+/w9NX4MTr+zuqXWX2L5Y8FnUI4UFGOcPaQ==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","mysql2":"^3.15.3","prisma":"^6.19.3","ts-jest":"^29.4.11","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@prisma/client":"^6.19.3","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"peerDependencies":{"pg":">=8","mysql2":">=3"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.43_1787205702827_0.3784829893811168","host":"s3://npm-registry-packages-npm-production"}},"0.1.44":{"name":"longcelot-sheet-db","version":"0.1.44","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.44","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"6fe8473e959660993eba6238815cf29a59c2b672","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.44.tgz","fileCount":286,"integrity":"sha512-KNunI8hUeC1Xw116PKyfNEadVMIe3dinb3lIiMCdfJHBBR+nI9NYb98JOSGwjtsJeds3sQR91pmG4M55BY+vPw==","signatures":[{"sig":"MEQCICqeqghVI03wFXzljahTixnOBPh/mXDmdyXwToBalf5OAiAQvKcY0FCOHJU18LGkq5+BCeClvPVrvLgp1XjgMWxKuA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":967625},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.44.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/44129f9200c5c2239f4a36ec5b7ae1b9/longcelot-sheet-db-0.1.44.tgz","_integrity":"sha512-KNunI8hUeC1Xw116PKyfNEadVMIe3dinb3lIiMCdfJHBBR+nI9NYb98JOSGwjtsJeds3sQR91pmG4M55BY+vPw==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","mysql2":"^3.15.3","prisma":"^6.19.3","ts-jest":"^29.4.11","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@prisma/client":"^6.19.3","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"peerDependencies":{"pg":">=8","mysql2":">=3"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.44_1787249443970_0.8244815939140642","host":"s3://npm-registry-packages-npm-production"}},"0.1.45":{"name":"longcelot-sheet-db","version":"0.1.45","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.45","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"0e41963b1c321c5ef5373b0a2b4ea8a093f1c15f","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.45.tgz","fileCount":286,"integrity":"sha512-ptrltTN31QSpyELcQ9GnuXwyop55WLPuvdd3/UJgI69jz2vamgTYv3CLOqfnc/xbXAToeFj1AMxbn+hgCERyLQ==","signatures":[{"sig":"MEUCIDzhDSKc5d7gt3CU8Lb7D1MMzV43G7fOqIHeXLPtk72oAiEAnCTmHLpyTBiFr/z6y7xvoTZEzlKKqCApVir/cP7NlS4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICkXY4w9g/V8XqCGInebOB7IFZqhWtPEsj4+9iFf0i/bAiBpHuAOIBvynP45YZCD/FI5LkFM8ZvOkyVCUCLkw25kMw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":972939},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.45.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/27ecd237a983a2a9cfd5a04b8e61d600/longcelot-sheet-db-0.1.45.tgz","_integrity":"sha512-ptrltTN31QSpyELcQ9GnuXwyop55WLPuvdd3/UJgI69jz2vamgTYv3CLOqfnc/xbXAToeFj1AMxbn+hgCERyLQ==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","mysql2":"^3.15.3","prisma":"^6.19.3","ts-jest":"^29.4.11","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@prisma/client":"^6.19.3","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"peerDependencies":{"pg":">=8","mysql2":">=3"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.45_1787280713121_0.7551467092301358","host":"s3://npm-registry-packages-npm-production"}},"0.1.46":{"name":"longcelot-sheet-db","version":"0.1.46","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.46","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"6401d51ca7b94bfc57f5bb02e81caae376d15986","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.46.tgz","fileCount":294,"integrity":"sha512-q7HOYs7313PoEpYw6ikheqUOaVYdVCCQ1OTJDM1DQPla7u0F8zXaj61nwkQfLZvwdmEBHS5qyTMnKAVRVQkE/A==","signatures":[{"sig":"MEUCIQCGMEoqs/E26BdpI0FABx3ruJ/zaXxzL4K+dHPQji8l1gIgU8KoxQY+JddytHrhifehpQt9673MMIfz3toMmUxCp1o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCitZSqO4iKbteNBQG9HCbQCEFFOOefx9+eF7cNCuMF+gIhAP3ToQw0aQiLCBcWrdv1E7QiM6JkG54Sl9Gmm0uaR+El","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1000225},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.46.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/98bdce7efa26f9d27cf3845d081328cb/longcelot-sheet-db-0.1.46.tgz","_integrity":"sha512-q7HOYs7313PoEpYw6ikheqUOaVYdVCCQ1OTJDM1DQPla7u0F8zXaj61nwkQfLZvwdmEBHS5qyTMnKAVRVQkE/A==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","mysql2":"^3.15.3","prisma":"^6.19.3","ts-jest":"^29.4.11","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@prisma/client":"^6.19.3","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"peerDependencies":{"pg":">=8","mysql2":">=3"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.46_1787635271000_0.8215709062569161","host":"s3://npm-registry-packages-npm-production"}},"0.1.47":{"name":"longcelot-sheet-db","version":"0.1.47","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"author":{"name":"Longcelot"},"license":"MIT","_id":"longcelot-sheet-db@0.1.47","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"dist":{"shasum":"d18c72434223fc6ccd46f91d8f01f8c159031ab6","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.47.tgz","fileCount":294,"integrity":"sha512-dbvNi0WLOom6WtgV3lKaJWAwAdBXUpP9tcmq1si1rH1F23YnSs/X86rfsDclAYV3zCIQ0fXqGARX1moJF5XTKA==","signatures":[{"sig":"MEQCICCasbRidoAca8X9tkT9mXiFn72rOBEVVfW7q0h/QrneAiA390CcnDzVt+HhhhUMV2CRXLp0qGpr6kP4etxKd+etBQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBWXrRgDWUXurp2LkYKg/7rMT5apMLCE1P7UdhmGvh3NAiEAk+y4AzAbymlR7UUxMzGfpDQzsiFM9aE6aMjQCEIjGp0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1003283},"main":"dist/index.js","_from":"file:longcelot-sheet-db-0.1.47.tgz","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"_resolved":"/tmp/67df9cce02aa0ec25720558af900360b/longcelot-sheet-db-0.1.47.tgz","_integrity":"sha512-dbvNi0WLOom6WtgV3lKaJWAwAdBXUpP9tcmq1si1rH1F23YnSs/X86rfsDclAYV3zCIQ0fXqGARX1moJF5XTKA==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","mysql2":"^3.15.3","prisma":"^6.19.3","ts-jest":"^29.4.11","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@prisma/client":"^6.19.3","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"peerDependencies":{"pg":">=8","mysql2":">=3"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/longcelot-sheet-db_0.1.47_1788404487293_0.2587724721765381","host":"s3://npm-registry-packages-npm-production"}},"0.1.48":{"_id":"longcelot-sheet-db@0.1.48","bin":{"lsdb":"dist/cli/index.js","sheet-db":"dist/cli/index.js"},"bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"dist":{"shasum":"4e0dc4af1f6c1549891124de6d9ecb36e85f9d0b","tarball":"https://registry.npmjs.org/longcelot-sheet-db/-/longcelot-sheet-db-0.1.48.tgz","fileCount":306,"integrity":"sha512-ruPJARHkySDY+4/fQy+9iLIl/WFXF1+RrFz9M7lwu1mrv0t+O8u5rH7N1fzgBepTIyTOJDatZCUTsf2+nf3vzQ==","signatures":[{"sig":"MEQCIFi9heRUID2V5Q1Pgl7W6iEwnnzGRO3pCjGqax97YomCAiA7nPhzCVlF/cWL4Ajbfs+0pwrZFFgKYoIhHIukrPZsVQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFHESVxQxdWhNfuLMV568QpylQaFY+4XzeRhKGEMzcFeAiEAgHyosYGs2XJh3iSnagdVIgsx6mA+JYpA8tac6EB9zME="}],"unpackedSize":1069656},"main":"dist/index.js","name":"longcelot-sheet-db","_from":"file:longcelot-sheet-db-0.1.48.tgz","types":"dist/index.d.ts","author":{"name":"Longcelot"},"engines":{"node":">=16.0.0"},"license":"MIT","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"rm -rf dist && tsc","format":"prettier --write \"src/**/*.ts\"","test:watch":"jest --watch","test:coverage":"jest --coverage"},"version":"0.1.48","_npmUser":{"name":"longcelot","email":"seavlongvann55@gmail.com"},"homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"_resolved":"/tmp/6386d494bb3b7ecc3ea62d758d2bd9f5/longcelot-sheet-db-0.1.48.tgz","_integrity":"sha512-ruPJARHkySDY+4/fQy+9iLIl/WFXF1+RrFz9M7lwu1mrv0t+O8u5rH7N1fzgBepTIyTOJDatZCUTsf2+nf3vzQ==","repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"_npmVersion":"10.9.8","description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","directories":{},"maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.4.3","chalk":"^4.1.2","dotenv":"^17.4.2","nanoid":"^3.3.12","bcryptjs":"^3.0.3","inquirer":"^8.2.7","commander":"^14.0.3","googleapis":"^172.0.0","google-auth-library":"^10.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"pg":"^8.16.3","jest":"^30.4.2","husky":"^9.1.7","jsdom":"^29.1.1","eslint":"^10.4.0","mysql2":"^3.15.3","prisma":"^6.19.3","ts-jest":"^29.4.11","prettier":"^3.8.3","@types/pg":"^8.20.0","typescript":"^6.0.3","@types/jest":"^30.0.0","@types/node":"^25.9.1","lint-staged":"^17.0.5","@prisma/client":"^6.19.3","@types/bcryptjs":"^3.0.0","@types/inquirer":"^8.2.12","@tanstack/intent":"latest","@testing-library/dom":"^10.4.1","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.0","@typescript-eslint/eslint-plugin":"^8.60.0"},"peerDependencies":{"pg":">=8","mysql2":">=3"},"peerDependenciesMeta":{"pg":{"optional":true},"mysql2":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/longcelot-sheet-db_0.1.48_1790612483695_0.10429322691720322"}}},"time":{"created":"2026-02-27T10:26:00.691Z","modified":"2026-09-28T16:21:24.018Z","0.1.0":"2026-02-27T10:26:00.989Z","0.1.2":"2026-02-28T01:51:23.236Z","0.1.3":"2026-02-28T03:08:41.921Z","0.1.4":"2026-02-28T03:26:02.428Z","0.1.5":"2026-02-28T03:27:46.034Z","0.1.7":"2026-03-25T14:50:04.778Z","0.1.8":"2026-05-03T16:05:55.628Z","0.1.11":"2026-05-25T18:26:51.235Z","0.1.12":"2026-05-26T04:04:08.356Z","0.1.13":"2026-05-26T05:52:51.356Z","0.1.14":"2026-05-26T06:12:17.156Z","0.1.15":"2026-05-26T06:28:42.946Z","0.1.16":"2026-06-02T14:27:33.956Z","0.1.17":"2026-06-02T17:38:37.527Z","0.1.18":"2026-06-16T10:33:47.872Z","0.1.20":"2026-06-19T05:06:43.819Z","0.1.21":"2026-06-21T16:17:39.909Z","0.1.22":"2026-06-25T09:39:03.150Z","0.1.23":"2026-06-27T12:51:27.703Z","0.1.24":"2026-06-27T19:29:49.589Z","0.1.25":"2026-06-28T13:16:02.911Z","0.1.26":"2026-06-29T19:32:44.336Z","0.1.27":"2026-06-29T19:43:52.510Z","0.1.28":"2026-07-08T07:31:32.552Z","0.1.29":"2026-07-08T09:08:23.192Z","0.1.30":"2026-07-09T10:52:45.370Z","0.1.31":"2026-07-10T10:58:11.071Z","0.1.32":"2026-07-12T16:20:39.719Z","0.1.33":"2026-07-13T15:13:54.871Z","0.1.34":"2026-07-13T15:53:51.926Z","0.1.35":"2026-07-13T16:39:29.010Z","0.1.36":"2026-07-13T17:01:13.977Z","0.1.37":"2026-07-13T17:20:46.479Z","0.1.38":"2026-07-13T17:45:57.803Z","0.1.39":"2026-07-13T18:15:06.012Z","0.1.40":"2026-07-26T10:43:52.785Z","0.1.41":"2026-08-03T14:12:48.540Z","0.1.42":"2026-08-14T04:55:48.203Z","0.1.43":"2026-08-20T06:01:42.993Z","0.1.44":"2026-08-20T18:10:44.106Z","0.1.45":"2026-08-21T02:51:53.231Z","0.1.46":"2026-08-25T05:21:11.096Z","0.1.47":"2026-09-03T03:01:27.388Z","0.1.48":"2026-09-28T16:21:23.848Z"},"bugs":{"url":"https://github.com/vannseavlong/longcelot-sheet-staging/issues"},"author":{"name":"Longcelot"},"license":"MIT","homepage":"https://github.com/vannseavlong/longcelot-sheet-staging#readme","keywords":["google-sheets","database","staging","adapter","schema","tanstack-intent"],"repository":{"url":"git+https://github.com/vannseavlong/longcelot-sheet-staging.git","type":"git"},"description":"Google Sheets-backed staging database adapter for Node.js with schema-first design","maintainers":[{"name":"longcelot","email":"seavlongvann55@gmail.com"}],"readme":"# 📦 longcelot-sheet-db\n\n[![CI](https://github.com/vannseavlong/longcelot-sheet-staging/actions/workflows/ci.yml/badge.svg)](https://github.com/vannseavlong/longcelot-sheet-staging/actions/workflows/ci.yml)\n[![npm version](https://img.shields.io/npm/v/longcelot-sheet-db)](https://www.npmjs.com/package/longcelot-sheet-db)\n[![npm downloads](https://img.shields.io/npm/dt/longcelot-sheet-db)](https://www.npmjs.com/package/longcelot-sheet-db)\n[![license](https://img.shields.io/npm/l/longcelot-sheet-db)](LICENSE)\n\n**Google Sheets-backed Staging Database for Node.js**\n\nA schema-first, actor-aware database adapter that uses Google Sheets as the storage engine. Perfect for MVPs, prototypes, staging environments, and internal tools where cost and simplicity matter.\n\n## 🎯 Purpose\n\nInstead of running MySQL, PostgreSQL, or MongoDB for staging:\n- Each user stores their data in **their own Google Sheet**\n- Admin maintains a **single centralized registry sheet**\n- Authentication powered by **Google OAuth** + optional password\n- Developers define schemas that are **automatically converted into sheet tables**\n\n## ✨ Features\n\n- 📝 **Schema-First Design**: Define tables using a TypeScript DSL\n- 🔐 **Actor-Based Isolation**: Each user role owns their own sheet\n- 🔄 **Auto CRUD**: `create`, `createMany`, `findMany`, `findOne`, `count`, `update`, `upsert`, `delete`\n- 🎭 **Role-Based Permissions**: Built-in security boundaries + cross-actor access matrix\n- 🔑 **Authentication**: `createAuthRouter` wires Google Sign-In + JWT in one call; role-based registration policy\n- 🛠️ **CLI Tools**: Initialize, authorize, generate, sync, validate, seed, migrate, drop/rename schema elements, mock-users\n- 📊 **Type-Safe**: Full TypeScript support\n- 💰 **Cost-Free**: No infrastructure costs for staging\n- 🔒 **Schema Integrity**: Hash-based version tracking detects stale user sheets at runtime\n- ♻️ **Safe Migrations**: `sync --all-users` pushes schema changes to every user sheet with rate-limit backoff\n- 🚀 **CI-Friendly**: `sync --token-file` skips interactive OAuth prompt in CI/CD pipelines\n- 📡 **Batched Reads**: `ctx.prefetch(tables)` collapses a multi-table page load into one `values.batchGet` per spreadsheet instead of one API call per table\n- 🎫 **Per-Actor Quota**: opt-in `actorClientForCrud` runs each actor's own CRUD calls through their own OAuth grant instead of one shared admin quota\n- 🚪 **Opt-Out Sheet Sharing**: `shareWithActor: false` keeps an actor's sheet app-only — no direct-edit bypass of app rules, safe for a long read-cache TTL\n\n## 🚀 Quick Start\n\n### Installation\n\n```bash\n# npm\nnpm install longcelot-sheet-db\n\n# pnpm\npnpm add longcelot-sheet-db\n\n# yarn\nyarn add longcelot-sheet-db\n\n# bun\nbun add longcelot-sheet-db\n```\n\n### Initialize Project\n\n```bash\n# npm\nnpx lsdb init\n\n# pnpm\npnpm dlx lsdb init\n\n# yarn\nyarn dlx lsdb init\n\n# bun\nbunx lsdb init\n```\n\nThis creates:\n- `lsdb.config.ts` - Project configuration\n- `.env` - Environment variables\n- `schemas/` - Schema directory\n\n### Set Up Google OAuth\n\nThis package **requires Google OAuth2** to function — there is no way to skip it. OAuth is used for the backend to communicate with Google Sheets API.\n\n1. Go to [Google Cloud Console](https://console.cloud.google.com/)\n2. Create a project and enable Google Sheets API and Google Drive API\n3. Create OAuth 2.0 credentials (Client ID and Client Secret)\n4. Set redirect URI (e.g., `http://localhost:3000/auth/callback`)\n5. Add your credentials to `.env`:\n\n```env\nGOOGLE_CLIENT_ID=your_client_id\nGOOGLE_CLIENT_SECRET=your_client_secret\nGOOGLE_REDIRECT_URI=http://localhost:3000/auth/callback\nADMIN_SHEET_ID=your_admin_sheet_id\n```\n\n**What if you have your own authentication?**\n- OAuth is strictly for **backend-to-Google-Sheets** communication\n- Your app's existing authentication (JWT, sessions, etc.) remains untouched\n- You map your user identity to lsdb context (see \"Integrating into an Existing Project\" below)\n\n### Authorize lsdb with Google\n\n```bash\nnpx lsdb auth\n```\n\nWalks you through the consent screen and saves `.lsdb-tokens.json` to the project root. If `GOOGLE_REDIRECT_URI` points at `localhost`/`127.0.0.1` and that port is free, `lsdb auth` opens your browser and catches Google's redirect automatically — no copying an authorization code out of the address bar. This step is optional (`lsdb sync` will run the same flow itself the first time it needs a token), but running it up front means auth happens once, on its own, instead of surprising you mid-`sync`.\n\n### Define a Schema\n\n```typescript\nimport { defineTable, string, number, date } from 'longcelot-sheet-db';\n\nexport default defineTable({\n  name: 'bookings',\n  actor: 'user',\n  timestamps: true,\n  columns: {\n    booking_id: string().required().unique(),\n    service: string().required(),\n    date: date().required(),\n    status: string().enum(['pending', 'confirmed', 'cancelled']).default('pending'),\n    price: number().min(0),\n  },\n});\n```\n\n### Use in Your Application\n\n```typescript\nimport { createSheetAdapter } from 'longcelot-sheet-db';\nimport bookingsSchema from './schemas/user/bookings';\n\nconst adapter = createSheetAdapter({\n  adminSheetId: process.env.ADMIN_SHEET_ID,\n  credentials: {\n    clientId: process.env.GOOGLE_CLIENT_ID,\n    clientSecret: process.env.GOOGLE_CLIENT_SECRET,\n    redirectUri: process.env.GOOGLE_REDIRECT_URI,\n  },\n  tokens: userOAuthTokens,\n});\n\nadapter.registerSchema(bookingsSchema);\n\nconst userContext = adapter.withContext({\n  userId: 'user_123',\n  actor: 'user',\n  actorSheetId: 'user-sheet-id',\n});\n\nawait userContext.table('bookings').create({\n  booking_id: 'bk_001',\n  service: 'Consultation',\n  date: new Date().toISOString(),\n  price: 100,\n});\n\nconst bookings = await userContext.table('bookings').findMany({\n  where: { status: 'pending' },\n  limit: 10,\n});\n```\n\n## 📚 Core Concepts\n\n### Actors\n\nActors are **data domains** — they determine *where* data is stored (which Google Sheet and which table schemas apply). Each actor maps to a sheet ID via an environment variable:\n\n```typescript\n// lsdb.config.ts\nactors: [\n  { name: \"admin\",  sheetIdEnv: \"ADMIN_SHEET_ID\" },\n  { name: \"user\",   sheetIdEnv: \"DEV_USER_SHEET_ID\" },\n  { name: \"seller\", sheetIdEnv: \"DEV_SELLER_SHEET_ID\" },\n]\n```\n\n> `ActorConfig.role` is accepted for backward compatibility but deprecated in favour of `name` — `role` reads as an RBAC role at the exact spot autocomplete shows it, which is the confusion this field exists to prevent. See [Actors vs Application Roles](#actors-vs-application-roles) and [FAQ #2](./FAQ.md#2-actors-vs-rbac-roles).\n\n```env\n# .env\nADMIN_SHEET_ID=1ABCyourAdminSheetId\nDEV_USER_SHEET_ID=1DEFyourDevUserSheetId    # optional for local dev\nDEV_SELLER_SHEET_ID=1GHIyourDevSellerSheetId  # optional for local dev\n```\n\n- **admin**: Data stored in central admin sheet (always required)\n- **user / seller**: Each actor gets a personal sheet at runtime; `DEV_*_SHEET_ID` values let you sync schemas during development without registering real users\n\n`lsdb init` scaffolds all env vars automatically based on the actors you define.\n\n### Actors vs Application Roles\n\nThese two concepts are distinct — confusing them leads to wrong architecture decisions:\n\n| Concept | What it controls | Dynamic? | Where defined |\n|---------|-----------------|----------|---------------|\n| **Actor** | *Where* data is stored (which Google Sheet, which schemas) | No — fixed in `lsdb.config.ts` | Config file |\n| **App RBAC role** | *What* a user can do (read orders, edit products, etc.) | Yes — rows in `roles` / `role_permissions` tables | Your app's DB layer |\n\nThe `actor` field in `withContext()` is the lsdb actor concept, not an RBAC role. If you need fine-grained permissions (e.g. \"manager can approve but not delete\"), build a `roles` + `role_permissions` table in the admin sheet and enforce it in your application layer — lsdb intentionally does not provide RBAC.\n\n**Field names follow the same rule everywhere actor identity appears** — each was renamed away from `role` because the bare word `role` reads as an RBAC role at the point of writing the code, regardless of what the docs say:\n\n| Location | Preferred field | Deprecated alias (still works, warns) |\n|---|---|---|\n| `lsdb.config.ts` actor entries | `name` | `role` |\n| `withContext()` | `actor` | `role` |\n| `withContext()` cross-actor target | `targetActor` | `targetRole` |\n\nModeling RBAC sub-roles (e.g. `operation`, `finance`, `marketing`) as separate actors is the most common version of this mistake — it usually means you need rows in a `roles` / `role_permissions` table inside one actor, not one actor config entry per sub-role.\n\n### Dev vs Production data model\n\nIn development, each actor type shares **one** sheet (`DEV_SELLER_SHEET_ID` for all sellers). In production, `createUserSheet()` creates **one sheet per registered user**. This means:\n\n- Some bugs that only appear with per-user data isolation are invisible in dev.\n- Use `lsdb mock-users` to create separate actor sheets that mirror the production topology for more realistic local testing.\n\n> **Tip**: Add a \"Dev vs Production\" section to your own `README.md` noting which tests cover per-user-sheet scenarios.\n\nThis same per-user isolation generalizes directly to the SQL adapters ([Migration Path](#-migration-path)): each non-admin table gets an injected `tenant_id` column, and `context.actorSheetId` — a real spreadsheet ID on Sheets — becomes the opaque `tenant_id` value on Postgres/MySQL/Prisma. Admin tables have no `tenant_id` column at all, matching Sheets' single global admin sheet. See [FAQ.md §13](./FAQ.md#13-sql-backend-portability--tenancy) for the full design rationale.\n\n### Schema DSL\n\nDefine tables using a fluent builder API:\n\n```typescript\n{\n  email: string().required().unique(),\n  age: number().min(18).max(100),\n  status: string().enum(['active', 'inactive']).default('active'),\n  verified: boolean().default(false),\n  metadata: json(),\n}\n```\n\n#### Column Modifiers\n\n- `required()` - Cannot be null\n- `unique()` - Enforced uniqueness\n- `default(value)` - Default value, applied on `create()` only (accepts arrays/objects for `json()` columns)\n- `min(n)` / `max(n)` - Validation constraints\n- `enum([...])` - Allowed values\n- `pattern(regex)` - Regex validation\n- `primary()` - Primary key\n- `readonly()` - Cannot be updated\n- `ref(table.column)` - Foreign key reference\n- `index()` - Create lookup index\n\n### CRUD Operations\n\n```typescript\nconst table = ctx.table('bookings');\n\n// Create\nawait table.create({ service: 'Consultation', price: 100 });\n\n// Bulk create — single API call\nawait table.createMany([\n  { service: 'Consultation', price: 100 },\n  { service: 'Follow-up', price: 50 },\n]);\n\n// Read\nawait table.findMany({\n  where: { status: 'pending' },\n  orderBy: 'date',\n  order: 'desc',\n  limit: 10,\n  offset: 0,\n});\n\nawait table.findOne({ where: { booking_id: 'bk_001' } });\n\n// Count (without loading all rows)\nconst total = await table.count({ where: { status: 'pending' } });\n\n// Update\nawait table.update({\n  where: { booking_id: 'bk_001' },\n  data: { status: 'confirmed' },\n});\n\n// Upsert (insert if not found, update if exists)\nawait table.upsert({\n  where: { email: 'admin@example.com' },\n  data: { role: 'admin', status: 'active' },\n});\n\n// Delete\nawait table.delete({ where: { booking_id: 'bk_001' } });\n```\n\n### Context & Permissions\n\nEvery operation requires context:\n\n```typescript\nconst context = adapter.withContext({\n  userId: 'user_123',\n  actor: 'user',       // preferred — maps to the actor data domain\n  actorSheetId: 'sheet-id',\n});\n// Note: role: is accepted for backward compatibility but deprecated in favour of actor:\n```\n\nPermissions are enforced automatically:\n- Users can only access their own sheets\n- Admin can access admin tables\n- Cross-actor access is blocked\n\n### Schema Version Tracking\n\n`longcelot-sheet-db` computes a **SHA-256 hash** of every table schema and compares it against the hash stored in the built-in `schema_versions` admin table. When `withContext()` is called for a non-admin user, the check runs in the background — every subsequent CRUD call awaits the result before proceeding.\n\nConfigure the behaviour in `lsdb.config.ts`:\n\n```typescript\nexport default {\n  // ...\n  onSchemaMismatch: 'warn',    // log warning and continue (default)\n  // onSchemaMismatch: 'error',     // throw SchemaMismatchError\n  // onSchemaMismatch: 'auto-sync', // sync the actor sheet automatically\n};\n```\n\nAnd pass it through to the adapter:\n\n```typescript\nimport { createSheetAdapter } from 'longcelot-sheet-db';\n\nconst adapter = createSheetAdapter({\n  adminSheetId: process.env.ADMIN_SHEET_ID,\n  credentials: { clientId, clientSecret, redirectUri },\n  tokens: oauthTokens,\n  onSchemaMismatch: 'warn', // or 'error' or 'auto-sync'\n});\n```\n\n| Mode | Behaviour |\n|------|-----------|\n| `'warn'` | Log a warning to stderr and continue — safe for production rollouts |\n| `'error'` | Throw `SchemaMismatchError` — useful in staging to hard-fail stale clients |\n| `'auto-sync'` | Silently sync the actor sheet and update the version record before proceeding |\n\nWhen you push a schema change, run `lsdb sync --all-users` to propagate it to every registered user sheet and update the version records in one go:\n\n```bash\n# Push schema changes to all user sheets\nnpx lsdb sync --all-users\n\n# Preview what would change without applying\nnpx lsdb sync --all-users --dry-run\n```\n\n### Integrating into an Existing Project\nIf you already have a working backend (e.g., Express, NestJS), you can safely inject `longcelot-sheet-db` without ripping out your framework:\n\n```bash\n# 1. Add the package\npnpm add longcelot-sheet-db\n\n# 2. Initialize project (creates config and schemas directory)\nnpx lsdb init\n\n# 3. Update your .env with Google OAuth credentials\n\n# 4. Authorize lsdb with Google (saves .lsdb-tokens.json)\nnpx lsdb auth\n\n# 5. Define your schemas in schemas/ directory\n\n# 6. Sync schemas to Google Sheets\nnpx lsdb sync\n\n# 7. Use in your backend code\n```\n\n**How it works with your existing auth**:\n- Your app continues to use your existing authentication (JWT, sessions, cookies)\n- When you need to access data, map your authenticated user to lsdb context:\n\n```typescript\n// Your Express/NestJS route handler\napp.get('/bookings', async (req, res) => {\n  // Your existing auth provides user info\n  const developerUser = req.user; // From your JWT/session\n\n  // Map to lsdb context\n  const userContext = adapter.withContext({\n    userId: developerUser.id,        // Your app's user ID\n    role: developerUser.role,         // 'student', 'teacher', etc.\n    actorSheetId: developerUser.sheetId, // From lsdb user registry\n  });\n\n  const bookings = await userContext.table('bookings').findMany();\n  res.json(bookings);\n});\n```\n\n### Google Sign-In & Auth Routes\n\nFor user-facing Google Sign-In, use `createLoginOAuthManager` (pre-configured with `openid email profile` scopes) and `createAuthRouter` to wire up the two required Express routes automatically.\n\n#### Login-only roles (admin / manager)\n\n```typescript\nimport express from 'express';\nimport { createSheetAdapter, createAuthRouter } from 'longcelot-sheet-db';\n\nconst adapter = createSheetAdapter({ ... });\n\nconst adminAuth = createAuthRouter({\n  adapter,\n  jwtSecret: process.env.JWT_SECRET!,\n  frontendUrl: process.env.FRONTEND_URL!,\n  registrationPolicy: 'login-only', // user must already exist — no self-signup\n  async onUser(profile, adapter) {\n    const ctx = adapter.withContext({\n      userId: 'auth',\n      role: 'admin',\n      actorSheetId: process.env.ADMIN_SHEET_ID!,\n    });\n    return await ctx.table('users').findOne({ where: { email: profile.email } });\n  },\n});\n\napp.use(adminAuth.handler);\n// Exposes: GET /auth/google  and  GET /auth/callback\n```\n\n#### Open registration (regular users)\n\n```typescript\nconst userAuth = createAuthRouter({\n  adapter,\n  jwtSecret: process.env.JWT_SECRET!,\n  frontendUrl: process.env.FRONTEND_URL!,\n  registrationPolicy: 'open', // allows self-signup (default)\n  basePath: '/user',           // → /user/auth/google, /user/auth/callback\n  async onUser(profile, adapter) {\n    const ctx = adapter.withContext({\n      userId: 'auth',\n      role: 'admin',\n      actorSheetId: process.env.ADMIN_SHEET_ID!,\n    });\n    let user = await ctx.table('users').findOne({ where: { email: profile.email } });\n    if (!user) {\n      // Auto-create the user and their sheet on first login\n      const sheetId = await adapter.createUserSheet(profile.sub, 'user', profile.email);\n      user = await ctx.table('users').findOne({ where: { email: profile.email } });\n    }\n    return user;\n  },\n});\n\napp.use(userAuth.handler);\n```\n\n**Registration policy summary:**\n\n| Policy | Behaviour |\n|--------|-----------|\n| `'open'` | Any Google-authenticated user can access; `onUser` returning `null` lets them in with bare profile |\n| `'login-only'` | `onUser` must return a non-null user; returns `401` if user is not found |\n\n#### Using `createLoginOAuthManager` directly\n\nIf you prefer to wire up routes manually:\n\n```typescript\nimport { createLoginOAuthManager } from 'longcelot-sheet-db';\n\nconst oauth = createLoginOAuthManager({\n  clientId: process.env.GOOGLE_CLIENT_ID!,\n  clientSecret: process.env.GOOGLE_CLIENT_SECRET!,\n  redirectUri: process.env.GOOGLE_REDIRECT_URI!,\n});\n\n// Step 1: redirect to Google\napp.get('/auth/google', (req, res) => res.redirect(oauth.getAuthUrl()));\n\n// Step 2: handle callback\napp.get('/auth/callback', async (req, res) => {\n  const tokens = await oauth.getTokens(req.query.code as string);\n  const profile = await oauth.verifyToken((tokens as Record<string, string>).id_token);\n  // ... lookup user, issue JWT\n});\n```\n\n### Why do we need `user_id` if we have `sheet_id`?\n\nThe `sheet_id` dictates the **physical storage location** on Google Drive — it exists only in the lsdb world. When you eventually graduate from Google Sheets to a production SQL database (MySQL, PostgreSQL), the `sheet_id` goes away entirely.\n\nThe `user_id` dictates the **logical domain identity** — it persists across all databases. This is your app's true primary key that ties your entire system together.\n\n| Field | Purpose | Persists after migration |\n|-------|---------|--------------------------|\n| `sheet_id` | Physical location in Google Drive | No — Google Sheets only |\n| `user_id` | Logical user identity | Yes — becomes PK in SQL |\n\n**Migration example**: When you export to Prisma, `user_id` becomes your primary key, while `sheet_id` is simply not included in the export.\n\n## 🛠️ CLI Commands\n\n> All commands can be run with `npx`, `pnpm dlx`, `yarn dlx`, or `bunx` — or directly as `lsdb <command>` if installed globally.\n\n### Initialize Project\n\n```bash\nnpx lsdb init\n# pnpm dlx lsdb init\n# yarn dlx lsdb init\n# bunx lsdb init\n```\n\nCreates project structure and configuration files.\n\n### Authorize with Google\n\n```bash\nnpx lsdb auth\n# pnpm dlx lsdb auth\n# yarn dlx lsdb auth\n# bunx lsdb auth\n\nnpx lsdb auth --force   # re-authorize even if a valid token is already stored\nnpx lsdb login          # alias for auth\n```\n\nRuns the Google OAuth consent flow and saves `.lsdb-tokens.json` to the project root. Opens your browser automatically; when `GOOGLE_REDIRECT_URI` is `localhost`/`127.0.0.1` and that port is free, a short-lived local server catches the redirect for you instead of asking you to paste the authorization code by hand. Falls back to the manual paste prompt whenever automatic capture isn't possible (non-local redirect URI, port already in use, timeout, or denied consent).\n\nRun this once after `init`, before your first `sync` — though it's entirely optional: `sync` (and `drop-table`/`drop-column`/`rename-column`) trigger the same flow themselves the first time they need a token.\n\n### Generate Schema\n\n```bash\nnpx lsdb generate bookings\n# pnpm dlx lsdb generate bookings\n# yarn dlx lsdb generate bookings\n# bunx lsdb generate bookings\n```\n\nInteractive schema generator with prompts for columns and types.\n\n### Sync Schemas\n\n```bash\nnpx lsdb sync\n# pnpm dlx lsdb sync\n# yarn dlx lsdb sync\n# bunx lsdb sync\n```\n\nCreates missing sheets and adds missing columns (never deletes data). Iterates **all actors** defined in `lsdb.config.ts` and prints a per-actor status table:\n\n```\nActor      │ Sheet ID                   │ Tables   │ Status\n───────────┼────────────────────────────┼──────────┼────────────\nadmin      │ 1ABCyourAdminSheetId       │ 3        │ ✅ synced\nstudent    │ 1DEFyourStudentSheetId     │ 5        │ ✅ synced\nteacher    │ (not set)                  │ 4        │ ⚠ skipped\n```\n\nActors whose sheet ID env var is not set are skipped with a warning (non-fatal).\n\n**`--table <names>`** — restrict the sync to specific table(s) instead of every registered schema. Pass a single name or a comma-separated list. Large schemas can easily hit Google's per-user Sheets API quota when syncing everything at once — use `--table` to sync just the table(s) that actually changed:\n\n```bash\nnpx lsdb sync --table bookings                    # sync one table\nnpx lsdb sync --table bookings,payments            # sync a few tables\nnpx lsdb sync --table bookings --all-users          # combine with --all-users\n```\n\nAn unknown table name fails fast and lists exactly which name(s) weren't found, instead of silently skipping them. Every schema is still *registered* on the adapter regardless of `--table` — only which tables get synced is restricted, so cross-table lookups (e.g. `--all-users`' read of the admin `users` table) keep working.\n\n**`--all-users`** — after syncing dev actor sheets, reads all rows from the admin `users` table and pushes any missing columns/tables to every registered user sheet. Updates the `schema_versions` record for each one. Uses exponential backoff (1s → 32s) to handle Google Sheets API rate limits.\n\n**`--dry-run`** — combine with `--all-users` to preview which user sheets are outdated without writing any changes:\n\n```bash\nnpx lsdb sync --all-users           # apply\nnpx lsdb sync --all-users --dry-run # preview only\n```\n\n**`--token-file <path>`** — CI/CD-friendly: load a pre-stored tokens JSON file instead of triggering the interactive browser OAuth prompt. Inject the file from a CI secret:\n\n```bash\n# In GitHub Actions:\necho \"$LSDB_TOKENS\" > /tmp/tokens.json\nnpx lsdb sync --token-file /tmp/tokens.json\n```\n\n### Validate Schemas\n\n```bash\nnpx lsdb validate\n# pnpm dlx lsdb validate\n# yarn dlx lsdb validate\n# bunx lsdb validate\n```\n\nChecks for:\n- Duplicate table names\n- Invalid modifiers\n- Unknown actors\n- Missing required fields\n\n### Seed Data\n\n```bash\nnpx lsdb seed <seed-file>\n# pnpm dlx lsdb seed seeds/admin.ts\n```\n\nLoad initial or test data into your sheets.\n\n**Seed file formats** — both are supported:\n\n```typescript\n// Static export (simple)\nexport default {\n  users: [\n    { email: 'admin@example.com', role: 'admin', status: 'active' },\n  ],\n}\n\n// Dynamic export (receives process.env — great for CI or per-environment seeds)\nexport default async function(env: NodeJS.ProcessEnv) {\n  return {\n    users: [\n      { email: env.SUPER_ADMIN_EMAIL, role: 'admin', status: 'active' },\n    ],\n  }\n}\n```\n\n**Flags:**\n- `--skip-existing` — skip rows where a unique column already matches (no error on re-seed)\n- `--upsert` — update existing rows on unique conflict instead of throwing\n- `--all-actors` — distribute seed data to all registered user sheets\n\n```bash\nnpx lsdb seed seeds/admin.ts --skip-existing  # idempotent re-seed\nnpx lsdb seed seeds/admin.ts --upsert          # update on conflict\n```\n\n### Doctor\n\n```bash\nnpx lsdb doctor\n# pnpm dlx lsdb doctor\n# yarn dlx lsdb doctor\n# bunx lsdb doctor\n```\n\nRuns environment and configuration health checks.\n\n### Status\n\n```bash\nnpx lsdb status\n# pnpm dlx lsdb status\n# yarn dlx lsdb status\n# bunx lsdb status\n```\n\nShows all registered tables, actors, and their sheet IDs.\n\n### ER Diagram\n\n```bash\nnpx lsdb erdiagram\n# pnpm dlx lsdb erdiagram\n# yarn dlx lsdb erdiagram\n# bunx lsdb erdiagram\n```\n\nGenerates `ER-DIAGRAM.md` (Mermaid `erDiagram`) mapping every registered table, its columns, and `ref()` relationships — offline, no Google Sheets calls. If the file already exists, prompts to overwrite, save under a different name, or cancel; pass `--yes` to overwrite non-interactively, or `--output <file>` to target a different path.\n\n```bash\nnpx lsdb erdiagram --output docs/schema.md\nnpx lsdb erdiagram --yes\n```\n\n## 🔐 Authentication\n\n### Google OAuth\n\n```typescript\nimport { createOAuthManager } from 'longcelot-sheet-db';\n\nconst oauth = createOAuthManager({\n  clientId: process.env.GOOGLE_CLIENT_ID,\n  clientSecret: process.env.GOOGLE_CLIENT_SECRET,\n  redirectUri: process.env.GOOGLE_REDIRECT_URI,\n});\n\nconst authUrl = oauth.getAuthUrl();\n\nconst tokens = await oauth.getTokens(code);\n\nconst payload = await oauth.verifyToken(idToken);\n```\n\n### Sign-In Router (`createAuthRouter`)\n\n```typescript\nimport { createAuthRouter, verifyJwt } from 'longcelot-sheet-db';\n\nconst auth = createAuthRouter({\n  adapter,\n  jwtSecret: process.env.JWT_SECRET!,\n  frontendUrl: process.env.FRONTEND_URL!,\n  registrationPolicy: 'login-only',\n  jwtExpiresInSeconds: 60 * 60 * 24, // default: 1 day\n  tokenDelivery: 'fragment', // '#token=...' — never hits server access logs/Referer; default is 'query' for backward compatibility\n  scopes: ['openid', 'email', 'profile'], // default: LOGIN_SCOPES (adds Sheets/Drive) — trim to identity-only to skip Google's sensitive-scope verification screen\n  async onUser(profile, adapter) {\n    const ctx = adapter.withContext({ userId: 'auth', actor: 'admin', actorSheetId: process.env.ADMIN_SHEET_ID! });\n    return await ctx.table('users').findOne({ where: { email: profile.email } });\n  },\n});\n\napp.use(auth.handler); // GET {basePath}/auth/google, GET {basePath}/auth/callback\n\n// In your own auth middleware, verify the JWT this router issues:\nconst payload = verifyJwt(token, process.env.JWT_SECRET!); // null if invalid, expired, or tampered\n```\n\nThe login flow is CSRF-protected with a signed `state` parameter and the issued JWT carries an `exp`\nclaim — see [OWASP-TOP-10.md → A01/A02/A07](./OWASP-TOP-10.md) for the reasoning.\n\n`scopes` must include `'openid'` — the callback needs an `id_token` to build the `GoogleProfile`\npassed to `onUser`; omitting it throws `ValidationError` when `createAuthRouter()` is called. See\n[`skills/auth-router/SKILL.md`](./skills/auth-router/SKILL.md#trimming-oauth-scopes-avoiding-the-unverified-app-screen)\nfor when to trim scopes and what `spreadsheets`/`drive.file` being Google-classified *sensitive*\nscopes means for the consent screen.\n\n### Password Hashing\n\n```typescript\nimport { hashPassword, comparePassword, validatePasswordStrength } from 'longcelot-sheet-db';\n\nconst hash = await hashPassword('SecurePass123!');\n\nconst isValid = await comparePassword('SecurePass123!', hash);\n\nconst { valid, errors } = validatePasswordStrength('password');\n```\n\n## 📁 File Upload & Drive Storage\n\n```typescript\nimport { createSheetAdapter, DriveStorageAdapter } from 'longcelot-sheet-db';\n\nconst adapter = createSheetAdapter({\n  ...,\n  storage: new DriveStorageAdapter({ folder: 'uploads' }),\n});\n\n// Returns a URL that renders directly — no per-project conversion helper needed.\nconst avatarUrl = await adapter.upload(imageBuffer, { filename: 'avatar.jpg', mimeType: 'image/jpeg', public: true });\n// 'https://drive.google.com/thumbnail?id=FILE_ID&sz=w1000'  → drop straight into <img src>\n\nconst videoUrl = await adapter.upload(videoBuffer, { filename: 'demo.mp4', mimeType: 'video/mp4', public: true });\n// 'https://drive.google.com/file/d/FILE_ID/preview'          → drop straight into <iframe src>\n\nconst pdfUrl = await adapter.upload(pdfBuffer, { filename: 'invoice.pdf', mimeType: 'application/pdf', public: true });\n// 'https://drive.google.com/file/d/FILE_ID/view'              → clickable open/preview link\n\n// Deleting a file works with any URL adapter.upload() ever returned for it:\nawait adapter.deleteFile(avatarUrl);\n```\n\nThe link format is chosen automatically from `mimeType` (image → thumbnail, video → embeddable preview, everything else → viewer link). If you need the raw downloadable file instead of a rendered preview (e.g. re-fetching bytes server-side), pass `linkFormat: 'download'`.\n\nAlready have links saved in the old `uc?id=` download format from before this behaviour shipped? Normalise them on read instead of writing your own conversion helper:\n\n```typescript\nimport { toDriveEmbedUrl } from 'longcelot-sheet-db';\n\nconst embeddable = toDriveEmbedUrl(row.avatar_url, 'image');\n```\n\nSee [`UploadOptions`](./API.md#uploadoptions) and [`adapter.upload()`](./API.md#adapteruploadfile-options) in API.md for the full option/return reference, and FAQ.md §14 for why the raw `uc?id=` link never rendered reliably.\n\n### Organizing uploads into (sub)folders\n\n`folder` accepts a `/`-separated path — each segment is created (or reused) as a real nested Drive folder, so a handful of upload categories become a handful of real subfolders:\n\n```typescript\nawait adapter.upload(contractBuffer, { filename: 'contract.pdf', mimeType: 'application/pdf', folder: 'my-app/contracts' });\nawait adapter.upload(avatarBuffer, { filename: 'avatar.jpg', mimeType: 'image/jpeg', folder: 'my-app/avatars' });\nawait adapter.upload(invoiceBuffer, { filename: 'invoice-042.pdf', mimeType: 'application/pdf', folder: 'my-app/invoices' });\n```\n\n### Per-actor upload placement — same Drive/isolation model as sheets\n\nWhen `adapter.upload()`/`deleteFile()` is called on a `withContext()`-scoped adapter, the file follows the exact same placement rule as that actor's sheet (`createUserSheet()`):\n\n- **Shared/dev model** (no `tokenStore`/`actorTokens` for that actor) — file goes to the shared admin Drive, under `driveFolder.root/subfolders[actor]/<folder>` if `driveFolder` is configured.\n- **Actor-owned model** (`tokenStore` has tokens for that `userId`, or `createUserSheet()` was given `actorTokens`) — file goes to that actor's *own* Drive, not the admin's, mirroring where their sheet lives.\n- No `withContext()`? Uploads behave exactly as before — flat, Drive-root-relative `folder`, no per-actor placement.\n\n```typescript\nconst adapter = createSheetAdapter({\n  adminSheetId,\n  credentials,\n  tokens,\n  driveFolder: { root: 'My App', subfolders: { seller: 'Sellers' } },\n  tokenStore, // optional — actors with stored tokens get their own Drive; everyone else shares the admin's\n  storage: new DriveStorageAdapter({ folder: 'uploads' }),\n});\n\nconst sellerCtx = adapter.withContext({ userId: 'seller_1', actor: 'seller', actorSheetId: sellerSheetId });\n\n// Shared model: My App/Sellers/uploads/... in the admin's Drive.\n// Actor-owned model (tokenStore has tokens for seller_1): My App/Sellers/uploads/... in\n// seller_1's own Drive instead — same place their sheet was created.\nawait sellerCtx.upload(listingImage, { filename: 'listing.jpg', mimeType: 'image/jpeg' });\n```\n\nSee [Per-actor upload placement mirrors createUserSheet()](./API.md#per-actor-upload-placement-mirrors-createusersheet) in API.md for the full resolution rules.\n\n## 📋 Sheet Structure\n\n### Central Admin Sheet\n\n- `users` - User registry with `actor_sheet_id` per user\n- `credentials` - Authentication data\n- `schema_versions` - Schema hash per `(actor_sheet_id, table_name)` — used for mismatch detection\n\n### User-Owned Sheets\n\nEach user gets their own sheet with tables based on their role:\n\n```\nuser-sheet-123\n  ├── profile\n  ├── bookings\n  ├── payments\n  └── settings\n```\n\n### Sheet Formatting\n\nEvery tab created or extended by `sync` / `syncSchema()` / `createUserSheet()` is formatted automatically — no config needed:\n\n- **Auto-fit columns** — header and data columns are resized to fit their content.\n- **Header row styling** — a light fill color, frozen by default so it stays visible while scrolling.\n- **Data validation dropdowns** — `boolean()` columns get a dropdown restricted to `TRUE`/`FALSE` (or `1`/`0`, see below); `string().enum([...])` columns get a dropdown of the allowed values. Both guard against invalid manual edits directly in the sheet.\n\nOverride the defaults via `sheetStyle` on `createSheetAdapter()`:\n\n```typescript\nconst adapter = createSheetAdapter({\n  // ...\n  sheetStyle: {\n    headerColor: '#E8F0FE',     // optional, falls back to this built-in default\n    freezeHeader: true,         // default: true\n    freezeFirstColumn: false,   // default: false\n    booleanFormat: 'TRUE_FALSE', // default: 'TRUE_FALSE', or '1_0'\n  },\n});\n```\n\nOverride per column instead of project-wide with `boolean({ format: '1_0' })` — useful when one table needs to match an external system's convention without changing every other table.\n\n### Read Caching & Rate Limits\n\n`findMany()`, `findOne()`, `count()`, `update()`, and `delete()` all read through an in-memory cache in `SheetClient`, enabled by default with a 2-second TTL — repeated or concurrent reads of the same tab within that window are served from cache or de-duplicated into a single Sheets API call instead of one call each. This exists because Google's default quota (60 read requests/min/user) is easy to exhaust once more than a couple of concurrent users are hitting the same tables — see FAQ.md #11 for the incident that motivated it.\n\nEvery write invalidates the cache for the tab it touched, so a read right after a write always sees fresh data. Tune or disable it via `cache` on `createSheetAdapter()`:\n\n```typescript\nconst adapter = createSheetAdapter({\n  // ...\n  cache: { ttlMs: 5000 }, // default: 2000ms; set enabled: false to disable\n});\n```\n\n### Batched Reads Across Tables (`ctx.prefetch()`)\n\nThe cache above only collapses *repeated* reads of the *same* tab — a request handler that reads N different tables still makes N `values.get` calls on a cold cache. `ctx.prefetch(tableNames)` closes that gap: it groups the requested tables by spreadsheet and issues one `spreadsheets.values.batchGet` per spreadsheet, filling the same read cache `getAllRows()` already checks — so the `table().findMany()` calls that follow are cache hits.\n\n```typescript\nconst adminCtx = adapter.withContext({ userId: 'system', actor: 'admin', actorSheetId: ADMIN_SHEET_ID });\nconst teamCtx = adapter.withContext({ userId: user.id, actor: 'team', actorSheetId: team.actor_sheet_id });\n\n// 8 tables across 2 spreadsheets → 2 API calls total, before any table() call runs\nawait Promise.all([\n  adminCtx.prefetch(['users', 'teams', 'team_members']),\n  teamCtx.prefetch(['projects', 'project_members', 'tasks', 'task_assignees', 'task_statuses']),\n]);\n\nconst [projects, tasks] = await Promise.all([\n  teamCtx.table('projects').findMany(),\n  teamCtx.table('tasks').findMany(),\n]); // served from cache — zero further API calls\n```\n\nCall it once near the top of a request handler (a Next.js layout/page, an Express route) with every table that handler is about to read. It's on the `DatabaseAdapter` contract as an optional method, implemented as a no-op on the SQL adapters — safe to call unconditionally in code that has to stay portable across engines. If one requested tab doesn't exist, Google rejects the whole `batchGet` with a 400; `prefetch()` falls back to individual reads for that batch so a typo'd table name doesn't take the others down with it. See [`ctx.prefetch()`](./API.md#ctxprefetchtablenames) in API.md and FAQ.md §11/§16 for the full request/quota math.\n\n### Per-Actor CRUD Quota (`actorClientForCrud`)\n\nGoogle's Sheets quota (60 reads + 60 writes/minute by default) is counted **per OAuth identity**. Normally every `table()` call — even against an actor-owned sheet living in that actor's own Drive — runs under the shared admin grant, so an app authenticating every user through one admin token shares that one 60/min budget across its whole user base. Opt in to route CRUD through each actor's own grant instead:\n\n```typescript\nconst adapter = createSheetAdapter({\n  adminSheetId: process.env.ADMIN_SHEET_ID,\n  credentials: { clientId, clientSecret, redirectUri },\n  tokens: adminTokens,\n  tokenStore: myTokenStore,   // required — actor tokens are resolved from here\n  actorClientForCrud: true,    // or: { onAuthError: 'fallback-admin', maxCachedClients: 200 }\n});\n```\n\nOnly table operations on the context actor's *own* sheet route through their client — admin tables and cross-actor targets always keep using the admin client, since it's the one identity guaranteed access to every sheet. An actor with no stored tokens is unaffected (falls back to the admin client, as before). Resolved actor clients share the admin client's read cache (not a separate one each), so a write through any client still invalidates the tab for all of them, and a refreshed access token is persisted back to `tokenStore` automatically. A revoked/expired grant (`invalid_grant`) raises a typed `ActorAuthError` by default, or falls back to the admin client for that call with `onAuthError: 'fallback-admin'`.\n\nSee [FAQ.md §16](./FAQ.md#16-actor-owned-crud-clients-per-actor-quota) for the full design write-up.\n\n> **Note**: implemented and passing lint/build, but doesn't have dedicated tests yet — see CHANGELOG.md `[Unreleased]` \"Known gaps\" if you're evaluating this for production use today.\n\n### Opting Out of Sharing Actor Sheets\n\n`createUserSheet()` shares a newly created admin-owned sheet with the actor's own email by default — right for apps where end users are meant to open their data directly in Sheets, wrong when the sheet is purely a storage backend: a direct edit can bypass app-level rules, invalidate the \"only the app writes here\" assumption a long cache TTL depends on, or (for a non-person actor with only a synthetic address) fail the share outright after the sheet's already been created.\n\n```typescript\n// Per call:\nawait adapter.createUserSheet('team_42', 'team', undefined, { shareWithActor: false });\n\n// Or adapter-wide default, overridable per call:\nconst adapter = createSheetAdapter({\n  // ...\n  sheetSharing: { shareWithActor: false },\n});\n```\n\n`shareWithActor: false` skips sharing with the actor entirely (sharing with `SUPER_ADMIN_EMAIL`, if configured, is unaffected) — `email` becomes optional in that case, so non-person actors without a real Google account don't need one. `shareRole: 'reader'`/`'commenter'` is a middle ground: the actor can see their own sheet but not edit it outside the app. A failed share raises a typed `SheetSharingError` carrying the orphaned `sheetId` so you can clean it up or retry, instead of a bare Drive error with no way to find the sheet it was created for. Defaults (`shareWithActor: true`, `shareRole: 'writer'`) are unchanged from before this option existed.\n\nSee [FAQ.md §17](./FAQ.md#17-opting-out-of-sharing-actor-sheets) for the full design write-up.\n\n> **Note**: implemented and passing lint/build, but doesn't have dedicated tests yet — see CHANGELOG.md `[Unreleased]` \"Known gaps\" if you're evaluating this for production use today.\n\n## 🎓 Complete Example\n\nComing Soon!\n\n## 🔄 Migration Path\n\nWhen you're ready for production, swapping `createSheetAdapter` for a real database is a **config/factory change, not a CRUD-call rewrite** — `SheetAdapter` and the SQL adapters below all implement the same `DatabaseAdapter`/`TableOperations` contract, so `adapter.withContext({...}).table('products').create({...})` reads identically either way. See [FAQ.md §13](./FAQ.md#13-sql-backend-portability--tenancy) for the tenancy design behind this.\n\n```typescript\nimport { createDatabaseAdapter } from 'longcelot-sheet-db';\n\n// Picks the engine from $DB_DRIVER ('sheets' | 'postgres' | 'mysql'), or pass driver explicitly.\n// A dev's .env points at sheets; CI/production's env points at postgres/mysql — zero code branching.\nconst adapter = createDatabaseAdapter();\nadapter.registerSchemas(schemas);\n```\n\n```typescript\n// Or construct a specific engine directly:\nimport { createSheetAdapter, createPostgresAdapter, createMySQLAdapter, createPrismaAdapter } from 'longcelot-sheet-db';\n\nconst dev = createSheetAdapter({ adminSheetId, credentials, tokens });\nconst prod = createPostgresAdapter({ connectionString: process.env.DATABASE_URL });\nconst prodMysql = createMySQLAdapter({ connectionString: process.env.DATABASE_URL });\n\n// Prisma: pass an already-`prisma generate`'d client — this package never runs Prisma codegen\n// itself (see FAQ.md §13). Run `lsdb migrate --prisma` + `prisma generate` first.\nimport { PrismaClient } from '@prisma/client';\nconst prodPrisma = createPrismaAdapter({ client: new PrismaClient() });\n```\n\nInstall only the driver you target — `pg`/`mysql2` are optional peer dependencies, lazily required only inside `createPostgresAdapter()`/`createMySQLAdapter()`, so `npm install longcelot-sheet-db` alone never pulls either in:\n\n```bash\nnpm install longcelot-sheet-db\nnpm install pg        # only if targeting Postgres\nnpm install mysql2    # only if targeting MySQL\nnpm install prisma @prisma/client   # only if targeting Prisma\n```\n\n### Which migrate command do I need?\n\n| Goal | Command |\n|------|---------|\n| Copy table structure only (schema / DDL) | `lsdb migrate --prisma` or `--sql` |\n| Apply that DDL to a live Postgres/MySQL database | `lsdb migrate --sql --apply --connection-string $DATABASE_URL` |\n| Copy structure + admin sheet row data | `lsdb migrate-data` |\n| Copy structure + all user-sheet row data | `lsdb migrate-data --all-users` |\n| Run the data cutover now, no generated script | `lsdb migrate-data --run --connection-string $DATABASE_URL --driver postgres` |\n| Preview any of the above without writing/executing | add `--dry-run` |\n\n### Schema export (structure only)\n\n```bash\n# Export to Prisma schema\nnpx lsdb migrate --prisma --output ./prisma\n\n# Export to SQL DDL (CREATE TABLE statements)\nnpx lsdb migrate --sql --output ./migrations\n\n# Export AND apply directly to a live database — idempotent, safe to rerun\nnpx lsdb migrate --sql --apply --connection-string postgres://user:pass@host/db\nnpx lsdb migrate --sql --apply --driver mysql --connection-string $DATABASE_URL\n\n# Prisma: shells out to `prisma migrate deploy` (needs an existing migrations/ folder —\n# run `prisma migrate dev` once locally first)\nnpx lsdb migrate --prisma --apply\n```\n\n`--driver` is inferred from the connection string's scheme (`postgres://`/`postgresql://` → postgres, `mysql://` → mysql) when omitted. `--dry-run` prints the statements that would run without executing them.\n\n### Data export (row data → production DB)\n\n```bash\n# Generate a migrate-data.js script (admin sheet only)\nnpx lsdb migrate-data\n\n# Admin sheet + all registered user sheets\nnpx lsdb migrate-data --all-users\n\n# Preview without writing\nnpx lsdb migrate-data --all-users --dry-run\n\n# Only migrate specific tables (comma-separated) instead of everything\nnpx lsdb migrate-data --table users,credentials,setup\n\n# Run the cutover now, in-process — no generated script, no insertRow() stub to fill in\nnpx lsdb migrate-data --run --all-users --connection-string $DATABASE_URL --driver postgres\n\n# Partial cutover: run now, but only for a specific set of tables\nnpx lsdb migrate-data --run --table users,credentials,setup --connection-string $DATABASE_URL --driver postgres\n```\n\nWithout `--run`, `migrate-data` generates a `migrate-data.js` script — replace the `insertRow()` stub with your real DB client and run it once. With `--run`, the cutover happens immediately against `createPostgresAdapter`/`createMySQLAdapter` (not Prisma — see [FAQ.md §13](./FAQ.md#13-sql-backend-portability--tenancy) for why), upserting every row by `_id` so reruns are safe by default — no separate `--upsert` flag needed. `--token-file` works the same as it does for `sync --token-file`, for CI/CD.\n\n`--table <names>` restricts the migration to specific tables instead of everything — pass a single name or a comma-separated list (e.g. `--table users,credentials,setup`) when a use case only needs a subset of the data moved. Works with both the script-generation path and `--run`; an unknown table name fails fast and lists exactly which name(s) weren't found instead of silently skipping them.\n\n> **Note**: `lsdb export` and `lsdb export-data` are deprecated — use `lsdb migrate` and `lsdb migrate-data` instead. In standard tooling (Prisma Migrate, Rails, Flyway), \"migrate\" means schema-only DDL changes, so the schema/DDL export command is now the one named `migrate`; the row-data export command is `migrate-data`.\n\n### Reference CI/CD pipeline\n\n`--apply`/`--run` are built to be invoked unattended from a deploy pipeline — same secrets convention as `sync --token-file` (`$DATABASE_URL` / a secret manager entry for the connection string, a stored tokens file for the Sheets read side), idempotent by default, `--dry-run` on both for a gated diff-review step. A typical GitHub Actions job:\n\n```yaml\n# In GitHub Actions:\njobs:\n  deploy:\n    steps:\n      - uses: actions/checkout@v4\n      - run: pnpm install --frozen-lockfile && pnpm build\n\n      # Schema: apply to staging, smoke test, then production only on a version tag —\n      # mirrors this package's own `publish` job's `if: startsWith(github.ref, 'refs/tags/v')` gate.\n      - run: npx lsdb migrate --sql --apply --connection-string ${{ secrets.STAGING_DATABASE_URL }}\n      - run: <your smoke test against staging>\n      - if: startsWith(github.ref, 'refs/tags/v')\n        run: npx lsdb migrate --sql --apply --connection-string ${{ secrets.PRODUCTION_DATABASE_URL }}\n\n      # Data cutover — run once (or repeatedly during a dual-write transition window, see below),\n      # not on every deploy.\n      - if: startsWith(github.ref, 'refs/tags/v')\n        run: |\n          npx lsdb migrate-data --run --all-users \\\n            --connection-string ${{ secrets.PRODUCTION_DATABASE_URL }} \\\n            --driver postgres \\\n            --token-file token.json\n```\n\n**When does \"ship to production\" actually happen?** Two options:\n\n- **Dual-write-then-flip (recommended default)** — both stores stay populated during a transition window: keep writing to Sheets as usual, rerun `migrate-data --run` periodically to keep the SQL side current (safe — always idempotent), then flip `DB_DRIVER=postgres` (via `createDatabaseAdapter()`) at deploy time once you're confident. Rollback is just flipping the env var back, since Sheets was never stopped.\n- **One-shot cutover** — run `migrate-data --run` once, flip the driver, and stop writing to Sheets entirely. Simpler, but harder to roll back from: the SQL adapters never auto-create/alter schema at runtime (§16.2), so there's no automatic \"flip back and resync\" path once Sheets stops being the source of truth.\n\nSee [FAQ.md §13](./FAQ.md#13-sql-backend-portability--tenancy) for the full tenancy/cutover design rationale.\n\n## 🗑️ Dropping & Renaming Schema Elements\n\n`lsdb sync` is deliberately **additive-only** — it creates tabs and appends missing columns, but never removes or renames anything, so it can never lose data on its own. Once a table or column is no longer needed (or needs a better name), use these commands to update the schema file *and* the live Google Sheet together:\n\n```bash\n# Drop table(s) — deletes the schema file and the Google Sheet tab\nnpx lsdb drop-table bookings\nnpx lsdb drop-table                    # interactive checkbox — pick any number of tables\nnpx lsdb drop-table --all-users        # also drop from every registered user's personal sheet\n\n# Drop column(s) from a table\nnpx lsdb drop-column bookings notes\nnpx lsdb drop-column bookings          # interactive checkbox over that table's columns\nnpx lsdb drop-column                   # interactive: pick the table, then its columns\n\n# Rename a column — updates the header cell in place, existing row data is preserved\nnpx lsdb rename-column bookings notes remarks\nnpx lsdb rename-column                 # interactive: pick table, pick column, type new name\n```\n\nAll three:\n- Print a plan and ask for confirmation before touching anything (skip with `--yes`)\n- Support `--dry-run` to preview without making changes\n- Support `--all-users` to also apply the change to every registered user's personal sheet (reads `actor_sheet_id` from the admin `users` table, same as `sync --all-users`)\n- Support `--token-file <path>` for CI\n- Refuse to touch reserved auto-generated columns (`_id`, `_created_at`, `_updated_at`, `_deleted_at`); `drop-column` also refuses to drop a table's primary key column (drop the whole table instead)\n- Warn — but don't block — if another table's `ref()` points at the table/column being dropped or renamed, since `ref()` strings in *other* schema files aren't rewritten automatically\n\n`rename-column` is the safe way to fix a column name: it edits the Google Sheet header cell in place instead of dropping and re-adding the column, so every existing row keeps its data. This matters most for production, where a bad rename that instead did drop+re-add would silently wipe that column's data across every registered user's sheet the next time it synced.\n\n## ⚡ Performance\n\n- Suitable for **hundreds to low thousands** of rows\n- Not suitable for millions of rows\n- Read operations: ~200-500ms\n- Write operations: ~300-700ms\n\n## 🔒 Security\n\n- bcrypt password hashing (10 rounds), with a guard against silent truncation past bcrypt's 72-byte input limit\n- Auth JWTs are short-lived (`exp` claim, 1 day by default) and verifiable via the exported `verifyJwt()` — see [Authentication](#-authentication)\n- OAuth login flow is CSRF-protected via a signed `state` parameter\n- `.lsdb-tokens.json` (OAuth refresh token) is written with `0o600` permissions — **note: this is plaintext on disk, restricted by file permissions, not encrypted at rest**; treat it as a credential\n- `lsdb init` scaffolds `.gitignore` entries for `.env`/`.lsdb-tokens.json` so secrets aren't committed by default\n- Sheets private by default — access control depends on who the underlying spreadsheet is shared with, see [OWASP-TOP-10.md → A01](./OWASP-TOP-10.md)\n- Role/permission validation on every cross-actor request (`accessControl.ts`)\n- SQL adapters use parameterized queries exclusively — no SQL injection risk via the CRUD API\n\n**For the full picture — what's fixed, what's a documented limitation, and what's on you to handle\nas the integrating developer or your end users — see [OWASP-TOP-10.md](./OWASP-TOP-10.md), a\ncategory-by-category OWASP Top 10 review of this package including concrete answers to \"an end\nuser's Google account gets compromised\" and \"someone edits the Sheet directly instead of through the\nAPI.\"\n\n## 📦 Architecture\n\n```\nDeveloper Backend\n      ↓\nlongcelot-sheet-db SDK\n      ↓\nGoogle OAuth2 → Google Sheets API\n      ↓\nCentral Admin Sheet\n      ↓\nUser-Owned Sheets\n```\n\n## 🎯 Use Cases\n\nPerfect for:\n- ✅ MVPs and prototypes\n- ✅ Staging environments\n- ✅ Internal tools\n- ✅ School/small business apps\n- ✅ Proof of concepts\n\nNot suitable for:\n- ❌ Production at scale\n- ❌ High-performance applications\n- ❌ Real-time analytics\n- ❌ Millions of records\n\n## 🤝 Contributing\n\nContributions welcome! This package is designed to be:\n- Simple over clever\n- Explicit over implicit\n- Safe over fast\n\n## 📄 License\n\nMIT\n\n## 🙏 Acknowledgments\n\nBuilt on:\n- [Google Sheets API](https://developers.google.com/sheets/api)\n- [googleapis](https://github.com/googleapis/google-api-nodejs-client)\n- [bcryptjs](https://github.com/dcodeIO/bcrypt.js)\n- [commander](https://github.com/tj/commander.js)\n- [inquirer](https://github.com/SBoudrias/Inquirer.js)\n\n---\n\n**Note**: This is a staging database solution. For production workloads, migrate to MySQL, PostgreSQL, or MongoDB.\n","readmeFilename":"README.md"}