@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
package/src/routes.ts
ADDED
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
// Every in-app URL is built here. Routes use slugs, never dotted ids.
|
|
2
|
+
|
|
3
|
+
import type { Catalog } from "./catalog";
|
|
4
|
+
import { enumsOf } from "./catalog";
|
|
5
|
+
import type { Backlink } from "./lib/backlinks";
|
|
6
|
+
import { index } from "./data";
|
|
7
|
+
import { selectionHash } from "./selection/hash";
|
|
8
|
+
import { flowStepId } from "./selection/model";
|
|
9
|
+
|
|
10
|
+
export const paths = {
|
|
11
|
+
overview: () => "/",
|
|
12
|
+
flows: () => "/flows",
|
|
13
|
+
flow: (slug: string) => `/flows/${slug}`,
|
|
14
|
+
/** A flow page with one of its steps already selected. */
|
|
15
|
+
flowStep: (slug: string, stepId: string) =>
|
|
16
|
+
`/flows/${slug}${selectionHash({
|
|
17
|
+
kind: "flow-step",
|
|
18
|
+
id: flowStepId(slug, stepId),
|
|
19
|
+
})}`,
|
|
20
|
+
adrs: () => "/adrs",
|
|
21
|
+
/**
|
|
22
|
+
* The estate's vocabulary. One page rather than one per context: the words
|
|
23
|
+
* a context means by itself are only half of what a reader needs, and the
|
|
24
|
+
* other half - the same word meant twice - has no context to live under.
|
|
25
|
+
*/
|
|
26
|
+
language: () => "/language",
|
|
27
|
+
/** The vocabulary of one context, which is the page filtered to it. */
|
|
28
|
+
contextLanguage: (contextId: string) =>
|
|
29
|
+
`/language?context=${encodeURIComponent(contextId)}`,
|
|
30
|
+
/**
|
|
31
|
+
* One word, which is the page showing only it.
|
|
32
|
+
*
|
|
33
|
+
* A parameter and not an anchor. An anchor would have to be scrolled to, and
|
|
34
|
+
* the scroll runs two frames after the route commits - before this page's
|
|
35
|
+
* card grid has settled on how many columns it has, so the position it
|
|
36
|
+
* scrolls to is the position the card had in a layout that no longer exists.
|
|
37
|
+
* Shown instead of scrolled to, the card is simply the first thing on the
|
|
38
|
+
* page, and the reader is told what was narrowed and offered it back.
|
|
39
|
+
*/
|
|
40
|
+
term: (termId: string) => `/language?term=${encodeURIComponent(termId)}`,
|
|
41
|
+
problems: () => "/problems",
|
|
42
|
+
changes: () => "/changes",
|
|
43
|
+
settings: () => "/settings",
|
|
44
|
+
external: (slug: string) => `/externals/${slug}`,
|
|
45
|
+
registry: () => "/registry",
|
|
46
|
+
/**
|
|
47
|
+
* A schema module sits at the estate level, not under a service.
|
|
48
|
+
*
|
|
49
|
+
* A store hangs off its service because `Store.owner` is one service the
|
|
50
|
+
* validator enforces. A module has no such owner: it is published by one
|
|
51
|
+
* service, vendored by four, and depended on by other modules. Hanging it off
|
|
52
|
+
* a service would put one entity at four URLs - and `allCatalogPaths` would
|
|
53
|
+
* emit all four, so the route test would bless the duplication rather than
|
|
54
|
+
* catch it.
|
|
55
|
+
*
|
|
56
|
+
* One slug segment rather than `/registry/:owner/:name` because a module that
|
|
57
|
+
* was never published has no owner, and because every other entity here is
|
|
58
|
+
* addressed by a slug.
|
|
59
|
+
*/
|
|
60
|
+
module: (slug: string) => `/registry/${slug}`,
|
|
61
|
+
adr: (slug: string) => `/adrs/${slug}`,
|
|
62
|
+
graph: () => "/graph",
|
|
63
|
+
map: () => "/map",
|
|
64
|
+
/** The map, with one relationship already open. */
|
|
65
|
+
relation: (relationId: string) => `/map#rel-${relationId}`,
|
|
66
|
+
context: (contextId: string) => `/c/${contextId}`,
|
|
67
|
+
service: (contextId: string, serviceSlug: string) =>
|
|
68
|
+
`/c/${contextId}/${serviceSlug}`,
|
|
69
|
+
aggregate: (contextId: string, serviceSlug: string, aggregateSlug: string) =>
|
|
70
|
+
`/c/${contextId}/${serviceSlug}/${aggregateSlug}`,
|
|
71
|
+
event: (
|
|
72
|
+
contextId: string,
|
|
73
|
+
serviceSlug: string,
|
|
74
|
+
aggregateSlug: string,
|
|
75
|
+
eventSlug: string,
|
|
76
|
+
) => `/c/${contextId}/${serviceSlug}/${aggregateSlug}/${eventSlug}`,
|
|
77
|
+
// Value objects and entities sit one segment deeper than events, behind a
|
|
78
|
+
// literal, so an event slug can never be mistaken for a block slug.
|
|
79
|
+
valueObject: (
|
|
80
|
+
contextId: string,
|
|
81
|
+
serviceSlug: string,
|
|
82
|
+
aggregateSlug: string,
|
|
83
|
+
voSlug: string,
|
|
84
|
+
) => `/c/${contextId}/${serviceSlug}/${aggregateSlug}/vo/${voSlug}`,
|
|
85
|
+
entity: (
|
|
86
|
+
contextId: string,
|
|
87
|
+
serviceSlug: string,
|
|
88
|
+
aggregateSlug: string,
|
|
89
|
+
entitySlug: string,
|
|
90
|
+
) => `/c/${contextId}/${serviceSlug}/${aggregateSlug}/entity/${entitySlug}`,
|
|
91
|
+
/** An enum sits behind its own literal, beside the two block kinds. */
|
|
92
|
+
enum: (
|
|
93
|
+
contextId: string,
|
|
94
|
+
serviceSlug: string,
|
|
95
|
+
aggregateSlug: string,
|
|
96
|
+
enumSlug: string,
|
|
97
|
+
) => `/c/${contextId}/${serviceSlug}/${aggregateSlug}/enum/${enumSlug}`,
|
|
98
|
+
// A store hangs off its service, not off an aggregate: it is infrastructure
|
|
99
|
+
// the service owns, and several aggregates may share one. "data" is a
|
|
100
|
+
// literal for the same reason "vo" and "entity" are - a store slug can never
|
|
101
|
+
// be mistaken for an aggregate slug.
|
|
102
|
+
store: (contextId: string, serviceSlug: string, storeSlug: string) =>
|
|
103
|
+
`/c/${contextId}/${serviceSlug}/data/${storeSlug}`,
|
|
104
|
+
} as const;
|
|
105
|
+
|
|
106
|
+
/** The section anchors on an aggregate page, as used by the building-blocks strip. */
|
|
107
|
+
export const AGGREGATE_ANCHOR = {
|
|
108
|
+
entities: "bb-entities",
|
|
109
|
+
valueObjects: "bb-value-objects",
|
|
110
|
+
enums: "bb-enums",
|
|
111
|
+
lifecycle: "bb-lifecycle",
|
|
112
|
+
events: "bb-events",
|
|
113
|
+
commands: "bb-commands",
|
|
114
|
+
queries: "bb-queries",
|
|
115
|
+
} as const;
|
|
116
|
+
|
|
117
|
+
/** The section anchors on an event page, in the order the TOC lists them. */
|
|
118
|
+
export const EVENT_ANCHOR = {
|
|
119
|
+
schema: "ev-schema",
|
|
120
|
+
versions: "ev-versions",
|
|
121
|
+
consumers: "ev-consumers",
|
|
122
|
+
then: "ev-then",
|
|
123
|
+
} as const;
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* The section anchors on a module page.
|
|
127
|
+
*
|
|
128
|
+
* Packages, interfaces and messages are anchors rather than routes: they are
|
|
129
|
+
* already addressable as part of the catalog - an interface has a service page,
|
|
130
|
+
* a message a shared type - and giving them a second URL here would mean the
|
|
131
|
+
* same thing had two addresses.
|
|
132
|
+
*/
|
|
133
|
+
export const MODULE_ANCHOR = {
|
|
134
|
+
packages: "mod-packages",
|
|
135
|
+
interfaces: "mod-interfaces",
|
|
136
|
+
types: "mod-types",
|
|
137
|
+
deps: "mod-deps",
|
|
138
|
+
used: "mod-used",
|
|
139
|
+
} as const;
|
|
140
|
+
|
|
141
|
+
export function packageAnchor(name: string): string {
|
|
142
|
+
return `pkg-${name}`;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** The section anchors on a value object or entity page. */
|
|
146
|
+
export const BLOCK_ANCHOR = {
|
|
147
|
+
shape: "bl-shape",
|
|
148
|
+
siblings: "bl-siblings",
|
|
149
|
+
} as const;
|
|
150
|
+
|
|
151
|
+
/** The section anchors on an enum page. */
|
|
152
|
+
export const ENUM_ANCHOR = {
|
|
153
|
+
values: "en-values",
|
|
154
|
+
lifecycle: "en-lifecycle",
|
|
155
|
+
siblings: "en-siblings",
|
|
156
|
+
} as const;
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* The incoming-links section, and the one anchor that is the same on every
|
|
160
|
+
* entity page. A reader who has learned where "what links here" lives on one
|
|
161
|
+
* page has learned it for all of them, and `#links-here` is the same promise
|
|
162
|
+
* in a URL.
|
|
163
|
+
*/
|
|
164
|
+
export const LINKS_HERE = "links-here";
|
|
165
|
+
|
|
166
|
+
/** The section anchors on a context page. */
|
|
167
|
+
export const CONTEXT_ANCHOR = {
|
|
168
|
+
services: "ctx-services",
|
|
169
|
+
aggregates: "ctx-aggregates",
|
|
170
|
+
events: "ctx-events",
|
|
171
|
+
} as const;
|
|
172
|
+
|
|
173
|
+
/** The section anchors on an aggregate page, beyond the building-blocks strip. */
|
|
174
|
+
export const AGGREGATE_SECTION = {
|
|
175
|
+
persistence: "agg-persistence",
|
|
176
|
+
} as const;
|
|
177
|
+
|
|
178
|
+
/** The section anchor for the columns that carry a block's fields. */
|
|
179
|
+
export const BLOCK_STORED_AS = "bl-stored-as";
|
|
180
|
+
|
|
181
|
+
/** The section anchors on a service page's overview tab. */
|
|
182
|
+
export const SERVICE_ANCHOR = {
|
|
183
|
+
aggregates: "svc-aggregates",
|
|
184
|
+
events: "svc-events",
|
|
185
|
+
commands: "svc-commands",
|
|
186
|
+
} as const;
|
|
187
|
+
|
|
188
|
+
/** The section anchors on the context map. */
|
|
189
|
+
export const MAP_ANCHOR = {
|
|
190
|
+
model: "map-model",
|
|
191
|
+
relations: "map-relations",
|
|
192
|
+
} as const;
|
|
193
|
+
|
|
194
|
+
/** The id of one relationship's row, which is also its deep link. */
|
|
195
|
+
export function relationAnchor(relationId: string): string {
|
|
196
|
+
return `rel-${relationId}`;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** The section anchors on the overview, so "g d" has somewhere to land. */
|
|
200
|
+
export const OVERVIEW_ANCHOR = {
|
|
201
|
+
landscape: "landscape",
|
|
202
|
+
contexts: "contexts",
|
|
203
|
+
flows: "flows-by-reach",
|
|
204
|
+
} as const;
|
|
205
|
+
|
|
206
|
+
/** Path to the page that owns an event, or null if the event is not in the catalog. */
|
|
207
|
+
export function eventPath(eventId: string): string | null {
|
|
208
|
+
const owner = index.eventOwner.get(eventId);
|
|
209
|
+
const event = index.eventById.get(eventId);
|
|
210
|
+
if (!owner || !event) return null;
|
|
211
|
+
const context = index.serviceContext.get(owner.service.id);
|
|
212
|
+
if (!context) return null;
|
|
213
|
+
return paths.event(
|
|
214
|
+
context.id,
|
|
215
|
+
owner.service.slug,
|
|
216
|
+
owner.aggregate.slug,
|
|
217
|
+
event.slug,
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/** Path to an enum page, or null if the id is not in the catalog. */
|
|
222
|
+
export function enumPath(enumId: string): string | null {
|
|
223
|
+
const owner = index.enumById.get(enumId);
|
|
224
|
+
if (!owner) return null;
|
|
225
|
+
return paths.enum(
|
|
226
|
+
owner.context.id,
|
|
227
|
+
owner.service.slug,
|
|
228
|
+
owner.aggregate.slug,
|
|
229
|
+
owner.enum.slug,
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/** Path to a value object or entity page, or null if the id is not in the catalog. */
|
|
234
|
+
export function blockPath(blockId: string): string | null {
|
|
235
|
+
const owner = index.blockById.get(blockId);
|
|
236
|
+
if (!owner) return null;
|
|
237
|
+
const build = owner.kind === "vo" ? paths.valueObject : paths.entity;
|
|
238
|
+
return build(
|
|
239
|
+
owner.context.id,
|
|
240
|
+
owner.service.slug,
|
|
241
|
+
owner.aggregate.slug,
|
|
242
|
+
owner.block.slug,
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/** Path to a decision record, or null if the id is not a catalog ADR. */
|
|
247
|
+
export function adrPath(adrId: string): string | null {
|
|
248
|
+
const adr = index.adrById.get(adrId);
|
|
249
|
+
return adr ? paths.adr(adr.slug) : null;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/** Path to an aggregate page, or null if the id is not a catalog aggregate. */
|
|
253
|
+
export function aggregatePath(aggregateId: string): string | null {
|
|
254
|
+
const aggregate = index.aggregateById.get(aggregateId);
|
|
255
|
+
const service = index.aggregateOwner.get(aggregateId);
|
|
256
|
+
const context = service ? index.serviceContext.get(service.id) : undefined;
|
|
257
|
+
if (!aggregate || !service || !context) return null;
|
|
258
|
+
return paths.aggregate(context.id, service.slug, aggregate.slug);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/** Path to a store's own ER page, or null if the id is not a catalog store. */
|
|
262
|
+
export function storePath(storeId: string): string | null {
|
|
263
|
+
const store = index.storeById.get(storeId);
|
|
264
|
+
const service = store ? index.serviceById.get(store.owner) : undefined;
|
|
265
|
+
const context = store ? index.serviceContext.get(store.owner) : undefined;
|
|
266
|
+
if (!store || !service || !context) return null;
|
|
267
|
+
return paths.store(context.id, service.slug, store.slug);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Path to a table: its store's page, with the table already selected. A table
|
|
272
|
+
* has no page of its own - it is a node on a canvas, and the canvas is what
|
|
273
|
+
* makes it readable - so the deep link opens the canvas around it.
|
|
274
|
+
*/
|
|
275
|
+
export function tablePath(tableId: string): string | null {
|
|
276
|
+
const held = index.tableById.get(tableId);
|
|
277
|
+
if (!held) return null;
|
|
278
|
+
const to = storePath(held.store.id);
|
|
279
|
+
return to ? `${to}${selectionHash({ kind: "table", id: tableId })}` : null;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Path to a view: its store's page, with the view already selected. Same as a
|
|
284
|
+
* table, and for the same reason — a view read away from the tables it reads is
|
|
285
|
+
* a list of column names with no answer to "computed from what".
|
|
286
|
+
*/
|
|
287
|
+
export function viewPath(viewId: string): string | null {
|
|
288
|
+
const held = index.viewById.get(viewId);
|
|
289
|
+
if (!held) return null;
|
|
290
|
+
const to = storePath(held.store.id);
|
|
291
|
+
return to ? `${to}${selectionHash({ kind: "view", id: viewId })}` : null;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/** Path to a module page, or null if the id names no module in the catalog. */
|
|
295
|
+
export function modulePath(moduleId: string): string | null {
|
|
296
|
+
const module = index.moduleById.get(moduleId);
|
|
297
|
+
|
|
298
|
+
// Null rather than a guessed path: a module's `deps` may name one the estate
|
|
299
|
+
// never vendored, and that renders as text rather than as a broken link.
|
|
300
|
+
return module ? paths.module(module.slug) : null;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/** Path to a service page, or null if the id is not a catalog service. */
|
|
304
|
+
export function servicePath(serviceId: string): string | null {
|
|
305
|
+
const service = index.serviceById.get(serviceId);
|
|
306
|
+
const context = index.serviceContext.get(serviceId);
|
|
307
|
+
if (!service || !context) return null;
|
|
308
|
+
return paths.service(context.id, service.slug);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Where a backlink leads. A flow that points here through one of its steps
|
|
313
|
+
* leads to THAT step, not to the top of the flow: the reader clicked the
|
|
314
|
+
* reason, so the reason is what has to be on screen when they land.
|
|
315
|
+
*/
|
|
316
|
+
export function backlinkPath(link: Backlink): string | null {
|
|
317
|
+
switch (link.kind) {
|
|
318
|
+
case "context":
|
|
319
|
+
return index.catalog.contexts.some((c) => c.id === link.id)
|
|
320
|
+
? paths.context(link.id)
|
|
321
|
+
: null;
|
|
322
|
+
case "service":
|
|
323
|
+
return servicePath(link.id);
|
|
324
|
+
case "aggregate":
|
|
325
|
+
return aggregatePath(link.id);
|
|
326
|
+
case "event":
|
|
327
|
+
return eventPath(link.id);
|
|
328
|
+
case "vo":
|
|
329
|
+
case "entity":
|
|
330
|
+
return blockPath(link.id);
|
|
331
|
+
case "enum":
|
|
332
|
+
return enumPath(link.id);
|
|
333
|
+
case "store":
|
|
334
|
+
return storePath(link.id);
|
|
335
|
+
case "table":
|
|
336
|
+
return tablePath(link.id);
|
|
337
|
+
case "view":
|
|
338
|
+
return viewPath(link.id);
|
|
339
|
+
case "flow":
|
|
340
|
+
return index.flowBySlug.has(link.id)
|
|
341
|
+
? link.at
|
|
342
|
+
? paths.flowStep(link.id, link.at)
|
|
343
|
+
: paths.flow(link.id)
|
|
344
|
+
: null;
|
|
345
|
+
case "adr":
|
|
346
|
+
return adrPath(link.id);
|
|
347
|
+
case "term":
|
|
348
|
+
return index.termById.has(link.id) ? paths.term(link.id) : null;
|
|
349
|
+
// A shared type is only ever seen through the blocks that name it, and a
|
|
350
|
+
// command or a query is a line on its aggregate's page.
|
|
351
|
+
default:
|
|
352
|
+
return null;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/** Route patterns declared in App.tsx, in the same order. */
|
|
357
|
+
const ROUTES: RegExp[] = [
|
|
358
|
+
/^\/$/,
|
|
359
|
+
/^\/flows$/,
|
|
360
|
+
/^\/flows\/[^/]+$/,
|
|
361
|
+
/^\/adrs$/,
|
|
362
|
+
/^\/language$/,
|
|
363
|
+
/^\/problems$/,
|
|
364
|
+
/^\/changes$/,
|
|
365
|
+
/^\/settings$/,
|
|
366
|
+
/^\/externals\/[^/]+$/,
|
|
367
|
+
/^\/map$/,
|
|
368
|
+
/^\/adrs\/[^/]+$/,
|
|
369
|
+
/^\/c\/[^/]+$/,
|
|
370
|
+
/^\/c\/[^/]+\/[^/]+$/,
|
|
371
|
+
/^\/c\/[^/]+\/[^/]+\/[^/]+$/,
|
|
372
|
+
/^\/c\/[^/]+\/[^/]+\/[^/]+\/[^/]+$/,
|
|
373
|
+
/^\/c\/[^/]+\/[^/]+\/[^/]+\/vo\/[^/]+$/,
|
|
374
|
+
/^\/c\/[^/]+\/[^/]+\/[^/]+\/entity\/[^/]+$/,
|
|
375
|
+
/^\/c\/[^/]+\/[^/]+\/[^/]+\/enum\/[^/]+$/,
|
|
376
|
+
/^\/c\/[^/]+\/[^/]+\/data\/[^/]+$/,
|
|
377
|
+
/^\/graph$/,
|
|
378
|
+
/^\/registry$/,
|
|
379
|
+
/^\/registry\/[^/]+$/,
|
|
380
|
+
];
|
|
381
|
+
|
|
382
|
+
/** True when a path is matched by a declared route (query and hash ignored). */
|
|
383
|
+
export function isRoutable(path: string): boolean {
|
|
384
|
+
const clean = (path.split("#")[0] ?? "").split("?")[0] ?? "";
|
|
385
|
+
return ROUTES.some((r) => r.test(clean));
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/** Every URL the Phase 1 UI can emit from catalog data. */
|
|
389
|
+
export function allCatalogPaths(catalog: Catalog): string[] {
|
|
390
|
+
const out: string[] = [
|
|
391
|
+
paths.overview(),
|
|
392
|
+
paths.flows(),
|
|
393
|
+
paths.graph(),
|
|
394
|
+
paths.map(),
|
|
395
|
+
paths.adrs(),
|
|
396
|
+
paths.language(),
|
|
397
|
+
paths.problems(),
|
|
398
|
+
paths.changes(),
|
|
399
|
+
paths.settings(),
|
|
400
|
+
paths.registry(),
|
|
401
|
+
];
|
|
402
|
+
for (const module of catalog.modules ?? []) {
|
|
403
|
+
out.push(paths.module(module.slug));
|
|
404
|
+
}
|
|
405
|
+
for (const external of catalog.externals ?? []) {
|
|
406
|
+
out.push(paths.external(external.slug));
|
|
407
|
+
}
|
|
408
|
+
for (const flow of catalog.flows) out.push(paths.flow(flow.slug));
|
|
409
|
+
for (const adr of catalog.adrs) out.push(paths.adr(adr.slug));
|
|
410
|
+
for (const context of catalog.contexts) {
|
|
411
|
+
out.push(paths.context(context.id));
|
|
412
|
+
for (const service of context.services) {
|
|
413
|
+
out.push(paths.service(context.id, service.slug));
|
|
414
|
+
for (const store of catalog.stores ?? []) {
|
|
415
|
+
if (store.owner !== service.id) continue;
|
|
416
|
+
out.push(paths.store(context.id, service.slug, store.slug));
|
|
417
|
+
}
|
|
418
|
+
for (const aggregate of service.aggregates) {
|
|
419
|
+
out.push(paths.aggregate(context.id, service.slug, aggregate.slug));
|
|
420
|
+
for (const event of aggregate.events) {
|
|
421
|
+
out.push(
|
|
422
|
+
paths.event(context.id, service.slug, aggregate.slug, event.slug),
|
|
423
|
+
);
|
|
424
|
+
}
|
|
425
|
+
for (const vo of aggregate.valueObjects) {
|
|
426
|
+
out.push(
|
|
427
|
+
paths.valueObject(
|
|
428
|
+
context.id,
|
|
429
|
+
service.slug,
|
|
430
|
+
aggregate.slug,
|
|
431
|
+
vo.slug,
|
|
432
|
+
),
|
|
433
|
+
);
|
|
434
|
+
}
|
|
435
|
+
for (const entity of aggregate.entities) {
|
|
436
|
+
out.push(
|
|
437
|
+
paths.entity(context.id, service.slug, aggregate.slug, entity.slug),
|
|
438
|
+
);
|
|
439
|
+
}
|
|
440
|
+
for (const item of enumsOf(aggregate)) {
|
|
441
|
+
out.push(
|
|
442
|
+
paths.enum(context.id, service.slug, aggregate.slug, item.slug),
|
|
443
|
+
);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
return out;
|
|
449
|
+
}
|