blacksmith-organization-system 1.5.1 → 1.6.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/bridges/git-integration/local-git.d.ts +1 -0
- package/dist/bridges/git-integration/local-git.js +7 -0
- package/dist/bridges/git-integration/local-git.js.map +1 -1
- package/dist/core/host.d.ts +2 -0
- package/dist/core/omnis.d.ts +15 -0
- package/dist/core/omnis.js +88 -0
- package/dist/core/omnis.js.map +1 -0
- package/dist/hosts/node.d.ts +2 -1
- package/dist/hosts/node.js +19 -1
- package/dist/hosts/node.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,6 +2,7 @@ import { Git } from "./git-base.ts";
|
|
|
2
2
|
export declare class LocalGit extends Git {
|
|
3
3
|
tagExists(tag: string): boolean;
|
|
4
4
|
tags(pattern: string): string[];
|
|
5
|
+
files(dir?: string): string[];
|
|
5
6
|
mergeFile(ours: string, base: string, theirs: string): boolean;
|
|
6
7
|
identities(): string[];
|
|
7
8
|
}
|
|
@@ -11,6 +11,13 @@ export class LocalGit extends Git {
|
|
|
11
11
|
tags(pattern) {
|
|
12
12
|
return this.git(["tag", "--list", pattern]).split("\n").filter(Boolean);
|
|
13
13
|
}
|
|
14
|
+
// the files below dir (relative to it) that no .gitignore leaves out: tracked ones
|
|
15
|
+
// and new ones (git ls-files --cached --others --exclude-standard)
|
|
16
|
+
files(dir = ".") {
|
|
17
|
+
return this.git(["ls-files", "-z", "--cached", "--others", "--exclude-standard", "--", dir])
|
|
18
|
+
.split("\0")
|
|
19
|
+
.filter(Boolean);
|
|
20
|
+
}
|
|
14
21
|
// a three-way merge of files into ours (git merge-file); true when it has conflicts
|
|
15
22
|
mergeFile(ours, base, theirs) {
|
|
16
23
|
const { status, stderr } = this.host.run("git", ["merge-file", ours, base, theirs], {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-git.js","sourceRoot":"","sources":["../../../src/bridges/git-integration/local-git.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,0FAA0F;AAC1F,0BAA0B;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC,MAAM,OAAO,QAAS,SAAQ,GAAG;IAC/B,8DAA8D;IAC9D,SAAS,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;IAClD,CAAC;IAED,0CAA0C;IAC1C,IAAI,CAAC,OAAe;QAClB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1E,CAAC;IAED,oFAAoF;IACpF,SAAS,CAAC,IAAY,EAAE,IAAY,EAAE,MAAc;QAClD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE;YAClF,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,MAAM,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,4EAA4E;IAC5E,iFAAiF;IACjF,UAAU;QACR,MAAM,MAAM,GAAG,+EAA+E,CAAC;QAC/F,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,MAAM,EAAE,CAAC,EAAE;YAC1F,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CAAC;QACH,8CAA8C;QAC9C,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACjB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"local-git.js","sourceRoot":"","sources":["../../../src/bridges/git-integration/local-git.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,0FAA0F;AAC1F,0BAA0B;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC,MAAM,OAAO,QAAS,SAAQ,GAAG;IAC/B,8DAA8D;IAC9D,SAAS,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;IAClD,CAAC;IAED,0CAA0C;IAC1C,IAAI,CAAC,OAAe;QAClB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1E,CAAC;IAED,mFAAmF;IACnF,mEAAmE;IACnE,KAAK,CAAC,GAAG,GAAG,GAAG;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;aACzF,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAED,oFAAoF;IACpF,SAAS,CAAC,IAAY,EAAE,IAAY,EAAE,MAAc;QAClD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE;YAClF,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,MAAM,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,4EAA4E;IAC5E,iFAAiF;IACjF,UAAU;QACR,MAAM,MAAM,GAAG,+EAA+E,CAAC;QAC/F,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,MAAM,EAAE,CAAC,EAAE;YAC1F,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CAAC;QACH,8CAA8C;QAC9C,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACjB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;CACF"}
|
package/dist/core/host.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export type RunResult = {
|
|
|
11
11
|
stdout: string;
|
|
12
12
|
stderr: string;
|
|
13
13
|
};
|
|
14
|
+
export type DigestAlgorithm = "sha1" | "md5" | "crc32";
|
|
14
15
|
export interface Host {
|
|
15
16
|
exists(path: string): boolean;
|
|
16
17
|
isDirectory(path: string): boolean;
|
|
@@ -18,6 +19,7 @@ export interface Host {
|
|
|
18
19
|
readText(path: string): string | null;
|
|
19
20
|
writeText(path: string, text: string): void;
|
|
20
21
|
appendText(path: string, text: string): void;
|
|
22
|
+
digest(path: string, algorithm: DigestAlgorithm): string | null;
|
|
21
23
|
mkdir(path: string): void;
|
|
22
24
|
watch(root: string, onChange: (change: Change) => void, onError: (error: Error) => void, skip?: (relative: string) => boolean): () => void;
|
|
23
25
|
run(command: string, args: string[], options?: {
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DigestAlgorithm, Host } from "./host.ts";
|
|
2
|
+
export declare const VALUE_DIGESTS: DigestAlgorithm[];
|
|
3
|
+
export declare function a12y(word: string): string;
|
|
4
|
+
export declare function crc32(text: string): string;
|
|
5
|
+
export declare function adler32(text: string): string;
|
|
6
|
+
export declare function base32(text: string): string;
|
|
7
|
+
export declare function counted(path: string): boolean;
|
|
8
|
+
export type Hallow = {
|
|
9
|
+
key: string;
|
|
10
|
+
value: string;
|
|
11
|
+
path: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function hallow(host: Host, root: string, path: string): Hallow | null;
|
|
14
|
+
export declare function omnis(host: Host, root: string, files: string[]): Hallow[];
|
|
15
|
+
export declare function omnisToml(hallows: Hallow[], unixusat: number): string;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// the content hashes of a value, in order; the third ("weakhashalgorithm") is crc32 for now
|
|
2
|
+
// (assumed: Q16)
|
|
3
|
+
export const VALUE_DIGESTS = ["sha1", "md5", "crc32"];
|
|
4
|
+
// "authenticity" → "a12y": the first letter, the length, the last letter (the owner's
|
|
5
|
+
// example; the usual numeronym counts only the letters between, a10y - Q16)
|
|
6
|
+
export function a12y(word) {
|
|
7
|
+
const letters = [...word];
|
|
8
|
+
if (letters.length < 3) {
|
|
9
|
+
return word;
|
|
10
|
+
}
|
|
11
|
+
return `${letters[0]}${letters.length}${letters[letters.length - 1]}`;
|
|
12
|
+
}
|
|
13
|
+
const CRC_TABLE = Array.from({ length: 256 }, (_, n) => {
|
|
14
|
+
let c = n;
|
|
15
|
+
for (let k = 0; k < 8; k++) {
|
|
16
|
+
c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
|
|
17
|
+
}
|
|
18
|
+
return c >>> 0;
|
|
19
|
+
});
|
|
20
|
+
const hex8 = (n) => (n >>> 0).toString(16).padStart(8, "0");
|
|
21
|
+
const utf8 = (text) => new TextEncoder().encode(text);
|
|
22
|
+
// CRC-32 (IEEE, as zip and zlib), lowercase hex
|
|
23
|
+
export function crc32(text) {
|
|
24
|
+
let c = 0xffffffff;
|
|
25
|
+
for (const byte of utf8(text)) {
|
|
26
|
+
c = (CRC_TABLE[(c ^ byte) & 0xff] ?? 0) ^ (c >>> 8);
|
|
27
|
+
}
|
|
28
|
+
return hex8(c ^ 0xffffffff);
|
|
29
|
+
}
|
|
30
|
+
// Adler-32 (as zlib), lowercase hex
|
|
31
|
+
export function adler32(text) {
|
|
32
|
+
let a = 1;
|
|
33
|
+
let b = 0;
|
|
34
|
+
for (const byte of utf8(text)) {
|
|
35
|
+
a = (a + byte) % 65521;
|
|
36
|
+
b = (b + a) % 65521;
|
|
37
|
+
}
|
|
38
|
+
return hex8((b << 16) | a);
|
|
39
|
+
}
|
|
40
|
+
// base32 (RFC 4648) without "=" padding: a bare TOML key may hold only A-Z, a-z, 0-9, _ and -
|
|
41
|
+
export function base32(text) {
|
|
42
|
+
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
|
|
43
|
+
let bits = 0;
|
|
44
|
+
let value = 0;
|
|
45
|
+
let out = "";
|
|
46
|
+
for (const byte of utf8(text)) {
|
|
47
|
+
value = (value << 8) | byte;
|
|
48
|
+
bits += 8;
|
|
49
|
+
while (bits >= 5) {
|
|
50
|
+
out += alphabet[(value >>> (bits - 5)) & 31];
|
|
51
|
+
bits -= 5;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (bits > 0) {
|
|
55
|
+
out += alphabet[(value << (5 - bits)) & 31];
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
// does a file of this name count: it begins and ends with a letter
|
|
60
|
+
export function counted(path) {
|
|
61
|
+
const name = path.split("/").pop() ?? "";
|
|
62
|
+
return /^\p{L}(.*\p{L})?$/u.test(name);
|
|
63
|
+
}
|
|
64
|
+
// one line of [hallows] for a file (path relative to the model's root, with /); null when
|
|
65
|
+
// it is not a regular file
|
|
66
|
+
export function hallow(host, root, path) {
|
|
67
|
+
const digests = VALUE_DIGESTS.map((algorithm) => host.digest(`${root}/${path}`, algorithm));
|
|
68
|
+
if (digests.some((digest) => digest === null)) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
const name = path.split("/").pop() ?? path;
|
|
72
|
+
const key = [crc32(path), a12y(name), adler32(path)].join("");
|
|
73
|
+
return { key: base32(key), value: base32(digests.join("")), path };
|
|
74
|
+
}
|
|
75
|
+
// the halo of the given files (e.g. LocalGit.files(): what no .gitignore leaves out)
|
|
76
|
+
export function omnis(host, root, files) {
|
|
77
|
+
return files
|
|
78
|
+
.filter(counted)
|
|
79
|
+
.sort()
|
|
80
|
+
.map((path) => hallow(host, root, path))
|
|
81
|
+
.filter((entry) => entry !== null);
|
|
82
|
+
}
|
|
83
|
+
// .omnis.toml's text
|
|
84
|
+
export function omnisToml(hallows, unixusat) {
|
|
85
|
+
const lines = hallows.map(({ key, value }) => `${key} = "${value}"`);
|
|
86
|
+
return ["[moriatur]", `UNIXUSAT = ${unixusat}`, "[hallows]", ...lines, ""].join("\n");
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=omnis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omnis.js","sourceRoot":"","sources":["../../src/core/omnis.ts"],"names":[],"mappings":"AAaA,4FAA4F;AAC5F,iBAAiB;AACjB,MAAM,CAAC,MAAM,aAAa,GAAsB,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAEzE,sFAAsF;AACtF,4EAA4E;AAC5E,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;IACrD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC;AAEH,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACpE,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAE9D,gDAAgD;AAChD,MAAM,UAAU,KAAK,CAAC,IAAY;IAChC,IAAI,CAAC,GAAG,UAAU,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;AAC9B,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;QACvB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,MAAM,QAAQ,GAAG,kCAAkC,CAAC;IACpD,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;QAC5B,IAAI,IAAI,CAAC,CAAC;QACV,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC;YACjB,GAAG,IAAI,QAAQ,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YAC7C,IAAI,IAAI,CAAC,CAAC;QACZ,CAAC;IACH,CAAC;IACD,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACb,GAAG,IAAI,QAAQ,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IACzC,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAID,0FAA0F;AAC1F,2BAA2B;AAC3B,MAAM,UAAU,MAAM,CAAC,IAAU,EAAE,IAAY,EAAE,IAAY;IAC3D,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;IAC5F,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;IAC3C,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9D,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;AACrE,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,KAAK,CAAC,IAAU,EAAE,IAAY,EAAE,KAAe;IAC7D,OAAO,KAAK;SACT,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;SACvC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,SAAS,CAAC,OAAiB,EAAE,QAAgB;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC;IACrE,OAAO,CAAC,YAAY,EAAE,cAAc,QAAQ,EAAE,EAAE,WAAW,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxF,CAAC"}
|
package/dist/hosts/node.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Change, Entry, Host, RunResult } from "../core/host.ts";
|
|
1
|
+
import type { Change, DigestAlgorithm, Entry, Host, RunResult } from "../core/host.ts";
|
|
2
2
|
export { WATCH_LIMIT } from "./watch-tree.ts";
|
|
3
3
|
export declare class NodeHost implements Host {
|
|
4
4
|
exists(path: string): boolean;
|
|
@@ -7,6 +7,7 @@ export declare class NodeHost implements Host {
|
|
|
7
7
|
readText(path: string): string | null;
|
|
8
8
|
writeText(path: string, text: string): void;
|
|
9
9
|
appendText(path: string, text: string): void;
|
|
10
|
+
digest(path: string, algorithm: DigestAlgorithm): string | null;
|
|
10
11
|
mkdir(path: string): void;
|
|
11
12
|
watch(root: string, onChange: (change: Change) => void, onError: (error: Error) => void, skip?: (relative: string) => boolean): () => void;
|
|
12
13
|
run(command: string, args: string[], options?: {
|
package/dist/hosts/node.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
// Host for Node.js: the real file system, clock and environment.
|
|
2
2
|
import { spawnSync } from "node:child_process";
|
|
3
|
-
import {
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
import { appendFileSync, existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync, } from "node:fs";
|
|
4
5
|
import { homedir, hostname, userInfo } from "node:os";
|
|
5
6
|
import { resolve } from "node:path";
|
|
7
|
+
import { crc32 } from "node:zlib";
|
|
6
8
|
import { watchTree } from "./watch-tree.js";
|
|
7
9
|
export { WATCH_LIMIT } from "./watch-tree.js";
|
|
8
10
|
export class NodeHost {
|
|
@@ -42,6 +44,22 @@ export class NodeHost {
|
|
|
42
44
|
appendText(path, text) {
|
|
43
45
|
appendFileSync(path, text);
|
|
44
46
|
}
|
|
47
|
+
digest(path, algorithm) {
|
|
48
|
+
try {
|
|
49
|
+
// lstat: a link is not followed, it is not a file of its own
|
|
50
|
+
if (!lstatSync(path).isFile()) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
const bytes = readFileSync(path);
|
|
54
|
+
if (algorithm === "crc32") {
|
|
55
|
+
return crc32(bytes).toString(16).padStart(8, "0");
|
|
56
|
+
}
|
|
57
|
+
return createHash(algorithm).update(bytes).digest("hex");
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
45
63
|
mkdir(path) {
|
|
46
64
|
mkdirSync(path, { recursive: true });
|
|
47
65
|
}
|
package/dist/hosts/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/hosts/node.ts"],"names":[],"mappings":"AAAA,iEAAiE;AAEjE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EACL,cAAc,EACd,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/hosts/node.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export * from "./core/context.ts";
|
|
|
6
6
|
export * from "./core/element.ts";
|
|
7
7
|
export * from "./core/emitter.ts";
|
|
8
8
|
export * from "./core/json-file.ts";
|
|
9
|
+
export * from "./core/omnis.ts";
|
|
9
10
|
export * as paths from "./core/paths.ts";
|
|
10
11
|
export * from "./core/procedure.ts";
|
|
11
12
|
export * from "./core/serialize.ts";
|
package/dist/index.js
CHANGED
|
@@ -13,6 +13,7 @@ export * from "./core/context.js";
|
|
|
13
13
|
export * from "./core/element.js";
|
|
14
14
|
export * from "./core/emitter.js";
|
|
15
15
|
export * from "./core/json-file.js";
|
|
16
|
+
export * from "./core/omnis.js";
|
|
16
17
|
export * as paths from "./core/paths.js";
|
|
17
18
|
export * from "./core/procedure.js";
|
|
18
19
|
export * from "./core/serialize.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,oEAAoE;AACpE,yCAAyC;AACzC,gEAAgE;AAChE,oFAAoF;AACpF,oFAAoF;AAEpF,iFAAiF;AACjF,OAAO,EAAE,GAAG,EAAsC,MAAM,UAAU,CAAC;AAInE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACxD,cAAc,oBAAoB,CAAC;AAEnC,8CAA8C;AAC9C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,OAAO,KAAK,KAAK,MAAM,iBAAiB,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAElC,uEAAuE;AACvE,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,oEAAoE;AACpE,yCAAyC;AACzC,gEAAgE;AAChE,oFAAoF;AACpF,oFAAoF;AAEpF,iFAAiF;AACjF,OAAO,EAAE,GAAG,EAAsC,MAAM,UAAU,CAAC;AAInE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACxD,cAAc,oBAAoB,CAAC;AAEnC,8CAA8C;AAC9C,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,OAAO,KAAK,KAAK,MAAM,iBAAiB,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAElC,uEAAuE;AACvE,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "blacksmith-organization-system",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "Blacksmith Organization System (BOS) core: the workshop as code - build its base, listen to its changes, inspect it as one coherent environment",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bos",
|