@onchaindb/sdk 2.1.1 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +2 -1
- package/README.md +161 -1
- package/dist/client.d.ts +4 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +13 -4
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/model.d.ts +99 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +218 -0
- package/dist/model.js.map +1 -0
- package/dist/query-sdk/QueryBuilder.d.ts +1 -1
- package/dist/query-sdk/QueryBuilder.d.ts.map +1 -1
- package/dist/query-sdk/QueryBuilder.js +6 -9
- package/dist/query-sdk/QueryBuilder.js.map +1 -1
- package/dist/types.d.ts +4 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/dist/types.js.map +1 -1
- package/dist/x402/types.d.ts +18 -6
- package/dist/x402/types.d.ts.map +1 -1
- package/dist/x402/types.js.map +1 -1
- package/dist/x402/utils.d.ts +2 -2
- package/dist/x402/utils.d.ts.map +1 -1
- package/dist/x402/utils.js +12 -2
- package/dist/x402/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/client.ts +29 -9
- package/src/index.ts +21 -1
- package/src/model.ts +359 -0
- package/src/query-sdk/QueryBuilder.ts +8 -12
- package/src/query-sdk/tests/Joins.test.ts +154 -0
- package/src/tests/model.test.ts +885 -0
- package/src/types.ts +5 -5
- package/src/x402/types.ts +26 -9
- package/src/x402/utils.ts +14 -4
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { QueryBuilder } from '../index';
|
|
2
|
+
import { MockHttpClient } from './setup';
|
|
3
|
+
|
|
4
|
+
const APP = 'test_app';
|
|
5
|
+
|
|
6
|
+
describe('Join wire format — getQueryRequest() equality', () => {
|
|
7
|
+
function builder() {
|
|
8
|
+
return new QueryBuilder(new MockHttpClient(), 'http://localhost:9092', APP);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
12
|
+
// joinWith ≡ serverJoin (no many)
|
|
13
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
14
|
+
|
|
15
|
+
test('joinWith produces identical request to serverJoin', () => {
|
|
16
|
+
const withServerJoin = builder()
|
|
17
|
+
.collection('tweets')
|
|
18
|
+
.serverJoin('author', 'users', {
|
|
19
|
+
find: { address: { is: '$data.author' } },
|
|
20
|
+
select: { display_name: true, avatar_url: true },
|
|
21
|
+
})
|
|
22
|
+
.getQueryRequest();
|
|
23
|
+
|
|
24
|
+
const withJoinWith = builder()
|
|
25
|
+
.collection('tweets')
|
|
26
|
+
.joinWith('author', 'users')
|
|
27
|
+
.onField('address').equals('$data.author')
|
|
28
|
+
.selectFields(['display_name', 'avatar_url'])
|
|
29
|
+
.build()
|
|
30
|
+
.getQueryRequest();
|
|
31
|
+
|
|
32
|
+
expect(withJoinWith).toEqual(withServerJoin);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
36
|
+
// joinOne ≡ serverJoin(…, false)
|
|
37
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
38
|
+
|
|
39
|
+
test('joinOne produces identical request to serverJoin with many=false', () => {
|
|
40
|
+
const withServerJoin = builder()
|
|
41
|
+
.collection('tweets')
|
|
42
|
+
.serverJoin('author', 'users', {
|
|
43
|
+
find: { address: { is: '$data.author' } },
|
|
44
|
+
select: { display_name: true, avatar_url: true },
|
|
45
|
+
}, false)
|
|
46
|
+
.getQueryRequest();
|
|
47
|
+
|
|
48
|
+
const withJoinOne = builder()
|
|
49
|
+
.collection('tweets')
|
|
50
|
+
.joinOne('author', 'users')
|
|
51
|
+
.onField('address').equals('$data.author')
|
|
52
|
+
.selectFields(['display_name', 'avatar_url'])
|
|
53
|
+
.build()
|
|
54
|
+
.getQueryRequest();
|
|
55
|
+
|
|
56
|
+
expect(withJoinOne).toEqual(withServerJoin);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
60
|
+
// joinMany ≡ serverJoin(…, true)
|
|
61
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
62
|
+
|
|
63
|
+
test('joinMany produces identical request to serverJoin with many=true', () => {
|
|
64
|
+
const withServerJoin = builder()
|
|
65
|
+
.collection('users')
|
|
66
|
+
.serverJoin('tweets', 'tweets', {
|
|
67
|
+
find: { author: { is: '$data.address' } },
|
|
68
|
+
select: { id: true, content: true, created_at: true },
|
|
69
|
+
}, true)
|
|
70
|
+
.getQueryRequest();
|
|
71
|
+
|
|
72
|
+
const withJoinMany = builder()
|
|
73
|
+
.collection('users')
|
|
74
|
+
.joinMany('tweets', 'tweets')
|
|
75
|
+
.onField('author').equals('$data.address')
|
|
76
|
+
.selectFields(['id', 'content', 'created_at'])
|
|
77
|
+
.build()
|
|
78
|
+
.getQueryRequest();
|
|
79
|
+
|
|
80
|
+
expect(withJoinMany).toEqual(withServerJoin);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
84
|
+
// Multiple joins
|
|
85
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
86
|
+
|
|
87
|
+
test('multiple joins: serverJoin chain equals joinOne + joinMany chain', () => {
|
|
88
|
+
const withServerJoin = builder()
|
|
89
|
+
.collection('tweets')
|
|
90
|
+
.serverJoin('author', 'users', {
|
|
91
|
+
find: { address: { is: '$data.author' } },
|
|
92
|
+
select: { display_name: true },
|
|
93
|
+
}, false)
|
|
94
|
+
.serverJoin('likes', 'likes', {
|
|
95
|
+
find: { tweet_id: { is: '$data.id' } },
|
|
96
|
+
select: { user: true },
|
|
97
|
+
}, true)
|
|
98
|
+
.getQueryRequest();
|
|
99
|
+
|
|
100
|
+
const withFluent = builder()
|
|
101
|
+
.collection('tweets')
|
|
102
|
+
.joinOne('author', 'users')
|
|
103
|
+
.onField('address').equals('$data.author')
|
|
104
|
+
.selectFields(['display_name'])
|
|
105
|
+
.build()
|
|
106
|
+
.joinMany('likes', 'likes')
|
|
107
|
+
.onField('tweet_id').equals('$data.id')
|
|
108
|
+
.selectFields(['user'])
|
|
109
|
+
.build()
|
|
110
|
+
.getQueryRequest();
|
|
111
|
+
|
|
112
|
+
expect(withFluent).toEqual(withServerJoin);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
116
|
+
// Joins + whereField
|
|
117
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
118
|
+
|
|
119
|
+
test('joins combined with whereField: serverJoin equals joinOne', () => {
|
|
120
|
+
const withServerJoin = builder()
|
|
121
|
+
.collection('tweets')
|
|
122
|
+
.whereField('reply_to_id').isNull()
|
|
123
|
+
.serverJoin('author', 'users', {
|
|
124
|
+
find: { address: { is: '$data.author' } },
|
|
125
|
+
select: {},
|
|
126
|
+
}, false)
|
|
127
|
+
.getQueryRequest();
|
|
128
|
+
|
|
129
|
+
const withJoinOne = builder()
|
|
130
|
+
.collection('tweets')
|
|
131
|
+
.whereField('reply_to_id').isNull()
|
|
132
|
+
.joinOne('author', 'users')
|
|
133
|
+
.onField('address').equals('$data.author')
|
|
134
|
+
.build()
|
|
135
|
+
.getQueryRequest();
|
|
136
|
+
|
|
137
|
+
expect(withJoinOne).toEqual(withServerJoin);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
141
|
+
// getQueryRequest() includes root; buildRawQuery() does not
|
|
142
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
143
|
+
|
|
144
|
+
test('getQueryRequest includes root, buildRawQuery does not', () => {
|
|
145
|
+
const qb = builder()
|
|
146
|
+
.collection('tweets')
|
|
147
|
+
.joinOne('author', 'users')
|
|
148
|
+
.onField('address').equals('$data.author')
|
|
149
|
+
.build();
|
|
150
|
+
|
|
151
|
+
expect(qb.getQueryRequest().root).toBe(`${APP}::tweets`);
|
|
152
|
+
expect((qb.buildRawQuery() as any).root).toBeUndefined();
|
|
153
|
+
});
|
|
154
|
+
});
|