dynamodb-reactive 0.1.0 → 0.1.1
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/dist/chunk-HZ6JHAJJ.js +131 -0
- package/dist/chunk-HZ6JHAJJ.js.map +1 -0
- package/dist/chunk-KRZQWA2W.js +657 -0
- package/dist/chunk-KRZQWA2W.js.map +1 -0
- package/dist/client.d.ts +55 -2
- package/dist/client.js +2 -17
- package/dist/client.js.map +1 -1
- package/dist/core.d.ts +4 -2
- package/dist/core.js +2 -17
- package/dist/core.js.map +1 -1
- package/dist/index.d.ts +171 -2
- package/dist/index.js +2 -17
- package/dist/index.js.map +1 -1
- package/dist/infra.d.ts +189 -2
- package/dist/infra.js +358 -15
- package/dist/infra.js.map +1 -1
- package/dist/react-BMZQ8Mth.d.ts +371 -0
- package/dist/react.d.ts +3 -2
- package/dist/react.js +2 -17
- package/dist/react.js.map +1 -1
- package/dist/server.d.ts +631 -2
- package/dist/server.js +1687 -16
- package/dist/server.js.map +1 -1
- package/dist/table-CSJysZPQ.d.ts +85 -0
- package/dist/types-Ci7IieDA.d.ts +141 -0
- package/package.json +10 -6
- package/dist/client.d.ts.map +0 -1
- package/dist/core.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/infra.d.ts.map +0 -1
- package/dist/react.d.ts.map +0 -1
- package/dist/server.d.ts.map +0 -1
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
// ../core/src/table.ts
|
|
4
|
+
var DynamoTable = class {
|
|
5
|
+
tableName;
|
|
6
|
+
schema;
|
|
7
|
+
pk;
|
|
8
|
+
sk;
|
|
9
|
+
indexes;
|
|
10
|
+
field;
|
|
11
|
+
constructor(config) {
|
|
12
|
+
this.tableName = config.tableName;
|
|
13
|
+
this.schema = config.schema;
|
|
14
|
+
this.pk = config.pk;
|
|
15
|
+
this.sk = config.sk;
|
|
16
|
+
this.indexes = config.indexes ?? {};
|
|
17
|
+
this.field = this.createFieldRefs();
|
|
18
|
+
}
|
|
19
|
+
createFieldRefs() {
|
|
20
|
+
const shape = this.schema.shape;
|
|
21
|
+
const refs = {};
|
|
22
|
+
for (const key of Object.keys(shape)) {
|
|
23
|
+
refs[key] = {
|
|
24
|
+
fieldName: key,
|
|
25
|
+
_type: void 0
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return refs;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Validate an item against the schema
|
|
32
|
+
*/
|
|
33
|
+
validate(item) {
|
|
34
|
+
return this.schema.parse(item);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Safely validate an item, returning a result object
|
|
38
|
+
*/
|
|
39
|
+
safeParse(item) {
|
|
40
|
+
return this.schema.safeParse(item);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get the partition key value from an item
|
|
44
|
+
*/
|
|
45
|
+
getPk(item) {
|
|
46
|
+
return item[this.pk];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get the sort key value from an item (if defined)
|
|
50
|
+
*/
|
|
51
|
+
getSk(item) {
|
|
52
|
+
if (this.sk === void 0) {
|
|
53
|
+
return void 0;
|
|
54
|
+
}
|
|
55
|
+
return item[this.sk];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get the list of field names in the schema
|
|
59
|
+
*/
|
|
60
|
+
getFieldNames() {
|
|
61
|
+
return Object.keys(this.schema.shape);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check if a field exists in the schema
|
|
65
|
+
*/
|
|
66
|
+
hasField(fieldName) {
|
|
67
|
+
return fieldName in this.schema.shape;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
function defineSchema(config) {
|
|
71
|
+
return new DynamoTable(config);
|
|
72
|
+
}
|
|
73
|
+
var SystemSchemas = {
|
|
74
|
+
/**
|
|
75
|
+
* ReactiveConnections - Tracks active WebSocket connections
|
|
76
|
+
*/
|
|
77
|
+
connections: z.object({
|
|
78
|
+
connectionId: z.string(),
|
|
79
|
+
context: z.record(z.unknown()).optional(),
|
|
80
|
+
connectedAt: z.number(),
|
|
81
|
+
ttl: z.number()
|
|
82
|
+
}),
|
|
83
|
+
/**
|
|
84
|
+
* ReactiveDependencies - The inverted index for O(1) lookups
|
|
85
|
+
*/
|
|
86
|
+
dependencies: z.object({
|
|
87
|
+
pk: z.string(),
|
|
88
|
+
// Format: "TableName#FieldName#FieldValue"
|
|
89
|
+
sk: z.string(),
|
|
90
|
+
// ConnectionID#SubscriptionID
|
|
91
|
+
connectionId: z.string(),
|
|
92
|
+
subscriptionId: z.string(),
|
|
93
|
+
tableName: z.string(),
|
|
94
|
+
fieldName: z.string(),
|
|
95
|
+
fieldValue: z.string(),
|
|
96
|
+
ttl: z.number()
|
|
97
|
+
}),
|
|
98
|
+
/**
|
|
99
|
+
* ReactiveConnectionQueries - Stores subscription state for diffing
|
|
100
|
+
*/
|
|
101
|
+
queries: z.object({
|
|
102
|
+
pk: z.string(),
|
|
103
|
+
// ConnectionID
|
|
104
|
+
sk: z.string(),
|
|
105
|
+
// SubscriptionID
|
|
106
|
+
connectionId: z.string(),
|
|
107
|
+
subscriptionId: z.string(),
|
|
108
|
+
queryMetadata: z.object({
|
|
109
|
+
tableName: z.string(),
|
|
110
|
+
indexName: z.string().optional(),
|
|
111
|
+
filterConditions: z.array(z.unknown()),
|
|
112
|
+
sortField: z.string().optional(),
|
|
113
|
+
sortOrder: z.enum(["asc", "desc"]).optional(),
|
|
114
|
+
limit: z.number().optional()
|
|
115
|
+
}),
|
|
116
|
+
lastResult: z.array(z.unknown()),
|
|
117
|
+
dependencies: z.array(z.string()),
|
|
118
|
+
createdAt: z.number(),
|
|
119
|
+
updatedAt: z.number(),
|
|
120
|
+
ttl: z.number()
|
|
121
|
+
})
|
|
122
|
+
};
|
|
123
|
+
var SystemTableNames = {
|
|
124
|
+
connections: "ReactiveConnections",
|
|
125
|
+
dependencies: "ReactiveDependencies",
|
|
126
|
+
queries: "ReactiveConnectionQueries"
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
export { DynamoTable, SystemSchemas, SystemTableNames, defineSchema };
|
|
130
|
+
//# sourceMappingURL=chunk-HZ6JHAJJ.js.map
|
|
131
|
+
//# sourceMappingURL=chunk-HZ6JHAJJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../core/src/table.ts","../../core/src/schema.ts"],"names":[],"mappings":";;;AA+BO,IAAM,cAAN,MAQL;AAAA,EACgB,SAAA;AAAA,EACA,MAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EAEhB,YAAY,MAAA,EAAwD;AAClE,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AACxB,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,KAAK,MAAA,CAAO,EAAA;AACjB,IAAA,IAAA,CAAK,KAAK,MAAA,CAAO,EAAA;AACjB,IAAA,IAAA,CAAK,OAAA,GAAW,MAAA,CAAO,OAAA,IAAW,EAAC;AAGnC,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,eAAA,EAAgB;AAAA,EACpC;AAAA,EAEQ,eAAA,GAAsC;AAC5C,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,KAAA;AAC1B,IAAA,MAAM,OAAkD,EAAC;AAEzD,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AACpC,MAAA,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,QACV,SAAA,EAAW,GAAA;AAAA,QACX,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,IAAA,EAAiC;AACxC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,IAAA,EAAiE;AACzE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,EAA+C;AACnD,IAAA,OAAO,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MACE,IAAA,EACwE;AACxE,IAAA,IAAI,IAAA,CAAK,OAAO,MAAA,EAAW;AACzB,MAAA,OAAO,MAAA;AAAA,IAGT;AACA,IAAA,OAAO,IAAA,CACL,KAAK,EACP,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAA4C;AAC1C,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,SAAA,EAAiE;AACxE,IAAA,OAAO,SAAA,IAAa,KAAK,MAAA,CAAO,KAAA;AAAA,EAClC;AACF;AChGO,SAAS,aAQd,MAAA,EAM2C;AAC3C,EAAA,OAAO,IAAI,YAAY,MAAM,CAAA;AAC/B;AAKO,IAAM,aAAA,GAAgB;AAAA;AAAA;AAAA;AAAA,EAI3B,WAAA,EAAa,EAAE,MAAA,CAAO;AAAA,IACpB,YAAA,EAAc,EAAE,MAAA,EAAO;AAAA,IACvB,SAAS,CAAA,CAAE,MAAA,CAAO,EAAE,OAAA,EAAS,EAAE,QAAA,EAAS;AAAA,IACxC,WAAA,EAAa,EAAE,MAAA,EAAO;AAAA,IACtB,GAAA,EAAK,EAAE,MAAA;AAAO,GACf,CAAA;AAAA;AAAA;AAAA;AAAA,EAKD,YAAA,EAAc,EAAE,MAAA,CAAO;AAAA,IACrB,EAAA,EAAI,EAAE,MAAA,EAAO;AAAA;AAAA,IACb,EAAA,EAAI,EAAE,MAAA,EAAO;AAAA;AAAA,IACb,YAAA,EAAc,EAAE,MAAA,EAAO;AAAA,IACvB,cAAA,EAAgB,EAAE,MAAA,EAAO;AAAA,IACzB,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,IACpB,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,IACpB,UAAA,EAAY,EAAE,MAAA,EAAO;AAAA,IACrB,GAAA,EAAK,EAAE,MAAA;AAAO,GACf,CAAA;AAAA;AAAA;AAAA;AAAA,EAKD,OAAA,EAAS,EAAE,MAAA,CAAO;AAAA,IAChB,EAAA,EAAI,EAAE,MAAA,EAAO;AAAA;AAAA,IACb,EAAA,EAAI,EAAE,MAAA,EAAO;AAAA;AAAA,IACb,YAAA,EAAc,EAAE,MAAA,EAAO;AAAA,IACvB,cAAA,EAAgB,EAAE,MAAA,EAAO;AAAA,IACzB,aAAA,EAAe,EAAE,MAAA,CAAO;AAAA,MACtB,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,MACpB,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAC/B,gBAAA,EAAkB,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,SAAS,CAAA;AAAA,MACrC,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAC/B,SAAA,EAAW,EAAE,IAAA,CAAK,CAAC,OAAO,MAAM,CAAC,EAAE,QAAA,EAAS;AAAA,MAC5C,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,KAC5B,CAAA;AAAA,IACD,UAAA,EAAY,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,SAAS,CAAA;AAAA,IAC/B,YAAA,EAAc,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAA;AAAA,IAChC,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,IACpB,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,IACpB,GAAA,EAAK,EAAE,MAAA;AAAO,GACf;AACH;AAKO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,WAAA,EAAa,qBAAA;AAAA,EACb,YAAA,EAAc,sBAAA;AAAA,EACd,OAAA,EAAS;AACX","file":"chunk-HZ6JHAJJ.js","sourcesContent":["import type { z } from 'zod';\n\nimport type { DynamoTableConfig, FieldRef, IndexDefinition } from './types.js';\n\n/**\n * Creates field references for type-safe query building\n */\ntype FieldRefs<TSchema extends z.ZodObject<z.ZodRawShape>> = {\n [K in keyof z.infer<TSchema>]: FieldRef<K & string, z.infer<TSchema>[K]>;\n};\n\n/**\n * DynamoTable - Defines a DynamoDB table with type-safe schema\n *\n * @example\n * ```ts\n * const TodoTable = new DynamoTable({\n * tableName: 'prod-todo-table',\n * schema: z.object({\n * id: z.string(),\n * taskListId: z.string(),\n * text: z.string(),\n * isDone: z.boolean(),\n * }),\n * pk: 'id',\n * indexes: {\n * byTaskId: { name: 'gsi_by_task_id', pk: 'taskListId' }\n * }\n * });\n * ```\n */\nexport class DynamoTable<\n TSchema extends z.ZodObject<z.ZodRawShape>,\n TPk extends keyof z.infer<TSchema>,\n TSk extends keyof z.infer<TSchema> | undefined = undefined,\n TIndexes extends Record<string, IndexDefinition> = Record<\n string,\n IndexDefinition\n >,\n> {\n public readonly tableName: string;\n public readonly schema: TSchema;\n public readonly pk: TPk;\n public readonly sk: TSk;\n public readonly indexes: TIndexes;\n public readonly field: FieldRefs<TSchema>;\n\n constructor(config: DynamoTableConfig<TSchema, TPk, TSk, TIndexes>) {\n this.tableName = config.tableName;\n this.schema = config.schema;\n this.pk = config.pk;\n this.sk = config.sk as TSk;\n this.indexes = (config.indexes ?? {}) as TIndexes;\n\n // Create field references for query building\n this.field = this.createFieldRefs();\n }\n\n private createFieldRefs(): FieldRefs<TSchema> {\n const shape = this.schema.shape;\n const refs: Record<string, FieldRef<string, unknown>> = {};\n\n for (const key of Object.keys(shape)) {\n refs[key] = {\n fieldName: key,\n _type: undefined as unknown,\n };\n }\n\n return refs as FieldRefs<TSchema>;\n }\n\n /**\n * Validate an item against the schema\n */\n validate(item: unknown): z.infer<TSchema> {\n return this.schema.parse(item);\n }\n\n /**\n * Safely validate an item, returning a result object\n */\n safeParse(item: unknown): z.SafeParseReturnType<unknown, z.infer<TSchema>> {\n return this.schema.safeParse(item);\n }\n\n /**\n * Get the partition key value from an item\n */\n getPk(item: z.infer<TSchema>): z.infer<TSchema>[TPk] {\n return item[this.pk];\n }\n\n /**\n * Get the sort key value from an item (if defined)\n */\n getSk(\n item: z.infer<TSchema>,\n ): TSk extends keyof z.infer<TSchema> ? z.infer<TSchema>[TSk] : undefined {\n if (this.sk === undefined) {\n return undefined as TSk extends keyof z.infer<TSchema>\n ? z.infer<TSchema>[TSk]\n : undefined;\n }\n return item[\n this.sk as keyof z.infer<TSchema>\n ] as TSk extends keyof z.infer<TSchema> ? z.infer<TSchema>[TSk] : undefined;\n }\n\n /**\n * Get the list of field names in the schema\n */\n getFieldNames(): (keyof z.infer<TSchema>)[] {\n return Object.keys(this.schema.shape) as (keyof z.infer<TSchema>)[];\n }\n\n /**\n * Check if a field exists in the schema\n */\n hasField(fieldName: string): fieldName is keyof z.infer<TSchema> & string {\n return fieldName in this.schema.shape;\n }\n}\n\n/**\n * Helper type to extract the shape from a Zod schema\n */\nexport type InferSchema<T> =\n T extends DynamoTable<infer TSchema, any, any, any>\n ? z.infer<TSchema>\n : never;\n\n/**\n * Helper type to extract field names from a table\n */\nexport type TableFields<T> =\n T extends DynamoTable<infer TSchema, any, any, any>\n ? keyof z.infer<TSchema>\n : never;\n\n/**\n * Helper type to get the pk field name\n */\nexport type TablePk<T> =\n T extends DynamoTable<any, infer TPk, any, any> ? TPk : never;\n\n/**\n * Helper type to get the sk field name\n */\nexport type TableSk<T> =\n T extends DynamoTable<any, any, infer TSk, any> ? TSk : never;\n\n/**\n * Helper type to get indexes\n */\nexport type TableIndexes<T> =\n T extends DynamoTable<any, any, any, infer TIndexes> ? TIndexes : never;\n","import { z } from 'zod';\n\nimport { DynamoTable } from './table.js';\nimport type { IndexDefinition } from './types.js';\n\n/**\n * Helper function to define a schema with type inference\n * This provides a cleaner API for defining tables\n *\n * @example\n * ```ts\n * const TodoTable = defineSchema({\n * tableName: 'prod-todo-table',\n * schema: z.object({\n * id: z.string(),\n * taskListId: z.string(),\n * text: z.string(),\n * isDone: z.boolean(),\n * }),\n * pk: 'id',\n * indexes: {\n * byTaskId: { name: 'gsi_by_task_id', pk: 'taskListId' }\n * }\n * });\n * ```\n */\nexport function defineSchema<\n TSchema extends z.ZodObject<z.ZodRawShape>,\n TPk extends keyof z.infer<TSchema> & string,\n TSk extends (keyof z.infer<TSchema> & string) | undefined = undefined,\n TIndexes extends Record<string, IndexDefinition> = Record<\n string,\n IndexDefinition\n >,\n>(config: {\n tableName: string;\n schema: TSchema;\n pk: TPk;\n sk?: TSk;\n indexes?: TIndexes;\n}): DynamoTable<TSchema, TPk, TSk, TIndexes> {\n return new DynamoTable(config);\n}\n\n/**\n * System table schemas for the reactive engine\n */\nexport const SystemSchemas = {\n /**\n * ReactiveConnections - Tracks active WebSocket connections\n */\n connections: z.object({\n connectionId: z.string(),\n context: z.record(z.unknown()).optional(),\n connectedAt: z.number(),\n ttl: z.number(),\n }),\n\n /**\n * ReactiveDependencies - The inverted index for O(1) lookups\n */\n dependencies: z.object({\n pk: z.string(), // Format: \"TableName#FieldName#FieldValue\"\n sk: z.string(), // ConnectionID#SubscriptionID\n connectionId: z.string(),\n subscriptionId: z.string(),\n tableName: z.string(),\n fieldName: z.string(),\n fieldValue: z.string(),\n ttl: z.number(),\n }),\n\n /**\n * ReactiveConnectionQueries - Stores subscription state for diffing\n */\n queries: z.object({\n pk: z.string(), // ConnectionID\n sk: z.string(), // SubscriptionID\n connectionId: z.string(),\n subscriptionId: z.string(),\n queryMetadata: z.object({\n tableName: z.string(),\n indexName: z.string().optional(),\n filterConditions: z.array(z.unknown()),\n sortField: z.string().optional(),\n sortOrder: z.enum(['asc', 'desc']).optional(),\n limit: z.number().optional(),\n }),\n lastResult: z.array(z.unknown()),\n dependencies: z.array(z.string()),\n createdAt: z.number(),\n updatedAt: z.number(),\n ttl: z.number(),\n }),\n};\n\n/**\n * System table names\n */\nexport const SystemTableNames = {\n connections: 'ReactiveConnections',\n dependencies: 'ReactiveDependencies',\n queries: 'ReactiveConnectionQueries',\n} as const;\n"]}
|