{"id":16293997,"url":"https://github.com/axetroy/struct","last_synced_at":"2025-09-13T13:21:13.575Z","repository":{"id":143735153,"uuid":"111376950","full_name":"axetroy/struct","owner":"axetroy","description":"A Modern, Scalable , Graceful, Easy Use data structure validator","archived":false,"fork":false,"pushed_at":"2019-04-08T12:42:33.000Z","size":191,"stargazers_count":19,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-09-07T01:31:48.435Z","etag":null,"topics":["data","modern","struct","validator"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/axetroy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"contributing.md","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":"2017-11-20T07:34:31.000Z","updated_at":"2025-07-27T06:20:11.000Z","dependencies_parsed_at":null,"dependency_job_id":"74ff1dd0-a154-4f7f-887c-1e0db8940ef7","html_url":"https://github.com/axetroy/struct","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/axetroy/struct","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axetroy%2Fstruct","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axetroy%2Fstruct/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axetroy%2Fstruct/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axetroy%2Fstruct/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/axetroy","download_url":"https://codeload.github.com/axetroy/struct/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axetroy%2Fstruct/sbom","scorecard":{"id":220041,"data":{"date":"2025-08-11","repo":{"name":"github.com/axetroy/struct","commit":"3cc75f93b012edecb913f685be3a87f1c9839769"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/28 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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"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":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 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":"67 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-cwfw-4gq5-mrqx","Warn: Project is vulnerable to: GHSA-g95f-p29q-9xw4","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-rq8g-5pc5-wrhr","Warn: Project is vulnerable to: GHSA-hr2v-3952-633q","Warn: Project is vulnerable to: GHSA-ff7x-qrg7-qggm","Warn: Project is vulnerable to: GHSA-qrmc-fj45-qfc2","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-8r6j-v8pm-fqw3","Warn: Project is vulnerable to: MAL-2023-462","Warn: Project is vulnerable to: GHSA-xf7w-r453-m56c","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-q42p-pg8m-cqh6","Warn: Project is vulnerable to: GHSA-w457-6q6x-cgp9","Warn: Project is vulnerable to: GHSA-62gr-4qp9-h98f","Warn: Project is vulnerable to: GHSA-f52g-6jhx-586p","Warn: Project is vulnerable to: GHSA-2cf5-4w76-r9qv","Warn: Project is vulnerable to: GHSA-3cqr-58rm-57f8","Warn: Project is vulnerable to: GHSA-g9r4-xpmj-mj65","Warn: Project is vulnerable to: GHSA-q2c6-c6pm-g3gh","Warn: Project is vulnerable to: GHSA-765h-qjxv-5f44","Warn: Project is vulnerable to: GHSA-f2jv-r9rf-7988","Warn: Project is vulnerable to: GHSA-44pw-h2cw-w3vq","Warn: Project is vulnerable to: GHSA-jp4x-w63m-7wgm","Warn: Project is vulnerable to: GHSA-c429-5p7v-vgjp","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-qqgx-2p2h-9c37","Warn: Project is vulnerable to: GHSA-p9w8-2mpq-49h9","Warn: Project is vulnerable to: GHSA-2pr6-76vf-7546","Warn: Project is vulnerable to: GHSA-8j8c-7jfh-h6hx","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-fvqr-27wr-82fm","Warn: Project is vulnerable to: GHSA-4xc9-xhrj-v574","Warn: Project is vulnerable to: GHSA-x5rq-j2xg-h7qm","Warn: Project is vulnerable to: GHSA-jf85-cpcp-j695","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-2m96-9w4j-wgv7","Warn: Project is vulnerable to: GHSA-h726-x36v-rx45","Warn: Project is vulnerable to: GHSA-4xcv-9jjx-gfj3","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-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-6g33-f262-xjp4","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-2m39-62fm-q8r3","Warn: Project is vulnerable to: GHSA-mf6x-7mm4-x2g7","Warn: Project is vulnerable to: GHSA-j44m-qm6p-hp7m","Warn: Project is vulnerable to: GHSA-3jfq-g458-7qm9","Warn: Project is vulnerable to: GHSA-5955-9wpr-37jh","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-7p7h-4mm5-852v","Warn: Project is vulnerable to: GHSA-38fc-wpqx-33j7","Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp"],"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-17T02:17:10.403Z","repository_id":143735153,"created_at":"2025-08-17T02:17:10.403Z","updated_at":"2025-08-17T02:17:10.403Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274968184,"owners_count":25383108,"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","status":"online","status_checked_at":"2025-09-13T02:00:10.085Z","response_time":70,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["data","modern","struct","validator"],"created_at":"2024-10-10T20:13:46.426Z","updated_at":"2025-09-13T13:21:13.526Z","avatar_url":"https://github.com/axetroy.png","language":"JavaScript","readme":"## Struct\n\n[![Greenkeeper badge](https://badges.greenkeeper.io/axetroy/struct.svg)](https://greenkeeper.io/)\n[![Build Status](https://travis-ci.org/axetroy/struct.svg?branch=master)](https://travis-ci.org/axetroy/struct)\n[![Coverage Status](https://coveralls.io/repos/github/axetroy/struct/badge.svg?branch=master)](https://coveralls.io/github/axetroy/struct?branch=master)\n[![Dependency](https://david-dm.org/axetroy/struct.svg)](https://david-dm.org/axetroy/struct)\n![License](https://img.shields.io/badge/license-Apache-green.svg)\n[![Prettier](https://img.shields.io/badge/Code%20Style-Prettier-green.svg)](https://github.com/prettier/prettier)\n![Node](https://img.shields.io/badge/node-%3E=6.0-blue.svg?style=flat-square)\n[![npm version](https://badge.fury.io/js/%40axetroy%2Fstruct.svg)](https://badge.fury.io/js/%40axetroy%2Fstruct)\n![Size](https://github-size-badge.herokuapp.com/axetroy/struct.svg)\n\nA Modern, Scalable , Graceful, Easy Use data structure validator, Support browser and NodeJs\n\n* [x] All in Javascript. No Magic string.\n* [x] Strict mode, no one excess field.\n* [x] Most of type validator support.\n* [x] Scalable, easy to define your customize validator.\n* [x] Highly customizable.\n* [x] Validate with params, Support pass the argument to the validator.\n* [x] Pipe line, multiple validator work together.\n* [x] Support endless nest object, including Object and Array.\n* [x] Clear error message.\n* [x] Support nest Struct\n\n## Quick start\n\n```npm\nnpm install @axetroy/struct --save\n```\n\n```javascript\nconst { Struct, type } = require('@axetroy/struct');\n\nconst data = {\n  name: 'axetroy',\n  age: 18,\n  address: {\n    city: 'DC',\n    code: '12' // invalid city code, it should be an integer\n  }\n};\n\nconst User = Struct({\n  name: type.string,\n  age: type.int,\n  address: {\n    city: type.string,\n    code: type.int\n  }\n});\n\nconst err = User.validate(data);\n\nconsole.log(err); // if all validator success, the error should be undefined\n\n/**\n{ Error\n    at Object.\u003canonymous\u003e (/home/axetroy/gpm/github.com/axetroy/struct/src/error.js:19:23)\n    at Module._compile (module.js:635:30)\n    at Object.Module._extensions..js (module.js:646:10)\n    at Module.load (module.js:554:32)\n    at tryModuleLoad (module.js:497:12)\n    at Function.Module._load (module.js:489:3)\n    at Module.require (module.js:579:17)\n    at require (internal/module.js:11:18)\n    at Object.\u003canonymous\u003e (/home/axetroy/gpm/github.com/axetroy/struct/src/type.js:2:19)\n    at Module._compile (module.js:635:30)\n  validator: 'int',\n  path: [ 'address', 'code' ],\n  value: '12',\n  detail: 'Expected a value of type `int` for `address.code` but received `12`.',\n  message: 'Expected a value of type `int` for `address.code` but received `12`.' }\n */\n```\n\n### Advanced usage\n\n```javascript\nconst { Struct, type } = require('@axetroy/struct');\n\nconst data = {\n  name: 'axetroy',\n  age: 18,\n  address: {\n    city: 'DC',\n    code: 100\n  },\n  message: [\n    { from: 'marry', msg: 'How are you?', timestamp: 1513155028 },\n    { from: 'henry', msg: \"How's going one?\", timestamp: 1513135028 }\n  ]\n};\n\nconst User = new Struct({\n  name: type.string,\n  age: type.int.gte(18), // age is int \u0026\u0026 and age \u003e= 18\n  address: {\n    city: type.string,\n    code: type.int.gte(100)\n  },\n  message: [\n    {\n      from: type.string,\n      msg: type.string,\n      timestamp: type.int\n    }\n  ]\n});\n\nconst err = User.validate(data);\n\nconsole.log(err); // undefined, because the data pass the validator\n```\n\n## Document\n\n### class: Struct\n\nCreate a struct\n\n```javascript\nconst { Struct, type } = require('@axetroy/struct');\n\nconst struct1 = new Struct(type.string);\nconst struct2 = Struct(type.string);\n```\n\n#### static [Struct.define](#static-typedefinevalidatorname-handler)\n\n#### static [Struct.Type](#class-type)\n\n#### struct.validate(data)\n\n* `data`: \u003c\\*\u003e\n* returns: \u003cUndefined | [TypeError](#class-typeerror)\u003e\n\n```javascript\nconst err = Struct.validate({ word: 'Hello world' });\n```\n\nvalidate the data is match with struct, if all match. return `undefined`, if not, return an [`TypeError`](#class-typeerror)\n\n### class: Type\n\nCreate a type\n\n#### static: Type.define(validatorName, handler)\n\n* validatorName: \u003cString\u003e\n* handler: \u003c(input):bool | (argv):(input):bool\u003e\n\n```javascript\nType.define('email', function(input) {\n  // here to check is it a email string\n  return true;\n});\n```\n\ndefine a customize type, will add an property on `type.prototype`\n\n#### type.xxx\n\n```javascript\nconst stringType = type.string;\nconst intType = type.int;\nconst composingType = type.int.gte(100);\n```\n\n| Validator               | Description                               | Require Argument | Source Code                                                                                   |\n| ----------------------- | ----------------------------------------- | ---------------- | --------------------------------------------------------------------------------------------- |\n| **number**              | Check the type is a number                | false            | [src/validator/number](https://github.com/axetroy/struct/blob/master/src/validator/number.js) |\n| **int**                 | Check the type is a int                   | false            | [src/validator/int](https://github.com/axetroy/struct/blob/master/src/validator/int.js)       |\n| **float**               | Check the type is a float                 | false            | [src/validator/float](https://github.com/axetroy/struct/blob/master/src/validator/float.js)   |\n| **string**              | Check the type is a string                | false            | [src/validator/string](https://github.com/axetroy/struct/blob/master/src/validator/string.js) |\n| **bool**                | Check the type is a bool                  | false            | [src/validator/bool](https://github.com/axetroy/struct/blob/master/src/validator/bool.js)     |\n| **any**                 | Any type                                  | false            | [src/validator/any](https://github.com/axetroy/struct/blob/master/src/validator/any.js)       |\n| **odd**                 | Check the type is a number and odd        | false            | [src/validator/odd](https://github.com/axetroy/struct/blob/master/src/validator/odd.js)       |\n| **even**                | Check the type is a number and even       | false            | [src/validator/even](https://github.com/axetroy/struct/blob/master/src/validator/even.js)     |\n| **json**                | Check the type is json string             | false            | [src/validator/json](https://github.com/axetroy/struct/blob/master/src/validator/json.js)     |\n| **eq(value)**           | Equal to some value                       | true             | [src/validator/eq](https://github.com/axetroy/struct/blob/master/src/validator/eq.js)         |\n| **gt(number)**          | Greater then a number                     | true             | [src/validator/gt](https://github.com/axetroy/struct/blob/master/src/validator/gt.js)         |\n| **gte(number)**         | Greater then or equal a number            | true             | [src/validator/gte](https://github.com/axetroy/struct/blob/master/src/validator/gte.js)       |\n| **lt(number)**          | Less then a number                        | true             | [src/validator/lt](https://github.com/axetroy/struct/blob/master/src/validator/lt.js)         |\n| **lte(number)**         | Less then or equal a number               | true             | [src/validator/lte](https://github.com/axetroy/struct/blob/master/src/validator/lte.js)       |\n| **bt(min, max)**        | Between the min and max                   | true             | [src/validator/bt](https://github.com/axetroy/struct/blob/master/src/validator/bt.js)         |\n| **in(array)**           | The value is in the array                 | true             | [src/validator/in](https://github.com/axetroy/struct/blob/master/src/validator/in.js)         |\n| **len(int)**            | The values's length property equal to xxx | true             | [src/validator/len](https://github.com/axetroy/struct/blob/master/src/validator/len.js)       |\n| **msg(message)**        | Custom error message of this field        | true             | [src/validator/msg](https://github.com/axetroy/struct/blob/master/src/validator/msg.js)       |\n| **func(validatorFunc)** | Custom Validator                          | true             | [src/validator/func](https://github.com/axetroy/struct/blob/master/src/validator/func.js)     |\n\nAll the validator is define on `type.prototype`.\n\n### class: TypeError\n\n* **validator**: What validator fail\n* **path**: What key not pass the validator\n* **value**: The value which not pass the validator\n* **message**: The error message\n* **detail**: The error message\n\nThe TypeError inherit from Error\n\n### Examples\n\n* [Basic Validation](https://github.com/axetroy/struct/blob/master/examples/basic.js)\n* [Custom Validator](https://github.com/axetroy/struct/blob/master/examples/constom-validator.js)\n* [Custom Validator With Argument](https://github.com/axetroy/struct/blob/master/examples/custom-functional-validator.js)\n* [Custom Validator Function](https://github.com/axetroy/struct/blob/master/examples/custom-validator-function.js)\n* [Custom Validator Function With Type](https://github.com/axetroy/struct/blob/master/examples/custom-validator-function-type.js)\n* [Composing Validator](https://github.com/axetroy/struct/blob/master/examples/custom-validator.js)\n* [Composing Struct](https://github.com/axetroy/struct/blob/master/examples/struct-nest.js)\n* [Composing Struct In Array](https://github.com/axetroy/struct/blob/master/examples/struct-nest-array.js)\n* [Custom Error Message](https://github.com/axetroy/struct/blob/master/examples/custom-error-message.js)\n* [Deep Nest Object](https://github.com/axetroy/struct/blob/master/examples/validate-deep-nest-object.js)\n* [Deep Nest Array](https://github.com/axetroy/struct/blob/master/examples/validate-deep-nest-array.js)\n\nThere is the [examples](https://github.com/axetroy/struct/tree/master/examples), may be it can help you\n\n## Contributing\n\n[Contributing Guid](https://github.com/axetroy/struct/blob/master/CONTRIBUTING.md)\n\n## Contributors\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\n| [\u003cimg src=\"https://avatars1.githubusercontent.com/u/9758711?v=3\" width=\"100px;\"/\u003e\u003cbr /\u003e\u003csub\u003eAxetroy\u003c/sub\u003e](http://axetroy.github.io)\u003cbr /\u003e[💻](https://github.com/axetroy/Github/commits?author=axetroy) [🐛](https://github.com/axetroy/struct/issues?q=author%3Aaxetroy) 🎨 |\n| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |\n\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\n## License\n\n[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Faxetroy%2Fstruct.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Faxetroy%2Fstruct?ref=badge_large)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faxetroy%2Fstruct","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faxetroy%2Fstruct","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faxetroy%2Fstruct/lists"}