frogql 0.2.0-rc.2 → 0.2.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/CHANGELOG.md CHANGED
@@ -8,6 +8,17 @@ Released in lock-step with the [PyPI `frogql` package](https://pypi.org/project/
8
8
 
9
9
  ## [Unreleased]
10
10
 
11
+ ## [0.2.0-rc.3] — 2026-05-12
12
+
13
+ ### Fixed
14
+
15
+ - Host package now ships `index.js` and `index.d.ts`. The `0.2.0-rc.2` tarball uploaded those files as build artifacts only and they never reached the publish job, so the package on npm contained README + LICENSE + package.json with no JavaScript. `require('frogql')` returned `Cannot find module './index.js'` for every consumer.
16
+ - Both files are now checked into git (canonical napi-rs pattern). Removed from `node/.gitignore`.
17
+
18
+ ### Deprecated
19
+
20
+ - `frogql@0.2.0-rc.2` — broken, use `frogql@0.2.0-rc.3` or later.
21
+
11
22
  ## [0.2.0-rc.2] — 2026-05-12
12
23
 
13
24
  ### Added
package/index.d.ts ADDED
@@ -0,0 +1,147 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+
4
+ /* auto-generated by NAPI-RS */
5
+
6
+ /** Result of `Connection.schema()`. */
7
+ export interface SchemaSummary {
8
+ nodeLabels: Array<string>
9
+ edgeLabels: Array<string>
10
+ nodeCount: number
11
+ edgeCount: number
12
+ }
13
+ /** One entry in `Connection.graphTypes()`. */
14
+ export interface GraphTypeSummary {
15
+ name: string
16
+ active: boolean
17
+ /** Number of node types declared in this graph type, if known. */
18
+ nodes?: number
19
+ /** Number of edge types declared in this graph type, if known. */
20
+ edges?: number
21
+ }
22
+ /**
23
+ * Shape of a node reference inside an `execute()` row. `kind` is
24
+ * always `"node"`. Cast `execute()` rows to `{ x: NodeRef }` etc.
25
+ */
26
+ export interface NodeRef {
27
+ kind: string
28
+ id: number
29
+ labels: Array<string>
30
+ /**
31
+ * Free-form property bag. Values are JSON-compatible (number /
32
+ * string / boolean / null / nested object / array).
33
+ */
34
+ props: any
35
+ }
36
+ /**
37
+ * Shape of an edge reference inside an `execute()` row. `kind` is
38
+ * always `"edge"`. `props` is present when returned via `RETURN e`
39
+ * (top-level `Value::Edge`); omitted in path context to keep payloads
40
+ * small.
41
+ */
42
+ export interface EdgeRef {
43
+ kind: string
44
+ id: number
45
+ labels: Array<string>
46
+ props?: any
47
+ }
48
+ /**
49
+ * Counters returned from a successful DML statement (INSERT / SET /
50
+ * REMOVE / DELETE / DETACH DELETE).
51
+ */
52
+ export interface DmCounters {
53
+ nodesInserted: number
54
+ edgesInserted: number
55
+ nodesDeleted: number
56
+ edgesDeleted: number
57
+ nodesModified: number
58
+ edgesModified: number
59
+ rows: number
60
+ }
61
+ /** Result envelope for `CREATE / USE / DROP GRAPH TYPE`. */
62
+ export interface DdlOk {
63
+ ok: boolean
64
+ /** Always `"ddl"` for catalog statements. */
65
+ kind: string
66
+ message: string
67
+ }
68
+ /** Result envelope for `CREATE / DROP INDEX`. */
69
+ export interface IndexResult {
70
+ ok: boolean
71
+ /** Always `"index"`. */
72
+ kind: string
73
+ name: string
74
+ /** Present on CREATE, absent on DROP. */
75
+ label?: string
76
+ /** Present on CREATE, absent on DROP. */
77
+ prop?: string
78
+ /** `"HASH"` or `"BTREE"`. Present on CREATE only. */
79
+ indexKind?: string
80
+ /** Number of (label, prop) entries indexed. Present on CREATE only. */
81
+ entries?: number
82
+ /** Present when DROP failed (index not found). */
83
+ error?: string
84
+ }
85
+ /** One entry in `SHOW INDEXES`. */
86
+ export interface IndexSummary {
87
+ name: string
88
+ label: string
89
+ prop: string
90
+ /** `"HASH"` or `"BTREE"`. */
91
+ kind: string
92
+ /**
93
+ * `true` for auto-built indexes (memory-only), `false` for
94
+ * DDL-declared (persisted in `.gdb`).
95
+ */
96
+ auto: boolean
97
+ entries: number
98
+ }
99
+ /**
100
+ * Open or create a `.gdb` database. Eagerly warms the LTJ TripleIndex
101
+ * so the first `execute()` on the returned Connection runs at warm
102
+ * cache speed.
103
+ */
104
+ export declare function open(path: string): Connection
105
+ /**
106
+ * Import a JSON graph (`{nodes: [...], edges: [...]}`) into a fresh
107
+ * `.gdb` at `dbPath`. Overwrites the destination.
108
+ */
109
+ export declare function importJson(dbPath: string, jsonPath: string): void
110
+ /**
111
+ * Import a directory of CSVs (configured via `spanner_import_config.json`)
112
+ * into a fresh `.gdb` at `dbPath`. Overwrites the destination.
113
+ */
114
+ export declare function importCsv(dbPath: string, csvDir: string): void
115
+ export declare class Connection {
116
+ get nodeCount(): number
117
+ get edgeCount(): number
118
+ /**
119
+ * Run a GQL statement. The return is polymorphic — depends on
120
+ * statement kind:
121
+ * - Query with RETURN: `Array<Record<string, unknown>>` keyed by alias
122
+ * - Query without RETURN: `Array<{ _paths, ...vars }>`
123
+ * - CREATE / USE / DROP GRAPH TYPE: `DdlOk`
124
+ * - SHOW GRAPH TYPES: `Array<GraphTypeSummary>`
125
+ * - SHOW GRAPH TYPE / SHOW CURRENT GRAPH TYPE / VALIDATE GRAPH TYPE: object
126
+ * - CREATE / DROP INDEX: `IndexResult`
127
+ * - SHOW INDEXES: `Array<IndexSummary>`
128
+ * - DML: `DmCounters`
129
+ *
130
+ * Cast the return to the expected shape:
131
+ * `const rows = conn.execute("MATCH ...") as Array<{ x: NodeRef }>`
132
+ */
133
+ execute(query: string, limit?: number | undefined | null): unknown
134
+ /**
135
+ * Persist the merged base+overlay state back to the file the
136
+ * connection was opened from. Mirrors `.save` REPL command and
137
+ * SQLite's explicit-save model.
138
+ */
139
+ save(): void
140
+ /** List graph types currently in the catalog with active markers. */
141
+ graphTypes(): Array<GraphTypeSummary>
142
+ /**
143
+ * Lightweight schema summary derived from the live graph: sorted
144
+ * label sets + node / edge counts. Does NOT consult the catalog.
145
+ */
146
+ schema(): SchemaSummary
147
+ }
package/index.js ADDED
@@ -0,0 +1,318 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ /* prettier-ignore */
4
+
5
+ /* auto-generated by NAPI-RS */
6
+
7
+ const { existsSync, readFileSync } = require('fs')
8
+ const { join } = require('path')
9
+
10
+ const { platform, arch } = process
11
+
12
+ let nativeBinding = null
13
+ let localFileExisted = false
14
+ let loadError = null
15
+
16
+ function isMusl() {
17
+ // For Node 10
18
+ if (!process.report || typeof process.report.getReport !== 'function') {
19
+ try {
20
+ const lddPath = require('child_process').execSync('which ldd').toString().trim()
21
+ return readFileSync(lddPath, 'utf8').includes('musl')
22
+ } catch (e) {
23
+ return true
24
+ }
25
+ } else {
26
+ const { glibcVersionRuntime } = process.report.getReport().header
27
+ return !glibcVersionRuntime
28
+ }
29
+ }
30
+
31
+ switch (platform) {
32
+ case 'android':
33
+ switch (arch) {
34
+ case 'arm64':
35
+ localFileExisted = existsSync(join(__dirname, 'frogql.android-arm64.node'))
36
+ try {
37
+ if (localFileExisted) {
38
+ nativeBinding = require('./frogql.android-arm64.node')
39
+ } else {
40
+ nativeBinding = require('frogql-android-arm64')
41
+ }
42
+ } catch (e) {
43
+ loadError = e
44
+ }
45
+ break
46
+ case 'arm':
47
+ localFileExisted = existsSync(join(__dirname, 'frogql.android-arm-eabi.node'))
48
+ try {
49
+ if (localFileExisted) {
50
+ nativeBinding = require('./frogql.android-arm-eabi.node')
51
+ } else {
52
+ nativeBinding = require('frogql-android-arm-eabi')
53
+ }
54
+ } catch (e) {
55
+ loadError = e
56
+ }
57
+ break
58
+ default:
59
+ throw new Error(`Unsupported architecture on Android ${arch}`)
60
+ }
61
+ break
62
+ case 'win32':
63
+ switch (arch) {
64
+ case 'x64':
65
+ localFileExisted = existsSync(
66
+ join(__dirname, 'frogql.win32-x64-msvc.node')
67
+ )
68
+ try {
69
+ if (localFileExisted) {
70
+ nativeBinding = require('./frogql.win32-x64-msvc.node')
71
+ } else {
72
+ nativeBinding = require('frogql-win32-x64-msvc')
73
+ }
74
+ } catch (e) {
75
+ loadError = e
76
+ }
77
+ break
78
+ case 'ia32':
79
+ localFileExisted = existsSync(
80
+ join(__dirname, 'frogql.win32-ia32-msvc.node')
81
+ )
82
+ try {
83
+ if (localFileExisted) {
84
+ nativeBinding = require('./frogql.win32-ia32-msvc.node')
85
+ } else {
86
+ nativeBinding = require('frogql-win32-ia32-msvc')
87
+ }
88
+ } catch (e) {
89
+ loadError = e
90
+ }
91
+ break
92
+ case 'arm64':
93
+ localFileExisted = existsSync(
94
+ join(__dirname, 'frogql.win32-arm64-msvc.node')
95
+ )
96
+ try {
97
+ if (localFileExisted) {
98
+ nativeBinding = require('./frogql.win32-arm64-msvc.node')
99
+ } else {
100
+ nativeBinding = require('frogql-win32-arm64-msvc')
101
+ }
102
+ } catch (e) {
103
+ loadError = e
104
+ }
105
+ break
106
+ default:
107
+ throw new Error(`Unsupported architecture on Windows: ${arch}`)
108
+ }
109
+ break
110
+ case 'darwin':
111
+ localFileExisted = existsSync(join(__dirname, 'frogql.darwin-universal.node'))
112
+ try {
113
+ if (localFileExisted) {
114
+ nativeBinding = require('./frogql.darwin-universal.node')
115
+ } else {
116
+ nativeBinding = require('frogql-darwin-universal')
117
+ }
118
+ break
119
+ } catch {}
120
+ switch (arch) {
121
+ case 'x64':
122
+ localFileExisted = existsSync(join(__dirname, 'frogql.darwin-x64.node'))
123
+ try {
124
+ if (localFileExisted) {
125
+ nativeBinding = require('./frogql.darwin-x64.node')
126
+ } else {
127
+ nativeBinding = require('frogql-darwin-x64')
128
+ }
129
+ } catch (e) {
130
+ loadError = e
131
+ }
132
+ break
133
+ case 'arm64':
134
+ localFileExisted = existsSync(
135
+ join(__dirname, 'frogql.darwin-arm64.node')
136
+ )
137
+ try {
138
+ if (localFileExisted) {
139
+ nativeBinding = require('./frogql.darwin-arm64.node')
140
+ } else {
141
+ nativeBinding = require('frogql-darwin-arm64')
142
+ }
143
+ } catch (e) {
144
+ loadError = e
145
+ }
146
+ break
147
+ default:
148
+ throw new Error(`Unsupported architecture on macOS: ${arch}`)
149
+ }
150
+ break
151
+ case 'freebsd':
152
+ if (arch !== 'x64') {
153
+ throw new Error(`Unsupported architecture on FreeBSD: ${arch}`)
154
+ }
155
+ localFileExisted = existsSync(join(__dirname, 'frogql.freebsd-x64.node'))
156
+ try {
157
+ if (localFileExisted) {
158
+ nativeBinding = require('./frogql.freebsd-x64.node')
159
+ } else {
160
+ nativeBinding = require('frogql-freebsd-x64')
161
+ }
162
+ } catch (e) {
163
+ loadError = e
164
+ }
165
+ break
166
+ case 'linux':
167
+ switch (arch) {
168
+ case 'x64':
169
+ if (isMusl()) {
170
+ localFileExisted = existsSync(
171
+ join(__dirname, 'frogql.linux-x64-musl.node')
172
+ )
173
+ try {
174
+ if (localFileExisted) {
175
+ nativeBinding = require('./frogql.linux-x64-musl.node')
176
+ } else {
177
+ nativeBinding = require('frogql-linux-x64-musl')
178
+ }
179
+ } catch (e) {
180
+ loadError = e
181
+ }
182
+ } else {
183
+ localFileExisted = existsSync(
184
+ join(__dirname, 'frogql.linux-x64-gnu.node')
185
+ )
186
+ try {
187
+ if (localFileExisted) {
188
+ nativeBinding = require('./frogql.linux-x64-gnu.node')
189
+ } else {
190
+ nativeBinding = require('frogql-linux-x64-gnu')
191
+ }
192
+ } catch (e) {
193
+ loadError = e
194
+ }
195
+ }
196
+ break
197
+ case 'arm64':
198
+ if (isMusl()) {
199
+ localFileExisted = existsSync(
200
+ join(__dirname, 'frogql.linux-arm64-musl.node')
201
+ )
202
+ try {
203
+ if (localFileExisted) {
204
+ nativeBinding = require('./frogql.linux-arm64-musl.node')
205
+ } else {
206
+ nativeBinding = require('frogql-linux-arm64-musl')
207
+ }
208
+ } catch (e) {
209
+ loadError = e
210
+ }
211
+ } else {
212
+ localFileExisted = existsSync(
213
+ join(__dirname, 'frogql.linux-arm64-gnu.node')
214
+ )
215
+ try {
216
+ if (localFileExisted) {
217
+ nativeBinding = require('./frogql.linux-arm64-gnu.node')
218
+ } else {
219
+ nativeBinding = require('frogql-linux-arm64-gnu')
220
+ }
221
+ } catch (e) {
222
+ loadError = e
223
+ }
224
+ }
225
+ break
226
+ case 'arm':
227
+ if (isMusl()) {
228
+ localFileExisted = existsSync(
229
+ join(__dirname, 'frogql.linux-arm-musleabihf.node')
230
+ )
231
+ try {
232
+ if (localFileExisted) {
233
+ nativeBinding = require('./frogql.linux-arm-musleabihf.node')
234
+ } else {
235
+ nativeBinding = require('frogql-linux-arm-musleabihf')
236
+ }
237
+ } catch (e) {
238
+ loadError = e
239
+ }
240
+ } else {
241
+ localFileExisted = existsSync(
242
+ join(__dirname, 'frogql.linux-arm-gnueabihf.node')
243
+ )
244
+ try {
245
+ if (localFileExisted) {
246
+ nativeBinding = require('./frogql.linux-arm-gnueabihf.node')
247
+ } else {
248
+ nativeBinding = require('frogql-linux-arm-gnueabihf')
249
+ }
250
+ } catch (e) {
251
+ loadError = e
252
+ }
253
+ }
254
+ break
255
+ case 'riscv64':
256
+ if (isMusl()) {
257
+ localFileExisted = existsSync(
258
+ join(__dirname, 'frogql.linux-riscv64-musl.node')
259
+ )
260
+ try {
261
+ if (localFileExisted) {
262
+ nativeBinding = require('./frogql.linux-riscv64-musl.node')
263
+ } else {
264
+ nativeBinding = require('frogql-linux-riscv64-musl')
265
+ }
266
+ } catch (e) {
267
+ loadError = e
268
+ }
269
+ } else {
270
+ localFileExisted = existsSync(
271
+ join(__dirname, 'frogql.linux-riscv64-gnu.node')
272
+ )
273
+ try {
274
+ if (localFileExisted) {
275
+ nativeBinding = require('./frogql.linux-riscv64-gnu.node')
276
+ } else {
277
+ nativeBinding = require('frogql-linux-riscv64-gnu')
278
+ }
279
+ } catch (e) {
280
+ loadError = e
281
+ }
282
+ }
283
+ break
284
+ case 's390x':
285
+ localFileExisted = existsSync(
286
+ join(__dirname, 'frogql.linux-s390x-gnu.node')
287
+ )
288
+ try {
289
+ if (localFileExisted) {
290
+ nativeBinding = require('./frogql.linux-s390x-gnu.node')
291
+ } else {
292
+ nativeBinding = require('frogql-linux-s390x-gnu')
293
+ }
294
+ } catch (e) {
295
+ loadError = e
296
+ }
297
+ break
298
+ default:
299
+ throw new Error(`Unsupported architecture on Linux: ${arch}`)
300
+ }
301
+ break
302
+ default:
303
+ throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`)
304
+ }
305
+
306
+ if (!nativeBinding) {
307
+ if (loadError) {
308
+ throw loadError
309
+ }
310
+ throw new Error(`Failed to load native binding`)
311
+ }
312
+
313
+ const { Connection, open, importJson, importCsv } = nativeBinding
314
+
315
+ module.exports.Connection = Connection
316
+ module.exports.open = open
317
+ module.exports.importJson = importJson
318
+ module.exports.importCsv = importCsv
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "frogql",
3
- "version": "0.2.0-rc.2",
3
+ "version": "0.2.1",
4
4
  "description": "froGQL — embedded GQL graph database with ISO GQL path patterns (Rust core, Node.js bindings via napi-rs)",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -65,10 +65,10 @@
65
65
  "provenance": true
66
66
  },
67
67
  "optionalDependencies": {
68
- "frogql-darwin-x64": "0.2.0-rc.2",
69
- "frogql-darwin-arm64": "0.2.0-rc.2",
70
- "frogql-linux-x64-gnu": "0.2.0-rc.2",
71
- "frogql-linux-arm64-gnu": "0.2.0-rc.2",
72
- "frogql-win32-x64-msvc": "0.2.0-rc.2"
68
+ "frogql-darwin-x64": "0.2.1",
69
+ "frogql-darwin-arm64": "0.2.1",
70
+ "frogql-linux-x64-gnu": "0.2.1",
71
+ "frogql-linux-arm64-gnu": "0.2.1",
72
+ "frogql-win32-x64-msvc": "0.2.1"
73
73
  }
74
74
  }