json-rest-api 1.0.20 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/audit/00-charter.md +103 -0
- package/audit/01-scope-map.md +84 -0
- package/audit/02-coverage-matrix.csv +174 -0
- package/audit/03-invariants.md +123 -0
- package/audit/04-standards-rubric.md +56 -0
- package/audit/05-competitor-rubric.md +77 -0
- package/audit/06-findings.md +160 -0
- package/audit/07-risk-register.csv +10 -0
- package/audit/08-remediation-roadmap.md +177 -0
- package/audit/09-signoff-check.md +23 -0
- package/audit/10-final-synthesis.md +29 -0
- package/audit/evidence/code/all-files-json-rest-api.txt +168 -0
- package/audit/evidence/code/all-files-json-rest-schema.txt +12 -0
- package/audit/evidence/code/boundary-leak-checks.txt +72 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__bulk-operations-plugin.js.txt +480 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__connectors__express-plugin.js.txt +532 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__connectors__lib__busboy-detector.js.txt +175 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__connectors__lib__formidable-detector.js.txt +138 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__connectors__lib__request-helpers.js.txt +222 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__file-handling-plugin.js.txt +342 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__dbTablesOperations.js.txt +304 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__fractional-positioning.js.txt +188 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__compile-schemas.js.txt +336 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__connectors-query-parser.js.txt +165 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__database-capabilities.js.txt +265 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__database-value-normalizers.js.txt +369 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__default-data-helpers.js.txt +72 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__field-utils.js.txt +139 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__knex-constants.js.txt +45 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__knex-field-helpers.js.txt +396 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__knex-json-api-transformers.js.txt +162 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__payload-validators.js.txt +1314 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__schema-helpers.js.txt +488 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__scope-validations.js.txt +484 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying-writing__simplified-helpers.js.txt +857 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-cross-table-search.js.txt +565 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-json-api-transformers-querying.js.txt +485 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-pagination-helpers.js.txt +560 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-process-includes.js.txt +167 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-query-helpers-base.js.txt +109 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-query-helpers.js.txt +1064 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-relationship-includes.js.txt +1983 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__knex-window-queries.js.txt +328 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__querying__url-helpers.js.txt +119 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__storage__storage-adapter.js.txt +160 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__writing__many-to-many-manipulations.js.txt +300 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__lib__writing__relationship-processor.js.txt +245 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-access.js.txt +459 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-cors-plugin.js.txt +237 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-knex-plugin.js.txt +1135 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-multihome-plugin.js.txt +314 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__compile-resource-schemas.js.txt +7 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__register-relationship-routes.js.txt +71 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__register-scope-routes.js.txt +102 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__turn-scope-init-into-vars.js.txt +49 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-hooks__validate-include-configurations.js.txt +39 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__add-route.js.txt +23 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__check-permissions.js.txt +13 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__common.js.txt +639 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__delete-relationship.js.txt +117 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__delete.js.txt +104 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__enrich-attributes.js.txt +199 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__get-related.js.txt +353 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__get-relationship.js.txt +61 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__get.js.txt +184 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__patch-relationship.js.txt +55 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__patch.js.txt +191 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__post-relationship.js.txt +110 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__post.js.txt +168 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__put.js.txt +253 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__query.js.txt +207 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin-methods__release.js.txt +12 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-plugin.js.txt +165 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__rest-api-positioning-plugin.js.txt +668 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__core__socketio-plugin.js.txt +621 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__storage__local-storage.js.txt +218 -0
- package/audit/evidence/code/critical-pass1/json-rest-api__plugins__storage__s3-storage.js.txt +124 -0
- package/audit/evidence/code/critical-pass1/json-rest-schema__src__CorePlugin.js.txt +269 -0
- package/audit/evidence/code/critical-pass1/json-rest-schema__src__Schema.js.txt +242 -0
- package/audit/evidence/code/critical-pass1/json-rest-schema__src__index.js.txt +77 -0
- package/audit/evidence/code/critical-pass1-risk-keywords.txt +238 -0
- package/audit/evidence/code/critical-pass1-summary.csv +67 -0
- package/audit/evidence/code/critical-pass2-summary.csv +67 -0
- package/audit/evidence/code/early-silent-zones-no-test-token.txt +57 -0
- package/audit/evidence/code/error-model-signals.txt +98 -0
- package/audit/evidence/code/git-files-json-rest-api.txt +171 -0
- package/audit/evidence/code/git-files-json-rest-schema.txt +27 -0
- package/audit/evidence/code/hook-flow-signals.txt +282 -0
- package/audit/evidence/code/idproperty-signals.txt +157 -0
- package/audit/evidence/code/import-cycles-non-anyapi.txt +3 -0
- package/audit/evidence/code/import-hotspots-non-anyapi.txt +96 -0
- package/audit/evidence/code/imports-json-rest-api.txt +354 -0
- package/audit/evidence/code/imports-json-rest-schema.txt +15 -0
- package/audit/evidence/code/in-scope-files-json-rest-api.txt +160 -0
- package/audit/evidence/code/in-scope-files-json-rest-schema.txt +13 -0
- package/audit/evidence/code/non-anyapi-core-files.txt +101 -0
- package/audit/evidence/code/permission-signals.txt +193 -0
- package/audit/evidence/code/query-include-signals.txt +687 -0
- package/audit/evidence/code/transaction-signals.txt +28 -0
- package/audit/evidence/code/validation-signals.txt +650 -0
- package/audit/evidence/code/write-path-signals.txt +61 -0
- package/audit/evidence/docs/docs-claims-signals.txt +1075 -0
- package/audit/evidence/docs/schema-docs-claims-signals.txt +179 -0
- package/audit/evidence/external/corpus-freeze.md +21 -0
- package/audit/evidence/external/npm-competitor-metadata.txt +70 -0
- package/audit/evidence/external/npm-download-signals.txt +23 -0
- package/audit/evidence/external/npm-jsonapi-server.txt +8 -0
- package/audit/evidence/external/npm-modern-jsonapi-metadata.txt +38 -0
- package/audit/evidence/external/readme-fortune-signals.txt +26 -0
- package/audit/evidence/external/readme-fortune.md +165 -0
- package/audit/evidence/external/readme-json-api-serializer-signals.txt +80 -0
- package/audit/evidence/external/readme-json-api-serializer.md +690 -0
- package/audit/evidence/external/readme-jsonapi-serde-server-signals.txt +0 -0
- package/audit/evidence/external/readme-jsonapi-serde-server.md +22 -0
- package/audit/evidence/external/readme-jsonapi-serializer-signals.txt +63 -0
- package/audit/evidence/external/readme-jsonapi-serializer.md +315 -0
- package/audit/evidence/external/readme-jsonapi-server-signals.txt +19 -0
- package/audit/evidence/external/readme-jsonapi-server.md +104 -0
- package/audit/evidence/external/readme-nestjs-json-api-signals.txt +4 -0
- package/audit/evidence/external/readme-nestjs-json-api.md +94 -0
- package/audit/evidence/external/readme-yaser-json-api-nestjs-signals.txt +47 -0
- package/audit/evidence/external/readme-yaser-json-api-nestjs.md +447 -0
- package/audit/evidence/external/standard-jsonapi-snippets.txt +84 -0
- package/audit/evidence/external/standard-rfc-snippets.txt +168 -0
- package/audit/evidence/external/standards-sources.txt +6 -0
- package/audit/evidence/runtime/baseline-commits.txt +2 -0
- package/audit/evidence/runtime/db-adapter-assumptions.txt +3 -0
- package/audit/evidence/runtime/environment.txt +4 -0
- package/audit/evidence/runtime/invariant-runtime-mapping.md +38 -0
- package/audit/evidence/runtime/probe-patch-relationship-error.exitcode +1 -0
- package/audit/evidence/runtime/probe-patch-relationship-error.log +76 -0
- package/audit/evidence/runtime/probe-patch-relationship-error.mjs +67 -0
- package/audit/evidence/runtime/probe-patch-relationship-referenceerror.exitcode +1 -0
- package/audit/evidence/runtime/probe-patch-relationship-referenceerror.log +62 -0
- package/audit/evidence/runtime/probe-patch-relationship-referenceerror.mjs +47 -0
- package/audit/evidence/runtime/test-exitcodes.txt +4 -0
- package/audit/evidence/runtime/test-summary.md +107 -0
- package/audit/evidence/runtime/trace-anchors.txt +61 -0
- package/audit/evidence/tests/access-multitenancy-test-signals.txt +125 -0
- package/audit/evidence/tests/failing-tests-summary.txt +25 -0
- package/audit/evidence/tests/npm-test-json-rest-api.exitcode +1 -0
- package/audit/evidence/tests/npm-test-json-rest-api.log +5885 -0
- package/audit/evidence/tests/npm-test-json-rest-schema.exitcode +1 -0
- package/audit/evidence/tests/npm-test-json-rest-schema.log +356 -0
- package/audit/evidence/tests/query-include-test-signals.txt +948 -0
- package/audit/evidence/tests/relationship-test-signals.txt +223 -0
- package/audit/evidence/tests/skipped-tests.txt +10 -0
- package/audit/evidence/tests/test-suite-list-non-anyapi.txt +30 -0
- package/audit/evidence/tests/test-suite-list.txt +32 -0
- package/audit/subsystems/docs-drift.md +49 -0
- package/audit/subsystems/pass2-cross-review.md +131 -0
- package/audit/subsystems/plugins-access.md +51 -0
- package/audit/subsystems/plugins-bulk.md +50 -0
- package/audit/subsystems/plugins-cors.md +48 -0
- package/audit/subsystems/plugins-file.md +53 -0
- package/audit/subsystems/plugins-multihome.md +50 -0
- package/audit/subsystems/plugins-positioning.md +54 -0
- package/audit/subsystems/plugins-socketio.md +50 -0
- package/audit/subsystems/query-engine.md +61 -0
- package/audit/subsystems/relationships.md +55 -0
- package/audit/subsystems/rest-orchestration.md +66 -0
- package/audit/subsystems/schema-core.md +64 -0
- package/audit/subsystems/storage-knex.md +57 -0
- package/audit/subsystems/tests.md +48 -0
- package/audit/subsystems/transport-express.md +55 -0
- package/audit/traces/trace-read-get.md +22 -0
- package/audit/traces/trace-read-query.md +25 -0
- package/audit/traces/trace-relationship-endpoints.md +31 -0
- package/audit/traces/trace-write-delete.md +17 -0
- package/audit/traces/trace-write-patch.md +26 -0
- package/audit/traces/trace-write-post.md +22 -0
- package/audit/traces/trace-write-put.md +23 -0
- package/package.json +5 -5
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
4:# JSON API Serializer
|
|
2
|
+
7: <img src="https://github.com/SeyZ/jsonapi-serializer/blob/master/logo.jpg?raw=true" alt="JSONAPI Serializer Logo">
|
|
3
|
+
10:[](https://travis-ci.org/SeyZ/jsonapi-serializer)
|
|
4
|
+
11:[](https://yarnpkg.com/en/package/jsonapi-serializer)
|
|
5
|
+
12:[](https://yarnpkg.com/en/package/jsonapi-serializer)
|
|
6
|
+
14:A Node.js framework agnostic library for (de)serializing your data to [JSON
|
|
7
|
+
17:psst: If you need an off-the-shelf admin panel for your app, check out what I build in my day job at [forestadmin.com](https://www.forestadmin.com) - it uses jsonapi-serializer to de/serialize data data coming from/to the APIs.
|
|
8
|
+
19:- [Migrate from 2.0 to 3.0](https://github.com/SeyZ/jsonapi-serializer/wiki/Migrate-from-2.0-to-3.0)
|
|
9
|
+
20:- [Migrate from 1.x to 2.0](https://github.com/SeyZ/jsonapi-serializer/wiki/Migrate-from-1.x-to-2.0)
|
|
10
|
+
23:`$ npm install jsonapi-serializer`
|
|
11
|
+
29: var JSONAPISerializer = require('jsonapi-serializer').Serializer;
|
|
12
|
+
30: new JSONAPISerializer(type, opts).serialize(data);
|
|
13
|
+
37:Calling the `serialize` method on the returned object will serialize your `data` (object or array) to a compliant JSONAPI document.
|
|
14
|
+
42:- **attributes**: An array of attributes to show. You can define an attribute as an option if you want to define some relationships (included or not).
|
|
15
|
+
43: - **ref**: If present, it's considered as a relationships.
|
|
16
|
+
44: - **included**: Consider the relationships as [compound document](http://jsonapi.org/format/#document-compound-documents). Default: true.
|
|
17
|
+
50: - **relationshipLinks**: An object that describes the links inside relationships. Values can be *string* or a *function*
|
|
18
|
+
51: - **relationshipMeta**: An object that describes the meta inside relationships. Values can be a plain value or a *function*
|
|
19
|
+
52: - **ignoreRelationshipData**: Do not include the `data` key inside the relationship. Default: false.
|
|
20
|
+
62:- [Express example](https://github.com/SeyZ/jsonapi-serializer/tree/master/examples/express)
|
|
21
|
+
63:- [Simple usage](#simple-usage-serializer)
|
|
22
|
+
64:- [More examples in tests](https://github.com/SeyZ/jsonapi-serializer/blob/master/test/serializer.js)
|
|
23
|
+
66:<a name="simple-usage-serializer"></a>
|
|
24
|
+
77:var JSONAPISerializer = require('jsonapi-serializer').Serializer;
|
|
25
|
+
83:var users = UserSerializer.serialize(data);
|
|
26
|
+
85:// `users` here are JSON API compliant.
|
|
27
|
+
112: var JSONAPIDeserializer = require('jsonapi-serializer').Deserializer;
|
|
28
|
+
113: new JSONAPIDeserializer(opts).deserialize(data);
|
|
29
|
+
115:The function `JSONAPIDeserializer` takes one argument:
|
|
30
|
+
117:- `opts`: The deserializer options.
|
|
31
|
+
119:Calling the `deserialize` method on the returned object will deserialize your `data` (JSONAPI document) to a plain javascript object.
|
|
32
|
+
124:- **AN\_ATTRIBUTE\_TYPE**: this option name corresponds to the type of a relationship from your JSONAPI document.
|
|
33
|
+
125: - **valueForRelationship**: A function that returns whatever you want for a relationship (see examples below) ***can return a Promise (see tests)***
|
|
34
|
+
130:- [Simple usage](#simple-usage-deserializer)
|
|
35
|
+
131:- [Relationship](#relationship-deserializer)
|
|
36
|
+
132:- [More examples in tests](https://github.com/SeyZ/jsonapi-serializer/blob/master/test/deserializer.js)
|
|
37
|
+
134:<a name="simple-usage-deserializer"></a>
|
|
38
|
+
158:var JSONAPIDeserializer = require('jsonapi-serializer').Deserializer;
|
|
39
|
+
160:new JSONAPIDeserializer().deserialize(jsonapi, function (err, users) {
|
|
40
|
+
171:<a name="relationship-deserializer"></a>
|
|
41
|
+
183: relationships: {
|
|
42
|
+
195: relationships: {
|
|
43
|
+
205:var JSONAPIDeserializer = require('jsonapi-serializer').Deserializer;
|
|
44
|
+
207:new JSONAPIDeserializer({
|
|
45
|
+
209: valueForRelationship: function (relationship) {
|
|
46
|
+
211: id: relationship.id,
|
|
47
|
+
218:}).deserialize(jsonapi, function (err, users) {
|
|
48
|
+
256: var JSONAPIError = require('jsonapi-serializer').Error;
|
|
49
|
+
257: var error = new JSONAPIError(opts);
|
|
50
|
+
261:- `opts`: The error options. All options are optional.
|
|
51
|
+
263:#### Available error option (`opts` argument)
|
|
52
|
+
267:- **code**: an application-specific error code, expressed as a string value.
|
|
53
|
+
270:- **source**: an object containing references to the source of the error, optionally including any of the following members:
|
|
54
|
+
272: - **parameter**: a string indicating which URI query parameter caused the error.
|
|
55
|
+
275:- **meta**: a meta object containing non-standard meta-information about the error.
|
|
56
|
+
279:- [Simple usage](#simple-usage-error)
|
|
57
|
+
280:- [More example](https://github.com/SeyZ/jsonapi-serializer/blob/master/test/error.js)
|
|
58
|
+
282:<a name="simple-usage-error"></a>
|
|
59
|
+
286:var JSONAPIError = require('jsonapi-serializer').Error;
|
|
60
|
+
288:var errors = new JSONAPIError({
|
|
61
|
+
295:// `errors` here are JSON API compliant.
|
|
62
|
+
302: "errors": [
|
|
63
|
+
315:[MIT](https://github.com/SeyZ/jsonapi-serializer/blob/master/LICENSE)
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
# I am looking for new maintainers
|
|
2
|
+
If you are interested, send me an email: sandro@munda.me
|
|
3
|
+
|
|
4
|
+
# JSON API Serializer
|
|
5
|
+
|
|
6
|
+
<p align="center">
|
|
7
|
+
<img src="https://github.com/SeyZ/jsonapi-serializer/blob/master/logo.jpg?raw=true" alt="JSONAPI Serializer Logo">
|
|
8
|
+
</p>
|
|
9
|
+
|
|
10
|
+
[](https://travis-ci.org/SeyZ/jsonapi-serializer)
|
|
11
|
+
[](https://yarnpkg.com/en/package/jsonapi-serializer)
|
|
12
|
+
[](https://yarnpkg.com/en/package/jsonapi-serializer)
|
|
13
|
+
|
|
14
|
+
A Node.js framework agnostic library for (de)serializing your data to [JSON
|
|
15
|
+
API](http://jsonapi.org) (1.0 compliant).
|
|
16
|
+
|
|
17
|
+
psst: If you need an off-the-shelf admin panel for your app, check out what I build in my day job at [forestadmin.com](https://www.forestadmin.com) - it uses jsonapi-serializer to de/serialize data data coming from/to the APIs.
|
|
18
|
+
|
|
19
|
+
- [Migrate from 2.0 to 3.0](https://github.com/SeyZ/jsonapi-serializer/wiki/Migrate-from-2.0-to-3.0)
|
|
20
|
+
- [Migrate from 1.x to 2.0](https://github.com/SeyZ/jsonapi-serializer/wiki/Migrate-from-1.x-to-2.0)
|
|
21
|
+
|
|
22
|
+
## Installation
|
|
23
|
+
`$ npm install jsonapi-serializer`
|
|
24
|
+
|
|
25
|
+
## Documentation
|
|
26
|
+
|
|
27
|
+
### Serialization
|
|
28
|
+
|
|
29
|
+
var JSONAPISerializer = require('jsonapi-serializer').Serializer;
|
|
30
|
+
new JSONAPISerializer(type, opts).serialize(data);
|
|
31
|
+
|
|
32
|
+
The function `JSONAPISerializer` takes two arguments:
|
|
33
|
+
|
|
34
|
+
- `type`: The resource type.
|
|
35
|
+
- `opts`: The serialization options.
|
|
36
|
+
|
|
37
|
+
Calling the `serialize` method on the returned object will serialize your `data` (object or array) to a compliant JSONAPI document.
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
#### Available serialization option (`opts` argument)
|
|
41
|
+
|
|
42
|
+
- **attributes**: An array of attributes to show. You can define an attribute as an option if you want to define some relationships (included or not).
|
|
43
|
+
- **ref**: If present, it's considered as a relationships.
|
|
44
|
+
- **included**: Consider the relationships as [compound document](http://jsonapi.org/format/#document-compound-documents). Default: true.
|
|
45
|
+
- **id**: Configurable identifier field for the resource. Default: `id`.
|
|
46
|
+
- **attributes**: An array of attributes to show.
|
|
47
|
+
- **topLevelLinks**: An object that describes the top-level links. Values can be *string* or a *function*
|
|
48
|
+
- **dataLinks**: An object that describes the links inside data. Values can be *string* or a *function* (see examples below)
|
|
49
|
+
- **dataMeta**: An object that describes the meta inside data. Values can be a plain value or a *function* (see examples below)
|
|
50
|
+
- **relationshipLinks**: An object that describes the links inside relationships. Values can be *string* or a *function*
|
|
51
|
+
- **relationshipMeta**: An object that describes the meta inside relationships. Values can be a plain value or a *function*
|
|
52
|
+
- **ignoreRelationshipData**: Do not include the `data` key inside the relationship. Default: false.
|
|
53
|
+
- **keyForAttribute**: A function or string to customize attributes. Functions are passed the attribute as a single argument and expect a string to be returned. Strings are aliases for inbuilt functions for common case conversions. Options include: `dash-case` (default), `lisp-case`, `spinal-case`, `kebab-case`, `underscore_case`, `snake_case`, `camelCase`, `CamelCase`.
|
|
54
|
+
- **nullIfMissing**: Set the attribute to null if missing from your data input. Default: false.
|
|
55
|
+
- **pluralizeType**: A boolean to indicate if the type must be pluralized or not. Default: true.
|
|
56
|
+
- **typeForAttribute**: A function that maps the attribute (passed as an argument) to the type you want to override. If it returns `undefined`, ignores the flag for that attribute. Option *pluralizeType* ignored if set.
|
|
57
|
+
- **meta**: An object to include non-standard meta-information. Values can be a plain value or a *function*
|
|
58
|
+
- **transform**: A function to transform each record before the serialization.
|
|
59
|
+
|
|
60
|
+
**Examples**
|
|
61
|
+
|
|
62
|
+
- [Express example](https://github.com/SeyZ/jsonapi-serializer/tree/master/examples/express)
|
|
63
|
+
- [Simple usage](#simple-usage-serializer)
|
|
64
|
+
- [More examples in tests](https://github.com/SeyZ/jsonapi-serializer/blob/master/test/serializer.js)
|
|
65
|
+
|
|
66
|
+
<a name="simple-usage-serializer"></a>
|
|
67
|
+
Simple usage:
|
|
68
|
+
|
|
69
|
+
```javascript
|
|
70
|
+
var data = [
|
|
71
|
+
{ id: 1, firstName: 'Sandro', lastName: 'Munda' },
|
|
72
|
+
{ id: 2, firstName: 'John', lastName: 'Doe' }
|
|
73
|
+
];
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
```javascript
|
|
77
|
+
var JSONAPISerializer = require('jsonapi-serializer').Serializer;
|
|
78
|
+
|
|
79
|
+
var UserSerializer = new JSONAPISerializer('users', {
|
|
80
|
+
attributes: ['firstName', 'lastName']
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
var users = UserSerializer.serialize(data);
|
|
84
|
+
|
|
85
|
+
// `users` here are JSON API compliant.
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
The result will be something like:
|
|
89
|
+
|
|
90
|
+
```javascript
|
|
91
|
+
{
|
|
92
|
+
"data": [{
|
|
93
|
+
"type": "users",
|
|
94
|
+
"id": "1",
|
|
95
|
+
"attributes": {
|
|
96
|
+
"first-name": "Sandro",
|
|
97
|
+
"last-name": "Munda"
|
|
98
|
+
}
|
|
99
|
+
}, {
|
|
100
|
+
"type": "users",
|
|
101
|
+
"id": "2",
|
|
102
|
+
"attributes": {
|
|
103
|
+
"first-name": "John",
|
|
104
|
+
"last-name": "Doe"
|
|
105
|
+
}
|
|
106
|
+
}]
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Deserialization
|
|
111
|
+
|
|
112
|
+
var JSONAPIDeserializer = require('jsonapi-serializer').Deserializer;
|
|
113
|
+
new JSONAPIDeserializer(opts).deserialize(data);
|
|
114
|
+
|
|
115
|
+
The function `JSONAPIDeserializer` takes one argument:
|
|
116
|
+
|
|
117
|
+
- `opts`: The deserializer options.
|
|
118
|
+
|
|
119
|
+
Calling the `deserialize` method on the returned object will deserialize your `data` (JSONAPI document) to a plain javascript object.
|
|
120
|
+
|
|
121
|
+
#### Available deserialization option (`opts` argument)
|
|
122
|
+
|
|
123
|
+
- **keyForAttribute**: A function or string to customize attributes. Functions are passed the attribute as a single argument and expect a string to be returned. Strings are aliases for inbuilt functions for common case conversions. Options include: `dash-case` (default), `lisp-case`, `spinal-case`, `kebab-case`, `underscore_case`, `snake_case`, `camelCase`, `CamelCase`.
|
|
124
|
+
- **AN\_ATTRIBUTE\_TYPE**: this option name corresponds to the type of a relationship from your JSONAPI document.
|
|
125
|
+
- **valueForRelationship**: A function that returns whatever you want for a relationship (see examples below) ***can return a Promise (see tests)***
|
|
126
|
+
- **transform**: A function to transform each record after the deserialization.
|
|
127
|
+
|
|
128
|
+
**Examples**
|
|
129
|
+
|
|
130
|
+
- [Simple usage](#simple-usage-deserializer)
|
|
131
|
+
- [Relationship](#relationship-deserializer)
|
|
132
|
+
- [More examples in tests](https://github.com/SeyZ/jsonapi-serializer/blob/master/test/deserializer.js)
|
|
133
|
+
|
|
134
|
+
<a name="simple-usage-deserializer"></a>
|
|
135
|
+
Simple usage:
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
{
|
|
139
|
+
data: [{
|
|
140
|
+
type: 'users',
|
|
141
|
+
id: '1',
|
|
142
|
+
attributes: {
|
|
143
|
+
'first-name': Sandro,
|
|
144
|
+
'last-name': Munda
|
|
145
|
+
}
|
|
146
|
+
}, {
|
|
147
|
+
type: 'users',
|
|
148
|
+
id: '2',
|
|
149
|
+
attributes: {
|
|
150
|
+
'first-name': 'John',
|
|
151
|
+
'last-name': 'Doe'
|
|
152
|
+
}
|
|
153
|
+
}]
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
```javascript
|
|
158
|
+
var JSONAPIDeserializer = require('jsonapi-serializer').Deserializer;
|
|
159
|
+
|
|
160
|
+
new JSONAPIDeserializer().deserialize(jsonapi, function (err, users) {
|
|
161
|
+
// `users` is...
|
|
162
|
+
});
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
```javascript
|
|
166
|
+
[
|
|
167
|
+
{ id: 1, firstName: 'Sandro', lastName: 'Munda' },
|
|
168
|
+
{ id: 2, firstName: 'John', lastName: 'Doe' }
|
|
169
|
+
];
|
|
170
|
+
```
|
|
171
|
+
<a name="relationship-deserializer"></a>
|
|
172
|
+
Relationship:
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
{
|
|
176
|
+
data: [{
|
|
177
|
+
type: 'users',
|
|
178
|
+
id: '54735750e16638ba1eee59cb',
|
|
179
|
+
attributes: {
|
|
180
|
+
'first-name': 'Sandro',
|
|
181
|
+
'last-name': 'Munda'
|
|
182
|
+
},
|
|
183
|
+
relationships: {
|
|
184
|
+
address: {
|
|
185
|
+
data: { type: 'addresses', id: '54735722e16620ba1eee36af' }
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}, {
|
|
189
|
+
type: 'users',
|
|
190
|
+
id: '5490143e69e49d0c8f9fc6bc',
|
|
191
|
+
attributes: {
|
|
192
|
+
'first-name': 'Lawrence',
|
|
193
|
+
'last-name': 'Bennett'
|
|
194
|
+
},
|
|
195
|
+
relationships: {
|
|
196
|
+
address: {
|
|
197
|
+
data: { type: 'addresses', id: '54735697e16624ba1eee36bf' }
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}]
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
```javascript
|
|
205
|
+
var JSONAPIDeserializer = require('jsonapi-serializer').Deserializer;
|
|
206
|
+
|
|
207
|
+
new JSONAPIDeserializer({
|
|
208
|
+
addresses: {
|
|
209
|
+
valueForRelationship: function (relationship) {
|
|
210
|
+
return {
|
|
211
|
+
id: relationship.id,
|
|
212
|
+
'address-line1': '406 Madison Court',
|
|
213
|
+
'zip-code': '49426',
|
|
214
|
+
country: 'USA'
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}).deserialize(jsonapi, function (err, users) {
|
|
219
|
+
// `users` is...
|
|
220
|
+
});
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
```
|
|
224
|
+
[{
|
|
225
|
+
id: '54735750e16638ba1eee59cb',
|
|
226
|
+
'first-name': 'Sandro',
|
|
227
|
+
'last-name': 'Munda',
|
|
228
|
+
address: {
|
|
229
|
+
id: '54735722e16620ba1eee36af',
|
|
230
|
+
'address-line1': '406 Madison Court',
|
|
231
|
+
'zip-code': '49426',
|
|
232
|
+
country: 'USA'
|
|
233
|
+
}
|
|
234
|
+
}, {
|
|
235
|
+
id: '5490143e69e49d0c8f9fc6bc',
|
|
236
|
+
'first-name': 'Lawrence',
|
|
237
|
+
'last-name': 'Bennett',
|
|
238
|
+
address: {
|
|
239
|
+
id: '54735697e16624ba1eee36bf',
|
|
240
|
+
'address-line1': '406 Madison Court',
|
|
241
|
+
'zip-code': '49426',
|
|
242
|
+
country: 'USA'
|
|
243
|
+
}
|
|
244
|
+
}]
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
#### Notes on Promises
|
|
248
|
+
The deserialization option `valueForRelationship` supports returning a `Promise` and so this library uses `Promises` under the hood. `bluebird` was previously used as a dependency, but due to bundle size concerns on both node and the web it was replaced with native promises.
|
|
249
|
+
|
|
250
|
+
`bluebird` is definitely [more performant](http://bluebirdjs.com/docs/benchmarks.html) than native Promises. If performance is a major concern `Promise` can be globally polyfilled
|
|
251
|
+
- node - via `global.Promise = require('bluebird')`
|
|
252
|
+
- web - global `Promise` automatically gets assigned when using the [script tag](http://bluebirdjs.com/docs/getting-started.html) to load `bluebird`
|
|
253
|
+
|
|
254
|
+
## Error serialization
|
|
255
|
+
|
|
256
|
+
var JSONAPIError = require('jsonapi-serializer').Error;
|
|
257
|
+
var error = new JSONAPIError(opts);
|
|
258
|
+
|
|
259
|
+
The function JSONAPIError takes one argument:
|
|
260
|
+
|
|
261
|
+
- `opts`: The error options. All options are optional.
|
|
262
|
+
|
|
263
|
+
#### Available error option (`opts` argument)
|
|
264
|
+
|
|
265
|
+
- **id**: a unique identifier for this particular occurrence of the problem.
|
|
266
|
+
- **status**: the HTTP status code applicable to this problem, expressed as a string value.
|
|
267
|
+
- **code**: an application-specific error code, expressed as a string value.
|
|
268
|
+
- **title**: a short, human-readable summary of the problem that SHOULD NOT change from occurrence to occurrence of the problem, except for purposes of localization.
|
|
269
|
+
- **detail**: a human-readable explanation specific to this occurrence of the problem. Like title, this field’s value can be localized.
|
|
270
|
+
- **source**: an object containing references to the source of the error, optionally including any of the following members:
|
|
271
|
+
- **pointer**: a JSON Pointer [RFC6901] to the associated entity in the request document [e.g. "/data" for a primary data object, or "/data/attributes/title" for a specific attribute].
|
|
272
|
+
- **parameter**: a string indicating which URI query parameter caused the error.
|
|
273
|
+
- **links**: a links object containing the following members:
|
|
274
|
+
- **about**: a link that leads to further details about this particular occurrence of the problem.
|
|
275
|
+
- **meta**: a meta object containing non-standard meta-information about the error.
|
|
276
|
+
|
|
277
|
+
**Examples**
|
|
278
|
+
|
|
279
|
+
- [Simple usage](#simple-usage-error)
|
|
280
|
+
- [More example](https://github.com/SeyZ/jsonapi-serializer/blob/master/test/error.js)
|
|
281
|
+
|
|
282
|
+
<a name="simple-usage-error"></a>
|
|
283
|
+
Simple usage:
|
|
284
|
+
|
|
285
|
+
```javascript
|
|
286
|
+
var JSONAPIError = require('jsonapi-serializer').Error;
|
|
287
|
+
|
|
288
|
+
var errors = new JSONAPIError({
|
|
289
|
+
code: '123',
|
|
290
|
+
source: { 'pointer': '/data/attributes/first-name' },
|
|
291
|
+
title: 'Value is too short',
|
|
292
|
+
detail: 'First name must contain at least three characters.'
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
// `errors` here are JSON API compliant.
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
The result will be something like:
|
|
299
|
+
|
|
300
|
+
```javascript
|
|
301
|
+
{
|
|
302
|
+
"errors": [
|
|
303
|
+
{
|
|
304
|
+
"code": "123",
|
|
305
|
+
"source": { "pointer": "/data/attributes/first-name" },
|
|
306
|
+
"title": "Value is too short",
|
|
307
|
+
"detail": "First name must contain at least three characters."
|
|
308
|
+
}
|
|
309
|
+
]
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
# License
|
|
314
|
+
|
|
315
|
+
[MIT](https://github.com/SeyZ/jsonapi-serializer/blob/master/LICENSE)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
10:A config driven NodeJS framework implementing [`json:api`](http://jsonapi.org/) and [`GraphQL`](http://graphql.org/). You define the resources, it provides the api.
|
|
2
|
+
16:A config driven approach to building an API enables:
|
|
3
|
+
24: * Automatic handling of relationships
|
|
4
|
+
27: * What are my resources called
|
|
5
|
+
28: * What properties do my resources have
|
|
6
|
+
29: * For each resource, implement a `handler` for:
|
|
7
|
+
30: * `create`ing a resource
|
|
8
|
+
31: * `delete`ing a resource
|
|
9
|
+
32: * `search`ing for many resources
|
|
10
|
+
33: * `find`ing a specific resource
|
|
11
|
+
34: * `update`ing a specific resource
|
|
12
|
+
36:We've created `handler`s to automatically map our config over to database solutions help people get off the ground:
|
|
13
|
+
51:- [Configuring jsonapi-server](documentation/configuring.md)
|
|
14
|
+
53:- [Defining Resources](documentation/resources.md)
|
|
15
|
+
59:- [Migrating from an existing express server](documentation/api-migration.md)
|
|
16
|
+
64:You can have a complete json:api server providing a `photos` resource with just this:
|
|
17
|
+
74: resource: "photos",
|
|
18
|
+
86:Your new API will be alive at `http://localhost:16006/` and your `photos` resources will be at `http://localhost:16006/photos`. The GraphiQL interface will be available at `http://localhost:16006/`.
|
|
19
|
+
90:Fire up an example `json:api` server using the resources mentioned in the official spec via:
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
[](https://travis-ci.org/holidayextras/jsonapi-server)
|
|
2
|
+
[](https://coveralls.io/github/holidayextras/jsonapi-server?branch=master)
|
|
3
|
+
[](http://badge.fury.io/js/jsonapi-server)
|
|
4
|
+
[](https://david-dm.org/holidayextras/jsonapi-server)
|
|
5
|
+
|
|
6
|
+
# jsonapi-server
|
|
7
|
+
|
|
8
|
+
[](https://greenkeeper.io/)
|
|
9
|
+
|
|
10
|
+
A config driven NodeJS framework implementing [`json:api`](http://jsonapi.org/) and [`GraphQL`](http://graphql.org/). You define the resources, it provides the api.
|
|
11
|
+
|
|
12
|
+
### Motivation / Justification / Rationale
|
|
13
|
+
|
|
14
|
+
This framework solves the challenges of json:api and GraphQL without coupling us to any one ORM solution. Every other module out there is either tightly coupled to a database implementation, tracking an old version of the json:api spec, or is merely a helper library for a small feature. If you're building an API and your use case only involves reading and writing to a data store... well count yourself lucky. For everyone else, this framework provides the flexibility to provide a complex API without being confined to any one technology.
|
|
15
|
+
|
|
16
|
+
A config driven approach to building an API enables:
|
|
17
|
+
* Enforced json:api responses
|
|
18
|
+
* Automatic GraphQL schema generation
|
|
19
|
+
* Request validation
|
|
20
|
+
* Payload validation
|
|
21
|
+
* Automatic documentation generation
|
|
22
|
+
* Automatic inclusions
|
|
23
|
+
* Automatic routing
|
|
24
|
+
* Automatic handling of relationships
|
|
25
|
+
|
|
26
|
+
Ultimately, the only things you as a user of this framework need to care about are:
|
|
27
|
+
* What are my resources called
|
|
28
|
+
* What properties do my resources have
|
|
29
|
+
* For each resource, implement a `handler` for:
|
|
30
|
+
* `create`ing a resource
|
|
31
|
+
* `delete`ing a resource
|
|
32
|
+
* `search`ing for many resources
|
|
33
|
+
* `find`ing a specific resource
|
|
34
|
+
* `update`ing a specific resource
|
|
35
|
+
|
|
36
|
+
We've created `handler`s to automatically map our config over to database solutions help people get off the ground:
|
|
37
|
+
* [jsonapi-store-memoryhandler](https://github.com/holidayextras/jsonapi-server/blob/master/lib/MemoryHandler.js) - an in-memory data store to enable rapid prototyping. This ships as a part of `jsonapi-server` and powers the core test suite.
|
|
38
|
+
* [jsonapi-handler-chain](https://github.com/holidayextras/jsonapi-server/blob/master/lib/ChainHandler.js) - a handler to chain custom behaviour around an existing handler. This ships as a part of `jsonapi-server`. More info can be found [here](https://github.com/holidayextras/jsonapi-server/blob/master/documentation/chain-handler.md)
|
|
39
|
+
* [jsonapi-store-relationaldb](https://github.com/holidayextras/jsonapi-store-relationaldb) - using `sequelize` to support PostgreSQL, MySQL, MSSQL, MariaDB and SQLite.
|
|
40
|
+
* [jsonapi-store-mongodb](https://github.com/holidayextras/jsonapi-store-mongodb) - for MongoDB.
|
|
41
|
+
* [jsonapi-store-elasticsearch](https://github.com/holidayextras/jsonapi-store-elasticsearch) - for Elasticsearch.
|
|
42
|
+
* [jsonapi-store-dynamodb](https://github.com/holidayextras/jsonapi-server/compare/dynamodb?expand=1) - *!SIGNIFICANT WIP!* for AWS DynamoDB.
|
|
43
|
+
|
|
44
|
+
We've also written a library to ease the consumption of a json:api compliant service, if GraphQL isn't your thing:
|
|
45
|
+
* [jsonapi-client](https://github.com/holidayextras/jsonapi-client) - for NodeJS and Browsers
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
### Full documentation
|
|
49
|
+
|
|
50
|
+
- [Suggested Project Structure](documentation/suggested-project-structure.md)
|
|
51
|
+
- [Configuring jsonapi-server](documentation/configuring.md)
|
|
52
|
+
- [Automatic Swagger Generation](documentation/swagger.md)
|
|
53
|
+
- [Defining Resources](documentation/resources.md)
|
|
54
|
+
- [Debugging](documentation/debugging.md)
|
|
55
|
+
- [Foreign Key Relations](documentation/foreign-relations.md)
|
|
56
|
+
- [Chaining handlers together](documentation/chain-handler.md)
|
|
57
|
+
- [Custom Handlers](documentation/handlers.md)
|
|
58
|
+
- [Post Processing Examples](documentation/post-processing.md)
|
|
59
|
+
- [Migrating from an existing express server](documentation/api-migration.md)
|
|
60
|
+
- [Application metrics](documentation/metrics.md)
|
|
61
|
+
|
|
62
|
+
### The tl;dr
|
|
63
|
+
|
|
64
|
+
You can have a complete json:api server providing a `photos` resource with just this:
|
|
65
|
+
```javascript
|
|
66
|
+
var jsonApi = require("jsonapi-server");
|
|
67
|
+
|
|
68
|
+
jsonApi.setConfig({
|
|
69
|
+
port: 16006,
|
|
70
|
+
graphiql: true
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
jsonApi.define({
|
|
74
|
+
resource: "photos",
|
|
75
|
+
handlers: new jsonApi.MemoryHandler(),
|
|
76
|
+
attributes: {
|
|
77
|
+
title: jsonApi.Joi.string(),
|
|
78
|
+
url: jsonApi.Joi.string().uri(),
|
|
79
|
+
height: jsonApi.Joi.number().min(1).max(10000).precision(0),
|
|
80
|
+
width: jsonApi.Joi.number().min(1).max(10000).precision(0)
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
jsonApi.start();
|
|
85
|
+
```
|
|
86
|
+
Your new API will be alive at `http://localhost:16006/` and your `photos` resources will be at `http://localhost:16006/photos`. The GraphiQL interface will be available at `http://localhost:16006/`.
|
|
87
|
+
|
|
88
|
+
### Show me a full example!
|
|
89
|
+
|
|
90
|
+
Fire up an example `json:api` server using the resources mentioned in the official spec via:
|
|
91
|
+
```
|
|
92
|
+
$ git clone https://github.com/holidayextras/jsonapi-server.git
|
|
93
|
+
$ npm install
|
|
94
|
+
$ npm start
|
|
95
|
+
```
|
|
96
|
+
then browse to the JSON:API endpoints:
|
|
97
|
+
```
|
|
98
|
+
http://localhost:16006/rest/photos
|
|
99
|
+
```
|
|
100
|
+
or, for GraphQL:
|
|
101
|
+
```
|
|
102
|
+
http://localhost:16006/rest/
|
|
103
|
+
```
|
|
104
|
+
the example implementation can be found [here](example)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# NESTJS JSON API
|
|
2
|
+
|
|
3
|
+
A library to easily implement a JSON API in your NestJs application.
|
|
4
|
+
|
|
5
|
+
This library contains a set of decorators and a service to make everything easier.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
npm install nestjs-json-api
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Or
|
|
14
|
+
```
|
|
15
|
+
yarn add nestjs-json-api
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
First, import the `JsonApiModule` in your root module. You'll have to setup the database connection independently.
|
|
21
|
+
|
|
22
|
+
Example with Mongoose:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
@Module({
|
|
26
|
+
...
|
|
27
|
+
imports: [
|
|
28
|
+
MongooseModule.forRoot('mongodb://localhost:27017/dbname'),
|
|
29
|
+
JsonApiModule.forRoot({
|
|
30
|
+
adapter: JsonApiMongooseAdapter,
|
|
31
|
+
}),
|
|
32
|
+
],
|
|
33
|
+
...
|
|
34
|
+
})
|
|
35
|
+
export class AppModule {}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Now you can use the decorators. The recommended way is to use the method decorators
|
|
39
|
+
|
|
40
|
+
Example with a user controller:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
@Controller('user')
|
|
44
|
+
class UserController {
|
|
45
|
+
@Get(':id')
|
|
46
|
+
@JsonApiFindById('UserModel')
|
|
47
|
+
findById(@JsonApiDoc doc: JsonApiTopLevelObject<User>) {
|
|
48
|
+
// Do stuff with the doc
|
|
49
|
+
return doc;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
@Get()
|
|
53
|
+
@JsonApiFind('UserModel')
|
|
54
|
+
find(@JsonApiDoc doc: JsonApiTopLevelObject<User[]>) {
|
|
55
|
+
// Do stuff with the doc
|
|
56
|
+
return doc;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@Post()
|
|
60
|
+
@JsonApiCreate('UserModel')
|
|
61
|
+
create(@JsonApiDoc doc: JsonApiTopLevelObject<User>) {
|
|
62
|
+
// Do stuff with the doc
|
|
63
|
+
return doc;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
@Patch(':id')
|
|
67
|
+
@JsonApiUpdate('UserModel')
|
|
68
|
+
update(@JsonApiDoc doc: JsonApiTopLevelObject<User>) {
|
|
69
|
+
// Do stuff with the doc
|
|
70
|
+
return doc;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@Delete(idParamKey)
|
|
74
|
+
@JsonApiDelete('UserModel')
|
|
75
|
+
delete() {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
If you want to quickly get it working, you can use the `JsonApiController` decorator on your controller. The downside is that you won't have control over the endpoints.
|
|
82
|
+
|
|
83
|
+
Example:
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
@Controller('categories')
|
|
87
|
+
@JsonApiController('CategoryModel')
|
|
88
|
+
export class CategoriesController {}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
## TODO
|
|
93
|
+
|
|
94
|
+
* Improve docs
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
2: <a href="https://www.npmjs.com/package/json-api-nestjs" target="_blank"><img src="https://img.shields.io/npm/v/json-api-nestjs.svg" alt="NPM Version" /></a>
|
|
2
|
+
3: <a href="https://www.npmjs.com/package/json-api-nestjs" target="_blank"><img src="https://img.shields.io/npm/l/json-api-nestjs.svg" alt="Package License" /></a>
|
|
3
|
+
4: <a href="https://www.npmjs.com/package/json-api-nestjs" target="_blank"><img src="https://img.shields.io/npm/dm/json-api-nestjs.svg" alt="NPM Downloads" /></a>
|
|
4
|
+
6: <img src="https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/klerick/02a4c98cf7008fea2af70dc2d50f4cb7/raw/json-api-nestjs.json" alt="Coverage Badge" />
|
|
5
|
+
9:# json-api-nestjs
|
|
6
|
+
11:This plugin works upon **TypeOrm** or **MicroOrm** library, which is used as the main database abstraction layer tool. The module
|
|
7
|
+
13:supports features such as requests validation based on database fields types, request filtering, endpoints extending,
|
|
8
|
+
14:data relations control and much more. Our module significantly reduces the development time of REST services by removing
|
|
9
|
+
21:$ npm install @yaser2us/json-api-nestjs
|
|
10
|
+
29:import {Module} from '@nestjs/common';
|
|
11
|
+
30:import {JsonApiModule} from '@yaser2us/json-api-nestjs';
|
|
12
|
+
31:import {TypeOrmJsonApiModule} from '@yaser2us/json-api-nestjs-typeorm';
|
|
13
|
+
47:import {Module} from '@nestjs/common';
|
|
14
|
+
48:import {JsonApiModule} from '@yaser2us/json-api-nestjs';
|
|
15
|
+
49:import {MicroOrmJsonApiModule} from '@yaser2us/json-api-nestjs-microorm';
|
|
16
|
+
70:- GET /users/{id}/relationships/{relName}
|
|
17
|
+
71:- POST /users/{id}/relationships/{relName}
|
|
18
|
+
72:- PATCH /users/{id}/relationships/{relName}
|
|
19
|
+
73:- DELETE /users/{id}/relationships/{relName}
|
|
20
|
+
85: imports?: NestImport[]; // List of addition module for useing in custom controller
|
|
21
|
+
88: debug?: boolean; // Debug info in result object, like error message
|
|
22
|
+
90: operationUrl?: string // Url for atomic operation https://jsonapi.org/ext/atomic/
|
|
23
|
+
99:import {Get, Param, Inject, BadRequestException} from '@nestjs/common';
|
|
24
|
+
109:} from '@yaser2us/json-api-nestjs';
|
|
25
|
+
112:} from '@yaser2us/json-api-nestjs-shared';
|
|
26
|
+
146:You can overwrite the default config for the current controller using options in the decorator **JsonAPi**.
|
|
27
|
+
153:import { Query } from '@nestjs/common';
|
|
28
|
+
161:} from 'json-api-nestjs';
|
|
29
|
+
181:import { ArgumentMetadata, PipeTransform } from '@nestjs/common';
|
|
30
|
+
183:import { Query } from 'json-api-nestjs';
|
|
31
|
+
195:For using swagger, you should only add [@nestjs/swagger](https://docs.nestjs.com/openapi/introduction) and configure it
|
|
32
|
+
227:- **include** - you can extend result with relations (aka join)
|
|
33
|
+
229: GET /users?include=roles
|
|
34
|
+
242:- **sort** - you can sort result of the request
|
|
35
|
+
245: GET /users?sort=target.name,-roles.key
|
|
36
|
+
249: So, result of the request will be sorted by field *name* of **Users** by *ASC* and field *key* of **Roles** entity
|
|
37
|
+
251:- **page** - pagination for you request
|
|
38
|
+
256:- **filter** - filter for query
|
|
39
|
+
259: GET /users?filter[name][eq]=1&filter[roles.name][ne]=test&filter[roles.status][eq]=true
|
|
40
|
+
263: The "eq", "ne" is *[Filter operand](#filter-operand)*
|
|
41
|
+
293:- **include** - you can extend result with relations (aka join)
|
|
42
|
+
295: GET /users?include=roles
|
|
43
|
+
329: "relationships": {
|
|
44
|
+
359: "relationships": {
|
|
45
|
+
375:You can more information find [here](https://jsonapi.org/ext/atomic/)
|
|
46
|
+
382:but [Atomic operation](https://jsonapi.org/ext/atomic/) allow for one request.
|
|
47
|
+
411: "relationships":{
|