@oddkin/analyzer 0.0.0-stage → 1.0.0-beta.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.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +17 -2
  3. package/dist/bin.d.ts +3 -0
  4. package/dist/bin.d.ts.map +1 -0
  5. package/dist/bin.js +65 -0
  6. package/dist/bin.js.map +1 -0
  7. package/dist/contracts.d.ts +29 -0
  8. package/dist/contracts.d.ts.map +1 -0
  9. package/dist/contracts.js +57 -0
  10. package/dist/contracts.js.map +1 -0
  11. package/dist/docs.d.ts +34 -0
  12. package/dist/docs.d.ts.map +1 -0
  13. package/dist/docs.js +63 -0
  14. package/dist/docs.js.map +1 -0
  15. package/dist/emit.d.ts +38 -0
  16. package/dist/emit.d.ts.map +1 -0
  17. package/dist/emit.js +406 -0
  18. package/dist/emit.js.map +1 -0
  19. package/dist/examples.d.ts +26 -0
  20. package/dist/examples.d.ts.map +1 -0
  21. package/dist/examples.js +185 -0
  22. package/dist/examples.js.map +1 -0
  23. package/dist/extract.d.ts +208 -0
  24. package/dist/extract.d.ts.map +1 -0
  25. package/dist/extract.js +1570 -0
  26. package/dist/extract.js.map +1 -0
  27. package/dist/foundations.d.ts +36 -0
  28. package/dist/foundations.d.ts.map +1 -0
  29. package/dist/foundations.js +108 -0
  30. package/dist/foundations.js.map +1 -0
  31. package/dist/history.d.ts +10 -0
  32. package/dist/history.d.ts.map +1 -0
  33. package/dist/history.js +62 -0
  34. package/dist/history.js.map +1 -0
  35. package/dist/impact-bin.d.ts +3 -0
  36. package/dist/impact-bin.d.ts.map +1 -0
  37. package/dist/impact-bin.js +7 -0
  38. package/dist/impact-bin.js.map +1 -0
  39. package/dist/impact-cli.d.ts +8 -0
  40. package/dist/impact-cli.d.ts.map +1 -0
  41. package/dist/impact-cli.js +121 -0
  42. package/dist/impact-cli.js.map +1 -0
  43. package/dist/impact.d.ts +282 -0
  44. package/dist/impact.d.ts.map +1 -0
  45. package/dist/impact.js +744 -0
  46. package/dist/impact.js.map +1 -0
  47. package/dist/index.d.ts +82 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +227 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/published.d.ts +43 -0
  52. package/dist/published.d.ts.map +1 -0
  53. package/dist/published.js +62 -0
  54. package/dist/published.js.map +1 -0
  55. package/dist/references.d.ts +70 -0
  56. package/dist/references.d.ts.map +1 -0
  57. package/dist/references.js +255 -0
  58. package/dist/references.js.map +1 -0
  59. package/dist/style-mappings.d.ts +46 -0
  60. package/dist/style-mappings.d.ts.map +1 -0
  61. package/dist/style-mappings.js +246 -0
  62. package/dist/style-mappings.js.map +1 -0
  63. package/dist/stylesheets.d.ts +56 -0
  64. package/dist/stylesheets.d.ts.map +1 -0
  65. package/dist/stylesheets.js +83 -0
  66. package/dist/stylesheets.js.map +1 -0
  67. package/dist/verification.d.ts +62 -0
  68. package/dist/verification.d.ts.map +1 -0
  69. package/dist/verification.js +115 -0
  70. package/dist/verification.js.map +1 -0
  71. package/package.json +40 -4
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Document stylesheets a package publishes (opt-in CSS such as a reset, page layout classes, and
3
+ * recipes for native elements: component-contracts.md §2.1), as metadata records an agent or a
4
+ * documentation site can use without reading the CSS: what to import, its cascade layer, the
5
+ * classes it defines, the theme tokens it reads, and the variables an author may set.
6
+ */
7
+ /** One stylesheet, as the package builds it. */
8
+ export interface StylesheetInput {
9
+ /** File name without `.css`, e.g. `typography`. */
10
+ readonly name: string;
11
+ /** The package export that loads it, e.g. `@oddkin/components/css/typography.css`. */
12
+ readonly import: string;
13
+ /** The cascade layer its rules are in, e.g. `odd.components`. */
14
+ readonly layer: string;
15
+ /** Its rules (without the layer wrapper). */
16
+ readonly css: string;
17
+ /** What it is for, from its source documentation. */
18
+ readonly description?: string;
19
+ /** Where it is defined, relative to the package root. */
20
+ readonly source?: {
21
+ readonly file: string;
22
+ readonly line: number;
23
+ };
24
+ }
25
+ /** The published record: `stylesheets["stylesheet:<name>"]`. */
26
+ export interface StylesheetRecord {
27
+ readonly name: string;
28
+ readonly import: string;
29
+ readonly layer: string;
30
+ readonly description?: string;
31
+ /** Classes it defines that carry the library prefix, without the dot. */
32
+ readonly classes: readonly string[];
33
+ /** Theme tokens it reads, by token name. */
34
+ readonly tokens: readonly string[];
35
+ /** Prefixed custom properties it reads that are not theme tokens: hooks an author may set. */
36
+ readonly variables: readonly string[];
37
+ readonly source?: {
38
+ readonly file: string;
39
+ readonly line: number;
40
+ };
41
+ }
42
+ /**
43
+ * Records for `inputs`. `prefix` is the library's class and variable prefix (`odd-`); `tokens`
44
+ * maps a theme token's CSS variable to its name.
45
+ */
46
+ export declare function stylesheetRecords(inputs: readonly StylesheetInput[], prefix: string, tokens?: ReadonlyMap<string, string>): Record<string, StylesheetRecord>;
47
+ /**
48
+ * The documentation of each stylesheet in a module that exports a `mapName` object from file name
49
+ * to stylesheet constant (`{ reset, 'avatar-group': avatarGroup }`): each key's JSDoc summary
50
+ * and the line of its constant.
51
+ */
52
+ export declare function stylesheetDocs(text: string, file: string, mapName?: string): Map<string, {
53
+ readonly description?: string;
54
+ readonly line: number;
55
+ }>;
56
+ //# sourceMappingURL=stylesheets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stylesheets.d.ts","sourceRoot":"","sources":["../src/stylesheets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,gDAAgD;AAChD,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,6CAA6C;IAC7C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,yDAAyD;IACzD,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACpE;AAED,gEAAgE;AAChE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,yEAAyE;IACzE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,8FAA8F;IAC9F,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACpE;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,eAAe,EAAE,EAClC,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAa,GAC9C,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAyBlC;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,SAAwB,GAC9B,GAAG,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAmCvE"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Document stylesheets a package publishes (opt-in CSS such as a reset, page layout classes, and
3
+ * recipes for native elements: component-contracts.md §2.1), as metadata records an agent or a
4
+ * documentation site can use without reading the CSS: what to import, its cascade layer, the
5
+ * classes it defines, the theme tokens it reads, and the variables an author may set.
6
+ */
7
+ import ts from 'typescript';
8
+ const escape = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
9
+ /**
10
+ * Records for `inputs`. `prefix` is the library's class and variable prefix (`odd-`); `tokens`
11
+ * maps a theme token's CSS variable to its name.
12
+ */
13
+ export function stylesheetRecords(inputs, prefix, tokens = new Map()) {
14
+ const classPattern = new RegExp(`\\.(${escape(prefix)}[A-Za-z0-9_-]+)`, 'g');
15
+ const variablePattern = new RegExp(`var\\(\\s*(--${escape(prefix)}[A-Za-z0-9_-]+)`, 'g');
16
+ const unique = (values) => [...new Set(values)].sort();
17
+ const records = [...inputs]
18
+ .sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0))
19
+ .map((input) => {
20
+ // Comments can quote selectors that the sheet does not define.
21
+ const css = input.css.replace(/\/\*[\s\S]*?\*\//g, '');
22
+ const read = unique([...css.matchAll(variablePattern)].map((m) => m[1]));
23
+ return [
24
+ `stylesheet:${input.name}`,
25
+ {
26
+ name: input.name,
27
+ import: input.import,
28
+ layer: input.layer,
29
+ ...(input.description ? { description: input.description } : {}),
30
+ classes: unique([...css.matchAll(classPattern)].map((m) => m[1])),
31
+ tokens: unique(read.flatMap((v) => (tokens.has(v) ? [tokens.get(v)] : []))),
32
+ variables: read.filter((v) => !tokens.has(v)),
33
+ ...(input.source ? { source: input.source } : {}),
34
+ },
35
+ ];
36
+ });
37
+ return Object.fromEntries(records);
38
+ }
39
+ /**
40
+ * The documentation of each stylesheet in a module that exports a `mapName` object from file name
41
+ * to stylesheet constant (`{ reset, 'avatar-group': avatarGroup }`): each key's JSDoc summary
42
+ * and the line of its constant.
43
+ */
44
+ export function stylesheetDocs(text, file, mapName = 'documentStylesheets') {
45
+ const source = ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true);
46
+ const declarations = new Map();
47
+ for (const statement of source.statements) {
48
+ if (!ts.isVariableStatement(statement))
49
+ continue;
50
+ for (const d of statement.declarationList.declarations)
51
+ if (ts.isIdentifier(d.name))
52
+ declarations.set(d.name.text, d);
53
+ }
54
+ let literal = declarations.get(mapName)?.initializer;
55
+ while (literal && (ts.isAsExpression(literal) || ts.isSatisfiesExpression(literal)))
56
+ literal = literal.expression;
57
+ const docs = new Map();
58
+ if (!literal || !ts.isObjectLiteralExpression(literal))
59
+ return docs;
60
+ for (const p of literal.properties) {
61
+ const key = p.name && (ts.isIdentifier(p.name) || ts.isStringLiteral(p.name)) ? p.name.text : '';
62
+ const constant = ts.isShorthandPropertyAssignment(p)
63
+ ? p.name.text
64
+ : ts.isPropertyAssignment(p) && ts.isIdentifier(p.initializer)
65
+ ? p.initializer.text
66
+ : '';
67
+ const d = declarations.get(constant);
68
+ if (!key || !d)
69
+ continue;
70
+ const description = ts
71
+ .getJSDocCommentsAndTags(d)
72
+ .map((doc) => (ts.isJSDoc(doc) ? (ts.getTextOfJSDocComment(doc.comment) ?? '') : ''))
73
+ .join(' ')
74
+ .replace(/\s+/g, ' ')
75
+ .trim();
76
+ docs.set(key, {
77
+ ...(description ? { description } : {}),
78
+ line: source.getLineAndCharacterOfPosition(d.parent.parent.getStart()).line + 1,
79
+ });
80
+ }
81
+ return docs;
82
+ }
83
+ //# sourceMappingURL=stylesheets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stylesheets.js","sourceRoot":"","sources":["../src/stylesheets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Attach test evidence to `oddkin.metadata.json` as `verified` facts (metadata-and-analyzer.md
3
+ * §3). Evidence is `conformance-result.v1` records whose configuration names the exact inputs
4
+ * tested (`manifest`, `sources` hashes). A fact is verified only when every required browser has
5
+ * a record for the current inputs and the case passed in each; stale, failed, or missing evidence
6
+ * leaves it unverified and is reported. Pure: callers read files and compute hashes.
7
+ */
8
+ export interface ResultRecord {
9
+ readonly suite: {
10
+ readonly id: string;
11
+ readonly version: string;
12
+ };
13
+ readonly implementation: {
14
+ readonly tag: string;
15
+ readonly package?: string;
16
+ };
17
+ readonly configuration: Readonly<Record<string, string>>;
18
+ readonly date: string;
19
+ readonly results: readonly {
20
+ readonly case: string;
21
+ readonly state: 'passed' | 'failed' | 'not-executed';
22
+ readonly message?: string;
23
+ }[];
24
+ }
25
+ export interface VerificationInputs {
26
+ /** Hash of each input a record must match, e.g. `{ manifest, sources }`. */
27
+ readonly inputs: Readonly<Record<string, string>>;
28
+ /** Browsers that must all have passed a case for it to be verified. */
29
+ readonly browsers: readonly string[];
30
+ /** The test file that produced the records (recorded as the fact source). */
31
+ readonly test: string;
32
+ /** Tags that must have current evidence; a tag without any is reported missing in every browser. */
33
+ readonly require?: readonly string[];
34
+ }
35
+ export interface VerificationReport {
36
+ readonly verified: Readonly<Record<string, number>>;
37
+ readonly failed: readonly {
38
+ tag: string;
39
+ browser: string;
40
+ case: string;
41
+ message?: string;
42
+ }[];
43
+ readonly notExecuted: readonly {
44
+ tag: string;
45
+ case: string;
46
+ }[];
47
+ /** Records for other inputs than the current ones (ignored). */
48
+ readonly stale: readonly {
49
+ tag: string;
50
+ browser: string;
51
+ }[];
52
+ /** Required browsers without a current record, per tag. */
53
+ readonly missing: readonly {
54
+ tag: string;
55
+ browser: string;
56
+ }[];
57
+ }
58
+ export declare function attachVerification(metadata: Readonly<Record<string, unknown>>, records: readonly ResultRecord[], options: VerificationInputs): {
59
+ metadata: Record<string, unknown>;
60
+ report: VerificationReport;
61
+ };
62
+ //# sourceMappingURL=verification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../src/verification.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,QAAQ,CAAC,cAAc,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7E,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,SAAS;QACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,cAAc,CAAC;QACrD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;KAC3B,EAAE,CAAC;CACL;AAED,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,6EAA6E;IAC7E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oGAAoG;IACpG,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,MAAM,EAAE,SAAS;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7F,QAAQ,CAAC,WAAW,EAAE,SAAS;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/D,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,SAAS;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5D,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC/D;AAsBD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAC3C,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,OAAO,EAAE,kBAAkB,GAC1B;IAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,CA8FnE"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Attach test evidence to `oddkin.metadata.json` as `verified` facts (metadata-and-analyzer.md
3
+ * §3). Evidence is `conformance-result.v1` records whose configuration names the exact inputs
4
+ * tested (`manifest`, `sources` hashes). A fact is verified only when every required browser has
5
+ * a record for the current inputs and the case passed in each; stale, failed, or missing evidence
6
+ * leaves it unverified and is reported. Pure: callers read files and compute hashes.
7
+ */
8
+ const sortedKeys = (value) => Object.fromEntries(Object.entries(value).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)));
9
+ /** Stable short id of a run's inputs (FNV-1a over the suite and input hashes). */
10
+ function runId(suite, inputs) {
11
+ let hash = 0x811c9dc5;
12
+ for (const char of `${suite}\u0000${JSON.stringify(sortedKeys(inputs))}`) {
13
+ hash ^= char.charCodeAt(0);
14
+ hash = Math.imul(hash, 0x01000193) >>> 0;
15
+ }
16
+ return `run-${hash.toString(16).padStart(8, '0')}`;
17
+ }
18
+ export function attachVerification(metadata, records, options) {
19
+ const components = {
20
+ ...(metadata['components'] ?? {}),
21
+ };
22
+ const stale = [];
23
+ const groups = new Map();
24
+ for (const record of records) {
25
+ const browser = record.configuration['browser'] ?? 'unknown';
26
+ const tag = record.implementation.tag;
27
+ const current = Object.entries(options.inputs).every(([key, hash]) => record.configuration[key] === hash);
28
+ if (!current) {
29
+ stale.push({ tag, browser });
30
+ continue;
31
+ }
32
+ const suite = `${record.suite.id}@${record.suite.version}`;
33
+ const key = `${suite}\u0000${tag}`;
34
+ const group = groups.get(key) ?? {
35
+ suite,
36
+ tag,
37
+ ...(record.implementation.package ? { pkg: record.implementation.package } : {}),
38
+ byBrowser: new Map(),
39
+ };
40
+ groups.set(key, group);
41
+ const previous = group.byBrowser.get(browser);
42
+ if (!previous || previous.date < record.date)
43
+ group.byBrowser.set(browser, record);
44
+ }
45
+ const verified = {};
46
+ const failed = [];
47
+ const notExecuted = [];
48
+ const missing = [];
49
+ const evidenced = new Set([...groups.values()].map((g) => g.tag));
50
+ for (const tag of options.require ?? [])
51
+ if (!evidenced.has(tag))
52
+ for (const browser of options.browsers)
53
+ missing.push({ tag, browser });
54
+ const entries = new Map();
55
+ for (const group of [...groups.values()].sort((a, b) => a.tag === b.tag ? (a.suite < b.suite ? -1 : 1) : a.tag < b.tag ? -1 : 1)) {
56
+ const absent = options.browsers.filter((b) => !group.byBrowser.has(b));
57
+ for (const browser of absent)
58
+ missing.push({ tag: group.tag, browser });
59
+ if (absent.length)
60
+ continue;
61
+ const used = options.browsers.map((b) => [b, group.byBrowser.get(b)]);
62
+ const cases = new Set(used.flatMap(([, r]) => r.results.map((x) => x.case)));
63
+ const facts = [];
64
+ for (const id of [...cases].sort()) {
65
+ const outcomes = used.map(([browser, r]) => ({
66
+ browser,
67
+ result: r.results.find((x) => x.case === id),
68
+ }));
69
+ for (const { browser, result } of outcomes)
70
+ if (result?.state === 'failed')
71
+ failed.push({
72
+ tag: group.tag,
73
+ browser,
74
+ case: id,
75
+ ...(result.message ? { message: result.message } : {}),
76
+ });
77
+ if (outcomes.every((o) => o.result?.state === 'passed'))
78
+ facts.push(id);
79
+ else if (outcomes.some((o) => !o.result || o.result.state === 'not-executed'))
80
+ notExecuted.push({ tag: group.tag, case: id });
81
+ }
82
+ if (!components[`component:${group.tag}`] || !facts.length)
83
+ continue;
84
+ verified[group.tag] = (verified[group.tag] ?? 0) + facts.length;
85
+ const date = used.map(([, r]) => r.date).sort()[used.length - 1];
86
+ const list = entries.get(group.tag) ?? [];
87
+ list.push({
88
+ suite: group.suite,
89
+ provenance: 'verified',
90
+ source: { test: options.test, run: runId(group.suite, options.inputs), date },
91
+ conditions: {
92
+ browsers: used.map(([name, r]) => ({
93
+ name,
94
+ version: r.configuration['browserVersion'] ?? 'unknown',
95
+ })),
96
+ ...(group.pkg ? { package: group.pkg } : {}),
97
+ inputs: sortedKeys(options.inputs),
98
+ },
99
+ facts,
100
+ });
101
+ entries.set(group.tag, list);
102
+ }
103
+ // Replace any earlier evidence: what is attached now is exactly what the current records show.
104
+ for (const [id, component] of Object.entries(components)) {
105
+ const tag = component['tag'] ?? id.replace(/^component:/, '');
106
+ const { verification: _previous, ...rest } = component;
107
+ const list = entries.get(tag);
108
+ components[id] = list ? { ...rest, verification: list } : rest;
109
+ }
110
+ return {
111
+ metadata: { ...metadata, components },
112
+ report: { verified, failed, notExecuted, stale, missing },
113
+ };
114
+ }
115
+ //# sourceMappingURL=verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.js","sourceRoot":"","sources":["../src/verification.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,42 @@
1
1
  {
2
2
  "name": "@oddkin/analyzer",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.0-beta.0",
4
+ "license": "MIT",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/brianchristopherbrady/oddkin.git",
8
+ "directory": "packages/analyzer"
9
+ },
10
+ "description": "Node-only static analysis of Oddkin component libraries: Custom Elements Manifest and oddkin.metadata.json, without executing component code.",
11
+ "type": "module",
12
+ "sideEffects": false,
13
+ "engines": {
14
+ "node": ">=24.12"
15
+ },
16
+ "bin": {
17
+ "oddkin-analyze": "dist/bin.js",
18
+ "oddkin-impact": "dist/impact-bin.js"
19
+ },
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "default": "./dist/index.js"
24
+ },
25
+ "./impact": {
26
+ "types": "./dist/impact.d.ts",
27
+ "default": "./dist/impact.js"
28
+ },
29
+ "./package.json": "./package.json"
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "README.md"
34
+ ],
35
+ "dependencies": {
36
+ "typescript": "5.9.3"
37
+ },
38
+ "publishConfig": {
39
+ "access": "public",
40
+ "tag": "beta"
41
+ }
42
+ }