{"id":14975727,"url":"https://github.com/kukuster/mongo_dottype","last_synced_at":"2025-10-27T14:31:17.836Z","repository":{"id":57301722,"uuid":"337046118","full_name":"Kukuster/mongo_dotType","owner":"Kukuster","description":"TypeScript types for using dot notation in mongo queries","archived":false,"fork":false,"pushed_at":"2021-02-23T11:32:47.000Z","size":17,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-10-09T18:19:25.832Z","etag":null,"topics":["dot","dotnotation","mongo","mongodb","mongoose","mongoosejs","notation","ts","type","types","typescript","utils"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/mongo_dottype","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Kukuster.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-02-08T10:58:51.000Z","updated_at":"2024-07-07T20:23:28.000Z","dependencies_parsed_at":"2022-08-24T17:11:45.735Z","dependency_job_id":null,"html_url":"https://github.com/Kukuster/mongo_dotType","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kukuster%2Fmongo_dotType","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kukuster%2Fmongo_dotType/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kukuster%2Fmongo_dotType/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kukuster%2Fmongo_dotType/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Kukuster","download_url":"https://codeload.github.com/Kukuster/mongo_dotType/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":219861084,"owners_count":16556007,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dot","dotnotation","mongo","mongodb","mongoose","mongoosejs","notation","ts","type","types","typescript","utils"],"created_at":"2024-09-24T13:52:27.206Z","updated_at":"2025-10-27T14:31:12.540Z","avatar_url":"https://github.com/Kukuster.png","language":"TypeScript","readme":"# mongo_dotType\n\nTypeScript (v4.1+) types for using \u003ca href=\"https://docs.mongodb.com/manual/core/document/#document-dot-notation\"\u003emongoDB dot notation\u003c/a\u003e while querying mongo documents.\n\n## How to use\n\n*Install*\n\n```bash\nnpm install mongo_dottype --save-dev\n```\n\n*Use*\n\n```TypeScript\nimport { mongoDot_lvl2 } from \"mongo_dottype\";\n\ninterface Users {\n    /* ... */\n}\n\n// If you don't need array indices for \"array element dot notation\"\ntype Users_dotNotation_a = mongoDot_lvl2\u003cUsers\u003e;\n\n// If you need some array indices to work, i.e. for the first two elements\ntype Users_dotNotation_b = mongoDot_lvl2\u003cUsers, 0|1\u003e;\n\n// Although allowed, by the TypeScript v4.1.4 type inference for this case is practically not supported (see the bottom section)\ntype Users_dotNotation_c = mongoDot_lvl2\u003cUsers, number\u003e;\n```\n\u003cbr\u003e\n\n## Quick example:\n\n\u003cdetails\u003e\n    \u003csummary\u003eDoc1.ts\u003c/summary\u003e\n  \n```TypeScript\nimport { mongoDot_lvl2 } from \"mongo_dottype\";\n\nexport interface Doc1 {\n    prop1: string,\n    prop2: {\n        sp21:  string,\n        sp22?: number,\n    },\n    prop3: number,\n    prop4: {\n        sp41: string,\n        sp42: number,\n    },\n    prop5: string[];\n};\n\n\nexport type Doc1_mongoDot = mongoDot_lvl2\u003cDoc1, 0|1|2\u003e;\n//\n// the type resolves to:\n//\ntype Doc1_mongoDot = {\n    _id?: number;\n    __v?: number;\n    prop1?: string;\n    prop2?: {\n        sp21: string;\n        sp22?: number;\n    };\n    \"prop2.sp21\"?: string;\n    \"prop2.sp22\"?: number;\n    prop3?: number;\n    prop4?: {\n        sp41: string;\n        sp42: number;\n    };\n    \"prop4.sp41\"?: string;\n    \"prop4.sp42\"?: number;\n    prop5?: string[];\n    \"prop5.0\"?: string;\n    \"prop5.1\"?: string;\n    \"prop5.2\"?: string;\n}\n\n\n```\n\u003c/details\u003e\n\n\u003cbr\u003e\n\n## Longer example:\n\n\u003cdetails\u003e\n    \u003csummary\u003eDoc2.ts\u003c/summary\u003e\n\n```TypeScript\nexport interface Doc2 {\n    prop1: string,\n    prop2: {\n        sp21: string,\n        sp22: number,\n        sp23: {\n            sp23el_prop1: number,\n            sp23el_prop2?: string,\n        }[],\n        sp24?: {\n            ssp241: string,\n            ssp242?: boolean,\n        }\n    },\n    prop3: number,\n    prop4: {\n        sp41: string,\n        sp42: number,\n    },\n    prop5: string[];\n    prop6: {\n        prop6el_prop1: string,\n        prop6el_prop2?: number,\n    }[];\n    prop7?: string[];\n};\n\n\nexport type Doc2_mongoDot = mongoDot_lvl2\u003cDoc2, 0|1|2\u003e;\n//\n// the type resolves to:\n//\ntype Doc2_mongoDot = {\n    _id?: number;\n    __v?: number;\n    prop1?: string;\n    prop2?: {\n        sp21: string;\n        sp22: number;\n        sp23: {\n            sp23el_prop1: number;\n            sp23el_prop2?: string;\n        }[];\n        sp24?: {\n            ssp241: string;\n            ssp242?: boolean;\n        };\n    };\n    \"prop2.sp21\"?: string;\n    \"prop2.sp22\"?: number;\n    \"prop2.sp23\"?: {\n        sp23el_prop1: number;\n        sp23el_prop2?: string;\n    }[];\n    \"prop2.sp23.0\"?: {\n        sp23el_prop1: number;\n        sp23el_prop2?: string;\n    };\n    \"prop2.sp23.1\"?: {\n        sp23el_prop1: number;\n        sp23el_prop2?: string;\n    };\n    \"prop2.sp23.2\"?: {\n        sp23el_prop1: number;\n        sp23el_prop2?: string;\n    };\n    \"prop2.sp24\"?: {\n        ssp241: string;\n        ssp242?: boolean;\n    };\n    \"prop2.sp24.ssp241\"?: string;\n    \"prop2.sp24.ssp242\"?: boolean;\n    prop3?: number;\n    prop4?: {\n        sp41: string;\n        sp42: number;\n    };\n    \"prop4.sp41\"?: string;\n    \"prop4.sp42\"?: number;\n    prop5?: string[];\n    \"prop5.0\"?: string;\n    \"prop5.1\"?: string;\n    \"prop5.2\"?: string;\n    prop6?: {\n        prop6el_prop1: string;\n        prop6el_prop2?: number;\n    }[];\n    \"prop6.0\"?: {\n        prop6el_prop1: string;\n        prop6el_prop2?: number;\n    };\n    \"prop6.0.prop6el_prop1\"?: string;\n    \"prop6.0.prop6el_prop2\"?: number;\n    \"prop6.1\"?: {\n        prop6el_prop1: string;\n        prop6el_prop2?: number;\n    };\n    \"prop6.1.prop6el_prop1\"?: string;\n    \"prop6.1.prop6el_prop2\"?: number;\n    \"prop6.2\"?: {\n        prop6el_prop1: string;\n        prop6el_prop2?: number;\n    };\n    \"prop6.2.prop6el_prop1\"?: string;\n    \"prop6.2.prop6el_prop2\"?: number;\n    prop7?: string[];\n    \"prop7.0\"?: string;\n    \"prop7.1\"?: string;\n    \"prop7.2\"?: string;\n}\n\n```\n\u003c/details\u003e\n\n\n\u003cbr\u003e\n\n\n\n## Deepness and performance\nThe package provides only with types for subproperties up to 2 levels deep, i.e.:\n```TypeScript\n// from\n{\n    prop2: {\n        sp24: {\n            ssp241: string;\n        };\n    };\n}\n// to\n{\n    \"prop2.sp24.ssp241\"?: string;\n}\n```\nBut you can still define deeper levels yourself (3rd, 4th, maybe 5th) by copying commented definitions from the `mongoDotType.type.d.ts` file.\n\nThese definitions were left commented intentionally though.\n\nStarting with level 3, simply having such high level type alias definition can cause TS compiler to run slower.\n\nStarting with level 4, in some cases TypeScript fails to instantiate a type producing the error:\n`Type instantiation is excessively deep and possibly infinite. ts(2589)`\n\nYou are unlikely to make level 5 work at all. If you do, more power to you!\n\n\n\n\u003cbr\u003e\n\n## Even longer example (using mongoose):\n\n**_Say you create a mongoose model:_**\n\n\u003cdetails\u003e\n  \u003csummary\u003eDoc3.model.ts\u003c/summary\u003e\n  \n  ```TypeScript\nimport { Document, model, Schema } from \"mongoose\";\n\n\nexport interface Doc3 {\n    prop1: string,\n    prop2: {\n        sp21: string,\n        sp22?: number,\n        sp23: {\n            ssp23el_prop1: number,\n            ssp23el_prop2?: string,\n        }[],\n    },\n    prop3: number,\n    prop4: {\n        sp41: string,\n        sp42: number,\n        sp43: number[];\n        sp44: {\n            ssp441: number,\n            ssp442: string,\n            ssp443: {\n                sssp4431: string,\n                sssp4432: number,\n                sssp4433: number,\n            },\n        }\n    },\n    prop5: string[];\n    prop6: {\n        prop6el_prop1: string,\n        prop6el_prop2?: number,\n        prop6el_prop3?: {\n            prop6el_prop3el_prop1: string,\n            prop6el_prop3el_prop2: number,\n            prop6el_prop3el_prop3: {\n                prop6el_prop3el_sp31: number,\n                prop6el_prop3el_sp32: string,\n                prop6el_prop3el_sp33: string[],\n            },\n        }[],\n    }[];\n    prop7?: string[];\n};\n\n\nconst Doc3Schema = new Schema({\n    prop1: { type: String, required: true, unique: false, },\n    prop2: {\n        type: {\n            sp21: { type: String, required: true, unique: false, },\n            sp22: { type: Number, required: false, unique: false, },\n            sp23: {\n                type: [{\n                    ssp23el_prop1: { type: Number, required: true, unique: false, },\n                    ssp23el_prop2: { type: String, required: false, unique: false, },\n                }],\n                required: true, unique: false,\n            },\n        },\n        required: true, unique: false,\n    },\n    prop3: { type: Number, required: true, unique: false, },\n    prop4: {\n        type: {\n            sp41: { type: String, required: true, unique: false, },\n            sp42: { type: Number, required: true, unique: false, },\n            sp43: { type: [Number], required: true, unique: false, },\n            sp44: {\n                type: {\n                    ssp441: { type: Number, required: true, unique: false, },\n                    ssp442: { type: String, required: true, unique: false, },\n                    ssp443: {\n                        type: {\n                            sssp4431: { type: String, required: true, unique: false, },\n                            sssp4432: { type: Number, required: true, unique: false, },\n                            sssp4433: { type: Number, required: true, unique: false, },\n                        },\n                        required: true, unique: false,\n                    },\n                },\n                required: true, unique: false,\n            },\n        },\n        required: true, unique: false,\n    },\n    prop5: { type: [String], required: true, unique: false, },\n    prop6: {\n        type: [{\n            prop6el_prop1: { type: String, required: true, unique: false, },\n            prop6el_prop2: { type: Number, required: false, unique: false, },\n            prop6el_prop3: {\n                type: [{\n                    prop6el_prop3el_prop1: { type: String, required: true, unique: false, },\n                    prop6el_prop3el_prop2: { type: Number, required: true, unique: false, },\n                    prop6el_prop3el_prop3: {\n                        type: {\n                            prop6el_prop3el_sp31: { type: Number, required: true, unique: false, },\n                            prop6el_prop3el_sp32: { type: String, required: true, unique: false, },\n                            prop6el_prop3el_sp33: { type: [String], required: true, unique: false, },\n                        },\n                        required: true, unique: false,\n                    },\n                }],\n                required: false, unique: false,\n            },\n        }],\n        required: true, unique: false,\n    },\n    prop7: { type: [String], required: false, unique: true, },\n});\n\n\nexport type Doc3_document = Doc3 \u0026 Document;\n\nexport default model\u003cDoc3_document\u003e('Doc3', Doc3Schema);\n\n```\n\u003c/details\u003e\n\n\u003cbr\u003e\n\n**_Define the type generic for dot notation up to 3 lvl deep:_**\n\n\u003cdetails\u003e\n    \u003csummary\u003emongoDot_deeper.ts\u003c/summary\u003e\n  \n  ```TypeScript\nimport { mongoDot_lvl2, obj_defaultDocFields, sub, sublvl0, sublvl1, sublvl2 } from \"mongo_dottype\";\nimport { Expand, FlattenUnion_shallow, objNotNever } from \"mongo_dottype/dist/extras.type\";\n\n/**\n * Picks subproperties (\u0026 subelements) of 3rd level deep (subsubsub-properties and -elements) with dot notation\n * If `arrIndices` is provided, uses all these indices to pick elements of array properties of the given object with dot notation\n */\n export type sublvl3\u003cT, arrIndices extends number = never\u003e = objNotNever\u003csub\u003csublvl2\u003cT, arrIndices\u003e, arrIndices\u003e\u003e; \n/**\n * Converts into a type with subproperties and subelements of up to 3 levels deep with dot notation\n * If `arrIndices` is provided, uses all these indices to pick elements of array properties of the given object with dot notation\n */\n export type mongoDot_lvl3\u003cT, arrIndices extends number = never\u003e = Expand\u003cFlattenUnion_shallow\u003cobj_defaultDocFields | sublvl0\u003cT, arrIndices\u003e | sublvl1\u003cT, arrIndices\u003e | sublvl2\u003cT, arrIndices\u003e | sublvl3\u003cT, arrIndices\u003e\u003e\u003e;\n\n```\n  \n\u003c/details\u003e\n\n\u003cbr\u003e\n\n**_Then, the recommended usage by default would be the following:_**\n\n\u003cdetails\u003e\n    \u003csummary\u003eFindDocs3.ts\u003c/summary\u003e\n  \n```TypeScript\nimport Doc3Model, { Doc3 } from \"./Doc3.model\";\nimport { FilterQuery } from \"mongoose\";\n\nexport async function FindDocs3(filter: FilterQuery\u003cRequired\u003cmongoDot_lvl3\u003cDoc3, 0|1|2\u003e\u003e\u003e, select?: string): Promise\u003cDoc3[]\u003e {\n    return Doc3Model.find(filter).select(select).exec();\n}\n\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n    \u003csummary\u003equeryDoc3_example.ts\u003c/summary\u003e\n  \n```TypeScript\nimport { mongoDot_lvl3 } from \"./mongoDot_deeper\";\nimport { FindDocs3 } from \"./FindDocs3.ts\";\n\n\n(async () =\u003e {\n    const DB = await DBconnection;\n\n\n\n    ///// Test 1 (OK) /////\n    (Doc3Model as Model\u003cmongoDot_lvl3\u003cDoc3, 0\u003e \u0026 Document\u003e).updateMany({\n        \"prop4.sp43.0\": {\n            $in: [0, 1],\n        }\n    },\n    {\n        $push: {\n            \"prop2.sp23\": {\n                ssp23el_prop1: 3,\n                ssp23el_prop2: 'foobar'\n            },\n            \"prop4.sp43\": {\n                $each: [2, 3, 4]\n            },\n        }\n    }).exec();\n    \n    \n    \n    ///// Test 2 (ERROR) /////\n    (Doc3Model as Model\u003cmongoDot_lvl3\u003cDoc3, 0\u003e \u0026 Document\u003e).updateMany({\n        \"prop4.sp43.0\": {\n            $in: [0, 1],\n        }\n    },\n    {\n        $push: {\n            \"prop2.sp23\": {\n                ssp23el_prop1: 3,\n                ssp23el_prop2: 'foobar'\n            },\n            \"prop4.sp43\": {\n                $each: [2, 3, \"four\"] // \u003c-- Type 'string' is not assignable to type 'number'. ts(2322)\n            },\n        }\n    }).exec();\n    \n    \n    \n    ///// Test 3 (OK) /////\n    FindDocs3({\n        \"prop6.0.prop6el_prop3.2\": {\n            $ne: {\n                prop6el_prop3el_prop1: \"foo\",\n                prop6el_prop3el_prop2: 100,\n                prop6el_prop3el_prop3: {\n                    prop6el_prop3el_sp31: 200,\n                    prop6el_prop3el_sp32: \"BAR\",\n                    prop6el_prop3el_sp33: [],\n                }\n            }\n        }\n    });\n    \n    \n    \n    ///// Test 4 (ERROR) /////\n    FindDocs3({\n        \"prop6.0.prop6el_prop3.2\": {\n            $ne: {\n                prop6el_prop3el_prop1: \"foo\",\n                prop6el_prop3el_prop2: 100,\n                prop6el_prop3el_prop3: {\n                    prop6el_prop3el_sp31: 200,\n                    prop6el_prop3el_sp32: [], // \u003c-- Type 'undefined[]' is not assignable to type 'string'. ts(2322)\n                    prop6el_prop3el_sp33: [],\n                }\n            }\n        }\n    });\n    \n    \n    \n\n    return await DB.disconnect();\n})();\n\n\n```\n\u003c/details\u003e\n\n\u003cbr\u003e\n\n\n## Using `number` type for allowed array indices\nThis type alias:\n```TypeScript\ntype Users_dotNotation = mongoDot_lvl2\u003cUsers, number\u003e;\n```\nwill result in a type with object keys of type ``` `somestring${number}` ```.\n\nIf you explicitly try to use this type literal (``` `prop.${number}` ```) to index an object, \nTSC may produce an error: ```\"`prop.${number}` cannot be used to index type ...\"```.\nBut when calculated for the type aliases provided here, such a situation, instead of an error, \"silently\" produces either type `never` or, weirdly enough, `undefined` in place of an object that you're trying to index.\n\nBy the time I'm writing it, using `number` practically doesn't work. Although the TS calculations seem to work out correctly, the key part, the type checking, simply isn't supported for type literals as object keys by now.\nYou can play around with the `PickSubs_dotNotation` type, as this is where (almost) all the magic happens.\nI will be submitting a GitHub issue to TypeScript regarding usage of `somestring${number}` for indexing objects.\n\n\n\n\n## I accept donations!\n\n### Paypal\n\n\u003cp\u003e\n\u003c!--   \u003ca href=\"https://www.paypal.com/donate/?hosted_button_id=485PXFAM75G4E\"\u003e\n      \u003cimg src=\"https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif\" alt=\"paypal\"\u003e\n  \u003c/a\u003e --\u003e\n  \u003ca href=\"https://www.paypal.com/donate/?hosted_button_id=485PXFAM75G4E\"\u003e\n      \u003cimg src=\"https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif\" alt=\"paypal\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n### Cryptocurrency\n\nYou can add a transaction message with the name of a project or a custom message if your wallet and the blockchain support this\n\nPreferred blockchains:\n\nblockchain | address |  \n--- | --- | ---\n\u003ca href=\"javascript:void(0)\" style=\"cursor: default;\" alt=\"Donate via Bitcoin\"\u003e\u003cimg src=\"https://img.shields.io/badge/-Bitcoin-402607?logo=data:image/svg%2bxml;base64,PHN2ZyBmaWxsPSIjRjc5MzFBIiByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+Qml0Y29pbjwvdGl0bGU+PHBhdGggZD0iTTIzLjYzOCAxNC45MDRjLTEuNjAyIDYuNDMtOC4xMTMgMTAuMzQtMTQuNTQyIDguNzM2QzIuNjcgMjIuMDUtMS4yNDQgMTUuNTI1LjM2MiA5LjEwNSAxLjk2MiAyLjY3IDguNDc1LTEuMjQzIDE0LjkuMzU4YzYuNDMgMS42MDUgMTAuMzQyIDguMTE1IDguNzM4IDE0LjU0OHYtLjAwMnptLTYuMzUtNC42MTNjLjI0LTEuNTktLjk3NC0yLjQ1LTIuNjQtMy4wM2wuNTQtMi4xNTMtMS4zMTUtLjMzLS41MjUgMi4xMDdjLS4zNDUtLjA4Ny0uNzA1LS4xNjctMS4wNjQtLjI1bC41MjYtMi4xMjctMS4zMi0uMzMtLjU0IDIuMTY1Yy0uMjg1LS4wNjctLjU2NS0uMTMyLS44NC0uMmwtMS44MTUtLjQ1LS4zNSAxLjQwN3MuOTc1LjIyNS45NTUuMjM2Yy41MzUuMTM2LjYzLjQ4Ni42MTUuNzY2bC0xLjQ3NyA1LjkyYy0uMDc1LjE2Ni0uMjQuNDA2LS42MTQuMzE0LjAxNS4wMi0uOTYtLjI0LS45Ni0uMjRsLS42NiAxLjUxIDEuNzEuNDI2LjkzLjI0Mi0uNTQgMi4xOSAxLjMyLjMyNy41NC0yLjE3Yy4zNi4xLjcwNS4xOSAxLjA1LjI3M2wtLjUxIDIuMTU0IDEuMzIuMzMuNTQ1LTIuMTljMi4yNC40MjcgMy45My4yNTcgNC42NC0xLjc3NC41Ny0xLjYzNy0uMDMtMi41OC0xLjIxNy0zLjE5Ni44NTQtLjE5MyAxLjUtLjc2IDEuNjgtMS45M2guMDF6bS0zLjAxIDQuMjJjLS40MDQgMS42NC0zLjE1Ny43NS00LjA1LjUzbC43Mi0yLjljLjg5Ni4yMyAzLjc1Ny42NyAzLjMzIDIuMzd6bS40MS00LjI0Yy0uMzcgMS40OS0yLjY2Mi43MzUtMy40MDUuNTVsLjY1NC0yLjY0Yy43NDQuMTggMy4xMzcuNTI0IDIuNzUgMi4wODR2LjAwNnoiLz48L3N2Zz4=\" /\u003e\u003c/a\u003e |  `bc1pjd2c4xcgq978979htc9admycue4nqqhda3vwsc38agked8yya50qz454xc` | \n\u003ca href=\"javascript:void(0)\" style=\"cursor: default;\" alt=\"Donate via Ethereum\"\u003e\u003cimg src=\"https://img.shields.io/badge/-Ethereum-6784c7?logo=data:image/svg%2bxml;base64,PHN2ZyBmaWxsPSIjM0MzQzNEIiByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+RXRoZXJldW08L3RpdGxlPjxwYXRoIGQ9Ik0xMS45NDQgMTcuOTdMNC41OCAxMy42MiAxMS45NDMgMjRsNy4zNy0xMC4zOC03LjM3MiA0LjM1aC4wMDN6TTEyLjA1NiAwTDQuNjkgMTIuMjIzbDcuMzY1IDQuMzU0IDcuMzY1LTQuMzVMMTIuMDU2IDB6Ii8+PC9zdmc+\" /\u003e\u003c/a\u003e |  `0x176D1b6c3Fc1db5f7f967Fdc735f8267cCe741F3` | \u003cspan\u003e![Tether](https://raw.githubusercontent.com/Kukuster/Kukuster/refs/heads/master/tether_20x20.svg)\u003c/span\u003e supports USDT ERC-20\n\u003ca href=\"javascript:void(0)\" style=\"cursor: default;\" alt=\"Donate via TRON\"\u003e\u003cimg src=\"https://img.shields.io/badge/-TRON-5C0E0E?logo=data:image/svg%2bxml;base64,PHN2ZyBmaWxsPSIjRkYwNjBBIiBpZD0iQ2FscXVlXzEiIGRhdGEtbmFtZT0iQ2FscXVlIDEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDY0IDY0Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6I2ZmMDYwYTt9PC9zdHlsZT48L2RlZnM+PHRpdGxlPnRyb248L3RpdGxlPjxnIGlkPSJ0cm9uIj48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik02MS41NSwxOS4yOGMtMy0yLjc3LTcuMTUtNy0xMC41My0xMGwtLjItLjE0YTMuODIsMy44MiwwLDAsMC0xLjExLS42MmwwLDBDNDEuNTYsNywzLjYzLS4wOSwyLjg5LDBhMS40LDEuNCwwLDAsMC0uNTguMjJMMi4xMi4zN2EyLjIzLDIuMjMsMCwwLDAtLjUyLjg0bC0uMDUuMTN2LjcxbDAsLjExQzUuODIsMTQuMDUsMjIuNjgsNTMsMjYsNjIuMTRjLjIuNjIuNTgsMS44LDEuMjksMS44NmguMTZjLjM4LDAsMi0yLjE0LDItMi4xNFM1OC40MSwyNi43NCw2MS4zNCwyM2E5LjQ2LDkuNDYsMCwwLDAsMS0xLjQ4QTIuNDEsMi40MSwwLDAsMCw2MS41NSwxOS4yOFpNMzYuODgsMjMuMzcsNDkuMjQsMTMuMTJsNy4yNSw2LjY4Wm0tNC44LS42N0wxMC44LDUuMjZsMzQuNDMsNi4zNVpNMzQsMjcuMjdsMjEuNzgtMy41MS0yNC45LDMwWk03LjkxLDcsMzAuMywyNiwyNy4wNiw1My43OFoiLz48L2c+PC9zdmc+\" /\u003e\u003c/a\u003e | `TMuNqEgEeBQ2GseWsqgaSdbtqasnJi8ePw` | \u003cspan\u003e![Tether](https://raw.githubusercontent.com/Kukuster/Kukuster/refs/heads/master/tether_20x20.svg)\u003c/span\u003e supports USDT TRC-20\n\n\n\n\u003cdetails\u003e\n  \u003csummary\u003eAlternative options (Ethereum L2, LN, EVM)\u003c/summary\u003e\n  \n  blockchain | address\n  --- | ---\n  \u003ca href=\"javascript:void(0)\" style=\"cursor: default;\" alt=\"Donate via Polygon\"\u003e\u003cimg src=\"https://img.shields.io/badge/-Polygon-2a0c60?logo=data:image/svg%2bxml;base64,PHN2ZyBmaWxsPSIjN0IzRkU0IiByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+UG9seWdvbjwvdGl0bGU+PHBhdGggZD0ibTE3LjgyIDE2LjM0MiA1LjY5Mi0zLjI4N0EuOTguOTggMCAwIDAgMjQgMTIuMjFWNS42MzVhLjk4Ljk4IDAgMCAwLS40ODgtLjg0NmwtNS42OTMtMy4yODZhLjk4Ljk4IDAgMCAwLS45NzcgMEwxMS4xNSA0Ljc4OWEuOTguOTggMCAwIDAtLjQ4OS44NDZ2MTEuNzQ3TDYuNjcgMTkuNjg2bC0zLjk5Mi0yLjMwNHYtNC42MWwzLjk5Mi0yLjMwNCAyLjYzMyAxLjUyVjguODk2TDcuMTU4IDcuNjU4YS45OC45OCAwIDAgMC0uOTc3IDBMLjQ4OCAxMC45NDVhLjk4Ljk4IDAgMCAwLS40ODguODQ2djYuNTczYS45OC45OCAwIDAgMCAuNDg4Ljg0N2w1LjY5MyAzLjI4NmEuOTgxLjk4MSAwIDAgMCAuOTc3IDBsNS42OTItMy4yODZhLjk4Ljk4IDAgMCAwIC40ODktLjg0NlY2LjYxOGwuMDcyLS4wNDEgMy45Mi0yLjI2MyAzLjk5IDIuMzA1djQuNjA5bC0zLjk5IDIuMzA0LTIuNjMtMS41MTd2My4wOTJsMi4xNCAxLjIzNmEuOTgxLjk4MSAwIDAgMCAuOTc4IDB2LS4wMDFaIi8+PC9zdmc+\" /\u003e\u003c/a\u003e |  `0x176D1b6c3Fc1db5f7f967Fdc735f8267cCe741F3`\n  \u003ca href=\"javascript:void(0)\" style=\"cursor: default;\" alt=\"Donate via Base\"\u003e\u003cimg src=\"https://img.shields.io/badge/-Base-152846?logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgd2lkdGg9IjMwcHgiIGhlaWdodD0iMzBweCI+PHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTYzLjYgMzJjMCAxNy40LTE0LjIgMzEuNi0zMS42IDMxLjZDMTUuNSA2My42IDEuOSA1MC45LjUgMzQuN2g0MS43di01LjNILjVDMS45IDEzLjEgMTUuNS40IDMyIC40IDQ5LjUuNCA2My42IDE0LjYgNjMuNiAzMnoiPjwvcGF0aD48L3N2Zz4=\" /\u003e\u003c/a\u003e |  `0x176D1b6c3Fc1db5f7f967Fdc735f8267cCe741F3`\n  \u003ca href=\"javascript:void(0)\" style=\"cursor: default;\" alt=\"Donate via Arbitrum\"\u003e\u003cimg src=\"https://img.shields.io/badge/-Arbitrum-3F3F3F?logo=data:image/svg%2bxml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxuczp4b2RtPSJodHRwOi8vd3d3LmNvcmVsLmNvbS9jb3JlbGRyYXcvb2RtLzIwMDMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjUwMCAyNTAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyNTAwIDI1MDA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDpub25lO30KCS5zdDF7ZmlsbDojMjEzMTQ3O30KCS5zdDJ7ZmlsbDojMTJBQUZGO30KCS5zdDN7ZmlsbDojOURDQ0VEO30KCS5zdDR7ZmlsbDojRkZGRkZGO30KPC9zdHlsZT4KPGcgaWQ9IkxheWVyX3gwMDIwXzEiPgoJPGcgaWQ9Il8yNDA1NTg4NDc3MjMyIj4KCQk8cmVjdCBjbGFzcz0ic3QwIiB3aWR0aD0iMjUwMCIgaGVpZ2h0PSIyNTAwIj48L3JlY3Q+CgkJPGc+CgkJCTxnPgoJCQkJPHBhdGggY2xhc3M9InN0MSIgZD0iTTIyNiw3NjB2OTgwYzAsNjMsMzMsMTIwLDg4LDE1Mmw4NDksNDkwYzU0LDMxLDEyMSwzMSwxNzUsMGw4NDktNDkwYzU0LTMxLDg4LTg5LDg4LTE1MlY3NjAgICAgICBjMC02My0zMy0xMjAtODgtMTUybC04NDktNDkwYy01NC0zMS0xMjEtMzEtMTc1LDBMMzE0LDYwOGMtNTQsMzEtODcsODktODcsMTUySDIyNnoiPjwvcGF0aD4KCQkJCTxnPgoJCQkJCTxnPgoJCQkJCQk8Zz4KCQkJCQkJCTxwYXRoIGNsYXNzPSJzdDIiIGQ9Ik0xNDM1LDE0NDBsLTEyMSwzMzJjLTMsOS0zLDE5LDAsMjlsMjA4LDU3MWwyNDEtMTM5bC0yODktNzkzQzE0NjcsMTQyMiwxNDQyLDE0MjIsMTQzNSwxNDQweiI+PC9wYXRoPgoJCQkJCQk8L2c+CgkJCQkJCTxnPgoJCQkJCQkJPHBhdGggY2xhc3M9InN0MiIgZD0iTTE2NzgsODgyYy03LTE4LTMyLTE4LTM5LDBsLTEyMSwzMzJjLTMsOS0zLDE5LDAsMjlsMzQxLDkzNWwyNDEtMTM5TDE2NzgsODgzVjg4MnoiPjwvcGF0aD4KCQkJCQkJPC9nPgoJCQkJCTwvZz4KCQkJCTwvZz4KCQkJCTxnPgoJCQkJCTxwYXRoIGNsYXNzPSJzdDMiIGQ9Ik0xMjUwLDE1NWM2LDAsMTIsMiwxNyw1bDkxOCw1MzBjMTEsNiwxNywxOCwxNywzMHYxMDYwYzAsMTItNywyNC0xNywzMGwtOTE4LDUzMGMtNSwzLTExLDUtMTcsNSAgICAgICBzLTEyLTItMTctNWwtOTE4LTUzMGMtMTEtNi0xNy0xOC0xNy0zMFY3MTljMC0xMiw3LTI0LDE3LTMwbDkxOC01MzBjNS0zLDExLTUsMTctNWwwLDBWMTU1eiBNMTI1MCwwYy0zMywwLTY1LDgtOTUsMjVMMjM3LDU1NSAgICAgICBjLTU5LDM0LTk1LDk2LTk1LDE2NHYxMDYwYzAsNjgsMzYsMTMwLDk1LDE2NGw5MTgsNTMwYzI5LDE3LDYyLDI1LDk1LDI1czY1LTgsOTUtMjVsOTE4LTUzMGM1OS0zNCw5NS05Niw5NS0xNjRWNzE5ICAgICAgIGMwLTY4LTM2LTEzMC05NS0xNjRMMTM0NCwyNWMtMjktMTctNjItMjUtOTUtMjVsMCwwSDEyNTB6Ij48L3BhdGg+CgkJCQk8L2c+CgkJCQk8cG9seWdvbiBjbGFzcz0ic3QxIiBwb2ludHM9IjY0MiwyMTc5IDcyNywxOTQ3IDg5NywyMDg4IDczOCwyMjM0ICAgICAiPjwvcG9seWdvbj4KCQkJCTxnPgoJCQkJCTxwYXRoIGNsYXNzPSJzdDQiIGQ9Ik0xMTcyLDY0NEg5MzljLTE3LDAtMzMsMTEtMzksMjdMNDAxLDIwMzlsMjQxLDEzOWw1NTAtMTUwN2M1LTE0LTUtMjgtMTktMjhMMTE3Miw2NDR6Ij48L3BhdGg+CgkJCQkJPHBhdGggY2xhc3M9InN0NCIgZD0iTTE1ODAsNjQ0aC0yMzNjLTE3LDAtMzMsMTEtMzksMjdMNzM4LDIyMzNsMjQxLDEzOWw2MjAtMTcwMWM1LTE0LTUtMjgtMTktMjhWNjQ0eiI+PC9wYXRoPgoJCQkJPC9nPgoJCQk8L2c+CgkJPC9nPgoJPC9nPgo8L2c+Cjwvc3ZnPgo=\" /\u003e\u003c/a\u003e |  `0x176D1b6c3Fc1db5f7f967Fdc735f8267cCe741F3`\n  \u003ca href=\"javascript:void(0)\" style=\"cursor: default;\" alt=\"Donate via Avalanche\"\u003e\u003cimg src=\"https://img.shields.io/badge/-Avalanche-4B2224?logo=data:image/svg%2bxml;base64,PHN2ZyB3aWR0aD0iMTUwMyIgaGVpZ2h0PSIxNTA0IiB2aWV3Qm94PSIwIDAgMTUwMyAxNTA0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cmVjdCB4PSIyODciIHk9IjI1OCIgd2lkdGg9IjkyOCIgaGVpZ2h0PSI4NDQiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTUwMi41IDc1MkMxNTAyLjUgMTE2Ni43NyAxMTY2LjI3IDE1MDMgNzUxLjUgMTUwM0MzMzYuNzM0IDE1MDMgMC41IDExNjYuNzcgMC41IDc1MkMwLjUgMzM3LjIzNCAzMzYuNzM0IDEgNzUxLjUgMUMxMTY2LjI3IDEgMTUwMi41IDMzNy4yMzQgMTUwMi41IDc1MlpNNTM4LjY4OCAxMDUwLjg2SDM5Mi45NEMzNjIuMzE0IDEwNTAuODYgMzQ3LjE4NiAxMDUwLjg2IDMzNy45NjIgMTA0NC45NkMzMjcuOTk5IDEwMzguNSAzMjEuOTExIDEwMjcuOCAzMjEuMTczIDEwMTUuOTlDMzIwLjYxOSAxMDA1LjExIDMyOC4xODQgOTkxLjgyMiAzNDMuMzEyIDk2NS4yNTVMNzAzLjE4MiAzMzAuOTM1QzcxOC40OTUgMzAzLjk5OSA3MjYuMjQzIDI5MC41MzEgNzM2LjAyMSAyODUuNTVDNzQ2LjUzNyAyODAuMiA3NTkuMDgzIDI4MC4yIDc2OS41OTkgMjg1LjU1Qzc3OS4zNzcgMjkwLjUzMSA3ODcuMTI2IDMwMy45OTkgODAyLjQzOCAzMzAuOTM1TDg3Ni40MiA0NjAuMDc5TDg3Ni43OTcgNDYwLjczOEM4OTMuMzM2IDQ4OS42MzUgOTAxLjcyMyA1MDQuMjg5IDkwNS4zODUgNTE5LjY2OUM5MDkuNDQzIDUzNi40NTggOTA5LjQ0MyA1NTQuMTY5IDkwNS4zODUgNTcwLjk1OEM5MDEuNjk1IDU4Ni40NTUgODkzLjM5MyA2MDEuMjE1IDg3Ni42MDQgNjMwLjU0OUw2ODcuNTczIDk2NC43MDJMNjg3LjA4NCA5NjUuNTU4QzY3MC40MzYgOTk0LjY5MyA2NjEuOTk5IDEwMDkuNDYgNjUwLjMwNiAxMDIwLjZDNjM3LjU3NiAxMDMyLjc4IDYyMi4yNjMgMTA0MS42MyA2MDUuNDc0IDEwNDYuNjJDNTkwLjE2MSAxMDUwLjg2IDU3My4wMDQgMTA1MC44NiA1MzguNjg4IDEwNTAuODZaTTkwNi43NSAxMDUwLjg2SDExMTUuNTlDMTE0Ni40IDEwNTAuODYgMTE2MS45IDEwNTAuODYgMTE3MS4xMyAxMDQ0Ljc4QzExODEuMDkgMTAzOC4zMiAxMTg3LjM2IDEwMjcuNDMgMTE4Ny45MiAxMDE1LjYzQzExODguNDUgMTAwNS4xIDExODEuMDUgOTkyLjMzIDExNjYuNTUgOTY3LjMwN0MxMTY2LjA1IDk2Ni40NTUgMTE2NS41NSA5NjUuNTg4IDExNjUuMDQgOTY0LjcwNkwxMDYwLjQzIDc4NS43NUwxMDU5LjI0IDc4My43MzVDMTA0NC41NCA3NTguODc3IDEwMzcuMTIgNzQ2LjMyNCAxMDI3LjU5IDc0MS40NzJDMTAxNy4wOCA3MzYuMTIxIDEwMDQuNzEgNzM2LjEyMSA5OTQuMTk5IDc0MS40NzJDOTg0LjYwNSA3NDYuNDUzIDk3Ni44NTcgNzU5LjU1MiA5NjEuNTQ0IDc4NS45MzRMODU3LjMwNiA5NjQuODkxTDg1Ni45NDkgOTY1LjUwN0M4NDEuNjkgOTkxLjg0NyA4MzQuMDY0IDEwMDUuMDEgODM0LjYxNCAxMDE1LjgxQzgzNS4zNTIgMTAyNy42MiA4NDEuNDQgMTAzOC41IDg1MS40MDIgMTA0NC45NkM4NjAuNDQzIDEwNTAuODYgODc1Ljk0IDEwNTAuODYgOTA2Ljc1IDEwNTAuODZaIiBmaWxsPSIjRTg0MTQyIi8+Cjwvc3ZnPgo=\" /\u003e\u003c/a\u003e |  `0x176D1b6c3Fc1db5f7f967Fdc735f8267cCe741F3`\n\u003c/details\u003e\n\n\n","funding_links":["https://www.paypal.com/donate/?hosted_button_id=485PXFAM75G4E"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkukuster%2Fmongo_dottype","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkukuster%2Fmongo_dottype","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkukuster%2Fmongo_dottype/lists"}