@principled/cairn 1.0.0-beta
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 +182 -0
- package/dist/analysis/analyzer.d.ts +13 -0
- package/dist/analysis/analyzer.d.ts.map +1 -0
- package/dist/analysis/analyzer.js +47 -0
- package/dist/analysis/analyzer.js.map +1 -0
- package/dist/analysis/embedding-provider.d.ts +12 -0
- package/dist/analysis/embedding-provider.d.ts.map +1 -0
- package/dist/analysis/embedding-provider.js +21 -0
- package/dist/analysis/embedding-provider.js.map +1 -0
- package/dist/analysis/index.d.ts +4 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +4 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/stub-provider.d.ts +12 -0
- package/dist/analysis/stub-provider.d.ts.map +1 -0
- package/dist/analysis/stub-provider.js +30 -0
- package/dist/analysis/stub-provider.js.map +1 -0
- package/dist/catalog/catalog.d.ts +40 -0
- package/dist/catalog/catalog.d.ts.map +1 -0
- package/dist/catalog/catalog.js +118 -0
- package/dist/catalog/catalog.js.map +1 -0
- package/dist/catalog/category-merger.d.ts +25 -0
- package/dist/catalog/category-merger.d.ts.map +1 -0
- package/dist/catalog/category-merger.js +75 -0
- package/dist/catalog/category-merger.js.map +1 -0
- package/dist/catalog/index.d.ts +4 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +4 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/post-merge-validation.d.ts +7 -0
- package/dist/catalog/post-merge-validation.d.ts.map +1 -0
- package/dist/catalog/post-merge-validation.js +59 -0
- package/dist/catalog/post-merge-validation.js.map +1 -0
- package/dist/cli/commands/add.d.ts +3 -0
- package/dist/cli/commands/add.d.ts.map +1 -0
- package/dist/cli/commands/add.js +107 -0
- package/dist/cli/commands/add.js.map +1 -0
- package/dist/cli/commands/analyze.d.ts +3 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +44 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/diff.d.ts +3 -0
- package/dist/cli/commands/diff.d.ts.map +1 -0
- package/dist/cli/commands/diff.js +69 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/edit.d.ts +3 -0
- package/dist/cli/commands/edit.d.ts.map +1 -0
- package/dist/cli/commands/edit.js +93 -0
- package/dist/cli/commands/edit.js.map +1 -0
- package/dist/cli/commands/export.d.ts +3 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +46 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +21 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/inspect.d.ts +3 -0
- package/dist/cli/commands/inspect.d.ts.map +1 -0
- package/dist/cli/commands/inspect.js +153 -0
- package/dist/cli/commands/inspect.js.map +1 -0
- package/dist/cli/commands/query.d.ts +3 -0
- package/dist/cli/commands/query.d.ts.map +1 -0
- package/dist/cli/commands/query.js +77 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/review.d.ts +3 -0
- package/dist/cli/commands/review.d.ts.map +1 -0
- package/dist/cli/commands/review.js +118 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +3 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +125 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/helpers.d.ts +24 -0
- package/dist/cli/helpers.d.ts.map +1 -0
- package/dist/cli/helpers.js +152 -0
- package/dist/cli/helpers.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +34 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +45 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +201 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +37 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +42 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/data/data/defaults.yaml +101 -0
- package/dist/data/defaults.yaml +101 -0
- package/dist/errors.d.ts +45 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +84 -0
- package/dist/errors.js.map +1 -0
- package/dist/exporters/base.d.ts +17 -0
- package/dist/exporters/base.d.ts.map +1 -0
- package/dist/exporters/base.js +7 -0
- package/dist/exporters/base.js.map +1 -0
- package/dist/exporters/csv-exporter.d.ts +13 -0
- package/dist/exporters/csv-exporter.d.ts.map +1 -0
- package/dist/exporters/csv-exporter.js +73 -0
- package/dist/exporters/csv-exporter.js.map +1 -0
- package/dist/exporters/dot-exporter.d.ts +12 -0
- package/dist/exporters/dot-exporter.d.ts.map +1 -0
- package/dist/exporters/dot-exporter.js +72 -0
- package/dist/exporters/dot-exporter.js.map +1 -0
- package/dist/exporters/index.d.ts +8 -0
- package/dist/exporters/index.d.ts.map +1 -0
- package/dist/exporters/index.js +8 -0
- package/dist/exporters/index.js.map +1 -0
- package/dist/exporters/json-exporter.d.ts +14 -0
- package/dist/exporters/json-exporter.d.ts.map +1 -0
- package/dist/exporters/json-exporter.js +41 -0
- package/dist/exporters/json-exporter.js.map +1 -0
- package/dist/exporters/markdown-exporter.d.ts +14 -0
- package/dist/exporters/markdown-exporter.d.ts.map +1 -0
- package/dist/exporters/markdown-exporter.js +65 -0
- package/dist/exporters/markdown-exporter.js.map +1 -0
- package/dist/exporters/registry.d.ts +4 -0
- package/dist/exporters/registry.d.ts.map +1 -0
- package/dist/exporters/registry.js +20 -0
- package/dist/exporters/registry.js.map +1 -0
- package/dist/exporters/sqlite-exporter.d.ts +10 -0
- package/dist/exporters/sqlite-exporter.d.ts.map +1 -0
- package/dist/exporters/sqlite-exporter.js +20 -0
- package/dist/exporters/sqlite-exporter.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/inheritance/alias-resolver.d.ts +21 -0
- package/dist/inheritance/alias-resolver.d.ts.map +1 -0
- package/dist/inheritance/alias-resolver.js +40 -0
- package/dist/inheritance/alias-resolver.js.map +1 -0
- package/dist/inheritance/index.d.ts +9 -0
- package/dist/inheritance/index.d.ts.map +1 -0
- package/dist/inheritance/index.js +5 -0
- package/dist/inheritance/index.js.map +1 -0
- package/dist/inheritance/inheritance-resolver.d.ts +37 -0
- package/dist/inheritance/inheritance-resolver.d.ts.map +1 -0
- package/dist/inheritance/inheritance-resolver.js +164 -0
- package/dist/inheritance/inheritance-resolver.js.map +1 -0
- package/dist/inheritance/reference-parser.d.ts +27 -0
- package/dist/inheritance/reference-parser.d.ts.map +1 -0
- package/dist/inheritance/reference-parser.js +74 -0
- package/dist/inheritance/reference-parser.js.map +1 -0
- package/dist/inheritance/source-resolver.d.ts +29 -0
- package/dist/inheritance/source-resolver.d.ts.map +1 -0
- package/dist/inheritance/source-resolver.js +87 -0
- package/dist/inheritance/source-resolver.js.map +1 -0
- package/dist/model/category-registry.d.ts +48 -0
- package/dist/model/category-registry.d.ts.map +1 -0
- package/dist/model/category-registry.js +83 -0
- package/dist/model/category-registry.js.map +1 -0
- package/dist/model/document-meta.d.ts +38 -0
- package/dist/model/document-meta.d.ts.map +1 -0
- package/dist/model/document-meta.js +62 -0
- package/dist/model/document-meta.js.map +1 -0
- package/dist/model/document-parser.d.ts +17 -0
- package/dist/model/document-parser.d.ts.map +1 -0
- package/dist/model/document-parser.js +66 -0
- package/dist/model/document-parser.js.map +1 -0
- package/dist/model/document.d.ts +27 -0
- package/dist/model/document.d.ts.map +1 -0
- package/dist/model/document.js +42 -0
- package/dist/model/document.js.map +1 -0
- package/dist/model/element.d.ts +51 -0
- package/dist/model/element.d.ts.map +1 -0
- package/dist/model/element.js +78 -0
- package/dist/model/element.js.map +1 -0
- package/dist/model/graph.d.ts +42 -0
- package/dist/model/graph.d.ts.map +1 -0
- package/dist/model/graph.js +177 -0
- package/dist/model/graph.js.map +1 -0
- package/dist/model/index.d.ts +8 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/index.js +7 -0
- package/dist/model/index.js.map +1 -0
- package/dist/parsers/base.d.ts +28 -0
- package/dist/parsers/base.d.ts.map +1 -0
- package/dist/parsers/base.js +19 -0
- package/dist/parsers/base.js.map +1 -0
- package/dist/parsers/index.d.ts +6 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +6 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/markdown-parser.d.ts +12 -0
- package/dist/parsers/markdown-parser.d.ts.map +1 -0
- package/dist/parsers/markdown-parser.js +37 -0
- package/dist/parsers/markdown-parser.js.map +1 -0
- package/dist/parsers/registry.d.ts +11 -0
- package/dist/parsers/registry.d.ts.map +1 -0
- package/dist/parsers/registry.js +21 -0
- package/dist/parsers/registry.js.map +1 -0
- package/dist/parsers/typescript-parser.d.ts +12 -0
- package/dist/parsers/typescript-parser.d.ts.map +1 -0
- package/dist/parsers/typescript-parser.js +74 -0
- package/dist/parsers/typescript-parser.js.map +1 -0
- package/dist/parsers/yaml-parser.d.ts +12 -0
- package/dist/parsers/yaml-parser.d.ts.map +1 -0
- package/dist/parsers/yaml-parser.js +30 -0
- package/dist/parsers/yaml-parser.js.map +1 -0
- package/dist/provenance/index.d.ts +5 -0
- package/dist/provenance/index.d.ts.map +1 -0
- package/dist/provenance/index.js +4 -0
- package/dist/provenance/index.js.map +1 -0
- package/dist/provenance/review-hash.d.ts +11 -0
- package/dist/provenance/review-hash.d.ts.map +1 -0
- package/dist/provenance/review-hash.js +18 -0
- package/dist/provenance/review-hash.js.map +1 -0
- package/dist/provenance/schemas.d.ts +36 -0
- package/dist/provenance/schemas.d.ts.map +1 -0
- package/dist/provenance/schemas.js +26 -0
- package/dist/provenance/schemas.js.map +1 -0
- package/dist/provenance/staleness.d.ts +12 -0
- package/dist/provenance/staleness.d.ts.map +1 -0
- package/dist/provenance/staleness.js +46 -0
- package/dist/provenance/staleness.js.map +1 -0
- package/dist/refs/git-diff-tracer.d.ts +35 -0
- package/dist/refs/git-diff-tracer.d.ts.map +1 -0
- package/dist/refs/git-diff-tracer.js +143 -0
- package/dist/refs/git-diff-tracer.js.map +1 -0
- package/dist/schema/build-schema.d.ts +15 -0
- package/dist/schema/build-schema.d.ts.map +1 -0
- package/dist/schema/build-schema.js +83 -0
- package/dist/schema/build-schema.js.map +1 -0
- package/dist/schema/category-definition.d.ts +41 -0
- package/dist/schema/category-definition.d.ts.map +1 -0
- package/dist/schema/category-definition.js +22 -0
- package/dist/schema/category-definition.js.map +1 -0
- package/dist/schema/combined-schema.d.ts +17 -0
- package/dist/schema/combined-schema.d.ts.map +1 -0
- package/dist/schema/combined-schema.js +23 -0
- package/dist/schema/combined-schema.js.map +1 -0
- package/dist/schema/datetime.d.ts +11 -0
- package/dist/schema/datetime.d.ts.map +1 -0
- package/dist/schema/datetime.js +81 -0
- package/dist/schema/datetime.js.map +1 -0
- package/dist/schema/defaults-loader.d.ts +21 -0
- package/dist/schema/defaults-loader.d.ts.map +1 -0
- package/dist/schema/defaults-loader.js +55 -0
- package/dist/schema/defaults-loader.js.map +1 -0
- package/dist/schema/field-schema.d.ts +23 -0
- package/dist/schema/field-schema.d.ts.map +1 -0
- package/dist/schema/field-schema.js +18 -0
- package/dist/schema/field-schema.js.map +1 -0
- package/dist/schema/index.d.ts +17 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +17 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/reserved-fields.d.ts +32 -0
- package/dist/schema/reserved-fields.d.ts.map +1 -0
- package/dist/schema/reserved-fields.js +42 -0
- package/dist/schema/reserved-fields.js.map +1 -0
- package/dist/schema/types.d.ts +7 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +9 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +16 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/project-root.d.ts +14 -0
- package/dist/utils/project-root.d.ts.map +1 -0
- package/dist/utils/project-root.js +48 -0
- package/dist/utils/project-root.js.map +1 -0
- package/dist/validation/diagnostic.d.ts +23 -0
- package/dist/validation/diagnostic.d.ts.map +1 -0
- package/dist/validation/diagnostic.js +5 -0
- package/dist/validation/diagnostic.js.map +1 -0
- package/dist/validation/index.d.ts +6 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +4 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/passes/coverage-pass.d.ts +10 -0
- package/dist/validation/passes/coverage-pass.d.ts.map +1 -0
- package/dist/validation/passes/coverage-pass.js +99 -0
- package/dist/validation/passes/coverage-pass.js.map +1 -0
- package/dist/validation/passes/index.d.ts +6 -0
- package/dist/validation/passes/index.d.ts.map +1 -0
- package/dist/validation/passes/index.js +19 -0
- package/dist/validation/passes/index.js.map +1 -0
- package/dist/validation/passes/schema-pass.d.ts +12 -0
- package/dist/validation/passes/schema-pass.d.ts.map +1 -0
- package/dist/validation/passes/schema-pass.js +38 -0
- package/dist/validation/passes/schema-pass.js.map +1 -0
- package/dist/validation/passes/semantic-pass.d.ts +8 -0
- package/dist/validation/passes/semantic-pass.d.ts.map +1 -0
- package/dist/validation/passes/semantic-pass.js +126 -0
- package/dist/validation/passes/semantic-pass.js.map +1 -0
- package/dist/validation/passes/structural-pass.d.ts +8 -0
- package/dist/validation/passes/structural-pass.d.ts.map +1 -0
- package/dist/validation/passes/structural-pass.js +150 -0
- package/dist/validation/passes/structural-pass.js.map +1 -0
- package/dist/validation/passes/traceability-pass.d.ts +9 -0
- package/dist/validation/passes/traceability-pass.d.ts.map +1 -0
- package/dist/validation/passes/traceability-pass.js +87 -0
- package/dist/validation/passes/traceability-pass.js.map +1 -0
- package/dist/validation/passes/user-rules-pass.d.ts +9 -0
- package/dist/validation/passes/user-rules-pass.d.ts.map +1 -0
- package/dist/validation/passes/user-rules-pass.js +72 -0
- package/dist/validation/passes/user-rules-pass.js.map +1 -0
- package/dist/validation/runner.d.ts +17 -0
- package/dist/validation/runner.d.ts.map +1 -0
- package/dist/validation/runner.js +33 -0
- package/dist/validation/runner.js.map +1 -0
- package/package.json +43 -0
- package/src/data/defaults.yaml +101 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-exporter.js","sourceRoot":"","sources":["../../src/exporters/json-exporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAsB,MAAM,WAAW,CAAC;AAEzD;;;GAGG;AACH,MAAM,OAAO,YAAa,SAAQ,QAAQ;IAC/B,GAAG,GAAG,MAAM,CAAC;IACb,IAAI,GAAG,MAAM,CAAC;IACd,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAEjD,MAAM,CAAC,OAAgB,EAAE,OAAuB;QAC9C,MAAM,iBAAiB,GAAG,OAAO,EAAE,iBAAiB,IAAI,KAAK,CAAC;QAE9D,MAAM,MAAM,GAAG;YACb,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACvC,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE;oBACJ,GAAG,GAAG,CAAC,IAAI;oBACX,uDAAuD;oBACvD,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI;oBACnC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI;oBACnC,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI;oBACzC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI;iBAC9B;gBACD,QAAQ,EAAE,GAAG,CAAC,cAAc,EAAE;qBAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,IAAI,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC;qBAC3D,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACT,GAAG,CAAC,CAAC,IAAI;oBACT,SAAS,EAAE,CAAC,CAAC,YAAY;oBACzB,UAAU,EAAE,CAAC,CAAC,WAAW,EAAE;oBAC3B,YAAY,EAAE,CAAC,CAAC,aAAa,EAAE;iBAChC,CAAC,CAAC;aACN,CAAC,CAAC;YACH,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,UAAU;YACvC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE;SACxB,CAAC;QAEF,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { Catalog } from '../catalog/catalog.js';
|
|
3
|
+
import { Exporter, type ExportOptions } from './base.js';
|
|
4
|
+
/**
|
|
5
|
+
* Per-document Markdown exporter.
|
|
6
|
+
* Groups elements by document and category, rendering human-readable markdown.
|
|
7
|
+
*/
|
|
8
|
+
export declare class MarkdownExporter extends Exporter {
|
|
9
|
+
readonly key = "markdown";
|
|
10
|
+
readonly name = "Markdown";
|
|
11
|
+
readonly optionsSchema: z.ZodOptional<z.ZodObject<{}, z.core.$strip>>;
|
|
12
|
+
export(catalog: Catalog, options?: ExportOptions): string;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=markdown-exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-exporter.d.ts","sourceRoot":"","sources":["../../src/exporters/markdown-exporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAEzD;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,QAAQ;IAC5C,QAAQ,CAAC,GAAG,cAAc;IAC1B,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,aAAa,gDAA2B;IAEjD,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM;CAgE1D"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Exporter } from './base.js';
|
|
3
|
+
/**
|
|
4
|
+
* Per-document Markdown exporter.
|
|
5
|
+
* Groups elements by document and category, rendering human-readable markdown.
|
|
6
|
+
*/
|
|
7
|
+
export class MarkdownExporter extends Exporter {
|
|
8
|
+
key = 'markdown';
|
|
9
|
+
name = 'Markdown';
|
|
10
|
+
optionsSchema = z.object({}).optional();
|
|
11
|
+
export(catalog, options) {
|
|
12
|
+
const includeDeprecated = options?.includeDeprecated ?? false;
|
|
13
|
+
const sections = [];
|
|
14
|
+
for (const doc of catalog.documents) {
|
|
15
|
+
sections.push(`# ${doc.name}\n`);
|
|
16
|
+
for (const catName of catalog.registry.categoryNames) {
|
|
17
|
+
const catDef = catalog.registry.getByName(catName);
|
|
18
|
+
if (!catDef)
|
|
19
|
+
continue;
|
|
20
|
+
const elements = doc.getElementsByCategory(catName)
|
|
21
|
+
.filter(e => includeDeprecated || e.status !== 'deprecated');
|
|
22
|
+
if (elements.length === 0)
|
|
23
|
+
continue;
|
|
24
|
+
const displayLabel = catDef.display_label ??
|
|
25
|
+
catName.charAt(0).toUpperCase() + catName.slice(1) + 's';
|
|
26
|
+
sections.push(`## ${displayLabel}\n`);
|
|
27
|
+
for (const el of elements) {
|
|
28
|
+
sections.push(`### ${el.id}: ${el.name}\n`);
|
|
29
|
+
if (el.status !== 'active') {
|
|
30
|
+
sections.push(`**Status:** ${el.status}\n`);
|
|
31
|
+
}
|
|
32
|
+
// Primary field
|
|
33
|
+
const primaryField = catDef.primary_field ?? 'statement';
|
|
34
|
+
const primaryValue = el.get(primaryField);
|
|
35
|
+
if (primaryValue) {
|
|
36
|
+
sections.push(`${String(primaryValue).trim()}\n`);
|
|
37
|
+
}
|
|
38
|
+
// Tags
|
|
39
|
+
if (el.tags.length > 0) {
|
|
40
|
+
sections.push(`**Tags:** ${el.tags.join(', ')}\n`);
|
|
41
|
+
}
|
|
42
|
+
// Maps to
|
|
43
|
+
if (el.maps_to.length > 0) {
|
|
44
|
+
sections.push(`**Maps to:** ${el.maps_to.join(', ')}\n`);
|
|
45
|
+
}
|
|
46
|
+
// Considered alternatives (for decisions)
|
|
47
|
+
const considered = el.get('considered');
|
|
48
|
+
if (considered && typeof considered === 'object') {
|
|
49
|
+
sections.push(`**Considered alternatives:**\n`);
|
|
50
|
+
for (const [altName, altDef] of Object.entries(considered)) {
|
|
51
|
+
const displayName = altName
|
|
52
|
+
.replace(/_/g, ' ')
|
|
53
|
+
.replace(/\b\w/g, c => c.toUpperCase());
|
|
54
|
+
const rationale = altDef?.rationale ?? '';
|
|
55
|
+
sections.push(`- **${displayName}** — *${rationale}*`);
|
|
56
|
+
}
|
|
57
|
+
sections.push('');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return sections.join('\n');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=markdown-exporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-exporter.js","sourceRoot":"","sources":["../../src/exporters/markdown-exporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/exporters/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAO1C,iCAAiC;AACjC,wBAAgB,sBAAsB,IAAI,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAc9D"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { JsonExporter } from './json-exporter.js';
|
|
2
|
+
import { CsvExporter } from './csv-exporter.js';
|
|
3
|
+
import { MarkdownExporter } from './markdown-exporter.js';
|
|
4
|
+
import { DotExporter } from './dot-exporter.js';
|
|
5
|
+
import { SqliteExporter } from './sqlite-exporter.js';
|
|
6
|
+
/** Built-in exporter registry */
|
|
7
|
+
export function createExporterRegistry() {
|
|
8
|
+
const registry = new Map();
|
|
9
|
+
const exporters = [new JsonExporter(), new CsvExporter(), new MarkdownExporter()];
|
|
10
|
+
for (const exp of exporters) {
|
|
11
|
+
registry.set(exp.key, exp);
|
|
12
|
+
}
|
|
13
|
+
// Optional exporters (may require external dependencies)
|
|
14
|
+
const optionalExporters = [new DotExporter(), new SqliteExporter()];
|
|
15
|
+
for (const exp of optionalExporters) {
|
|
16
|
+
registry.set(exp.key, exp);
|
|
17
|
+
}
|
|
18
|
+
return registry;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/exporters/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,iCAAiC;AACjC,MAAM,UAAU,sBAAsB;IACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,MAAM,SAAS,GAAG,CAAC,IAAI,YAAY,EAAE,EAAE,IAAI,WAAW,EAAE,EAAE,IAAI,gBAAgB,EAAE,CAAC,CAAC;IAClF,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,yDAAyD;IACzD,MAAM,iBAAiB,GAAG,CAAC,IAAI,WAAW,EAAE,EAAE,IAAI,cAAc,EAAE,CAAC,CAAC;IACpE,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACpC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { Catalog } from '../catalog/catalog.js';
|
|
3
|
+
import { Exporter, type ExportOptions } from './base.js';
|
|
4
|
+
export declare class SqliteExporter extends Exporter {
|
|
5
|
+
readonly key = "sqlite";
|
|
6
|
+
readonly name = "SQLite";
|
|
7
|
+
readonly optionsSchema: z.ZodOptional<z.ZodObject<{}, z.core.$strip>>;
|
|
8
|
+
export(_catalog: Catalog, _options?: ExportOptions): string;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=sqlite-exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-exporter.d.ts","sourceRoot":"","sources":["../../src/exporters/sqlite-exporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAEzD,qBAAa,cAAe,SAAQ,QAAQ;IAC1C,QAAQ,CAAC,GAAG,YAAY;IACxB,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,aAAa,gDAA2B;IAEjD,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,MAAM;CAa5D"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { Exporter } from './base.js';
|
|
3
|
+
export class SqliteExporter extends Exporter {
|
|
4
|
+
key = 'sqlite';
|
|
5
|
+
name = 'SQLite';
|
|
6
|
+
optionsSchema = z.object({}).optional();
|
|
7
|
+
export(_catalog, _options) {
|
|
8
|
+
// Check for dependency
|
|
9
|
+
try {
|
|
10
|
+
require('better-sqlite3');
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
throw new Error('SQLite export requires the "better-sqlite3" package. ' +
|
|
14
|
+
'Install with: npm install better-sqlite3');
|
|
15
|
+
}
|
|
16
|
+
// Full implementation deferred — dependency not bundled by default (DEC-7.4)
|
|
17
|
+
throw new Error('SQLite export not yet fully implemented');
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=sqlite-exporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-exporter.js","sourceRoot":"","sources":["../../src/exporters/sqlite-exporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAsB,MAAM,WAAW,CAAC;AAEzD,MAAM,OAAO,cAAe,SAAQ,QAAQ;IACjC,GAAG,GAAG,QAAQ,CAAC;IACf,IAAI,GAAG,QAAQ,CAAC;IAChB,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAEjD,MAAM,CAAC,QAAiB,EAAE,QAAwB;QAChD,uBAAuB;QACvB,IAAI,CAAC;YACH,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,uDAAuD;gBACrD,0CAA0C,CAC7C,CAAC;QACJ,CAAC;QACD,6EAA6E;QAC7E,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const VERSION = "1.0.0";
|
|
2
|
+
export { GVPError, SchemaError, InheritanceError, ConfigError, ValidationError, ProvenanceError, SourceResolutionError, CatalogError, DuplicateIdPrefixError, DuplicateYamlKeyError, InvalidMappingRuleRefError, CircularInheritanceError, MissingMappingRulesError } from './errors.js';
|
|
3
|
+
export * from './schema/index.js';
|
|
4
|
+
export * from './config/index.js';
|
|
5
|
+
export * from './model/index.js';
|
|
6
|
+
export * from './inheritance/index.js';
|
|
7
|
+
export * from './catalog/index.js';
|
|
8
|
+
export * from './validation/index.js';
|
|
9
|
+
export * from './provenance/index.js';
|
|
10
|
+
export * from './exporters/index.js';
|
|
11
|
+
export * from './parsers/index.js';
|
|
12
|
+
export * from './analysis/index.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,qBAAqB,EAAE,YAAY,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACzR,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// GVP v1 - Goals, Values, and Principles framework
|
|
2
|
+
export const VERSION = '1.0.0';
|
|
3
|
+
export { GVPError, SchemaError, InheritanceError, ConfigError, ValidationError, ProvenanceError, SourceResolutionError, CatalogError, DuplicateIdPrefixError, DuplicateYamlKeyError, InvalidMappingRuleRefError, CircularInheritanceError, MissingMappingRulesError } from './errors.js';
|
|
4
|
+
export * from './schema/index.js';
|
|
5
|
+
export * from './config/index.js';
|
|
6
|
+
export * from './model/index.js';
|
|
7
|
+
export * from './inheritance/index.js';
|
|
8
|
+
export * from './catalog/index.js';
|
|
9
|
+
export * from './validation/index.js';
|
|
10
|
+
export * from './provenance/index.js';
|
|
11
|
+
export * from './exporters/index.js';
|
|
12
|
+
export * from './parsers/index.js';
|
|
13
|
+
export * from './analysis/index.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,qBAAqB,EAAE,YAAY,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACzR,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { DocumentMeta } from '../model/document-meta.js';
|
|
2
|
+
/**
|
|
3
|
+
* Alias map: alias name -> canonical source path.
|
|
4
|
+
* Per DEC-1.1a: document-scoped, inherited by children, descendant wins.
|
|
5
|
+
*/
|
|
6
|
+
export type AliasMap = Map<string, string>;
|
|
7
|
+
/**
|
|
8
|
+
* Build an alias map for a document by combining parent aliases with the document's own aliases.
|
|
9
|
+
* Descendant wins on conflict (DEC-1.1a).
|
|
10
|
+
*
|
|
11
|
+
* @param docMeta - The document's meta block
|
|
12
|
+
* @param parentAliases - Aliases inherited from parent documents
|
|
13
|
+
* @returns Combined alias map where the document's aliases override parents'
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildAliasMap(docMeta: DocumentMeta, parentAliases?: AliasMap): AliasMap;
|
|
16
|
+
/**
|
|
17
|
+
* Resolve a source alias to its canonical source path.
|
|
18
|
+
* If the source is an alias, replace it. Otherwise, return as-is.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveAlias(source: string, aliases: AliasMap): string;
|
|
21
|
+
//# sourceMappingURL=alias-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alias-resolver.d.ts","sourceRoot":"","sources":["../../src/inheritance/alias-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAkB3C;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,YAAY,EACrB,aAAa,GAAE,QAAoB,GAClC,QAAQ,CASV;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,MAAM,CAEtE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract alias entries from a document's meta.inherits.
|
|
3
|
+
* Only object-form entries with an `as` field create aliases.
|
|
4
|
+
*/
|
|
5
|
+
function extractAliases(inherits) {
|
|
6
|
+
const aliases = new Map();
|
|
7
|
+
if (!inherits || !Array.isArray(inherits))
|
|
8
|
+
return aliases;
|
|
9
|
+
for (const entry of inherits) {
|
|
10
|
+
if (typeof entry === 'object' && entry !== null && 'source' in entry && 'as' in entry && entry.as) {
|
|
11
|
+
aliases.set(entry.as, entry.source);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return aliases;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Build an alias map for a document by combining parent aliases with the document's own aliases.
|
|
18
|
+
* Descendant wins on conflict (DEC-1.1a).
|
|
19
|
+
*
|
|
20
|
+
* @param docMeta - The document's meta block
|
|
21
|
+
* @param parentAliases - Aliases inherited from parent documents
|
|
22
|
+
* @returns Combined alias map where the document's aliases override parents'
|
|
23
|
+
*/
|
|
24
|
+
export function buildAliasMap(docMeta, parentAliases = new Map()) {
|
|
25
|
+
const ownAliases = extractAliases(docMeta.inherits);
|
|
26
|
+
// Start with parent aliases, overlay with own (descendant wins)
|
|
27
|
+
const combined = new Map(parentAliases);
|
|
28
|
+
for (const [alias, source] of ownAliases) {
|
|
29
|
+
combined.set(alias, source);
|
|
30
|
+
}
|
|
31
|
+
return combined;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resolve a source alias to its canonical source path.
|
|
35
|
+
* If the source is an alias, replace it. Otherwise, return as-is.
|
|
36
|
+
*/
|
|
37
|
+
export function resolveAlias(source, aliases) {
|
|
38
|
+
return aliases.get(source) ?? source;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=alias-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alias-resolver.js","sourceRoot":"","sources":["../../src/inheritance/alias-resolver.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,SAAS,cAAc,CAAC,QAAkC;IACxD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,OAAO,CAAC;IAE1D,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;YAClG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAqB,EACrB,gBAA0B,IAAI,GAAG,EAAE;IAEnC,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEpD,gEAAgE;IAChE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IACxC,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QACzC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,OAAiB;IAC5D,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type { ElementReference } from './reference-parser.js';
|
|
2
|
+
export { parseReference } from './reference-parser.js';
|
|
3
|
+
export type { SourceResolver } from './source-resolver.js';
|
|
4
|
+
export { LocalSourceResolver, GitSourceResolver, createSourceResolver } from './source-resolver.js';
|
|
5
|
+
export type { AliasMap } from './alias-resolver.js';
|
|
6
|
+
export { buildAliasMap, resolveAlias } from './alias-resolver.js';
|
|
7
|
+
export type { DocumentLoader, ResolvedInheritance } from './inheritance-resolver.js';
|
|
8
|
+
export { resolveInheritance } from './inheritance-resolver.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/inheritance/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACpG,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClE,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { parseReference } from './reference-parser.js';
|
|
2
|
+
export { LocalSourceResolver, GitSourceResolver, createSourceResolver } from './source-resolver.js';
|
|
3
|
+
export { buildAliasMap, resolveAlias } from './alias-resolver.js';
|
|
4
|
+
export { resolveInheritance } from './inheritance-resolver.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/inheritance/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEpG,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Document } from '../model/document.js';
|
|
2
|
+
import type { AliasMap } from './alias-resolver.js';
|
|
3
|
+
/**
|
|
4
|
+
* Callback type for loading documents during inheritance resolution.
|
|
5
|
+
* The resolver doesn't know how to load documents — the caller provides this.
|
|
6
|
+
*/
|
|
7
|
+
export type DocumentLoader = (source: string, documentPath: string) => Document;
|
|
8
|
+
/**
|
|
9
|
+
* Result of resolving a document's inheritance tree.
|
|
10
|
+
*/
|
|
11
|
+
export interface ResolvedInheritance {
|
|
12
|
+
/** Documents in DFS order, ancestors first (DEC-1.3: ancestors have highest priority) */
|
|
13
|
+
orderedDocuments: Document[];
|
|
14
|
+
/** Accumulated alias map for the entry document */
|
|
15
|
+
aliasMap: AliasMap;
|
|
16
|
+
/** Strongly connected components with >1 member (DEC-1.8) */
|
|
17
|
+
sccs: Document[][];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Resolve a document's full inheritance tree via DFS (DEC-1.0, DEC-1.3, DEC-1.8).
|
|
21
|
+
*
|
|
22
|
+
* DFS Algorithm (DEC-1.3):
|
|
23
|
+
* For document D with inherits: [A, E] where A inherits [B, C]:
|
|
24
|
+
* 1. Recurse into A → recurse into B (leaf, add B), recurse into C (leaf, add C), add A
|
|
25
|
+
* 2. Recurse into E (leaf, add E)
|
|
26
|
+
* 3. Add D
|
|
27
|
+
* Result: [B, C, A, E, D] — ancestors first, entry document last
|
|
28
|
+
*
|
|
29
|
+
* Cycle Detection (DEC-1.8):
|
|
30
|
+
* Track visiting set during DFS. On back-edge, skip the node (cycle-breaking).
|
|
31
|
+
*
|
|
32
|
+
* Tarjan's SCC (DEC-1.8):
|
|
33
|
+
* After DFS, find strongly connected components. SCCs with >1 member
|
|
34
|
+
* grant mutual element access.
|
|
35
|
+
*/
|
|
36
|
+
export declare function resolveInheritance(entryDoc: Document, loader: DocumentLoader): ResolvedInheritance;
|
|
37
|
+
//# sourceMappingURL=inheritance-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inheritance-resolver.d.ts","sourceRoot":"","sources":["../../src/inheritance/inheritance-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAIpD;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,QAAQ,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,yFAAyF;IACzF,gBAAgB,EAAE,QAAQ,EAAE,CAAC;IAC7B,mDAAmD;IACnD,QAAQ,EAAE,QAAQ,CAAC;IACnB,6DAA6D;IAC7D,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,cAAc,GACrB,mBAAmB,CAmFrB"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { buildAliasMap } from './alias-resolver.js';
|
|
2
|
+
import { InheritanceError } from '../errors.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve a document's full inheritance tree via DFS (DEC-1.0, DEC-1.3, DEC-1.8).
|
|
5
|
+
*
|
|
6
|
+
* DFS Algorithm (DEC-1.3):
|
|
7
|
+
* For document D with inherits: [A, E] where A inherits [B, C]:
|
|
8
|
+
* 1. Recurse into A → recurse into B (leaf, add B), recurse into C (leaf, add C), add A
|
|
9
|
+
* 2. Recurse into E (leaf, add E)
|
|
10
|
+
* 3. Add D
|
|
11
|
+
* Result: [B, C, A, E, D] — ancestors first, entry document last
|
|
12
|
+
*
|
|
13
|
+
* Cycle Detection (DEC-1.8):
|
|
14
|
+
* Track visiting set during DFS. On back-edge, skip the node (cycle-breaking).
|
|
15
|
+
*
|
|
16
|
+
* Tarjan's SCC (DEC-1.8):
|
|
17
|
+
* After DFS, find strongly connected components. SCCs with >1 member
|
|
18
|
+
* grant mutual element access.
|
|
19
|
+
*/
|
|
20
|
+
export function resolveInheritance(entryDoc, loader) {
|
|
21
|
+
const ordered = [];
|
|
22
|
+
const visited = new Set(); // fully-processed keys
|
|
23
|
+
const visiting = new Set(); // cycle detection (in-progress DFS path)
|
|
24
|
+
const docMap = new Map(); // cache loaded docs by key
|
|
25
|
+
// Register the entry document
|
|
26
|
+
const entryKey = docKey(entryDoc);
|
|
27
|
+
docMap.set(entryKey, entryDoc);
|
|
28
|
+
function dfs(doc, parentAliases) {
|
|
29
|
+
const key = docKey(doc);
|
|
30
|
+
if (visiting.has(key)) {
|
|
31
|
+
// Cycle detected — skip (DEC-1.8 cycle-breaking)
|
|
32
|
+
return parentAliases;
|
|
33
|
+
}
|
|
34
|
+
if (visited.has(key)) {
|
|
35
|
+
// Already processed — skip but don't error
|
|
36
|
+
return parentAliases;
|
|
37
|
+
}
|
|
38
|
+
visiting.add(key);
|
|
39
|
+
// Build alias map for this document (DEC-1.1a)
|
|
40
|
+
const aliases = buildAliasMap(doc.meta, parentAliases);
|
|
41
|
+
// Process inherits entries
|
|
42
|
+
const inherits = doc.meta.inherits;
|
|
43
|
+
if (inherits && Array.isArray(inherits)) {
|
|
44
|
+
for (const entry of inherits) {
|
|
45
|
+
let source;
|
|
46
|
+
let docPath;
|
|
47
|
+
if (typeof entry === 'string') {
|
|
48
|
+
// Local document reference (same source)
|
|
49
|
+
source = doc.source;
|
|
50
|
+
docPath = entry;
|
|
51
|
+
}
|
|
52
|
+
else if (typeof entry === 'object' && entry !== null && 'source' in entry) {
|
|
53
|
+
// External source reference
|
|
54
|
+
source = entry.source;
|
|
55
|
+
docPath = '';
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
// Try to load the parent document
|
|
61
|
+
const parentKey = `${source}:${docPath}`;
|
|
62
|
+
let parent = docMap.get(parentKey);
|
|
63
|
+
if (!parent) {
|
|
64
|
+
try {
|
|
65
|
+
parent = loader(source, docPath);
|
|
66
|
+
docMap.set(parentKey, parent);
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
throw new InheritanceError(`Failed to load inherited document '${docPath}' from source '${source}': ${e.message}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Recurse into parent (DFS — process parents before self)
|
|
73
|
+
dfs(parent, aliases);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
visiting.delete(key);
|
|
77
|
+
visited.add(key);
|
|
78
|
+
ordered.push(doc);
|
|
79
|
+
return aliases;
|
|
80
|
+
}
|
|
81
|
+
const finalAliases = dfs(entryDoc, new Map());
|
|
82
|
+
// Tarjan's SCC post-pass (DEC-1.8)
|
|
83
|
+
const sccs = findSCCs(ordered, docMap);
|
|
84
|
+
return {
|
|
85
|
+
orderedDocuments: ordered,
|
|
86
|
+
aliasMap: finalAliases,
|
|
87
|
+
sccs,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/** Stable key for a document: source:documentPath */
|
|
91
|
+
function docKey(doc) {
|
|
92
|
+
return `${doc.source}:${doc.documentPath}`;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Tarjan's SCC algorithm (DEC-1.8).
|
|
96
|
+
* Returns SCCs with >1 member (mutual access groups).
|
|
97
|
+
*/
|
|
98
|
+
function findSCCs(documents, docMap) {
|
|
99
|
+
let index = 0;
|
|
100
|
+
const stack = [];
|
|
101
|
+
const onStack = new Set();
|
|
102
|
+
const indices = new Map();
|
|
103
|
+
const lowlinks = new Map();
|
|
104
|
+
const sccs = [];
|
|
105
|
+
function strongconnect(doc) {
|
|
106
|
+
const k = docKey(doc);
|
|
107
|
+
indices.set(k, index);
|
|
108
|
+
lowlinks.set(k, index);
|
|
109
|
+
index++;
|
|
110
|
+
stack.push(k);
|
|
111
|
+
onStack.add(k);
|
|
112
|
+
// Process successors (documents this doc inherits from)
|
|
113
|
+
const inherits = doc.meta.inherits;
|
|
114
|
+
if (inherits && Array.isArray(inherits)) {
|
|
115
|
+
for (const entry of inherits) {
|
|
116
|
+
let successorKey;
|
|
117
|
+
if (typeof entry === 'string') {
|
|
118
|
+
successorKey = `${doc.source}:${entry}`;
|
|
119
|
+
}
|
|
120
|
+
else if (typeof entry === 'object' &&
|
|
121
|
+
entry !== null &&
|
|
122
|
+
'source' in entry) {
|
|
123
|
+
successorKey = `${entry.source}:`;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (!indices.has(successorKey)) {
|
|
129
|
+
const successor = docMap.get(successorKey);
|
|
130
|
+
if (successor) {
|
|
131
|
+
strongconnect(successor);
|
|
132
|
+
lowlinks.set(k, Math.min(lowlinks.get(k), lowlinks.get(successorKey)));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else if (onStack.has(successorKey)) {
|
|
136
|
+
lowlinks.set(k, Math.min(lowlinks.get(k), indices.get(successorKey)));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// If this is a root node of an SCC
|
|
141
|
+
if (lowlinks.get(k) === indices.get(k)) {
|
|
142
|
+
const scc = [];
|
|
143
|
+
let w;
|
|
144
|
+
do {
|
|
145
|
+
w = stack.pop();
|
|
146
|
+
onStack.delete(w);
|
|
147
|
+
const sccDoc = docMap.get(w);
|
|
148
|
+
if (sccDoc)
|
|
149
|
+
scc.push(sccDoc);
|
|
150
|
+
} while (w !== k);
|
|
151
|
+
// Only include SCCs with >1 member (mutual access groups)
|
|
152
|
+
if (scc.length > 1) {
|
|
153
|
+
sccs.push(scc);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
for (const doc of documents) {
|
|
158
|
+
if (!indices.has(docKey(doc))) {
|
|
159
|
+
strongconnect(doc);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return sccs;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=inheritance-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inheritance-resolver.js","sourceRoot":"","sources":["../../src/inheritance/inheritance-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parsed element reference (DEC-1.1c).
|
|
3
|
+
* Segment count determines scope:
|
|
4
|
+
* - 1 segment: element only (same document)
|
|
5
|
+
* - 2 segments: document:element (same library)
|
|
6
|
+
* - 3 segments: source:document:element (cross-library)
|
|
7
|
+
*/
|
|
8
|
+
export interface ElementReference {
|
|
9
|
+
source?: string;
|
|
10
|
+
document?: string;
|
|
11
|
+
element: string;
|
|
12
|
+
segmentCount: 1 | 2 | 3;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Parse an element reference string.
|
|
16
|
+
*
|
|
17
|
+
* The colon `:` is the delimiter. Split into at most 3 parts.
|
|
18
|
+
* A segment containing `/` is a document path, not a source+document split.
|
|
19
|
+
*
|
|
20
|
+
* Examples:
|
|
21
|
+
* "V1" -> { element: "V1", segmentCount: 1 }
|
|
22
|
+
* "values:V1" -> { document: "values", element: "V1", segmentCount: 2 }
|
|
23
|
+
* "org:values:V1" -> { source: "org", document: "values", element: "V1", segmentCount: 3 }
|
|
24
|
+
* "@github:foo/bar:values:V1" -> { source: "@github:foo/bar", document: "values", element: "V1", segmentCount: 3 }
|
|
25
|
+
*/
|
|
26
|
+
export declare function parseReference(ref: string): ElementReference;
|
|
27
|
+
//# sourceMappingURL=reference-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-parser.d.ts","sourceRoot":"","sources":["../../src/inheritance/reference-parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAiE5D"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse an element reference string.
|
|
3
|
+
*
|
|
4
|
+
* The colon `:` is the delimiter. Split into at most 3 parts.
|
|
5
|
+
* A segment containing `/` is a document path, not a source+document split.
|
|
6
|
+
*
|
|
7
|
+
* Examples:
|
|
8
|
+
* "V1" -> { element: "V1", segmentCount: 1 }
|
|
9
|
+
* "values:V1" -> { document: "values", element: "V1", segmentCount: 2 }
|
|
10
|
+
* "org:values:V1" -> { source: "org", document: "values", element: "V1", segmentCount: 3 }
|
|
11
|
+
* "@github:foo/bar:values:V1" -> { source: "@github:foo/bar", document: "values", element: "V1", segmentCount: 3 }
|
|
12
|
+
*/
|
|
13
|
+
export function parseReference(ref) {
|
|
14
|
+
// Handle @source: prefixes that contain colons (e.g., @github:foo/bar)
|
|
15
|
+
// Pattern: @provider:path is always a source prefix
|
|
16
|
+
let source;
|
|
17
|
+
let remainder = ref;
|
|
18
|
+
if (ref.startsWith('@')) {
|
|
19
|
+
// Find the source boundary: @provider:path is the source
|
|
20
|
+
// The source ends at the colon that separates it from the document
|
|
21
|
+
// @github:foo/bar:values:V1 -> source=@github:foo/bar, rest=values:V1
|
|
22
|
+
// Strategy: @provider:path where path contains / — everything up to the colon
|
|
23
|
+
// after which the next segment does NOT contain /
|
|
24
|
+
const parts = ref.split(':');
|
|
25
|
+
// Build source from the front, stopping when we hit a segment that looks like a document:element
|
|
26
|
+
let sourceEnd = 1; // At least @provider
|
|
27
|
+
for (let i = 1; i < parts.length; i++) {
|
|
28
|
+
if (parts[i].includes('/')) {
|
|
29
|
+
sourceEnd = i + 1; // This segment is part of the source path
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (sourceEnd < parts.length) {
|
|
36
|
+
source = parts.slice(0, sourceEnd).join(':');
|
|
37
|
+
remainder = parts.slice(sourceEnd).join(':');
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// Entire string is a source with no document:element
|
|
41
|
+
return { element: ref, segmentCount: 1 };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Split remainder into segments
|
|
45
|
+
// For non-@ references, we can have up to 3 colon-separated segments:
|
|
46
|
+
// element | document:element | source:document:element
|
|
47
|
+
// For @ references, source is already extracted, so remainder is:
|
|
48
|
+
// element | document:element
|
|
49
|
+
const parts = remainder.split(':');
|
|
50
|
+
if (source) {
|
|
51
|
+
// Source already extracted from @ prefix
|
|
52
|
+
if (parts.length === 1) {
|
|
53
|
+
// source:element (unusual but valid)
|
|
54
|
+
return { source, element: parts[0], segmentCount: 3 };
|
|
55
|
+
}
|
|
56
|
+
// source:document:element — document may contain colons (unlikely but safe)
|
|
57
|
+
const element = parts[parts.length - 1];
|
|
58
|
+
const document = parts.slice(0, -1).join(':');
|
|
59
|
+
return { source, document, element, segmentCount: 3 };
|
|
60
|
+
}
|
|
61
|
+
// No @ prefix: split into 1, 2, or 3 segments
|
|
62
|
+
if (parts.length === 1) {
|
|
63
|
+
return { element: parts[0], segmentCount: 1 };
|
|
64
|
+
}
|
|
65
|
+
if (parts.length === 2) {
|
|
66
|
+
return { document: parts[0], element: parts[1], segmentCount: 2 };
|
|
67
|
+
}
|
|
68
|
+
// 3+ segments: first is source, last is element, middle is document
|
|
69
|
+
const element = parts[parts.length - 1];
|
|
70
|
+
const src = parts[0];
|
|
71
|
+
const document = parts.slice(1, -1).join(':');
|
|
72
|
+
return { source: src, document, element, segmentCount: 3 };
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=reference-parser.js.map
|