@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,133 @@
|
|
|
1
|
+
package wsdl
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"os"
|
|
5
|
+
"path/filepath"
|
|
6
|
+
"strings"
|
|
7
|
+
"testing"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
func writeFixture(t *testing.T, root, name, contents string) {
|
|
11
|
+
t.Helper()
|
|
12
|
+
path := filepath.Join(root, name)
|
|
13
|
+
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
|
|
14
|
+
t.Fatal(err)
|
|
15
|
+
}
|
|
16
|
+
if err := os.WriteFile(path, []byte(contents), 0o644); err != nil {
|
|
17
|
+
t.Fatal(err)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
func TestReadJoinsImportedPortTypeBindingAndSchema(t *testing.T) {
|
|
22
|
+
root := t.TempDir()
|
|
23
|
+
writeFixture(t, root, "types.xsd", `
|
|
24
|
+
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:booking" xmlns:tns="urn:booking">
|
|
25
|
+
<xsd:complexType name="CancelRequestType">
|
|
26
|
+
<xsd:sequence>
|
|
27
|
+
<xsd:element name="bookingId" type="xsd:string"/>
|
|
28
|
+
<xsd:element name="passengerIds" type="xsd:string" maxOccurs="unbounded"/>
|
|
29
|
+
</xsd:sequence>
|
|
30
|
+
</xsd:complexType>
|
|
31
|
+
<xsd:element name="CancelRequest" type="tns:CancelRequestType"/>
|
|
32
|
+
<xsd:element name="CancelResponse">
|
|
33
|
+
<xsd:complexType><xsd:sequence><xsd:element name="accepted" type="xsd:boolean"/></xsd:sequence></xsd:complexType>
|
|
34
|
+
</xsd:element>
|
|
35
|
+
</xsd:schema>`)
|
|
36
|
+
writeFixture(t, root, "contract.wsdl", `
|
|
37
|
+
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="urn:booking" targetNamespace="urn:booking">
|
|
38
|
+
<wsdl:types><xsd:schema targetNamespace="urn:booking"><xsd:import namespace="urn:booking" schemaLocation="types.xsd"/></xsd:schema></wsdl:types>
|
|
39
|
+
<wsdl:message name="CancelRequestMessage"><wsdl:part name="body" element="tns:CancelRequest"/></wsdl:message>
|
|
40
|
+
<wsdl:message name="CancelResponseMessage"><wsdl:part name="body" element="tns:CancelResponse"/></wsdl:message>
|
|
41
|
+
<wsdl:message name="BookingFault"><wsdl:part name="reason" type="xsd:string"/></wsdl:message>
|
|
42
|
+
<wsdl:portType name="BookingPortType">
|
|
43
|
+
<wsdl:operation name="CancelBooking">
|
|
44
|
+
<wsdl:documentation>Cancels a booking.</wsdl:documentation>
|
|
45
|
+
<wsdl:input message="tns:CancelRequestMessage"/>
|
|
46
|
+
<wsdl:output message="tns:CancelResponseMessage"/>
|
|
47
|
+
<wsdl:fault name="BookingFault" message="tns:BookingFault"/>
|
|
48
|
+
</wsdl:operation>
|
|
49
|
+
</wsdl:portType>
|
|
50
|
+
</wsdl:definitions>`)
|
|
51
|
+
writeFixture(t, root, "service.wsdl", `
|
|
52
|
+
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:tns="urn:booking" targetNamespace="urn:booking" name="BookingDefinitions">
|
|
53
|
+
<wsdl:import namespace="urn:booking" location="contract.wsdl"/>
|
|
54
|
+
<wsdl:binding name="BookingBinding" type="tns:BookingPortType">
|
|
55
|
+
<soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
|
|
56
|
+
<wsdl:operation name="CancelBooking">
|
|
57
|
+
<soap12:operation soapAction="urn:booking:cancel"/>
|
|
58
|
+
<wsdl:input><soap12:body use="literal"/><soap12:header message="tns:BookingFault" part="reason" use="literal"/></wsdl:input>
|
|
59
|
+
</wsdl:operation>
|
|
60
|
+
</wsdl:binding>
|
|
61
|
+
<wsdl:binding name="BookingBinding11" type="tns:BookingPortType">
|
|
62
|
+
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
|
|
63
|
+
<wsdl:operation name="CancelBooking"><soap:operation soapAction="urn:booking:cancel:v1"/></wsdl:operation>
|
|
64
|
+
</wsdl:binding>
|
|
65
|
+
<wsdl:service name="BookingService">
|
|
66
|
+
<wsdl:documentation>Booking supplier API.</wsdl:documentation>
|
|
67
|
+
<wsdl:port name="BookingPort" binding="tns:BookingBinding"><soap12:address location="https://booking.example/soap"/></wsdl:port>
|
|
68
|
+
<wsdl:port name="BookingPort11" binding="tns:BookingBinding11"><soap:address location="https://booking.example/soap/v1"/></wsdl:port>
|
|
69
|
+
</wsdl:service>
|
|
70
|
+
</wsdl:definitions>`)
|
|
71
|
+
|
|
72
|
+
result, err := Read(root, "service.wsdl")
|
|
73
|
+
if err != nil {
|
|
74
|
+
t.Fatal(err)
|
|
75
|
+
}
|
|
76
|
+
if len(result.Contracts) != 1 {
|
|
77
|
+
t.Fatalf("contracts = %+v", result.Contracts)
|
|
78
|
+
}
|
|
79
|
+
contract := result.Contracts[0]
|
|
80
|
+
if contract.Name != "BookingService" || contract.Summary != "Booking supplier API." || contract.Source != "service.wsdl" {
|
|
81
|
+
t.Fatalf("contract = %+v", contract)
|
|
82
|
+
}
|
|
83
|
+
if len(contract.Interfaces) != 2 {
|
|
84
|
+
t.Fatalf("interfaces = %+v", contract.Interfaces)
|
|
85
|
+
}
|
|
86
|
+
var iface Interface
|
|
87
|
+
for _, candidate := range contract.Interfaces {
|
|
88
|
+
if candidate.Name == "BookingPort" {
|
|
89
|
+
iface = candidate
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if iface.Name != "BookingPort" || iface.PortType != "BookingPortType" || iface.Binding != "BookingBinding" || iface.Version != "1.2" || iface.Style != "document" || iface.Endpoint != "https://booking.example/soap" {
|
|
93
|
+
t.Fatalf("interface = %+v", iface)
|
|
94
|
+
}
|
|
95
|
+
if len(iface.Operations) != 1 {
|
|
96
|
+
t.Fatalf("operations = %+v", iface.Operations)
|
|
97
|
+
}
|
|
98
|
+
op := iface.Operations[0]
|
|
99
|
+
if op.Action != "urn:booking:cancel" || op.Request != "CancelRequestMessage" || op.Response != "CancelResponseMessage" || strings.Join(op.Faults, ",") != "BookingFault" || strings.Join(op.Headers, ",") != "BookingFault.reason" {
|
|
100
|
+
t.Fatalf("operation = %+v", op)
|
|
101
|
+
}
|
|
102
|
+
messages := map[string]Message{}
|
|
103
|
+
for _, message := range iface.Messages {
|
|
104
|
+
messages[message.Name] = message
|
|
105
|
+
}
|
|
106
|
+
request := messages["CancelRequestMessage"]
|
|
107
|
+
if len(request.Fields) != 2 || request.Fields[0].Name != "bookingId" || request.Fields[0].Type != "string" || request.Fields[1].Type != "string[]" {
|
|
108
|
+
t.Fatalf("request = %+v", request)
|
|
109
|
+
}
|
|
110
|
+
response := messages["CancelResponseMessage"]
|
|
111
|
+
if len(response.Fields) != 1 || response.Fields[0].Name != "accepted" || response.Fields[0].Type != "boolean" {
|
|
112
|
+
t.Fatalf("response = %+v", response)
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
func TestRemoteImportsAreWarningsAndNeverFetched(t *testing.T) {
|
|
117
|
+
root := t.TempDir()
|
|
118
|
+
writeFixture(t, root, "service.wsdl", `
|
|
119
|
+
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="urn:local">
|
|
120
|
+
<import namespace="urn:remote" location="https://example.invalid/remote.wsdl"/>
|
|
121
|
+
<portType name="Local"><operation name="Ping"/></portType>
|
|
122
|
+
</definitions>`)
|
|
123
|
+
result, err := Read(root, "service.wsdl")
|
|
124
|
+
if err != nil {
|
|
125
|
+
t.Fatal(err)
|
|
126
|
+
}
|
|
127
|
+
if len(result.Warnings) != 1 || !strings.Contains(result.Warnings[0], "remote import") {
|
|
128
|
+
t.Fatalf("warnings = %v", result.Warnings)
|
|
129
|
+
}
|
|
130
|
+
if len(result.Contracts) != 1 || len(result.Contracts[0].Interfaces) != 1 {
|
|
131
|
+
t.Fatalf("contracts = %+v", result.Contracts)
|
|
132
|
+
}
|
|
133
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@shortlink-org/portolan",
|
|
3
|
+
"description": "Generate a navigable architecture catalog from code and specifications.",
|
|
4
|
+
"private": false,
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"homepage": "https://github.com/shortlink-org/portolan#readme",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/shortlink-org/portolan.git"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/shortlink-org/portolan/issues"
|
|
15
|
+
},
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=24"
|
|
18
|
+
},
|
|
19
|
+
"bin": {
|
|
20
|
+
"portolan": "cli/portolan.mjs"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"cli",
|
|
24
|
+
"scripts",
|
|
25
|
+
"src",
|
|
26
|
+
"public",
|
|
27
|
+
"schema",
|
|
28
|
+
"plugins/*.wasm",
|
|
29
|
+
"plugins/*/*.go",
|
|
30
|
+
"plugins/*/*.py",
|
|
31
|
+
"plugins/*/*.ts",
|
|
32
|
+
"plugins/*/*.json",
|
|
33
|
+
"plugins/*/*.md",
|
|
34
|
+
"plugins/*/*.toml",
|
|
35
|
+
"plugins/*/*.lock",
|
|
36
|
+
"plugins/*/src",
|
|
37
|
+
"plugins/extract-java/build",
|
|
38
|
+
"plugin",
|
|
39
|
+
"catalog",
|
|
40
|
+
"internal",
|
|
41
|
+
"index.html",
|
|
42
|
+
"vite.config.ts",
|
|
43
|
+
"tsconfig.json",
|
|
44
|
+
"portolan.json",
|
|
45
|
+
"go.mod",
|
|
46
|
+
"go.sum",
|
|
47
|
+
"README.md",
|
|
48
|
+
"LICENSE"
|
|
49
|
+
],
|
|
50
|
+
"publishConfig": {
|
|
51
|
+
"access": "public",
|
|
52
|
+
"provenance": true
|
|
53
|
+
},
|
|
54
|
+
"scripts": {
|
|
55
|
+
"dev": "node cli/portolan.mjs dev",
|
|
56
|
+
"build": "node cli/portolan.mjs build",
|
|
57
|
+
"preview": "vite preview",
|
|
58
|
+
"test": "vitest run",
|
|
59
|
+
"test:go": "go test ./...",
|
|
60
|
+
"pretest:package": "npm run plugins:build",
|
|
61
|
+
"test:package": "node scripts/package-smoke.mjs",
|
|
62
|
+
"test:watch": "vitest",
|
|
63
|
+
"typecheck": "tsc --noEmit && tsc -p plugins/extract-ts",
|
|
64
|
+
"likec4:gen": "node scripts/gen-likec4.mjs && likec4 gen react likec4 -o src/likec4/generated.jsx",
|
|
65
|
+
"likec4:validate": "likec4 validate likec4",
|
|
66
|
+
"predev": "npm run likec4:gen",
|
|
67
|
+
"plugins:build": "GOOS=wasip1 GOARCH=wasm go build -o plugins/gen-markdown.wasm ./plugins/gen-markdown && GOOS=wasip1 GOARCH=wasm go build -o plugins/gen-mermaid.wasm ./plugins/gen-mermaid && GOOS=wasip1 GOARCH=wasm go build -o plugins/gen-backstage.wasm ./plugins/gen-backstage && javac --release 21 -d plugins/extract-java/build plugins/extract-java/src/org/portolan/extract/*.java",
|
|
68
|
+
"schema": "npm run plugins:build && node scripts/schema.mjs",
|
|
69
|
+
"schema:check": "npm run plugins:build && node scripts/schema.mjs --check",
|
|
70
|
+
"gen": "npm run plugins:build && node scripts/gen.mjs",
|
|
71
|
+
"gen:check": "npm run plugins:build && node scripts/gen.mjs --check",
|
|
72
|
+
"diff": "node scripts/diff.mjs",
|
|
73
|
+
"prepack": "npm run plugins:build"
|
|
74
|
+
},
|
|
75
|
+
"dependencies": {
|
|
76
|
+
"@tailwindcss/vite": "^4.0.0",
|
|
77
|
+
"@vitejs/plugin-react": "^6.1.1",
|
|
78
|
+
"@ai-sdk/openai-compatible": "3.0.44",
|
|
79
|
+
"@ai-sdk/react": "4.0.96",
|
|
80
|
+
"@asyncapi/react-component": "^3.1.8",
|
|
81
|
+
"@headlessui/react": "^2.2.10",
|
|
82
|
+
"@scalar/api-reference-react": "^0.9.66",
|
|
83
|
+
"@tanstack/react-query": "^5.102.8",
|
|
84
|
+
"@tanstack/react-table": "^9.2.4",
|
|
85
|
+
"@tanstack/react-virtual": "^3.14.10",
|
|
86
|
+
"@xyflow/react": "^12.11.5",
|
|
87
|
+
"ai": "7.0.93",
|
|
88
|
+
"ajv": "^8.20.0",
|
|
89
|
+
"elkjs": "^0.12.0",
|
|
90
|
+
"html-to-image": "^1.11.13",
|
|
91
|
+
"likec4": "^1.59.2",
|
|
92
|
+
"lowlight": "^3.3.0",
|
|
93
|
+
"lucide-react": "^1.38.0",
|
|
94
|
+
"mermaid": "^11.17.2",
|
|
95
|
+
"motion": "^13.2.0",
|
|
96
|
+
"oxc-parser": "^0.149.0",
|
|
97
|
+
"oxc-resolver": "^11.24.2",
|
|
98
|
+
"react": "^19.0.0",
|
|
99
|
+
"react-dom": "^19.0.0",
|
|
100
|
+
"react-markdown": "^10.1.0",
|
|
101
|
+
"react-resizable-panels": "^4.12.3",
|
|
102
|
+
"react-router": "^8.3.1",
|
|
103
|
+
"remark-gfm": "^4.0.0",
|
|
104
|
+
"simple-icons": "^16.30.0",
|
|
105
|
+
"tailwindcss": "^4.0.0",
|
|
106
|
+
"vite": "^8.2.2",
|
|
107
|
+
"vite-plugin-node-polyfills": "^0.28.0",
|
|
108
|
+
"zustand": "^5.0.15"
|
|
109
|
+
},
|
|
110
|
+
"devDependencies": {
|
|
111
|
+
"@types/node": "^26.4.0",
|
|
112
|
+
"@types/react": "^19.0.0",
|
|
113
|
+
"@types/react-dom": "^19.0.0",
|
|
114
|
+
"typescript": "^7.0.2",
|
|
115
|
+
"vitest": "^5.0.0"
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// Describing a plugin: what it is called, where it belongs in a run, and what
|
|
2
|
+
// it can be told.
|
|
3
|
+
//
|
|
4
|
+
// The options a plugin takes are facts the source does not carry - which
|
|
5
|
+
// bounded context a Go module belongs to, whose proto package a client calls.
|
|
6
|
+
// Only the plugin knows them, and until it could say so the manifest was a
|
|
7
|
+
// file you wrote by reading somebody's struct. A misspelled key was silently
|
|
8
|
+
// dropped, because that is what encoding/json does with a field it does not
|
|
9
|
+
// recognise.
|
|
10
|
+
//
|
|
11
|
+
// So a plugin answers a second question now. The schema it hands back is
|
|
12
|
+
// composed into schema/portolan.schema.json, which an editor reads while the
|
|
13
|
+
// manifest is being written and the host checks before it runs anything.
|
|
14
|
+
|
|
15
|
+
package plugin
|
|
16
|
+
|
|
17
|
+
import (
|
|
18
|
+
"encoding/json"
|
|
19
|
+
"fmt"
|
|
20
|
+
"io"
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
// KindDescribe asks a plugin what it is rather than asking it to work.
|
|
24
|
+
const KindDescribe = "describe"
|
|
25
|
+
|
|
26
|
+
// Phases a step can be declared under in the manifest. A plugin names the ones
|
|
27
|
+
// it belongs in, which is what stops the schema from offering an extractor
|
|
28
|
+
// where a renderer goes.
|
|
29
|
+
const (
|
|
30
|
+
PhaseExtract = "extract"
|
|
31
|
+
PhaseVerify = "verify"
|
|
32
|
+
PhaseGenerate = "generate"
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
// Descriptor is a plugin's answer to KindDescribe.
|
|
36
|
+
type Descriptor struct {
|
|
37
|
+
// Name is what the plugin calls itself. The manifest is free to declare it
|
|
38
|
+
// under another name - the schema is keyed by the declared one - so this is
|
|
39
|
+
// for the reader, not for lookup.
|
|
40
|
+
Name string `json:"name"`
|
|
41
|
+
|
|
42
|
+
// Summary is one line, and it is the line an editor shows beside the step.
|
|
43
|
+
Summary string `json:"summary,omitempty"`
|
|
44
|
+
|
|
45
|
+
// Phases are the manifest sections this plugin belongs in.
|
|
46
|
+
Phases []string `json:"phases"`
|
|
47
|
+
|
|
48
|
+
// Options is a JSON Schema for what the manifest may pass in `options`.
|
|
49
|
+
// It must close itself with `additionalProperties: false`: the misspelled
|
|
50
|
+
// key is the error worth catching, and a schema that accepts anything
|
|
51
|
+
// catches nothing.
|
|
52
|
+
Options json.RawMessage `json:"options,omitempty"`
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Serve reads one request and writes one response - the whole of a plugin's
|
|
56
|
+
// main, apart from the work itself.
|
|
57
|
+
//
|
|
58
|
+
// Every plugin had this loop written out, and each copy had to remember the
|
|
59
|
+
// describe branch once there was one. The options type is the only thing that
|
|
60
|
+
// differs, so it is the only thing the caller supplies.
|
|
61
|
+
func Serve[O any](stdin io.Reader, stdout io.Writer, d Descriptor, run func(Request, O) (Response, error)) error {
|
|
62
|
+
in, err := io.ReadAll(stdin)
|
|
63
|
+
if err != nil {
|
|
64
|
+
return fmt.Errorf("reading the request: %w", err)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
var req Request
|
|
68
|
+
if err := json.Unmarshal(in, &req); err != nil {
|
|
69
|
+
return fmt.Errorf("the request is not a portolan plugin request: %w", err)
|
|
70
|
+
}
|
|
71
|
+
if req.PortolanVersion != "" && req.PortolanVersion != Version {
|
|
72
|
+
return fmt.Errorf("unsupported portolan protocol %q (plugin supports %s)", req.PortolanVersion, Version)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
resp := Response{}
|
|
76
|
+
switch req.Kind {
|
|
77
|
+
case KindDescribe:
|
|
78
|
+
// Files is named rather than left nil because the host reads it on
|
|
79
|
+
// every response, and a describe that answers `"files": null` is a
|
|
80
|
+
// plugin that looks broken the first time anyone asks it anything.
|
|
81
|
+
resp = Response{Files: []File{}, Describe: &d}
|
|
82
|
+
case "":
|
|
83
|
+
var opts O
|
|
84
|
+
if len(req.Options) > 0 {
|
|
85
|
+
if err := json.Unmarshal(req.Options, &opts); err != nil {
|
|
86
|
+
return fmt.Errorf("options: %w", err)
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if resp, err = run(req, opts); err != nil {
|
|
91
|
+
return err
|
|
92
|
+
}
|
|
93
|
+
default:
|
|
94
|
+
return fmt.Errorf("unknown request kind %q", req.Kind)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
out, err := json.Marshal(resp)
|
|
98
|
+
if err != nil {
|
|
99
|
+
return fmt.Errorf("encoding the response: %w", err)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if _, err := stdout.Write(out); err != nil {
|
|
103
|
+
return fmt.Errorf("writing the response: %w", err)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return nil
|
|
107
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
package plugin_test
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"bytes"
|
|
5
|
+
"encoding/json"
|
|
6
|
+
"strings"
|
|
7
|
+
"testing"
|
|
8
|
+
|
|
9
|
+
"github.com/shortlink-org/portolan/plugin"
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
type options struct {
|
|
13
|
+
Context string `json:"context"`
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
func descriptor() plugin.Descriptor {
|
|
17
|
+
return plugin.Descriptor{
|
|
18
|
+
Name: "example",
|
|
19
|
+
Phases: []string{plugin.PhaseExtract},
|
|
20
|
+
Options: json.RawMessage(`{"type":"object","additionalProperties":false}`),
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
func TestServeDescribesWithoutWorking(t *testing.T) {
|
|
25
|
+
worked := false
|
|
26
|
+
out := &bytes.Buffer{}
|
|
27
|
+
|
|
28
|
+
err := plugin.Serve(strings.NewReader(`{"kind":"describe"}`), out, descriptor(),
|
|
29
|
+
func(plugin.Request, options) (plugin.Response, error) {
|
|
30
|
+
worked = true
|
|
31
|
+
|
|
32
|
+
return plugin.Response{}, nil
|
|
33
|
+
})
|
|
34
|
+
if err != nil {
|
|
35
|
+
t.Fatalf("describe: %v", err)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if worked {
|
|
39
|
+
t.Error("a describe ran the plugin, which is the one thing it must not do")
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
var resp plugin.Response
|
|
43
|
+
if err := json.Unmarshal(out.Bytes(), &resp); err != nil {
|
|
44
|
+
t.Fatalf("the answer is not a response: %v", err)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if resp.Describe == nil {
|
|
48
|
+
t.Fatal("a describe answered without a descriptor")
|
|
49
|
+
}
|
|
50
|
+
if resp.Describe.Name != "example" {
|
|
51
|
+
t.Errorf("descriptor names %q", resp.Describe.Name)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// The host reads files on every response, so a describe that answers null
|
|
55
|
+
// is a plugin that looks broken the first time anyone asks it anything.
|
|
56
|
+
if !strings.Contains(out.String(), `"files":[]`) {
|
|
57
|
+
t.Errorf("a describe answered %s, which has no files list", out)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
func TestServeReadsOptions(t *testing.T) {
|
|
62
|
+
var seen options
|
|
63
|
+
out := &bytes.Buffer{}
|
|
64
|
+
|
|
65
|
+
err := plugin.Serve(
|
|
66
|
+
strings.NewReader(`{"input":{"root":"examples/auth"},"options":{"context":"auth"}}`),
|
|
67
|
+
out, descriptor(),
|
|
68
|
+
func(req plugin.Request, opts options) (plugin.Response, error) {
|
|
69
|
+
seen = opts
|
|
70
|
+
|
|
71
|
+
return plugin.Response{Files: []plugin.File{{Name: req.Input.Root + ".json"}}}, nil
|
|
72
|
+
})
|
|
73
|
+
if err != nil {
|
|
74
|
+
t.Fatalf("run: %v", err)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if seen.Context != "auth" {
|
|
78
|
+
t.Errorf("options came through as %+v", seen)
|
|
79
|
+
}
|
|
80
|
+
if !strings.Contains(out.String(), "examples/auth.json") {
|
|
81
|
+
t.Errorf("the response is %s", out)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
func TestServeRefusesAnUnknownKind(t *testing.T) {
|
|
86
|
+
err := plugin.Serve(strings.NewReader(`{"kind":"explain"}`), &bytes.Buffer{}, descriptor(),
|
|
87
|
+
func(plugin.Request, options) (plugin.Response, error) {
|
|
88
|
+
return plugin.Response{}, nil
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
if err == nil || !strings.Contains(err.Error(), "explain") {
|
|
92
|
+
t.Errorf("an unknown kind gave %v", err)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
func TestServeRefusesAnIncompatibleProtocol(t *testing.T) {
|
|
97
|
+
err := plugin.Serve(strings.NewReader(`{"portolanVersion":"9.0.0","kind":"describe"}`), &bytes.Buffer{}, descriptor(),
|
|
98
|
+
func(plugin.Request, options) (plugin.Response, error) { return plugin.Response{}, nil })
|
|
99
|
+
if err == nil || !strings.Contains(err.Error(), "unsupported portolan protocol") {
|
|
100
|
+
t.Errorf("incompatible version gave %v", err)
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
func TestWarningsAreNotAResponseProperty(t *testing.T) {
|
|
105
|
+
b := &plugin.Builder{}
|
|
106
|
+
b.Warn("fixture", "not represented")
|
|
107
|
+
out, err := json.Marshal(b.Response())
|
|
108
|
+
if err != nil {
|
|
109
|
+
t.Fatal(err)
|
|
110
|
+
}
|
|
111
|
+
if strings.Contains(string(out), "diagnostics") || strings.Contains(string(out), "warning") {
|
|
112
|
+
t.Errorf("warning leaked into wire response: %s", out)
|
|
113
|
+
}
|
|
114
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// Package plugin is the wire contract between the host and a generator.
|
|
2
|
+
//
|
|
3
|
+
// One JSON message in, one JSON message out, and the same shape whichever
|
|
4
|
+
// direction the generator runs in: an extractor reads source and answers with
|
|
5
|
+
// a catalog fragment, a renderer reads the catalog and answers with pages.
|
|
6
|
+
// Both name files; neither writes them. The host does that, which is what lets
|
|
7
|
+
// a generator run as a wasm module with nothing preopened at all.
|
|
8
|
+
package plugin
|
|
9
|
+
|
|
10
|
+
import (
|
|
11
|
+
"encoding/json"
|
|
12
|
+
"fmt"
|
|
13
|
+
"os"
|
|
14
|
+
|
|
15
|
+
"github.com/shortlink-org/portolan/catalog"
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
const Version = "0.1.0"
|
|
19
|
+
|
|
20
|
+
// Request is everything a plugin is allowed to know. There is no ambient state
|
|
21
|
+
// to read, no environment, and - for a wasm plugin - no filesystem either.
|
|
22
|
+
type Request struct {
|
|
23
|
+
PortolanVersion string `json:"portolanVersion"`
|
|
24
|
+
|
|
25
|
+
// Kind is what the host is asking for. Empty - the only thing anyone sent
|
|
26
|
+
// before this field existed - means do the work. KindDescribe means answer
|
|
27
|
+
// with a Descriptor and read nothing: it is how the manifest schema is
|
|
28
|
+
// built, and it has to be cheap enough to run over every declared plugin.
|
|
29
|
+
Kind string `json:"kind,omitempty"`
|
|
30
|
+
|
|
31
|
+
// Catalog is the merged catalog, for a plugin that renders from it. An
|
|
32
|
+
// extractor is handed the zero value: it runs before there is one.
|
|
33
|
+
Catalog catalog.Catalog `json:"catalog"`
|
|
34
|
+
|
|
35
|
+
// Input is where a plugin that reads source should look. Empty for a
|
|
36
|
+
// renderer, which has no business touching the tree.
|
|
37
|
+
Input Input `json:"input"`
|
|
38
|
+
|
|
39
|
+
// Options belong to the plugin and are passed through from the manifest
|
|
40
|
+
// unread, so the host never has to know what any plugin can be told.
|
|
41
|
+
Options json.RawMessage `json:"options"`
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
type Input struct {
|
|
45
|
+
// Root is the directory to read, relative to the repository.
|
|
46
|
+
Root string `json:"root"`
|
|
47
|
+
|
|
48
|
+
// Output is the directory where the host will place the files returned by
|
|
49
|
+
// this plugin, relative to the repository. Extractors use it only when a
|
|
50
|
+
// catalog entry needs to point at a generated companion document.
|
|
51
|
+
Output string `json:"output,omitempty"`
|
|
52
|
+
|
|
53
|
+
// Commit and GeneratedAt stamp the fragment (portolan.0002). The host works them out - the
|
|
54
|
+
// last commit that touched Root, and its date - rather than the plugin
|
|
55
|
+
// reading a clock, because a fragment that changes on every run cannot be
|
|
56
|
+
// committed and cannot be checked. Stamped this way it changes exactly when
|
|
57
|
+
// the source it describes changes.
|
|
58
|
+
Commit string `json:"commit"`
|
|
59
|
+
GeneratedAt string `json:"generatedAt"`
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Response is what comes back.
|
|
63
|
+
//
|
|
64
|
+
// Files are named, not written (portolan.0001). The host rejects a name that climbs out of the
|
|
65
|
+
// output directory, and that rejection is the whole of a plugin's authority
|
|
66
|
+
// over the tree.
|
|
67
|
+
type Response struct {
|
|
68
|
+
Files []File `json:"files"`
|
|
69
|
+
warnings []Warning
|
|
70
|
+
|
|
71
|
+
// Describe answers KindDescribe and is absent otherwise. A plugin written
|
|
72
|
+
// against an older version of this protocol answers without it, which the
|
|
73
|
+
// host reports rather than treating as a plugin with no options.
|
|
74
|
+
Describe *Descriptor `json:"describe,omitempty"`
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
type File struct {
|
|
78
|
+
Name string `json:"name"`
|
|
79
|
+
Contents string `json:"contents"`
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Warning is an in-process extraction note. It is intentionally not serialized
|
|
83
|
+
// into Response: the wire contract has one decisive outcome, files or error.
|
|
84
|
+
type Warning struct {
|
|
85
|
+
Severity string `json:"severity"` // "warning" | "error"
|
|
86
|
+
Message string `json:"message"`
|
|
87
|
+
Ref string `json:"ref,omitempty"`
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Builder accumulates a response. Every plugin needs exactly this and nothing
|
|
91
|
+
// more, so it lives here rather than being written twice.
|
|
92
|
+
type Builder struct {
|
|
93
|
+
Files []File
|
|
94
|
+
Warnings []Warning
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
func (b *Builder) File(name, contents string) {
|
|
98
|
+
b.Files = append(b.Files, File{Name: name, Contents: contents})
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
func (b *Builder) Warn(ref, message string) {
|
|
102
|
+
b.Warnings = append(b.Warnings, Warning{Severity: "warning", Message: message, Ref: ref})
|
|
103
|
+
where := ""
|
|
104
|
+
if ref != "" {
|
|
105
|
+
where = ref + ": "
|
|
106
|
+
}
|
|
107
|
+
fmt.Fprintln(os.Stderr, "warning:", where+message)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
func (b *Builder) Response() Response {
|
|
111
|
+
return Response{Files: b.Files, warnings: b.Warnings}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Warnings exposes extraction notes to in-process tests and embedders. They
|
|
115
|
+
// are deliberately absent from the JSON protocol: a caller's result is files
|
|
116
|
+
// or an error, not files plus an advisory property nobody is required to act on.
|
|
117
|
+
func (r Response) Warnings() []Warning { return r.warnings }
|