@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/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2019 Victor Login
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
# portolan
|
|
2
|
+
|
|
3
|
+
A browser for a software estate's architecture catalog: systems or bounded
|
|
4
|
+
contexts, components, interfaces, events, flows, stores and ADRs, read out of
|
|
5
|
+
the code and specs that already describe them, and rendered as a navigable
|
|
6
|
+
site. DDD enriches the model when a repository really uses it; it is not a
|
|
7
|
+
prerequisite.
|
|
8
|
+
|
|
9
|
+
The catalog and site are static end to end and require no backend. Optional
|
|
10
|
+
branch comparison and source previews read immutable files from GitHub or
|
|
11
|
+
GitLab at runtime; local development uses a localhost-only control plane.
|
|
12
|
+
|
|
13
|
+
Live: <https://shortlink-org.github.io/portolan/> (the example estate in
|
|
14
|
+
`examples/`).
|
|
15
|
+
|
|
16
|
+
## What it does
|
|
17
|
+
|
|
18
|
+
```mermaid
|
|
19
|
+
flowchart TB
|
|
20
|
+
code["Go · TypeScript · Rust<br/>Java · Django"]
|
|
21
|
+
specs["OpenAPI · AsyncAPI · GraphQL<br/>proto · SQL"]
|
|
22
|
+
traces["OTel traces"]
|
|
23
|
+
frag["catalog fragments<br/>beside each service<br/>*/portolan/*.json"]
|
|
24
|
+
merged["merge + validate"]
|
|
25
|
+
site["the site<br/>React SPA"]
|
|
26
|
+
docs["docs/<br/>markdown, llms.txt"]
|
|
27
|
+
exports["exports/<br/>Backstage + Mermaid"]
|
|
28
|
+
c4["likec4/<br/>C4 + one view per flow"]
|
|
29
|
+
|
|
30
|
+
code -- extract --> frag
|
|
31
|
+
specs -- extract --> frag
|
|
32
|
+
traces -- verify --> frag
|
|
33
|
+
frag --> merged
|
|
34
|
+
merged --> site
|
|
35
|
+
merged -- generate --> docs
|
|
36
|
+
merged -- generate --> exports
|
|
37
|
+
merged -- likec4:gen --> c4 --> site
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
There is no master catalog file. Every fragment the manifest's `sources` globs
|
|
41
|
+
find — what each service publishes beside its own code, plus the estate's
|
|
42
|
+
hand-written facts in `data/` (shared types, ADRs, `.flow.md` walkthroughs) —
|
|
43
|
+
is merged, then validated as one estate: referential integrity is a property of
|
|
44
|
+
the union, so a fragment naming a peer it does not own is normal. Validation
|
|
45
|
+
happens at startup; if it fails the shell renders the error instead of a blank
|
|
46
|
+
page.
|
|
47
|
+
|
|
48
|
+
Facts carry a status: `declared` (a fragment says so), `verified` (a recorded
|
|
49
|
+
trace showed it happening), `unresolved` (nothing in the catalog answers the
|
|
50
|
+
reference).
|
|
51
|
+
|
|
52
|
+
### Projects without DDD
|
|
53
|
+
|
|
54
|
+
`extract-project` is the neutral baseline. It reads repository metadata and
|
|
55
|
+
deployment/build manifests without executing project code, creates a `system`,
|
|
56
|
+
`product`, `team` or `namespace` containing a component, and records its role
|
|
57
|
+
(`application`, `worker`, `job`, `cli`, `library`, and so on) and technologies.
|
|
58
|
+
It also lists the commands the runner files declare - make targets, npm
|
|
59
|
+
scripts, just recipes, Taskfile and poe/pdm tasks, Maven and Gradle goals,
|
|
60
|
+
cargo aliases and xtask subcommands - which `extract-commands` does on its
|
|
61
|
+
own for a service a domain extractor describes.
|
|
62
|
+
Contract, messaging and data extractors then add OpenAPI, AsyncAPI, GraphQL,
|
|
63
|
+
proto, SQL, Redis, River, Watermill and outbound HTTP/SOAP facts to that same
|
|
64
|
+
component.
|
|
65
|
+
For Go services, the HTTP client extractor also joins common router
|
|
66
|
+
registrations to handlers, interface calls, string-keyed factory branches and
|
|
67
|
+
concrete providers. Constructor maps, fixed factories, capability assertions,
|
|
68
|
+
composite/direct field assignment and setter injection are followed when the
|
|
69
|
+
source proves one concrete target. The resulting flow starts at the inbound
|
|
70
|
+
endpoint and fans out by the provider choices proved by source; when a
|
|
71
|
+
provider's transport lives in another module, the flow stops at that
|
|
72
|
+
implementation and says that the outbound transport could not be resolved.
|
|
73
|
+
Endpoints without provider selection are composed too, including handlers
|
|
74
|
+
passed through closures and local variables. Swagger `@Router` evidence can
|
|
75
|
+
root a handler factory behind a custom registry, while calls reached from a
|
|
76
|
+
`main → Run` assembly path become startup flows. These generated transport and
|
|
77
|
+
async flows carry their trigger kind and static-confidence level; `AddFunc`,
|
|
78
|
+
`AfterFunc`, and `Schedule` registrations become scheduled roots. A transport
|
|
79
|
+
fragment with no proven root is marked `unproven` instead of looking like a
|
|
80
|
+
complete scenario.
|
|
81
|
+
|
|
82
|
+
The older JSON keys `contexts` and `services` remain the wire format, so old
|
|
83
|
+
catalogs need no migration (portolan.0004). Optional `kind` fields say when those nodes should
|
|
84
|
+
be read as a neutral group and component. When `kind` is absent, the historical
|
|
85
|
+
`bounded-context` and `service` meanings apply.
|
|
86
|
+
|
|
87
|
+
The setup wizard always offers the neutral extractor. A language-specific DDD
|
|
88
|
+
extractor is selected only when its expected model structure is present; a
|
|
89
|
+
`go.mod` or a directory merely named `internal/domain` is not sufficient.
|
|
90
|
+
|
|
91
|
+
## What the site shows
|
|
92
|
+
|
|
93
|
+
- **Entity pages** — context, service, aggregate (entities, value objects,
|
|
94
|
+
lifecycle, events, commands, queries), event, store, schema module, ADR.
|
|
95
|
+
- **Flows** — step-by-step walkthroughs with a step rail, cross-protocol chains
|
|
96
|
+
that continue across contexts, and per-step detail. Source locations open an
|
|
97
|
+
inline code window around the exact line; private forge tokens stay in tab
|
|
98
|
+
memory, and the external GitHub/GitLab link remains available.
|
|
99
|
+
- **Diagrams** — LikeC4 C4 views (estate landscape, every container in the
|
|
100
|
+
estate with its technology and the protocol on each edge, one per context,
|
|
101
|
+
two per service, one dynamic view per flow), an ELK-routed dependency graph,
|
|
102
|
+
and a context map. The app never draws these itself; `npm run likec4:gen`
|
|
103
|
+
writes the model from the catalog.
|
|
104
|
+
- **ER canvases** — per store: tables, views, keys and crow's feet, plus column
|
|
105
|
+
lineage (`from`) drawn dashed; hovering a column lights the whole chain back
|
|
106
|
+
to where the value came from.
|
|
107
|
+
- **API specs** — OpenAPI via Scalar, AsyncAPI via its React component, a
|
|
108
|
+
GraphQL schema as the SDL it was written as.
|
|
109
|
+
- **Navigation** — ⌘K palette over everything the catalog names (`e:` events,
|
|
110
|
+
`vo:` value objects, …), sidebar tree, breadcrumbs, "what links here", a
|
|
111
|
+
trail of recent pages, pins, keyboard shortcuts, light/dark and density.
|
|
112
|
+
- **Ask the catalog** — a chat that answers from the generated pages: the
|
|
113
|
+
model gets `llms.txt` and opens pages one at a time, names things by their
|
|
114
|
+
ids (which become links), and can end an answer with a card drawn from the
|
|
115
|
+
catalog — a service, a flow's sequence diagram, what runs between two
|
|
116
|
+
contexts, an aggregate's state machine. The demo answers through the worker
|
|
117
|
+
in `proxy/`; a reader can bring their own OpenAI-compatible endpoint and key
|
|
118
|
+
from the panel's settings, kept in their browser.
|
|
119
|
+
|
|
120
|
+
## What it checks
|
|
121
|
+
|
|
122
|
+
The **Problems** page lists every edge that leaves the chart, grouped errors
|
|
123
|
+
first:
|
|
124
|
+
|
|
125
|
+
- calls and consumers no service in the catalog answers, and RPC methods a
|
|
126
|
+
known provider does not have;
|
|
127
|
+
- a foreign key or a column's lineage crossing a service boundary, a database
|
|
128
|
+
with a second writer, a table that no longer holds the aggregate it claims,
|
|
129
|
+
a column whose type has drifted from its field's, an outbox with no payload;
|
|
130
|
+
- a channel with a second publisher, an event on a channel its service does not
|
|
131
|
+
declare, a declared channel no event names, a subscription nothing publishes.
|
|
132
|
+
|
|
133
|
+
## Where the facts come from
|
|
134
|
+
|
|
135
|
+
Plugins, one JSON message in and one out (`plugins/README.md`), declared in
|
|
136
|
+
`portolan.json` and run in three phases:
|
|
137
|
+
|
|
138
|
+
| phase | plugins |
|
|
139
|
+
| --- | --- |
|
|
140
|
+
| extract | `extract-project`, `extract-go`, `extract-ts`, `extract-rust`, `extract-java`, `extract-django`, `extract-celery`, `extract-python-kafka`, `extract-openapi`, `extract-wsdl`, `extract-http-clients`, `extract-redis`, `extract-asyncapi`, `extract-graphql`, `extract-proto`, `extract-river`, `extract-watermill`, `extract-go-nats`, `extract-csr`, `extract-sql`, `extract-flows`, `extract-adr`, `extract-glossary`, `extract-commands` |
|
|
141
|
+
| verify | `verify-otel` — reads traces, marks the hops they show as `verified`; `verify-codeowners` — reads CODEOWNERS, says who to ask about each service |
|
|
142
|
+
| generate | `gen-markdown` — `docs/`, `gen-mermaid` — standalone flow diagrams, `gen-backstage` — Backstage entities |
|
|
143
|
+
|
|
144
|
+
`fetch-git`, `fetch-bsr` and `fetch-csr` bring in sources from other
|
|
145
|
+
repositories, the Buf Schema Registry and a Confluent Schema Registry, against a
|
|
146
|
+
lock, so a later build can reproduce them without a socket.
|
|
147
|
+
|
|
148
|
+
Each plugin describes its own options; `npm run schema` asks all of them and
|
|
149
|
+
composes `schema/portolan.schema.json`, which editors complete against and `gen`
|
|
150
|
+
checks before running anything.
|
|
151
|
+
|
|
152
|
+
## Use it in your project
|
|
153
|
+
|
|
154
|
+
Run the setup once from the root of a repository:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
npx @shortlink-org/portolan init
|
|
158
|
+
npm install --save-dev @shortlink-org/portolan
|
|
159
|
+
npx portolan generate
|
|
160
|
+
npx portolan dev
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
`init` writes a minimal `portolan.json`, adds `.portolan/` to `.gitignore`,
|
|
164
|
+
and, when the repository has a `package.json`, adds these scripts without
|
|
165
|
+
replacing scripts that are already there:
|
|
166
|
+
|
|
167
|
+
```json
|
|
168
|
+
{
|
|
169
|
+
"scripts": {
|
|
170
|
+
"architecture": "portolan dev",
|
|
171
|
+
"architecture:gen": "portolan generate",
|
|
172
|
+
"architecture:check": "portolan check",
|
|
173
|
+
"architecture:build": "portolan build"
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
The generated fragments, Markdown, and exports are ordinary reviewable files
|
|
179
|
+
and should be committed. `.portolan/` is local build state and `dist/` is the
|
|
180
|
+
deployable static site.
|
|
181
|
+
|
|
182
|
+
| command | purpose |
|
|
183
|
+
| --- | --- |
|
|
184
|
+
| `portolan init` | create the first manifest without overwriting an existing one |
|
|
185
|
+
| `portolan dev` | run the local site and setup UI |
|
|
186
|
+
| `portolan generate` | update fragments, documentation, and exports |
|
|
187
|
+
| `portolan check` | fail when committed generated files are stale, without writing them |
|
|
188
|
+
| `portolan build` | build the static site into `dist/` |
|
|
189
|
+
| `portolan diff BASE` | describe the architecture change from a branch, tag, or commit |
|
|
190
|
+
| `portolan doctor` | show which optional plugin toolchains are available |
|
|
191
|
+
|
|
192
|
+
Node.js 24 is required. A process extractor also needs the toolchain of the
|
|
193
|
+
language it reads: Go for the Go extractors, Python 3 for Python, Java 21 for
|
|
194
|
+
Java, and Cargo for Rust. `portolan doctor` reports the local set. The Docker
|
|
195
|
+
image contains all of them.
|
|
196
|
+
|
|
197
|
+
### Check pull requests with GitHub Actions
|
|
198
|
+
|
|
199
|
+
Generated files are checked rather than silently rewritten in CI:
|
|
200
|
+
|
|
201
|
+
```yaml
|
|
202
|
+
name: Architecture
|
|
203
|
+
on: [pull_request]
|
|
204
|
+
|
|
205
|
+
permissions:
|
|
206
|
+
contents: read
|
|
207
|
+
|
|
208
|
+
jobs:
|
|
209
|
+
check:
|
|
210
|
+
runs-on: ubuntu-latest
|
|
211
|
+
steps:
|
|
212
|
+
- uses: actions/checkout@v7
|
|
213
|
+
with:
|
|
214
|
+
fetch-depth: 0
|
|
215
|
+
- uses: shortlink-org/portolan@0.1.0
|
|
216
|
+
with:
|
|
217
|
+
command: check
|
|
218
|
+
version: 0.1.0
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Full history is required because fragments are stamped with the last commit
|
|
222
|
+
that changed their input. A shallow clone would make that stamp unreliable.
|
|
223
|
+
|
|
224
|
+
### Publish the site to GitHub Pages
|
|
225
|
+
|
|
226
|
+
```yaml
|
|
227
|
+
name: Architecture site
|
|
228
|
+
on:
|
|
229
|
+
push:
|
|
230
|
+
branches: [main]
|
|
231
|
+
workflow_dispatch:
|
|
232
|
+
|
|
233
|
+
permissions:
|
|
234
|
+
contents: read
|
|
235
|
+
pages: write
|
|
236
|
+
id-token: write
|
|
237
|
+
|
|
238
|
+
jobs:
|
|
239
|
+
build:
|
|
240
|
+
runs-on: ubuntu-latest
|
|
241
|
+
steps:
|
|
242
|
+
- uses: actions/checkout@v7
|
|
243
|
+
- uses: shortlink-org/portolan@0.1.0
|
|
244
|
+
with:
|
|
245
|
+
command: build
|
|
246
|
+
version: 0.1.0
|
|
247
|
+
output: dist
|
|
248
|
+
base: /${{ github.event.repository.name }}/
|
|
249
|
+
- uses: actions/configure-pages@v6
|
|
250
|
+
- uses: actions/upload-pages-artifact@v5
|
|
251
|
+
with:
|
|
252
|
+
path: dist
|
|
253
|
+
|
|
254
|
+
deploy:
|
|
255
|
+
needs: build
|
|
256
|
+
runs-on: ubuntu-latest
|
|
257
|
+
environment:
|
|
258
|
+
name: github-pages
|
|
259
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
260
|
+
steps:
|
|
261
|
+
- id: deployment
|
|
262
|
+
uses: actions/deploy-pages@v5
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
The action deliberately separates building from deployment, so the Pages
|
|
266
|
+
permissions are held only by the deploy job.
|
|
267
|
+
|
|
268
|
+
### Run without installing Node or language toolchains
|
|
269
|
+
|
|
270
|
+
The same CLI is published at `ghcr.io/shortlink-org/portolan`. On Linux, pass
|
|
271
|
+
the host uid and gid so generated files remain owned by the developer:
|
|
272
|
+
|
|
273
|
+
```bash
|
|
274
|
+
docker run --rm \
|
|
275
|
+
--user "$(id -u):$(id -g)" \
|
|
276
|
+
-e HOME=/tmp \
|
|
277
|
+
-v "$PWD:/workspace" \
|
|
278
|
+
-w /workspace \
|
|
279
|
+
ghcr.io/shortlink-org/portolan:0.1.0 generate
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
Use immutable versions in CI. `latest` is intended for trying the CLI, not for
|
|
283
|
+
a reproducible build.
|
|
284
|
+
|
|
285
|
+
### One repository or an estate repository
|
|
286
|
+
|
|
287
|
+
For one application or a monorepo, keep `portolan.json` at its root and write
|
|
288
|
+
fragments beside each component. An organization-wide catalog can instead
|
|
289
|
+
live in a dedicated architecture repository: `fetch-git` pins the service
|
|
290
|
+
repositories at immutable commits and the normal merge, check, diff, and build
|
|
291
|
+
commands operate on the combined estate.
|
|
292
|
+
|
|
293
|
+
## Develop Portolan itself
|
|
294
|
+
|
|
295
|
+
```bash
|
|
296
|
+
npm install
|
|
297
|
+
npm run dev
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
```bash
|
|
301
|
+
npm run gen # run extract → verify → generate over portolan.json
|
|
302
|
+
npm run gen:check # fail if what is committed no longer follows from the catalog
|
|
303
|
+
npm run diff # what this branch changes about the architecture
|
|
304
|
+
npm run schema # recompose the manifest schema from the plugins
|
|
305
|
+
npm test # vitest; npm run test:go for the Go catalog mirror
|
|
306
|
+
npm run build # likec4:gen + tsc --noEmit + vite build
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
Generated output is committed, so a change to it shows up in a diff. CI builds
|
|
310
|
+
the site (`npm run build`); the `--check` variants and the test suites are run
|
|
311
|
+
locally before a change lands, since they need the Go, Java, Rust and Python
|
|
312
|
+
toolchains the plugins are written in.
|
|
313
|
+
|
|
314
|
+
### Release Portolan
|
|
315
|
+
|
|
316
|
+
Give the repository an `NPM_TOKEN` Actions secret that can publish the
|
|
317
|
+
`@shortlink-org/portolan` package. Push a tag matching the version in
|
|
318
|
+
`package.json`, for example `0.1.0`. The release workflow verifies the package,
|
|
319
|
+
publishes it to npm with provenance, builds multi-platform container images at
|
|
320
|
+
`ghcr.io/shortlink-org/portolan`, attests the image, and creates or updates the
|
|
321
|
+
GitHub release notes. The tag itself is also the immutable version of the
|
|
322
|
+
composite action used by consumer repositories.
|
|
323
|
+
|
|
324
|
+
### In a pull request
|
|
325
|
+
|
|
326
|
+
`gen:check` says the documentation follows from the catalog; it does not say
|
|
327
|
+
what the change does. `.github/workflows/architecture-diff.yml` puts that on
|
|
328
|
+
the pull request itself, without ever failing it:
|
|
329
|
+
|
|
330
|
+
- one sticky comment with the events, endpoints, transitions and owners that
|
|
331
|
+
are not what they were, breaking first, ending in a link into the published
|
|
332
|
+
site's Changes page for the same pair of branches;
|
|
333
|
+
- the same list as SARIF in the checks tab, breaking as errors, each result
|
|
334
|
+
anchored at the fragment that declares the id, so code scanning shows it;
|
|
335
|
+
- the report again in the job summary, for whoever reads the run.
|
|
336
|
+
|
|
337
|
+
The comment is `scripts/forge-comment.mjs` over the markdown `npm run diff`
|
|
338
|
+
writes. It finds its own earlier comment by a marker and updates it in place.
|
|
339
|
+
`GITHUB_TOKEN` with `pull-requests: write` is enough on GitHub; a pull request
|
|
340
|
+
from a fork has a read-only token, and the step says so and stays green.
|
|
341
|
+
|
|
342
|
+
The Changes page itself compares the built catalog with any branch or tag the
|
|
343
|
+
forge lists, so the link in the comment works for a release just as well.
|
|
344
|
+
|
|
345
|
+
On GitLab the job token cannot write notes, so the job wants a project access
|
|
346
|
+
token with the `api` scope and the Reporter role as `PORTOLAN_TOKEN`:
|
|
347
|
+
|
|
348
|
+
```yaml
|
|
349
|
+
architecture-diff:
|
|
350
|
+
image: node:24
|
|
351
|
+
rules: [{ if: $CI_PIPELINE_SOURCE == "merge_request_event" }]
|
|
352
|
+
script:
|
|
353
|
+
- git fetch origin "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME"
|
|
354
|
+
- npm ci
|
|
355
|
+
- node scripts/diff.mjs "origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" --site "$CI_PAGES_URL" --head "$CI_COMMIT_REF_NAME" --output .portolan/diff.md
|
|
356
|
+
- node scripts/forge-comment.mjs .portolan/diff.md
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
### In a release
|
|
360
|
+
|
|
361
|
+
`.github/workflows/release-notes.yml` runs the same diff when a `v*` tag is
|
|
362
|
+
pushed, against the tag before it, and `scripts/forge-release.mjs` writes it
|
|
363
|
+
into the release as one section between two markers: the rest of the notes,
|
|
364
|
+
hand-written or generated by the forge, stays as it was, and a rerun replaces
|
|
365
|
+
the section rather than repeating it. A tag with no release yet gets one,
|
|
366
|
+
named after the tag. The first tag of a repository has nothing to compare
|
|
367
|
+
against, and the job says so and stops. The same job on GitLab:
|
|
368
|
+
|
|
369
|
+
```yaml
|
|
370
|
+
architecture-release:
|
|
371
|
+
image: node:24
|
|
372
|
+
rules: [{ if: $CI_COMMIT_TAG }]
|
|
373
|
+
script:
|
|
374
|
+
- git fetch --tags origin
|
|
375
|
+
- npm ci
|
|
376
|
+
- previous=$(git describe --tags --abbrev=0 "$CI_COMMIT_TAG^")
|
|
377
|
+
- node scripts/diff.mjs "$previous" --site "$CI_PAGES_URL" --head "$CI_COMMIT_TAG" --output .portolan/release.md
|
|
378
|
+
- node scripts/forge-release.mjs .portolan/release.md
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
Three build-time variables shape the chat:
|
|
382
|
+
|
|
383
|
+
| variable | effect |
|
|
384
|
+
|---|---|
|
|
385
|
+
| `VITE_CHAT=off` | no chat at all: no button, no settings section, and its chunk is not built |
|
|
386
|
+
| `VITE_CHAT_PROXY_URL` | the worker that answers with a key of its own (see `proxy/README.md`); unset, the chat waits for the reader's own model |
|
|
387
|
+
| (a switch in Settings) | the reader turns the chat on or off in their browser; on by default when a proxy answers |
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
package catalog
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
"testing"
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
// An enum round-trips whole: the aggregate's list, the values with their
|
|
9
|
+
// docs, the deprecation marks - and the proto side's numbers. The fixture is
|
|
10
|
+
// literal rather than read from a catalog so that the test says exactly what
|
|
11
|
+
// the mirror is expected to keep.
|
|
12
|
+
func TestEnumRoundTrip(t *testing.T) {
|
|
13
|
+
raw := `{"id":"a","slug":"a","name":"A","readme":"","root":"A","entities":[],"valueObjects":[],"operations":[],"events":[],
|
|
14
|
+
"enums":[{"id":"shop.oms.order.status","slug":"status","name":"Status","doc":"Where an order is.","deprecated":true,
|
|
15
|
+
"values":[{"name":"placed","doc":"just in"},{"name":"legacy","doc":"","deprecated":true}]}]}`
|
|
16
|
+
|
|
17
|
+
var agg Aggregate
|
|
18
|
+
if err := json.Unmarshal([]byte(raw), &agg); err != nil {
|
|
19
|
+
t.Fatal(err)
|
|
20
|
+
}
|
|
21
|
+
if len(agg.Enums) != 1 || agg.Enums[0].ID != "shop.oms.order.status" || !agg.Enums[0].Deprecated {
|
|
22
|
+
t.Fatalf("enum not read: %+v", agg.Enums)
|
|
23
|
+
}
|
|
24
|
+
if got := agg.Enums[0].Values; len(got) != 2 || got[0].Name != "placed" || !got[1].Deprecated {
|
|
25
|
+
t.Fatalf("values not read: %+v", got)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
out, err := json.Marshal(agg)
|
|
29
|
+
if err != nil {
|
|
30
|
+
t.Fatal(err)
|
|
31
|
+
}
|
|
32
|
+
var before, after any
|
|
33
|
+
_ = json.Unmarshal([]byte(raw), &before)
|
|
34
|
+
_ = json.Unmarshal(out, &after)
|
|
35
|
+
if diffs := compare("aggregate", normalize(before), normalize(after)); len(diffs) != 0 {
|
|
36
|
+
t.Fatalf("round trip lost something: %v", diffs)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
var svc RpcService
|
|
40
|
+
if err := json.Unmarshal([]byte(`{"id":"shop.v1.OrderService","methods":[],"source":"","enums":[{"name":"Status","values":[{"name":"STATUS_UNSPECIFIED","number":0},{"name":"PLACED","number":1,"doc":"in"}]}]}`), &svc); err != nil {
|
|
41
|
+
t.Fatal(err)
|
|
42
|
+
}
|
|
43
|
+
if len(svc.Enums) != 1 || svc.Enums[0].Values[1].Number != 1 || svc.Enums[0].Values[0].Number != 0 {
|
|
44
|
+
t.Fatalf("proto enum not read: %+v", svc.Enums)
|
|
45
|
+
}
|
|
46
|
+
}
|