{"id":22188951,"url":"https://github.com/mikoweb/model-persistence","last_synced_at":"2025-07-31T17:42:10.511Z","repository":{"id":57300373,"uuid":"112858081","full_name":"mikoweb/model-persistence","owner":"mikoweb","description":"Model persistence JavaScript library.","archived":false,"fork":false,"pushed_at":"2017-12-24T19:36:49.000Z","size":445,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-01T23:17:43.393Z","etag":null,"topics":["axios","model","objectmodel","persist","persistence","repository","web-storage"],"latest_commit_sha":null,"homepage":"https://rmweb.pl","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mikoweb.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":"2017-12-02T16:32:23.000Z","updated_at":"2018-11-27T10:17:11.000Z","dependencies_parsed_at":"2022-09-08T16:42:11.606Z","dependency_job_id":null,"html_url":"https://github.com/mikoweb/model-persistence","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikoweb%2Fmodel-persistence","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikoweb%2Fmodel-persistence/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikoweb%2Fmodel-persistence/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mikoweb%2Fmodel-persistence/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mikoweb","download_url":"https://codeload.github.com/mikoweb/model-persistence/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245344006,"owners_count":20599867,"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":["axios","model","objectmodel","persist","persistence","repository","web-storage"],"created_at":"2024-12-02T11:13:40.612Z","updated_at":"2025-03-24T20:17:01.380Z","avatar_url":"https://github.com/mikoweb.png","language":"JavaScript","readme":"# Model Persistence Library\n\nLibrary intended for data persistence using HTTP or \n[Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API).\n\nDemos:\n\n* [localStorage example](https://jsfiddle.net/rmweb/62mpgov6/)\n\n## Installing\n\nUsing npm:\n\n    npm install model-persistence\n\nUsing script:\n\n```html\n\u003cscript src=\"./node_modules/objectmodel/dist/object-model.umd.js\"\u003e\u003c/script\u003e\n\u003cscript src=\"./node_modules/axios/dist/axios.min.js\"\u003e\u003c/script\u003e\n\u003cscript src=\"./bundle/model-persistence.min.js\"\u003e\u003c/script\u003e\n```\n\n## Import Module\n\nIn Node.js:\n\n```javascript\nconst modelPersist = require('model-persistence');\n```\n\nIn ES6 modules:\n\n```javascript\nimport modelPersist from 'model-persistence';\n```\n\nYou have access to a global object `modelPersist` if you use the `\u003cscript\u003e` tag.\n\n## Model Class\n\nModel class is used to define models. It's from [ObjectModel v2](http://objectmodel.js.org/docs/v2/) library.\n\n\u003e Object models validate nested object properties against a definition tree. You may consider them as definitions of classes with advanced validation options. They provide automatic validation at initial and future assignments of the properties of the instance objects.\n\nDefining a model:\n\n```javascript\nclass Person extends modelPersist.Model({\n    id: [Number],\n    lastName: String,\n    firstName: String \n}) {\n   get fullName() {\n       return `${this.firstName} ${this.lastName}`;\n   }\n}\n```\n\nNew instance:\n\n```javascript\nconst rick = new Person({\n    lastName: \"Sanchez\", \n    firstName: \"Rick\"\n});\n\nrick.lastName = 132;\n// \u003e TypeError: expecting lastName to be String, got Number 132\nconsole.log(rick.fullName); // \"Rick Sanchez\"\n```\n\n## Locator\n\nLocator is responsible for where the data will be stored.\n\nUsing HTTPLocator to send data by HTTP:\n\n```javascript\nclass PersonLocator extends modelPersist.HTTPLocatorAbstract {\n    /**\n     * @inheritdoc\n     */\n    get basePath() {\n        return '/person';\n    }\n}\n```\n\nProperty `basePath` specify where is endpoint for persons. You can also override `hostPath` to specify \nhost like `https://google.com`, default is empty.\n\nYou can use classes `modelPersist.LocalStorageLocatorAbstract` and `modelPersist.SessionStorageLocatorAbstract`,\nif you want to store data in [localStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage)\nor [sessionStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage).\nIt works analogically as `HTTPLocatorAbstract`, but property `basePath` specify prefix for storage keys.\n\n## Model Manager\n\nModel Manager it's a data persistence and access layer. Each manager implements `ModelManagerInterface` and has methods:\n`get`, `save` and `remove`.\n\nThere are two types of managers:\n\n**HTTPModelManager**\n\nUsed for data transfer by HTTP, requires HTTPLocator.\n\n```javascript\nconst manager = modelPersist.httpFactory.createManager(new PersonLocator());\n```\n\n**StorageModelManager**\n\nUsed for data transfer to [Web Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API), \nrequires StorageLocator.\n\n```javascript\nconst manager = modelPersist.storageFactory.createManager(new PersonLocator());\n```\n\nExample of use:\n\n```javascript\nconst manager = modelPersist.httpFactory.createManager(new PersonLocator());\n\n// Get model with id equals 1\nconst model = manager.get(1, Person);\n\n// Change first name and save\nmodel.firstName = 'Alexis';\nmanager.save(model).then((data) =\u003e {\n    // data variable is object from server response\n});\n\n// Remove model\nmanager.remove(model).then((data) =\u003e {\n    // data variable is object from server response\n});\n\n// Create new person\nconst gigi = new Person({firstName: 'Gigi', lastName: 'Amoroso'});\nmanager.save(model).then((data) =\u003e {\n    // data variable is object from server response\n});\n```\n\n### HTTPModelManager methods\n\n`HTTPModelManager` use the following methods:\n\nClass method | HTTP method | Path | Description\n:---: | :---: | :---: | :---:\n get | GET | /person/1 | Get model by id.\n save | POST | /person | Save new model, when `id` is not defined.\n save | PUT | /person/1 | Save model.\n remove | DELETE | /person/1 | Remove model.\n\n## Repository\n\nA repository is a class, that allows creation a data collection. Default repository implements only one method, \ni.e. `findOne`. Below shows, how to create a default repository.\n\nCreate a default HTTP repository:\n\n```javascript\nconst repository = modelPersist.httpFactory.createRepository(Person, new PersonLocator());\n```\n\nCreate a default Web Storage repository:\n\n```javascript\nconst repository = modelPersist.storageFactory.createRepository(Person, new PersonLocator());\n```\n\nExample of use:\n\n```javascript\nrepository.findOne(id).then((person) =\u003e {\n    console.log(person); // personal data\n});\n```\n\n### How create a custom repository\n\nYou must extend the default class:\n\n```javascript\nclass PersonHTTPRepository extends modelPersist.HTTPRepository\n{\n    findByFirstName(firstName) {\n        return new Promise((resolve, reject) =\u003e {\n            this._client.get(this._locator.getUrl(`/by-first-name/${firstName}`)).then((response) =\u003e {\n                const ArrayModel = new modelPersist.Model.Array(this._modelClass);\n                resolve(ArrayModel(this._manager.createInputTransformer().transform(response.data)));\n            }).catch((e) =\u003e {\n                reject(e);\n            });\n        });\n    }\n}\n```\n\nNow just change the type of repository in `Locator`:\n\n```javascript\nclass PersonLocator extends modelPersist.HTTPLocatorAbstract {\n    /**\n     * @inheritdoc\n     */\n    get basePath() {\n        return '/person';\n    }\n\n    getRepositoryClass() {\n        return PersonHTTPRepository;\n    }\n}\n```\n\nExample of use:\n\n```javascript\nconst repository = modelPersist.httpFactory.createRepository(Person, new PersonLocator());\n\nrepository.findByFirstName('Dolores').then((persons) =\u003e {\n    console.log(persons); // all persons who have the name Dolores\n});\n```\n\n## Configuring HTTP Client\n\nYou can change the global client settings, by setter `modelPersist.http.config.options`.\n\n```javascript\nmodelPersist.http.config.options = {\n    headers: {\n        'X-API-Key': 'secret'\n    }\n};\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmikoweb%2Fmodel-persistence","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmikoweb%2Fmodel-persistence","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmikoweb%2Fmodel-persistence/lists"}