{"id":13990860,"url":"https://github.com/sebelga/gstore-node","last_synced_at":"2026-02-21T15:48:46.819Z","repository":{"id":38454665,"uuid":"59173176","full_name":"sebelga/gstore-node","owner":"sebelga","description":"Google Datastore Entities Modeling for Node.js","archived":false,"fork":false,"pushed_at":"2024-03-04T19:56:26.000Z","size":2418,"stargazers_count":292,"open_issues_count":27,"forks_count":53,"subscribers_count":15,"default_branch":"master","last_synced_at":"2025-10-24T22:41:49.309Z","etag":null,"topics":["entity","entity-model","google-datastore","gstore","modeling-tool","nodejs","schema"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sebelga.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-05-19T04:16:00.000Z","updated_at":"2025-09-04T19:49:58.000Z","dependencies_parsed_at":"2024-01-18T05:18:19.256Z","dependency_job_id":"52b68886-818e-4800-95bf-b79f840e187b","html_url":"https://github.com/sebelga/gstore-node","commit_stats":null,"previous_names":[],"tags_count":74,"template":false,"template_full_name":null,"purl":"pkg:github/sebelga/gstore-node","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebelga%2Fgstore-node","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebelga%2Fgstore-node/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebelga%2Fgstore-node/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebelga%2Fgstore-node/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sebelga","download_url":"https://codeload.github.com/sebelga/gstore-node/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sebelga%2Fgstore-node/sbom","scorecard":{"id":808774,"data":{"date":"2025-08-11","repo":{"name":"github.com/sebelga/gstore-node","commit":"d103eb2591492612a8f0d17a2cb074aeac515bd9"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 1/18 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 21 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"39 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-7v5v-9h63-cj86","Warn: Project is vulnerable to: GHSA-c429-5p7v-vgjp","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-4q6p-r6v2-jvc5","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-6c8f-qphg-qjgp","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-7wpw-2hjm-89gp","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-r683-j2x4-v87g","Warn: Project is vulnerable to: GHSA-5fw9-fq32-wv5p","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-g6ww-v8xp-vmwg","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-4g88-fppr-53pp","Warn: Project is vulnerable to: GHSA-4jqc-8m5r-9rpr","Warn: Project is vulnerable to: GHSA-4rq4-32rv-6wp6","Warn: Project is vulnerable to: GHSA-64g7-mvw6-v9qj","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-7p7h-4mm5-852v","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-23T12:32:35.121Z","repository_id":38454665,"created_at":"2025-08-23T12:32:35.121Z","updated_at":"2025-08-23T12:32:35.121Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29684636,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T14:31:22.911Z","status":"ssl_error","status_checked_at":"2026-02-21T14:31:22.570Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["entity","entity-model","google-datastore","gstore","modeling-tool","nodejs","schema"],"created_at":"2024-08-09T13:03:25.410Z","updated_at":"2026-02-21T15:48:46.800Z","avatar_url":"https://github.com/sebelga.png","language":"TypeScript","readme":"\u003cimg title=\"logo\" src=\"logo/logo.png\" width=\"75%\"\u003e\n\n# gstore-node [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Model%20your%20Google%20Datastore%20entities%20with%20gstore-node\u0026url=https://github.com/sebelga/gstore-node)\n\n\u003e Entities modeling for Google's Datastore\n\n[![NPM Version][npm-image]][npm-url]\n[![Build Status][travis-image]][travis-url]\n[![coveralls-image]][coveralls-url]\n[![Commitizen friendly][commitizen-image]][commitizen-url]  \n\n## :tada: **NEWS**: new maintainer!\n\nA few weeks ago I announced that `gstore-node` was deprecated as I currently don't have bandwidth to work on it. A few days later, [Hendrik Schalekamp](https://github.com/carnun) stepped in and offered to be a maintainer of the project. I was thrilled! :blush:\nHendrik will be the lead of the project and I will be around to provide any necessary guidance. Thanks Hendrik!\n\n[**Documentation**](#documentation) |\n[**Example**](#example) |\n[**Demo Application**](#demo-app) |\n[**Support**](../../issues) |\n[**Changelog**](../../releases)\n\ngstore-node is a Google Datastore entities modeling library for Node.js inspired by Mongoose and built **on top** of the **[@google-cloud/datastore](https://googleapis.dev/nodejs/datastore/latest/index.html)** client.  \nIt is not a replacement of @google-cloud/datastore but a layer on top of it to help modeling your entities through Schemas and to help validating the data saved in the Datastore.\n\n## Highlight\n\n- explicit **Schema declaration** for entities\n- properties **type validation**\n- properties **value validation**\n- **shortcuts** queries\n- pre \u0026 post **middleware** (hooks)\n- **custom methods** on entity instances\n- **[Joi](https://github.com/hapijs/joi)** schema definition and validation\n- Advanced **[cache layer](https://sebloix.gitbook.io/gstore-node/cache-dataloader/cache)**\n- **[Typescript support](https://sebloix.gitbook.io/gstore-node/typescript)**\n- [**populate()**](https://sebloix.gitbook.io/gstore-node/populate) support to fetch reference entities and do cross Entity Type \"joins\" when querying one or multiple entities (since v5.0.0)\n\n\u003e Please don’t forget to star this repo if you find it useful :)\n\n# Installation\n\n```shell\nnpm install gstore-node --save\n# or\nyarn add gstore-node\n```\n\n**Important**: gstore-node requires Node version **8+**  \n\n# Getting started\n\nImport gstore-node and @google-cloud/datastore and configure your project.  \nFor the information on how to configure @google-cloud/datastore [read the docs here](https://googleapis.dev/nodejs/datastore/latest/Datastore.html).\n\n```js\nconst { Gstore } = require('gstore-node');\nconst { Datastore } = require('@google-cloud/datastore');\n\nconst gstore = new Gstore();\nconst datastore = new Datastore({\n    projectId: 'my-google-project-id',\n});\n\n// Then connect gstore to the datastore instance\ngstore.connect(datastore);\n```\n\nAfter connecting gstore to the datastore, gstore has 2 aliases set up\n\n- `gstore.ds`  \nThe @google/datastore instance. This means that you can access **all the API** of the Google library when needed.\n\n- `gstore.transaction`. Alias of the same google-cloud/datastore method\n\n\u003ca name=\"documentation\"/\u003e\n\n# Documentation\nThe [complete documentation](https://sebloix.gitbook.io/gstore-node/)  of gstore-node is in gitbook.  \nIf you find any mistake in the docs or would like to improve it, [feel free to open a PR](https://github.com/sebelga/gstore-node-docs/pulls).\n\n\u003ca name=\"example\"/\u003e\n\n# Example\n\nInitialize gstore-node in your server file\n```js\n// server.js\n\nconst { Gstore, instances } = require('gstore-node');\nconst { Datastore } = require('@google-cloud/datastore');\n\nconst gstore = new Gstore();\nconst datastore = new Datastore({\n    projectId: 'my-google-project-id',\n});\n\ngstore.connect(datastore);\n\n// Save the gstore instance\ninstances.set('unique-id', gstore);\n```\n\nCreate your Model\n\n```js\n// user.model.js\n\nconst { instances } = require('gstore-node');\nconst bscrypt = require('bcrypt-nodejs');\n\n// Retrieve the gstore instance\nconst gstore = instances.get('unique-id');\nconst { Schema } = gstore;\n\n/**\n * A custom validation function for an embedded entity\n */\nconst validateAccessList = (value, validator) =\u003e {\n    if (!Array.isArray(value)) {\n        return false;\n    }\n\n    return value.some((item) =\u003e {\n        const isValidIp = !validator.isEmpty(item.ip) \u0026\u0026 validator.isIP(item.ip, 4);\n        const isValidHostname = !validator.isEmpty(item.hostname);\n\n        return isValidHostname \u0026\u0026 isValidIp;\n    });\n}\n\n/**\n * Create the schema for the User Model\n*/\nconst userSchema = new Schema({\n    firstname: { type: String, required: true },\n    lastname: { type: String, optional: true  },\n    email: { type: String, validate: 'isEmail', required: true },\n    password: { type: String, read: false, required: true },\n    createdOn: { type: String, default: gstore.defaultValues.NOW, write: false, read: false },\n    address: { type: Schema.Types.Key, ref: 'Address' }, // Entity reference\n    dateOfBirth: { type: Date },\n    bio: { type: String, excludeFromIndexes: true },\n    website: { validate: 'isURL', optional: true },\n    ip: {\n        validate: {\n            rule: 'isIP',\n            args: [4],\n        }\n    },\n    accessList: {\n        validate: {\n            rule: validateAccessList,\n        }\n    },\n});\n\n// Or with **Joi** schema definition\n// You need to have joi as a dependency of your project (\"npm install joi --save\")\nconst userSchema = new Schema({\n    firstname: { joi: Joi.string().required() },\n    email: { joi: Joi.string().email() },\n    password: { joi: Joi.string() },\n    ...\n}, {\n    joi: {\n        extra: {\n            // validates that when \"email\" is present, \"password\" must be too\n            when: ['email', 'password'],\n        },\n    }\n});\n\n/**\n * List entities query shortcut\n */\nconst listSettings = {\n    limit: 15,\n    order: { property: 'lastname' }\n};\nuserSchema.queries('list', listSettings);\n\n/**\n * Pre \"save\" middleware\n * Each time the entity is saved or updated, if there is a password passed, it will be hashed\n*/\nfunction hashPassword() {\n    // scope *this* is the entity instance\n    const _this = this;\n    const password = this.password;\n\n    if (!password) {\n        return Promise.resolve();\n    }\n\n    return new Promise((resolve, reject) =\u003e {\n        bcrypt.genSalt(5, function onSalt(err, salt) {\n            if (err) {\n                return reject(err);\n            };\n\n            bcrypt.hash(password, salt, null, function onHash(err, hash) {\n                if (err) {\n                    // reject will *not* save the entity\n                    return reject(err);\n                };\n\n                _this.password = hash;\n\n                // resolve to go to next middleware or save method\n                return resolve();\n            });\n        });\n    });\n}\n\n// add the \"pre\" middleware to the save method\nuserSchema.pre('save', hashPassword);\n\n/**\n * Export the User Model\n * It will generate \"User\" entity kind in the Datastore\n*/\nmodule.exports = gstore.model('User', userSchema);\n\n```\nUse it in your Controller\n\n```js\n// user.constroller.js\n\nconst User = require('./user.model');\n\nconst getUsers = (req ,res) =\u003e {\n    const pageCursor = req.query.cursor;\n\n    // List users with the Query settings defined on Schema\n    User.list({ start: pageCursor })\n        .then((entities) =\u003e {\n            res.json(entities);\n        })\n        .catch(err =\u003e res.status(400).json(err));\n};\n\nconst getUser = (req, res) =\u003e {\n    const userId = +req.params.id;\n    User.get(userId)\n        .populate('address') // Retrieve the reference entity\n        .then((entity) =\u003e {\n            res.json(entity.plain());\n        })\n        .catch(err =\u003e res.status(400).json(err));\n};\n\nconst createUser = (req, res) =\u003e {\n    const entityData = User.sanitize(req.body);\n    const user = new User(entityData);\n\n    user.save()\n        .then((entity) =\u003e {\n            res.json(entity.plain());\n        })\n        .catch((err) =\u003e {\n            // If there are any validation error on the schema\n            // they will be in this error object\n            res.status(400).json(err);\n        })\n};\n\nconst updateUser = (req, res) =\u003e {\n    const userId = +req.params.id;\n    const entityData = User.sanitize(req.body); // { email: 'john@snow.com' }\n\n    /**\n     * This will fetch the entity, merge the data and save it back to the Datastore\n    */\n    User.update(userId, entityData)\n        .then((entity) =\u003e {\n            res.json(entity.plain());\n        })\n        .catch((err) =\u003e {\n            // If there are any validation error on the schema\n            // they will be in this error object\n            res.status(400).json(err);\n        });\n};\n\nconst deleteUser = (req, res) =\u003e {\n    const userId = +req.params.id;\n    User.delete(userId)\n        .then((response) =\u003e {\n            res.json(response);\n        })\n        .catch(err =\u003e res.status(400).json(err));\n};\n\nmodule.exports = {\n    getUsers,\n    getUser,\n    createUser,\n    updateUser,\n    deleteUser\n};\n\n```\n\u003ca name=\"demo-app\"/\u003e\n\n## Demo application\n\nIf you want to see an example on how to use gstore-node in your Node.js app, check the [demo blog application repository](https://github.com/sebelga/blog-app-googlecloud).\n\n## Development\n\n1. Install npm dependencies\n\n```\nyarn install\n```\n\n2. Run the unit tests\n\n```\nyarn test:unit\n```\n\n3. Run the integration tests\n\n**Prerequise:**  \nIn order to run the integration tests you need to have the [Google Datastore Emulator](https://cloud.google.com/datastore/docs/tools/datastore-emulator) installed as well as [Redis](https://redis.io/).\n\n* Launch the Redis server  \n\n```\n# From the folder where you've installed the Redis SDK run: \ncd src \u0026\u0026 ./redis-server\n```\n\n* Launch the Datastore Emulator (separate terminal window)\n\n```\n# From the root of the project\nyarn local-datastore\n```\n\n* Execute the integration tests (separate terminal window)\n\n```\n# From the root of the project\nyarn test:integration\n```\n\n## Meta\n\nSébastien Loix – [@sebloix](https://twitter.com/sebloix)  \nHendrik Schalekamp - [@carnun](https://twitter.com/carnun)\n\nDistributed under the MIT license. See `LICENSE` for more information.\n\n## Contributing\n\n1. Fork it (\u003chttps://github.com/sebelga/gstore-node/fork\u003e)\n2. Create your feature branch (`git checkout -b feature/fooBar`)\n3. Generate a conventional commit message (`npm run commit`)\n4. Push to the branch (`git push origin feature/fooBar`)\n5. Rebase your feature branch and squash (`git rebase -i master`)\n6. Create a new Pull Request\n\n## Credits\nI have been heavily inspired by [Mongoose](https://github.com/Automattic/mongoose) to write gstore. Credits to them for the Schema, Model and Entity\ndefinitions, as well as 'hooks', custom methods and other similarities found here.\nNot much could neither have been done without the great work of the guys at [googleapis](https://github.com/googleapis/nodejs-datastore).\n\n[npm-image]: https://img.shields.io/npm/v/gstore-node.svg?style=flat-square\n[npm-url]: https://npmjs.org/package/gstore-node\n[npm-downloads]: https://img.shields.io/npm/dm/gstore-node.svg?style=flat-square\n[travis-image]: https://img.shields.io/travis/sebelga/gstore-node/master.svg?style=flat-square\n[travis-url]: https://travis-ci.com/sebelga/gstore-node\n[coveralls-image]: https://img.shields.io/coveralls/github/sebelga/gstore-node.svg\n[coveralls-url]: https://coveralls.io/github/sebelga/gstore-node?branch=master\n[commitizen-image]: https://img.shields.io/badge/commitizen-friendly-brightgreen.svg\n[commitizen-url]: http://commitizen.github.io/cz-cli/\n","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsebelga%2Fgstore-node","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsebelga%2Fgstore-node","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsebelga%2Fgstore-node/lists"}