@neutron-build/nucleus 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 (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +27 -0
  3. package/dist/blob/index.d.ts +42 -0
  4. package/dist/blob/index.d.ts.map +1 -0
  5. package/dist/blob/index.js +121 -0
  6. package/dist/blob/index.js.map +1 -0
  7. package/dist/cdc/index.d.ts +14 -0
  8. package/dist/cdc/index.d.ts.map +1 -0
  9. package/dist/cdc/index.js +41 -0
  10. package/dist/cdc/index.js.map +1 -0
  11. package/dist/client.d.ts +59 -0
  12. package/dist/client.d.ts.map +1 -0
  13. package/dist/client.js +68 -0
  14. package/dist/client.js.map +1 -0
  15. package/dist/columnar/index.d.ts +20 -0
  16. package/dist/columnar/index.d.ts.map +1 -0
  17. package/dist/columnar/index.js +60 -0
  18. package/dist/columnar/index.js.map +1 -0
  19. package/dist/datalog/index.d.ts +20 -0
  20. package/dist/datalog/index.d.ts.map +1 -0
  21. package/dist/datalog/index.js +53 -0
  22. package/dist/datalog/index.js.map +1 -0
  23. package/dist/document/index.d.ts +42 -0
  24. package/dist/document/index.d.ts.map +1 -0
  25. package/dist/document/index.js +154 -0
  26. package/dist/document/index.js.map +1 -0
  27. package/dist/errors.d.ts +39 -0
  28. package/dist/errors.d.ts.map +1 -0
  29. package/dist/errors.js +64 -0
  30. package/dist/errors.js.map +1 -0
  31. package/dist/features.d.ts +14 -0
  32. package/dist/features.d.ts.map +1 -0
  33. package/dist/features.js +85 -0
  34. package/dist/features.js.map +1 -0
  35. package/dist/fts/index.d.ts +35 -0
  36. package/dist/fts/index.d.ts.map +1 -0
  37. package/dist/fts/index.js +76 -0
  38. package/dist/fts/index.js.map +1 -0
  39. package/dist/geo/index.d.ts +34 -0
  40. package/dist/geo/index.d.ts.map +1 -0
  41. package/dist/geo/index.js +121 -0
  42. package/dist/geo/index.js.map +1 -0
  43. package/dist/graph/index.d.ts +43 -0
  44. package/dist/graph/index.d.ts.map +1 -0
  45. package/dist/graph/index.js +109 -0
  46. package/dist/graph/index.js.map +1 -0
  47. package/dist/helpers.d.ts +11 -0
  48. package/dist/helpers.d.ts.map +1 -0
  49. package/dist/helpers.js +47 -0
  50. package/dist/helpers.js.map +1 -0
  51. package/dist/index.d.ts +39 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +29 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/kv/index.d.ts +93 -0
  56. package/dist/kv/index.d.ts.map +1 -0
  57. package/dist/kv/index.js +223 -0
  58. package/dist/kv/index.js.map +1 -0
  59. package/dist/migrate.d.ts +37 -0
  60. package/dist/migrate.d.ts.map +1 -0
  61. package/dist/migrate.js +95 -0
  62. package/dist/migrate.js.map +1 -0
  63. package/dist/pubsub/index.d.ts +14 -0
  64. package/dist/pubsub/index.d.ts.map +1 -0
  65. package/dist/pubsub/index.js +44 -0
  66. package/dist/pubsub/index.js.map +1 -0
  67. package/dist/sql/index.d.ts +31 -0
  68. package/dist/sql/index.d.ts.map +1 -0
  69. package/dist/sql/index.js +65 -0
  70. package/dist/sql/index.js.map +1 -0
  71. package/dist/streams/index.d.ts +26 -0
  72. package/dist/streams/index.d.ts.map +1 -0
  73. package/dist/streams/index.js +83 -0
  74. package/dist/streams/index.js.map +1 -0
  75. package/dist/timeseries/index.d.ts +46 -0
  76. package/dist/timeseries/index.d.ts.map +1 -0
  77. package/dist/timeseries/index.js +122 -0
  78. package/dist/timeseries/index.js.map +1 -0
  79. package/dist/transport.d.ts +97 -0
  80. package/dist/transport.d.ts.map +1 -0
  81. package/dist/transport.js +477 -0
  82. package/dist/transport.js.map +1 -0
  83. package/dist/types.d.ts +58 -0
  84. package/dist/types.d.ts.map +1 -0
  85. package/dist/types.js +5 -0
  86. package/dist/types.js.map +1 -0
  87. package/dist/vector/index.d.ts +34 -0
  88. package/dist/vector/index.d.ts.map +1 -0
  89. package/dist/vector/index.js +104 -0
  90. package/dist/vector/index.js.map +1 -0
  91. package/package.json +110 -0
@@ -0,0 +1,121 @@
1
+ // ---------------------------------------------------------------------------
2
+ // @neutron/nucleus/geo — Geospatial model plugin
3
+ // ---------------------------------------------------------------------------
4
+ import { requireNucleus, assertIdentifier } from '../helpers.js';
5
+ // ---------------------------------------------------------------------------
6
+ // Implementation
7
+ // ---------------------------------------------------------------------------
8
+ class GeoModelImpl {
9
+ transport;
10
+ features;
11
+ constructor(transport, features) {
12
+ this.transport = transport;
13
+ this.features = features;
14
+ }
15
+ require() {
16
+ requireNucleus(this.features, 'Geo');
17
+ }
18
+ async distance(a, b) {
19
+ this.require();
20
+ return ((await this.transport.fetchval('SELECT GEO_DISTANCE($1, $2, $3, $4)', [
21
+ a.lat, a.lon, b.lat, b.lon,
22
+ ])) ?? 0);
23
+ }
24
+ async distanceEuclidean(a, b) {
25
+ this.require();
26
+ return ((await this.transport.fetchval('SELECT GEO_DISTANCE_EUCLIDEAN($1, $2, $3, $4)', [
27
+ a.lat, a.lon, b.lat, b.lon,
28
+ ])) ?? 0);
29
+ }
30
+ async within(a, b, radiusMeters) {
31
+ this.require();
32
+ return ((await this.transport.fetchval('SELECT GEO_WITHIN($1, $2, $3, $4, $5)', [
33
+ a.lat, a.lon, b.lat, b.lon, radiusMeters,
34
+ ])) ?? false);
35
+ }
36
+ async area(points) {
37
+ this.require();
38
+ if (points.length < 3)
39
+ throw new Error('GEO_AREA requires at least 3 points');
40
+ const args = [];
41
+ const placeholders = [];
42
+ for (let i = 0; i < points.length; i++) {
43
+ args.push(points[i].lon, points[i].lat);
44
+ placeholders.push(`$${i * 2 + 1}`, `$${i * 2 + 2}`);
45
+ }
46
+ const sql = `SELECT GEO_AREA(${placeholders.join(', ')})`;
47
+ return (await this.transport.fetchval(sql, args)) ?? 0;
48
+ }
49
+ async nearestTo(layer, point, radiusMeters, limit) {
50
+ this.require();
51
+ assertIdentifier(layer, 'layer name');
52
+ const sql = `SELECT id, lat, lon, properties, GEO_DISTANCE($1, $2, lat, lon) AS dist ` +
53
+ `FROM ${layer} ` +
54
+ `WHERE GEO_WITHIN($1, $2, lat, lon, $3) ` +
55
+ `ORDER BY dist LIMIT $4`;
56
+ const result = await this.transport.query(sql, [point.lat, point.lon, radiusMeters, limit]);
57
+ return result.rows.map((r) => ({
58
+ id: r.id,
59
+ lat: Number(r.lat),
60
+ lon: Number(r.lon),
61
+ properties: {
62
+ ...(typeof r.properties === 'string' ? JSON.parse(r.properties) : (r.properties ?? {})),
63
+ distance: Number(r.dist),
64
+ },
65
+ }));
66
+ }
67
+ async withinBBox(layer, minLat, minLon, maxLat, maxLon) {
68
+ this.require();
69
+ assertIdentifier(layer, 'layer name');
70
+ const sql = `SELECT id, lat, lon, properties FROM ${layer} ` +
71
+ `WHERE lat >= $1 AND lat <= $3 AND lon >= $2 AND lon <= $4`;
72
+ const result = await this.transport.query(sql, [minLat, minLon, maxLat, maxLon]);
73
+ return result.rows.map((r) => ({
74
+ id: r.id,
75
+ lat: Number(r.lat),
76
+ lon: Number(r.lon),
77
+ properties: typeof r.properties === 'string' ? JSON.parse(r.properties) : (r.properties ?? {}),
78
+ }));
79
+ }
80
+ async withinPolygon(layer, polygon) {
81
+ this.require();
82
+ assertIdentifier(layer, 'layer name');
83
+ // Build GeoJSON polygon ([lon, lat] coordinate order)
84
+ const coords = polygon.map(([lat, lon]) => [lon, lat]);
85
+ // Close the ring if not already closed
86
+ if (coords.length > 0 &&
87
+ (coords[0][0] !== coords[coords.length - 1][0] || coords[0][1] !== coords[coords.length - 1][1])) {
88
+ coords.push([...coords[0]]);
89
+ }
90
+ const geoJson = JSON.stringify({
91
+ type: 'Polygon',
92
+ coordinates: [coords],
93
+ });
94
+ const sql = `SELECT id, lat, lon, properties FROM ${layer} ` +
95
+ `WHERE ST_CONTAINS(ST_GEOMFROMGEOJSON($1), ST_MAKEPOINT(lon, lat))`;
96
+ const result = await this.transport.query(sql, [geoJson]);
97
+ return result.rows.map((r) => ({
98
+ id: r.id,
99
+ lat: Number(r.lat),
100
+ lon: Number(r.lon),
101
+ properties: typeof r.properties === 'string' ? JSON.parse(r.properties) : (r.properties ?? {}),
102
+ }));
103
+ }
104
+ async insert(layer, lat, lon, props) {
105
+ this.require();
106
+ assertIdentifier(layer, 'layer name');
107
+ const propsJson = JSON.stringify(props);
108
+ await this.transport.execute(`INSERT INTO ${layer} (lat, lon, properties) VALUES ($1, $2, $3)`, [lat, lon, propsJson]);
109
+ }
110
+ }
111
+ // ---------------------------------------------------------------------------
112
+ // Plugin
113
+ // ---------------------------------------------------------------------------
114
+ /** Plugin: adds `.geo` to the client. */
115
+ export const withGeo = {
116
+ name: 'geo',
117
+ init(transport, features) {
118
+ return { geo: new GeoModelImpl(transport, features) };
119
+ },
120
+ };
121
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/geo/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { NucleusPlugin } from '../types.js';
2
+ export type Direction = 'out' | 'in' | 'both';
3
+ export interface GraphNode {
4
+ id: number;
5
+ labels?: string[];
6
+ properties?: Record<string, unknown>;
7
+ }
8
+ export interface GraphEdge {
9
+ id: number;
10
+ type: string;
11
+ fromId: number;
12
+ toId: number;
13
+ properties?: Record<string, unknown>;
14
+ }
15
+ export interface GraphResult {
16
+ columns: string[];
17
+ rows: Record<string, unknown>[];
18
+ }
19
+ export interface GraphModel {
20
+ /** Create a new node with labels and optional properties. Returns the node ID. */
21
+ addNode(labels: string[], props?: Record<string, unknown>): Promise<number>;
22
+ /** Create an edge between two nodes. Returns the edge ID. */
23
+ addEdge(fromId: number, toId: number, edgeType: string, props?: Record<string, unknown>): Promise<number>;
24
+ /** Delete a node by ID. Returns `true` if it existed. */
25
+ deleteNode(nodeId: number): Promise<boolean>;
26
+ /** Delete an edge by ID. Returns `true` if it existed. */
27
+ deleteEdge(edgeId: number): Promise<boolean>;
28
+ /** Execute a Cypher query with optional parameters. */
29
+ query(cypher: string, params?: Record<string, unknown>): Promise<GraphResult>;
30
+ /** Find neighboring nodes, optionally filtered by edge type and direction. */
31
+ neighbors(nodeId: number, edgeType?: string, direction?: Direction): Promise<GraphNode[]>;
32
+ /** Find the shortest path between two nodes. Returns node IDs along the path. */
33
+ shortestPath(fromId: number, toId: number, maxDepth?: number): Promise<number[]>;
34
+ /** Return the total number of nodes. */
35
+ nodeCount(): Promise<number>;
36
+ /** Return the total number of edges. */
37
+ edgeCount(): Promise<number>;
38
+ }
39
+ /** Plugin: adds `.graph` to the client. */
40
+ export declare const withGraph: NucleusPlugin<{
41
+ graph: GraphModel;
42
+ }>;
43
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/graph/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAa,aAAa,EAAmB,MAAM,aAAa,CAAC;AAO7E,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;AAE9C,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CACjC;AAMD,MAAM,WAAW,UAAU;IACzB,kFAAkF;IAClF,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE5E,6DAA6D;IAC7D,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE1G,yDAAyD;IACzD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE7C,0DAA0D;IAC1D,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE7C,uDAAuD;IACvD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAE9E,8EAA8E;IAC9E,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAE1F,iFAAiF;IACjF,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEjF,wCAAwC;IACxC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAE7B,wCAAwC;IACxC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9B;AAmHD,2CAA2C;AAC3C,eAAO,MAAM,SAAS,EAAE,aAAa,CAAC;IAAE,KAAK,EAAE,UAAU,CAAA;CAAE,CAK1D,CAAC"}
@@ -0,0 +1,109 @@
1
+ // ---------------------------------------------------------------------------
2
+ // @neutron/nucleus/graph — Graph model plugin
3
+ // ---------------------------------------------------------------------------
4
+ import { requireNucleus } from '../helpers.js';
5
+ // ---------------------------------------------------------------------------
6
+ // Implementation
7
+ // ---------------------------------------------------------------------------
8
+ class GraphModelImpl {
9
+ transport;
10
+ features;
11
+ constructor(transport, features) {
12
+ this.transport = transport;
13
+ this.features = features;
14
+ }
15
+ require() {
16
+ requireNucleus(this.features, 'Graph');
17
+ }
18
+ async addNode(labels, props) {
19
+ this.require();
20
+ const label = labels.join(':');
21
+ if (props) {
22
+ const propsJson = JSON.stringify(props);
23
+ return (await this.transport.fetchval('SELECT GRAPH_ADD_NODE($1, $2)', [label, propsJson])) ?? 0;
24
+ }
25
+ return (await this.transport.fetchval('SELECT GRAPH_ADD_NODE($1)', [label])) ?? 0;
26
+ }
27
+ async addEdge(fromId, toId, edgeType, props) {
28
+ this.require();
29
+ if (props) {
30
+ const propsJson = JSON.stringify(props);
31
+ return ((await this.transport.fetchval('SELECT GRAPH_ADD_EDGE($1, $2, $3, $4)', [
32
+ fromId,
33
+ toId,
34
+ edgeType,
35
+ propsJson,
36
+ ])) ?? 0);
37
+ }
38
+ return ((await this.transport.fetchval('SELECT GRAPH_ADD_EDGE($1, $2, $3)', [fromId, toId, edgeType])) ?? 0);
39
+ }
40
+ async deleteNode(nodeId) {
41
+ this.require();
42
+ return (await this.transport.fetchval('SELECT GRAPH_DELETE_NODE($1)', [nodeId])) ?? false;
43
+ }
44
+ async deleteEdge(edgeId) {
45
+ this.require();
46
+ return (await this.transport.fetchval('SELECT GRAPH_DELETE_EDGE($1)', [edgeId])) ?? false;
47
+ }
48
+ async query(cypher, params) {
49
+ this.require();
50
+ let raw;
51
+ if (params && Object.keys(params).length > 0) {
52
+ const paramsJson = JSON.stringify(params);
53
+ raw = await this.transport.fetchval('SELECT GRAPH_QUERY($1, $2)', [cypher, paramsJson]);
54
+ }
55
+ else {
56
+ raw = await this.transport.fetchval('SELECT GRAPH_QUERY($1)', [cypher]);
57
+ }
58
+ if (!raw)
59
+ return { columns: [], rows: [] };
60
+ return JSON.parse(raw);
61
+ }
62
+ async neighbors(nodeId, edgeType, direction = 'out') {
63
+ this.require();
64
+ const raw = await this.transport.fetchval('SELECT GRAPH_NEIGHBORS($1, $2)', [nodeId, direction]);
65
+ if (!raw)
66
+ return [];
67
+ const nodes = JSON.parse(raw);
68
+ if (edgeType) {
69
+ return nodes.filter((n) => n.properties?._edge_type === edgeType);
70
+ }
71
+ return nodes;
72
+ }
73
+ async shortestPath(fromId, toId, maxDepth) {
74
+ this.require();
75
+ let raw;
76
+ if (maxDepth && maxDepth > 0) {
77
+ raw = await this.transport.fetchval('SELECT GRAPH_SHORTEST_PATH($1, $2, $3)', [
78
+ fromId,
79
+ toId,
80
+ maxDepth,
81
+ ]);
82
+ }
83
+ else {
84
+ raw = await this.transport.fetchval('SELECT GRAPH_SHORTEST_PATH($1, $2)', [fromId, toId]);
85
+ }
86
+ if (!raw)
87
+ return [];
88
+ return JSON.parse(raw);
89
+ }
90
+ async nodeCount() {
91
+ this.require();
92
+ return (await this.transport.fetchval('SELECT GRAPH_NODE_COUNT()')) ?? 0;
93
+ }
94
+ async edgeCount() {
95
+ this.require();
96
+ return (await this.transport.fetchval('SELECT GRAPH_EDGE_COUNT()')) ?? 0;
97
+ }
98
+ }
99
+ // ---------------------------------------------------------------------------
100
+ // Plugin
101
+ // ---------------------------------------------------------------------------
102
+ /** Plugin: adds `.graph` to the client. */
103
+ export const withGraph = {
104
+ name: 'graph',
105
+ init(transport, features) {
106
+ return { graph: new GraphModelImpl(transport, features) };
107
+ },
108
+ };
109
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/graph/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { NucleusFeatures } from './types.js';
2
+ /**
3
+ * Throw if the server is not Nucleus or the specific feature is unavailable.
4
+ *
5
+ * When connected to plain PostgreSQL, always throws.
6
+ * When connected to Nucleus, checks the granular feature flag so that
7
+ * partially configured instances report the correct error.
8
+ */
9
+ export declare function requireNucleus(features: NucleusFeatures, featureName: string): void;
10
+ export declare function assertIdentifier(name: string, label: string): void;
11
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAoBlD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAQnF;AAQD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIlE"}
@@ -0,0 +1,47 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Nucleus client — shared internal helpers
3
+ // ---------------------------------------------------------------------------
4
+ import { NucleusFeatureError } from './errors.js';
5
+ /** Map from feature name to the corresponding NucleusFeatures key. */
6
+ const FEATURE_KEY_MAP = {
7
+ KV: 'hasKV',
8
+ Vector: 'hasVector',
9
+ TimeSeries: 'hasTimeSeries',
10
+ Document: 'hasDocument',
11
+ Graph: 'hasGraph',
12
+ FTS: 'hasFTS',
13
+ Geo: 'hasGeo',
14
+ Blob: 'hasBlob',
15
+ Streams: 'hasStreams',
16
+ Columnar: 'hasColumnar',
17
+ Datalog: 'hasDatalog',
18
+ CDC: 'hasCDC',
19
+ PubSub: 'hasPubSub',
20
+ };
21
+ /**
22
+ * Throw if the server is not Nucleus or the specific feature is unavailable.
23
+ *
24
+ * When connected to plain PostgreSQL, always throws.
25
+ * When connected to Nucleus, checks the granular feature flag so that
26
+ * partially configured instances report the correct error.
27
+ */
28
+ export function requireNucleus(features, featureName) {
29
+ if (!features.isNucleus) {
30
+ throw new NucleusFeatureError(featureName);
31
+ }
32
+ const key = FEATURE_KEY_MAP[featureName];
33
+ if (key && !features[key]) {
34
+ throw new NucleusFeatureError(featureName);
35
+ }
36
+ }
37
+ /**
38
+ * Validate that `name` is a safe SQL identifier (table/column name).
39
+ * Only allows `[a-zA-Z_][a-zA-Z0-9_]*`.
40
+ */
41
+ const IDENTIFIER_RE = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
42
+ export function assertIdentifier(name, label) {
43
+ if (!IDENTIFIER_RE.test(name)) {
44
+ throw new Error(`Invalid ${label}: ${JSON.stringify(name)}`);
45
+ }
46
+ }
47
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2CAA2C;AAC3C,8EAA8E;AAG9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,sEAAsE;AACtE,MAAM,eAAe,GAA0C;IAC7D,EAAE,EAAE,OAAO;IACX,MAAM,EAAE,WAAW;IACnB,UAAU,EAAE,eAAe;IAC3B,QAAQ,EAAE,aAAa;IACvB,KAAK,EAAE,UAAU;IACjB,GAAG,EAAE,QAAQ;IACb,GAAG,EAAE,QAAQ;IACb,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,YAAY;IACrB,QAAQ,EAAE,aAAa;IACvB,OAAO,EAAE,YAAY;IACrB,GAAG,EAAE,QAAQ;IACb,MAAM,EAAE,WAAW;CACpB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,QAAyB,EAAE,WAAmB;IAC3E,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,GAAG,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IACzC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,aAAa,GAAG,0BAA0B,CAAC;AAEjD,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,KAAa;IAC1D,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
@@ -0,0 +1,39 @@
1
+ export { createClient } from './client.js';
2
+ export type { NucleusClientConfig, NucleusClientBase, NucleusClientBuilder } from './client.js';
3
+ export type { Transport, TransactionTransport, QueryResult, IsolationLevel, NucleusFeatures, NucleusPlugin, } from './types.js';
4
+ export { NucleusError, NucleusConnectionError, NucleusQueryError, NucleusNotFoundError, NucleusConflictError, NucleusTransactionError, NucleusFeatureError, NucleusAuthError, } from './errors.js';
5
+ export { HttpTransport, MobileTransport, EmbeddedTransport, createTransport } from './transport.js';
6
+ export type { TransportConfig, MobileTransportConfig } from './transport.js';
7
+ export { detectFeatures } from './features.js';
8
+ export { requireNucleus, assertIdentifier } from './helpers.js';
9
+ export { migrate, migrateDown, migrationStatus } from './migrate.js';
10
+ export type { Migration, MigrationRecord } from './migrate.js';
11
+ export { withSQL } from './sql/index.js';
12
+ export type { SQLModel } from './sql/index.js';
13
+ export { withKV } from './kv/index.js';
14
+ export type { KVModel, KVSetOptions } from './kv/index.js';
15
+ export { withVector } from './vector/index.js';
16
+ export type { VectorModel, VectorSearchResult, VectorSearchOptions, DistanceMetric } from './vector/index.js';
17
+ export { withTimeSeries } from './timeseries/index.js';
18
+ export type { TimeSeriesModel, TimeSeriesPoint, AggFunc, BucketInterval, TimeSeriesQueryOptions } from './timeseries/index.js';
19
+ export { withDocument } from './document/index.js';
20
+ export type { DocumentModel, DocFindOptions } from './document/index.js';
21
+ export { withGraph } from './graph/index.js';
22
+ export type { GraphModel, GraphNode, GraphEdge, GraphResult, Direction } from './graph/index.js';
23
+ export { withFTS } from './fts/index.js';
24
+ export type { FTSModel, FTSResult, FTSSearchOptions } from './fts/index.js';
25
+ export { withGeo } from './geo/index.js';
26
+ export type { GeoModel, GeoPoint, GeoFeature } from './geo/index.js';
27
+ export { withBlob } from './blob/index.js';
28
+ export type { BlobModel, BlobMeta, BlobPutOptions } from './blob/index.js';
29
+ export { withPubSub } from './pubsub/index.js';
30
+ export type { PubSubModel } from './pubsub/index.js';
31
+ export { withStreams } from './streams/index.js';
32
+ export type { StreamsModel, StreamEntry } from './streams/index.js';
33
+ export { withColumnar } from './columnar/index.js';
34
+ export type { ColumnarModel } from './columnar/index.js';
35
+ export { withDatalog } from './datalog/index.js';
36
+ export type { DatalogModel } from './datalog/index.js';
37
+ export { withCDC } from './cdc/index.js';
38
+ export type { CDCModel } from './cdc/index.js';
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEhG,YAAY,EACV,SAAS,EACT,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,eAAe,EACf,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACpG,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACrE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAQ/D,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE9G,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/H,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEjG,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAE5E,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAErE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,29 @@
1
+ // ---------------------------------------------------------------------------
2
+ // @neutron/nucleus — main entry point
3
+ // ---------------------------------------------------------------------------
4
+ export { createClient } from './client.js';
5
+ export { NucleusError, NucleusConnectionError, NucleusQueryError, NucleusNotFoundError, NucleusConflictError, NucleusTransactionError, NucleusFeatureError, NucleusAuthError, } from './errors.js';
6
+ export { HttpTransport, MobileTransport, EmbeddedTransport, createTransport } from './transport.js';
7
+ export { detectFeatures } from './features.js';
8
+ export { requireNucleus, assertIdentifier } from './helpers.js';
9
+ export { migrate, migrateDown, migrationStatus } from './migrate.js';
10
+ // ---------------------------------------------------------------------------
11
+ // Model plugins — re-exported for convenience.
12
+ // Tree-shakeable: each plugin can also be imported from its own subpath
13
+ // (e.g. `@neutron/nucleus/kv`).
14
+ // ---------------------------------------------------------------------------
15
+ export { withSQL } from './sql/index.js';
16
+ export { withKV } from './kv/index.js';
17
+ export { withVector } from './vector/index.js';
18
+ export { withTimeSeries } from './timeseries/index.js';
19
+ export { withDocument } from './document/index.js';
20
+ export { withGraph } from './graph/index.js';
21
+ export { withFTS } from './fts/index.js';
22
+ export { withGeo } from './geo/index.js';
23
+ export { withBlob } from './blob/index.js';
24
+ export { withPubSub } from './pubsub/index.js';
25
+ export { withStreams } from './streams/index.js';
26
+ export { withColumnar } from './columnar/index.js';
27
+ export { withDatalog } from './datalog/index.js';
28
+ export { withCDC } from './cdc/index.js';
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,sCAAsC;AACtC,8EAA8E;AAE9E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAY3C,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEpG,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGrE,8EAA8E;AAC9E,+CAA+C;AAC/C,wEAAwE;AACxE,gCAAgC;AAChC,8EAA8E;AAE9E,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAGvC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG3C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,93 @@
1
+ import type { NucleusPlugin } from '../types.js';
2
+ export interface KVSetOptions {
3
+ /** Time-to-live in seconds. */
4
+ ttl?: number;
5
+ /** Key namespace prefix (prepended as `namespace:key`). */
6
+ namespace?: string;
7
+ }
8
+ export interface KVModel {
9
+ /** Get a raw string value. Returns `null` if the key does not exist. */
10
+ get(key: string): Promise<string | null>;
11
+ /** Get a value and JSON-parse it into `T`. Returns `null` if missing. */
12
+ getTyped<T>(key: string): Promise<T | null>;
13
+ /** Set a raw string value. */
14
+ set(key: string, value: string, opts?: KVSetOptions): Promise<void>;
15
+ /** JSON-stringify `value` and store it. */
16
+ setTyped<T>(key: string, value: T, opts?: KVSetOptions): Promise<void>;
17
+ /** Set the key only if it does not already exist. Returns `true` if set. */
18
+ setNX(key: string, value: string): Promise<boolean>;
19
+ /** Delete a key. Returns `true` if it existed. */
20
+ delete(key: string): Promise<boolean>;
21
+ /** Check whether a key exists. */
22
+ exists(key: string): Promise<boolean>;
23
+ /** Atomically increment a key's integer value. Returns the new value. */
24
+ incr(key: string, amount?: number): Promise<number>;
25
+ /** Get the remaining TTL in seconds. -1 = no TTL, -2 = missing key. */
26
+ ttl(key: string): Promise<number>;
27
+ /** Set a TTL on an existing key. Returns `true` if the key existed. */
28
+ expire(key: string, seconds: number): Promise<boolean>;
29
+ /** Return the total number of keys. */
30
+ dbSize(): Promise<number>;
31
+ /** Delete all keys. */
32
+ flushDB(): Promise<void>;
33
+ /** Scan keys matching a pattern. Returns matching key-value pairs. */
34
+ scan(pattern: string, count?: number): Promise<Array<{
35
+ key: string;
36
+ value: string;
37
+ }>>;
38
+ /** Prepend a value to a list. Returns the new list length. */
39
+ lpush(key: string, value: string): Promise<number>;
40
+ /** Append a value to a list. Returns the new list length. */
41
+ rpush(key: string, value: string): Promise<number>;
42
+ /** Remove and return the first element of a list. */
43
+ lpop(key: string): Promise<string | null>;
44
+ /** Remove and return the last element of a list. */
45
+ rpop(key: string): Promise<string | null>;
46
+ /** Return elements between `start` and `stop` (inclusive). */
47
+ lrange(key: string, start: number, stop: number): Promise<string[]>;
48
+ /** Return the length of a list. */
49
+ llen(key: string): Promise<number>;
50
+ /** Return the element at `index`. */
51
+ lindex(key: string, index: number): Promise<string | null>;
52
+ /** Set a field in a hash. Returns `true` if the field is new. */
53
+ hset(key: string, field: string, value: string): Promise<boolean>;
54
+ /** Get a hash field value. */
55
+ hget(key: string, field: string): Promise<string | null>;
56
+ /** Remove a field from a hash. Returns `true` if removed. */
57
+ hdel(key: string, field: string): Promise<boolean>;
58
+ /** Check if a field exists in a hash. */
59
+ hexists(key: string, field: string): Promise<boolean>;
60
+ /** Return all fields and values of a hash. */
61
+ hgetall(key: string): Promise<Record<string, string>>;
62
+ /** Return the number of fields in a hash. */
63
+ hlen(key: string): Promise<number>;
64
+ /** Add a member to a set. Returns `true` if it was new. */
65
+ sadd(key: string, member: string): Promise<boolean>;
66
+ /** Remove a member from a set. Returns `true` if removed. */
67
+ srem(key: string, member: string): Promise<boolean>;
68
+ /** Return all members of a set. */
69
+ smembers(key: string): Promise<string[]>;
70
+ /** Check if a member exists in a set. */
71
+ sismember(key: string, member: string): Promise<boolean>;
72
+ /** Return the number of members in a set. */
73
+ scard(key: string): Promise<number>;
74
+ /** Add a member with a score to a sorted set. Returns `true` if new. */
75
+ zadd(key: string, score: number, member: string): Promise<boolean>;
76
+ /** Return members by rank range. */
77
+ zrange(key: string, start: number, stop: number): Promise<string[]>;
78
+ /** Return members with scores between `min` and `max`. */
79
+ zrangeByScore(key: string, min: number, max: number): Promise<string[]>;
80
+ /** Remove a member from a sorted set. Returns `true` if removed. */
81
+ zrem(key: string, member: string): Promise<boolean>;
82
+ /** Return the number of members in a sorted set. */
83
+ zcard(key: string): Promise<number>;
84
+ /** Add an element to a HyperLogLog. Returns `true` if the internal state changed. */
85
+ pfadd(key: string, element: string): Promise<boolean>;
86
+ /** Return the approximate cardinality. */
87
+ pfcount(key: string): Promise<number>;
88
+ }
89
+ /** Plugin: adds `.kv` to the client. */
90
+ export declare const withKV: NucleusPlugin<{
91
+ kv: KVModel;
92
+ }>;
93
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/kv/index.ts"],"names":[],"mappings":"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"}