@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,34 @@
|
|
|
1
|
+
// A brand's mark, drawn so it sits in a row with lucide.
|
|
2
|
+
//
|
|
3
|
+
// simple-icons fills its 24x24 box edge to edge; lucide leaves a 2px margin
|
|
4
|
+
// inside its own. Shown at the same pixel size the brand mark would read a
|
|
5
|
+
// step heavier than the database glyph beside it, so the viewBox is opened by
|
|
6
|
+
// two units on every side and the two families weigh the same.
|
|
7
|
+
|
|
8
|
+
import type { TechGlyph } from "../lib/tech";
|
|
9
|
+
|
|
10
|
+
export function TechIcon({
|
|
11
|
+
glyph,
|
|
12
|
+
size = 14,
|
|
13
|
+
className = "",
|
|
14
|
+
}: {
|
|
15
|
+
glyph: TechGlyph;
|
|
16
|
+
size?: number;
|
|
17
|
+
className?: string;
|
|
18
|
+
}) {
|
|
19
|
+
return (
|
|
20
|
+
<svg
|
|
21
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
22
|
+
width={size}
|
|
23
|
+
height={size}
|
|
24
|
+
viewBox="-2 -2 28 28"
|
|
25
|
+
fill="currentColor"
|
|
26
|
+
aria-hidden
|
|
27
|
+
/* `block` for the same reason KindIcon is: no inline baseline gap, so
|
|
28
|
+
the mark centres on the text beside it. */
|
|
29
|
+
className={`block shrink-0 ${className}`}
|
|
30
|
+
>
|
|
31
|
+
<path d={glyph.path} />
|
|
32
|
+
</svg>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// The right-edge table of contents, with scroll-spy.
|
|
2
|
+
//
|
|
3
|
+
// It began as the readme outline on the aggregate page and is now the one
|
|
4
|
+
// component every long page uses, because two implementations of "where am I"
|
|
5
|
+
// is exactly how the two start disagreeing.
|
|
6
|
+
//
|
|
7
|
+
// It costs 24px of the page, not 208.
|
|
8
|
+
//
|
|
9
|
+
// At rest it is a column of ticks - one per section, the one you are in lit -
|
|
10
|
+
// which is the whole of what a table of contents is for while you are reading:
|
|
11
|
+
// how many sections, and which. The names are what you want only when you have
|
|
12
|
+
// decided to leave, so they arrive on hover or focus, in a panel that opens
|
|
13
|
+
// leftwards OVER the page rather than pushing it. Nothing reflows: the dock
|
|
14
|
+
// keeps its 24px whether the panel is open or not.
|
|
15
|
+
//
|
|
16
|
+
// Spy notes: the observer's root is the page's own scroll container, not the
|
|
17
|
+
// window - this shell never scrolls the document - and the bottom margin is
|
|
18
|
+
// pulled up to 65% so a section counts as "here" once its heading reaches the
|
|
19
|
+
// upper third, which is where a reader actually thinks they are.
|
|
20
|
+
|
|
21
|
+
import { useEffect, useMemo, useState } from "react";
|
|
22
|
+
|
|
23
|
+
export interface TocItem {
|
|
24
|
+
/** The id of the element on the page. */
|
|
25
|
+
id: string;
|
|
26
|
+
label: string;
|
|
27
|
+
/** 1 is flush left; each level indents 10px. */
|
|
28
|
+
depth?: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Nearest scrollable ancestor, or null when the page scrolls in the window. */
|
|
32
|
+
function scrollParent(el: Element | null): Element | null {
|
|
33
|
+
let node = el?.parentElement ?? null;
|
|
34
|
+
while (node) {
|
|
35
|
+
const overflow = getComputedStyle(node).overflowY;
|
|
36
|
+
if (overflow === "auto" || overflow === "scroll") return node;
|
|
37
|
+
node = node.parentElement;
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function useScrollSpy(ids: readonly string[]): string | null {
|
|
43
|
+
const [active, setActive] = useState<string | null>(ids[0] ?? null);
|
|
44
|
+
const key = ids.join(" ");
|
|
45
|
+
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
const list = key ? key.split(" ") : [];
|
|
48
|
+
const elements = list
|
|
49
|
+
.map((id) => document.getElementById(id))
|
|
50
|
+
.filter((el): el is HTMLElement => el !== null);
|
|
51
|
+
if (elements.length === 0) return;
|
|
52
|
+
|
|
53
|
+
const seen = new Set<string>();
|
|
54
|
+
const observer = new IntersectionObserver(
|
|
55
|
+
(entries) => {
|
|
56
|
+
for (const entry of entries) {
|
|
57
|
+
if (entry.isIntersecting) seen.add(entry.target.id);
|
|
58
|
+
else seen.delete(entry.target.id);
|
|
59
|
+
}
|
|
60
|
+
// First in document order wins, so scrolling down moves the marker
|
|
61
|
+
// down one section at a time rather than jumping to whatever fired.
|
|
62
|
+
const first = list.find((id) => seen.has(id));
|
|
63
|
+
// Nothing intersecting means the reader is between two sections;
|
|
64
|
+
// holding the last answer beats blanking the rail.
|
|
65
|
+
if (first) setActive(first);
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
root: scrollParent(elements[0] ?? null),
|
|
69
|
+
rootMargin: "0px 0px -65% 0px",
|
|
70
|
+
threshold: 0,
|
|
71
|
+
},
|
|
72
|
+
);
|
|
73
|
+
for (const el of elements) observer.observe(el);
|
|
74
|
+
return () => observer.disconnect();
|
|
75
|
+
}, [key]);
|
|
76
|
+
|
|
77
|
+
return active;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function Toc({
|
|
81
|
+
items,
|
|
82
|
+
label = "On this page",
|
|
83
|
+
title = "On this page",
|
|
84
|
+
}: {
|
|
85
|
+
items: readonly TocItem[];
|
|
86
|
+
/** Accessible name for the nav landmark. */
|
|
87
|
+
label?: string;
|
|
88
|
+
/** The heading printed above the list, once the panel is open. */
|
|
89
|
+
title?: string;
|
|
90
|
+
}) {
|
|
91
|
+
const ids = useMemo(() => items.map((i) => i.id), [items]);
|
|
92
|
+
const active = useScrollSpy(ids);
|
|
93
|
+
|
|
94
|
+
if (items.length === 0) return null;
|
|
95
|
+
|
|
96
|
+
return (
|
|
97
|
+
<nav
|
|
98
|
+
/* Hidden below the two-column breakpoint, where the page has no right
|
|
99
|
+
edge to spare at all. */
|
|
100
|
+
className="toc-dock sticky hidden h-fit shrink-0 self-start lg:block"
|
|
101
|
+
aria-label={label}
|
|
102
|
+
>
|
|
103
|
+
<div className="toc-panel">
|
|
104
|
+
<div className="label toc-name mb-1 px-3 pt-1">{title}</div>
|
|
105
|
+
<ul>
|
|
106
|
+
{items.map((item) => {
|
|
107
|
+
const on = item.id === active;
|
|
108
|
+
return (
|
|
109
|
+
<li key={item.id}>
|
|
110
|
+
<a
|
|
111
|
+
href={`#${item.id}`}
|
|
112
|
+
aria-current={on ? "location" : undefined}
|
|
113
|
+
/* The tick is the marker AND the hairline: 2px, always
|
|
114
|
+
drawn, transparent when idle, so nothing shifts as the
|
|
115
|
+
spy moves down the page. */
|
|
116
|
+
className={`toc-item ${on ? "text-ink" : "text-muted"}`}
|
|
117
|
+
style={{
|
|
118
|
+
borderColor: on ? "var(--accent)" : "var(--border)",
|
|
119
|
+
marginLeft: ((item.depth ?? 1) - 1) * 10,
|
|
120
|
+
}}
|
|
121
|
+
title={item.label}
|
|
122
|
+
>
|
|
123
|
+
<span className="toc-name">{item.label}</span>
|
|
124
|
+
</a>
|
|
125
|
+
</li>
|
|
126
|
+
);
|
|
127
|
+
})}
|
|
128
|
+
</ul>
|
|
129
|
+
</div>
|
|
130
|
+
</nav>
|
|
131
|
+
);
|
|
132
|
+
}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
// The incoming half of the graph, drawn the same way on every entity page.
|
|
2
|
+
//
|
|
3
|
+
// A page's own body says what a thing depends on. This says what depends on
|
|
4
|
+
// it — the question a reader actually arrives with, and the one no single
|
|
5
|
+
// entity can answer about itself. It sits last on every page and answers under
|
|
6
|
+
// the same heading, at the same anchor, in the same row shape, so "who breaks
|
|
7
|
+
// if I change this" is one place to look rather than five different ones.
|
|
8
|
+
//
|
|
9
|
+
// Every row says WHY it is here. A name with no reason attached would send the
|
|
10
|
+
// reader to open the page just to find out, which is the trip this section
|
|
11
|
+
// exists to save.
|
|
12
|
+
|
|
13
|
+
import { useMemo } from "react";
|
|
14
|
+
import type { ReactNode } from "react";
|
|
15
|
+
import { Link } from "react-router";
|
|
16
|
+
import { catalog, index } from "../data";
|
|
17
|
+
import { backlinkCount, backlinksFor } from "../lib/backlinks";
|
|
18
|
+
import type { Backlink, BacklinkGroup, BacklinkTarget } from "../lib/backlinks";
|
|
19
|
+
import { plural } from "../lib/format";
|
|
20
|
+
import { KIND_LABEL, KIND_PLURAL } from "../lib/kinds";
|
|
21
|
+
import type { Kind } from "../lib/kinds";
|
|
22
|
+
import { LINKS_HERE, backlinkPath } from "../routes";
|
|
23
|
+
import { KIND_COLOR, KindIcon } from "./kind";
|
|
24
|
+
import { Empty, SectionTitle } from "./PageHeader";
|
|
25
|
+
import { RowActions } from "./RowActions";
|
|
26
|
+
import { StatusChip } from "./primitives";
|
|
27
|
+
|
|
28
|
+
/** A section on this same page that already lists one kind of link, in full. */
|
|
29
|
+
export interface Elsewhere {
|
|
30
|
+
/** Where it is: a fragment, or a tab's query string. */
|
|
31
|
+
href: string;
|
|
32
|
+
/** What it is called there, so the pointer names the thing it points at. */
|
|
33
|
+
label: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Kinds the tree draws a row for, and so the ones "reveal" can find. */
|
|
37
|
+
const REVEALABLE: readonly Kind[] = [
|
|
38
|
+
"context",
|
|
39
|
+
"service",
|
|
40
|
+
"aggregate",
|
|
41
|
+
"event",
|
|
42
|
+
] as const;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* The same answer this section draws, for a page that also wants to count it
|
|
46
|
+
* in its header. Derived twice rather than threaded through props, because it
|
|
47
|
+
* is a pure walk over a catalog that does not change while the page is open.
|
|
48
|
+
*/
|
|
49
|
+
export function useBacklinks(target: BacklinkTarget): BacklinkGroup[] {
|
|
50
|
+
return useMemo(
|
|
51
|
+
() => backlinksFor(catalog, index, target),
|
|
52
|
+
[target.kind, target.id],
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function Row({ link }: { link: Backlink }) {
|
|
57
|
+
const to = backlinkPath(link);
|
|
58
|
+
// What a reader takes to a grep: the flow's slug is not enough to find the
|
|
59
|
+
// step inside it, so a link that points through one carries both.
|
|
60
|
+
const id = link.at ? `${link.id}/${link.at}` : link.id;
|
|
61
|
+
const reveal = to && REVEALABLE.includes(link.kind) ? link.id : undefined;
|
|
62
|
+
return (
|
|
63
|
+
/* A div holding a link, not a link holding buttons: the row actions are
|
|
64
|
+
interactive too, and interactive content does not nest. */
|
|
65
|
+
<div className="row gap-2">
|
|
66
|
+
<KindIcon kind={link.kind} contextId={link.context ?? undefined} />
|
|
67
|
+
{to ? (
|
|
68
|
+
/* Only events are painted by kind. Everything else keeps the ink of a
|
|
69
|
+
link in a row, because eight muted names in a column would read as
|
|
70
|
+
eight pieces of text rather than eight places to go. */
|
|
71
|
+
<Link
|
|
72
|
+
to={to}
|
|
73
|
+
data-nav-item
|
|
74
|
+
data-peek={link.id}
|
|
75
|
+
className="mono shrink-0 rounded-control"
|
|
76
|
+
style={
|
|
77
|
+
link.kind === "event" ? { color: KIND_COLOR.event } : undefined
|
|
78
|
+
}
|
|
79
|
+
title={id}
|
|
80
|
+
>
|
|
81
|
+
{link.name}
|
|
82
|
+
</Link>
|
|
83
|
+
) : (
|
|
84
|
+
<span
|
|
85
|
+
className={`mono shrink-0 ${
|
|
86
|
+
link.status === "unresolved" ? "text-unresolved" : "text-muted"
|
|
87
|
+
}`}
|
|
88
|
+
title={id}
|
|
89
|
+
>
|
|
90
|
+
{link.name}
|
|
91
|
+
</span>
|
|
92
|
+
)}
|
|
93
|
+
{/* One cell per column, empty ones included: the rows share a subgrid,
|
|
94
|
+
and a row that skips a field would slide every field after it into
|
|
95
|
+
the wrong column. */}
|
|
96
|
+
{link.owner ? (
|
|
97
|
+
<span className="min-w-0 truncate text-muted" title={link.owner}>
|
|
98
|
+
{link.owner}
|
|
99
|
+
</span>
|
|
100
|
+
) : (
|
|
101
|
+
<span />
|
|
102
|
+
)}
|
|
103
|
+
<span className="mono shrink-0 text-muted" title="how it points here">
|
|
104
|
+
{link.via}
|
|
105
|
+
</span>
|
|
106
|
+
{link.versions && link.versions.length > 0 ? (
|
|
107
|
+
<span
|
|
108
|
+
className="mono justify-self-start rounded-[4px] border px-1 border-line text-muted"
|
|
109
|
+
title="event versions carrying it"
|
|
110
|
+
>
|
|
111
|
+
{link.versions.join(" ")}
|
|
112
|
+
</span>
|
|
113
|
+
) : (
|
|
114
|
+
<span />
|
|
115
|
+
)}
|
|
116
|
+
{link.status ? <StatusChip status={link.status} /> : <span />}
|
|
117
|
+
<RowActions copy={id} {...(reveal ? { reveal } : {})} label={link.name} />
|
|
118
|
+
</div>
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function WhatLinksHere({
|
|
123
|
+
target,
|
|
124
|
+
variant = "section",
|
|
125
|
+
className = "",
|
|
126
|
+
elsewhere,
|
|
127
|
+
empty,
|
|
128
|
+
}: {
|
|
129
|
+
target: BacklinkTarget;
|
|
130
|
+
/** `line` only: what the row it is folded into wants of its spacing. */
|
|
131
|
+
className?: string;
|
|
132
|
+
/**
|
|
133
|
+
* `section` is the block every scrolling page ends with. `line` is the same
|
|
134
|
+
* facts as one row of chips, for a page with no bottom to put a section on -
|
|
135
|
+
* the flow, whose rail and canvas take the whole height.
|
|
136
|
+
*/
|
|
137
|
+
variant?: "section" | "line";
|
|
138
|
+
/**
|
|
139
|
+
* Kinds this page already lists in a section of their own, mapped to where
|
|
140
|
+
* that section is. Those rows are not repeated here; the count and a pointer
|
|
141
|
+
* to them are, so the whole answer is still readable in one place.
|
|
142
|
+
*/
|
|
143
|
+
elsewhere?: Partial<Record<Kind, Elsewhere>>;
|
|
144
|
+
/** What to say when nothing points here, when the reason is worth saying. */
|
|
145
|
+
empty?: ReactNode;
|
|
146
|
+
}) {
|
|
147
|
+
const groups = useBacklinks(target);
|
|
148
|
+
|
|
149
|
+
const total = backlinkCount(groups);
|
|
150
|
+
const shown = groups.filter((g) => !elsewhere?.[g.kind]);
|
|
151
|
+
const pointers = groups
|
|
152
|
+
.map((g) => ({ group: g, at: elsewhere?.[g.kind] }))
|
|
153
|
+
.filter((p): p is { group: (typeof groups)[number]; at: Elsewhere } =>
|
|
154
|
+
Boolean(p.at),
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
if (variant === "line") {
|
|
158
|
+
// Nothing to say, so nothing is said: a hero row is not the place for an
|
|
159
|
+
// empty state, and "linked from —" is worse than silence.
|
|
160
|
+
if (total === 0) return null;
|
|
161
|
+
return (
|
|
162
|
+
<span
|
|
163
|
+
className={`mono flex flex-wrap items-center gap-1.5 text-muted ${className || "mt-2"}`}
|
|
164
|
+
>
|
|
165
|
+
linked from
|
|
166
|
+
{groups
|
|
167
|
+
.flatMap((g) => g.links)
|
|
168
|
+
.map((link) => {
|
|
169
|
+
const to = backlinkPath(link);
|
|
170
|
+
const body = (
|
|
171
|
+
<>
|
|
172
|
+
<KindIcon
|
|
173
|
+
kind={link.kind}
|
|
174
|
+
contextId={link.context ?? undefined}
|
|
175
|
+
/>
|
|
176
|
+
{link.name}
|
|
177
|
+
</>
|
|
178
|
+
);
|
|
179
|
+
const title = `${link.owner ?? link.id} — ${link.via}`;
|
|
180
|
+
return to ? (
|
|
181
|
+
<Link
|
|
182
|
+
key={`${link.kind}:${link.id}:${link.name}`}
|
|
183
|
+
to={to}
|
|
184
|
+
data-peek={link.id}
|
|
185
|
+
className="chip border-line-strong hover:text-ink"
|
|
186
|
+
title={title}
|
|
187
|
+
>
|
|
188
|
+
{body}
|
|
189
|
+
</Link>
|
|
190
|
+
) : (
|
|
191
|
+
<span
|
|
192
|
+
key={`${link.kind}:${link.id}:${link.name}`}
|
|
193
|
+
className="chip border-line"
|
|
194
|
+
title={title}
|
|
195
|
+
>
|
|
196
|
+
{body}
|
|
197
|
+
</span>
|
|
198
|
+
);
|
|
199
|
+
})}
|
|
200
|
+
</span>
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return (
|
|
205
|
+
<section id={LINKS_HERE} className="mt-section max-w-table">
|
|
206
|
+
<SectionTitle
|
|
207
|
+
anchor={LINKS_HERE}
|
|
208
|
+
right={
|
|
209
|
+
<span>
|
|
210
|
+
<span className="tnum">{total}</span> incoming
|
|
211
|
+
</span>
|
|
212
|
+
}
|
|
213
|
+
>
|
|
214
|
+
What links here
|
|
215
|
+
</SectionTitle>
|
|
216
|
+
|
|
217
|
+
{total === 0 ? (
|
|
218
|
+
<Empty>{empty ?? "nothing in the catalog points here"}</Empty>
|
|
219
|
+
) : null}
|
|
220
|
+
|
|
221
|
+
{shown.map((group) => (
|
|
222
|
+
<div key={group.kind} className="mt-3 first:mt-0">
|
|
223
|
+
<div className="label mb-1.5">
|
|
224
|
+
{KIND_PLURAL[group.kind]}{" "}
|
|
225
|
+
<span className="tnum">{group.links.length}</span>
|
|
226
|
+
</div>
|
|
227
|
+
{/* icon, name, owner, why it points here, the versions carrying
|
|
228
|
+
it, status, actions. The owner takes the slack, so the reason
|
|
229
|
+
and everything after it hold the same column down the group. */}
|
|
230
|
+
<div
|
|
231
|
+
className="rows grid-cols-[auto_auto_1fr_auto_auto_auto_auto]"
|
|
232
|
+
data-nav-list
|
|
233
|
+
>
|
|
234
|
+
{group.links.map((link, i) => (
|
|
235
|
+
<Row
|
|
236
|
+
key={`${link.kind}:${link.id}:${link.at ?? i}`}
|
|
237
|
+
link={link}
|
|
238
|
+
/>
|
|
239
|
+
))}
|
|
240
|
+
</div>
|
|
241
|
+
</div>
|
|
242
|
+
))}
|
|
243
|
+
|
|
244
|
+
{pointers.map(({ group, at }) => {
|
|
245
|
+
const body = (
|
|
246
|
+
<>
|
|
247
|
+
<KindIcon kind={group.kind} />
|
|
248
|
+
<span className="tnum">{group.links.length}</span>
|
|
249
|
+
{plural(
|
|
250
|
+
group.links.length,
|
|
251
|
+
KIND_LABEL[group.kind],
|
|
252
|
+
KIND_PLURAL[group.kind],
|
|
253
|
+
)}
|
|
254
|
+
<span className="ml-auto">listed under {at.label}</span>
|
|
255
|
+
</>
|
|
256
|
+
);
|
|
257
|
+
const className = "row mono mt-3 gap-2 text-muted hover:text-ink";
|
|
258
|
+
// A section on this page is a fragment and the browser can jump to it
|
|
259
|
+
// on its own; a tab is a route, and routing it through <a> would
|
|
260
|
+
// reload the whole app to change one panel.
|
|
261
|
+
return at.href.startsWith("#") ? (
|
|
262
|
+
<a key={group.kind} href={at.href} className={className}>
|
|
263
|
+
{body}
|
|
264
|
+
</a>
|
|
265
|
+
) : (
|
|
266
|
+
<Link key={group.kind} to={at.href} className={className}>
|
|
267
|
+
{body}
|
|
268
|
+
</Link>
|
|
269
|
+
);
|
|
270
|
+
})}
|
|
271
|
+
</section>
|
|
272
|
+
);
|
|
273
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// A WSDL contract drawn from the structured facts extract-wsdl recorded.
|
|
2
|
+
// Unlike OpenAPI, the catalog already carries the operation binding and the
|
|
3
|
+
// reachable message shapes, so this remains useful when the source repository
|
|
4
|
+
// is not bundled into the generated site.
|
|
5
|
+
|
|
6
|
+
import { useState } from "react";
|
|
7
|
+
import type { RpcMethod, RpcService } from "../catalog";
|
|
8
|
+
import { Empty, SectionTitle } from "./PageHeader";
|
|
9
|
+
import { Ident } from "./Ident";
|
|
10
|
+
import { MessageList, MethodRows } from "./MethodRows";
|
|
11
|
+
|
|
12
|
+
export function WsdlReference({
|
|
13
|
+
source,
|
|
14
|
+
provided,
|
|
15
|
+
}: {
|
|
16
|
+
source: string;
|
|
17
|
+
provided: RpcService[];
|
|
18
|
+
}) {
|
|
19
|
+
const [open, setOpen] = useState<ReadonlySet<string>>(new Set());
|
|
20
|
+
const interfaces = provided.filter((item) => item.source === source);
|
|
21
|
+
const toggle = (id: string) =>
|
|
22
|
+
setOpen((shown) => {
|
|
23
|
+
const next = new Set(shown);
|
|
24
|
+
if (!next.delete(id)) next.add(id);
|
|
25
|
+
return next;
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
if (interfaces.length === 0) {
|
|
29
|
+
return <Empty>the WSDL source names no interface in this catalog</Empty>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<div className="max-w-table">
|
|
34
|
+
<p className="mono text-muted">{source}</p>
|
|
35
|
+
{interfaces.map((iface) => {
|
|
36
|
+
const soap = iface.methods.find((method) => method.soap)?.soap;
|
|
37
|
+
return (
|
|
38
|
+
<section key={iface.id} className="mt-section">
|
|
39
|
+
<SectionTitle>{iface.id}</SectionTitle>
|
|
40
|
+
<div className="rounded-card border border-line">
|
|
41
|
+
<div className="flex flex-wrap items-center gap-x-2 border-b border-line bg-surface px-3 py-1.5">
|
|
42
|
+
<Ident value={iface.id} className="text-ink" />
|
|
43
|
+
{soap?.version ? <span className="chip">SOAP {soap.version}</span> : null}
|
|
44
|
+
{soap?.style ? <span className="chip">{soap.style}</span> : null}
|
|
45
|
+
{soap?.binding ? <span className="chip mono">{soap.binding}</span> : null}
|
|
46
|
+
{soap?.endpoint ? (
|
|
47
|
+
<span className="mono min-w-0 truncate text-muted" title={soap.endpoint}>
|
|
48
|
+
{soap.endpoint}
|
|
49
|
+
</span>
|
|
50
|
+
) : null}
|
|
51
|
+
</div>
|
|
52
|
+
<MethodRows provided={iface} open={open} onToggle={toggle} />
|
|
53
|
+
<MessageList provided={iface} open={open} onToggle={toggle} />
|
|
54
|
+
</div>
|
|
55
|
+
</section>
|
|
56
|
+
);
|
|
57
|
+
})}
|
|
58
|
+
</div>
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** The one external SOAP operation a consumer card points at. */
|
|
63
|
+
export function SoapCallContract({
|
|
64
|
+
provided,
|
|
65
|
+
method,
|
|
66
|
+
}: {
|
|
67
|
+
provided: RpcService;
|
|
68
|
+
method: RpcMethod;
|
|
69
|
+
}) {
|
|
70
|
+
const [open, setOpen] = useState<ReadonlySet<string>>(new Set());
|
|
71
|
+
const toggle = (id: string) =>
|
|
72
|
+
setOpen((shown) => {
|
|
73
|
+
const next = new Set(shown);
|
|
74
|
+
if (!next.delete(id)) next.add(id);
|
|
75
|
+
return next;
|
|
76
|
+
});
|
|
77
|
+
const one = { ...provided, methods: [method] };
|
|
78
|
+
|
|
79
|
+
return (
|
|
80
|
+
<div className="mt-1 w-full rounded-control border border-line bg-surface">
|
|
81
|
+
<MethodRows provided={one} open={open} onToggle={toggle} />
|
|
82
|
+
</div>
|
|
83
|
+
);
|
|
84
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// The five DDD building blocks, drawn rather than borrowed.
|
|
2
|
+
//
|
|
3
|
+
// Lucide has no vocabulary for a domain event or a value object, so what it
|
|
4
|
+
// lends instead is a metaphor: Zap for an event, Diamond for a value object,
|
|
5
|
+
// Square for an entity. Each of those says "roughly this shape" and nothing
|
|
6
|
+
// about what the thing IS. These five say what the thing is.
|
|
7
|
+
//
|
|
8
|
+
// They are drawn on lucide's own grid - 24x24, 1.5px stroke, round caps and
|
|
9
|
+
// joins, no fill - so a value object standing next to a lucide chevron in the
|
|
10
|
+
// tree reads as one family and not as an imported sticker.
|
|
11
|
+
//
|
|
12
|
+
// The semantics, one line each:
|
|
13
|
+
//
|
|
14
|
+
// event a fact, announced: a point that already happened, and the pulse
|
|
15
|
+
// leaving it. Every other context hears about it after the fact.
|
|
16
|
+
// vo a shape with no identity: a diamond holding an equals sign -
|
|
17
|
+
// two equal values ARE the same value.
|
|
18
|
+
// entity a shape with identity: the same square, and the one dot that
|
|
19
|
+
// says this instance is not that one.
|
|
20
|
+
// command a directive arriving at the aggregate: an arrow that lands on
|
|
21
|
+
// the boundary and changes what is behind it.
|
|
22
|
+
// query the same boundary, answering: rows leaving it, changing nothing.
|
|
23
|
+
|
|
24
|
+
import type { SVGProps } from "react";
|
|
25
|
+
|
|
26
|
+
export interface DddIconProps extends Omit<SVGProps<SVGSVGElement>, "ref"> {
|
|
27
|
+
size?: number;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Shared frame. Every attribute lucide sets on its own icons is set here, so
|
|
32
|
+
* the two families size, colour and align identically.
|
|
33
|
+
*/
|
|
34
|
+
function Icon({ size = 16, children, ...rest }: DddIconProps) {
|
|
35
|
+
return (
|
|
36
|
+
<svg
|
|
37
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
38
|
+
width={size}
|
|
39
|
+
height={size}
|
|
40
|
+
viewBox="0 0 24 24"
|
|
41
|
+
fill="none"
|
|
42
|
+
stroke="currentColor"
|
|
43
|
+
strokeWidth={1.5}
|
|
44
|
+
strokeLinecap="round"
|
|
45
|
+
strokeLinejoin="round"
|
|
46
|
+
{...rest}
|
|
47
|
+
>
|
|
48
|
+
{children}
|
|
49
|
+
</svg>
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** A fact that happened, and the pulse that carried it outward. */
|
|
54
|
+
export function EventIcon(props: DddIconProps) {
|
|
55
|
+
return (
|
|
56
|
+
<Icon {...props}>
|
|
57
|
+
<circle cx={7} cy={12} r={1.6} />
|
|
58
|
+
<path d="M9.9 8.4a4.6 4.6 0 0 1 0 7.2" />
|
|
59
|
+
<path d="M12.2 5.4a8.4 8.4 0 0 1 0 13.2" />
|
|
60
|
+
</Icon>
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** No identity: equal values are the same value. */
|
|
65
|
+
export function ValueObjectIcon(props: DddIconProps) {
|
|
66
|
+
return (
|
|
67
|
+
<Icon {...props}>
|
|
68
|
+
<path d="M12 3.5 20.5 12 12 20.5 3.5 12Z" />
|
|
69
|
+
<path d="M9 10.5h6" />
|
|
70
|
+
<path d="M9 13.5h6" />
|
|
71
|
+
</Icon>
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Identity: this one, tracked over time, and not that one. */
|
|
76
|
+
export function EntityIcon(props: DddIconProps) {
|
|
77
|
+
return (
|
|
78
|
+
<Icon {...props}>
|
|
79
|
+
<rect x={4} y={4} width={16} height={16} rx={3} />
|
|
80
|
+
<circle cx={12} cy={12} r={1.6} />
|
|
81
|
+
</Icon>
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** A directive landing on the aggregate boundary. */
|
|
86
|
+
export function CommandIcon(props: DddIconProps) {
|
|
87
|
+
return (
|
|
88
|
+
<Icon {...props}>
|
|
89
|
+
<path d="M19 4.5v15" />
|
|
90
|
+
<path d="M4 12h11" />
|
|
91
|
+
<path d="m11.5 8.5 3.5 3.5-3.5 3.5" />
|
|
92
|
+
</Icon>
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** The same boundary, answering. Rows out, nothing changed. */
|
|
97
|
+
export function QueryIcon(props: DddIconProps) {
|
|
98
|
+
return (
|
|
99
|
+
<Icon {...props}>
|
|
100
|
+
<path d="M19 4.5v15" />
|
|
101
|
+
<path d="M19 9H7" />
|
|
102
|
+
<path d="m10.5 5.5-3.5 3.5 3.5 3.5" />
|
|
103
|
+
<path d="M19 15h-8" />
|
|
104
|
+
<path d="m14.5 11.5-3.5 3.5 3.5 3.5" />
|
|
105
|
+
</Icon>
|
|
106
|
+
);
|
|
107
|
+
}
|