{"_id":"@agtm/nuxt-model","_rev":"5-6bdb300affd0d65bbbdc79a185f1a2b4","name":"@agtm/nuxt-model","dist-tags":{"latest":"1.2.2"},"versions":{"1.0.10":{"name":"@agtm/nuxt-model","version":"1.0.10","description":"Classe para implementação de modelos de dado orientado a objeto","main":"dist/model.js","scripts":{"build":"npx tsc && cp src/*.tpl dist/","publish-patch":"npm run build && npm version patch && npm publish","test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/atimermann/nuxt-model.git"},"keywords":["model"],"author":{"name":"André Timermann","email":"andre@timermann.com.br","url":"http://andre.timermann.com.br"},"license":"ISC","bugs":{"url":"https://github.com:atimermann/nuxt-model/issues"},"homepage":"https://github.com:atimermann/nuxt-model#readme","dependencies":{"eslint":"^7.20.0","lodash":"^4.17.21"},"devDependencies":{"typescript":"^4.1.5"},"gitHead":"76e45aa19105d29c6c8188052c83c5e80b5f58a0","_id":"@agtm/nuxt-model@1.0.10","_nodeVersion":"12.18.4","_npmVersion":"6.14.8","dist":{"integrity":"sha512-tVp6Yr3hxCbXHkT5Ar4uzW0Lcr1IpQTVxfOe/kRSDBNkHfAkMtq1a2uwf9vd6j9/1/kbV1L8i/5zQRxGyPYowA==","shasum":"5ca85f063136601642a6bbddac4a8f4c8ec3ab1f","tarball":"https://registry.npmjs.org/@agtm/nuxt-model/-/nuxt-model-1.0.10.tgz","fileCount":7,"unpackedSize":23537,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgQsCqCRA9TVsSAnZWagAA7H8P/1yGneDGpg6PKXNHWs1Z\n8s+2Zblu8EK14O6jiHAGP/36oUce8aR6HpAWn2u+Co0Y+IS0A2DxzbyeMith\nFECJVDYorMSp23pF0Ivqu5WuR2/49ieWFW8vUjCChDHDLMw5GK5HWUlnq87d\nTkp2Lm2ksESRyLui6ao9X783ImXc7EKnT5wpA0r2TAs8ZjLCjXSJBdttabuV\nxaHwY48KEyLthwYmjroWt03xsPUZFRfSM512JQoFRukIyvyNxP++np12BvLj\nETlyOCvuYFX14b3tVuRiOHLw0zHJzfRoy3bPGCpB//AZWtSiW9T7abSlxGOY\nst1QlufeyYTN/jLHMGPb7vENUkpSln1DRQ0n4gTcJcQMstnHcFN6++XDw7IS\nqFzx7I1/ymnsb4uhVwrsSMZDw1sJG4bvNE7bgV8q4n2y5vOpvUMHIPSsGhu3\nMQeUbye4m0zWRs7xsJjr2gBjjokB/jurAiie+ZFMeWosP9K6jhTSD8u8Wutb\nye3G+C5CiTSXOV1QBHM9AvpHbGnTwabSGYNEmvrOCwC4o6uRuK4wpausj2+e\nwI/bfwNikURJa7J6dpihHYv/MwWFl+KiMNxI9MJVMmsL+RwDxIrlhw0pOIXv\nwgTnTyMk+2jyyKClgboXjikeQET8iIiz9kohimgnob5eVDjm35ZaAtJowTle\nHL5h\r\n=aHBy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD3ReGeOHpOfebmjMdl3VOUWsGvMchUx/+pPyotyFKxpwIhAOY8Ie423QpaAbgsFIOncy2AZwrkn5nT3cbEWj8nHM6x"}]},"_npmUser":{"name":"atimermann","email":"andre@timermann.com.br"},"directories":{},"maintainers":[{"name":"atimermann","email":"andre@timermann.com.br"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nuxt-model_1.0.10_1614987433797_0.7642991221617959"},"_hasShrinkwrap":false},"1.1.0":{"name":"@agtm/nuxt-model","version":"1.1.0","description":"Classe para implementação de modelos de dado orientado a objeto","main":"dist/index.js","scripts":{"build":"npx tsc && cp src/*.tpl dist/","publish-patch":"npm run build && npm version patch && npm publish","publish-minor":"npm run build && npm version minor && npm publish","publish-major":"npm run build && npm version major && npm publish","test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/agtm/nuxt-model.git"},"keywords":["model"],"author":{"name":"André Timermann","email":"andre@timermann.com.br","url":"http://andre.timermann.com.br"},"license":"ISC","bugs":{"url":"https://github.com:agtm/nuxt-model/issues"},"homepage":"https://github.com:agtm/nuxt-model#readme","dependencies":{"eslint":"^7.20.0","lodash":"^4.17.21"},"devDependencies":{"jest":"^26.6.3","typescript":"^4.1.5"},"gitHead":"fef575f568f761fe69f345e8cf6cc79bad25ad5a","_id":"@agtm/nuxt-model@1.1.0","_nodeVersion":"12.18.4","_npmVersion":"7.6.2","dist":{"integrity":"sha512-TprJ1X3kP6d77U6LhIJeKrA7y8vLVYzsSIvDGX/HLCwiIJz0EftNz7s6XBYpqsAYRESOKJR1UkSHrJohriLV/Q==","shasum":"ec216b81ddd7055b0cae6e01181cda661d5ff9e5","tarball":"https://registry.npmjs.org/@agtm/nuxt-model/-/nuxt-model-1.1.0.tgz","fileCount":18,"unpackedSize":36154,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgYCQ8CRA9TVsSAnZWagAAz1QQAJcoU6rJyRVgI+YBK9EV\n7/lH7kf9iUeqoxxZ4cxf9n9cc5FomAKD2W3RrLtuWqCmxo+eiXPjGlrk1Ic9\ndX7QixDQOKlLvMjcLqmZfZyF+/0camcEVUX5hU67egE30sM8wKSvnhKxmc77\nnMRJUDUs5uuxL3jj6xiR0fM+ZXdxCzGeF/rZCP++1sRMPgYUDqNQvxIG+q4h\nvzHUUU6gHkZo4+XOPahDm1M7rVGAboiIeL4GwWBkbR8vxVGXNz28nh7Fdon5\nqDIR5Zv6+/f11uGVm0jRXIWpvlvsUpKnn0DPcOWPENYxVb15cTNthWC125Ew\n4Ty24B7LoSVRiIp+U+0RJdVCBdMkoS2IJmu8BIPYjQjLEs/yhYPB0gKGOe8j\nmt/QeT0aAaCKyKwpvt/ifzw6/s9LdBetPDvgwvMGjPkAC0PXIiePRNQ7uUPx\nKOB5KEqXHBuZldCPg8cCzDoJy2Xpeh/NkO8q3yGszCeOi/BQNYMbFqG593cm\nIQ8KcGVCeIhdre9CNg1a0SHvldwH+H5Ynma4q414uhzfTSUp3VYHOsPL7jba\ncD6SVHvzdHlfe310qxoM82AHdQlAhCzAnPwVeA37ZgyTFbsVesazFA/eLYeE\nw6Yt8mwxDIfJHt5XutW468HrF2snJIOcAKopMX2+XKdfBFRuX2rdptdS/qyg\nFUoz\r\n=uycH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDue0it0qkUR2UL/TLSMsHQuLYrS9LA2HwlTGrZiCYjOAIgCu8vcMDH5xFByATsu3GRGOb6gMmY99SBU1HGHW7UJM0="}]},"_npmUser":{"name":"atimermann","email":"andre@timermann.com.br"},"directories":{},"maintainers":[{"name":"atimermann","email":"andre@timermann.com.br"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nuxt-model_1.1.0_1616913467637_0.7144349370509449"},"_hasShrinkwrap":false},"1.2.0":{"name":"@agtm/nuxt-model","version":"1.2.0","description":"Classe para implementação de modelos de dado orientado a objeto","main":"dist/index.js","scripts":{"build":"npx tsc && cp src/*.tpl dist/","publish-patch":"npm run build && npm version patch && npm publish","publish-minor":"npm run build && npm version minor && npm publish","publish-major":"npm run build && npm version major && npm publish","test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/agtm/nuxt-model.git"},"keywords":["model"],"author":{"name":"André Timermann","email":"andre@timermann.com.br","url":"http://andre.timermann.com.br"},"license":"ISC","bugs":{"url":"https://github.com:agtm/nuxt-model/issues"},"homepage":"https://github.com:agtm/nuxt-model#readme","dependencies":{"eslint":"^7.20.0","lodash":"^4.17.21"},"devDependencies":{"jest":"^26.6.3","typescript":"^4.1.5"},"gitHead":"932cf3a5ab19c4a2a8515b41bede318fd2bc0efb","_id":"@agtm/nuxt-model@1.2.0","_nodeVersion":"12.18.4","_npmVersion":"7.6.2","dist":{"integrity":"sha512-No2V3Cmlk5UW156pLP0Az5UKGcyQcwZwUB0ylrLtI4femGc+0UMRr6AqiNrVklK5jHGXn/LBP3qiLQA6M04wMQ==","shasum":"37893c13f0e10c5783e96cd77fb36d3f6f26ee2f","tarball":"https://registry.npmjs.org/@agtm/nuxt-model/-/nuxt-model-1.2.0.tgz","fileCount":18,"unpackedSize":38177,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgYR4VCRA9TVsSAnZWagAAGngP+gOH+6HmNEGf30cv9l10\nbrvMPASDk78y9KFXM122+a//MXjw3+iyi4781rG97x8sU2f7o7oSf3zrJobP\n6srPfzjYl+2r5lE6ZD/nLyCadGl6gqnCxfC6Cm+up9jDQZ43ybGbXXbYvcyV\nNXLJcWIOdaPpv/vRDPRJG30+BD+L+3KTrdyK6WA3FYftjCRBw1wCle1Kcd/t\nOTZbbrq4ZGLwQnFoMQSF06h+E3/va77OHM723YJkJADEoRkKP/95F4DmBstc\n8Jpy9UpA7XY5TnnYiXpBg3pzA5IoGyrmXX+OStT8PbdCe53n+3RvMQxLiw7c\n7p9Q8nD8xX1Jx/jn9xbjr9SFp6ZybCqiPDGc1Q0OahkRF1HGuiD+8X0MlpKK\n/Sq22O+m+OYX+ft0weQJGfKsx4DJpmb9egM8xX9cVBPErtD9maPLMjbNpzyI\n5JJvJ8UqqwkcKHUbSF/76XfQgp+a+e+ppeXs1zTs5ZN44ix/EbO7Qw999u8U\ndOXLZ1p1WCxD2MGbL0kD0mcX8FmozQp2CvVRuDiw+vhNi9xeH48Z0px6tYFj\nKq0A+MVA047HqYpM6wc1kd/byyucUUBcAFlWhJLAL+fY+m3d1fTNBmXrmZlP\n5IIewZUp+BJoktpYjrHVR4ZIqXEl62/53GiXL3fj19d0ZQF6dKaOvL0mYrf6\nxuiO\r\n=CjSj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCledElQm+bvTydsN9049AmBJpB+YIDpwBzOpfZ/rZTSwIgK9yX+vBkHbXBMeED/fOOQYeeT3KPr/lPMlZjulzbNAc="}]},"_npmUser":{"name":"atimermann","email":"andre@timermann.com.br"},"directories":{},"maintainers":[{"name":"atimermann","email":"andre@timermann.com.br"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nuxt-model_1.2.0_1616977429226_0.4599913922658896"},"_hasShrinkwrap":false},"1.2.1":{"name":"@agtm/nuxt-model","version":"1.2.1","description":"Classe para implementação de modelos de dado orientado a objeto","main":"dist/index.js","scripts":{"build":"npx tsc && cp src/*.tpl dist/","publish-patch":"npm run build && npm version patch && npm publish","publish-minor":"npm run build && npm version minor && npm publish","publish-major":"npm run build && npm version major && npm publish","test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/agtm/nuxt-model.git"},"keywords":["model"],"author":{"name":"André Timermann","email":"andre@timermann.com.br","url":"http://andre.timermann.com.br"},"license":"ISC","bugs":{"url":"https://github.com:agtm/nuxt-model/issues"},"homepage":"https://github.com:agtm/nuxt-model#readme","dependencies":{"eslint":"^7.20.0","lodash":"^4.17.21"},"devDependencies":{"jest":"^26.6.3","typescript":"^4.1.5"},"gitHead":"ac42ee51556f2c5e84b16bd532cfdf668845f038","_id":"@agtm/nuxt-model@1.2.1","_nodeVersion":"12.18.4","_npmVersion":"7.6.2","dist":{"integrity":"sha512-2VXgk1lyUaMzYFrm3prFFXcjX1rMmAKMLzCaKoXjyziBXPsOAtfhLYpbqGkHVFT3tQ/NSe/tWZBK7sz+uN+LfQ==","shasum":"10f7eca162518045d6a32b7004769c6af2aa0825","tarball":"https://registry.npmjs.org/@agtm/nuxt-model/-/nuxt-model-1.2.1.tgz","fileCount":18,"unpackedSize":38218,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgc70iCRA9TVsSAnZWagAAkLwP/1zwrmj8TsGnSCCGBs0c\nxF4lxoXJhDRNpzf1jvwMHahLo9jCu15u/nWfdRGlEPAJ8FGVCnDDiwNFmxOh\n+FVCPFZh1IyEq0xIa0qkVtVOnPzYnOdfPAgNHuv2djB5cZdLEaAfjvnvC1lW\nifZHytr6yBkO+ynbpsCf18INWaCks80BKZYhGDDUQjMiopFjpLfwgG4Mzcfj\nm29OIlRGcBBDhM+jUiGma48dittdJu9YYuZjJiDVCdQ0/VmDX5aTC/FJ8058\nfRvLag9YYjXhPRS5pDKq+PYka4bu1mkpVaA2iA4tUK7AChXho5ngmqFx1J73\n4inUaizJdz/KadXPxK51B2fwKQkb354cPXwm4ACJGTJMkF2kZzcinKZAgBCn\naOPhynWUU8DbpiG5Vmty4Em4/BHWc/TQ721tdXMG8QxsSwKwL0/zYKAKjTLb\n7eHA8TXcfg2VP2d4NarhvzcdYcmFORa+vqEur9ZxuhBziXebUhpA3OAk8w6w\nj8b+MkQ2zLPoCgKV2S4hFqAW3ekwobQepcdIPiev44Et5+TS1LXAjJNNXkTV\nh2ywsaSXRaQdXxrqC8HVJWnTb3KtElXBM7OQnx5qSduCaamquYVDigwOx1Kp\nb1Mi7xbB2e8Qh4w21y/nArkLAv68s4d5V5718rWMK2PF1gocXQ6diQzwXpYt\noDv5\r\n=AWPS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCmOsdUT8o7bcz2lDcSykEO6aK7yWGpmFhQEBxAIxFEZwIhAK57Itc0zhEZAf9HHE/11jHS0clAUPNsajO0rj8+/VWG"}]},"_npmUser":{"name":"atimermann","email":"andre@timermann.com.br"},"directories":{},"maintainers":[{"name":"atimermann","email":"andre@timermann.com.br"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nuxt-model_1.2.1_1618197793933_0.12010371959209976"},"_hasShrinkwrap":false},"1.2.2":{"name":"@agtm/nuxt-model","version":"1.2.2","description":"Classe para implementação de modelos de dado orientado a objeto","main":"dist/index.js","scripts":{"build":"npx tsc && cp src/*.tpl dist/","publish-patch":"npm run build && npm version patch && npm publish","publish-minor":"npm run build && npm version minor && npm publish","publish-major":"npm run build && npm version major && npm publish","test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/agtm/nuxt-model.git"},"keywords":["model"],"author":{"name":"André Timermann","email":"andre@timermann.com.br","url":"http://andre.timermann.com.br"},"license":"ISC","bugs":{"url":"https://github.com:agtm/nuxt-model/issues"},"homepage":"https://github.com:agtm/nuxt-model#readme","dependencies":{"eslint":"^7.20.0","lodash":"^4.17.21"},"devDependencies":{"jest":"^26.6.3","typescript":"^4.1.5"},"gitHead":"1bd1872db44a05d471bb6e056e6ecc8c0fa62110","_id":"@agtm/nuxt-model@1.2.2","_nodeVersion":"12.18.4","_npmVersion":"7.6.2","dist":{"integrity":"sha512-CO/jmyx8E3sdHpYMA2j0O23MUJgXOxmqI+PuhwuLRa1KWZGje58elIB8QhdruARfizyt4oViRAvdo3juPTP8RQ==","shasum":"ad66b591b5c5d18f36590f98c5d0ef7ec5d5666e","tarball":"https://registry.npmjs.org/@agtm/nuxt-model/-/nuxt-model-1.2.2.tgz","fileCount":18,"unpackedSize":38621,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgc8/TCRA9TVsSAnZWagAAxggP/R3eh9zR5KLvaMjMHb1Q\n5lx4DAce/+2EwUgUWYrKvLOkFf+PQ31ciH9fAdyY9sJuGmDtDseEDY8JD83R\nAGvn3+mIsigCIdP1TZxb97UuzlEDNqLZW3qu+Q9nVMrVDSnqDk3CSg50WZSx\nS+g1TPIHySg3qewBvu4a0hKmM7ueGg1V/39WsGM9Xq/5CmrVKZODTIsfD5b1\nnGQ6u7o7h5S2Hoq+tmD3/BGzxyUan6IsMPGAHxPuuQI5lP860CM+bRqnd7xt\nYKnsJWVSt4315dCoAU+tX8L7h2bt53g4r9xKZOrGCEGE4CEOifVXRyYEYRHA\nF8SWk3EmJw0pcn/KhKLKFKoyKnTgJkYKOpRlTNxmGrJkVVkoEfHQIGHcF0d1\nro9S/EsttVS2FMCwhy4dmWAVAmGaitjJKmofRJEYmdaM+rYOX1To5KmntoFi\nut5jfhTtKSTrbJUSCKn54v/+MI9klVR37TYcXYJ6ZNAROPbj914DJ/AnGQ3i\nmQNH/uQux/pgBxhUO7ASt63+oUB2XbpoG//yokmRIk6v5k9Yu+BExVe8/TTR\nDVul3qbMSaBdxI4Locf7jTt1cQh6LEeBk3ei4SE26BQT9URBsGe/IopkvUrS\njf3StzdgpH254d0cjzqq8yMglqiH8aCHkKMS2cYQyRM/CWEEyffaiep8zjg9\ndhSy\r\n=Tcvx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEKkm2gtd5kdTqJMi4Kq55Ji0mkl0QDXbi9G1DNrcVshAiEA0MpfcFGCgs4/qyy3Fsd2YYXOAGvWNPUHjJtnUH6RVvo="}]},"_npmUser":{"name":"atimermann","email":"andre@timermann.com.br"},"directories":{},"maintainers":[{"name":"atimermann","email":"andre@timermann.com.br"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/nuxt-model_1.2.2_1618202579360_0.21022840698714673"},"_hasShrinkwrap":false}},"time":{"created":"2021-03-05T23:37:13.563Z","1.0.10":"2021-03-05T23:37:13.942Z","modified":"2022-04-04T12:08:44.076Z","1.1.0":"2021-03-28T06:37:47.762Z","1.2.0":"2021-03-29T00:23:49.400Z","1.2.1":"2021-04-12T03:23:14.135Z","1.2.2":"2021-04-12T04:42:59.463Z"},"maintainers":[{"name":"atimermann","email":"andre@timermann.com.br"}],"description":"Classe para implementação de modelos de dado orientado a objeto","homepage":"https://github.com:agtm/nuxt-model#readme","keywords":["model"],"repository":{"type":"git","url":"git+https://github.com/agtm/nuxt-model.git"},"author":{"name":"André Timermann","email":"andre@timermann.com.br","url":"http://andre.timermann.com.br"},"bugs":{"url":"https://github.com:agtm/nuxt-model/issues"},"license":"ISC","readme":"# Nuxt Model\n\nMódulo que dá suporte a criação de \"modelos de dados\" orientado a objeto baseado em classes e relacionamento entre\nclasses.\n\nEste módulo permite criar objetos (instancia de classes) a partir de dados no formato JSON simples com todos os\nrelacionamentos automaticamente.\n\n# Caracteristicas\n\n* Criação de models de dado similar ao utilizado em ORMs no backend\n* Suporta relacionamento um-para-um e um-para-muitos\n* Criação de getters para atributos dinãmicos\n* Integração completa com nuxt. Exemplo: acessar plugins e outros métodos interno do nuxt\n* Podem ser manipualado como se fossem um objeto plano (plain-object) acessando atributos diretamente (Simula um objeto\n  plano)\n* Suporte a tipos customizados (exemplo: tradução automática)\n\n# Pré-configuração\n\n## Habilitar identificação automática do nome da classe (enableConstructorName)\n\nCaso prefira que o nome das classes sejam identificadas corretamente nas mensagens de erro no ambiente de produção, pode\nadicionar a seguinte configuração no arquivo nuxt.config.js:\n\n**NOTA:** Caso habilite a opção \"typeValidation\", e não queira utilizar className, está configuração será necessária.\n\n```javascript\nbuild: {\n  optimization: {\n    minimizer: [\n      new TerserPlugin({\n        terserOptions: {\n          keep_classnames: true,\n          keep_fnames: true\n        }\n      })\n    ]\n  }\n}\n```\n\nPor padrão ao comprimir/otimizar o código para produção, o nome de classes são renomeados para nomes compactados.\n\nREFs:\n\n* https://nuxtjs.org/docs/2.x/configuration-glossary/configuration-build#optimization\n* https://webpack.js.org/configuration/optimization/#optimizationminimize\n* https://webpack.js.org/plugins/terser-webpack-plugin/\n\nPodemos também identificar o nome da classe através do atributo **className** quando enableConstructorName for falso\ncomo no exemplo:\n\n```javascript\nexport default class TesteModel extends Model {\n  static className = 'TesteModel'\n}\n```\n\n# Instalação e configuração\n\nExecute o comando:\n\n    npm install --save @agtm/nuxt-model\n\nAdicione o seguinte no arquivo nuxt.config.js:\n\n```javascript\n['@agtm/nuxt-model/nuxt', { /* Options */ }]\n```\n\n# Estrutura de diretórios padrão\n\nAo intanciar um novo Model, caso este Model tenha relacionamentos, esses relacionamentos são instancia de outros Models.\nO NuxtModel importa automaticamente a classe do Model relacionado.\n\nPara que o NuxtModel saiba onde está localizado a classe, é utilizado um padrão de diretório:\n\n* As classes dos models estão localizado dentro da pasta models\n* Os arquivos das classes seguem o padrão: [NOME_DO_MODEL].model.js\n* O nome do model segue o padrão \"kebab-case\"\n\n**Exemplo:**\n\n```\nmodels\\\n    aluno.model.js\n    carteira-do-aluno.model.js\n```\n\nTambém podemos ter tipos customizados:\n\n```\ntypes\\\n    money.type.js    \n```\n\n## Customizando estrutura de diretório\n\nCaso precisemos utilizar uma estrutura de diretório diferente, podemos alterar dois atributos na configuraçao do modulo:\nimportPath e fileCaseStyle\n\nPor padrão importPath é definido como:\n\n    ~/models/${modelName}.model.js\n\nOnde ${modelName} é substituído pelo nome do model\n\nPor exemplo, podemos criar a seguinte estrutura de diretório:\n\n```\nsrc\\\n    models\\\n        meu-model\\\n            index.js\n```\n\nPara isso configuramos importPath como:\n\n    ~/src/models/${modelName}/index.js\n\nE finalmente para utilizar outro padrão de nome de model podemos definir fileCaseStyle como:\n\n    kebabCase, camelCase ou snakeCase\n\nSeguindo a mesma regra também podemos customizar a estrutura de diretório dos tipos padrões\n\n# Criando um Model\n\nModels são criados utilizando o padrão de classe do ES6, utilizando herança, getters, setters entre outros.\n\n## Model mais simples possível\n\nNa configuração padrão model deve ser criado na pasta models. Por exemplo, para criar um model \"Aluno\", na pasta models\nvamos criar o seguinte arquivo:\n\n    aluno.model.js\n\nDevemos exportar uma classe como no exemplo:\n\n```javascript\nimport { Model } from '@agtm/nuxt-model'\n\nexport default class AlunoModel extends Model {\n\n}\n```\n\nRegras:\n\n* Todos os models devem herdar a classe Model\n* O nome do model deve ter o sufixo Model\n\n## Definindo atributos\n\nNo nosso exemplo anterior não defininos nenhum atributo, ou seja nenhum valor pode ser carregado na instancia do model.\nApenas atributos definidos podem ser utilizado, isso permite validar os atributos permitidos ou exigidos no nosso model\n\nVamos criar alguns atributos:\n\n```javascript\nimport { Model } from '@agtm/nuxt-model'\n\nexport default class AlunoModel extends Model {\n  static nomeType = 'string'\n  static idadeType = 'number'\n  static matriculadoType = 'boolean'\n  static turmaType = 'turmaModel'\n  static nascimentoType = 'date'\n}\n```\n\n* Os atributos do model são atributos de classe, portando teve ser definidos como estático\n* Todo o nome de atributo deve ser sufixado com \"Type\"\n* Os tipos permitidos são: 'string', 'number', 'boolean', 'date', um tipo customizado, um model ou array dos tipos\n  anteriroes.\n* Para tipos simples devem ser definidos com texto em 'string', não utilizar os tipos do javascript.\n\n**IMPORTANTE:**  Nome de atributos que iniciam com _ são ignorados\n\n## Valores iniciais\n\nPodemos definir valores iniciais no nosso model, para isso simplesmente declare um atributo estatico diretamente como no\nexemplo:\n\n```javascript\nimport { Model } from '@agtm/nuxt-model'\n\nexport default class TesteModel extends Model {\n  static idType = 'number'\n  static profissaoType = 'string'\n\n  id = 123\n  profissao = 'Desenvolvedor'\n}\n```\n\n# Criando Getters e Setters\n\nPodemos criar getters e setters nos models para atributos dinamicos, implementando qualquer lógica desejada, como:\nacesso a informações do nuxt, formatação de dados (tanto no setter quanto no getter) entre outros:\n\nPor exemplo:\n\n```javascript\nimport { Model } from '@agtm/nuxt-model'\n\nexport default class TesteModel extends Model {\n  static nameType = 'string'\n  static sobrenomeType = 'string'\n\n  /**\n   * Se o Nuxt estpa no modo desenvolvimento\n   *\n   * @return {boolean|*}\n   */\n  get idDev () {\n    return Model.context.isDev\n  }\n\n  get nomeCompleto () {\n    return `${this.name} ${this.sobrenome}`\n  }\n\n  set apelido (value) {\n    this._callObservers('apelido', value)\n  }\n}\n```\n\n**IMPORTANTE:** Sempre que criar um 'Setter', necessário chamar o método this.__callObservers(NOME_DO_ATRIBUTO,\nNOVO_VALOR)\npara que o evento onChange funcione para este setter\n\n# Tipos\n\nTodo o atributo no Nuxt Model tem um tipo, esse tipo é utilizado para transformar ou validar dados. Podemos utilizar\ntipos pré-definidos ou criar um tipo customizado.\n\n## Tipos Pré-definidos\n\n### Tipos Primitivos\n\nSão tipos básicos do javascript:\nhttps://developer.mozilla.org/en-US/docs/Glossary/Primitive\n\nNo Nuxt Model são permitidos:\n\n    string, number, bigint, boolean e symbol\n\nundefined e null, são tratado como dados vazio e portanto são ignorados.\n\nOs dados são validados se estão no seu tipo correto.\n\n### Tipo Date\n\nNo tipo Date, somente são permitidos tipo primitivo string ou instancia do objeto Date do javascript.\n\nCaso seja do tipo string será convertido para Date.\n\n### Sub Model\n\nNo Nuxt Model podemos criar atributos especiais que são outros models criando relacionamento entre models.\n\nPara criarmos um atributo do tipo \"Model\", precisamos colocar o nome do \"model\" no tipo, e todo \"model\" tem o sufixo \"\nModel\"\n\nPor exemplo:\n\n```javascript\n// aluno.model.js\nexport default class AlunoModel extends Model {\n  static idType = 'number'\n  static nameType = 'string'\n  static sobrenomeType = 'string'\n\n  get nomeCompleto () {\n    return `${this.name} ${this.sobrenome}`\n  }\n}\n\n// turma.model.js\nimport { Model } from '@agtm/nuxt-model'\n\nexport default class Turma extends Model {\n  static alunoType = 'AlunoModel'\n}\n\n// exemplo.js\nconst turma = await Turma.create({\n  aluno:\n    {\n      id: 1,\n      nome: 'João',\n      sobrenome: 'Silva'\n    }\n})\n\nconsole.log(turma.aluno.nomeCompleto)\n// João Silva\n\n```\n\n**NOTA:** Submodels são instanciados internamente automaticamente pelo Nuxt Model\n\n### Array\n\nArray é um tipo especial que representa um array de tipos, por exemplo:\n\n```javascript\nexport default class AlunoModel extends Model {\n  static nameType = 'string[]'\n}\n\n```\n\n* Para definir um array, necessário criar o sufixo \"[]\"\n* Só podemos criar array de tipos primitivos, date e submodel. Tipos customizados não são permitidos.\n\nExemplo:\n\n```javascript\n const escola = await Escola.create({\n  turma: {\n    alunos: [\n      {\n        id: 1,\n      }, {\n        id: 2\n      }\n    ]\n  }\n})\n\nescola.turma.alunos.push({\n  id: 5\n})\n\n```\n\n## Tipos Customizados\n\nCom tipos customizados podemos validar dados antes de atribuir, formatar, criar atributos dinamicos entre outros.\n\nO objetivo principal dos tipos customizados é evitar código repetitivo, pois tudo que pode ser criado com tipo, poderia\nser criados com 'getters' e ‘setters’ no model. Porém, existem casos em que utilizamos a mesma lógica em muitos models\ndo nossso projeto, por exemplo, formatação de dados monetários.\n\nPodemos então criar um tipo especial 'money' e toda a vez que for ler o atributo já vem no formato correto.\n\nPor padrão os tipos customizados devem ser criado na pasta \"types\" na raiz do projeto.\n\n**NOTA:** Este comportamento pode ser alterado pela opção \"typeImportPath\". Segue a mesma regra dos models.\n\nVamos criar um tipo customizado chamado money:\n\n```javascript\n// /types/money.type.js\n\nimport { cloneDeep } from 'lodash'\nimport { ModelType } from '@agtm/nuxt-model'\n\nexport default class MoneyType extends ModelType {\n\n  static setup (instance, attrName, attrType) {\n\n    Object.defineProperty(instance, attrName, {\n      get () {\n        if (instance.__rawValues[attrName] !== undefined) {\n          return 'R$ ' + instance.__rawValues[attrName].toFixed(2)\n        }\n      },\n      set (value) {\n        instance.__rawValues[attrName] = cloneDeep(value)\n        instance.__callObservers(attrName, value)\n      }\n    })\n  }\n}\n\n// exemplo.js:\n\nthis.teste = await Teste.create({\n  valor: 23.3,\n})\n\nconsole.log(teste.valor)\n// R$ 23.30\n\n```\n\nNote que criar um Tipo customizado, precisamos criar um método setup obrigatório, que ira alterar a instância do model.\n\nO método setup recebe três parâmetros:\n\n* instance: Instancia de Model onde devemos obter/gravar o valor do atributo\n* attrName: Nome do atributo, no nosso exemplo \"valor\"\n* attrType: Tipo do atributo, no nosso caso \"money\"\n\nVeja que o método setup é bastante livre para fazemos qualquer manipulação que quisermos.\n\n**IMPORTANTE:** Necessário chamar o método instance.__callObservers(NOME_DO_ATRIBUTO, NOVO_VALOR) no set para que o\nevento onChange funcione para este tipo,\n\n### __rawValues e Object.defineProperty\n\nAqui é importante entender o funcionamento interno de um model, todos os valores não são armazenados por padrão no\natributo da instancia e sim dentro de um objeto chamado \"__rawValues\".\n\nUtilizamos getters e setters para ler o valor armazenado ali.\n\nTodos os tipos internos são implentados usando esta técnica.\n\nO valor diretamente no atributo da instância é lido apenas na inicialização para definir o valor inicial, em seguida é\ndescartado.\n\nPodemos alterar todo esse comportamento caso desejarmos, porém por padrão utilizamos Object.defineProperty para criarmos\ngetters e setters que irão obter/gravar o valor em __rawValues.\n\nObserve outros exemplos dentro do projeto nuxt-model na pasta \"src/types\"\n\n### Getters e Setters assincronos\n\nNão foi testado, veja mais detalhes em:\nhttps://medium.com/trabe/async-getters-and-setters-is-it-possible-c18759b6f7e4\n\n# Integração com nuxt\n\nO Nuxt Model tem integração com o nuxt, métodos e atributos estão definidos na classe.\n\nPor exemplo:\n\n```javascript\n'use strict'\n\nimport { Model } from '@agtm/nuxt-model'\n\nexport default class TesteModel extends Model {\n  get isStatic () {\n    return Model.context.isStatic + this.id\n  }\n}\n```\n\nTambém é possível utilizar this.constructor\n\n```javascript\n'use strict'\n\nimport { Model } from '@agtm/nuxt-model'\n\nexport default class TesteModel extends Model {\n  get isStatic () {\n    return this.constructor.context.isStatic + this.id\n  }\n}\n```\n\nDocumentação no Nuxt:\n\n* https://nuxtjs.org/docs/2.x/internals-glossary/context\n* https://nuxtjs.org/docs/2.x/internals-glossary/$nuxt\n\n# Instanciando e manipulando um Model\n\nCom os Models criados, podemos instanciar da seguinte forma:\n\n```javascript\n this.teste = await Teste.create({\n  id: 1,\n  valor: 23.34,\n  nascimento: '2020-01-01',\n  name: {\n    id: 2,\n    name: [{\n      id: 3,\n      __typename: 'teste'\n    }, {\n      id: 4\n    }]\n  }\n})\n```\n\n## Atribuindo\n\nPodemos atribuir normalmente como se fosse um objeto javascript:\n\n```javascript\nthis.teste.pais = 'Argentina'\n```\n\nSe o tipo por um submodel, será instanciado um novo Model do tipo especificado automaticamente.\n\n## SetModels\n\nPodemos atribuir varios valores de uma vez com setValues:\n\n```javascript\n    this.teste.setValues({\n  id: 2,\n  valor: 50,\n})\n```\n\n* No exemplo, apenas 'id' e 'valor' serão alterados. Atributos não especificados não serão alterados.\n\n## Atributos não definidos\n\n**IMPORTANTE:** Se passar um atributo não definido no model via metodos \"create\" e \"setValues\", a Model irá validar\nautomaticamente, exibindo um erro que o atributo não existe.\n\nPorém, se atribuir diretamente:\n\n```javascript\nthis.teste.pais = 'Argentina'\n```\n\n**IMPORTANTE:**\nNenhum erro será disparado, porém o atributo será ignorado por métodos como toJSON e toString ou poderá ser exluído a\nqualquer momento. Portando nunca utilize um atributo não definido no model.\n\nObservers também não funcionarão para atributos não definidos.\n\nIsso ocorre porque no javascript não é possível criar getters e setters genericos, impossibilidando a validação.\n\n# toJSON e toString\n\nO método toJson() retorna um objeto plano representando o model (é o equivalente ao setModels invertido).\n\nUse toString() pra uma representação textual do json\n\n# Validação extra para dados\n\nSe os dados em JSON utilizado ao instanciar um movo Model conter informação de tipo, podemos utilizar para realizar uma\nvalidação extra.\n\nPor exemplo, o GraphQl envia com os dados um atributo especial \"__typename\" para identificar o tipo do dado enviado.\n\nPodemos validar se esse tipo é o mesmo tipo do model criado. Para isso precisamos definir a opção \"typeValidation\"\ncomo \"__typename\"\n\n## Criando um Model inferindo o tipo a partir dos dados JSON\n\nCaso typeValidation esteja habilitado, podemos instanciar um novo model com o método **createFromData**.\n\nPor exemplo:\n\n```javascript\n //Em vez de fazer:\nAlunoModel.create(data)\n\n// Podemos utilizar:\nModel.createFromData(data)\n```\n\nÚtil quando não sabemos qual Model será enviado pelo backend.\n\n# Atributos estendidos\n\nPodemos adicionar outras propriedades aos atriburos do Model (por exemplo para criação de um formulário).\n\nPodemos definir atributos como required, minLengt etc...\n\nImportante notar que com exceção do atributo type, os outros atributos serão ignorado pelo nuxt Model, sendo útil apenas\npara aplicações externas (como nuxt form)\n\nExemplo:\n\n```javascript\nimport { Model } from '@agtm/nuxt-model'\n\nexport default class TesteModel extends Model {\n  static nameType = {\n    type: 'SubTesteModel',\n    required: true\n  }\n}\n```\n\nNote que é um atributo de classe, na instância terá q acessar da seguinte forma:\n\n```javascript\n  console.log(meu_model.constructor.nameType.required)\n\n```\n\n# Evento OnChange (Observers)\n\nPodemos criar um evento que será chamado sempre que alguma alteração ocorrer no Model, veja o exemplo:\n\n```javascript\nthis.aluno = await Aluno.create({name: 'João'})\nthis.aluno.onChange(function (attrName, value) {\n  console.log('ON CHANGE:', attrName, value)\n})\n```\n\n**NOTA:** Só é possivel criar eventos, não é possível remove-los, tome cuidado.\n\n# Rêferencia\n\n## Opções\n\nAo configurar o modulo no projeto, podemos definir as seguintes opções:\n\n| Atributo              | Descrição                                                                                                                                                                                                                                                                                          | Padrão                           |\n|-----------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------|\n| importPath            | Nuxt-model, carrega e instancia objetos automaticamente, através de importPath o nuxt-model consegue encontrar as classes. Está no formato \"template string\" e a variável \"modelName\" representa o nome da classe. É usado para definir a estrutura de diretório utilizado para os models.        | \"~/models/${modelName}.model.js\" |\n| typeImportPath        | Regra de carregamento para os tipos customizados.                                                                                                                                                                                                                                                  | \"~/types/${typeName}.type.js\"    |\n| enableConstructorName | Habilita identificação da classe pelo constructorName, caso esta opção esteja desativada é necessário especificar o nome da classe no atributo estático \"class\". Para ativar esta opção é necessário realizar uma pré-configuração.                                                                | true                             |\n| fileCaseStyle         | Estilo de caixa (Case Style) do arquivos do model, por exemplo para kebabCase o model será sub-teste.model.js, para camelCase será subTeste.model.js.                                                                                                                                              | 'kebabCase'                      |\n| typeValidation        | Se definido, irá validar se um objeto de valores vinculado à um model está correto. Por exemplo, no graphql é utilizado _typename junto com o json de dados para identificar o tipo do objetos, caso seja definido o atributo será obrigatorio no objeto de dados utilizado por create e setValue. | undefined                      |\n\nTable Editor: https://www.tablesgenerator.com/markdown_tables\n\nhttps://dev.to/bawa_geek/how-to-setup-jest-testing-in-nuxt-js-project-5c84\n\n\n## Issues\n\n* Nuxt Model não é reativo no Vue, pesquisar uma solução, por enquanto utilizar:\n  * [model].onChange(() => this.$forceUpdate())\n  * Tomar cuidado com performance, testar com formulário grande\n\n* setValues, onChange, pode dar conflitos, usar $setValues, $onChange, $toJson\n","readmeFilename":"README.md"}