diff --git a/src/metadata/index.js b/src/metadata/index.js index 974922c..aa5106d 100644 --- a/src/metadata/index.js +++ b/src/metadata/index.js @@ -1,6 +1,8 @@ export * from './constants.js'; +import isMetadata from './is-metadata.js'; import normaliseName from './normalise-name.js'; export { + isMetadata, normaliseName, }; diff --git a/src/metadata/is-metadata.js b/src/metadata/is-metadata.js new file mode 100644 index 0000000..c78da10 --- /dev/null +++ b/src/metadata/is-metadata.js @@ -0,0 +1,12 @@ +const METADATA_START = '['; + +/** + * Checks whether a field path targets metadata (ie. starts with `[`). + * Attention: This does not guarantee the metadata itself exists. + * + * @param {string} path - Field path to check + * @returns {boolean} True when field path follows metadata format + */ +const isMetadata = (path) => path[0] === METADATA_START; + +export default isMetadata; diff --git a/src/metadata/is-metadata.test.js b/src/metadata/is-metadata.test.js new file mode 100644 index 0000000..f3c8e36 --- /dev/null +++ b/src/metadata/is-metadata.test.js @@ -0,0 +1,57 @@ +import isMetadata from './is-metadata.js'; + +test.each([ + // Current + '[workspace]', + '[type]', + '[id]', + '[title]', + '[state]', + '[classification]', + '[createdAt]', + '[lastModifiedAt]', + + // Legacy + '[organisation]', + '[jurisdiction]', + '[case_type]', + '[reference]', + '[case_reference]', + '[security_classification]', + '[created]', + '[created_date]', + '[modified]', + '[last_modified]', + '[last_modified_date]', +])('should be recognised as metadata when name between brackets: %s', (actual) => { + expect(isMetadata(actual)).toBeTruthy(); +}); + +test.each([ + 'workspace', + 'type', + 'id', + 'title', + 'state', + 'classification', + 'createdAt', + 'lastModifiedAt', + 'organisation', + 'jurisdiction', + 'case_type', + 'reference', + 'case_reference', + 'security_classification', + 'created', + 'created_date', + 'modified', + 'last_modified', + 'last_modified_date', + 'randomField', + 'randomPath.to.field', + 'collection[123]', + 'collection[id:item-1]', + 'collection[123].value.member', +])('should not be recognised as metadata when name not between brackets: %s', (actual) => { + expect(isMetadata(actual)).toBeFalsy(); +}); diff --git a/src/metadata/normalise-name.js b/src/metadata/normalise-name.js index af37704..3c56334 100644 --- a/src/metadata/normalise-name.js +++ b/src/metadata/normalise-name.js @@ -29,10 +29,13 @@ const normaliseName = (metadataName) => { case 'security_classification': // Legacy return NAMES.CLASSIFICATION; case 'createdat': + case 'created': // Legacy case 'created_date': // Legacy return NAMES.CREATED_AT; case 'lastmodifiedat': + case 'modified': // Legacy case 'last_modified': // Legacy + case 'last_modified_date': // Legacy return NAMES.LAST_MODIFIED_AT; default: return; diff --git a/src/metadata/normalise-name.test.js b/src/metadata/normalise-name.test.js index ccf0189..4eb42a0 100644 --- a/src/metadata/normalise-name.test.js +++ b/src/metadata/normalise-name.test.js @@ -87,6 +87,7 @@ describe('createdAt', () => { test.each([ ['identity', NAMES.CREATED_AT, NAMES.CREATED_AT], ['case insensitive', '[CREATEDat]', NAMES.CREATED_AT], + ['legacy', '[created]', NAMES.CREATED_AT], ['legacy', '[created_date]', NAMES.CREATED_AT], ['no brackets', 'createdAt', NAMES.CREATED_AT], ['no brackets + case insensitive', 'CREATEDat', NAMES.CREATED_AT], @@ -100,7 +101,9 @@ describe('lastModifiedAt', () => { test.each([ ['identity', NAMES.LAST_MODIFIED_AT, NAMES.LAST_MODIFIED_AT], ['case insensitive', '[lastMODIFIEDat]', NAMES.LAST_MODIFIED_AT], + ['legacy', '[modified]', NAMES.LAST_MODIFIED_AT], ['legacy', '[last_modified]', NAMES.LAST_MODIFIED_AT], + ['legacy', '[last_modified_date]', NAMES.LAST_MODIFIED_AT], ['no brackets', 'lastModifiedAt', NAMES.LAST_MODIFIED_AT], ['no brackets + case insensitive', 'lastMODIFIEDat', NAMES.LAST_MODIFIED_AT], ['no brackets + legacy', 'last_modified', NAMES.LAST_MODIFIED_AT], diff --git a/src/record/extract-value.js b/src/record/extract-value.js index 4710b80..9b52d35 100644 --- a/src/record/extract-value.js +++ b/src/record/extract-value.js @@ -1,7 +1,7 @@ +import {isMetadata} from '../metadata/index.js'; import * as Metadata from '../metadata/index.js'; import comboExtractor from '../path/combo-extractor.js'; -const METADATA_START = '['; const COLLECTION_ITEM_PATTERN = /^(?[^[\]]+)(?:\[(?:(?\d+)|id:(?[^[\]]+))\])?$/; /** @@ -17,7 +17,7 @@ const COLLECTION_ITEM_PATTERN = /^(?[^[\]]+)(?:\[(?:(?\d+)|id:(? const extractValue = (record) => comboExtractor(valueExtractor(record)) const valueExtractor = (record) => (path) => { - if (path[0] === METADATA_START) { + if (isMetadata(path)) { return metadataExtractor(record)(path); }