Skip to content

Commit

Permalink
fix(client): raw dates
Browse files Browse the repository at this point in the history
  • Loading branch information
timsuchanek committed Jun 22, 2020
1 parent afbb37f commit fd989ce
Show file tree
Hide file tree
Showing 3 changed files with 118 additions and 6 deletions.
72 changes: 72 additions & 0 deletions src/packages/client/src/__tests__/serializeRawParameters.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import { replaceDates } from '../runtime/utils/serializeRawParameters'

test('serializeRawParemeters object', () => {
const data = {
date: new Date('2020-06-22T17:07:16.348Z'),
}

expect(replaceDates(data)).toMatchInlineSnapshot(`
Object {
"date": Object {
"prisma__type": "date",
"prisma__value": "2020-06-22T17:07:16.348Z",
},
}
`)
})

test('serializeRawParemeters array', () => {
const data = {
date: [new Date('2020-06-22T17:07:16.348Z')],
}

expect(replaceDates(data)).toMatchInlineSnapshot(`
Object {
"date": Array [
Object {
"prisma__type": "date",
"prisma__value": "2020-06-22T17:07:16.348Z",
},
],
}
`)
})

test('serializeRawParemeters scalar', () => {
const data = new Date('2020-06-22T17:07:16.348Z')

expect(replaceDates(data)).toMatchInlineSnapshot(`
Object {
"prisma__type": "date",
"prisma__value": "2020-06-22T17:07:16.348Z",
}
`)
})

test('serializeRawParemeters nested', () => {
const data = {
deep: {
date: [
new Date('2020-06-22T17:07:16.348Z'),
new Date('2020-06-22T17:07:16.348Z'),
],
},
}

expect(replaceDates(data)).toMatchInlineSnapshot(`
Object {
"deep": Object {
"date": Array [
Object {
"prisma__type": "date",
"prisma__value": "2020-06-22T17:07:16.348Z",
},
Object {
"prisma__type": "date",
"prisma__value": "2020-06-22T17:07:16.348Z",
},
],
},
}
`)
})
13 changes: 7 additions & 6 deletions src/packages/client/src/runtime/getPrismaClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import { printJsonWithErrors } from './utils/printJsonErrors'
import { InternalDatasource } from './utils/printDatasources'
import { omit } from './utils/omit'
import { mapExperimentalFeatures } from '@prisma/sdk/dist/utils/mapExperimentalFeatures'
import { serializeRawParameters } from './utils/serializeRawParameters'

export type ErrorFormat = 'pretty' | 'colorless' | 'minimal'

Expand Down Expand Up @@ -373,23 +374,23 @@ export function getPrismaClient(config: GetPrismaClientOptions): any {
)
query = queryInstance[sqlOutput]
parameters = {
values: JSON.stringify(queryInstance.values),
values: serializeRawParameters(queryInstance.values),
__prismaRawParamaters__: true,
}
} else if ('string' === typeof stringOrTemplateStringsArray) {
// Called with prisma.raw(string) or prisma.raw(string, values)
query = stringOrTemplateStringsArray
if (values.length) {
parameters = {
values: JSON.stringify(values),
values: serializeRawParameters(values),
__prismaRawParamaters__: true,
}
}
} else {
// called with prisma.raw(sql\`\`)
query = stringOrTemplateStringsArray[sqlOutput]
parameters = {
values: JSON.stringify(stringOrTemplateStringsArray.values),
values: serializeRawParameters(stringOrTemplateStringsArray.values),
__prismaRawParamaters__: true,
}
}
Expand Down Expand Up @@ -446,23 +447,23 @@ export function getPrismaClient(config: GetPrismaClientOptions): any {
)
query = queryInstance[sqlOutput]
parameters = {
values: JSON.stringify(queryInstance.values),
values: serializeRawParameters(queryInstance.values),
__prismaRawParamaters__: true,
}
} else if ('string' === typeof stringOrTemplateStringsArray) {
// Called with prisma.raw(string) or prisma.raw(string, values)
query = stringOrTemplateStringsArray
if (values.length) {
parameters = {
values: JSON.stringify(values),
values: serializeRawParameters(values),
__prismaRawParamaters__: true,
}
}
} else {
// called with prisma.raw(sql\`\`)
query = stringOrTemplateStringsArray[sqlOutput]
parameters = {
values: JSON.stringify(stringOrTemplateStringsArray.values),
values: serializeRawParameters(stringOrTemplateStringsArray.values),
__prismaRawParamaters__: true,
}
}
Expand Down
39 changes: 39 additions & 0 deletions src/packages/client/src/runtime/utils/serializeRawParameters.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
export function serializeRawParameters(data: any): string {
return JSON.stringify(replaceDates(data))
}

/**
* Replaces Date as needed in https://github.com/prisma/prisma-engines/pull/835
* @param data parameters
*/
export function replaceDates(data: any): any {
const type = Object.prototype.toString.call(data)

if (type === '[object Date]') {
return {
prisma__type: 'date',
prisma__value: data.toJSON(),
}
}

if (type === '[object Object]') {
const tmp = {}
for (let key in data) {
if (key !== '__proto__') {
tmp[key] = replaceDates(data[key])
}
}
return tmp
}

if (type === '[object Array]') {
let k = data.length
let tmp
for (tmp = new Array(k); k--; ) {
tmp[k] = replaceDates(data[k])
}
return tmp
}

return data
}

0 comments on commit fd989ce

Please sign in to comment.