@plurnk/plurnk-execs-sqlite 1.0.5 → 1.0.7
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/README.md +1 -1
- package/dist/Sqlite.d.ts.map +1 -1
- package/dist/Sqlite.js +15 -2
- package/dist/Sqlite.js.map +1 -1
- package/docs/sqlite.md +3 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@ A `@plurnk/plurnk-execs-*` sibling built on the [plurnk-execs](https://github.co
|
|
|
15
15
|
The EXEC target slot is the database file; with no target it defaults to an ephemeral in-memory db:
|
|
16
16
|
|
|
17
17
|
```
|
|
18
|
-
<<EXEC[sqlite]:SELECT * FROM users:EXEC → :memory: (fresh per
|
|
18
|
+
<<EXEC[sqlite]:SELECT * FROM users:EXEC → :memory: (fresh per worker)
|
|
19
19
|
<<EXEC[sqlite](./app.db):SELECT * FROM users:EXEC → ./app.db (persistent)
|
|
20
20
|
```
|
|
21
21
|
|
package/dist/Sqlite.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sqlite.d.ts","sourceRoot":"","sources":["../src/Sqlite.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"Sqlite.d.ts","sourceRoot":"","sources":["../src/Sqlite.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAoC3G,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,YAAY;IAC5C,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAEpD;IAGc,KAAK,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAEnD;IAIQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE7C;IAEK,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CA4ChG;CACJ"}
|
package/dist/Sqlite.js
CHANGED
|
@@ -13,6 +13,9 @@ const dbPath = (cwd, target) => {
|
|
|
13
13
|
// node:sqlite can return bigint for large integers; stringify them so the
|
|
14
14
|
// JSON output is always serializable.
|
|
15
15
|
const jsonReplacer = (_key, value) => (typeof value === "bigint" ? value.toString() : value);
|
|
16
|
+
// SQL line (`-- …`) and block (`/* … */`) comments, for judging whether a
|
|
17
|
+
// post-statement tail holds real SQL or just trivia.
|
|
18
|
+
const stripComments = (sql) => sql.replace(/--[^\n]*/g, "").replace(/\/\*[\s\S]*?\*\//g, "");
|
|
16
19
|
// In-process SQLite executor (a logical runtime, not subprocess). Runs one SQL
|
|
17
20
|
// statement via node:sqlite against the EXEC target db — defaulting to an
|
|
18
21
|
// ephemeral `:memory:` when no target is given — and writes the result to the
|
|
@@ -51,10 +54,10 @@ export default class Sqlite extends BaseExecutor {
|
|
|
51
54
|
}
|
|
52
55
|
const path = dbPath(cwd, target);
|
|
53
56
|
const sql = command.trim();
|
|
54
|
-
const fail = (kind, message) => {
|
|
57
|
+
const fail = (kind, message, status = 500) => {
|
|
55
58
|
emit({ source: "exec:sqlite", kind, message });
|
|
56
59
|
setState("results", "errored");
|
|
57
|
-
return { status
|
|
60
|
+
return { status };
|
|
58
61
|
};
|
|
59
62
|
let db;
|
|
60
63
|
try {
|
|
@@ -65,6 +68,16 @@ export default class Sqlite extends BaseExecutor {
|
|
|
65
68
|
}
|
|
66
69
|
try {
|
|
67
70
|
const stmt = db.prepare(sql);
|
|
71
|
+
// One statement per op is the contract (the results channel is one JSON
|
|
72
|
+
// doc) — but SQLite's prepare compiles only the FIRST statement and
|
|
73
|
+
// silently ignores the rest, so a sqlite3-CLI-style script would
|
|
74
|
+
// partially execute under a 200 (#493). sourceSQL is the compiled
|
|
75
|
+
// statement's own text: any real SQL left after it is a dropped tail —
|
|
76
|
+
// fail-hard, never truncate silently. Trailing whitespace/comments pass.
|
|
77
|
+
const tail = stripComments(sql.slice(stmt.sourceSQL.length)).trim();
|
|
78
|
+
if (tail !== "") {
|
|
79
|
+
return fail("sqlite_multi_statement", `one SQL statement per op — the tail '${tail.slice(0, 60)}' would be silently dropped; split into one op per statement`, 400);
|
|
80
|
+
}
|
|
68
81
|
// Non-empty columns ⇒ a row-returning statement; empty ⇒ a mutation.
|
|
69
82
|
const output = stmt.columns().length > 0 ? stmt.all() : stmt.run();
|
|
70
83
|
write("results", JSON.stringify(output, jsonReplacer));
|
package/dist/Sqlite.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sqlite.js","sourceRoot":"","sources":["../src/Sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,MAAM,MAAM,GAAG,UAAU,CAAC;AAE1B,0EAA0E;AAC1E,sEAAsE;AACtE,iEAAiE;AACjE,MAAM,MAAM,GAAG,CAAC,GAAkB,EAAE,MAAqB,EAAU,EAAE;IACjE,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACxD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,0EAA0E;AAC1E,sCAAsC;AACtC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,KAAc,EAAW,EAAE,CAC3D,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAE3D,+EAA+E;AAC/E,0EAA0E;AAC1E,8EAA8E;AAC9E,8EAA8E;AAC9E,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,8DAA8D;AAC9D,EAAE;AACF,8EAA8E;AAC9E,gFAAgF;AAChF,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,YAAY;IAC5C,IAAI,QAAQ;QACR,OAAO,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EAAE,CAAC;IACzD,CAAC;IAED,mEAAmE;IAC1D,KAAK,CAAC,KAAK;QAChB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACtD,CAAC;IAED,uEAAuE;IACvE,+DAA+D;IACtD,MAAM,CAAC,MAAqB;QACjC,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAY;QACvE,6EAA6E;QAC7E,2EAA2E;QAC3E,6EAA6E;QAC7E,gCAAgC;QAChC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAAC,CAAC;QAC/E,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,OAAe,EAAc,EAAE;
|
|
1
|
+
{"version":3,"file":"Sqlite.js","sourceRoot":"","sources":["../src/Sqlite.ts"],"names":[],"mappings":"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"}
|
package/docs/sqlite.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# sqlite
|
|
2
2
|
|
|
3
|
-
Runs one SQL statement in-process via `node:sqlite` and writes the result to the `results` channel as `application/json` — ready for a jsonpath body-matcher.
|
|
3
|
+
Runs **one SQL statement** in-process via `node:sqlite` and writes the result to the `results` channel as `application/json` — ready for a jsonpath body-matcher.
|
|
4
|
+
|
|
5
|
+
One statement per op is **enforced**: a `sqlite3`-style multi-statement script fails with `sqlite_multi_statement` (400) naming the dropped tail — SQLite compiles only the first statement, and partial execution must never pass as success (#493). Split scripts into one op per statement. Trailing semicolons and comments are fine. Dot-commands (`.tables`, `.schema`) are sqlite3-shell features, not SQL — use their SQL equivalents (`SELECT name FROM sqlite_master`).
|
|
4
6
|
|
|
5
7
|
## Database target
|
|
6
8
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plurnk/plurnk-execs-sqlite",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "SQLite runtime executor for plurnk-service's exec scheme — runs the sqlite runtime tag in-process via node:sqlite, results as application/json.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"plurnk",
|
|
@@ -59,6 +59,6 @@
|
|
|
59
59
|
"prepack": "npm run build"
|
|
60
60
|
},
|
|
61
61
|
"peerDependencies": {
|
|
62
|
-
"@plurnk/plurnk-execs": "1.0.
|
|
62
|
+
"@plurnk/plurnk-execs": "1.0.7"
|
|
63
63
|
}
|
|
64
64
|
}
|