├── .gitignore ├── README.md ├── deno.json ├── main.ts └── deno.lock /.gitignore: -------------------------------------------------------------------------------- 1 | *.txt 2 | *.log 3 | firebase.json 4 | scan.ts -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # firepwn-cli 2 | 3 | a simple tool for querying firebase -------------------------------------------------------------------------------- /deno.json: -------------------------------------------------------------------------------- 1 | { 2 | "tasks": { 3 | "dev": "deno run --watch main.ts" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /main.ts: -------------------------------------------------------------------------------- 1 | // @deno-types="https://cdn.esm.sh/v83/firebase@10.7.1/app/dist/app/index.d.ts" 2 | import { initializeApp } from "https://www.gstatic.com/firebasejs/10.7.1/firebase-app.js"; 3 | // @deno-types="https://cdn.esm.sh/v83/firebase@10.7.1/firestore/dist/firestore/index.d.ts" 4 | import { getFirestore, getDocs, setDoc, query, collectionGroup, collection, limit, where, WhereFilterOp, getAggregateFromServer, getCountFromServer, aggregateFieldEqual, aggregateQuerySnapshotEqual } from "https://www.gstatic.com/firebasejs/10.7.1/firebase-firestore.js"; 5 | // @deno-types="https://cdn.esm.sh/v83/firebase@10.7.1/firestore/dist/auth/index.d.ts" 6 | import { getAuth, signInWithCredential, signInWithCustomToken, signInWithEmailAndPassword } from "https://www.gstatic.com/firebasejs/10.7.1/firebase-auth.js" 7 | import * as log from "https://deno.land/std@0.211.0/log/mod.ts"; 8 | import { parse } from "https://deno.land/std@0.200.0/flags/mod.ts"; 9 | import { QueryConstraint } from "https://www.gstatic.com/firebasejs/10.7.1/firebase-firestore.js"; 10 | 11 | 12 | log.setup({ 13 | handlers: { 14 | console: new log.handlers.ConsoleHandler("DEBUG", { 15 | useColors: true, 16 | }), 17 | file: new log.handlers.FileHandler("INFO", { 18 | formatter: log.formatters.jsonFormatter, 19 | filename: "cli.log" 20 | }), 21 | }, 22 | loggers: { 23 | default: { 24 | handlers: ["console", "file"], 25 | level: "NOTSET" 26 | } 27 | } 28 | }); 29 | function parseConstraints(raw: string): QueryConstraint[] { 30 | const groups = raw.split(" && ") 31 | 32 | return groups.map((group) => { 33 | const ops = group.split(" ") 34 | return where(ops[0], ops[1] as WhereFilterOp, ops[2]) 35 | }) 36 | } 37 | 38 | const flags = parse(Deno.args, { 39 | boolean: ["get", "set"], 40 | string: ["config", "email", "password", "collection", "limit", "constraints"], 41 | default: { config: "firebase.json", get: true, collection: "users", set: false } 42 | }) 43 | 44 | const limitOrNull = flags.limit ? parseInt(flags.limit) : null 45 | 46 | const app = initializeApp(JSON.parse(Deno.readTextFileSync(flags.config))); 47 | const firestore = getFirestore(app); 48 | const auth = getAuth(app); 49 | 50 | 51 | if(flags.email && flags.password) { 52 | await signInWithEmailAndPassword(auth, flags.email, flags.password); 53 | } 54 | 55 | const constraints: QueryConstraint[] = [] 56 | if(limitOrNull) constraints.push(limit(limitOrNull)) 57 | if(flags.constraints) { 58 | constraints.push(...parseConstraints(flags.constraints)) 59 | } 60 | // constraints.push(where("userInfo.fullName.nickname", "==", "Plaito")) 61 | const coll = collection( 62 | firestore, 63 | flags.collection 64 | ) 65 | 66 | const docs = (await getDocs( 67 | query( 68 | coll, ...constraints 69 | ) 70 | )).docs.map((d) => d.data()) 71 | console.log(JSON.stringify(docs, null, 2)) 72 | Deno.exit(0) -------------------------------------------------------------------------------- /deno.lock: -------------------------------------------------------------------------------- 1 | { 2 | "version": "3", 3 | "redirects": { 4 | "https://cdn.esm.sh/v83/@firebase/app@0.7.24/dist/app-public.d.ts": "https://esm.sh/v83/@firebase/app@0.7.24/dist/app-public.d.ts", 5 | "https://cdn.esm.sh/v83/@firebase/component@0.5.14/dist/index.d.ts": "https://esm.sh/v83/@firebase/component@0.5.14/dist/index.d.ts", 6 | "https://cdn.esm.sh/v83/@firebase/firestore@3.4.9/dist/index.d.ts": "https://esm.sh/v83/@firebase/firestore@3.4.9/dist/index.d.ts", 7 | "https://cdn.esm.sh/v83/@firebase/logger@0.3.2/dist/index.d.ts": "https://esm.sh/v83/@firebase/logger@0.3.2/dist/index.d.ts", 8 | "https://cdn.esm.sh/v83/@firebase/util@1.6.0/dist/util-public.d.ts": "https://esm.sh/v83/@firebase/util@1.6.0/dist/util-public.d.ts", 9 | "https://cdn.esm.sh/v83/firebase@10.7.1/app/dist/app/index.d.ts": "https://esm.sh/v83/firebase@10.7.1/app/dist/app/index.d.ts", 10 | "https://cdn.esm.sh/v83/firebase@10.7.1/firestore/dist/auth/index.d.ts": "https://esm.sh/v83/firebase@10.7.1/firestore/dist/auth/index.d.ts", 11 | "https://cdn.esm.sh/v83/firebase@10.7.1/firestore/dist/firestore/index.d.ts": "https://esm.sh/v83/firebase@10.7.1/firestore/dist/firestore/index.d.ts", 12 | "https://cdn.esm.sh/v83/firebase@9.8.1/app/dist/app/index.d.ts": "https://esm.sh/v83/firebase@9.8.1/app/dist/app/index.d.ts", 13 | "https://cdn.esm.sh/v83/firebase@9.8.1/firestore/dist/auth/index.d.ts": "https://esm.sh/v83/firebase@9.8.1/firestore/dist/auth/index.d.ts", 14 | "https://cdn.esm.sh/v83/firebase@9.8.1/firestore/dist/firestore/index.d.ts": "https://esm.sh/v83/firebase@9.8.1/firestore/dist/firestore/index.d.ts" 15 | }, 16 | "remote": { 17 | "https://cdn.skypack.dev/-/@firebase/app@v0.6.28-9llV6BHulQZMJrbeJ7bn/dist=es2019,mode=imports/optimized/@firebase/app.js": "22395386aabc54dba3af2d08a53942076a4c51d4c92b9d71cec878e4d78e7524", 18 | "https://cdn.skypack.dev/-/@firebase/app@v0.7.14-GJlXydJb3JcmLu0qkTHq/dist=es2019,mode=imports/optimized/@firebase/app.js": "4b648ab737e7cc02342809b12da29c84e8dc3bdd77b9792034be4a84737a5041", 19 | "https://cdn.skypack.dev/-/@firebase/app@v0.9.24-KO1HDAKrs8sL2vx5RacN/dist=es2019,mode=imports/optimized/@firebase/app.js": "0a9503f0d9fbf56060c43b02192736fd222e633642cb2c94b132de7a58993a07", 20 | "https://cdn.skypack.dev/-/@firebase/app@v0.9.25-uQ2tyI5jE3UeELJ8ua1W/dist=es2019,mode=imports/optimized/@firebase/app.js": "dae90ef9a48cb5cdb5ac216b959c36fdc510852577527df5b0ea4625381a1553", 21 | "https://cdn.skypack.dev/-/@firebase/auth@v0.16.8-fuIw7Baswv7gZ8Si3voa/dist=es2019,mode=imports/optimized/@firebase/auth.js": "27b260a67d5d68689651ae8053cd5cc948ed44ecc4bbd67a4c1f7d350056022d", 22 | "https://cdn.skypack.dev/-/@firebase/auth@v1.5.1-1a4vH0Nj6CXhY25pj9u0/dist=es2019,mode=imports/optimized/@firebase/auth.js": "d514a7ba2b75186d6ce84f7906696c1be3e2d454be2cc8794d0a21c48cc42374", 23 | "https://cdn.skypack.dev/-/@firebase/auth@v1.5.1-1a4vH0Nj6CXhY25pj9u0/dist=es2019,mode=imports/optimized/common/index-dd468b12-3caeaadb.js": "2747b8dde6fb6b612e1e757d8cf17620cc557448944713a5f26823022b866819", 24 | "https://cdn.skypack.dev/-/@firebase/component@v0.5.10-FCGhmwktBGOMfs8IijTq/dist=es2019,mode=imports/optimized/@firebase/component.js": "908ca2c2b9e7e3985d10cd5059269986a3e27d1f10aff1593218a8987553d781", 25 | "https://cdn.skypack.dev/-/@firebase/component@v0.5.4-oTertoV5qLQJ2lhZrxNv/dist=es2019,mode=imports/optimized/@firebase/component.js": "5e8fe87041bd5d9c885f0db60dacbb6966d66294ca00e78ee4645489e5d66a04", 26 | "https://cdn.skypack.dev/-/@firebase/component@v0.6.4-ZyfJv9m3y7xDo8Mzr8GZ/dist=es2019,mode=imports/optimized/@firebase/component.js": "59f3d0416372f1211629c92ecec7a91e91750b21555b2a2bb41969129669b6e7", 27 | "https://cdn.skypack.dev/-/@firebase/firestore@v2.3.8-7gekwIXeA2YXJh4nbMEY/dist=es2019,mode=imports/optimized/@firebase/firestore.js": "ece13d8df147a9f3cead3df357d22fa355e6884984da5ba8eba3b9c5f1a11aaa", 28 | "https://cdn.skypack.dev/-/@firebase/firestore@v4.4.0-wt4jdaqOqwer6n3JSlIf/dist=es2019,mode=imports/optimized/@firebase/firestore.js": "90f82ca9709b441e9703c33a10b1e0120a8b90e4a153a34cb4052967171e92d5", 29 | "https://cdn.skypack.dev/-/@firebase/logger@v0.2.6-KFivBUFGdEto0GXibKni/dist=es2019,mode=imports/optimized/@firebase/logger.js": "d8f11b51944b3e381333bc1733d88de62d7d0ee2f70ea6d4e67497757aaa5919", 30 | "https://cdn.skypack.dev/-/@firebase/logger@v0.3.2-h7x4OWlAPVjgNAAOr2gq/dist=es2019,mode=imports/optimized/@firebase/logger.js": "8c9fdd52e7b5b616539b6d7ae2b0a95d240674e08676eeaa5a41b0dab55d4e25", 31 | "https://cdn.skypack.dev/-/@firebase/logger@v0.4.0-vAjs4JSNs94ow0Lastod/dist=es2019,mode=imports/optimized/@firebase/logger.js": "8c9fdd52e7b5b616539b6d7ae2b0a95d240674e08676eeaa5a41b0dab55d4e25", 32 | "https://cdn.skypack.dev/-/@firebase/util@v1.1.0-nQeCTYIuiZvfsLgRZz9e/dist=es2019,mode=imports/optimized/@firebase/util.js": "9933c92535c416158f40b870325452c770028fe519917f6d02ae9172cc908b1b", 33 | "https://cdn.skypack.dev/-/@firebase/util@v1.4.3-13BnGdo0A5uxcz6gH7eX/dist=es2019,mode=imports/optimized/@firebase/util.js": "75d0192d1a5d0e0aac44c16558d4b2ab823e9df72dcefbf9fee08d34d470453d", 34 | "https://cdn.skypack.dev/-/@firebase/util@v1.9.3-Otdm5pMQplWhiZOSkLZY/dist=es2019,mode=imports/optimized/@firebase/util.js": "d2e012af53654ace5f864813e7aaf6462311225cc5c2ea230add7ab71b2cbc0f", 35 | "https://cdn.skypack.dev/-/@firebase/webchannel-wrapper@v0.10.5-caWWUEJTnhfQDDL8DiyS/dist=es2019,mode=imports/optimized/@firebase/webchannel-wrapper.js": "8e5b2a9a5c814f02e9cdc020f2618bacaddbab29f112f277c392152dc75dfa59", 36 | "https://cdn.skypack.dev/-/@firebase/webchannel-wrapper@v0.5.1-oLxOOHy3gMITgSlEdwlF/dist=es2019,mode=imports/optimized/@firebase/webchannel-wrapper.js": "572f6a23d90de819b92f4852728b59fe2eec56ba8ca01f8f3e6c06e22837d885", 37 | "https://cdn.skypack.dev/-/firebase@v10.7.1-fqGWRBYkw4uEChkCQAyK/dist=es2019,mode=imports/optimized/firebase/app.js": "96bc5d02b16f59ed6074c8058d5b1786dcecf2ca8fd143808943c32235bf6e88", 38 | "https://cdn.skypack.dev/-/firebase@v10.7.1-fqGWRBYkw4uEChkCQAyK/dist=es2019,mode=imports/optimized/firebase/auth.js": "7d41ed812390a66f69d1abb6f7b649418a3033c62e25cc1ea2c42e82154556cf", 39 | "https://cdn.skypack.dev/-/firebase@v10.7.1-fqGWRBYkw4uEChkCQAyK/dist=es2019,mode=imports/optimized/firebase/firestore.js": "3b189c8d0bbf9de6d54ab324b9585372986175cf94a22ae33864b7c1b54da690", 40 | "https://cdn.skypack.dev/-/firebase@v8.7.0-R1buAnY5aIDeDJQPEnxL/dist=es2019,mode=imports/unoptimized/app/dist/index.esm.js": "1f67ab70bb513f1d3135eedbb80293cc5b855370070699c5f41db1b7d2839bdb", 41 | "https://cdn.skypack.dev/-/firebase@v8.7.0-R1buAnY5aIDeDJQPEnxL/dist=es2019,mode=imports/unoptimized/auth/dist/index.esm.js": "b79c9bede50efb597433662ad89e86b9a5415320c4c5e1a9ff3d6f332d70f326", 42 | "https://cdn.skypack.dev/-/firebase@v8.7.0-R1buAnY5aIDeDJQPEnxL/dist=es2019,mode=imports/unoptimized/firestore/dist/index.esm.js": "1dd8846f80a935e1b51f484b7888bcda6e8ef68f2c63b2732579f5679c0b3611", 43 | "https://cdn.skypack.dev/-/idb@v7.1.1-KtA6Bbf3exCXjzK8kKYV/dist=es2019,mode=imports/optimized/idb.js": "5220653c06a4eafc44302ea3f64123bb29561380edc281b7504f000779cacfcc", 44 | "https://cdn.skypack.dev/-/idb@v7.1.1-KtA6Bbf3exCXjzK8kKYV/dist=es2019,mode=imports/optimized/idb/build/wrap-idb-value.js": "50db814d2395baac0d1cee013fc6a34a8fb982fa5cfe097ff8276b7f778d58f1", 45 | "https://cdn.skypack.dev/-/tslib@v2.2.0-aACEbPrqb1U8uyinA6J0/dist=es2019,mode=imports/optimized/tslib.js": "95ccfbf8bc9c5b81a343a5827eb6960f24bd26d3aa2dae4f54be032f03d94466", 46 | "https://cdn.skypack.dev/-/tslib@v2.3.0-7PdXE4NamvODmIuM0tBj/dist=es2019,mode=imports/optimized/tslib.js": "6e5577ae3f56b65d3363105e22a8953adfa0ea795b7f93e9377d8ed35e2bd314", 47 | "https://cdn.skypack.dev/-/tslib@v2.3.1-oagOtGnmjZ2E5Gt5m3zI/dist=es2019,mode=imports/optimized/tslib.js": "6a8aec215e19801a0cc9dfae2d87b3d5e774115c0684d3bd173ea7950c3a3e9e", 48 | "https://cdn.skypack.dev/-/tslib@v2.6.2-OVagwiLDRFa7T0n3eDR1/dist=es2019,mode=imports/optimized/tslib.js": "7e714aa04743c2b7e426a28fe18074b35ae8d4f53d613e069b5fd9c7b740753b", 49 | "https://cdn.skypack.dev/firebase@10.7.1/app?dts": "70be86497954bafac4e09aec060e58ad407f38f6e63d6e0251452d25cac48cfb", 50 | "https://cdn.skypack.dev/firebase@10.7.1/auth?dts": "e46945bc4edb9275b3f0619dd42664172bc8e947471c7b39e694dbd378c05298", 51 | "https://cdn.skypack.dev/firebase@10.7.1/firestore?dts": "7c37c76286b3a6bca0b7777446784ab4372bc9823a6285ff3255b2a72f78c55f", 52 | "https://cdn.skypack.dev/firebase@8.7.0/app": "e0aa6c4648f185d0bfd8528e9ffb66f529b3d8f5354b6e32b0d702f4371a0d71", 53 | "https://cdn.skypack.dev/firebase@8.7.0/app?dts": "e0aa6c4648f185d0bfd8528e9ffb66f529b3d8f5354b6e32b0d702f4371a0d71", 54 | "https://cdn.skypack.dev/firebase@8.7.0/auth": "dc06bbc24bd86ae06ce2ee8c84a58a9a0c9e5f84fcf4fe81701c698fdfb36a9f", 55 | "https://cdn.skypack.dev/firebase@8.7.0/auth?dts": "dc06bbc24bd86ae06ce2ee8c84a58a9a0c9e5f84fcf4fe81701c698fdfb36a9f", 56 | "https://cdn.skypack.dev/firebase@8.7.0/firestore": "712d5182d582e693fbd058562eda825da1efa14c8961b1ef289fc8efc57b7691", 57 | "https://cdn.skypack.dev/firebase@8.7.0/firestore?dts": "712d5182d582e693fbd058562eda825da1efa14c8961b1ef289fc8efc57b7691", 58 | "https://deno.land/std@0.200.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", 59 | "https://deno.land/std@0.200.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", 60 | "https://deno.land/std@0.200.0/flags/mod.ts": "a5ac18af6583404f21ea03771f8816669d901e0ff4374020870334d6f61d73d5", 61 | "https://deno.land/std@0.211.0/assert/assert.ts": "bec068b2fccdd434c138a555b19a2c2393b71dfaada02b7d568a01541e67cdc5", 62 | "https://deno.land/std@0.211.0/assert/assertion_error.ts": "9f689a101ee586c4ce92f52fa7ddd362e86434ffdf1f848e45987dc7689976b8", 63 | "https://deno.land/std@0.211.0/fmt/colors.ts": "be082d6a6bbb2980ae7b2bf8c23c6bb2811ba90a06a9bcb861344a71784c5a99", 64 | "https://deno.land/std@0.211.0/fs/exists.ts": "d2757ef764eaf5c6c5af7228e8447db2de42ab084a2dae540097f905723d83f5", 65 | "https://deno.land/std@0.211.0/log/formatters.ts": "1f15655539114dee5349d4a0f4279a91ef1a4aa6d43cfb8da796cd8d54230150", 66 | "https://deno.land/std@0.211.0/log/handlers.ts": "64129871b28bc2320bf0215c09aed476a80bcc4662256dac124731c6e0c41f9e", 67 | "https://deno.land/std@0.211.0/log/levels.ts": "106caa4c032d7d29966c6d2ddad566017568db69ad1cafe2c03ce6fa38d21002", 68 | "https://deno.land/std@0.211.0/log/logger.ts": "93b01b463d5ac933da19a05d8725b5f54bd209596a573d41aeffccca2b003f9e", 69 | "https://deno.land/std@0.211.0/log/mod.ts": "c955d3885ad45a36ca4266c27a6e72dc9385796fc7d91296e712e3aac1b98138", 70 | "https://deno.land/x/virtualstorage@0.1.0/mod.ts": "9449c2f86fab7d09fd7b76446c7852515bbe512cca925a93793e0361d1e266d4", 71 | "https://deno.land/x/virtualstorage@0.1.0/virtualStorage.ts": "602965ab9985f0e330587db8b60c2639611622cfd608d1964ade58ed746db09d", 72 | "https://www.gstatic.com/firebasejs/10.7.1/firebase-app.js": "a2b53a9e910b09997ffc8866bbebcc6e8923d3fb4548d83fa362daea35efe157", 73 | "https://www.gstatic.com/firebasejs/10.7.1/firebase-auth.js": "41d426187bedf96195418afcb5be4520186091908e79a40d632c8f97ecc3d20e", 74 | "https://www.gstatic.com/firebasejs/10.7.1/firebase-firestore.js": "33b6a8d0a32c0126acb0a8af9bfce57855172c456707559934659b0137621558", 75 | "https://www.gstatic.com/firebasejs/9.8.1/firebase-app.js": "81d16c8e1c79d9c647c0a28af64b25d95fc2979e45d806d374e981bf7b56393d", 76 | "https://www.gstatic.com/firebasejs/9.8.1/firebase-auth.js": "f2fe9fda7d7136d8af00ce272428cf7674cea818085aa4ad0950e0f4307e9bea", 77 | "https://www.gstatic.com/firebasejs/9.8.1/firebase-firestore.js": "18cef71d7554baa7e5a167dc544c581aaaab27fef16b28c14787c84a9c60382d" 78 | } 79 | } 80 | --------------------------------------------------------------------------------