@shortlink-org/portolan 0.1.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.
- package/LICENSE +21 -0
- package/README.md +387 -0
- package/catalog/enum_test.go +46 -0
- package/catalog/model.go +932 -0
- package/catalog/roundtrip_test.go +185 -0
- package/catalog/via_test.go +38 -0
- package/cli/portolan.mjs +368 -0
- package/go.mod +14 -0
- package/go.sum +14 -0
- package/index.html +13 -0
- package/internal/commands/cargo.go +154 -0
- package/internal/commands/commands.go +143 -0
- package/internal/commands/commands_test.go +323 -0
- package/internal/commands/gradle.go +77 -0
- package/internal/commands/justfile.go +82 -0
- package/internal/commands/makefile.go +106 -0
- package/internal/commands/maven.go +93 -0
- package/internal/commands/packagejson.go +159 -0
- package/internal/commands/pyproject.go +169 -0
- package/internal/commands/taskfile.go +101 -0
- package/internal/commands/testdata/estate/.cargo/config.toml +7 -0
- package/internal/commands/testdata/estate/Makefile +33 -0
- package/internal/commands/testdata/estate/Taskfile.yml +21 -0
- package/internal/commands/testdata/estate/build.gradle.kts +21 -0
- package/internal/commands/testdata/estate/justfile +20 -0
- package/internal/commands/testdata/estate/package.json +13 -0
- package/internal/commands/testdata/estate/pom.xml +29 -0
- package/internal/commands/testdata/estate/pyproject.toml +27 -0
- package/internal/commands/testdata/estate/xtask/src/main.rs +27 -0
- package/internal/commands/testdata/golden/commands.json +305 -0
- package/internal/gohttp/analyze.go +2500 -0
- package/internal/gohttp/endpoints.go +1067 -0
- package/internal/gohttp/roots.go +320 -0
- package/internal/gohttp/typed.go +143 -0
- package/internal/goscan/constants.go +85 -0
- package/internal/goscan/goscan_test.go +227 -0
- package/internal/goscan/names.go +52 -0
- package/internal/goscan/parse_test.go +11 -0
- package/internal/goscan/source.go +36 -0
- package/internal/goscan/tree.go +155 -0
- package/internal/goscan/types.go +99 -0
- package/internal/wsdl/ids.go +127 -0
- package/internal/wsdl/ids_test.go +21 -0
- package/internal/wsdl/model.go +62 -0
- package/internal/wsdl/parse.go +920 -0
- package/internal/wsdl/parse_test.go +133 -0
- package/package.json +117 -0
- package/plugin/describe.go +107 -0
- package/plugin/describe_test.go +114 -0
- package/plugin/protocol.go +117 -0
- package/plugin/schematest/schematest.go +126 -0
- package/plugins/README.md +1160 -0
- package/plugins/extract-adr/describe.go +19 -0
- package/plugins/extract-adr/describe_test.go +11 -0
- package/plugins/extract-adr/extract.go +153 -0
- package/plugins/extract-adr/extract_test.go +350 -0
- package/plugins/extract-adr/history.go +99 -0
- package/plugins/extract-adr/main.go +65 -0
- package/plugins/extract-adr/options.schema.json +26 -0
- package/plugins/extract-adr/parse.go +642 -0
- package/plugins/extract-adr/parse_test.go +405 -0
- package/plugins/extract-asyncapi/describe.go +19 -0
- package/plugins/extract-asyncapi/describe_test.go +11 -0
- package/plugins/extract-asyncapi/extract.go +315 -0
- package/plugins/extract-asyncapi/extract_test.go +197 -0
- package/plugins/extract-asyncapi/main.go +48 -0
- package/plugins/extract-asyncapi/options.schema.json +26 -0
- package/plugins/extract-asyncapi/spec.go +151 -0
- package/plugins/extract-celery/README.md +169 -0
- package/plugins/extract-celery/extract.py +346 -0
- package/plugins/extract-celery/extract_test.py +192 -0
- package/plugins/extract-celery/main.py +66 -0
- package/plugins/extract-celery/options.py +31 -0
- package/plugins/extract-celery/options.schema.json +31 -0
- package/plugins/extract-celery/producers.py +156 -0
- package/plugins/extract-celery/routes_test.py +106 -0
- package/plugins/extract-commands/describe.go +19 -0
- package/plugins/extract-commands/describe_test.go +11 -0
- package/plugins/extract-commands/extract.go +79 -0
- package/plugins/extract-commands/extract_test.go +92 -0
- package/plugins/extract-commands/main.go +55 -0
- package/plugins/extract-commands/options.schema.json +20 -0
- package/plugins/extract-csr/avro.go +258 -0
- package/plugins/extract-csr/describe.go +19 -0
- package/plugins/extract-csr/describe_test.go +11 -0
- package/plugins/extract-csr/extract.go +338 -0
- package/plugins/extract-csr/extract_test.go +374 -0
- package/plugins/extract-csr/jsonschema.go +343 -0
- package/plugins/extract-csr/lock.go +25 -0
- package/plugins/extract-csr/main.go +84 -0
- package/plugins/extract-csr/options.schema.json +43 -0
- package/plugins/extract-csr/subject.go +102 -0
- package/plugins/extract-django/README.md +386 -0
- package/plugins/extract-django/apps.py +100 -0
- package/plugins/extract-django/auth.py +302 -0
- package/plugins/extract-django/auth_test.py +188 -0
- package/plugins/extract-django/clients.py +121 -0
- package/plugins/extract-django/contracts.py +458 -0
- package/plugins/extract-django/database.py +119 -0
- package/plugins/extract-django/domain.py +318 -0
- package/plugins/extract-django/events.py +86 -0
- package/plugins/extract-django/extract.py +601 -0
- package/plugins/extract-django/extract_test.py +397 -0
- package/plugins/extract-django/flows.py +1278 -0
- package/plugins/extract-django/flows_test.py +338 -0
- package/plugins/extract-django/ids.py +42 -0
- package/plugins/extract-django/ids_test.py +30 -0
- package/plugins/extract-django/lifecycle.py +222 -0
- package/plugins/extract-django/lifecycle_test.py +76 -0
- package/plugins/extract-django/main.py +66 -0
- package/plugins/extract-django/openapi.py +229 -0
- package/plugins/extract-django/openapi_test.py +60 -0
- package/plugins/extract-django/operations.py +96 -0
- package/plugins/extract-django/options.py +61 -0
- package/plugins/extract-django/options.schema.json +126 -0
- package/plugins/extract-django/routing.py +214 -0
- package/plugins/extract-django/routing_test.py +198 -0
- package/plugins/extract-django/serializers.py +558 -0
- package/plugins/extract-django/store.py +434 -0
- package/plugins/extract-django/transport.py +242 -0
- package/plugins/extract-flows/describe.go +19 -0
- package/plugins/extract-flows/describe_test.go +11 -0
- package/plugins/extract-flows/extract.go +91 -0
- package/plugins/extract-flows/main.go +45 -0
- package/plugins/extract-flows/options.schema.json +16 -0
- package/plugins/extract-flows/parse.go +593 -0
- package/plugins/extract-flows/parse_test.go +204 -0
- package/plugins/extract-glossary/describe.go +19 -0
- package/plugins/extract-glossary/describe_test.go +11 -0
- package/plugins/extract-glossary/extract.go +115 -0
- package/plugins/extract-glossary/extract_test.go +220 -0
- package/plugins/extract-glossary/main.go +59 -0
- package/plugins/extract-glossary/options.schema.json +21 -0
- package/plugins/extract-glossary/parse.go +214 -0
- package/plugins/extract-glossary/parse_test.go +203 -0
- package/plugins/extract-go/aggregate.go +214 -0
- package/plugins/extract-go/client.go +409 -0
- package/plugins/extract-go/client_test.go +266 -0
- package/plugins/extract-go/describe.go +19 -0
- package/plugins/extract-go/describe_test.go +11 -0
- package/plugins/extract-go/enum.go +195 -0
- package/plugins/extract-go/enum_test.go +82 -0
- package/plugins/extract-go/event.go +99 -0
- package/plugins/extract-go/extract.go +191 -0
- package/plugins/extract-go/extract_test.go +261 -0
- package/plugins/extract-go/flow.go +1441 -0
- package/plugins/extract-go/flow_test.go +609 -0
- package/plugins/extract-go/httpclient.go +174 -0
- package/plugins/extract-go/httpclient_test.go +296 -0
- package/plugins/extract-go/ids.go +92 -0
- package/plugins/extract-go/layout.go +225 -0
- package/plugins/extract-go/layout_test.go +125 -0
- package/plugins/extract-go/lifecycle.go +324 -0
- package/plugins/extract-go/lifecycle_test.go +108 -0
- package/plugins/extract-go/main.go +79 -0
- package/plugins/extract-go/operation.go +157 -0
- package/plugins/extract-go/options.schema.json +66 -0
- package/plugins/extract-go/source.go +316 -0
- package/plugins/extract-go/transport.go +321 -0
- package/plugins/extract-go/transport_test.go +145 -0
- package/plugins/extract-go/wiring.go +434 -0
- package/plugins/extract-go-nats/describe.go +19 -0
- package/plugins/extract-go-nats/describe_test.go +11 -0
- package/plugins/extract-go-nats/extract.go +177 -0
- package/plugins/extract-go-nats/extract_test.go +389 -0
- package/plugins/extract-go-nats/index.go +379 -0
- package/plugins/extract-go-nats/main.go +42 -0
- package/plugins/extract-go-nats/options.schema.json +21 -0
- package/plugins/extract-go-nats/resolve.go +161 -0
- package/plugins/extract-go-nats/sites.go +224 -0
- package/plugins/extract-graphql/describe.go +19 -0
- package/plugins/extract-graphql/describe_test.go +11 -0
- package/plugins/extract-graphql/extract.go +433 -0
- package/plugins/extract-graphql/extract_test.go +256 -0
- package/plugins/extract-graphql/ids.go +49 -0
- package/plugins/extract-graphql/lex.go +237 -0
- package/plugins/extract-graphql/main.go +51 -0
- package/plugins/extract-graphql/options.schema.json +31 -0
- package/plugins/extract-graphql/parse.go +621 -0
- package/plugins/extract-graphql/parse_test.go +122 -0
- package/plugins/extract-http-clients/describe.go +19 -0
- package/plugins/extract-http-clients/describe_test.go +11 -0
- package/plugins/extract-http-clients/extract.go +705 -0
- package/plugins/extract-http-clients/extract_test.go +1263 -0
- package/plugins/extract-http-clients/main.go +42 -0
- package/plugins/extract-http-clients/options.schema.json +33 -0
- package/plugins/extract-java/README.md +190 -0
- package/plugins/extract-java/build/org/portolan/extract/Catalog.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Clients$1.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Clients$2.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Clients$Call.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Clients$Client.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Clients$Route.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Clients.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Domain$Aggregate.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Domain.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Events$Found.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Events.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Extract.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Flows$1.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Flows$Binding.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Flows$Draft.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Flows$Frame.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Flows$Options.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Flows.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Ids.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Json$Reader.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Json.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Lifecycle$1.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Lifecycle$Move.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Lifecycle.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Main.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/OpenApi$Operation.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/OpenApi$Spec.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/OpenApi.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Operations$1.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Operations$UseCase.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Operations.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Proto$Rpc.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Proto$Service.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Proto.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Protocol$Builder.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Protocol$Input.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Protocol$Options.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Protocol.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Source$Project.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Source$Unit.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Source.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Transport$Endpoint.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Transport.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Yaml$Line.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Yaml$Reader.class +0 -0
- package/plugins/extract-java/build/org/portolan/extract/Yaml.class +0 -0
- package/plugins/extract-java/options.schema.json +70 -0
- package/plugins/extract-openapi/describe.go +19 -0
- package/plugins/extract-openapi/describe_test.go +11 -0
- package/plugins/extract-openapi/discover.go +243 -0
- package/plugins/extract-openapi/extract.go +526 -0
- package/plugins/extract-openapi/extract_test.go +545 -0
- package/plugins/extract-openapi/main.go +75 -0
- package/plugins/extract-openapi/options.schema.json +62 -0
- package/plugins/extract-openapi/spec.go +350 -0
- package/plugins/extract-project/README.md +22 -0
- package/plugins/extract-project/describe.go +19 -0
- package/plugins/extract-project/describe_test.go +11 -0
- package/plugins/extract-project/extract.go +221 -0
- package/plugins/extract-project/extract_test.go +109 -0
- package/plugins/extract-project/main.go +41 -0
- package/plugins/extract-project/options.schema.json +48 -0
- package/plugins/extract-proto/ast.go +125 -0
- package/plugins/extract-proto/consumes.go +77 -0
- package/plugins/extract-proto/describe.go +19 -0
- package/plugins/extract-proto/extract.go +293 -0
- package/plugins/extract-proto/extract_test.go +459 -0
- package/plugins/extract-proto/ids.go +89 -0
- package/plugins/extract-proto/ids_test.go +57 -0
- package/plugins/extract-proto/lex.go +285 -0
- package/plugins/extract-proto/main.go +100 -0
- package/plugins/extract-proto/module.go +120 -0
- package/plugins/extract-proto/options.schema.json +51 -0
- package/plugins/extract-proto/parse.go +720 -0
- package/plugins/extract-proto/parse_test.go +307 -0
- package/plugins/extract-proto/provides.go +236 -0
- package/plugins/extract-proto/resolve.go +222 -0
- package/plugins/extract-proto/resolve_test.go +119 -0
- package/plugins/extract-python-kafka/README.md +36 -0
- package/plugins/extract-python-kafka/extract.py +211 -0
- package/plugins/extract-python-kafka/extract_test.py +68 -0
- package/plugins/extract-python-kafka/main.py +59 -0
- package/plugins/extract-python-kafka/options.py +29 -0
- package/plugins/extract-python-kafka/options.schema.json +31 -0
- package/plugins/extract-redis/README.md +11 -0
- package/plugins/extract-redis/describe.go +19 -0
- package/plugins/extract-redis/describe_test.go +11 -0
- package/plugins/extract-redis/extract.go +183 -0
- package/plugins/extract-redis/extract_test.go +168 -0
- package/plugins/extract-redis/keyspaces.go +469 -0
- package/plugins/extract-redis/main.go +44 -0
- package/plugins/extract-redis/options.schema.json +30 -0
- package/plugins/extract-river/describe.go +19 -0
- package/plugins/extract-river/describe_test.go +11 -0
- package/plugins/extract-river/extract.go +507 -0
- package/plugins/extract-river/extract_test.go +132 -0
- package/plugins/extract-river/main.go +42 -0
- package/plugins/extract-river/options.schema.json +21 -0
- package/plugins/extract-rust/Cargo.lock +133 -0
- package/plugins/extract-rust/Cargo.toml +23 -0
- package/plugins/extract-rust/README.md +204 -0
- package/plugins/extract-rust/options.schema.json +65 -0
- package/plugins/extract-rust/rustfmt.toml +1 -0
- package/plugins/extract-sql/ddl.go +893 -0
- package/plugins/extract-sql/ddl_test.go +401 -0
- package/plugins/extract-sql/describe.go +19 -0
- package/plugins/extract-sql/describe_test.go +11 -0
- package/plugins/extract-sql/layout.go +221 -0
- package/plugins/extract-sql/layout_test.go +55 -0
- package/plugins/extract-sql/lineage.go +107 -0
- package/plugins/extract-sql/main.go +141 -0
- package/plugins/extract-sql/maps.go +564 -0
- package/plugins/extract-sql/maps_java.go +117 -0
- package/plugins/extract-sql/maps_rust.go +333 -0
- package/plugins/extract-sql/maps_rust_test.go +70 -0
- package/plugins/extract-sql/maps_test.go +204 -0
- package/plugins/extract-sql/maps_ts.go +398 -0
- package/plugins/extract-sql/maps_ts_test.go +136 -0
- package/plugins/extract-sql/options.schema.json +53 -0
- package/plugins/extract-sql/projection.go +70 -0
- package/plugins/extract-sql/projection_test.go +50 -0
- package/plugins/extract-sql/store.go +420 -0
- package/plugins/extract-sql/store_test.go +233 -0
- package/plugins/extract-sql/view.go +295 -0
- package/plugins/extract-ts/README.md +306 -0
- package/plugins/extract-ts/ast.test.ts +178 -0
- package/plugins/extract-ts/ast.ts +648 -0
- package/plugins/extract-ts/clients.ts +185 -0
- package/plugins/extract-ts/domain.ts +164 -0
- package/plugins/extract-ts/extract.test.ts +208 -0
- package/plugins/extract-ts/extract.ts +200 -0
- package/plugins/extract-ts/flows.ts +783 -0
- package/plugins/extract-ts/graphql.test.ts +73 -0
- package/plugins/extract-ts/graphql.ts +181 -0
- package/plugins/extract-ts/ids.test.ts +21 -0
- package/plugins/extract-ts/ids.ts +52 -0
- package/plugins/extract-ts/lifecycle.ts +138 -0
- package/plugins/extract-ts/main.ts +48 -0
- package/plugins/extract-ts/openapi.test.ts +64 -0
- package/plugins/extract-ts/openapi.ts +99 -0
- package/plugins/extract-ts/operations.ts +93 -0
- package/plugins/extract-ts/options.schema.json +96 -0
- package/plugins/extract-ts/source.test.ts +174 -0
- package/plugins/extract-ts/source.ts +465 -0
- package/plugins/extract-ts/transport.ts +147 -0
- package/plugins/extract-ts/tsconfig.json +13 -0
- package/plugins/extract-ts/wiring.ts +190 -0
- package/plugins/extract-watermill/describe.go +19 -0
- package/plugins/extract-watermill/describe_test.go +11 -0
- package/plugins/extract-watermill/extract.go +1228 -0
- package/plugins/extract-watermill/extract_test.go +234 -0
- package/plugins/extract-watermill/main.go +41 -0
- package/plugins/extract-watermill/options.schema.json +21 -0
- package/plugins/extract-wsdl/describe.go +19 -0
- package/plugins/extract-wsdl/describe_test.go +11 -0
- package/plugins/extract-wsdl/extract.go +148 -0
- package/plugins/extract-wsdl/extract_test.go +45 -0
- package/plugins/extract-wsdl/main.go +53 -0
- package/plugins/extract-wsdl/options.schema.json +59 -0
- package/plugins/fetch-bsr/auth.go +114 -0
- package/plugins/fetch-bsr/bsr.go +240 -0
- package/plugins/fetch-bsr/cache.go +66 -0
- package/plugins/fetch-bsr/describe.go +19 -0
- package/plugins/fetch-bsr/fetch.go +192 -0
- package/plugins/fetch-bsr/fetch_test.go +465 -0
- package/plugins/fetch-bsr/lock.go +71 -0
- package/plugins/fetch-bsr/main.go +117 -0
- package/plugins/fetch-bsr/options.schema.json +42 -0
- package/plugins/fetch-csr/auth.go +95 -0
- package/plugins/fetch-csr/cache.go +69 -0
- package/plugins/fetch-csr/describe.go +19 -0
- package/plugins/fetch-csr/describe_test.go +11 -0
- package/plugins/fetch-csr/fetch.go +254 -0
- package/plugins/fetch-csr/fetch_test.go +494 -0
- package/plugins/fetch-csr/lock.go +95 -0
- package/plugins/fetch-csr/main.go +122 -0
- package/plugins/fetch-csr/options.schema.json +42 -0
- package/plugins/fetch-csr/registry.go +209 -0
- package/plugins/fetch-git/cache.go +65 -0
- package/plugins/fetch-git/describe.go +19 -0
- package/plugins/fetch-git/describe_test.go +11 -0
- package/plugins/fetch-git/fetch.go +181 -0
- package/plugins/fetch-git/fetch_test.go +332 -0
- package/plugins/fetch-git/git.go +169 -0
- package/plugins/fetch-git/lock.go +72 -0
- package/plugins/fetch-git/main.go +127 -0
- package/plugins/fetch-git/offline.go +39 -0
- package/plugins/fetch-git/options.schema.json +42 -0
- package/plugins/fetch-git/pin.go +90 -0
- package/plugins/fetch-git/pin_test.go +74 -0
- package/plugins/gen-backstage/describe.go +17 -0
- package/plugins/gen-backstage/main.go +22 -0
- package/plugins/gen-backstage/options.schema.json +30 -0
- package/plugins/gen-backstage/plugin.go +473 -0
- package/plugins/gen-backstage/plugin_test.go +145 -0
- package/plugins/gen-backstage.wasm +0 -0
- package/plugins/gen-markdown/adr.go +162 -0
- package/plugins/gen-markdown/aggregate.go +362 -0
- package/plugins/gen-markdown/canonical.go +93 -0
- package/plugins/gen-markdown/context.go +90 -0
- package/plugins/gen-markdown/coverage_test.go +89 -0
- package/plugins/gen-markdown/describe.go +19 -0
- package/plugins/gen-markdown/describe_test.go +11 -0
- package/plugins/gen-markdown/external.go +71 -0
- package/plugins/gen-markdown/flow.go +277 -0
- package/plugins/gen-markdown/glossary.go +76 -0
- package/plugins/gen-markdown/glossary_test.go +148 -0
- package/plugins/gen-markdown/llms.go +302 -0
- package/plugins/gen-markdown/main.go +22 -0
- package/plugins/gen-markdown/markdown.go +254 -0
- package/plugins/gen-markdown/markdown_test.go +100 -0
- package/plugins/gen-markdown/module.go +107 -0
- package/plugins/gen-markdown/options.schema.json +16 -0
- package/plugins/gen-markdown/plugin.go +39 -0
- package/plugins/gen-markdown/quality_test.go +176 -0
- package/plugins/gen-markdown/redis_test.go +38 -0
- package/plugins/gen-markdown/render.go +344 -0
- package/plugins/gen-markdown/render_test.go +186 -0
- package/plugins/gen-markdown/service.go +456 -0
- package/plugins/gen-markdown/source.go +177 -0
- package/plugins/gen-markdown/store.go +201 -0
- package/plugins/gen-markdown.wasm +0 -0
- package/plugins/gen-mermaid/describe.go +17 -0
- package/plugins/gen-mermaid/main.go +22 -0
- package/plugins/gen-mermaid/options.schema.json +10 -0
- package/plugins/gen-mermaid/plugin.go +104 -0
- package/plugins/gen-mermaid/plugin_test.go +33 -0
- package/plugins/gen-mermaid.wasm +0 -0
- package/plugins/openapi/ids.go +261 -0
- package/plugins/openapi/ids_test.go +98 -0
- package/plugins/pyplugin/catalog.py +209 -0
- package/plugins/pyplugin/celery_conf.py +436 -0
- package/plugins/pyplugin/celery_tasks.py +76 -0
- package/plugins/pyplugin/kafka.py +570 -0
- package/plugins/pyplugin/names.py +38 -0
- package/plugins/pyplugin/protocol.py +79 -0
- package/plugins/pyplugin/source.py +285 -0
- package/plugins/verify-codeowners/describe.go +19 -0
- package/plugins/verify-codeowners/describe_test.go +11 -0
- package/plugins/verify-codeowners/main.go +75 -0
- package/plugins/verify-codeowners/match.go +85 -0
- package/plugins/verify-codeowners/match_test.go +47 -0
- package/plugins/verify-codeowners/options.schema.json +15 -0
- package/plugins/verify-codeowners/owners.go +164 -0
- package/plugins/verify-codeowners/owners_test.go +225 -0
- package/plugins/verify-codeowners/parse.go +90 -0
- package/plugins/verify-codeowners/parse_test.go +62 -0
- package/plugins/verify-otel/describe.go +19 -0
- package/plugins/verify-otel/describe_test.go +11 -0
- package/plugins/verify-otel/main.go +53 -0
- package/plugins/verify-otel/match.go +336 -0
- package/plugins/verify-otel/options.schema.json +30 -0
- package/plugins/verify-otel/otlp.go +200 -0
- package/plugins/verify-otel/verify.go +734 -0
- package/plugins/verify-otel/verify_test.go +460 -0
- package/portolan.json +1073 -0
- package/public/favicon.svg +12 -0
- package/schema/portolan.schema.json +2558 -0
- package/scripts/README.md +53 -0
- package/scripts/build-report.mjs +60 -0
- package/scripts/build-report.test.mjs +44 -0
- package/scripts/builtin-plugins.mjs +49 -0
- package/scripts/catalog-sources.mjs +67 -0
- package/scripts/diff.mjs +315 -0
- package/scripts/diff.test.mjs +151 -0
- package/scripts/forge-comment.mjs +144 -0
- package/scripts/forge-comment.test.mjs +151 -0
- package/scripts/forge-release.mjs +138 -0
- package/scripts/forge-release.test.mjs +106 -0
- package/scripts/forge.mjs +61 -0
- package/scripts/gen-likec4.mjs +854 -0
- package/scripts/gen-likec4.test.mjs +258 -0
- package/scripts/gen.mjs +603 -0
- package/scripts/generated-docs.test.mjs +66 -0
- package/scripts/local-api.mjs +1192 -0
- package/scripts/local-api.test.mjs +387 -0
- package/scripts/manifest.mjs +214 -0
- package/scripts/manifest.test.mjs +148 -0
- package/scripts/output-path.mjs +79 -0
- package/scripts/output-path.test.mjs +45 -0
- package/scripts/package-smoke.mjs +37 -0
- package/scripts/plugin-host.mjs +419 -0
- package/scripts/plugin-host.test.mjs +109 -0
- package/scripts/plugin-wasm-worker.mjs +34 -0
- package/scripts/run-builtin.mjs +81 -0
- package/scripts/schema.mjs +357 -0
- package/scripts/site-docs.mjs +295 -0
- package/scripts/site-docs.test.mjs +181 -0
- package/scripts/vendor-lock.mjs +58 -0
- package/scripts/vendor-lock.test.mjs +69 -0
- package/src/README.md +38 -0
- package/src/app/App.tsx +448 -0
- package/src/app/BranchPicker.test.ts +46 -0
- package/src/app/BranchPicker.tsx +153 -0
- package/src/app/Breadcrumbs.test.ts +38 -0
- package/src/app/Breadcrumbs.tsx +223 -0
- package/src/app/BuildStamp.tsx +146 -0
- package/src/app/CommandPalette.tsx +292 -0
- package/src/app/HashScroll.tsx +45 -0
- package/src/app/Sidebar.tsx +1742 -0
- package/src/app/TopBar.tsx +393 -0
- package/src/app/density.tsx +64 -0
- package/src/app/forge-access.test.ts +27 -0
- package/src/app/forge-access.tsx +80 -0
- package/src/app/panels.tsx +141 -0
- package/src/app/pins.tsx +242 -0
- package/src/app/query-client.ts +24 -0
- package/src/app/responsive.ts +55 -0
- package/src/app/shortcuts.test.ts +39 -0
- package/src/app/shortcuts.tsx +282 -0
- package/src/app/theme.tsx +51 -0
- package/src/app/title.test.ts +14 -0
- package/src/app/title.ts +30 -0
- package/src/app/toast.tsx +59 -0
- package/src/app/tree-keys.test.ts +80 -0
- package/src/app/tree-keys.ts +87 -0
- package/src/app/ui-store.ts +52 -0
- package/src/catalog-error.test.ts +105 -0
- package/src/catalog-profile.test.ts +59 -0
- package/src/catalog-profile.ts +101 -0
- package/src/catalog-stores.test.ts +431 -0
- package/src/catalog.test.ts +1215 -0
- package/src/catalog.ts +3125 -0
- package/src/chat/Cards.tsx +408 -0
- package/src/chat/ChatPanel.tsx +79 -0
- package/src/chat/ChatSettings.tsx +219 -0
- package/src/chat/Composer.tsx +99 -0
- package/src/chat/Conversation.tsx +281 -0
- package/src/chat/Header.tsx +46 -0
- package/src/chat/Message.tsx +49 -0
- package/src/chat/Notice.tsx +195 -0
- package/src/chat/Starter.tsx +67 -0
- package/src/chat/Steps.tsx +45 -0
- package/src/chat/Waiting.tsx +87 -0
- package/src/chat/flags.test.ts +59 -0
- package/src/chat/flags.ts +155 -0
- package/src/chat/linkify.test.ts +30 -0
- package/src/chat/linkify.ts +45 -0
- package/src/chat/prefs.ts +56 -0
- package/src/chat/prompt.test.ts +43 -0
- package/src/chat/prompt.ts +157 -0
- package/src/chat/store.ts +35 -0
- package/src/chat/tools.ts +58 -0
- package/src/chat/transport.ts +70 -0
- package/src/components/AdrRow.tsx +29 -0
- package/src/components/AnchorLink.tsx +67 -0
- package/src/components/ApiReference.tsx +134 -0
- package/src/components/AsyncApiReference.tsx +120 -0
- package/src/components/CatalogStamp.tsx +155 -0
- package/src/components/ChannelRows.tsx +132 -0
- package/src/components/CommandRows.tsx +139 -0
- package/src/components/DiagramSkeleton.tsx +71 -0
- package/src/components/EditorLink.tsx +85 -0
- package/src/components/FieldTree.tsx +305 -0
- package/src/components/FlowTrigger.tsx +34 -0
- package/src/components/Ident.tsx +89 -0
- package/src/components/Integrations.tsx +243 -0
- package/src/components/LifecycleDiagram.tsx +110 -0
- package/src/components/MachineDocs.tsx +42 -0
- package/src/components/Markdown.tsx +173 -0
- package/src/components/MarkdownTable.tsx +206 -0
- package/src/components/Mermaid.tsx +211 -0
- package/src/components/MethodRows.tsx +309 -0
- package/src/components/Overlay.tsx +125 -0
- package/src/components/PageHeader.tsx +189 -0
- package/src/components/RowActions.tsx +97 -0
- package/src/components/SchemaDocument.tsx +89 -0
- package/src/components/Select.tsx +126 -0
- package/src/components/ShapeRows.tsx +118 -0
- package/src/components/SourceDoc.tsx +82 -0
- package/src/components/SourcePreview.tsx +441 -0
- package/src/components/TabRow.tsx +182 -0
- package/src/components/TechIcon.tsx +34 -0
- package/src/components/Toc.tsx +132 -0
- package/src/components/WhatLinksHere.tsx +273 -0
- package/src/components/WsdlReference.tsx +84 -0
- package/src/components/ddd-icons.tsx +107 -0
- package/src/components/kind.tsx +157 -0
- package/src/components/logo.tsx +61 -0
- package/src/components/primitives.tsx +264 -0
- package/src/data.test.ts +18 -0
- package/src/data.ts +202 -0
- package/src/enrich.test.ts +1150 -0
- package/src/enrich.ts +672 -0
- package/src/er/ErCanvas.tsx +533 -0
- package/src/er/RedisSchema.tsx +74 -0
- package/src/er/RelationCard.tsx +267 -0
- package/src/er/StoreHeader.tsx +155 -0
- package/src/er/TableNode.tsx +84 -0
- package/src/er/ViewNode.tsx +83 -0
- package/src/er/layout.test.ts +115 -0
- package/src/er/layout.ts +77 -0
- package/src/er/lineage.test.ts +140 -0
- package/src/er/lineage.ts +107 -0
- package/src/er/markers.tsx +79 -0
- package/src/er/spec.test.ts +344 -0
- package/src/er/spec.ts +426 -0
- package/src/flow/ChainList.tsx +162 -0
- package/src/flow/FlowTable.tsx +123 -0
- package/src/flow/FlowToolbar.tsx +372 -0
- package/src/flow/StepDetail.tsx +380 -0
- package/src/flow/StepRail.tsx +428 -0
- package/src/flow/answers.test.ts +50 -0
- package/src/flow/answers.ts +58 -0
- package/src/flow/chain.test.ts +383 -0
- package/src/flow/chain.ts +353 -0
- package/src/flow/chapters.test.ts +185 -0
- package/src/flow/chapters.ts +225 -0
- package/src/flow/continues.test.ts +102 -0
- package/src/flow/continues.ts +65 -0
- package/src/flow/cross-context.test.ts +97 -0
- package/src/flow/cross-context.ts +35 -0
- package/src/flow/mermaid.test.ts +22 -0
- package/src/flow/mermaid.ts +141 -0
- package/src/flow/outline.test.ts +212 -0
- package/src/flow/outline.ts +170 -0
- package/src/flow/paths.test.ts +129 -0
- package/src/flow/paths.ts +147 -0
- package/src/flow/prefs.test.ts +80 -0
- package/src/flow/prefs.ts +104 -0
- package/src/graph/DependencyGraph.tsx +283 -0
- package/src/graph/DependencyNodes.tsx +162 -0
- package/src/graph/EdgeLabel.tsx +61 -0
- package/src/graph/FocusedEventGraph.tsx +211 -0
- package/src/graph/GraphToolbar.tsx +187 -0
- package/src/graph/RoutedEdge.tsx +80 -0
- package/src/graph/dependency-layout.test.ts +360 -0
- package/src/graph/dependency-layout.ts +444 -0
- package/src/graph/elk.test.ts +70 -0
- package/src/graph/elk.ts +287 -0
- package/src/graph/nodes.tsx +97 -0
- package/src/graph/theme.ts +81 -0
- package/src/graph/useElkFlow.ts +125 -0
- package/src/index.css +1547 -0
- package/src/language/InLanguage.tsx +40 -0
- package/src/language/TermCard.tsx +132 -0
- package/src/language/cards.test.ts +114 -0
- package/src/language/cards.ts +111 -0
- package/src/lib/admonition.test.ts +49 -0
- package/src/lib/admonition.ts +48 -0
- package/src/lib/adr.test.ts +131 -0
- package/src/lib/adr.ts +68 -0
- package/src/lib/api.test.ts +122 -0
- package/src/lib/api.ts +135 -0
- package/src/lib/backlinks.test.ts +330 -0
- package/src/lib/backlinks.ts +567 -0
- package/src/lib/branch-compare.ts +16 -0
- package/src/lib/build-info.test.ts +76 -0
- package/src/lib/build-info.ts +80 -0
- package/src/lib/catalog-diff.test.ts +275 -0
- package/src/lib/catalog-diff.ts +655 -0
- package/src/lib/clipboard.ts +43 -0
- package/src/lib/comparison-memory.test.ts +40 -0
- package/src/lib/comparison-memory.ts +39 -0
- package/src/lib/context-color.ts +27 -0
- package/src/lib/context-map.test.ts +148 -0
- package/src/lib/context-map.ts +399 -0
- package/src/lib/data-model.test.ts +245 -0
- package/src/lib/data-model.ts +399 -0
- package/src/lib/data-problems.test.ts +178 -0
- package/src/lib/data-problems.ts +314 -0
- package/src/lib/derive.test.ts +251 -0
- package/src/lib/derive.ts +515 -0
- package/src/lib/editor-link.test.ts +125 -0
- package/src/lib/editor-link.ts +96 -0
- package/src/lib/editor-prefs.ts +27 -0
- package/src/lib/event-graph.test.ts +237 -0
- package/src/lib/event-graph.ts +327 -0
- package/src/lib/export-canvas.ts +37 -0
- package/src/lib/export-file.test.ts +30 -0
- package/src/lib/export-file.ts +20 -0
- package/src/lib/flow-tree.test.ts +177 -0
- package/src/lib/flow-tree.ts +160 -0
- package/src/lib/forge-refs.test.ts +50 -0
- package/src/lib/forge-refs.ts +60 -0
- package/src/lib/format.test.ts +35 -0
- package/src/lib/format.ts +64 -0
- package/src/lib/github-catalog.test.ts +301 -0
- package/src/lib/github-catalog.ts +610 -0
- package/src/lib/integrations.test.ts +119 -0
- package/src/lib/integrations.ts +133 -0
- package/src/lib/kinds.test.ts +91 -0
- package/src/lib/kinds.ts +204 -0
- package/src/lib/lifecycle.test.ts +93 -0
- package/src/lib/lifecycle.ts +165 -0
- package/src/lib/local-api.ts +194 -0
- package/src/lib/motion-features.ts +11 -0
- package/src/lib/motion.test.ts +120 -0
- package/src/lib/motion.tsx +269 -0
- package/src/lib/palette-recent.test.ts +80 -0
- package/src/lib/palette-recent.ts +90 -0
- package/src/lib/palette.test.ts +365 -0
- package/src/lib/palette.ts +593 -0
- package/src/lib/pins.test.ts +139 -0
- package/src/lib/pins.ts +130 -0
- package/src/lib/problems.test.ts +112 -0
- package/src/lib/project-preview.ts +5 -0
- package/src/lib/proto-problems.test.ts +121 -0
- package/src/lib/proto-problems.ts +65 -0
- package/src/lib/queries.test.ts +113 -0
- package/src/lib/queries.ts +131 -0
- package/src/lib/registry.test.ts +219 -0
- package/src/lib/registry.ts +208 -0
- package/src/lib/scenarios.ts +547 -0
- package/src/lib/setup-info.test.ts +199 -0
- package/src/lib/setup-info.ts +415 -0
- package/src/lib/shape.test.ts +289 -0
- package/src/lib/shape.ts +454 -0
- package/src/lib/sidebar-prefs.test.ts +32 -0
- package/src/lib/sidebar-prefs.ts +75 -0
- package/src/lib/source-code.test.ts +159 -0
- package/src/lib/source-code.ts +286 -0
- package/src/lib/source-doc.test.ts +131 -0
- package/src/lib/source-doc.ts +103 -0
- package/src/lib/source-highlight.test.ts +29 -0
- package/src/lib/source-highlight.ts +24 -0
- package/src/lib/source-link.test.ts +153 -0
- package/src/lib/source-link.ts +201 -0
- package/src/lib/spec-files.test.ts +24 -0
- package/src/lib/spec-files.ts +23 -0
- package/src/lib/table-directive.test.ts +139 -0
- package/src/lib/table-directive.ts +106 -0
- package/src/lib/tech.test.ts +120 -0
- package/src/lib/tech.ts +421 -0
- package/src/lib/terms.test.ts +67 -0
- package/src/lib/terms.ts +179 -0
- package/src/lib/wire-problems.test.ts +263 -0
- package/src/lib/wire-problems.ts +281 -0
- package/src/likec4/C4View.tsx +55 -0
- package/src/likec4/CanvasBridge.tsx +187 -0
- package/src/likec4/FlowView.tsx +235 -0
- package/src/likec4/InteractiveView.tsx +144 -0
- package/src/likec4/canvas-viewport.test.ts +149 -0
- package/src/likec4/canvas-viewport.ts +135 -0
- package/src/likec4/flow-edges.test.ts +51 -0
- package/src/likec4/flow-edges.ts +89 -0
- package/src/likec4/frame-theme.test.ts +76 -0
- package/src/likec4/frame-theme.ts +101 -0
- package/src/likec4/highlight-css.test.ts +49 -0
- package/src/likec4/highlight-css.ts +52 -0
- package/src/likec4/ids.test.ts +151 -0
- package/src/likec4/ids.ts +115 -0
- package/src/likec4/levels.tsx +70 -0
- package/src/likec4/mapping.test.ts +66 -0
- package/src/likec4/mapping.ts +54 -0
- package/src/likec4/reserved.json +141 -0
- package/src/likec4/view-index.ts +78 -0
- package/src/main.tsx +13 -0
- package/src/map/ContextMapGraph.tsx +274 -0
- package/src/map/ContextNode.tsx +70 -0
- package/src/map/FloatingEdge.tsx +86 -0
- package/src/merge.test.ts +1038 -0
- package/src/merge.ts +1004 -0
- package/src/pages/AdrDetail.tsx +242 -0
- package/src/pages/AdrIndex.tsx +114 -0
- package/src/pages/AggregatePage.tsx +727 -0
- package/src/pages/BlockPage.tsx +478 -0
- package/src/pages/CatalogFailure.tsx +111 -0
- package/src/pages/Changes.tsx +313 -0
- package/src/pages/ContextMap.tsx +534 -0
- package/src/pages/ContextPage.tsx +346 -0
- package/src/pages/EnumPage.tsx +282 -0
- package/src/pages/EventPage.tsx +686 -0
- package/src/pages/ExternalPage.tsx +204 -0
- package/src/pages/FlowDetail.tsx +663 -0
- package/src/pages/FlowIndex.tsx +303 -0
- package/src/pages/GraphPage.tsx +217 -0
- package/src/pages/Language.tsx +257 -0
- package/src/pages/ModulePage.tsx +366 -0
- package/src/pages/NotFound.tsx +54 -0
- package/src/pages/Overview.tsx +344 -0
- package/src/pages/Problems.tsx +360 -0
- package/src/pages/RegistryIndex.tsx +118 -0
- package/src/pages/ServicePage.tsx +746 -0
- package/src/pages/Settings.tsx +975 -0
- package/src/pages/StorePage.tsx +114 -0
- package/src/peek/PeekCard.test.ts +35 -0
- package/src/peek/PeekCard.tsx +118 -0
- package/src/peek/PeekLayer.tsx +147 -0
- package/src/peek/model.test.ts +156 -0
- package/src/peek/model.ts +253 -0
- package/src/routes.test.ts +222 -0
- package/src/routes.ts +449 -0
- package/src/selection/DetailPanel.tsx +1407 -0
- package/src/selection/hash.test.ts +73 -0
- package/src/selection/hash.ts +58 -0
- package/src/selection/model.test.ts +199 -0
- package/src/selection/model.ts +473 -0
- package/src/selection/pages.test.ts +115 -0
- package/src/selection/pages.ts +268 -0
- package/src/selection/store.test.ts +62 -0
- package/src/selection/store.ts +46 -0
- package/src/selection/sync.tsx +99 -0
- package/src/table/ColumnsMenu.tsx +72 -0
- package/src/table/DataTable.tsx +780 -0
- package/src/table/Facets.tsx +54 -0
- package/src/table/GroupMenu.tsx +69 -0
- package/src/table/Toolbar.tsx +190 -0
- package/src/table/cells.tsx +117 -0
- package/src/table/compare.test.ts +117 -0
- package/src/table/compare.ts +196 -0
- package/src/table/export.test.ts +88 -0
- package/src/table/export.ts +66 -0
- package/src/table/facet-groups.test.ts +74 -0
- package/src/table/facet-groups.ts +56 -0
- package/src/table/grouping.test.ts +84 -0
- package/src/table/grouping.ts +82 -0
- package/src/table/infer.test.ts +57 -0
- package/src/table/infer.ts +50 -0
- package/src/table/persist.test.ts +76 -0
- package/src/table/persist.ts +112 -0
- package/src/table/sort-url.test.ts +75 -0
- package/src/table/sort-url.ts +52 -0
- package/src/table/types.ts +80 -0
- package/src/table/useTableState.ts +220 -0
- package/src/test-catalog.ts +7 -0
- package/src/testing/estate/data__catalog.json +2847 -0
- package/src/testing/estate/data__flows.json +1724 -0
- package/src/testing/estate/examples__auth__portolan__api.json +212 -0
- package/src/testing/estate/examples__auth__portolan__domain.json +1204 -0
- package/src/testing/estate/examples__auth__portolan__glossary.json +226 -0
- package/src/testing/estate/examples__auth__portolan__observed.json +757 -0
- package/src/testing/estate/examples__auth__portolan__stores.json +195 -0
- package/src/testing/estate/examples__shop__cart__portolan__api.json +234 -0
- package/src/testing/estate/examples__shop__cart__portolan__commands.json +86 -0
- package/src/testing/estate/examples__shop__cart__portolan__domain.json +966 -0
- package/src/testing/estate/examples__shop__cart__portolan__observed.json +498 -0
- package/src/testing/estate/examples__shop__cart__portolan__stores.json +208 -0
- package/src/testing/estate/examples__shop__oms__portolan__glossary.json +98 -0
- package/src/testing/estate/examples__shop__oms__portolan__proto.json +186 -0
- package/src/testing/estate.ts +49 -0
- package/src/trail/Trail.tsx +81 -0
- package/src/trail/model.test.ts +157 -0
- package/src/trail/model.ts +189 -0
- package/src/trail/record.tsx +32 -0
- package/src/trail/store.test.ts +66 -0
- package/src/trail/store.ts +102 -0
- package/tsconfig.json +35 -0
- package/vite.config.ts +171 -0
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
// One template for both structural building blocks. An entity and a value
|
|
2
|
+
// object differ in whether identity matters, not in what there is to say about
|
|
3
|
+
// them, so they share a page and are told apart by the header and the icon.
|
|
4
|
+
|
|
5
|
+
import { useCallback, useMemo, useState } from "react";
|
|
6
|
+
import { Link, useParams } from "react-router";
|
|
7
|
+
import { ChevronDown, ChevronRight } from "lucide-react";
|
|
8
|
+
import { catalog, index } from "../data";
|
|
9
|
+
import { blockFields, rootEntity } from "../catalog";
|
|
10
|
+
import type { Block, BlockKind, Field } from "../catalog";
|
|
11
|
+
import { openablePaths, resolveShape } from "../lib/shape";
|
|
12
|
+
import type { Scope } from "../lib/shape";
|
|
13
|
+
import { ShapeBody, TypeCell } from "../components/FieldTree";
|
|
14
|
+
import { backlinkCount } from "../lib/backlinks";
|
|
15
|
+
import { storedFields } from "../lib/data-model";
|
|
16
|
+
import { plural } from "../lib/format";
|
|
17
|
+
import { KIND_LABEL, KIND_PLURAL } from "../lib/kinds";
|
|
18
|
+
import { KindIcon } from "../components/kind";
|
|
19
|
+
import { Empty, PageHeader, SectionTitle } from "../components/PageHeader";
|
|
20
|
+
import { Ident } from "../components/Ident";
|
|
21
|
+
import { DataTable } from "../table/DataTable";
|
|
22
|
+
import type { ColumnSpec } from "../table/types";
|
|
23
|
+
import { Toc } from "../components/Toc";
|
|
24
|
+
import type { TocItem } from "../components/Toc";
|
|
25
|
+
import {
|
|
26
|
+
BLOCK_ANCHOR,
|
|
27
|
+
BLOCK_STORED_AS,
|
|
28
|
+
LINKS_HERE,
|
|
29
|
+
blockPath,
|
|
30
|
+
paths,
|
|
31
|
+
tablePath,
|
|
32
|
+
} from "../routes";
|
|
33
|
+
import { useBacklinks, WhatLinksHere } from "../components/WhatLinksHere";
|
|
34
|
+
import { InLanguage } from "../language/InLanguage";
|
|
35
|
+
import { NotFound } from "./NotFound";
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* The shape of a value object or an entity. Three columns and usually few
|
|
39
|
+
* rows, so the toolbar stays out of the way until there is enough here to
|
|
40
|
+
* need one. A field whose type is another block of the aggregate - a Line's
|
|
41
|
+
* Money - opens under its row, the way an event's schema does.
|
|
42
|
+
*/
|
|
43
|
+
function shapeColumns(
|
|
44
|
+
scope: Scope,
|
|
45
|
+
open: ReadonlySet<string>,
|
|
46
|
+
onToggle: (path: string) => void,
|
|
47
|
+
): ColumnSpec<Field>[] {
|
|
48
|
+
return [
|
|
49
|
+
{
|
|
50
|
+
id: "name",
|
|
51
|
+
header: "name",
|
|
52
|
+
type: "mono",
|
|
53
|
+
value: (field) => field.name,
|
|
54
|
+
primary: true,
|
|
55
|
+
// Plain, not an <Ident>: the name is a field of this block, not an id
|
|
56
|
+
// anything else refers to. The type beside it is the copyable one.
|
|
57
|
+
cell: (field) => {
|
|
58
|
+
const shape = resolveShape(catalog, field, scope);
|
|
59
|
+
const nameClass = field.deprecated ? "mono line-through" : "mono";
|
|
60
|
+
const title = field.deprecated ? "deprecated" : undefined;
|
|
61
|
+
return shape ? (
|
|
62
|
+
<button
|
|
63
|
+
type="button"
|
|
64
|
+
onClick={() => onToggle(field.name)}
|
|
65
|
+
className="mono flex items-center gap-1 rounded-control"
|
|
66
|
+
aria-expanded={open.has(field.name)}
|
|
67
|
+
title={`${open.has(field.name) ? "collapse" : "expand"} ${shape.name}`}
|
|
68
|
+
>
|
|
69
|
+
{open.has(field.name) ? (
|
|
70
|
+
<ChevronDown size={11} aria-hidden className="text-muted" />
|
|
71
|
+
) : (
|
|
72
|
+
<ChevronRight size={11} aria-hidden className="text-muted" />
|
|
73
|
+
)}
|
|
74
|
+
<span className={nameClass} title={title}>
|
|
75
|
+
{field.name}
|
|
76
|
+
</span>
|
|
77
|
+
</button>
|
|
78
|
+
) : (
|
|
79
|
+
<span className={`${nameClass} pl-4`} title={title}>
|
|
80
|
+
{field.name}
|
|
81
|
+
</span>
|
|
82
|
+
);
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: "type",
|
|
87
|
+
header: "type",
|
|
88
|
+
type: "mono",
|
|
89
|
+
value: (field) => field.ref ?? field.type,
|
|
90
|
+
cell: (field) => (
|
|
91
|
+
<TypeCell field={field} shape={resolveShape(catalog, field, scope)} />
|
|
92
|
+
),
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
id: "doc",
|
|
96
|
+
header: "doc",
|
|
97
|
+
type: "text",
|
|
98
|
+
value: (field) => field.doc,
|
|
99
|
+
cell: (field) => <span className="meta">{field.doc}</span>,
|
|
100
|
+
},
|
|
101
|
+
];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function ShapeTable({
|
|
105
|
+
id,
|
|
106
|
+
fields,
|
|
107
|
+
scope,
|
|
108
|
+
open,
|
|
109
|
+
onToggle,
|
|
110
|
+
}: {
|
|
111
|
+
id: string;
|
|
112
|
+
fields: Field[];
|
|
113
|
+
scope: Scope;
|
|
114
|
+
open: ReadonlySet<string>;
|
|
115
|
+
onToggle: (path: string) => void;
|
|
116
|
+
}) {
|
|
117
|
+
const columns = useMemo(
|
|
118
|
+
() => shapeColumns(scope, open, onToggle),
|
|
119
|
+
[scope, open, onToggle],
|
|
120
|
+
);
|
|
121
|
+
return (
|
|
122
|
+
<div className="max-w-table">
|
|
123
|
+
<DataTable
|
|
124
|
+
tableId={`block-shape.${id}`}
|
|
125
|
+
caption={`Shape of ${id}`}
|
|
126
|
+
columns={columns}
|
|
127
|
+
rows={fields}
|
|
128
|
+
rowId={(field) => field.name}
|
|
129
|
+
subRow={(field) => {
|
|
130
|
+
if (!open.has(field.name)) return null;
|
|
131
|
+
const shape = resolveShape(catalog, field, scope);
|
|
132
|
+
return shape ? (
|
|
133
|
+
<ShapeBody
|
|
134
|
+
shape={shape}
|
|
135
|
+
scope={scope}
|
|
136
|
+
path={field.name}
|
|
137
|
+
open={open}
|
|
138
|
+
onToggle={onToggle}
|
|
139
|
+
seen={new Set([shape.id])}
|
|
140
|
+
depth={1}
|
|
141
|
+
root
|
|
142
|
+
/>
|
|
143
|
+
) : null;
|
|
144
|
+
}}
|
|
145
|
+
/>
|
|
146
|
+
</div>
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export function BlockPage({ kind }: { kind: BlockKind }) {
|
|
151
|
+
const {
|
|
152
|
+
context: contextId,
|
|
153
|
+
service: serviceSlug,
|
|
154
|
+
aggregate: aggSlug,
|
|
155
|
+
block: blockSlug,
|
|
156
|
+
} = useParams();
|
|
157
|
+
|
|
158
|
+
const context = catalog.contexts.find((c) => c.id === contextId);
|
|
159
|
+
const service = context?.services.find((s) => s.slug === serviceSlug);
|
|
160
|
+
const aggregate = service?.aggregates.find((a) => a.slug === aggSlug);
|
|
161
|
+
const list: Block[] =
|
|
162
|
+
(kind === "vo" ? aggregate?.valueObjects : aggregate?.entities) ?? [];
|
|
163
|
+
const block = list.find((b) => b.slug === blockSlug);
|
|
164
|
+
|
|
165
|
+
// "Used in" was this page's own answer to a question every page has; it is
|
|
166
|
+
// the shared section now, and the block's shape is what it walks.
|
|
167
|
+
const links = useBacklinks({ kind, id: block?.id ?? "" });
|
|
168
|
+
|
|
169
|
+
// The rows opened under this block's fields, as dotted paths. The block
|
|
170
|
+
// itself is what its own fields must not open again: an Order whose Line
|
|
171
|
+
// names its Order stops at the name.
|
|
172
|
+
const [open, setOpen] = useState<Set<string>>(new Set());
|
|
173
|
+
const toggle = useCallback(
|
|
174
|
+
(path: string) =>
|
|
175
|
+
setOpen((prev) => {
|
|
176
|
+
const next = new Set(prev);
|
|
177
|
+
if (next.has(path)) next.delete(path);
|
|
178
|
+
else next.add(path);
|
|
179
|
+
return next;
|
|
180
|
+
}),
|
|
181
|
+
[],
|
|
182
|
+
);
|
|
183
|
+
const scope = useMemo<Scope>(
|
|
184
|
+
() => ({ aggregate: aggregate ?? null, service: service ?? null }),
|
|
185
|
+
[aggregate, service],
|
|
186
|
+
);
|
|
187
|
+
const fields = useMemo(
|
|
188
|
+
() => (block ? blockFields(catalog, block) : []),
|
|
189
|
+
[block],
|
|
190
|
+
);
|
|
191
|
+
const openable = useMemo(
|
|
192
|
+
() =>
|
|
193
|
+
block
|
|
194
|
+
? openablePaths(catalog, fields, scope, "", new Set([block.id]))
|
|
195
|
+
: [],
|
|
196
|
+
[block, fields, scope],
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
if (!context || !service || !aggregate || !block) {
|
|
200
|
+
return <NotFound kind={KIND_LABEL[kind]} id={blockSlug} />;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const stored = storedFields(catalog, index, block.id);
|
|
204
|
+
const toc: TocItem[] = [
|
|
205
|
+
{ id: BLOCK_ANCHOR.shape, label: "Shape" },
|
|
206
|
+
...(stored.length > 0
|
|
207
|
+
? [{ id: BLOCK_STORED_AS, label: "Stored as" }]
|
|
208
|
+
: []),
|
|
209
|
+
{ id: BLOCK_ANCHOR.siblings, label: "Siblings" },
|
|
210
|
+
{ id: LINKS_HERE, label: "What links here" },
|
|
211
|
+
];
|
|
212
|
+
|
|
213
|
+
const isRoot =
|
|
214
|
+
kind === "entity" && rootEntity(aggregate)?.slug === block.slug;
|
|
215
|
+
|
|
216
|
+
return (
|
|
217
|
+
<div className="h-full overflow-y-auto">
|
|
218
|
+
<PageHeader
|
|
219
|
+
kind={
|
|
220
|
+
<>
|
|
221
|
+
{KIND_LABEL[kind]} ·{" "}
|
|
222
|
+
<Link
|
|
223
|
+
to={paths.aggregate(context.id, service.slug, aggregate.slug)}
|
|
224
|
+
className="rounded-control hover:text-ink hover:underline"
|
|
225
|
+
>
|
|
226
|
+
{aggregate.id}
|
|
227
|
+
</Link>
|
|
228
|
+
</>
|
|
229
|
+
}
|
|
230
|
+
name={block.name}
|
|
231
|
+
id={block.id}
|
|
232
|
+
right={
|
|
233
|
+
<span className="flex items-center gap-2">
|
|
234
|
+
{isRoot ? (
|
|
235
|
+
<span className="chip status-verified" title="aggregate root">
|
|
236
|
+
<span aria-hidden className="dot" />
|
|
237
|
+
root
|
|
238
|
+
</span>
|
|
239
|
+
) : null}
|
|
240
|
+
{block.deprecated ? (
|
|
241
|
+
<span className="chip" title="marked @deprecated in the source">
|
|
242
|
+
deprecated
|
|
243
|
+
</span>
|
|
244
|
+
) : null}
|
|
245
|
+
<Link
|
|
246
|
+
to={paths.aggregate(context.id, service.slug, aggregate.slug)}
|
|
247
|
+
className="chip-lg border-line-strong text-muted"
|
|
248
|
+
>
|
|
249
|
+
<KindIcon kind="aggregate" />
|
|
250
|
+
{aggregate.name}
|
|
251
|
+
</Link>
|
|
252
|
+
</span>
|
|
253
|
+
}
|
|
254
|
+
>
|
|
255
|
+
<p className="mt-2 max-w-prose text-muted">{block.doc}</p>
|
|
256
|
+
<div className="mono mt-1.5 flex flex-wrap items-center gap-x-4 gap-y-1 text-muted">
|
|
257
|
+
{block.ref ? (
|
|
258
|
+
<span className="flex items-center gap-1.5">
|
|
259
|
+
shared type
|
|
260
|
+
<Ident value={block.ref} className="text-ink" />— the same shape
|
|
261
|
+
wherever it is named
|
|
262
|
+
</span>
|
|
263
|
+
) : (
|
|
264
|
+
<span>local to {aggregate.id} — no shared type</span>
|
|
265
|
+
)}
|
|
266
|
+
<span aria-hidden className="h-4 w-px bg-line-strong" />
|
|
267
|
+
<a
|
|
268
|
+
href={`#${BLOCK_ANCHOR.shape}`}
|
|
269
|
+
className="rounded-control hover:text-ink"
|
|
270
|
+
>
|
|
271
|
+
<span className="tnum">{fields.length}</span> fields
|
|
272
|
+
</a>
|
|
273
|
+
{block.ref ? (
|
|
274
|
+
<a
|
|
275
|
+
href={`#${LINKS_HERE}`}
|
|
276
|
+
className="rounded-control hover:text-ink"
|
|
277
|
+
>
|
|
278
|
+
<span className="tnum">{backlinkCount(links)}</span>{" "}
|
|
279
|
+
{plural(backlinkCount(links), "reference")}
|
|
280
|
+
</a>
|
|
281
|
+
) : null}
|
|
282
|
+
</div>
|
|
283
|
+
</PageHeader>
|
|
284
|
+
|
|
285
|
+
<div className="flex gap-section p-gutter">
|
|
286
|
+
<div className="min-w-0 flex-1">
|
|
287
|
+
<InLanguage id={block.id} />
|
|
288
|
+
|
|
289
|
+
<section id={BLOCK_ANCHOR.shape}>
|
|
290
|
+
<SectionTitle
|
|
291
|
+
anchor={BLOCK_ANCHOR.shape}
|
|
292
|
+
right={
|
|
293
|
+
<span className="flex items-center gap-x-3">
|
|
294
|
+
{openable.length > 0 ? (
|
|
295
|
+
<span className="mono flex items-center gap-x-2">
|
|
296
|
+
{openable.some((path) => !open.has(path)) ? (
|
|
297
|
+
<button
|
|
298
|
+
type="button"
|
|
299
|
+
onClick={() => setOpen(new Set(openable))}
|
|
300
|
+
className="rounded-control text-muted hover:text-ink"
|
|
301
|
+
title={`open every nested shape (${openable.length})`}
|
|
302
|
+
>
|
|
303
|
+
expand all
|
|
304
|
+
</button>
|
|
305
|
+
) : null}
|
|
306
|
+
{openable.some((path) => open.has(path)) ? (
|
|
307
|
+
<button
|
|
308
|
+
type="button"
|
|
309
|
+
onClick={() => setOpen(new Set())}
|
|
310
|
+
className="rounded-control text-muted hover:text-ink"
|
|
311
|
+
>
|
|
312
|
+
collapse all
|
|
313
|
+
</button>
|
|
314
|
+
) : null}
|
|
315
|
+
</span>
|
|
316
|
+
) : null}
|
|
317
|
+
<span>
|
|
318
|
+
{fields.length} {plural(fields.length, "field")}
|
|
319
|
+
</span>
|
|
320
|
+
</span>
|
|
321
|
+
}
|
|
322
|
+
>
|
|
323
|
+
Shape
|
|
324
|
+
</SectionTitle>
|
|
325
|
+
{fields.length === 0 ? (
|
|
326
|
+
<Empty>the catalog knows this block by name only</Empty>
|
|
327
|
+
) : (
|
|
328
|
+
<ShapeTable
|
|
329
|
+
id={block.id}
|
|
330
|
+
fields={fields}
|
|
331
|
+
scope={scope}
|
|
332
|
+
open={open}
|
|
333
|
+
onToggle={toggle}
|
|
334
|
+
/>
|
|
335
|
+
)}
|
|
336
|
+
</section>
|
|
337
|
+
|
|
338
|
+
{/* The columns that carry these fields. Only drawn when there are
|
|
339
|
+
any: a block nothing persists is not missing a section, it is a
|
|
340
|
+
shape that lives inside another row. */}
|
|
341
|
+
{stored.length > 0 ? (
|
|
342
|
+
<section className="mt-section max-w-table" id={BLOCK_STORED_AS}>
|
|
343
|
+
<SectionTitle
|
|
344
|
+
anchor={BLOCK_STORED_AS}
|
|
345
|
+
right={
|
|
346
|
+
<span>
|
|
347
|
+
db type beside domain type
|
|
348
|
+
</span>
|
|
349
|
+
}
|
|
350
|
+
>
|
|
351
|
+
Stored as
|
|
352
|
+
</SectionTitle>
|
|
353
|
+
<table className="w-full max-w-table">
|
|
354
|
+
<thead>
|
|
355
|
+
<tr className="label border-b border-line text-left">
|
|
356
|
+
<th className="py-1 pr-3 font-normal">column</th>
|
|
357
|
+
<th className="py-1 pr-3 font-normal">db type</th>
|
|
358
|
+
<th className="py-1 pr-3 font-normal">field</th>
|
|
359
|
+
<th className="py-1 font-normal">domain type</th>
|
|
360
|
+
</tr>
|
|
361
|
+
</thead>
|
|
362
|
+
<tbody>
|
|
363
|
+
{stored.map(({ owner, path, field, mismatch }) => {
|
|
364
|
+
const to = tablePath(owner.table.id);
|
|
365
|
+
const id = `${owner.table.id}.${owner.column.name}`;
|
|
366
|
+
return (
|
|
367
|
+
<tr key={id} className="border-b border-line align-top">
|
|
368
|
+
<td className="mono py-1.5 pr-3 whitespace-nowrap">
|
|
369
|
+
{to ? (
|
|
370
|
+
<Link
|
|
371
|
+
to={to}
|
|
372
|
+
className="rounded-control hover:underline"
|
|
373
|
+
title={id}
|
|
374
|
+
>
|
|
375
|
+
{owner.table.name}.{owner.column.name}
|
|
376
|
+
</Link>
|
|
377
|
+
) : (
|
|
378
|
+
<span title={id}>
|
|
379
|
+
{owner.table.name}.{owner.column.name}
|
|
380
|
+
</span>
|
|
381
|
+
)}
|
|
382
|
+
</td>
|
|
383
|
+
<td className="mono py-1.5 pr-3 whitespace-nowrap text-muted">
|
|
384
|
+
{owner.column.type}
|
|
385
|
+
{owner.column.nullable ? "?" : ""}
|
|
386
|
+
</td>
|
|
387
|
+
<td className="mono py-1.5 pr-3 whitespace-nowrap">
|
|
388
|
+
{path}
|
|
389
|
+
</td>
|
|
390
|
+
<td className="mono py-1.5 whitespace-nowrap">
|
|
391
|
+
{field ? (
|
|
392
|
+
<span className="flex items-center gap-1.5">
|
|
393
|
+
{/* An amber dot, not a red one: neither side is
|
|
394
|
+
wrong on its own, and which one moved is the
|
|
395
|
+
reader's call. */}
|
|
396
|
+
{mismatch ? (
|
|
397
|
+
<span
|
|
398
|
+
aria-hidden
|
|
399
|
+
className="size-1.5 shrink-0 rounded-full"
|
|
400
|
+
style={{
|
|
401
|
+
background: "var(--status-declared)",
|
|
402
|
+
}}
|
|
403
|
+
title={`${owner.column.type} in the column, ${field.type} in the model`}
|
|
404
|
+
/>
|
|
405
|
+
) : null}
|
|
406
|
+
<span
|
|
407
|
+
className={
|
|
408
|
+
mismatch ? "text-declared" : "text-muted"
|
|
409
|
+
}
|
|
410
|
+
>
|
|
411
|
+
{field.type}
|
|
412
|
+
</span>
|
|
413
|
+
</span>
|
|
414
|
+
) : (
|
|
415
|
+
<span
|
|
416
|
+
className="text-unresolved"
|
|
417
|
+
title={`${block.name} declares no field "${path}"`}
|
|
418
|
+
>
|
|
419
|
+
no such field
|
|
420
|
+
</span>
|
|
421
|
+
)}
|
|
422
|
+
</td>
|
|
423
|
+
</tr>
|
|
424
|
+
);
|
|
425
|
+
})}
|
|
426
|
+
</tbody>
|
|
427
|
+
</table>
|
|
428
|
+
</section>
|
|
429
|
+
) : null}
|
|
430
|
+
|
|
431
|
+
<div className="mt-section max-w-prose" id={BLOCK_ANCHOR.siblings}>
|
|
432
|
+
<SectionTitle anchor={BLOCK_ANCHOR.siblings}>Siblings</SectionTitle>
|
|
433
|
+
<div className="flex flex-wrap gap-1.5">
|
|
434
|
+
{list
|
|
435
|
+
.filter((b) => b.slug !== block.slug)
|
|
436
|
+
.map((sibling) => (
|
|
437
|
+
<Link
|
|
438
|
+
key={sibling.id}
|
|
439
|
+
to={
|
|
440
|
+
(blockPath(sibling.id) as string) ??
|
|
441
|
+
paths.aggregate(context.id, service.slug, aggregate.slug)
|
|
442
|
+
}
|
|
443
|
+
className="chip-lg border-line-strong text-muted"
|
|
444
|
+
>
|
|
445
|
+
<KindIcon kind={kind} />
|
|
446
|
+
{sibling.name}
|
|
447
|
+
</Link>
|
|
448
|
+
))}
|
|
449
|
+
{list.length <= 1 ? (
|
|
450
|
+
<Empty>
|
|
451
|
+
the only {KIND_LABEL[kind]} in {aggregate.name}
|
|
452
|
+
</Empty>
|
|
453
|
+
) : null}
|
|
454
|
+
</div>
|
|
455
|
+
<div className="mono mt-2 text-muted">
|
|
456
|
+
{KIND_PLURAL[kind]} of {aggregate.id}
|
|
457
|
+
</div>
|
|
458
|
+
</div>
|
|
459
|
+
|
|
460
|
+
{/* Two blocks are the same type only if they name the same def, so
|
|
461
|
+
this walks the shared type rather than the name: a Money here and
|
|
462
|
+
a Money there are one thing or they are two, and the catalog has
|
|
463
|
+
already said which. */}
|
|
464
|
+
<WhatLinksHere
|
|
465
|
+
target={{ kind, id: block.id }}
|
|
466
|
+
empty={
|
|
467
|
+
block.ref
|
|
468
|
+
? `nothing else names ${block.ref}`
|
|
469
|
+
: "an inline shape is used only here — give it a shared type to track it across the catalog"
|
|
470
|
+
}
|
|
471
|
+
/>
|
|
472
|
+
</div>
|
|
473
|
+
|
|
474
|
+
<Toc items={toc} label={`Sections of this ${KIND_LABEL[kind]}`} />
|
|
475
|
+
</div>
|
|
476
|
+
</div>
|
|
477
|
+
);
|
|
478
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// What the reader sees when data/catalog.json cannot be trusted.
|
|
2
|
+
//
|
|
3
|
+
// This page exists because the alternative is worse in a specific way: a
|
|
4
|
+
// validator that throws at import time takes the bundle down, and the reader
|
|
5
|
+
// gets a white rectangle while the only useful sentence in the building sits in
|
|
6
|
+
// a console nobody has open. So the message is printed verbatim - it already
|
|
7
|
+
// names the offending flow, step or field - along with where to look and what
|
|
8
|
+
// to do about it.
|
|
9
|
+
|
|
10
|
+
import type { CatalogError } from "../catalog";
|
|
11
|
+
import { Ident } from "../components/Ident";
|
|
12
|
+
import { CompassRose } from "../components/logo";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* What to do about it, matched on the message the validator wrote. The
|
|
16
|
+
* fallback is the honest one: something upstream produced a catalog that does
|
|
17
|
+
* not describe a consistent estate, and the fix is in the generator, not here.
|
|
18
|
+
*/
|
|
19
|
+
const HINTS: { test: RegExp; hint: string }[] = [
|
|
20
|
+
{
|
|
21
|
+
test: /references unknown def/,
|
|
22
|
+
hint: "The named shape is not in `catalog.defs`. Either the generator dropped the definition, or the ref is a typo — check the proto or the source file the field was read from.",
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
test: /is not a declared participant/,
|
|
26
|
+
hint: "A step names a lane the flow never declared. Add the service to the flow's `participants`, or point the step at one that is already there.",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
test: /resolves to neither an Event nor an RpcCall/,
|
|
30
|
+
hint: "Either the ref is stale — the event was renamed or removed — or the step really does point at something outside the catalog, in which case its status belongs as `unresolved`.",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
test: /must have id/,
|
|
34
|
+
hint: "Ids are composed, not free text: a service is `<context>.<slug>`, a block is `<aggregate>.<slug>`. The generator built one of them from the wrong parts.",
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
test: /is not unique/,
|
|
38
|
+
hint: "Two things claim the same slug or id. Slugs are what the URLs are built from, so one of them would be unreachable.",
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
test: /alt|loop|branch|terminal/,
|
|
42
|
+
hint: "A frame that does not state a choice is drawn as an ordinary sequence, which is the misreading the validator exists to stop. Give the frame its title, its second branch, or move the steps that follow it.",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
test: /names root|names no root/,
|
|
46
|
+
hint: "An aggregate is a root entity plus what it owns. The root has to be one of the entities the aggregate lists.",
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
test: /adr/,
|
|
50
|
+
hint: "A decision record points at something that is not in the catalog, or records only half of a supersession. Both would draw a link to nowhere.",
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
function hintFor(message: string): string {
|
|
55
|
+
return (
|
|
56
|
+
HINTS.find((h) => h.test.test(message))?.hint ??
|
|
57
|
+
"The catalog does not describe a consistent estate. Fix the source the generator read, then re-run it — nothing here can be drawn until the shape holds."
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function CatalogFailure({ error }: { error: CatalogError }) {
|
|
62
|
+
return (
|
|
63
|
+
<div className="pane h-full overflow-y-auto bg-canvas">
|
|
64
|
+
<div className="mx-auto max-w-prose px-gutter py-16">
|
|
65
|
+
<div className="flex items-center gap-2 text-muted">
|
|
66
|
+
<CompassRose size={16} />
|
|
67
|
+
<span className="label">portolan</span>
|
|
68
|
+
</div>
|
|
69
|
+
|
|
70
|
+
<h1 className="mt-6 text-xl font-semibold">
|
|
71
|
+
The catalog did not survive validation.
|
|
72
|
+
</h1>
|
|
73
|
+
<p className="mt-3 text-muted">
|
|
74
|
+
Nothing is drawn from a catalog that has already been shown to be
|
|
75
|
+
wrong — a chart with one bad sounding on it is worse than no chart.
|
|
76
|
+
Here is the sounding.
|
|
77
|
+
</p>
|
|
78
|
+
|
|
79
|
+
<div className="mt-section overflow-hidden rounded-card border shadow-xs border-unresolved">
|
|
80
|
+
<div className="label border-b px-4 py-2 border-line bg-surface">
|
|
81
|
+
validator
|
|
82
|
+
</div>
|
|
83
|
+
{/* Verbatim, wrapped, selectable: this string is the thing to paste
|
|
84
|
+
into the generator's issue, so it is not summarised or truncated. */}
|
|
85
|
+
<pre className="mono overflow-x-auto px-4 py-3 whitespace-pre-wrap text-unresolved">
|
|
86
|
+
{error.message}
|
|
87
|
+
</pre>
|
|
88
|
+
{error.path ? (
|
|
89
|
+
<div className="flex flex-wrap items-baseline gap-2 border-t px-4 py-3 border-line">
|
|
90
|
+
<span className="label">where</span>
|
|
91
|
+
<Ident value={error.path} className="text-ink" />
|
|
92
|
+
</div>
|
|
93
|
+
) : null}
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
<div className="mt-grid rounded-card border p-card border-line">
|
|
97
|
+
<div className="label mb-2">how to fix</div>
|
|
98
|
+
<p>{hintFor(error.message)}</p>
|
|
99
|
+
<p className="mt-3 text-muted">Then regenerate and reload:</p>
|
|
100
|
+
<pre className="mono mt-2 overflow-x-auto rounded-control border px-3 py-2 border-line bg-surface">
|
|
101
|
+
npm run likec4:gen
|
|
102
|
+
</pre>
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
<p className="mono mt-section text-muted">
|
|
106
|
+
data/catalog.json — validated by src/catalog.ts
|
|
107
|
+
</p>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
);
|
|
111
|
+
}
|