@curvhex/orm 0.1.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.
Files changed (47) hide show
  1. package/LICENSE +143 -0
  2. package/README.md +485 -0
  3. package/dist/adapters/RpcAdapter.d.ts +12 -0
  4. package/dist/adapters/RpcAdapter.d.ts.map +1 -0
  5. package/dist/adapters/RpcAdapter.js +67 -0
  6. package/dist/adapters/RpcAdapter.js.map +1 -0
  7. package/dist/adapters/abstract/QueryAdapter.d.ts +61 -0
  8. package/dist/adapters/abstract/QueryAdapter.d.ts.map +1 -0
  9. package/dist/adapters/abstract/QueryAdapter.js +3 -0
  10. package/dist/adapters/abstract/QueryAdapter.js.map +1 -0
  11. package/dist/client/CurvhexClient.d.ts +19 -0
  12. package/dist/client/CurvhexClient.d.ts.map +1 -0
  13. package/dist/client/CurvhexClient.js +123 -0
  14. package/dist/client/CurvhexClient.js.map +1 -0
  15. package/dist/client/CurvhexORM.d.ts +19 -0
  16. package/dist/client/CurvhexORM.d.ts.map +1 -0
  17. package/dist/client/CurvhexORM.js +21 -0
  18. package/dist/client/CurvhexORM.js.map +1 -0
  19. package/dist/client/VertexClient.d.ts +19 -0
  20. package/dist/client/VertexClient.d.ts.map +1 -0
  21. package/dist/client/VertexClient.js +123 -0
  22. package/dist/client/VertexClient.js.map +1 -0
  23. package/dist/client/VertexORM.d.ts +19 -0
  24. package/dist/client/VertexORM.d.ts.map +1 -0
  25. package/dist/client/VertexORM.js +21 -0
  26. package/dist/client/VertexORM.js.map +1 -0
  27. package/dist/core/deserializer.d.ts +3 -0
  28. package/dist/core/deserializer.d.ts.map +1 -0
  29. package/dist/core/deserializer.js +74 -0
  30. package/dist/core/deserializer.js.map +1 -0
  31. package/dist/core/filters.d.ts +46 -0
  32. package/dist/core/filters.d.ts.map +1 -0
  33. package/dist/core/filters.js +121 -0
  34. package/dist/core/filters.js.map +1 -0
  35. package/dist/core/schema.d.ts +12 -0
  36. package/dist/core/schema.d.ts.map +1 -0
  37. package/dist/core/schema.js +34 -0
  38. package/dist/core/schema.js.map +1 -0
  39. package/dist/core/types.d.ts +16 -0
  40. package/dist/core/types.d.ts.map +1 -0
  41. package/dist/core/types.js +3 -0
  42. package/dist/core/types.js.map +1 -0
  43. package/dist/index.d.ts +8 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +12 -0
  46. package/dist/index.js.map +1 -0
  47. package/package.json +33 -0
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deserialize = deserialize;
4
+ function deserialize(model, data, address) {
5
+ const result = { address };
6
+ for (const [name, field] of Object.entries(model.fields)) {
7
+ const { type, offset } = field;
8
+ switch (type) {
9
+ case 'u8':
10
+ result[name] = data.readUInt8(offset);
11
+ break;
12
+ case 'u16':
13
+ result[name] = data.readUInt16LE(offset);
14
+ break;
15
+ case 'u32':
16
+ result[name] = data.readUInt32LE(offset);
17
+ break;
18
+ case 'u64':
19
+ result[name] = data.readBigUInt64LE(offset);
20
+ break;
21
+ case 'u128':
22
+ const lo = data.readBigUInt64LE(offset);
23
+ const hi = data.readBigUInt64LE(offset + 8);
24
+ result[name] = (hi << 64n) | lo;
25
+ break;
26
+ case 'i8':
27
+ result[name] = data.readInt8(offset);
28
+ break;
29
+ case 'i16':
30
+ result[name] = data.readInt16LE(offset);
31
+ break;
32
+ case 'i32':
33
+ result[name] = data.readInt32LE(offset);
34
+ break;
35
+ case 'i64':
36
+ result[name] = data.readBigInt64LE(offset);
37
+ break;
38
+ case 'bool':
39
+ result[name] = data.readUInt8(offset) === 1;
40
+ break;
41
+ case 'publicKey':
42
+ result[name] = base58Encode(data.slice(offset, offset + 32));
43
+ break;
44
+ case 'string': {
45
+ const len = data.readUInt32LE(offset);
46
+ result[name] = data.slice(offset + 4, offset + 4 + len).toString('utf8');
47
+ break;
48
+ }
49
+ case 'bytes': {
50
+ const len = data.readUInt32LE(offset);
51
+ result[name] = data.slice(offset + 4, offset + 4 + len).toString('hex');
52
+ break;
53
+ }
54
+ }
55
+ }
56
+ return result;
57
+ }
58
+ const BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
59
+ function base58Encode(bytes) {
60
+ let num = BigInt('0x' + bytes.toString('hex'));
61
+ let encoded = '';
62
+ while (num > 0n) {
63
+ encoded = BASE58_ALPHABET[Number(num % 58n)] + encoded;
64
+ num = num / 58n;
65
+ }
66
+ // Leading zero bytes → '1'
67
+ for (const byte of bytes) {
68
+ if (byte !== 0)
69
+ break;
70
+ encoded = '1' + encoded;
71
+ }
72
+ return encoded;
73
+ }
74
+ //# sourceMappingURL=deserializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deserializer.js","sourceRoot":"","sources":["../../src/core/deserializer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { ModelDefinition, FieldType } from './types';
2
+ export interface MemcmpFilter {
3
+ memcmp: {
4
+ offset: number;
5
+ bytes: string;
6
+ };
7
+ }
8
+ export interface DataSizeFilter {
9
+ dataSize: number;
10
+ }
11
+ export type RpcFilter = MemcmpFilter | DataSizeFilter;
12
+ export type WhereOperator<T> = T | {
13
+ eq?: T;
14
+ not?: T;
15
+ gt?: T;
16
+ gte?: T;
17
+ lt?: T;
18
+ lte?: T;
19
+ in?: T[];
20
+ between?: [T, T];
21
+ };
22
+ export type WhereClause<M extends ModelDefinition> = {
23
+ [K in keyof M['fields']]?: WhereOperator<any>;
24
+ };
25
+ export declare function buildFilters<M extends ModelDefinition>(model: M, where: WhereClause<M>): {
26
+ rpcFilters: RpcFilter[];
27
+ clientFilters: ClientFilter[];
28
+ };
29
+ export interface ClientFilter {
30
+ fieldName: string;
31
+ fieldDef: {
32
+ type: FieldType;
33
+ offset: number;
34
+ };
35
+ condition: {
36
+ gt?: any;
37
+ gte?: any;
38
+ lt?: any;
39
+ lte?: any;
40
+ in?: any[];
41
+ between?: [any, any];
42
+ not?: any;
43
+ };
44
+ }
45
+ export declare function applyClientFilters<T extends Record<string, any>>(records: T[], clientFilters: ClientFilter[]): T[];
46
+ //# sourceMappingURL=filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/core/filters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAErD,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,cAAc,CAAC;AAGtD,MAAM,MAAM,aAAa,CAAC,CAAC,IACrB,CAAC,GACD;IAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;CAAE,CAAC;AAExF,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,eAAe,IAAI;KAChD,CAAC,IAAI,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,GAAG,CAAC;CAChD,CAAC;AA4CF,wBAAgB,YAAY,CAAC,CAAC,SAAS,eAAe,EAClD,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GACtB;IAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IAAC,aAAa,EAAE,YAAY,EAAE,CAAA;CAAE,CAoC5D;AAED,MAAM,WAAW,YAAY;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,SAAS,EAAE;QAAE,EAAE,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QAAC,EAAE,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;CACxG;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5D,OAAO,EAAE,CAAC,EAAE,EACZ,aAAa,EAAE,YAAY,EAAE,GAC9B,CAAC,EAAE,CAmBL"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildFilters = buildFilters;
4
+ exports.applyClientFilters = applyClientFilters;
5
+ // Field değerini byte array'e çevir (memcmp için)
6
+ function encodeValue(type, value) {
7
+ switch (type) {
8
+ case 'u8':
9
+ case 'i8': {
10
+ const b = Buffer.alloc(1);
11
+ b.writeUInt8(value, 0);
12
+ return b;
13
+ }
14
+ case 'u16':
15
+ case 'i16': {
16
+ const b = Buffer.alloc(2);
17
+ b.writeUInt16LE(value, 0);
18
+ return b;
19
+ }
20
+ case 'u32':
21
+ case 'i32': {
22
+ const b = Buffer.alloc(4);
23
+ b.writeUInt32LE(value, 0);
24
+ return b;
25
+ }
26
+ case 'u64': {
27
+ const b = Buffer.alloc(8);
28
+ b.writeBigUInt64LE(value, 0);
29
+ return b;
30
+ }
31
+ case 'i64': {
32
+ const b = Buffer.alloc(8);
33
+ b.writeBigInt64LE(value, 0);
34
+ return b;
35
+ }
36
+ case 'bool': {
37
+ const b = Buffer.alloc(1);
38
+ b.writeUInt8(value ? 1 : 0, 0);
39
+ return b;
40
+ }
41
+ case 'publicKey': {
42
+ return base58Decode(value);
43
+ }
44
+ default:
45
+ throw new Error(`${type} tipi memcmp filtresinde kullanılamaz`);
46
+ }
47
+ }
48
+ function buildFilters(model, where) {
49
+ const rpcFilters = [];
50
+ const clientFilters = [];
51
+ if (model.discriminator.length > 0) {
52
+ rpcFilters.push({
53
+ memcmp: {
54
+ offset: 0,
55
+ bytes: Buffer.from(model.discriminator).toString('base64'),
56
+ }
57
+ });
58
+ }
59
+ for (const [fieldName, condition] of Object.entries(where)) {
60
+ const fieldDef = model.fields[fieldName];
61
+ if (!fieldDef)
62
+ continue;
63
+ const eqValue = isDirectValue(condition)
64
+ ? condition
65
+ : condition?.eq;
66
+ if (eqValue !== undefined) {
67
+ const encoded = encodeValue(fieldDef.type, eqValue);
68
+ rpcFilters.push({
69
+ memcmp: {
70
+ offset: fieldDef.offset,
71
+ bytes: encoded.toString('base64'),
72
+ }
73
+ });
74
+ continue;
75
+ }
76
+ clientFilters.push({ fieldName, fieldDef, condition: condition });
77
+ }
78
+ return { rpcFilters, clientFilters };
79
+ }
80
+ function applyClientFilters(records, clientFilters) {
81
+ return records.filter(record => clientFilters.every(({ fieldName, condition }) => {
82
+ const val = record[fieldName];
83
+ if (condition.gt !== undefined && !(val > condition.gt))
84
+ return false;
85
+ if (condition.gte !== undefined && !(val >= condition.gte))
86
+ return false;
87
+ if (condition.lt !== undefined && !(val < condition.lt))
88
+ return false;
89
+ if (condition.lte !== undefined && !(val <= condition.lte))
90
+ return false;
91
+ if (condition.not !== undefined && (val === condition.not))
92
+ return false;
93
+ if (condition.in !== undefined && !condition.in.includes(val))
94
+ return false;
95
+ if (condition.between !== undefined) {
96
+ const [min, max] = condition.between;
97
+ if (!(val >= min && val <= max))
98
+ return false;
99
+ }
100
+ return true;
101
+ }));
102
+ }
103
+ function isDirectValue(v) {
104
+ if (v === null || v === undefined)
105
+ return false;
106
+ const type = typeof v;
107
+ return type === 'string' || type === 'number' || type === 'bigint' || type === 'boolean';
108
+ }
109
+ const BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
110
+ function base58Decode(str) {
111
+ let num = 0n;
112
+ for (const char of str) {
113
+ const idx = BASE58_ALPHABET.indexOf(char);
114
+ if (idx < 0)
115
+ throw new Error(`Geçersiz base58 karakter: ${char}`);
116
+ num = num * 58n + BigInt(idx);
117
+ }
118
+ const hex = num.toString(16).padStart(64, '0');
119
+ return Buffer.from(hex, 'hex');
120
+ }
121
+ //# sourceMappingURL=filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../src/core/filters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { FieldType, ModelDefinition } from "./types";
2
+ export declare function anchor(name: string): number[];
3
+ type FieldInput = {
4
+ type: FieldType;
5
+ };
6
+ type ModelInput = {
7
+ discriminator: number[];
8
+ fields: Record<string, FieldInput>;
9
+ };
10
+ export declare function defineModel<T extends ModelInput>(input: T): ModelDefinition;
11
+ export {};
12
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAmB,eAAe,EAAE,MAAM,SAAS,CAAC;AAI3E,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAK7C;AAcD,KAAK,UAAU,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AACtC,KAAK,UAAU,GAAG;IACd,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACtC,CAAC;AAEF,wBAAgB,WAAW,CAAC,CAAC,SAAS,UAAU,EAAE,KAAK,EAAE,CAAC,GAAG,eAAe,CAa3E"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.anchor = anchor;
4
+ exports.defineModel = defineModel;
5
+ const crypto_1 = require("crypto");
6
+ // Anchor discriminator: sha256("account:<ModelName>") → fist 8 byte
7
+ function anchor(name) {
8
+ const hash = (0, crypto_1.createHash)('sha256')
9
+ .update(`account:${name}`)
10
+ .digest();
11
+ return Array.from(hash.slice(0, 8));
12
+ }
13
+ const FIELD_SIZES = {
14
+ u8: 1, i8: 1,
15
+ u16: 2, i16: 2,
16
+ u32: 4, i32: 4,
17
+ u64: 8, i64: 8,
18
+ u128: 16, i128: 16,
19
+ bool: 1,
20
+ publicKey: 32,
21
+ string: 0,
22
+ bytes: 0,
23
+ };
24
+ function defineModel(input) {
25
+ const fields = {};
26
+ let offset = input.discriminator.length;
27
+ for (const [name, field] of Object.entries(input.fields)) {
28
+ const size = FIELD_SIZES[field.type];
29
+ fields[name] = { type: field.type, offset };
30
+ offset += size === 0 ? 4 : size;
31
+ }
32
+ return { discriminator: input.discriminator, fields };
33
+ }
34
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":";;AAIA,wBAKC;AAoBD,kCAaC;AAzCD,mCAAoC;AAEpC,oEAAoE;AACpE,SAAgB,MAAM,CAAC,IAAY;IAC/B,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC;SAC5B,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;SACzB,MAAM,EAAE,CAAC;IACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,WAAW,GAA8B;IAC3C,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;IACZ,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;IAClB,IAAI,EAAE,CAAC;IACP,SAAS,EAAE,EAAE;IACb,MAAM,EAAE,CAAC;IACT,KAAK,EAAE,CAAC;CACX,CAAC;AAQF,SAAgB,WAAW,CAAuB,KAAQ;IACtD,MAAM,MAAM,GAAoC,EAAE,CAAC;IACnD,IAAI,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC;IAExC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAErC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAE5C,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpC,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,16 @@
1
+ export type FieldType = 'u8' | 'u16' | 'u32' | 'u64' | 'u128' | 'i8' | 'i16' | 'i32' | 'i64' | 'i128' | 'bool' | 'publicKey' | 'string' | 'bytes';
2
+ export interface FieldDefinition {
3
+ type: FieldType;
4
+ offset: number;
5
+ }
6
+ export interface ModelDefinition {
7
+ discriminator: number[];
8
+ fields: Record<string, FieldDefinition>;
9
+ }
10
+ export type InferFieldType<T extends FieldType> = T extends 'u64' | 'u128' | 'i64' | 'i128' ? bigint : T extends 'u8' | 'u16' | 'u32' | 'i8' | 'i16' | 'i32' ? number : T extends 'bool' ? boolean : T extends 'publicKey' ? string : T extends 'string' | 'bytes' ? string : never;
11
+ export type InferModel<M extends ModelDefinition> = {
12
+ [K in keyof M['fields']]: InferFieldType<M['fields'][K]['type']>;
13
+ } & {
14
+ address: string;
15
+ };
16
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GACf,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GACrC,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GACrC,MAAM,GACN,WAAW,GACX,QAAQ,GACR,OAAO,CAAC;AAEd,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,eAAe;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC3C;AAED,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,SAAS,IAC1C,CAAC,SAAS,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAClD,CAAC,SAAS,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAC9D,CAAC,SAAS,MAAM,GAAG,OAAO,GAC1B,CAAC,SAAS,WAAW,GAAG,MAAM,GAC9B,CAAC,SAAS,QAAQ,GAAG,OAAO,GAAG,MAAM,GACrC,KAAK,CAAC;AAGV,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,eAAe,IAAI;KAC/C,CAAC,IAAI,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;CACnE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ export { CurvhexORM } from './client/CurvhexORM';
2
+ export { defineModel } from './core/schema';
3
+ export { CurvhexClient as ModelClient } from './client/CurvhexClient';
4
+ export type { ModelDefinition, FieldDefinition, FieldType, InferModel } from './core/types';
5
+ export type { FindManyOptions } from './client/CurvhexClient';
6
+ export type { WhereClause } from './core/filters';
7
+ export { anchor } from './core/schema';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,IAAI,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACtE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC5F,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.anchor = exports.ModelClient = exports.defineModel = exports.CurvhexORM = void 0;
4
+ var CurvhexORM_1 = require("./client/CurvhexORM");
5
+ Object.defineProperty(exports, "CurvhexORM", { enumerable: true, get: function () { return CurvhexORM_1.CurvhexORM; } });
6
+ var schema_1 = require("./core/schema");
7
+ Object.defineProperty(exports, "defineModel", { enumerable: true, get: function () { return schema_1.defineModel; } });
8
+ var CurvhexClient_1 = require("./client/CurvhexClient");
9
+ Object.defineProperty(exports, "ModelClient", { enumerable: true, get: function () { return CurvhexClient_1.CurvhexClient; } });
10
+ var schema_2 = require("./core/schema");
11
+ Object.defineProperty(exports, "anchor", { enumerable: true, get: function () { return schema_2.anchor; } });
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,kDAAiD;AAAxC,wGAAA,UAAU,OAAA;AACnB,wCAA4C;AAAnC,qGAAA,WAAW,OAAA;AACpB,wDAAsE;AAA7D,4GAAA,aAAa,OAAe;AAIrC,wCAAuC;AAA9B,gGAAA,MAAM,OAAA"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@curvhex/orm",
3
+ "version": "0.1.0",
4
+ "description": "TypeScript ORM for Solana PDA accounts",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "prepublishOnly": "npm run build"
16
+ },
17
+ "keywords": [
18
+ "solana",
19
+ "orm",
20
+ "pda",
21
+ "web3",
22
+ "blockchain"
23
+ ],
24
+ "license": "Apache-2.0",
25
+ "dependencies": {
26
+ "@solana/web3.js": "^1.98.0"
27
+ },
28
+ "devDependencies": {
29
+ "@types/node": "^25.9.3",
30
+ "tsx": "^4.19.4",
31
+ "typescript": "^6.0.3"
32
+ }
33
+ }