@proappstore/compliance 0.2.9 → 0.2.10

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.
@@ -12,6 +12,8 @@
12
12
  * missing == fail or missing == not-applicable.
13
13
  * - `list()` already excludes noise dirs (.git, node_modules, dist,
14
14
  * etc.). Implementations are responsible for that filtering.
15
+ * - `fsFileSource` additionally honours `.gitignore`; `mapFileSource`
16
+ * deliberately does not. See the note on `mapFileSource` for why (#122).
15
17
  */
16
18
  export interface FileSource {
17
19
  /** Yield every relevant file path. Implementations skip noise dirs. */
@@ -47,6 +49,21 @@ export declare function fsFileSource(repoDir: string): FileSource;
47
49
  * deploy), so bundle-size will return its "not built yet" warn anyway.
48
50
  *
49
51
  * `listDir` synthesises directory listings from the Map keys.
52
+ *
53
+ * DELIBERATELY DOES NOT HONOUR `.gitignore` (#122), unlike `fsFileSource`.
54
+ * The asymmetry is the point, not an oversight:
55
+ *
56
+ * - This source is fed by `fetchRepoFiles`, i.e. files that are actually IN the
57
+ * repository. Git ignore rules only ever applied to untracked files, so a
58
+ * tracked file listed in `.gitignore` still ships — skipping it here would
59
+ * teach the publish gate to overlook real source.
60
+ * - Ignored artefacts never reach this Map in the first place; they are not in
61
+ * the repo to fetch. There is nothing for `.gitignore` to exclude.
62
+ * - `fsFileSource` scans a working directory, where generated output sits
63
+ * beside source, so there the ignore file is genuinely informative.
64
+ *
65
+ * Net effect: honouring `.gitignore` can only weaken local feedback, never the
66
+ * gate that blocks publishing. SKIP_DIRS still applies here as the floor.
50
67
  */
51
68
  export declare function mapFileSource(files: Map<string, string>): FileSource;
52
69
  //# sourceMappingURL=file-source.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-source.d.ts","sourceRoot":"","sources":["../../src/lib/file-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,MAAM,WAAW,UAAU;IACzB,uEAAuE;IACvE,IAAI,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9B,0DAA0D;IAC1D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3C;iDAC6C;IAC7C,SAAS,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrD;mEAC+D;IAC/D,OAAO,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;CACjD;AAYD;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CA+BxD;AA4BD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,UAAU,CA8BpE"}
1
+ {"version":3,"file":"file-source.d.ts","sourceRoot":"","sources":["../../src/lib/file-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,MAAM,WAAW,UAAU;IACzB,uEAAuE;IACvE,IAAI,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9B,0DAA0D;IAC1D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3C;iDAC6C;IAC7C,SAAS,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrD;mEAC+D;IAC/D,OAAO,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;CACjD;AAgCD;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CA+BxD;AAuDD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,UAAU,CA8BpE"}
@@ -12,9 +12,25 @@
12
12
  * missing == fail or missing == not-applicable.
13
13
  * - `list()` already excludes noise dirs (.git, node_modules, dist,
14
14
  * etc.). Implementations are responsible for that filtering.
15
+ * - `fsFileSource` additionally honours `.gitignore`; `mapFileSource`
16
+ * deliberately does not. See the note on `mapFileSource` for why (#122).
15
17
  */
16
18
  import { readdir, readFile } from 'node:fs/promises';
17
19
  import { join, relative, sep } from 'node:path';
20
+ import { isIgnored, parseGitignore } from './gitignore.js';
21
+ /**
22
+ * Directories never worth scanning, regardless of `.gitignore` (#122).
23
+ *
24
+ * This is the floor, not the policy. `fsFileSource` also honours `.gitignore`,
25
+ * which is the general answer; this list still matters for two cases that file
26
+ * cannot cover: a repo with no `.gitignore` at all, and `mapFileSource`, which
27
+ * deliberately does not consult one.
28
+ *
29
+ * The generated-report directories are here because their output is HTML with
30
+ * inline CSS custom properties and webfonts — precisely what `no-brand-overrides`
31
+ * and `brand-fonts` match on — so a developer who merely ran a QA tool locally
32
+ * would fail checks on a file they never wrote.
33
+ */
18
34
  const SKIP_DIRS = new Set([
19
35
  '.git',
20
36
  'node_modules',
@@ -23,6 +39,13 @@ const SKIP_DIRS = new Set([
23
39
  '.cache',
24
40
  '.wrangler',
25
41
  '.turbo',
42
+ // Generated reports and caches (#122).
43
+ '.vibe-check',
44
+ 'playwright-report',
45
+ 'test-results',
46
+ 'coverage',
47
+ '.vite',
48
+ 'graphify-out',
26
49
  ]);
27
50
  /**
28
51
  * Filesystem-backed FileSource — used by the CLI and CI. Walks the
@@ -79,7 +102,11 @@ function hasTraversal(path) {
79
102
  return true; // absolute
80
103
  return path.split(/[/\\]/).some((seg) => seg === '..');
81
104
  }
82
- async function* walk(dir, root) {
105
+ /** POSIX path of `full` relative to `root` — the form checks and rules expect. */
106
+ function toRelPosix(full, root) {
107
+ return relative(root, full).split(sep).join('/');
108
+ }
109
+ async function* walk(dir, root, layers = []) {
83
110
  let entries;
84
111
  try {
85
112
  entries = await readdir(dir, { withFileTypes: true });
@@ -87,17 +114,34 @@ async function* walk(dir, root) {
87
114
  catch {
88
115
  return;
89
116
  }
117
+ // Pick up this directory's .gitignore before deciding anything in it, so its
118
+ // rules govern its own siblings. Deeper files are appended, and `isIgnored`
119
+ // evaluates last-match-wins, which is how they come to override shallower ones.
120
+ let active = layers;
121
+ const hasGitignore = entries.some((e) => e.isFile() && e.name === '.gitignore');
122
+ if (hasGitignore) {
123
+ const text = await readFile(join(dir, '.gitignore'), 'utf8').catch(() => null);
124
+ if (text !== null) {
125
+ active = [...layers, { base: toRelPosix(dir, root), rules: parseGitignore(text) }];
126
+ }
127
+ }
90
128
  for (const entry of entries) {
91
129
  const full = join(dir, entry.name);
130
+ const rel = toRelPosix(full, root);
92
131
  if (entry.isDirectory()) {
132
+ // `.git` is not negotiable and never appears in a .gitignore.
93
133
  if (SKIP_DIRS.has(entry.name))
94
134
  continue;
95
- yield* walk(full, root);
135
+ if (isIgnored(active, rel, true))
136
+ continue;
137
+ yield* walk(full, root, active);
96
138
  }
97
139
  else if (entry.isFile()) {
140
+ if (isIgnored(active, rel, false))
141
+ continue;
98
142
  // Always emit POSIX-style paths so checks can rely on consistent
99
143
  // separators across platforms.
100
- yield relative(root, full).split(sep).join('/');
144
+ yield rel;
101
145
  }
102
146
  }
103
147
  }
@@ -111,6 +155,21 @@ async function* walk(dir, root) {
111
155
  * deploy), so bundle-size will return its "not built yet" warn anyway.
112
156
  *
113
157
  * `listDir` synthesises directory listings from the Map keys.
158
+ *
159
+ * DELIBERATELY DOES NOT HONOUR `.gitignore` (#122), unlike `fsFileSource`.
160
+ * The asymmetry is the point, not an oversight:
161
+ *
162
+ * - This source is fed by `fetchRepoFiles`, i.e. files that are actually IN the
163
+ * repository. Git ignore rules only ever applied to untracked files, so a
164
+ * tracked file listed in `.gitignore` still ships — skipping it here would
165
+ * teach the publish gate to overlook real source.
166
+ * - Ignored artefacts never reach this Map in the first place; they are not in
167
+ * the repo to fetch. There is nothing for `.gitignore` to exclude.
168
+ * - `fsFileSource` scans a working directory, where generated output sits
169
+ * beside source, so there the ignore file is genuinely informative.
170
+ *
171
+ * Net effect: honouring `.gitignore` can only weaken local feedback, never the
172
+ * gate that blocks publishing. SKIP_DIRS still applies here as the floor.
114
173
  */
115
174
  export function mapFileSource(files) {
116
175
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"file-source.js","sourceRoot":"","sources":["../../src/lib/file-source.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-source.js","sourceRoot":"","sources":["../../src/lib/file-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * A `.gitignore` matcher, hand-written and dependency-free (#122).
3
+ *
4
+ * Why this exists: the walker used to filter directories against a hardcoded
5
+ * SKIP_DIRS list, so generated-but-git-ignored artefacts were scanned as if a
6
+ * developer had written them. The worst offenders are HTML reports
7
+ * (`.vibe-check/`, `playwright-report/`, `coverage/`) because they inline CSS
8
+ * custom properties and webfonts — exactly what `no-brand-overrides` and
9
+ * `brand-fonts` look for. An app's own ignore file is the best available
10
+ * statement of "this isn't source".
11
+ *
12
+ * Why no dependency: `@proappstore/compliance` has zero runtime dependencies
13
+ * and is consumed by both the CLI and a Workers-bound bundle. Adding one for a
14
+ * few hundred lines of pattern matching is a worse trade than owning it.
15
+ *
16
+ * SUPPORTED: comments and blanks, `\#`/`\!` escapes, trailing-space stripping,
17
+ * `!` negation with last-match-wins, leading `/` anchoring, trailing `/`
18
+ * (directory-only), `*`, `?`, `**` (leading, trailing, and as a whole segment),
19
+ * character classes including `[!...]` negation, and nested `.gitignore` files
20
+ * with deeper files overriding shallower ones.
21
+ *
22
+ * NOT SUPPORTED, deliberately: `.git/info/exclude`, the global
23
+ * `core.excludesFile`, and `.gitattributes`. All of them live outside the tree
24
+ * being scanned or need git itself to resolve.
25
+ *
26
+ * KNOWN LIMIT, inherited from git: ignore rules apply to UNTRACKED files. A
27
+ * file that is already tracked stays tracked even if listed in `.gitignore`, so
28
+ * this is not a sound proxy for "not in the repo". That is why only
29
+ * `fsFileSource` consults it — see the asymmetry note in file-source.ts.
30
+ */
31
+ export interface IgnoreRule {
32
+ /** `!pattern` — re-includes a path an earlier rule excluded. */
33
+ negated: boolean;
34
+ /** Pattern ended in `/` — matches directories only. */
35
+ dirOnly: boolean;
36
+ regex: RegExp;
37
+ /** The original line, for debugging a surprising match. */
38
+ source: string;
39
+ }
40
+ /** Rules from one `.gitignore`, plus where that file lived. */
41
+ export interface IgnoreLayer {
42
+ /** POSIX path of the containing directory, relative to the scan root. `''` at root. */
43
+ base: string;
44
+ rules: IgnoreRule[];
45
+ }
46
+ /** Parse one `.gitignore` body into ordered rules. */
47
+ export declare function parseGitignore(text: string): IgnoreRule[];
48
+ /**
49
+ * Is `relPath` (POSIX, relative to the scan root) ignored by `layers`?
50
+ *
51
+ * Layers must be ordered shallowest-first. Evaluation is last-match-wins across
52
+ * the whole ordered set, which gives both of git's precedence rules at once:
53
+ * a later line in one file beats an earlier one, and a deeper `.gitignore`
54
+ * beats a shallower one.
55
+ *
56
+ * Note git's rule that a file under an excluded directory cannot be re-included.
57
+ * The walker gets that for free by never descending into an ignored directory.
58
+ */
59
+ export declare function isIgnored(layers: IgnoreLayer[], relPath: string, isDir: boolean): boolean;
60
+ //# sourceMappingURL=gitignore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../src/lib/gitignore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,MAAM,WAAW,UAAU;IACzB,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,+DAA+D;AAC/D,MAAM,WAAW,WAAW;IAC1B,uFAAuF;IACvF,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AA6FD,sDAAsD;AACtD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAsCzD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAoBzF"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * A `.gitignore` matcher, hand-written and dependency-free (#122).
3
+ *
4
+ * Why this exists: the walker used to filter directories against a hardcoded
5
+ * SKIP_DIRS list, so generated-but-git-ignored artefacts were scanned as if a
6
+ * developer had written them. The worst offenders are HTML reports
7
+ * (`.vibe-check/`, `playwright-report/`, `coverage/`) because they inline CSS
8
+ * custom properties and webfonts — exactly what `no-brand-overrides` and
9
+ * `brand-fonts` look for. An app's own ignore file is the best available
10
+ * statement of "this isn't source".
11
+ *
12
+ * Why no dependency: `@proappstore/compliance` has zero runtime dependencies
13
+ * and is consumed by both the CLI and a Workers-bound bundle. Adding one for a
14
+ * few hundred lines of pattern matching is a worse trade than owning it.
15
+ *
16
+ * SUPPORTED: comments and blanks, `\#`/`\!` escapes, trailing-space stripping,
17
+ * `!` negation with last-match-wins, leading `/` anchoring, trailing `/`
18
+ * (directory-only), `*`, `?`, `**` (leading, trailing, and as a whole segment),
19
+ * character classes including `[!...]` negation, and nested `.gitignore` files
20
+ * with deeper files overriding shallower ones.
21
+ *
22
+ * NOT SUPPORTED, deliberately: `.git/info/exclude`, the global
23
+ * `core.excludesFile`, and `.gitattributes`. All of them live outside the tree
24
+ * being scanned or need git itself to resolve.
25
+ *
26
+ * KNOWN LIMIT, inherited from git: ignore rules apply to UNTRACKED files. A
27
+ * file that is already tracked stays tracked even if listed in `.gitignore`, so
28
+ * this is not a sound proxy for "not in the repo". That is why only
29
+ * `fsFileSource` consults it — see the asymmetry note in file-source.ts.
30
+ */
31
+ const REGEX_SPECIAL = /[.*+?^${}()|[\]\\]/g;
32
+ function escapeLiteral(char) {
33
+ return char.replace(REGEX_SPECIAL, '\\$&');
34
+ }
35
+ /**
36
+ * Strip trailing spaces, which git ignores unless backslash-escaped. Leading
37
+ * whitespace is significant and is left alone.
38
+ */
39
+ function stripTrailingSpaces(line) {
40
+ let end = line.length;
41
+ while (end > 0 && line[end - 1] === ' ') {
42
+ // A space is literal when preceded by an odd number of backslashes.
43
+ let backslashes = 0;
44
+ let i = end - 2;
45
+ while (i >= 0 && line[i] === '\\') {
46
+ backslashes++;
47
+ i--;
48
+ }
49
+ if (backslashes % 2 === 1)
50
+ break;
51
+ end--;
52
+ }
53
+ return line.slice(0, end);
54
+ }
55
+ /** Translate a glob body into regex source. Never anchors — the caller does. */
56
+ function translate(pattern) {
57
+ let out = '';
58
+ let i = 0;
59
+ while (i < pattern.length) {
60
+ const char = pattern[i];
61
+ if (char === '*') {
62
+ let j = i;
63
+ while (pattern[j] === '*')
64
+ j++;
65
+ const isDoubled = j - i >= 2;
66
+ const atSegmentStart = i === 0 || pattern[i - 1] === '/';
67
+ const atSegmentEnd = j >= pattern.length || pattern[j] === '/';
68
+ if (isDoubled && atSegmentStart && atSegmentEnd) {
69
+ if (j >= pattern.length) {
70
+ // Trailing `/**` — everything below this point.
71
+ out += '.*';
72
+ i = j;
73
+ }
74
+ else {
75
+ // `**/` — zero or more whole directory segments.
76
+ out += '(?:[^/]+/)*';
77
+ i = j + 1;
78
+ }
79
+ continue;
80
+ }
81
+ // `**` that is not a whole segment degrades to `*`, as git does.
82
+ out += '[^/]*';
83
+ i = j;
84
+ continue;
85
+ }
86
+ if (char === '?') {
87
+ out += '[^/]';
88
+ i++;
89
+ continue;
90
+ }
91
+ if (char === '[') {
92
+ let j = i + 1;
93
+ if (pattern[j] === '!' || pattern[j] === '^')
94
+ j++;
95
+ if (pattern[j] === ']')
96
+ j++; // a `]` first in the class is literal
97
+ while (j < pattern.length && pattern[j] !== ']')
98
+ j++;
99
+ if (j >= pattern.length) {
100
+ // Unterminated class — git treats the `[` as literal.
101
+ out += '\\[';
102
+ i++;
103
+ continue;
104
+ }
105
+ let cls = pattern.slice(i, j + 1);
106
+ if (cls[1] === '!')
107
+ cls = `[^${cls.slice(2)}`; // git spells negation `[!…]`
108
+ out += cls;
109
+ i = j + 1;
110
+ continue;
111
+ }
112
+ if (char === '\\') {
113
+ const next = pattern[i + 1];
114
+ if (next !== undefined) {
115
+ out += escapeLiteral(next);
116
+ i += 2;
117
+ continue;
118
+ }
119
+ out += '\\\\';
120
+ i++;
121
+ continue;
122
+ }
123
+ out += escapeLiteral(char);
124
+ i++;
125
+ }
126
+ return out;
127
+ }
128
+ /** Parse one `.gitignore` body into ordered rules. */
129
+ export function parseGitignore(text) {
130
+ const rules = [];
131
+ for (const raw of text.split(/\r?\n/)) {
132
+ let line = stripTrailingSpaces(raw);
133
+ if (line === '' || line.startsWith('#'))
134
+ continue;
135
+ let negated = false;
136
+ if (line.startsWith('!')) {
137
+ negated = true;
138
+ line = line.slice(1);
139
+ }
140
+ else if (line.startsWith('\\#') || line.startsWith('\\!')) {
141
+ line = line.slice(1); // escaped literal `#` / `!`
142
+ }
143
+ if (line === '')
144
+ continue;
145
+ let dirOnly = false;
146
+ if (line.endsWith('/')) {
147
+ dirOnly = true;
148
+ line = line.slice(0, -1);
149
+ }
150
+ if (line === '')
151
+ continue;
152
+ // A slash anywhere (other than the trailing one already removed) anchors the
153
+ // pattern to the .gitignore's own directory. Otherwise it matches at any depth.
154
+ const anchored = line.includes('/');
155
+ if (line.startsWith('/'))
156
+ line = line.slice(1);
157
+ const body = translate(line);
158
+ rules.push({
159
+ negated,
160
+ dirOnly,
161
+ source: raw,
162
+ regex: new RegExp(anchored ? `^${body}$` : `(?:^|.*/)${body}$`),
163
+ });
164
+ }
165
+ return rules;
166
+ }
167
+ /**
168
+ * Is `relPath` (POSIX, relative to the scan root) ignored by `layers`?
169
+ *
170
+ * Layers must be ordered shallowest-first. Evaluation is last-match-wins across
171
+ * the whole ordered set, which gives both of git's precedence rules at once:
172
+ * a later line in one file beats an earlier one, and a deeper `.gitignore`
173
+ * beats a shallower one.
174
+ *
175
+ * Note git's rule that a file under an excluded directory cannot be re-included.
176
+ * The walker gets that for free by never descending into an ignored directory.
177
+ */
178
+ export function isIgnored(layers, relPath, isDir) {
179
+ // Evaluate each ancestor directory before the path itself. A rule like
180
+ // `.vibe-check/` matches only the directory, yet everything beneath it is
181
+ // ignored too — the walker gets that by not descending, but a direct query
182
+ // for `.vibe-check/report/actions.html` has to reach the same answer, which
183
+ // is what `git check-ignore` reports.
184
+ const segments = relPath.split('/');
185
+ let ignored = false;
186
+ for (let i = 0; i < segments.length; i++) {
187
+ const isLast = i === segments.length - 1;
188
+ const partial = segments.slice(0, i + 1).join('/');
189
+ const verdict = matchPath(layers, partial, isLast ? isDir : true);
190
+ if (verdict !== null)
191
+ ignored = verdict;
192
+ // Git does not allow re-including anything under an excluded directory, so
193
+ // once an ancestor is ignored the answer is settled.
194
+ if (ignored && !isLast)
195
+ return true;
196
+ }
197
+ return ignored;
198
+ }
199
+ /** Last-match-wins across all applicable layers, or null if nothing matched. */
200
+ function matchPath(layers, path, isDir) {
201
+ let result = null;
202
+ for (const layer of layers) {
203
+ let subject;
204
+ if (layer.base === '') {
205
+ subject = path;
206
+ }
207
+ else if (path.startsWith(`${layer.base}/`)) {
208
+ subject = path.slice(layer.base.length + 1);
209
+ }
210
+ else {
211
+ continue; // this layer governs a different subtree
212
+ }
213
+ for (const rule of layer.rules) {
214
+ if (rule.dirOnly && !isDir)
215
+ continue;
216
+ if (rule.regex.test(subject))
217
+ result = !rule.negated;
218
+ }
219
+ }
220
+ return result;
221
+ }
222
+ //# sourceMappingURL=gitignore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/lib/gitignore.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@proappstore/compliance",
3
- "version": "0.2.9",
3
+ "version": "0.2.10",
4
4
  "description": "Compliance checks for apps published on proappstore.online — used by the CLI for local feedback and by CI for gating.",
5
5
  "license": "MIT",
6
6
  "type": "module",