@askdb/core 1.0.0-beta.44 → 1.0.0-beta.46
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 +20 -19
- package/dist/ask.d.ts +45 -45
- package/dist/ask.d.ts.map +1 -1
- package/dist/ask.js +153 -310
- package/dist/ask.js.map +1 -1
- package/dist/enrichment/index.d.ts +1 -1
- package/dist/enrichment/index.d.ts.map +1 -1
- package/dist/enrichment/prompt.d.ts +3 -3
- package/dist/enrichment/prompt.d.ts.map +1 -1
- package/dist/enrichment/prompt.js +43 -17
- package/dist/enrichment/prompt.js.map +1 -1
- package/dist/enrichment/suggest.d.ts +2 -2
- package/dist/enrichment/suggest.d.ts.map +1 -1
- package/dist/enrichment/suggest.js +3 -1
- package/dist/enrichment/suggest.js.map +1 -1
- package/dist/enrichment/types.d.ts +29 -9
- package/dist/enrichment/types.d.ts.map +1 -1
- package/dist/errors.d.ts +97 -6
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +21 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +7 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/logging/askdb-logger.d.ts +2 -0
- package/dist/logging/askdb-logger.d.ts.map +1 -1
- package/dist/logging/create-askdb-logger.d.ts.map +1 -1
- package/dist/logging/create-askdb-logger.js +3 -0
- package/dist/logging/create-askdb-logger.js.map +1 -1
- package/dist/logging/log-events.d.ts +8 -0
- package/dist/logging/log-events.d.ts.map +1 -1
- package/dist/logging/log-events.js +8 -0
- package/dist/logging/log-events.js.map +1 -1
- package/dist/retrieval/synthesize-ddl.d.ts +7 -1
- package/dist/retrieval/synthesize-ddl.d.ts.map +1 -1
- package/dist/retrieval/synthesize-ddl.js +36 -33
- package/dist/retrieval/synthesize-ddl.js.map +1 -1
- package/dist/schema/normalize.d.ts +6 -2
- package/dist/schema/normalize.d.ts.map +1 -1
- package/dist/schema/normalize.js +1 -4
- package/dist/schema/normalize.js.map +1 -1
- package/dist/schema/v2/format.d.ts +28 -1
- package/dist/schema/v2/format.d.ts.map +1 -1
- package/dist/schema/v2/format.js +53 -19
- package/dist/schema/v2/format.js.map +1 -1
- package/dist/schema/v2/index.d.ts +4 -3
- package/dist/schema/v2/index.d.ts.map +1 -1
- package/dist/schema/v2/index.js +4 -3
- package/dist/schema/v2/index.js.map +1 -1
- package/dist/schema/v2/loader.d.ts +28 -7
- package/dist/schema/v2/loader.d.ts.map +1 -1
- package/dist/schema/v2/loader.js +220 -96
- package/dist/schema/v2/loader.js.map +1 -1
- package/dist/schema/v2/mentions.d.ts +12 -0
- package/dist/schema/v2/mentions.d.ts.map +1 -1
- package/dist/schema/v2/mentions.js +65 -11
- package/dist/schema/v2/mentions.js.map +1 -1
- package/dist/schema/v2/save-file.d.ts +56 -0
- package/dist/schema/v2/save-file.d.ts.map +1 -0
- package/dist/schema/v2/save-file.js +138 -0
- package/dist/schema/v2/save-file.js.map +1 -0
- package/dist/schema/v2/tenant-policy-loader.d.ts +1 -10
- package/dist/schema/v2/tenant-policy-loader.d.ts.map +1 -1
- package/dist/schema/v2/tenant-policy-loader.js +65 -51
- package/dist/schema/v2/tenant-policy-loader.js.map +1 -1
- package/dist/schema/v2/tenant-policy.d.ts +7 -2
- package/dist/schema/v2/tenant-policy.d.ts.map +1 -1
- package/dist/schema/v2/tenant-policy.js +26 -0
- package/dist/schema/v2/tenant-policy.js.map +1 -1
- package/dist/sql/bind.d.ts +27 -7
- package/dist/sql/bind.d.ts.map +1 -1
- package/dist/sql/bind.js +33 -18
- package/dist/sql/bind.js.map +1 -1
- package/dist/sql/dialect-spec.d.ts +1 -0
- package/dist/sql/dialect-spec.d.ts.map +1 -1
- package/dist/sql/dialect-spec.js +7 -2
- package/dist/sql/dialect-spec.js.map +1 -1
- package/dist/sql/generate.d.ts +17 -11
- package/dist/sql/generate.d.ts.map +1 -1
- package/dist/sql/generate.js +65 -33
- package/dist/sql/generate.js.map +1 -1
- package/dist/sql/guardrail-decide.d.ts +58 -0
- package/dist/sql/guardrail-decide.d.ts.map +1 -0
- package/dist/sql/guardrail-decide.js +161 -0
- package/dist/sql/guardrail-decide.js.map +1 -0
- package/dist/sql/guardrails.d.ts +52 -0
- package/dist/sql/guardrails.d.ts.map +1 -0
- package/dist/sql/guardrails.js +100 -0
- package/dist/sql/guardrails.js.map +1 -0
- package/dist/sql/index.d.ts +2 -1
- package/dist/sql/index.d.ts.map +1 -1
- package/dist/sql/index.js +2 -1
- package/dist/sql/index.js.map +1 -1
- package/dist/sql/lexer.d.ts +13 -0
- package/dist/sql/lexer.d.ts.map +1 -1
- package/dist/sql/lexer.js +42 -7
- package/dist/sql/lexer.js.map +1 -1
- package/dist/sql/prompt-identifiers.d.ts +9 -0
- package/dist/sql/prompt-identifiers.d.ts.map +1 -1
- package/dist/sql/prompt-identifiers.js +22 -3
- package/dist/sql/prompt-identifiers.js.map +1 -1
- package/dist/sql/prompt.d.ts.map +1 -1
- package/dist/sql/prompt.js +5 -2
- package/dist/sql/prompt.js.map +1 -1
- package/dist/sql/rebind.d.ts +116 -0
- package/dist/sql/rebind.d.ts.map +1 -0
- package/dist/sql/rebind.js +215 -0
- package/dist/sql/rebind.js.map +1 -0
- package/dist/sql/sensitive-guardrail.d.ts +7 -2
- package/dist/sql/sensitive-guardrail.d.ts.map +1 -1
- package/dist/sql/sensitive-guardrail.js +14 -33
- package/dist/sql/sensitive-guardrail.js.map +1 -1
- package/dist/sql/tenant-guardrail.d.ts +3 -14
- package/dist/sql/tenant-guardrail.d.ts.map +1 -1
- package/dist/sql/tenant-guardrail.js +16 -65
- package/dist/sql/tenant-guardrail.js.map +1 -1
- package/dist/sql/tenant-placeholders.d.ts +40 -14
- package/dist/sql/tenant-placeholders.d.ts.map +1 -1
- package/dist/sql/tenant-placeholders.js +92 -48
- package/dist/sql/tenant-placeholders.js.map +1 -1
- package/dist/sql/tenant-policy-warnings.d.ts +8 -0
- package/dist/sql/tenant-policy-warnings.d.ts.map +1 -0
- package/dist/sql/tenant-policy-warnings.js +21 -0
- package/dist/sql/tenant-policy-warnings.js.map +1 -0
- package/dist/sql/tenant-scope-expand.d.ts +46 -0
- package/dist/sql/tenant-scope-expand.d.ts.map +1 -0
- package/dist/sql/tenant-scope-expand.js +101 -0
- package/dist/sql/tenant-scope-expand.js.map +1 -0
- package/dist/sql/tsql-batch.d.ts +56 -0
- package/dist/sql/tsql-batch.d.ts.map +1 -0
- package/dist/sql/tsql-batch.js +246 -0
- package/dist/sql/tsql-batch.js.map +1 -0
- package/dist/sql/validate.d.ts +18 -3
- package/dist/sql/validate.d.ts.map +1 -1
- package/dist/sql/validate.js +127 -8
- package/dist/sql/validate.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
// A match's ends may not touch a letter, digit, or `_` of any script.
|
|
2
2
|
const BEFORE = "(?<![\\p{L}\\p{N}_])";
|
|
3
3
|
const AFTER = "(?![\\p{L}\\p{N}_])";
|
|
4
|
+
// Between a qualified name's table and column: a tight dot, or spaces or tabs
|
|
5
|
+
// on both sides ("users. Org_id" ends a sentence).
|
|
6
|
+
const QUALIFIER = "(?:\\.|[ \\t]+\\.[ \\t]+)";
|
|
4
7
|
/**
|
|
5
8
|
* Compiles the "mentions a sensitive column by name" rule of the schema v2
|
|
6
9
|
* contract (`docs/contracts/schema-v2.md`, Sensitive propagation) for
|
|
@@ -8,16 +11,40 @@ const AFTER = "(?![\\p{L}\\p{N}_])";
|
|
|
8
11
|
* checks every describable text of a schema against the same list.
|
|
9
12
|
*/
|
|
10
13
|
export function createMentionMatcher(names) {
|
|
11
|
-
const entries = names
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
const entries = names.filter((name) => typeof name === "string" ? name !== "" : name.table !== "" && name.column !== "");
|
|
15
|
+
// One alternative per bare name, and one per table for its qualified names
|
|
16
|
+
// (`table` + separator + any of its columns): the same matches as one
|
|
17
|
+
// alternative per name.
|
|
18
|
+
const bare = [];
|
|
19
|
+
const columnsByTable = new Map();
|
|
20
|
+
for (const name of entries) {
|
|
21
|
+
if (typeof name === "string")
|
|
22
|
+
bare.push(partPattern(name));
|
|
23
|
+
else {
|
|
24
|
+
const columns = columnsByTable.get(name.table) ?? [];
|
|
25
|
+
columns.push(partPattern(name.column));
|
|
26
|
+
columnsByTable.set(name.table, columns);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const tables = [...columnsByTable.keys()].map(partPattern);
|
|
30
|
+
const alternatives = [
|
|
31
|
+
...bare,
|
|
32
|
+
...[...columnsByTable.values()].map((columns, i) => `${tables[i]}${QUALIFIER}(?:${columns.join("|")})`),
|
|
33
|
+
];
|
|
34
|
+
if (alternatives.length === 0)
|
|
35
|
+
return { mentionsAny: () => false, find: () => [] };
|
|
36
|
+
const any = new RegExp(`${BEFORE}(?:${alternatives.join("|")})${AFTER}`, "iu");
|
|
37
|
+
// A first pass whose size follows the number of tables, not of their columns: a
|
|
38
|
+
// qualified mention needs one of its tables followed by the separator. Every
|
|
39
|
+
// text passes through it, and only a hit runs the full pattern, whose size
|
|
40
|
+
// slows some engines (Node 22's) on every text otherwise.
|
|
41
|
+
const firstPass = new RegExp(`${BEFORE}(?:${[...bare.map((b) => `${b}${AFTER}`), ...tables.map((t) => `${t}${QUALIFIER}`)].join("|")})`, "iu");
|
|
42
|
+
// Compiled on the first `find`: the prompt builders only ask `mentionsAny`.
|
|
43
|
+
let each;
|
|
44
|
+
const patterns = () => (each ??= entries.map((name) => ({ name, pattern: new RegExp(`${BEFORE}${namePattern(name)}${AFTER}`, "iu") })));
|
|
18
45
|
return {
|
|
19
|
-
mentionsAny: (text) => Boolean(text) &&
|
|
20
|
-
find: (text) => (text ?
|
|
46
|
+
mentionsAny: (text) => Boolean(text) && firstPass.test(text) && any.test(text),
|
|
47
|
+
find: (text) => (text ? patterns().filter(({ pattern }) => pattern.test(text)).map(({ name }) => name) : []),
|
|
21
48
|
};
|
|
22
49
|
}
|
|
23
50
|
/**
|
|
@@ -30,6 +57,34 @@ export function createMentionMatcher(names) {
|
|
|
30
57
|
export function findMentionedNames(text, names) {
|
|
31
58
|
return createMentionMatcher(names).find(text);
|
|
32
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* The names whose mention marks text as naming a sensitive column, for the
|
|
62
|
+
* whole schema (ADR 0017; how they match is the schema v2 contract's mention
|
|
63
|
+
* rule). A column marked sensitive itself counts by its bare name; a column
|
|
64
|
+
* of a sensitive table that is sensitive only through it
|
|
65
|
+
* (`sensitiveFromTable`) counts only qualified, since its bare name is often
|
|
66
|
+
* generic (`id`, `org_id`, `name`). Untracked tables' columns count too.
|
|
67
|
+
* `@askdb/rag`'s chunker and both NL→SQL prompt builders check describable
|
|
68
|
+
* text against this list.
|
|
69
|
+
*/
|
|
70
|
+
export function sensitiveMentionNames(schema) {
|
|
71
|
+
const names = [];
|
|
72
|
+
const bare = new Set();
|
|
73
|
+
for (const t of schema.tables) {
|
|
74
|
+
for (const c of t.columns) {
|
|
75
|
+
if (!c.sensitive && !t.sensitive)
|
|
76
|
+
continue;
|
|
77
|
+
if (t.sensitive && c.sensitiveFromTable === true) {
|
|
78
|
+
names.push({ table: t.name, column: c.name });
|
|
79
|
+
}
|
|
80
|
+
else if (!bare.has(c.name)) {
|
|
81
|
+
bare.add(c.name);
|
|
82
|
+
names.push(c.name);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return names;
|
|
87
|
+
}
|
|
33
88
|
/** A bare name, or a qualified one's table and column parts: as written, or wrapped in one matching pair of quotes or brackets. */
|
|
34
89
|
function partPattern(part) {
|
|
35
90
|
const p = escapeRegex(part);
|
|
@@ -38,8 +93,7 @@ function partPattern(part) {
|
|
|
38
93
|
function namePattern(name) {
|
|
39
94
|
if (typeof name === "string")
|
|
40
95
|
return partPattern(name);
|
|
41
|
-
|
|
42
|
-
return `${partPattern(name.table)}(?:\\.|[ \\t]+\\.[ \\t]+)${partPattern(name.column)}`;
|
|
96
|
+
return `${partPattern(name.table)}${QUALIFIER}${partPattern(name.column)}`;
|
|
43
97
|
}
|
|
44
98
|
function escapeRegex(s) {
|
|
45
99
|
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mentions.js","sourceRoot":"","sources":["../../../src/schema/v2/mentions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mentions.js","sourceRoot":"","sources":["../../../src/schema/v2/mentions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Write `content` (a string, written as UTF-8, or bytes written as given) to a file
|
|
3
|
+
* inside a schema directory so that no link can redirect the write out of it
|
|
4
|
+
* (ADR 0028). `relativePath` names the file from `schemaDir`
|
|
5
|
+
* with `/` between its parts (`schema.json`, `tables/orders.md`). Every AskDB writer
|
|
6
|
+
* into a schema directory goes through here: `@askdb/enrich`'s saves, Studio's
|
|
7
|
+
* Playground history and `.gitignore`, and `@askdb/introspect`'s `schema.json`. A
|
|
8
|
+
* schema directory can come from an untrusted checkout (git stores symbolic links,
|
|
9
|
+
* tar archives also store hard links), and Studio saves into it for as long as it
|
|
10
|
+
* runs.
|
|
11
|
+
*
|
|
12
|
+
* Errors read `Refusing to write <relativePath> outside the schema directory: <why>`.
|
|
13
|
+
*
|
|
14
|
+
* - `relativePath` must name a file below `schemaDir`: an empty part, `.`, `..`, a
|
|
15
|
+
* NUL byte, or (on Windows) `\` in a part is refused, and so is an absolute path.
|
|
16
|
+
* - No directory between the schema directory and the target (`tables/`), and not
|
|
17
|
+
* the target itself, may be a symbolic link; either one is refused. The schema
|
|
18
|
+
* directory itself may be one: it is the path the user chose. Directories are not
|
|
19
|
+
* created.
|
|
20
|
+
* - The content goes to a new temp file next to the target (`O_EXCL`, so it never
|
|
21
|
+
* opens an existing path), which is then renamed over the target. `rename`
|
|
22
|
+
* replaces the directory entry instead of writing into the existing file, so a
|
|
23
|
+
* hard link to a file elsewhere is detached, not written through, and a symbolic
|
|
24
|
+
* link planted at the target after the check is replaced, not followed. This
|
|
25
|
+
* holds on Windows too, which has no `O_NOFOLLOW`.
|
|
26
|
+
* - A target the caller can't write is refused with `EACCES`, as a plain write
|
|
27
|
+
* would be. `rename` needs only write access to the directory, so without this
|
|
28
|
+
* check a read-only file (how Perforce and ClearCase mark files not checked out)
|
|
29
|
+
* would be replaced on macOS and Linux. The temp file needs write access to the
|
|
30
|
+
* directory too, so a save into a directory the caller can't write fails with
|
|
31
|
+
* `EACCES` even when the file itself is writable.
|
|
32
|
+
* - The temp file gets the target's owner, group, and permission bits before any
|
|
33
|
+
* content is written, so a `0600` file's new content is never readable by others
|
|
34
|
+
* and a `0660` file stays shared with its own group, not the group a new file in
|
|
35
|
+
* the directory would get (`keepOwnerAndGroup`). It is `fsync`ed before the
|
|
36
|
+
* rename. Readers, and a crash or power loss, see either the old file or the new
|
|
37
|
+
* one, never a partial write.
|
|
38
|
+
*
|
|
39
|
+
* Not covered: a directory between the schema directory and the target (`tables/`)
|
|
40
|
+
* being swapped for a link after the check and before the rename, since the temp
|
|
41
|
+
* path and the rename still resolve through it. That needs a concurrent local
|
|
42
|
+
* writer racing a save. And only root can give a file to another user, so on macOS
|
|
43
|
+
* and Linux a save by someone other than the file's owner (a member of a group that
|
|
44
|
+
* may write it) makes the saver its owner. On Windows, the rename fails with `EPERM`
|
|
45
|
+
* while another process holds the target open without delete sharing.
|
|
46
|
+
*/
|
|
47
|
+
export declare function saveSchemaFile(schemaDir: string, relativePath: string, content: string | Uint8Array): void;
|
|
48
|
+
/**
|
|
49
|
+
* `mode` for a file whose group could not be kept: the group and others both get
|
|
50
|
+
* only what both had before, so neither the group the file lands in nor the old
|
|
51
|
+
* group's non-members gain access (`0660` becomes `0600`, `0604` becomes `0600`).
|
|
52
|
+
*
|
|
53
|
+
* @internal Exported for its tests; `index.ts` doesn't re-export it.
|
|
54
|
+
*/
|
|
55
|
+
export declare function modeWhenGroupLost(mode: number): number;
|
|
56
|
+
//# sourceMappingURL=save-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save-file.d.ts","sourceRoot":"","sources":["../../../src/schema/v2/save-file.ts"],"names":[],"mappings":"AAkBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GAAG,UAAU,GAC3B,IAAI,CAwDN;AAsBD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGtD"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { accessSync, closeSync, constants as fsConstants, fchmodSync, fchownSync, fstatSync, fsyncSync, lstatSync, openSync, renameSync, rmSync, writeFileSync, } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
/**
|
|
5
|
+
* Write `content` (a string, written as UTF-8, or bytes written as given) to a file
|
|
6
|
+
* inside a schema directory so that no link can redirect the write out of it
|
|
7
|
+
* (ADR 0028). `relativePath` names the file from `schemaDir`
|
|
8
|
+
* with `/` between its parts (`schema.json`, `tables/orders.md`). Every AskDB writer
|
|
9
|
+
* into a schema directory goes through here: `@askdb/enrich`'s saves, Studio's
|
|
10
|
+
* Playground history and `.gitignore`, and `@askdb/introspect`'s `schema.json`. A
|
|
11
|
+
* schema directory can come from an untrusted checkout (git stores symbolic links,
|
|
12
|
+
* tar archives also store hard links), and Studio saves into it for as long as it
|
|
13
|
+
* runs.
|
|
14
|
+
*
|
|
15
|
+
* Errors read `Refusing to write <relativePath> outside the schema directory: <why>`.
|
|
16
|
+
*
|
|
17
|
+
* - `relativePath` must name a file below `schemaDir`: an empty part, `.`, `..`, a
|
|
18
|
+
* NUL byte, or (on Windows) `\` in a part is refused, and so is an absolute path.
|
|
19
|
+
* - No directory between the schema directory and the target (`tables/`), and not
|
|
20
|
+
* the target itself, may be a symbolic link; either one is refused. The schema
|
|
21
|
+
* directory itself may be one: it is the path the user chose. Directories are not
|
|
22
|
+
* created.
|
|
23
|
+
* - The content goes to a new temp file next to the target (`O_EXCL`, so it never
|
|
24
|
+
* opens an existing path), which is then renamed over the target. `rename`
|
|
25
|
+
* replaces the directory entry instead of writing into the existing file, so a
|
|
26
|
+
* hard link to a file elsewhere is detached, not written through, and a symbolic
|
|
27
|
+
* link planted at the target after the check is replaced, not followed. This
|
|
28
|
+
* holds on Windows too, which has no `O_NOFOLLOW`.
|
|
29
|
+
* - A target the caller can't write is refused with `EACCES`, as a plain write
|
|
30
|
+
* would be. `rename` needs only write access to the directory, so without this
|
|
31
|
+
* check a read-only file (how Perforce and ClearCase mark files not checked out)
|
|
32
|
+
* would be replaced on macOS and Linux. The temp file needs write access to the
|
|
33
|
+
* directory too, so a save into a directory the caller can't write fails with
|
|
34
|
+
* `EACCES` even when the file itself is writable.
|
|
35
|
+
* - The temp file gets the target's owner, group, and permission bits before any
|
|
36
|
+
* content is written, so a `0600` file's new content is never readable by others
|
|
37
|
+
* and a `0660` file stays shared with its own group, not the group a new file in
|
|
38
|
+
* the directory would get (`keepOwnerAndGroup`). It is `fsync`ed before the
|
|
39
|
+
* rename. Readers, and a crash or power loss, see either the old file or the new
|
|
40
|
+
* one, never a partial write.
|
|
41
|
+
*
|
|
42
|
+
* Not covered: a directory between the schema directory and the target (`tables/`)
|
|
43
|
+
* being swapped for a link after the check and before the rename, since the temp
|
|
44
|
+
* path and the rename still resolve through it. That needs a concurrent local
|
|
45
|
+
* writer racing a save. And only root can give a file to another user, so on macOS
|
|
46
|
+
* and Linux a save by someone other than the file's owner (a member of a group that
|
|
47
|
+
* may write it) makes the saver its owner. On Windows, the rename fails with `EPERM`
|
|
48
|
+
* while another process holds the target open without delete sharing.
|
|
49
|
+
*/
|
|
50
|
+
export function saveSchemaFile(schemaDir, relativePath, content) {
|
|
51
|
+
const refuse = (why) => new Error(`Refusing to write ${relativePath} outside the schema directory: ${why}`);
|
|
52
|
+
const dirs = relativePath.split("/");
|
|
53
|
+
for (const part of dirs) {
|
|
54
|
+
if (part === "" ||
|
|
55
|
+
part === "." ||
|
|
56
|
+
part === ".." ||
|
|
57
|
+
part.includes("\0") ||
|
|
58
|
+
(process.platform === "win32" && part.includes("\\"))) {
|
|
59
|
+
throw refuse(`${JSON.stringify(part)} is not a file or directory name`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const filename = dirs.pop();
|
|
63
|
+
let dir = schemaDir;
|
|
64
|
+
for (const [i, part] of dirs.entries()) {
|
|
65
|
+
dir = join(dir, part);
|
|
66
|
+
if (lstatSync(dir).isSymbolicLink()) {
|
|
67
|
+
throw refuse(`${dirs.slice(0, i + 1).join("/")}/ is a symbolic link`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const filePath = join(dir, filename);
|
|
71
|
+
const existing = lstatSync(filePath, { throwIfNoEntry: false });
|
|
72
|
+
if (existing?.isSymbolicLink())
|
|
73
|
+
throw refuse(`${JSON.stringify(filename)} is a symbolic link`);
|
|
74
|
+
if (existing)
|
|
75
|
+
accessSync(filePath, fsConstants.W_OK);
|
|
76
|
+
const tempPath = join(dir, `.askdb-save-${randomBytes(8).toString("hex")}.tmp`);
|
|
77
|
+
const fd = openSync(tempPath, fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL, 0o666);
|
|
78
|
+
try {
|
|
79
|
+
try {
|
|
80
|
+
// Keep the replaced file's owner, group, and permission bits, before the content lands.
|
|
81
|
+
if (existing) {
|
|
82
|
+
const mode = existing.mode & 0o777;
|
|
83
|
+
const groupKept = keepOwnerAndGroup(fd, existing);
|
|
84
|
+
fchmodSync(fd, groupKept ? mode : modeWhenGroupLost(mode));
|
|
85
|
+
}
|
|
86
|
+
writeFileSync(fd, content);
|
|
87
|
+
fsyncSync(fd);
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
closeSync(fd);
|
|
91
|
+
}
|
|
92
|
+
renameSync(tempPath, filePath);
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
try {
|
|
96
|
+
rmSync(tempPath, { force: true });
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Report the save's own error, not a failed cleanup (e.g. Windows EPERM).
|
|
100
|
+
}
|
|
101
|
+
throw e;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Give the file open at `fd` the owner and group of `existing`, as far as the
|
|
106
|
+
* process may: only root can change a file's owner, and anyone else can set only
|
|
107
|
+
* a group they belong to. Returns whether the group now matches; Windows has no
|
|
108
|
+
* POSIX owner or group, so there it is always true.
|
|
109
|
+
*/
|
|
110
|
+
function keepOwnerAndGroup(fd, existing) {
|
|
111
|
+
if (process.platform === "win32")
|
|
112
|
+
return true;
|
|
113
|
+
const tryChown = (uid, gid) => {
|
|
114
|
+
try {
|
|
115
|
+
fchownSync(fd, uid, gid);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Not permitted (or not supported by this file system); checked below.
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
if (fstatSync(fd).uid !== existing.uid)
|
|
122
|
+
tryChown(existing.uid, existing.gid);
|
|
123
|
+
if (fstatSync(fd).gid !== existing.gid)
|
|
124
|
+
tryChown(-1, existing.gid);
|
|
125
|
+
return fstatSync(fd).gid === existing.gid;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* `mode` for a file whose group could not be kept: the group and others both get
|
|
129
|
+
* only what both had before, so neither the group the file lands in nor the old
|
|
130
|
+
* group's non-members gain access (`0660` becomes `0600`, `0604` becomes `0600`).
|
|
131
|
+
*
|
|
132
|
+
* @internal Exported for its tests; `index.ts` doesn't re-export it.
|
|
133
|
+
*/
|
|
134
|
+
export function modeWhenGroupLost(mode) {
|
|
135
|
+
const shared = (mode >> 3) & mode & 0o007;
|
|
136
|
+
return (mode & 0o700) | (shared << 3) | shared;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=save-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save-file.js","sourceRoot":"","sources":["../../../src/schema/v2/save-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,4 @@
|
|
|
1
|
-
import { type ParsedTenantPolicyMarkdown, type NormalizedTenantPolicy
|
|
1
|
+
import { type ParsedTenantPolicyMarkdown, type NormalizedTenantPolicy } from "./tenant-policy.js";
|
|
2
2
|
export declare function parseTenantPolicyMarkdown(content: string, filePath?: string): ParsedTenantPolicyMarkdown;
|
|
3
3
|
export declare function normalizeTenantPolicy(parsed: ParsedTenantPolicyMarkdown, physicalTableIds: Set<string>, physicalColumnIds: Set<string>): NormalizedTenantPolicy;
|
|
4
|
-
export declare function isScopeThroughColumn(s: ScopeThrough): s is ScopeThrough & {
|
|
5
|
-
column: string;
|
|
6
|
-
};
|
|
7
|
-
export declare function isScopeThroughJoin(s: ScopeThrough): s is ScopeThrough & {
|
|
8
|
-
join: Array<{
|
|
9
|
-
from: string;
|
|
10
|
-
to: string;
|
|
11
|
-
}>;
|
|
12
|
-
};
|
|
13
4
|
//# sourceMappingURL=tenant-policy-loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-policy-loader.d.ts","sourceRoot":"","sources":["../../../src/schema/v2/tenant-policy-loader.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"tenant-policy-loader.d.ts","sourceRoot":"","sources":["../../../src/schema/v2/tenant-policy-loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,0BAA0B,EAG/B,KAAK,sBAAsB,EAI5B,MAAM,oBAAoB,CAAC;AAM5B,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,0BAA0B,CAiB5B;AAiCD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,0BAA0B,EAClC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,EAC7B,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC7B,sBAAsB,CAwLxB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SchemaParseError } from "../../errors.js";
|
|
2
2
|
import { readFrontMatter } from "./parser.js";
|
|
3
|
-
import { assertDistinctRootPlaceholders, tenantPolicyFrontmatterSchema, TENANT_POLICY_H2_SECTIONS, } from "./tenant-policy.js";
|
|
3
|
+
import { assertDistinctRootPlaceholders, formatTenantPolicyWarning, tenantPolicyFrontmatterSchema, TENANT_POLICY_H2_SECTIONS, } from "./tenant-policy.js";
|
|
4
4
|
// ---------------------------------------------------------------------------
|
|
5
5
|
// Parsing
|
|
6
6
|
// ---------------------------------------------------------------------------
|
|
@@ -34,18 +34,28 @@ function extractTenantPolicySections(body) {
|
|
|
34
34
|
// ---------------------------------------------------------------------------
|
|
35
35
|
// Cross-reference validation & normalization
|
|
36
36
|
// ---------------------------------------------------------------------------
|
|
37
|
+
/** Problems that stay warnings in every mode: an entry for a table schema.json no longer has. */
|
|
38
|
+
const TABLE_REMOVED_KINDS = new Set([
|
|
39
|
+
"orphaned_root_id",
|
|
40
|
+
"orphaned_scoped_table_id",
|
|
41
|
+
"orphaned_polymorphic_table_id",
|
|
42
|
+
"orphaned_global_table_id",
|
|
43
|
+
]);
|
|
37
44
|
export function normalizeTenantPolicy(parsed, physicalTableIds, physicalColumnIds) {
|
|
38
45
|
const fm = parsed.frontmatter;
|
|
39
46
|
const warnings = [];
|
|
40
47
|
// A shared placeholder would bind one root's IDs where another root's column is compared.
|
|
41
48
|
assertDistinctRootPlaceholders(fm.roots);
|
|
42
49
|
const rootIds = new Set(fm.roots.map((r) => r.id));
|
|
50
|
+
// An entry whose own table schema.json no longer has reports only that table: its
|
|
51
|
+
// columns went with it, and the entry scopes nothing, so they are not checked.
|
|
52
|
+
const tableRemoved = (tableId) => !physicalTableIds.has(tableId);
|
|
43
53
|
// Validate root table IDs exist in physical schema
|
|
44
54
|
for (const root of fm.roots) {
|
|
45
|
-
if (
|
|
55
|
+
if (tableRemoved(root.id)) {
|
|
46
56
|
warnings.push({ kind: "orphaned_root_id", id: root.id });
|
|
47
57
|
}
|
|
48
|
-
if (!physicalColumnIds.has(root.tenantIdColumn)) {
|
|
58
|
+
else if (!physicalColumnIds.has(root.tenantIdColumn)) {
|
|
49
59
|
warnings.push({
|
|
50
60
|
kind: "orphaned_column_id",
|
|
51
61
|
id: root.tenantIdColumn,
|
|
@@ -60,7 +70,7 @@ export function normalizeTenantPolicy(parsed, physicalTableIds, physicalColumnId
|
|
|
60
70
|
context: `parent of root ${root.id}`,
|
|
61
71
|
});
|
|
62
72
|
}
|
|
63
|
-
if (!physicalColumnIds.has(root.parent.foreignKey)) {
|
|
73
|
+
if (!tableRemoved(root.id) && !physicalColumnIds.has(root.parent.foreignKey)) {
|
|
64
74
|
warnings.push({
|
|
65
75
|
kind: "orphaned_fk_id",
|
|
66
76
|
id: root.parent.foreignKey,
|
|
@@ -85,7 +95,8 @@ export function normalizeTenantPolicy(parsed, physicalTableIds, physicalColumnId
|
|
|
85
95
|
context: `hierarchy child`,
|
|
86
96
|
});
|
|
87
97
|
}
|
|
88
|
-
|
|
98
|
+
// The edge's foreign key sits on the child's table.
|
|
99
|
+
if (!tableRemoved(edge.child) && !physicalColumnIds.has(edge.foreignKey)) {
|
|
89
100
|
warnings.push({
|
|
90
101
|
kind: "orphaned_fk_id",
|
|
91
102
|
id: edge.foreignKey,
|
|
@@ -100,7 +111,8 @@ export function normalizeTenantPolicy(parsed, physicalTableIds, physicalColumnId
|
|
|
100
111
|
}
|
|
101
112
|
// Validate scoped tables
|
|
102
113
|
for (const st of fm.scopedTables ?? []) {
|
|
103
|
-
|
|
114
|
+
const removed = tableRemoved(st.id);
|
|
115
|
+
if (removed) {
|
|
104
116
|
warnings.push({ kind: "orphaned_scoped_table_id", id: st.id });
|
|
105
117
|
}
|
|
106
118
|
for (const path of st.scopeThrough) {
|
|
@@ -111,6 +123,8 @@ export function normalizeTenantPolicy(parsed, physicalTableIds, physicalColumnId
|
|
|
111
123
|
context: `scopeThrough on ${st.id}`,
|
|
112
124
|
});
|
|
113
125
|
}
|
|
126
|
+
if (removed)
|
|
127
|
+
continue;
|
|
114
128
|
if ("column" in path) {
|
|
115
129
|
if (!physicalColumnIds.has(path.column)) {
|
|
116
130
|
warnings.push({
|
|
@@ -142,17 +156,18 @@ export function normalizeTenantPolicy(parsed, physicalTableIds, physicalColumnId
|
|
|
142
156
|
}
|
|
143
157
|
// Validate polymorphic tables
|
|
144
158
|
for (const pt of fm.polymorphicTables ?? []) {
|
|
145
|
-
|
|
159
|
+
const removed = tableRemoved(pt.id);
|
|
160
|
+
if (removed) {
|
|
146
161
|
warnings.push({ kind: "orphaned_polymorphic_table_id", id: pt.id });
|
|
147
162
|
}
|
|
148
|
-
if (!physicalColumnIds.has(pt.typeColumn)) {
|
|
163
|
+
if (!removed && !physicalColumnIds.has(pt.typeColumn)) {
|
|
149
164
|
warnings.push({
|
|
150
165
|
kind: "orphaned_column_id",
|
|
151
166
|
id: pt.typeColumn,
|
|
152
167
|
context: `polymorphic typeColumn on ${pt.id}`,
|
|
153
168
|
});
|
|
154
169
|
}
|
|
155
|
-
if (!physicalColumnIds.has(pt.idColumn)) {
|
|
170
|
+
if (!removed && !physicalColumnIds.has(pt.idColumn)) {
|
|
156
171
|
warnings.push({
|
|
157
172
|
kind: "orphaned_column_id",
|
|
158
173
|
id: pt.idColumn,
|
|
@@ -171,10 +186,20 @@ export function normalizeTenantPolicy(parsed, physicalTableIds, physicalColumnId
|
|
|
171
186
|
}
|
|
172
187
|
// Validate global tables
|
|
173
188
|
for (const gt of fm.globalTables ?? []) {
|
|
174
|
-
if (
|
|
189
|
+
if (tableRemoved(gt)) {
|
|
175
190
|
warnings.push({ kind: "orphaned_global_table_id", id: gt });
|
|
176
191
|
}
|
|
177
192
|
}
|
|
193
|
+
// Under strict, a policy that doesn't match schema.json fails the load: tenancy
|
|
194
|
+
// must not run on a policy with a renamed column or a cycle (ADR 0023). Only a
|
|
195
|
+
// removed table's entry stays a warning, since it scopes nothing.
|
|
196
|
+
if (fm.enforcement === "strict") {
|
|
197
|
+
const errors = warnings.filter((w) => !TABLE_REMOVED_KINDS.has(w.kind));
|
|
198
|
+
if (errors.length > 0) {
|
|
199
|
+
throw new SchemaParseError(`the tenant policy doesn't match schema.json, and enforcement is strict: ` +
|
|
200
|
+
`${errors.map(formatTenantPolicyWarning).join("; ")}. Update tenant-policy.md to match schema.json.`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
178
203
|
// Build coverage report
|
|
179
204
|
const coverage = buildCoverage(fm, physicalTableIds);
|
|
180
205
|
return {
|
|
@@ -232,54 +257,43 @@ function buildCoverage(fm, physicalTableIds) {
|
|
|
232
257
|
return entries;
|
|
233
258
|
}
|
|
234
259
|
// ---------------------------------------------------------------------------
|
|
235
|
-
// Helpers — scope-through classification for mixed tables
|
|
236
|
-
// ---------------------------------------------------------------------------
|
|
237
|
-
export function isScopeThroughColumn(s) {
|
|
238
|
-
return "column" in s;
|
|
239
|
-
}
|
|
240
|
-
export function isScopeThroughJoin(s) {
|
|
241
|
-
return "join" in s;
|
|
242
|
-
}
|
|
243
|
-
// ---------------------------------------------------------------------------
|
|
244
260
|
// Cycle detection in hierarchy
|
|
245
261
|
// ---------------------------------------------------------------------------
|
|
246
262
|
function detectHierarchyCycles(fm) {
|
|
247
|
-
|
|
263
|
+
// Every parent of every child: the hierarchy is a DAG, so a root may have several
|
|
264
|
+
// parents, and keeping one per child would hide a cycle behind a later edge.
|
|
265
|
+
const parents = new Map();
|
|
266
|
+
const addEdge = (child, parent) => {
|
|
267
|
+
const set = parents.get(child) ?? new Set();
|
|
268
|
+
set.add(parent);
|
|
269
|
+
parents.set(child, set);
|
|
270
|
+
};
|
|
248
271
|
for (const root of fm.roots) {
|
|
249
|
-
if (root.parent)
|
|
250
|
-
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
// Also use hierarchy edges
|
|
254
|
-
for (const edge of fm.hierarchy ?? []) {
|
|
255
|
-
parentMap.set(edge.child, edge.parent);
|
|
272
|
+
if (root.parent)
|
|
273
|
+
addEdge(root.id, root.parent.root);
|
|
256
274
|
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
275
|
+
for (const edge of fm.hierarchy ?? [])
|
|
276
|
+
addEdge(edge.child, edge.parent);
|
|
277
|
+
// Depth-first walk up the parent edges; reaching a node still on the stack closes a cycle.
|
|
278
|
+
const state = new Map();
|
|
279
|
+
const stack = [];
|
|
260
280
|
const cycleNodes = [];
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
const
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
if (cycleStart !== -1) {
|
|
271
|
-
cycleNodes.push(...path.slice(cycleStart));
|
|
272
|
-
}
|
|
273
|
-
break;
|
|
274
|
-
}
|
|
275
|
-
inStack.add(current);
|
|
276
|
-
path.push(current);
|
|
277
|
-
current = parentMap.get(current);
|
|
278
|
-
}
|
|
279
|
-
for (const n of path) {
|
|
280
|
-
visited.add(n);
|
|
281
|
-
inStack.delete(n);
|
|
281
|
+
const visit = (node) => {
|
|
282
|
+
state.set(node, "open");
|
|
283
|
+
stack.push(node);
|
|
284
|
+
for (const parent of parents.get(node) ?? []) {
|
|
285
|
+
const seen = state.get(parent);
|
|
286
|
+
if (seen === "open")
|
|
287
|
+
cycleNodes.push(...stack.slice(stack.indexOf(parent)));
|
|
288
|
+
else if (seen === undefined)
|
|
289
|
+
visit(parent);
|
|
282
290
|
}
|
|
291
|
+
stack.pop();
|
|
292
|
+
state.set(node, "done");
|
|
293
|
+
};
|
|
294
|
+
for (const node of parents.keys()) {
|
|
295
|
+
if (!state.has(node))
|
|
296
|
+
visit(node);
|
|
283
297
|
}
|
|
284
298
|
return [...new Set(cycleNodes)];
|
|
285
299
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant-policy-loader.js","sourceRoot":"","sources":["../../../src/schema/v2/tenant-policy-loader.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tenant-policy-loader.js","sourceRoot":"","sources":["../../../src/schema/v2/tenant-policy-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,14 +43,14 @@ export declare const polymorphicTableSchema: z.ZodObject<{
|
|
|
43
43
|
mapping: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
44
44
|
}, z.core.$strict>;
|
|
45
45
|
export declare const enforcementModeSchema: z.ZodEnum<{
|
|
46
|
-
strict: "strict";
|
|
47
46
|
warn: "warn";
|
|
47
|
+
strict: "strict";
|
|
48
48
|
}>;
|
|
49
49
|
export declare const tenantPolicyFrontmatterSchema: z.ZodObject<{
|
|
50
50
|
schemaId: z.ZodString;
|
|
51
51
|
enforcement: z.ZodEnum<{
|
|
52
|
-
strict: "strict";
|
|
53
52
|
warn: "warn";
|
|
53
|
+
strict: "strict";
|
|
54
54
|
}>;
|
|
55
55
|
roots: z.ZodArray<z.ZodObject<{
|
|
56
56
|
id: z.ZodString;
|
|
@@ -254,6 +254,11 @@ export type TenantPolicyWarning = {
|
|
|
254
254
|
id: string;
|
|
255
255
|
context: string;
|
|
256
256
|
};
|
|
257
|
+
/**
|
|
258
|
+
* One line describing a tenant policy problem, naming the IDs involved. The strict
|
|
259
|
+
* load error, the `askdb.tenant.policy_warnings` log message and the CLI all use it.
|
|
260
|
+
*/
|
|
261
|
+
export declare function formatTenantPolicyWarning(warning: TenantPolicyWarning): string;
|
|
257
262
|
export type NormalizedTenantPolicy = {
|
|
258
263
|
schemaId: string;
|
|
259
264
|
enforcement: EnforcementMode;
|