From 2b9969ae068a0e49f7e7de11613c90da20d80b4d Mon Sep 17 00:00:00 2001 From: thedumbterminal Date: Mon, 13 Aug 2018 21:52:41 +0100 Subject: [PATCH] supporting nullable types using anyof syntax --- CHANGELOG.md | 4 ++++ package.json | 2 +- src/merger.js | 9 +++++++++ test/samples/anyOfMultipleTypes/expected.json | 11 ++++++++++ test/samples/anyOfMultipleTypes/input.json | 20 +++++++++++++++++++ 5 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 test/samples/anyOfMultipleTypes/expected.json create mode 100644 test/samples/anyOfMultipleTypes/input.json diff --git a/CHANGELOG.md b/CHANGELOG.md index c6b5ad7..284fd1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## v0.0.7 (13/08/2018) + +* Support fields with nullable types using `anyOf` method. + ## v0.0.6 (11/08/2018) * Supports `allOf`, `anyOf` and `oneOf` combined schemas. diff --git a/package.json b/package.json index 68a6c46..e164336 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jsonschema-bigquery", - "version": "0.0.6", + "version": "0.0.7", "description": "Convert JSON schema to Google BigQuery schema", "main": "src/index.js", "scripts": { diff --git a/src/merger.js b/src/merger.js index a5c0555..25ba7b9 100644 --- a/src/merger.js +++ b/src/merger.js @@ -24,6 +24,15 @@ merger._mergeItem = (dst, src) => { return merger._mergeItem(dst[entry[0]], entry[1]) } + //Convert type to an array if needed + if(entry[0] === 'type'){ + const types = new Set([dst[entry[0]], entry[1]]) + if(types.size > 1){ + dst[entry[0]] = Array.from(types) + } + return + } + throw new Error(`Incompatible field: ${entry[0]}`) }) return dst diff --git a/test/samples/anyOfMultipleTypes/expected.json b/test/samples/anyOfMultipleTypes/expected.json new file mode 100644 index 0000000..5627969 --- /dev/null +++ b/test/samples/anyOfMultipleTypes/expected.json @@ -0,0 +1,11 @@ +{ + "schema": { + "fields": [ + { + "name": "first_name", + "type": "STRING", + "mode": "NULLABLE" + } + ] + } +} diff --git a/test/samples/anyOfMultipleTypes/input.json b/test/samples/anyOfMultipleTypes/input.json new file mode 100644 index 0000000..d333f29 --- /dev/null +++ b/test/samples/anyOfMultipleTypes/input.json @@ -0,0 +1,20 @@ +{ + "id": "http://yourdomain.com/schemas/myschema.json", + "description": "Example description", + "type": "object", + "properties": { + "first_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "first_name" + ] +}