1- // TODO: Add delimiter option
2-
31// TODO: prevent reserved field names ?
42
53// TODO: Add date type
@@ -33,22 +31,22 @@ class Model {
3331
3432 parse ( input , omit = [ ] ) {
3533 // Load the schema
36- let { schema, linked } = this . Model
34+ let { schema, linked, delimiter } = this . Model
3735
3836 // Assume standard response from DynamoDB
3937 let data = input . Item || input . Items || input
4038
4139 if ( Array . isArray ( data ) ) {
42- return data . map ( item => formatItem ( schema , linked , item , omit ) )
40+ return data . map ( item => formatItem ( schema , linked , item , omit , delimiter ) )
4341 } else {
44- return formatItem ( schema , linked , data , omit )
42+ return formatItem ( schema , linked , data , omit , delimiter )
4543 }
4644 }
4745
4846 get ( item = { } , params = { } ) {
4947 // Extract schema and merge defaults
50- let { schema, defaults, linked, partitionKey, sortKey, table } = this . Model
51- let data = normalizeData ( schema , linked , Object . assign ( { } , defaults , item ) , true )
48+ let { schema, defaults, linked, partitionKey, sortKey, table, delimiter } = this . Model
49+ let data = normalizeData ( schema , linked , Object . assign ( { } , defaults , item ) , delimiter , true )
5250
5351 return Object . assign (
5452 {
@@ -92,10 +90,10 @@ class Model {
9290 // error(`ConditionExpression must be a string`)
9391
9492 // Extract schema and defaults
95- let { schema, defaults, required, linked, partitionKey, sortKey, table } = this . Model
93+ let { schema, defaults, required, linked, partitionKey, sortKey, table, delimiter } = this . Model
9694
9795 // Merge defaults
98- let data = normalizeData ( schema , linked , Object . assign ( { } , defaults , item ) )
96+ let data = normalizeData ( schema , linked , Object . assign ( { } , defaults , item ) , delimiter )
9997
10098 // Check for required fields
10199 Object . keys ( required ) . forEach ( field =>
@@ -265,10 +263,10 @@ class Model {
265263
266264 put ( item = { } , params = { } ) {
267265 // Extract schema and defaults
268- let { schema, defaults, required, linked, partitionKey, sortKey, table } = this . Model
266+ let { schema, defaults, required, linked, partitionKey, sortKey, table, delimiter } = this . Model
269267
270268 // Merge defaults
271- let data = normalizeData ( schema , linked , Object . assign ( { } , defaults , item ) )
269+ let data = normalizeData ( schema , linked , Object . assign ( { } , defaults , item ) , delimiter )
272270
273271 // Check for required fields
274272 Object . keys ( required ) . forEach ( field =>
@@ -338,6 +336,11 @@ const parseModel = (name,model) => {
338336 let schema = typeof model . schema === 'object' && ! Array . isArray ( model . schema ) ?
339337 model . schema : error ( `Please provide a valid 'schema'` )
340338
339+ let delimiter = '#'
340+ if ( typeof model . delimiter === 'string' && model . delimiter . trim ( ) . length > 0 ) {
341+ delimiter = model . delimiter . trim ( )
342+ } else if ( model . delimiter ) error ( `'delimiter' must be string value with length >= 1` )
343+
341344 // Add model_field
342345 if ( model_field ) {
343346 schema [ model_field ] = { type : 'string' , default : model_name , hidden : true }
@@ -362,6 +365,7 @@ const parseModel = (name,model) => {
362365 table,
363366 partitionKey,
364367 sortKey,
368+ delimiter,
365369 schema : Object . keys ( schema ) . reduce ( ( acc , field ) => {
366370 if ( typeof schema [ field ] === 'string' ) {
367371 return validTypes . includes ( schema [ field ] ) ?
@@ -551,14 +555,14 @@ const getKey = (data,schema,partitionKey,sortKey) => {
551555
552556
553557// Format item based on schema
554- const formatItem = ( schema , linked , item , omit ) => {
558+ const formatItem = ( schema , linked , item , omit , delimiter ) => {
555559 return Object . keys ( item ) . reduce ( ( acc , field ) => {
556560
557561 if ( linked [ field ] ) {
558562 Object . assign ( acc , linked [ field ] . reduce ( ( acc , f , i ) => {
559563 if ( schema [ f ] . save || schema [ f ] . hidden || omit . includes ( f ) ) return acc
560564 return Object . assign ( acc , {
561- [ schema [ f ] . alias || f ] : validateType ( schema [ f ] , f , item [ field ] . split ( '#' ) [ i ] )
565+ [ schema [ f ] . alias || f ] : validateType ( schema [ f ] , f , item [ field ] . split ( delimiter ) [ i ] )
562566 } )
563567 } , { } ) )
564568 }
@@ -571,7 +575,7 @@ const formatItem = (schema,linked,item,omit) => {
571575}
572576
573577
574- const normalizeData = ( schema , linked , data , filter = false ) => {
578+ const normalizeData = ( schema , linked , data , delimiter , filter = false ) => {
575579 let _data = Object . keys ( data ) . reduce ( ( acc , field ) => {
576580 return Object . assign ( acc ,
577581 schema [ field ] ? { [ schema [ field ] . mapped || field ] : data [ field ] }
@@ -592,7 +596,7 @@ const normalizeData = (schema,linked,data,filter=false) => {
592596 // error(`${linked[field].join(', ')} are all required for composite key`)
593597 // } else
594598 if ( values . length === linked [ field ] . length ) {
595- return Object . assign ( acc , { [ field ] : values . join ( '#' ) } )
599+ return Object . assign ( acc , { [ field ] : values . join ( delimiter ) } )
596600 } else {
597601 return acc
598602 }
0 commit comments