@shortlink-org/portolan 0.1.0 → 0.2.1
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/README.md +69 -205
- package/cli/init.mjs +285 -0
- package/cli/init.test.mjs +158 -0
- package/cli/portolan.mjs +37 -73
- package/index.html +19 -0
- package/package.json +5 -10
- package/plugins/README.md +66 -27
- package/plugins/portolan-go.wasm +0 -0
- package/portolan.json +52 -73
- package/public/landing/cats/bug-hunter.webp +0 -0
- package/public/landing/cats/compass-nap.webp +0 -0
- package/public/landing/cats/diagrammer.webp +0 -0
- package/public/landing/cats/docs-reader.webp +0 -0
- package/public/landing/cats/laptop.webp +0 -0
- package/public/landing/cats/map-inspector.webp +0 -0
- package/public/landing/cats/server-break.webp +0 -0
- package/public/landing/cats/star-mapper.webp +0 -0
- package/public/landing/cats/system-builder.webp +0 -0
- package/public/landing/cats/thread-tangle.webp +0 -0
- package/public/og.png +0 -0
- package/public/readme-header.webp +0 -0
- package/schema/portolan.schema.json +180 -0
- package/scripts/builtin-plugins.mjs +14 -0
- package/scripts/delivery-presets.mjs +353 -0
- package/scripts/gen.mjs +37 -4
- package/scripts/history.mjs +126 -0
- package/scripts/history.test.mjs +110 -0
- package/scripts/host-plugins/fetch-bsr.mjs +351 -0
- package/{plugins/fetch-bsr/options.schema.json → scripts/host-plugins/fetch-bsr.options.json} +4 -0
- package/scripts/host-plugins/fetch-bsr.test.mjs +212 -0
- package/scripts/host-plugins/fetch-csr.mjs +386 -0
- package/scripts/host-plugins/fetch-csr.test.mjs +178 -0
- package/scripts/host-plugins/fetch-git.mjs +379 -0
- package/scripts/host-plugins/fetch-git.test.mjs +210 -0
- package/scripts/local-api.mjs +27 -10
- package/scripts/local-api.test.mjs +85 -2
- package/scripts/manifest.mjs +3 -2
- package/scripts/package-smoke.mjs +24 -3
- package/scripts/plugin-host.mjs +77 -18
- package/scripts/plugin-host.test.mjs +50 -1
- package/scripts/plugin-wasm-worker.mjs +6 -3
- package/scripts/run-builtin.mjs +6 -26
- package/scripts/schema.mjs +6 -1
- package/src/app/App.tsx +24 -429
- package/src/app/Breadcrumbs.test.ts +7 -0
- package/src/app/Breadcrumbs.tsx +15 -2
- package/src/app/CatalogApp.tsx +436 -0
- package/src/app/Sidebar.tsx +0 -1
- package/src/chat/ChatPanel.tsx +98 -41
- package/src/chat/Composer.tsx +4 -2
- package/src/chat/Conversation.tsx +79 -15
- package/src/chat/Header.tsx +43 -9
- package/src/chat/Starter.tsx +64 -3
- package/src/chat/Steps.tsx +1 -1
- package/src/chat/flags.test.ts +51 -14
- package/src/chat/flags.ts +8 -2
- package/src/chat/page-context.test.ts +51 -0
- package/src/chat/page-context.ts +128 -0
- package/src/chat/prompt.test.ts +49 -1
- package/src/chat/prompt.ts +42 -1
- package/src/chat/tools.ts +7 -2
- package/src/chat/transport.ts +16 -4
- package/src/components/ProblemRow.tsx +182 -0
- package/src/data.ts +20 -5
- package/src/er/ErCanvas.tsx +1 -1
- package/src/graph/DependencyGraph.tsx +10 -1
- package/src/graph/FocusedEventGraph.tsx +1 -1
- package/src/graph/GraphToolbar.tsx +2 -4
- package/src/index.css +220 -2
- package/src/landing/DraggableReveal.tsx +168 -0
- package/src/landing/EstateGraph.tsx +28 -0
- package/src/landing/FlowPlayback.tsx +282 -0
- package/src/landing/HeroMap.tsx +128 -0
- package/src/landing/LandingPage.tsx +757 -0
- package/src/landing/ProductFrame.tsx +68 -0
- package/src/landing/ProductTour.tsx +371 -0
- package/src/landing/catalog.ts +25 -0
- package/src/landing/motion.tsx +52 -0
- package/src/lib/all-problems.ts +28 -0
- package/src/lib/local-api.ts +35 -1
- package/src/lib/setup-info.test.ts +8 -0
- package/src/lib/setup-info.ts +3 -2
- package/src/lib/source-code.ts +2 -1
- package/src/likec4/C4View.tsx +5 -0
- package/src/likec4/InteractiveView.tsx +5 -1
- package/src/map/ContextMapGraph.tsx +47 -20
- package/src/pages/ContextMap.tsx +5 -1
- package/src/pages/FlowDetail.tsx +24 -7
- package/src/pages/Overview.tsx +68 -12
- package/src/pages/Problems.tsx +6 -193
- package/src/pages/Settings.tsx +133 -108
- package/src/pages/settings/DeliverySettings.tsx +229 -0
- package/src/pages/settings/PreferencesSettings.tsx +101 -0
- package/src/routes.test.ts +20 -0
- package/src/routes.ts +13 -1
- package/vite.config.ts +17 -9
- package/catalog/enum_test.go +0 -46
- package/catalog/model.go +0 -932
- package/catalog/roundtrip_test.go +0 -185
- package/catalog/via_test.go +0 -38
- package/go.mod +0 -14
- package/go.sum +0 -14
- package/internal/commands/cargo.go +0 -154
- package/internal/commands/commands.go +0 -143
- package/internal/commands/commands_test.go +0 -323
- package/internal/commands/gradle.go +0 -77
- package/internal/commands/justfile.go +0 -82
- package/internal/commands/makefile.go +0 -106
- package/internal/commands/maven.go +0 -93
- package/internal/commands/packagejson.go +0 -159
- package/internal/commands/pyproject.go +0 -169
- package/internal/commands/taskfile.go +0 -101
- package/internal/commands/testdata/estate/.cargo/config.toml +0 -7
- package/internal/commands/testdata/estate/Makefile +0 -33
- package/internal/commands/testdata/estate/Taskfile.yml +0 -21
- package/internal/commands/testdata/estate/build.gradle.kts +0 -21
- package/internal/commands/testdata/estate/justfile +0 -20
- package/internal/commands/testdata/estate/package.json +0 -13
- package/internal/commands/testdata/estate/pom.xml +0 -29
- package/internal/commands/testdata/estate/pyproject.toml +0 -27
- package/internal/commands/testdata/estate/xtask/src/main.rs +0 -27
- package/internal/commands/testdata/golden/commands.json +0 -305
- package/internal/gohttp/analyze.go +0 -2500
- package/internal/gohttp/endpoints.go +0 -1067
- package/internal/gohttp/roots.go +0 -320
- package/internal/gohttp/typed.go +0 -143
- package/internal/goscan/constants.go +0 -85
- package/internal/goscan/goscan_test.go +0 -227
- package/internal/goscan/names.go +0 -52
- package/internal/goscan/parse_test.go +0 -11
- package/internal/goscan/source.go +0 -36
- package/internal/goscan/tree.go +0 -155
- package/internal/goscan/types.go +0 -99
- package/internal/wsdl/ids.go +0 -127
- package/internal/wsdl/ids_test.go +0 -21
- package/internal/wsdl/model.go +0 -62
- package/internal/wsdl/parse.go +0 -920
- package/internal/wsdl/parse_test.go +0 -133
- package/plugin/describe.go +0 -107
- package/plugin/describe_test.go +0 -114
- package/plugin/protocol.go +0 -117
- package/plugin/schematest/schematest.go +0 -126
- package/plugins/extract-adr/describe.go +0 -19
- package/plugins/extract-adr/describe_test.go +0 -11
- package/plugins/extract-adr/extract.go +0 -153
- package/plugins/extract-adr/extract_test.go +0 -350
- package/plugins/extract-adr/history.go +0 -99
- package/plugins/extract-adr/main.go +0 -65
- package/plugins/extract-adr/parse.go +0 -642
- package/plugins/extract-adr/parse_test.go +0 -405
- package/plugins/extract-asyncapi/describe.go +0 -19
- package/plugins/extract-asyncapi/describe_test.go +0 -11
- package/plugins/extract-asyncapi/extract.go +0 -315
- package/plugins/extract-asyncapi/extract_test.go +0 -197
- package/plugins/extract-asyncapi/main.go +0 -48
- package/plugins/extract-asyncapi/spec.go +0 -151
- package/plugins/extract-commands/describe.go +0 -19
- package/plugins/extract-commands/describe_test.go +0 -11
- package/plugins/extract-commands/extract.go +0 -79
- package/plugins/extract-commands/extract_test.go +0 -92
- package/plugins/extract-commands/main.go +0 -55
- package/plugins/extract-csr/avro.go +0 -258
- package/plugins/extract-csr/describe.go +0 -19
- package/plugins/extract-csr/describe_test.go +0 -11
- package/plugins/extract-csr/extract.go +0 -338
- package/plugins/extract-csr/extract_test.go +0 -374
- package/plugins/extract-csr/jsonschema.go +0 -343
- package/plugins/extract-csr/lock.go +0 -25
- package/plugins/extract-csr/main.go +0 -84
- package/plugins/extract-csr/subject.go +0 -102
- package/plugins/extract-flows/describe.go +0 -19
- package/plugins/extract-flows/describe_test.go +0 -11
- package/plugins/extract-flows/extract.go +0 -91
- package/plugins/extract-flows/main.go +0 -45
- package/plugins/extract-flows/parse.go +0 -593
- package/plugins/extract-flows/parse_test.go +0 -204
- package/plugins/extract-glossary/describe.go +0 -19
- package/plugins/extract-glossary/describe_test.go +0 -11
- package/plugins/extract-glossary/extract.go +0 -115
- package/plugins/extract-glossary/extract_test.go +0 -220
- package/plugins/extract-glossary/main.go +0 -59
- package/plugins/extract-glossary/parse.go +0 -214
- package/plugins/extract-glossary/parse_test.go +0 -203
- package/plugins/extract-go/aggregate.go +0 -214
- package/plugins/extract-go/client.go +0 -409
- package/plugins/extract-go/client_test.go +0 -266
- package/plugins/extract-go/describe.go +0 -19
- package/plugins/extract-go/describe_test.go +0 -11
- package/plugins/extract-go/enum.go +0 -195
- package/plugins/extract-go/enum_test.go +0 -82
- package/plugins/extract-go/event.go +0 -99
- package/plugins/extract-go/extract.go +0 -191
- package/plugins/extract-go/extract_test.go +0 -261
- package/plugins/extract-go/flow.go +0 -1441
- package/plugins/extract-go/flow_test.go +0 -609
- package/plugins/extract-go/httpclient.go +0 -174
- package/plugins/extract-go/httpclient_test.go +0 -296
- package/plugins/extract-go/ids.go +0 -92
- package/plugins/extract-go/layout.go +0 -225
- package/plugins/extract-go/layout_test.go +0 -125
- package/plugins/extract-go/lifecycle.go +0 -324
- package/plugins/extract-go/lifecycle_test.go +0 -108
- package/plugins/extract-go/main.go +0 -79
- package/plugins/extract-go/operation.go +0 -157
- package/plugins/extract-go/source.go +0 -316
- package/plugins/extract-go/transport.go +0 -321
- package/plugins/extract-go/transport_test.go +0 -145
- package/plugins/extract-go/wiring.go +0 -434
- package/plugins/extract-go-nats/describe.go +0 -19
- package/plugins/extract-go-nats/describe_test.go +0 -11
- package/plugins/extract-go-nats/extract.go +0 -177
- package/plugins/extract-go-nats/extract_test.go +0 -389
- package/plugins/extract-go-nats/index.go +0 -379
- package/plugins/extract-go-nats/main.go +0 -42
- package/plugins/extract-go-nats/resolve.go +0 -161
- package/plugins/extract-go-nats/sites.go +0 -224
- package/plugins/extract-graphql/describe.go +0 -19
- package/plugins/extract-graphql/describe_test.go +0 -11
- package/plugins/extract-graphql/extract.go +0 -433
- package/plugins/extract-graphql/extract_test.go +0 -256
- package/plugins/extract-graphql/ids.go +0 -49
- package/plugins/extract-graphql/lex.go +0 -237
- package/plugins/extract-graphql/main.go +0 -51
- package/plugins/extract-graphql/parse.go +0 -621
- package/plugins/extract-graphql/parse_test.go +0 -122
- package/plugins/extract-http-clients/describe.go +0 -19
- package/plugins/extract-http-clients/describe_test.go +0 -11
- package/plugins/extract-http-clients/extract.go +0 -705
- package/plugins/extract-http-clients/extract_test.go +0 -1263
- package/plugins/extract-http-clients/main.go +0 -42
- package/plugins/extract-openapi/describe.go +0 -19
- package/plugins/extract-openapi/describe_test.go +0 -11
- package/plugins/extract-openapi/discover.go +0 -243
- package/plugins/extract-openapi/extract.go +0 -526
- package/plugins/extract-openapi/extract_test.go +0 -545
- package/plugins/extract-openapi/main.go +0 -75
- package/plugins/extract-openapi/spec.go +0 -350
- package/plugins/extract-project/describe.go +0 -19
- package/plugins/extract-project/describe_test.go +0 -11
- package/plugins/extract-project/extract.go +0 -221
- package/plugins/extract-project/extract_test.go +0 -109
- package/plugins/extract-project/main.go +0 -41
- package/plugins/extract-proto/ast.go +0 -125
- package/plugins/extract-proto/consumes.go +0 -77
- package/plugins/extract-proto/describe.go +0 -19
- package/plugins/extract-proto/extract.go +0 -293
- package/plugins/extract-proto/extract_test.go +0 -459
- package/plugins/extract-proto/ids.go +0 -89
- package/plugins/extract-proto/ids_test.go +0 -57
- package/plugins/extract-proto/lex.go +0 -285
- package/plugins/extract-proto/main.go +0 -100
- package/plugins/extract-proto/module.go +0 -120
- package/plugins/extract-proto/parse.go +0 -720
- package/plugins/extract-proto/parse_test.go +0 -307
- package/plugins/extract-proto/provides.go +0 -236
- package/plugins/extract-proto/resolve.go +0 -222
- package/plugins/extract-proto/resolve_test.go +0 -119
- package/plugins/extract-redis/describe.go +0 -19
- package/plugins/extract-redis/describe_test.go +0 -11
- package/plugins/extract-redis/extract.go +0 -183
- package/plugins/extract-redis/extract_test.go +0 -168
- package/plugins/extract-redis/keyspaces.go +0 -469
- package/plugins/extract-redis/main.go +0 -44
- package/plugins/extract-river/describe.go +0 -19
- package/plugins/extract-river/describe_test.go +0 -11
- package/plugins/extract-river/extract.go +0 -507
- package/plugins/extract-river/extract_test.go +0 -132
- package/plugins/extract-river/main.go +0 -42
- package/plugins/extract-sql/ddl.go +0 -893
- package/plugins/extract-sql/ddl_test.go +0 -401
- package/plugins/extract-sql/describe.go +0 -19
- package/plugins/extract-sql/describe_test.go +0 -11
- package/plugins/extract-sql/layout.go +0 -221
- package/plugins/extract-sql/layout_test.go +0 -55
- package/plugins/extract-sql/lineage.go +0 -107
- package/plugins/extract-sql/main.go +0 -141
- package/plugins/extract-sql/maps.go +0 -564
- package/plugins/extract-sql/maps_java.go +0 -117
- package/plugins/extract-sql/maps_rust.go +0 -333
- package/plugins/extract-sql/maps_rust_test.go +0 -70
- package/plugins/extract-sql/maps_test.go +0 -204
- package/plugins/extract-sql/maps_ts.go +0 -398
- package/plugins/extract-sql/maps_ts_test.go +0 -136
- package/plugins/extract-sql/projection.go +0 -70
- package/plugins/extract-sql/projection_test.go +0 -50
- package/plugins/extract-sql/store.go +0 -420
- package/plugins/extract-sql/store_test.go +0 -233
- package/plugins/extract-sql/view.go +0 -295
- package/plugins/extract-watermill/describe.go +0 -19
- package/plugins/extract-watermill/describe_test.go +0 -11
- package/plugins/extract-watermill/extract.go +0 -1228
- package/plugins/extract-watermill/extract_test.go +0 -234
- package/plugins/extract-watermill/main.go +0 -41
- package/plugins/extract-wsdl/describe.go +0 -19
- package/plugins/extract-wsdl/describe_test.go +0 -11
- package/plugins/extract-wsdl/extract.go +0 -148
- package/plugins/extract-wsdl/extract_test.go +0 -45
- package/plugins/extract-wsdl/main.go +0 -53
- package/plugins/fetch-bsr/auth.go +0 -114
- package/plugins/fetch-bsr/bsr.go +0 -240
- package/plugins/fetch-bsr/cache.go +0 -66
- package/plugins/fetch-bsr/describe.go +0 -19
- package/plugins/fetch-bsr/fetch.go +0 -192
- package/plugins/fetch-bsr/fetch_test.go +0 -465
- package/plugins/fetch-bsr/lock.go +0 -71
- package/plugins/fetch-bsr/main.go +0 -117
- package/plugins/fetch-csr/auth.go +0 -95
- package/plugins/fetch-csr/cache.go +0 -69
- package/plugins/fetch-csr/describe.go +0 -19
- package/plugins/fetch-csr/describe_test.go +0 -11
- package/plugins/fetch-csr/fetch.go +0 -254
- package/plugins/fetch-csr/fetch_test.go +0 -494
- package/plugins/fetch-csr/lock.go +0 -95
- package/plugins/fetch-csr/main.go +0 -122
- package/plugins/fetch-csr/registry.go +0 -209
- package/plugins/fetch-git/cache.go +0 -65
- package/plugins/fetch-git/describe.go +0 -19
- package/plugins/fetch-git/describe_test.go +0 -11
- package/plugins/fetch-git/fetch.go +0 -181
- package/plugins/fetch-git/fetch_test.go +0 -332
- package/plugins/fetch-git/git.go +0 -169
- package/plugins/fetch-git/lock.go +0 -72
- package/plugins/fetch-git/main.go +0 -127
- package/plugins/fetch-git/offline.go +0 -39
- package/plugins/fetch-git/pin.go +0 -90
- package/plugins/fetch-git/pin_test.go +0 -74
- package/plugins/gen-backstage/describe.go +0 -17
- package/plugins/gen-backstage/main.go +0 -22
- package/plugins/gen-backstage/plugin.go +0 -473
- package/plugins/gen-backstage/plugin_test.go +0 -145
- package/plugins/gen-backstage.wasm +0 -0
- package/plugins/gen-markdown/adr.go +0 -162
- package/plugins/gen-markdown/aggregate.go +0 -362
- package/plugins/gen-markdown/canonical.go +0 -93
- package/plugins/gen-markdown/context.go +0 -90
- package/plugins/gen-markdown/coverage_test.go +0 -89
- package/plugins/gen-markdown/describe.go +0 -19
- package/plugins/gen-markdown/describe_test.go +0 -11
- package/plugins/gen-markdown/external.go +0 -71
- package/plugins/gen-markdown/flow.go +0 -277
- package/plugins/gen-markdown/glossary.go +0 -76
- package/plugins/gen-markdown/glossary_test.go +0 -148
- package/plugins/gen-markdown/llms.go +0 -302
- package/plugins/gen-markdown/main.go +0 -22
- package/plugins/gen-markdown/markdown.go +0 -254
- package/plugins/gen-markdown/markdown_test.go +0 -100
- package/plugins/gen-markdown/module.go +0 -107
- package/plugins/gen-markdown/plugin.go +0 -39
- package/plugins/gen-markdown/quality_test.go +0 -176
- package/plugins/gen-markdown/redis_test.go +0 -38
- package/plugins/gen-markdown/render.go +0 -344
- package/plugins/gen-markdown/render_test.go +0 -186
- package/plugins/gen-markdown/service.go +0 -456
- package/plugins/gen-markdown/source.go +0 -177
- package/plugins/gen-markdown/store.go +0 -201
- package/plugins/gen-markdown.wasm +0 -0
- package/plugins/gen-mermaid/describe.go +0 -17
- package/plugins/gen-mermaid/main.go +0 -22
- package/plugins/gen-mermaid/plugin.go +0 -104
- package/plugins/gen-mermaid/plugin_test.go +0 -33
- package/plugins/gen-mermaid.wasm +0 -0
- package/plugins/openapi/ids.go +0 -261
- package/plugins/openapi/ids_test.go +0 -98
- package/plugins/verify-codeowners/describe.go +0 -19
- package/plugins/verify-codeowners/describe_test.go +0 -11
- package/plugins/verify-codeowners/main.go +0 -75
- package/plugins/verify-codeowners/match.go +0 -85
- package/plugins/verify-codeowners/match_test.go +0 -47
- package/plugins/verify-codeowners/owners.go +0 -164
- package/plugins/verify-codeowners/owners_test.go +0 -225
- package/plugins/verify-codeowners/parse.go +0 -90
- package/plugins/verify-codeowners/parse_test.go +0 -62
- package/plugins/verify-otel/describe.go +0 -19
- package/plugins/verify-otel/describe_test.go +0 -11
- package/plugins/verify-otel/main.go +0 -53
- package/plugins/verify-otel/match.go +0 -336
- package/plugins/verify-otel/otlp.go +0 -200
- package/plugins/verify-otel/verify.go +0 -734
- package/plugins/verify-otel/verify_test.go +0 -460
- /package/{plugins/fetch-csr/options.schema.json → scripts/host-plugins/fetch-csr.options.json} +0 -0
- /package/{plugins/fetch-git/options.schema.json → scripts/host-plugins/fetch-git.options.json} +0 -0
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
package main
|
|
2
|
-
|
|
3
|
-
// The only file that reads the environment, and it reads two switches.
|
|
4
|
-
//
|
|
5
|
-
// The plugin protocol says a plugin has no ambient state to read. That rule is
|
|
6
|
-
// about facts: nothing about the estate may come from anywhere but the
|
|
7
|
-
// request. Whether to open a socket is not a fact about the estate; it decides
|
|
8
|
-
// whether the fetch happens, never what the fetch says, and a test asserts the
|
|
9
|
-
// output is byte-identical either way.
|
|
10
|
-
//
|
|
11
|
-
// What git needs to reach a private forge - a credential helper, a netrc
|
|
12
|
-
// entry, an ssh agent - is git's own configuration, and this plugin neither
|
|
13
|
-
// reads nor passes any of it. That is also why it can never be wasm: it needs
|
|
14
|
-
// a subprocess and a socket.
|
|
15
|
-
|
|
16
|
-
import (
|
|
17
|
-
"os"
|
|
18
|
-
"strings"
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
// OfflineEnv turns the fetch off. Explicit, rather than inferred from a socket
|
|
22
|
-
// timeout: CI sets it in one line, and a build that would otherwise depend on
|
|
23
|
-
// the forge being up cannot silently start doing so again.
|
|
24
|
-
const OfflineEnv = "PORTOLAN_OFFLINE"
|
|
25
|
-
|
|
26
|
-
func offline() bool {
|
|
27
|
-
if strings.TrimSpace(os.Getenv(OfflineEnv)) != "" {
|
|
28
|
-
return true
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// CI verifies what was committed. It never needs to reach the forge, and a
|
|
32
|
-
// fork's pull request has no credential to reach it with.
|
|
33
|
-
switch strings.ToLower(strings.TrimSpace(os.Getenv("CI"))) {
|
|
34
|
-
case "", "0", "false":
|
|
35
|
-
return false
|
|
36
|
-
default:
|
|
37
|
-
return true
|
|
38
|
-
}
|
|
39
|
-
}
|
package/plugins/fetch-git/pin.go
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
package main
|
|
2
|
-
|
|
3
|
-
// The fragment that says where the copy came from.
|
|
4
|
-
//
|
|
5
|
-
// The lock beside it already names the commit, but a lock is a check and not a
|
|
6
|
-
// fact anybody reads: nothing loads it, and by the time a page wants to link a
|
|
7
|
-
// source line of a vendored service, the only thing left is a repository name
|
|
8
|
-
// with no commit against it. So the same answer is written twice, in two
|
|
9
|
-
// shapes, for two readers - `git.lock.json` for the next run of this step, and
|
|
10
|
-
// a one-line catalog fragment for the estate.
|
|
11
|
-
//
|
|
12
|
-
// It is a fragment rather than a field the extractor fills in because the
|
|
13
|
-
// extractor does not know: it is handed a directory and reads it as a pure
|
|
14
|
-
// function of what is on disk, which is the whole reason fetching is a
|
|
15
|
-
// separate step. What fetched it knows, so what fetched it says so.
|
|
16
|
-
|
|
17
|
-
import (
|
|
18
|
-
"encoding/json"
|
|
19
|
-
"path"
|
|
20
|
-
"strings"
|
|
21
|
-
|
|
22
|
-
"github.com/shortlink-org/portolan/catalog"
|
|
23
|
-
"github.com/shortlink-org/portolan/plugin"
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
// PinName is the fragment written beside each repository's copy. It is named
|
|
27
|
-
// after the lock it sits next to, so a directory listing reads as one thing
|
|
28
|
-
// the fetch wrote rather than two unrelated files.
|
|
29
|
-
const PinName = "git.repo.json"
|
|
30
|
-
|
|
31
|
-
// webRepo is the repository as `Service.repo` spells it - host/owner/name, the
|
|
32
|
-
// way go.mod writes it - whatever spelling the manifest used.
|
|
33
|
-
//
|
|
34
|
-
// The lock keeps what the manifest said, because a lock is about the fetch. The
|
|
35
|
-
// fragment cannot: it is matched against a service's `repo`, and a service read
|
|
36
|
-
// out of a Go module has no idea whether whoever vendored it typed an ssh URL.
|
|
37
|
-
func webRepo(name string) string {
|
|
38
|
-
name = strings.TrimSpace(name)
|
|
39
|
-
|
|
40
|
-
switch {
|
|
41
|
-
case strings.HasPrefix(name, "git@"):
|
|
42
|
-
// git@host:owner/name -> host/owner/name
|
|
43
|
-
host, where, _ := strings.Cut(strings.TrimPrefix(name, "git@"), ":")
|
|
44
|
-
name = host + "/" + where
|
|
45
|
-
case strings.Contains(name, "://"):
|
|
46
|
-
_, name, _ = strings.Cut(name, "://")
|
|
47
|
-
// A URL may carry a user: https://git@host/owner/name.
|
|
48
|
-
if _, after, found := strings.Cut(name, "@"); found {
|
|
49
|
-
name = after
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return strings.TrimSuffix(strings.Trim(name, "/"), ".git")
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// pin encodes the fragment for one repository at one commit.
|
|
57
|
-
//
|
|
58
|
-
// The empty lists are not noise: a source is a catalog, and a merge that had to
|
|
59
|
-
// tell "no contexts" from "not a catalog" would be reading a shape rather than
|
|
60
|
-
// a value. Written the way every generated file in this repository is written,
|
|
61
|
-
// so `gen:check` compares it and never rewrites it.
|
|
62
|
-
func pin(repo, commit string) (string, error) {
|
|
63
|
-
fragment := catalog.Catalog{
|
|
64
|
-
Contexts: []catalog.BoundedContext{},
|
|
65
|
-
Defs: map[string]catalog.TypeDef{},
|
|
66
|
-
Flows: []catalog.Flow{},
|
|
67
|
-
Adrs: []catalog.Adr{},
|
|
68
|
-
Repos: []catalog.RepoPin{{Repo: webRepo(repo), Commit: commit}},
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
out, err := json.MarshalIndent(fragment, "", " ")
|
|
72
|
-
if err != nil {
|
|
73
|
-
return "", err
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return string(out) + "\n", nil
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// emitPin writes the fragment into the repository's own directory, beside the
|
|
80
|
-
// lock, so a vendored copy stays self-describing: the files, the statement of
|
|
81
|
-
// where they came from, and the one fact the catalog needs out of it.
|
|
82
|
-
func emitPin(b *plugin.Builder, dir, repo, commit string) error {
|
|
83
|
-
fragment, err := pin(repo, commit)
|
|
84
|
-
if err != nil {
|
|
85
|
-
return err
|
|
86
|
-
}
|
|
87
|
-
b.File(path.Join(dir, PinName), fragment)
|
|
88
|
-
|
|
89
|
-
return nil
|
|
90
|
-
}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
package main
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"encoding/json"
|
|
5
|
-
"testing"
|
|
6
|
-
|
|
7
|
-
"github.com/shortlink-org/portolan/catalog"
|
|
8
|
-
)
|
|
9
|
-
|
|
10
|
-
// A pin is matched against a service's `repo`, which is however go.mod spells
|
|
11
|
-
// it. Whoever wrote the manifest may have spelled the same repository four
|
|
12
|
-
// other ways, and all five have to arrive at one string or the link is not
|
|
13
|
-
// built.
|
|
14
|
-
func TestWebRepoIsHowGoModSpellsIt(t *testing.T) {
|
|
15
|
-
const want = "github.com/acme/shop"
|
|
16
|
-
|
|
17
|
-
for _, spelling := range []string{
|
|
18
|
-
"github.com/acme/shop",
|
|
19
|
-
"github.com/acme/shop/",
|
|
20
|
-
"github.com/acme/shop.git",
|
|
21
|
-
"https://github.com/acme/shop",
|
|
22
|
-
"https://github.com/acme/shop.git",
|
|
23
|
-
"ssh://git@github.com/acme/shop.git",
|
|
24
|
-
"git@github.com:acme/shop.git",
|
|
25
|
-
" github.com/acme/shop ",
|
|
26
|
-
} {
|
|
27
|
-
if got := webRepo(spelling); got != want {
|
|
28
|
-
t.Errorf("webRepo(%q) = %q, want %q", spelling, got, want)
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// The fragment has to survive the round trip through the mirror, because that
|
|
34
|
-
// is the only thing that reads it: a shape the catalog does not recognise is a
|
|
35
|
-
// file the host writes, commits and never uses.
|
|
36
|
-
func TestPinIsACatalogWithOneRepo(t *testing.T) {
|
|
37
|
-
out, err := pin("git@github.com:acme/shop.git", "c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0")
|
|
38
|
-
if err != nil {
|
|
39
|
-
t.Fatal(err)
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
var parsed catalog.Catalog
|
|
43
|
-
if err := json.Unmarshal([]byte(out), &parsed); err != nil {
|
|
44
|
-
t.Fatalf("fragment is not a catalog: %v", err)
|
|
45
|
-
}
|
|
46
|
-
if len(parsed.Repos) != 1 {
|
|
47
|
-
t.Fatalf("repos = %+v, want one", parsed.Repos)
|
|
48
|
-
}
|
|
49
|
-
if parsed.Repos[0].Repo != "github.com/acme/shop" {
|
|
50
|
-
t.Errorf("repo = %q", parsed.Repos[0].Repo)
|
|
51
|
-
}
|
|
52
|
-
if parsed.Repos[0].Commit != "c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0" {
|
|
53
|
-
t.Errorf("commit = %q", parsed.Repos[0].Commit)
|
|
54
|
-
}
|
|
55
|
-
if out[len(out)-1] != '\n' {
|
|
56
|
-
t.Error("fragment does not end in a newline, like every other generated file here")
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Determinism, the second of the three obligations: the same fetch writes the
|
|
61
|
-
// same bytes, or `gen:check` reports drift on a run that changed nothing.
|
|
62
|
-
func TestPinIsStable(t *testing.T) {
|
|
63
|
-
first, err := pin("github.com/acme/shop", "c1d2e3f")
|
|
64
|
-
if err != nil {
|
|
65
|
-
t.Fatal(err)
|
|
66
|
-
}
|
|
67
|
-
second, err := pin("github.com/acme/shop", "c1d2e3f")
|
|
68
|
-
if err != nil {
|
|
69
|
-
t.Fatal(err)
|
|
70
|
-
}
|
|
71
|
-
if first != second {
|
|
72
|
-
t.Errorf("two runs wrote different bytes:\n%s\n%s", first, second)
|
|
73
|
-
}
|
|
74
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
package main
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
_ "embed"
|
|
5
|
-
|
|
6
|
-
"github.com/shortlink-org/portolan/plugin"
|
|
7
|
-
)
|
|
8
|
-
|
|
9
|
-
//go:embed options.schema.json
|
|
10
|
-
var optionsSchema []byte
|
|
11
|
-
|
|
12
|
-
func descriptor() plugin.Descriptor {
|
|
13
|
-
return plugin.Descriptor{
|
|
14
|
-
Name: "gen-backstage", Summary: "Exports contexts, services, APIs, stores and schema modules as a Backstage catalog.",
|
|
15
|
-
Phases: []string{plugin.PhaseGenerate}, Options: optionsSchema,
|
|
16
|
-
}
|
|
17
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
package main
|
|
2
|
-
|
|
3
|
-
import (
|
|
4
|
-
"fmt"
|
|
5
|
-
"io"
|
|
6
|
-
"os"
|
|
7
|
-
|
|
8
|
-
"github.com/shortlink-org/portolan/plugin"
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
func main() {
|
|
12
|
-
if err := run(os.Stdin, os.Stdout); err != nil {
|
|
13
|
-
fmt.Fprintln(os.Stderr, "portolan-gen-backstage:", err)
|
|
14
|
-
os.Exit(1)
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
func run(stdin io.Reader, stdout io.Writer) error {
|
|
19
|
-
return plugin.Serve(stdin, stdout, descriptor(), func(req plugin.Request, opts Options) (plugin.Response, error) {
|
|
20
|
-
return render(req, opts)
|
|
21
|
-
})
|
|
22
|
-
}
|