Skip to content

Commit 9a47f66

Browse files
authored
Merge pull request #17 from siaeyy/15-object-problem-sirutilsseql
Ejson implementation and object transformation (Issue #15)
2 parents 5f22109 + 9d85cbb commit 9a47f66

File tree

7 files changed

+38
-12
lines changed

7 files changed

+38
-12
lines changed

.github/workflows/ci.yml

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
name: "Pipeline"
2-
32
on:
43
push:
54
pull_request:
65
workflow_dispatch:
7-
86
jobs:
97
ci:
108
name: "CI"
@@ -22,4 +20,4 @@ jobs:
2220
if: success() || failure()
2321
with:
2422
access-token: ${{ secrets.GITHUB_TOKEN }}
25-
matrix: ${{ toJSON(matrix) }}
23+
matrix: ${{ toJSON(matrix) }}

.github/workflows/docs.yml

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ on:
55
permissions:
66
id-token: write
77
contents: read
8-
98
jobs:
109
ci:
1110
name: "Docs CD"
@@ -29,4 +28,4 @@ jobs:
2928
with:
3029
project: sirutils
3130
entrypoint: server/index.ts
32-
root: apps/docs/.output
31+
root: apps/docs/.output

packages/driver-scylla/src/utils/plugin.ts

+15-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import pkg from '../../package.json'
22

33
import { createPlugin, getCircularReplacer, group } from '@sirutils/core'
4-
import { isRawObject, traverse } from '@sirutils/safe-toolbox'
4+
import { isRawObject, traverse, safeEjsonParse, safeEjsonStringify } from '@sirutils/safe-toolbox'
55
import { createAdapter } from '@sirutils/seql'
66
import { Client, types } from 'cassandra-driver'
77

@@ -40,19 +40,30 @@ export const createScyllaDriver = createPlugin<
4040
parameterPattern: () => '?',
4141
transformData: <T>(data: T) => {
4242
if (isRawObject(data)) {
43-
return data as T
44-
}
43+
const ejsonStr = safeEjsonStringify(data)
4544

45+
// Transform raw object to string if it can be
46+
if(ejsonStr.isOk()) {
47+
return ejsonStr.value as T
48+
}
49+
}
4650
return data
4751
},
4852
transformResponse: <T>(data: T) => {
4953
// biome-ignore lint/complexity/noForEach: <explanation>
5054
traverse(data).forEach(function (value) {
5155
if (value instanceof types.Integer) {
5256
this.update(+value)
57+
}else if (typeof value === "string") {
58+
// If field value's type is string and it's format is matched with ejson,
59+
// transform to object
60+
const ejsonData = safeEjsonParse(value)
61+
62+
if (ejsonData.isOk()) {
63+
this.update(ejsonData.value)
64+
}
5365
}
5466
})
55-
5667
return data
5768
},
5869
}),

packages/safe-toolbox/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
{
22
"name": "@sirutils/safe-toolbox",
33
"version": "0.1.1",
4-
54
"type": "module",
65
"files": ["dist"],
76
"exports": {
@@ -10,16 +9,17 @@
109
"types": "./dist/index.d.ts"
1110
}
1211
},
13-
1412
"devDependencies": {
1513
"@sirutils/builder": "workspace:*",
1614
"@types/deepmerge": "^2.2.0",
1715
"@types/traverse": "^0.6.37"
1816
},
1917
"dependencies": {
2018
"@sirutils/core": "workspace:*",
19+
"@types/ejson": "^2.2.2",
2120
"dayjs": "^1.11.13",
2221
"deepmerge": "^4.3.1",
22+
"ejson": "^2.2.3",
2323
"evt": "^2.5.7",
2424
"traverse": "^0.6.9",
2525
"ulidx": "^2.4.1"

packages/safe-toolbox/src/index.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export * from './utils/types'
77
export * from './utils/merge'
88
export * from './utils/proxy'
99
export * from './utils/json'
10+
export * from './utils/ejson'
1011

1112
export * from './tag'
1213

@@ -25,9 +26,11 @@ import utc from 'dayjs/plugin/utc'
2526
import deepmerge from 'deepmerge'
2627
// biome-ignore lint/nursery/noExportedImports: Redundant
2728
import traverse from 'traverse'
29+
// biome-ignore lint/nursery/noExportedImports: Redundant
30+
import ejson from "ejson";
2831

2932
dayjs.extend(duration)
3033
dayjs.extend(customParseFormat)
3134
dayjs.extend(utc)
3235

33-
export { dayjs, customParseFormat, duration, utc, deepmerge, traverse }
36+
export { dayjs, customParseFormat, duration, utc, deepmerge, traverse, ejson }

packages/safe-toolbox/src/tag.ts

+3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ export const safeToolboxTags = {
1111
toUrl: createTag('to-url'),
1212
safeJsonParse: createTag('safe-json-parse'),
1313
safeJsonStringify: createTag('safe-json-stringify'),
14+
15+
safeEjsonParse: createTag('safe-ejson-parse'),
16+
safeEjsonStringify: createTag('safe-ejson-stringify'),
1417

1518
// utils/object-like
1619
extractKeys: createTag('extract-keys'),
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { ProjectError, Result } from '@sirutils/core'
2+
import { safeToolboxTags } from '../tag'
3+
4+
import EJSON from "ejson";
5+
6+
export const safeEjsonParse = Result.fromThrowable(EJSON.parse, e =>
7+
ProjectError.create(safeToolboxTags.safeEjsonParse, `${e}`)
8+
)
9+
10+
export const safeEjsonStringify = Result.fromThrowable(EJSON.stringify, e =>
11+
ProjectError.create(safeToolboxTags.safeEjsonStringify, `${e}`)
12+
)

0 commit comments

Comments
 (0)