@latchet/core 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/src/diff.d.ts +15 -0
- package/dist/src/diff.d.ts.map +1 -0
- package/dist/src/diff.js +29 -0
- package/dist/src/diff.js.map +1 -0
- package/dist/src/errors.d.ts +4 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +7 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/exporters.d.ts +4 -0
- package/dist/src/exporters.d.ts.map +1 -0
- package/dist/src/exporters.js +16 -0
- package/dist/src/exporters.js.map +1 -0
- package/dist/src/git.d.ts +3 -0
- package/dist/src/git.d.ts.map +1 -0
- package/dist/src/git.js +29 -0
- package/dist/src/git.js.map +1 -0
- package/dist/src/importers.d.ts +4 -0
- package/dist/src/importers.d.ts.map +1 -0
- package/dist/src/importers.js +35 -0
- package/dist/src/importers.js.map +1 -0
- package/dist/src/index.d.ts +11 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +11 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/markdown.d.ts +3 -0
- package/dist/src/markdown.d.ts.map +1 -0
- package/dist/src/markdown.js +69 -0
- package/dist/src/markdown.js.map +1 -0
- package/dist/src/projector.d.ts +3 -0
- package/dist/src/projector.d.ts.map +1 -0
- package/dist/src/projector.js +89 -0
- package/dist/src/projector.js.map +1 -0
- package/dist/src/redact.d.ts +10 -0
- package/dist/src/redact.d.ts.map +1 -0
- package/dist/src/redact.js +223 -0
- package/dist/src/redact.js.map +1 -0
- package/dist/src/store.d.ts +44 -0
- package/dist/src/store.d.ts.map +1 -0
- package/dist/src/store.js +273 -0
- package/dist/src/store.js.map +1 -0
- package/dist/src/utils.d.ts +14 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +78 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/src/verify.d.ts +3 -0
- package/dist/src/verify.d.ts.map +1 -0
- package/dist/src/verify.js +33 -0
- package/dist/src/verify.js.map +1 -0
- package/package.json +28 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync, writeFileSync, existsSync, readdirSync, appendFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
4
|
+
export function nowIso() {
|
|
5
|
+
return new Date().toISOString();
|
|
6
|
+
}
|
|
7
|
+
export function createId(prefix = "evt") {
|
|
8
|
+
return `${prefix}_${randomUUID()}`;
|
|
9
|
+
}
|
|
10
|
+
export function ensureDir(path) {
|
|
11
|
+
mkdirSync(path, { recursive: true });
|
|
12
|
+
}
|
|
13
|
+
export function writeJson(path, value) {
|
|
14
|
+
ensureDir(dirname(path));
|
|
15
|
+
writeFileSync(path, `${JSON.stringify(value, null, 2)}\n`, "utf8");
|
|
16
|
+
}
|
|
17
|
+
export function readJson(path) {
|
|
18
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
19
|
+
}
|
|
20
|
+
export function appendJsonLine(path, value) {
|
|
21
|
+
ensureDir(dirname(path));
|
|
22
|
+
appendFileSync(path, `${JSON.stringify(value)}\n`, "utf8");
|
|
23
|
+
}
|
|
24
|
+
export function readJsonLines(path) {
|
|
25
|
+
if (!existsSync(path)) {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
const raw = readFileSync(path, "utf8").trim();
|
|
29
|
+
if (!raw) {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
return raw
|
|
33
|
+
.split("\n")
|
|
34
|
+
.filter(Boolean)
|
|
35
|
+
.map((line) => JSON.parse(line));
|
|
36
|
+
}
|
|
37
|
+
export function listDirectories(path) {
|
|
38
|
+
if (!existsSync(path)) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
return readdirSync(path, { withFileTypes: true })
|
|
42
|
+
.filter((entry) => entry.isDirectory())
|
|
43
|
+
.map((entry) => entry.name);
|
|
44
|
+
}
|
|
45
|
+
export function fileExists(path) {
|
|
46
|
+
return existsSync(path);
|
|
47
|
+
}
|
|
48
|
+
export function cleanString(value) {
|
|
49
|
+
if (!value) {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
const trimmed = value.trim();
|
|
53
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
54
|
+
}
|
|
55
|
+
export function uniqueBy(items, getKey) {
|
|
56
|
+
const seen = new Set();
|
|
57
|
+
const result = [];
|
|
58
|
+
for (const item of items) {
|
|
59
|
+
const key = getKey(item);
|
|
60
|
+
if (seen.has(key)) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
seen.add(key);
|
|
64
|
+
result.push(item);
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
export function resolvePath(...parts) {
|
|
69
|
+
return join(...parts);
|
|
70
|
+
}
|
|
71
|
+
export function computeFileHash(path) {
|
|
72
|
+
if (!existsSync(path)) {
|
|
73
|
+
return "";
|
|
74
|
+
}
|
|
75
|
+
const content = readFileSync(path);
|
|
76
|
+
return createHash("sha256").update(content).digest("hex");
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC1G,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,UAAU,MAAM;IACpB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAM,GAAG,KAAK;IACrC,OAAO,GAAG,MAAM,IAAI,UAAU,EAAE,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,KAAc;IACpD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACzB,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAI,IAAY;IACtC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAM,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,KAAc;IACzD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACzB,cAAc,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,aAAa,CAAI,IAAY;IAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,GAAG;SACP,KAAK,CAAC,IAAI,CAAC;SACX,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,WAAW,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SAC9C,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;SACtC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAgC;IAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAI,KAAU,EAAE,MAA2B;IACjE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAQ,EAAE,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAG,KAAe;IAC5C,OAAO,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/verify.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAkB,SAAS,EAAE,MAAM,eAAe,CAAC;AAQhF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,eAAe,CAyDlF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { getGitSnapshot } from "./git.js";
|
|
3
|
+
import { fileExists } from "./utils.js";
|
|
4
|
+
function buildCheck(kind, ok, message) {
|
|
5
|
+
return { kind, ok, message };
|
|
6
|
+
}
|
|
7
|
+
export function verifyTaskFreshness(cwd, state) {
|
|
8
|
+
const checks = [];
|
|
9
|
+
const currentGit = getGitSnapshot(cwd);
|
|
10
|
+
const expectedGit = state.task.git;
|
|
11
|
+
if (!expectedGit) {
|
|
12
|
+
checks.push(buildCheck("workspace_git", true, "Task was created outside a git repository."));
|
|
13
|
+
}
|
|
14
|
+
else if (!currentGit) {
|
|
15
|
+
checks.push(buildCheck("workspace_git", false, "Task expects a git repository but none is available now."));
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
checks.push(buildCheck("git_branch", currentGit.branch === expectedGit.branch, `Expected branch ${expectedGit.branch ?? "unknown"}, current branch is ${currentGit.branch ?? "unknown"}.`));
|
|
19
|
+
checks.push(buildCheck("git_commit", currentGit.commit === expectedGit.commit, `Expected commit ${expectedGit.commit ?? "unknown"}, current commit is ${currentGit.commit ?? "unknown"}.`));
|
|
20
|
+
checks.push(buildCheck("git_dirty", currentGit.dirty === expectedGit.dirty, `Expected workspace to be ${expectedGit.dirty ? "dirty" : "clean"}, current workspace is ${currentGit.dirty ? "dirty" : "clean"}.`));
|
|
21
|
+
}
|
|
22
|
+
const workspaceRoot = state.task.workspace_root ?? cwd;
|
|
23
|
+
checks.push(buildCheck("workspace_root", fileExists(workspaceRoot), `Workspace root ${workspaceRoot} ${fileExists(workspaceRoot) ? "is available" : "is missing"}.`));
|
|
24
|
+
for (const artifact of state.artifact_refs) {
|
|
25
|
+
const path = resolve(workspaceRoot, artifact.payload.path);
|
|
26
|
+
checks.push(buildCheck("artifact_exists", fileExists(path), `Artifact ${artifact.payload.path} ${fileExists(path) ? "exists" : "is missing"}.`));
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
ok: checks.every((check) => check.ok),
|
|
30
|
+
checks
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,SAAS,UAAU,CAAC,IAA4B,EAAE,EAAW,EAAE,OAAe;IAC5E,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,KAAgB;IAC/D,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IAEnC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,IAAI,EAAE,4CAA4C,CAAC,CAAC,CAAC;IAC/F,CAAC;SAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,KAAK,EAAE,0DAA0D,CAAC,CAAC,CAAC;IAC9G,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CACT,UAAU,CACR,YAAY,EACZ,UAAU,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EACxC,mBAAmB,WAAW,CAAC,MAAM,IAAI,SAAS,uBAAuB,UAAU,CAAC,MAAM,IAAI,SAAS,GAAG,CAC3G,CACF,CAAC;QACF,MAAM,CAAC,IAAI,CACT,UAAU,CACR,YAAY,EACZ,UAAU,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EACxC,mBAAmB,WAAW,CAAC,MAAM,IAAI,SAAS,uBAAuB,UAAU,CAAC,MAAM,IAAI,SAAS,GAAG,CAC3G,CACF,CAAC;QACF,MAAM,CAAC,IAAI,CACT,UAAU,CACR,WAAW,EACX,UAAU,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK,EACtC,4BAA4B,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,0BAA0B,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,CACnI,CACF,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,GAAG,CAAC;IACvD,MAAM,CAAC,IAAI,CACT,UAAU,CACR,gBAAgB,EAChB,UAAU,CAAC,aAAa,CAAC,EACzB,kBAAkB,aAAa,IAAI,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,GAAG,CAChG,CACF,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CACT,UAAU,CACR,iBAAiB,EACjB,UAAU,CAAC,IAAI,CAAC,EAChB,YAAY,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,GAAG,CACnF,CACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM;KACP,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@latchet/core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Core local-first ledger store, projection, import, export, verification, and redaction logic for Latchet.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=22.12.0"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"main": "./dist/src/index.js",
|
|
11
|
+
"types": "./dist/src/index.d.ts",
|
|
12
|
+
"files": [
|
|
13
|
+
"dist/src"
|
|
14
|
+
],
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"access": "public"
|
|
17
|
+
},
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/src/index.d.ts",
|
|
21
|
+
"default": "./dist/src/index.js"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@latchet/spec": "0.1.0",
|
|
26
|
+
"ajv": "^8.20.0"
|
|
27
|
+
}
|
|
28
|
+
}
|