@mnemonik/shared 7.119.2 → 7.120.1

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.
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Judge a stored or pushed path the way the daemon judged it, from the rules
3
+ * the daemon uploaded (`projects.scanner_ignore_patterns`).
4
+ *
5
+ * The daemon walks the disk with every rule file in front of it. The server
6
+ * never sees the disk; it has the root .gitignore / .mnemonikignore lines (the
7
+ * privacy list) plus the tagged nested-ignore and .gitattributes lines the
8
+ * daemon uploads beside them (`indexClassifier.ts`, "Rule upload"). This
9
+ * module rebuilds the same precedence from those lines so the /scan/push
10
+ * backstop, file_push, the dropped-path marker bookkeeping and retirement all
11
+ * reach the daemon's answer:
12
+ *
13
+ * hard built-in directories, secret files, the root ignore patterns
14
+ * (makeIgnoreMatcher - unchanged, never overridable), and a nested
15
+ * ignore file that ignores the path;
16
+ * soft classifyForIndex: `!pattern` and .gitattributes overrides, then the
17
+ * soft defaults - path rules always, content rules when content is
18
+ * supplied.
19
+ */
20
+ import ignore from 'ignore';
21
+ import { AUTHORITY_FILE_MATCHERS, makeIgnoreMatcher } from './codeScanner.js';
22
+ import { classifyForIndex, decodeIndexRules, parseGitattributes, softDefaultForContent, } from './indexClassifier.js';
23
+ function compile(lines) {
24
+ const cleaned = lines.filter((line) => typeof line === 'string' && line.trim().length > 0);
25
+ if (cleaned.length === 0)
26
+ return null;
27
+ try {
28
+ return ignore().add([...cleaned]);
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ /** Deepest layer with an opinion wins, as CodeScanner's walk resolves it. */
35
+ function verdictFor(path, layers) {
36
+ for (let i = layers.length - 1; i >= 0; i--) {
37
+ const layer = layers[i];
38
+ if (!layer)
39
+ continue;
40
+ let sub;
41
+ if (layer.baseRel === '')
42
+ sub = path;
43
+ else if (path.startsWith(`${layer.baseRel}/`))
44
+ sub = path.slice(layer.baseRel.length + 1);
45
+ else
46
+ continue;
47
+ try {
48
+ const res = layer.ig.test(sub);
49
+ if (res.ignored)
50
+ return 'ignored';
51
+ if (res.unignored)
52
+ return 'unignored';
53
+ }
54
+ catch {
55
+ // `ignore` throws on paths it considers invalid; such a path has no verdict.
56
+ }
57
+ }
58
+ return 'unmatched';
59
+ }
60
+ const depth = (baseRel) => (baseRel === '' ? 0 : baseRel.split('/').length);
61
+ export function makeIndexJudge(storedPatterns = []) {
62
+ const rules = decodeIndexRules(storedPatterns);
63
+ // The privacy net is exactly what it was: root patterns, built-in dirs, secrets.
64
+ const isHardIgnored = makeIgnoreMatcher(rules.rootIgnore);
65
+ const layers = [];
66
+ const root = compile(rules.rootIgnore);
67
+ if (root)
68
+ layers.push({ baseRel: '', ig: root });
69
+ const nested = [...rules.nestedIgnore.entries()].sort(([a], [b]) => depth(a) - depth(b));
70
+ for (const [baseRel, lines] of nested) {
71
+ const ig = compile(lines);
72
+ if (ig)
73
+ layers.push({ baseRel, ig });
74
+ }
75
+ const attributes = [...rules.attributes.entries()].map(([baseRel, lines]) => ({ baseRel, rules: parseGitattributes(lines.join('\n')) }));
76
+ const judgePath = (relPath) => {
77
+ const path = relPath.replace(/\\/g, '/');
78
+ if (!path)
79
+ return { excluded: false };
80
+ if (isHardIgnored(path))
81
+ return { excluded: true, kind: 'hard', rule: 'ignore rule' };
82
+ const verdict = verdictFor(path, layers);
83
+ if (verdict === 'ignored') {
84
+ return { excluded: true, kind: 'hard', rule: 'nested ignore file' };
85
+ }
86
+ if (AUTHORITY_FILE_MATCHERS.some((matches) => matches(path))) {
87
+ return { excluded: false, override: 'authority' };
88
+ }
89
+ const classification = classifyForIndex(path, {
90
+ ignoreFileVerdict: verdict,
91
+ attributes,
92
+ });
93
+ if (!classification.include) {
94
+ return {
95
+ excluded: true,
96
+ kind: 'soft',
97
+ reason: classification.reason,
98
+ rule: classification.rule,
99
+ };
100
+ }
101
+ return classification.override
102
+ ? { excluded: false, override: classification.override }
103
+ : { excluded: false };
104
+ };
105
+ return {
106
+ judgePath,
107
+ judge(relPath, content) {
108
+ const byPath = judgePath(relPath);
109
+ if (byPath.excluded || byPath.override || content === undefined)
110
+ return byPath;
111
+ const byContent = softDefaultForContent(relPath, content);
112
+ return byContent ? { excluded: true, kind: 'soft', ...byContent } : byPath;
113
+ },
114
+ };
115
+ }
116
+ //# sourceMappingURL=indexJudge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexJudge.js","sourceRoot":"","sources":["../src/indexJudge.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mnemonik/shared",
3
- "version": "7.119.2",
3
+ "version": "7.120.1",
4
4
  "description": "Shared constants and utilities for Mnemonik packages",
5
5
  "repository": {
6
6
  "type": "git",