@letsrunit/store 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.
- package/dist/index.d.ts +13 -0
- package/dist/index.js +75 -0
- package/dist/index.js.map +1 -0
- package/package.json +60 -0
- package/src/db.ts +48 -0
- package/src/index.ts +2 -0
- package/src/read.ts +2 -0
- package/src/write.ts +29 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
|
|
3
|
+
declare function openStore(path?: string): Database.Database;
|
|
4
|
+
|
|
5
|
+
declare function insertSession(db: Database.Database, id: string, gitCommit: string | null, startedAt: number): void;
|
|
6
|
+
declare function upsertFeature(db: Database.Database, id: string, path: string, name: string): void;
|
|
7
|
+
declare function upsertScenario(db: Database.Database, id: string, featureId: string, name: string): void;
|
|
8
|
+
declare function upsertStep(db: Database.Database, id: string, scenarioId: string, idx: number, text: string): void;
|
|
9
|
+
declare function insertRun(db: Database.Database, id: string, sessionId: string, scenarioId: string, startedAt: number): void;
|
|
10
|
+
declare function finaliseRun(db: Database.Database, id: string, status: string, failedStepId?: string, error?: string): void;
|
|
11
|
+
declare function insertArtifact(db: Database.Database, id: string, runId: string, stepId: string, filename: string): void;
|
|
12
|
+
|
|
13
|
+
export { finaliseRun, insertArtifact, insertRun, insertSession, openStore, upsertFeature, upsertScenario, upsertStep };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
|
|
3
|
+
// src/db.ts
|
|
4
|
+
var SCHEMA = `
|
|
5
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
6
|
+
id TEXT PRIMARY KEY,
|
|
7
|
+
started_at INTEGER NOT NULL,
|
|
8
|
+
git_commit TEXT
|
|
9
|
+
);
|
|
10
|
+
CREATE TABLE IF NOT EXISTS features (
|
|
11
|
+
id TEXT PRIMARY KEY,
|
|
12
|
+
path TEXT NOT NULL,
|
|
13
|
+
name TEXT NOT NULL
|
|
14
|
+
);
|
|
15
|
+
CREATE TABLE IF NOT EXISTS scenarios (
|
|
16
|
+
id TEXT PRIMARY KEY,
|
|
17
|
+
feature_id TEXT NOT NULL REFERENCES features(id),
|
|
18
|
+
name TEXT NOT NULL
|
|
19
|
+
);
|
|
20
|
+
CREATE TABLE IF NOT EXISTS steps (
|
|
21
|
+
id TEXT PRIMARY KEY,
|
|
22
|
+
scenario_id TEXT NOT NULL REFERENCES scenarios(id),
|
|
23
|
+
idx INTEGER NOT NULL,
|
|
24
|
+
text TEXT NOT NULL
|
|
25
|
+
);
|
|
26
|
+
CREATE TABLE IF NOT EXISTS runs (
|
|
27
|
+
id TEXT PRIMARY KEY,
|
|
28
|
+
session_id TEXT NOT NULL REFERENCES sessions(id),
|
|
29
|
+
scenario_id TEXT NOT NULL REFERENCES scenarios(id),
|
|
30
|
+
status TEXT NOT NULL DEFAULT 'running',
|
|
31
|
+
failed_step_id TEXT REFERENCES steps(id),
|
|
32
|
+
error TEXT,
|
|
33
|
+
started_at INTEGER NOT NULL
|
|
34
|
+
);
|
|
35
|
+
CREATE TABLE IF NOT EXISTS artifacts (
|
|
36
|
+
id TEXT PRIMARY KEY,
|
|
37
|
+
run_id TEXT NOT NULL REFERENCES runs(id),
|
|
38
|
+
step_id TEXT NOT NULL REFERENCES steps(id),
|
|
39
|
+
filename TEXT NOT NULL
|
|
40
|
+
);
|
|
41
|
+
`;
|
|
42
|
+
function openStore(path = ".letsrunit/letsrunit.db") {
|
|
43
|
+
const db = new Database(path);
|
|
44
|
+
db.pragma("journal_mode = WAL");
|
|
45
|
+
db.pragma("foreign_keys = ON");
|
|
46
|
+
db.exec(SCHEMA);
|
|
47
|
+
return db;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// src/write.ts
|
|
51
|
+
function insertSession(db, id, gitCommit, startedAt) {
|
|
52
|
+
db.prepare("INSERT OR IGNORE INTO sessions (id, started_at, git_commit) VALUES (?, ?, ?)").run(id, startedAt, gitCommit);
|
|
53
|
+
}
|
|
54
|
+
function upsertFeature(db, id, path, name) {
|
|
55
|
+
db.prepare("INSERT OR REPLACE INTO features (id, path, name) VALUES (?, ?, ?)").run(id, path, name);
|
|
56
|
+
}
|
|
57
|
+
function upsertScenario(db, id, featureId, name) {
|
|
58
|
+
db.prepare("INSERT OR REPLACE INTO scenarios (id, feature_id, name) VALUES (?, ?, ?)").run(id, featureId, name);
|
|
59
|
+
}
|
|
60
|
+
function upsertStep(db, id, scenarioId, idx, text) {
|
|
61
|
+
db.prepare("INSERT OR REPLACE INTO steps (id, scenario_id, idx, text) VALUES (?, ?, ?, ?)").run(id, scenarioId, idx, text);
|
|
62
|
+
}
|
|
63
|
+
function insertRun(db, id, sessionId, scenarioId, startedAt) {
|
|
64
|
+
db.prepare("INSERT INTO runs (id, session_id, scenario_id, started_at) VALUES (?, ?, ?, ?)").run(id, sessionId, scenarioId, startedAt);
|
|
65
|
+
}
|
|
66
|
+
function finaliseRun(db, id, status, failedStepId, error) {
|
|
67
|
+
db.prepare("UPDATE runs SET status = ?, failed_step_id = ?, error = ? WHERE id = ?").run(status, failedStepId ?? null, error ?? null, id);
|
|
68
|
+
}
|
|
69
|
+
function insertArtifact(db, id, runId, stepId, filename) {
|
|
70
|
+
db.prepare("INSERT INTO artifacts (id, run_id, step_id, filename) VALUES (?, ?, ?, ?)").run(id, runId, stepId, filename);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export { finaliseRun, insertArtifact, insertRun, insertSession, openStore, upsertFeature, upsertScenario, upsertStep };
|
|
74
|
+
//# sourceMappingURL=index.js.map
|
|
75
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/db.ts","../src/write.ts"],"names":[],"mappings":";;;AAEA,IAAM,MAAA,GAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAuCR,SAAS,SAAA,CAAU,OAAO,yBAAA,EAA8C;AAC7E,EAAA,MAAM,EAAA,GAAK,IAAI,QAAA,CAAS,IAAI,CAAA;AAC5B,EAAA,EAAA,CAAG,OAAO,oBAAoB,CAAA;AAC9B,EAAA,EAAA,CAAG,OAAO,mBAAmB,CAAA;AAC7B,EAAA,EAAA,CAAG,KAAK,MAAM,CAAA;AACd,EAAA,OAAO,EAAA;AACT;;;AC7CO,SAAS,aAAA,CAAc,EAAA,EAAuB,EAAA,EAAY,SAAA,EAA0B,SAAA,EAAyB;AAClH,EAAA,EAAA,CAAG,QAAQ,8EAA8E,CAAA,CAAE,GAAA,CAAI,EAAA,EAAI,WAAW,SAAS,CAAA;AACzH;AAEO,SAAS,aAAA,CAAc,EAAA,EAAuB,EAAA,EAAY,IAAA,EAAc,IAAA,EAAoB;AACjG,EAAA,EAAA,CAAG,QAAQ,mEAAmE,CAAA,CAAE,GAAA,CAAI,EAAA,EAAI,MAAM,IAAI,CAAA;AACpG;AAEO,SAAS,cAAA,CAAe,EAAA,EAAuB,EAAA,EAAY,SAAA,EAAmB,IAAA,EAAoB;AACvG,EAAA,EAAA,CAAG,QAAQ,0EAA0E,CAAA,CAAE,GAAA,CAAI,EAAA,EAAI,WAAW,IAAI,CAAA;AAChH;AAEO,SAAS,UAAA,CAAW,EAAA,EAAuB,EAAA,EAAY,UAAA,EAAoB,KAAa,IAAA,EAAoB;AACjH,EAAA,EAAA,CAAG,QAAQ,+EAA+E,CAAA,CAAE,IAAI,EAAA,EAAI,UAAA,EAAY,KAAK,IAAI,CAAA;AAC3H;AAEO,SAAS,SAAA,CAAU,EAAA,EAAuB,EAAA,EAAY,SAAA,EAAmB,YAAoB,SAAA,EAAyB;AAC3H,EAAA,EAAA,CAAG,QAAQ,gFAAgF,CAAA,CAAE,IAAI,EAAA,EAAI,SAAA,EAAW,YAAY,SAAS,CAAA;AACvI;AAEO,SAAS,WAAA,CAAY,EAAA,EAAuB,EAAA,EAAY,MAAA,EAAgB,cAAuB,KAAA,EAAsB;AAC1H,EAAA,EAAA,CAAG,OAAA,CAAQ,wEAAwE,CAAA,CAAE,GAAA,CAAI,QAAQ,YAAA,IAAgB,IAAA,EAAM,KAAA,IAAS,IAAA,EAAM,EAAE,CAAA;AAC1I;AAEO,SAAS,cAAA,CAAe,EAAA,EAAuB,EAAA,EAAY,KAAA,EAAe,QAAgB,QAAA,EAAwB;AACvH,EAAA,EAAA,CAAG,QAAQ,2EAA2E,CAAA,CAAE,IAAI,EAAA,EAAI,KAAA,EAAO,QAAQ,QAAQ,CAAA;AACzH","file":"index.js","sourcesContent":["import Database from 'better-sqlite3';\n\nconst SCHEMA = `\nCREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n started_at INTEGER NOT NULL,\n git_commit TEXT\n);\nCREATE TABLE IF NOT EXISTS features (\n id TEXT PRIMARY KEY,\n path TEXT NOT NULL,\n name TEXT NOT NULL\n);\nCREATE TABLE IF NOT EXISTS scenarios (\n id TEXT PRIMARY KEY,\n feature_id TEXT NOT NULL REFERENCES features(id),\n name TEXT NOT NULL\n);\nCREATE TABLE IF NOT EXISTS steps (\n id TEXT PRIMARY KEY,\n scenario_id TEXT NOT NULL REFERENCES scenarios(id),\n idx INTEGER NOT NULL,\n text TEXT NOT NULL\n);\nCREATE TABLE IF NOT EXISTS runs (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL REFERENCES sessions(id),\n scenario_id TEXT NOT NULL REFERENCES scenarios(id),\n status TEXT NOT NULL DEFAULT 'running',\n failed_step_id TEXT REFERENCES steps(id),\n error TEXT,\n started_at INTEGER NOT NULL\n);\nCREATE TABLE IF NOT EXISTS artifacts (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL REFERENCES runs(id),\n step_id TEXT NOT NULL REFERENCES steps(id),\n filename TEXT NOT NULL\n);\n`;\n\nexport function openStore(path = '.letsrunit/letsrunit.db'): Database.Database {\n const db = new Database(path);\n db.pragma('journal_mode = WAL');\n db.pragma('foreign_keys = ON');\n db.exec(SCHEMA);\n return db;\n}\n","import type Database from 'better-sqlite3';\n\nexport function insertSession(db: Database.Database, id: string, gitCommit: string | null, startedAt: number): void {\n db.prepare('INSERT OR IGNORE INTO sessions (id, started_at, git_commit) VALUES (?, ?, ?)').run(id, startedAt, gitCommit);\n}\n\nexport function upsertFeature(db: Database.Database, id: string, path: string, name: string): void {\n db.prepare('INSERT OR REPLACE INTO features (id, path, name) VALUES (?, ?, ?)').run(id, path, name);\n}\n\nexport function upsertScenario(db: Database.Database, id: string, featureId: string, name: string): void {\n db.prepare('INSERT OR REPLACE INTO scenarios (id, feature_id, name) VALUES (?, ?, ?)').run(id, featureId, name);\n}\n\nexport function upsertStep(db: Database.Database, id: string, scenarioId: string, idx: number, text: string): void {\n db.prepare('INSERT OR REPLACE INTO steps (id, scenario_id, idx, text) VALUES (?, ?, ?, ?)').run(id, scenarioId, idx, text);\n}\n\nexport function insertRun(db: Database.Database, id: string, sessionId: string, scenarioId: string, startedAt: number): void {\n db.prepare('INSERT INTO runs (id, session_id, scenario_id, started_at) VALUES (?, ?, ?, ?)').run(id, sessionId, scenarioId, startedAt);\n}\n\nexport function finaliseRun(db: Database.Database, id: string, status: string, failedStepId?: string, error?: string): void {\n db.prepare('UPDATE runs SET status = ?, failed_step_id = ?, error = ? WHERE id = ?').run(status, failedStepId ?? null, error ?? null, id);\n}\n\nexport function insertArtifact(db: Database.Database, id: string, runId: string, stepId: string, filename: string): void {\n db.prepare('INSERT INTO artifacts (id, run_id, step_id, filename) VALUES (?, ?, ?, ?)').run(id, runId, stepId, filename);\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@letsrunit/store",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "SQLite-backed artifact store for letsrunit",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"testing",
|
|
7
|
+
"store",
|
|
8
|
+
"sqlite",
|
|
9
|
+
"letsrunit"
|
|
10
|
+
],
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "https://github.com/letsrunit-hq/letsrunit.git",
|
|
15
|
+
"directory": "packages/store"
|
|
16
|
+
},
|
|
17
|
+
"bugs": "https://github.com/letsrunit-hq/letsrunit/issues",
|
|
18
|
+
"homepage": "https://github.com/letsrunit-hq/letsrunit#readme",
|
|
19
|
+
"type": "module",
|
|
20
|
+
"main": "./src/index.ts",
|
|
21
|
+
"module": "./src/index.ts",
|
|
22
|
+
"types": "./src/index.ts",
|
|
23
|
+
"exports": {
|
|
24
|
+
".": {
|
|
25
|
+
"types": "./src/index.ts",
|
|
26
|
+
"import": "./src/index.ts",
|
|
27
|
+
"default": "./src/index.ts"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public",
|
|
32
|
+
"main": "./dist/index.js",
|
|
33
|
+
"module": "./dist/index.js",
|
|
34
|
+
"types": "./dist/index.d.ts",
|
|
35
|
+
"exports": {
|
|
36
|
+
".": {
|
|
37
|
+
"types": "./dist/index.d.ts",
|
|
38
|
+
"import": "./dist/index.js",
|
|
39
|
+
"default": "./dist/index.js"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"files": [
|
|
44
|
+
"dist",
|
|
45
|
+
"src",
|
|
46
|
+
"README.md"
|
|
47
|
+
],
|
|
48
|
+
"scripts": {
|
|
49
|
+
"build": "../../node_modules/.bin/tsup",
|
|
50
|
+
"typecheck": "tsc --noEmit"
|
|
51
|
+
},
|
|
52
|
+
"packageManager": "yarn@4.10.3",
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"better-sqlite3": "^12.8.0",
|
|
55
|
+
"uuid": "^13.0.0"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@types/better-sqlite3": "^7.6.13"
|
|
59
|
+
}
|
|
60
|
+
}
|
package/src/db.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
|
|
3
|
+
const SCHEMA = `
|
|
4
|
+
CREATE TABLE IF NOT EXISTS sessions (
|
|
5
|
+
id TEXT PRIMARY KEY,
|
|
6
|
+
started_at INTEGER NOT NULL,
|
|
7
|
+
git_commit TEXT
|
|
8
|
+
);
|
|
9
|
+
CREATE TABLE IF NOT EXISTS features (
|
|
10
|
+
id TEXT PRIMARY KEY,
|
|
11
|
+
path TEXT NOT NULL,
|
|
12
|
+
name TEXT NOT NULL
|
|
13
|
+
);
|
|
14
|
+
CREATE TABLE IF NOT EXISTS scenarios (
|
|
15
|
+
id TEXT PRIMARY KEY,
|
|
16
|
+
feature_id TEXT NOT NULL REFERENCES features(id),
|
|
17
|
+
name TEXT NOT NULL
|
|
18
|
+
);
|
|
19
|
+
CREATE TABLE IF NOT EXISTS steps (
|
|
20
|
+
id TEXT PRIMARY KEY,
|
|
21
|
+
scenario_id TEXT NOT NULL REFERENCES scenarios(id),
|
|
22
|
+
idx INTEGER NOT NULL,
|
|
23
|
+
text TEXT NOT NULL
|
|
24
|
+
);
|
|
25
|
+
CREATE TABLE IF NOT EXISTS runs (
|
|
26
|
+
id TEXT PRIMARY KEY,
|
|
27
|
+
session_id TEXT NOT NULL REFERENCES sessions(id),
|
|
28
|
+
scenario_id TEXT NOT NULL REFERENCES scenarios(id),
|
|
29
|
+
status TEXT NOT NULL DEFAULT 'running',
|
|
30
|
+
failed_step_id TEXT REFERENCES steps(id),
|
|
31
|
+
error TEXT,
|
|
32
|
+
started_at INTEGER NOT NULL
|
|
33
|
+
);
|
|
34
|
+
CREATE TABLE IF NOT EXISTS artifacts (
|
|
35
|
+
id TEXT PRIMARY KEY,
|
|
36
|
+
run_id TEXT NOT NULL REFERENCES runs(id),
|
|
37
|
+
step_id TEXT NOT NULL REFERENCES steps(id),
|
|
38
|
+
filename TEXT NOT NULL
|
|
39
|
+
);
|
|
40
|
+
`;
|
|
41
|
+
|
|
42
|
+
export function openStore(path = '.letsrunit/letsrunit.db'): Database.Database {
|
|
43
|
+
const db = new Database(path);
|
|
44
|
+
db.pragma('journal_mode = WAL');
|
|
45
|
+
db.pragma('foreign_keys = ON');
|
|
46
|
+
db.exec(SCHEMA);
|
|
47
|
+
return db;
|
|
48
|
+
}
|
package/src/index.ts
ADDED
package/src/read.ts
ADDED
package/src/write.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
|
|
3
|
+
export function insertSession(db: Database.Database, id: string, gitCommit: string | null, startedAt: number): void {
|
|
4
|
+
db.prepare('INSERT OR IGNORE INTO sessions (id, started_at, git_commit) VALUES (?, ?, ?)').run(id, startedAt, gitCommit);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function upsertFeature(db: Database.Database, id: string, path: string, name: string): void {
|
|
8
|
+
db.prepare('INSERT OR REPLACE INTO features (id, path, name) VALUES (?, ?, ?)').run(id, path, name);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function upsertScenario(db: Database.Database, id: string, featureId: string, name: string): void {
|
|
12
|
+
db.prepare('INSERT OR REPLACE INTO scenarios (id, feature_id, name) VALUES (?, ?, ?)').run(id, featureId, name);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function upsertStep(db: Database.Database, id: string, scenarioId: string, idx: number, text: string): void {
|
|
16
|
+
db.prepare('INSERT OR REPLACE INTO steps (id, scenario_id, idx, text) VALUES (?, ?, ?, ?)').run(id, scenarioId, idx, text);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function insertRun(db: Database.Database, id: string, sessionId: string, scenarioId: string, startedAt: number): void {
|
|
20
|
+
db.prepare('INSERT INTO runs (id, session_id, scenario_id, started_at) VALUES (?, ?, ?, ?)').run(id, sessionId, scenarioId, startedAt);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function finaliseRun(db: Database.Database, id: string, status: string, failedStepId?: string, error?: string): void {
|
|
24
|
+
db.prepare('UPDATE runs SET status = ?, failed_step_id = ?, error = ? WHERE id = ?').run(status, failedStepId ?? null, error ?? null, id);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function insertArtifact(db: Database.Database, id: string, runId: string, stepId: string, filename: string): void {
|
|
28
|
+
db.prepare('INSERT INTO artifacts (id, run_id, step_id, filename) VALUES (?, ?, ?, ?)').run(id, runId, stepId, filename);
|
|
29
|
+
}
|