@shortlink-org/portolan 0.3.0 → 0.4.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/README.md +151 -6
- package/catalog/model.go +147 -0
- package/catalog/roundtrip_test.go +7 -0
- package/cli/portolan.mjs +6 -1
- package/go.mod +7 -0
- package/go.sum +20 -6
- package/package.json +10 -9
- package/plugin/describe.go +38 -0
- package/plugins/README.md +296 -5
- package/plugins/extract-argocd/options.schema.json +44 -0
- package/plugins/extract-celery/main.py +1 -0
- package/plugins/extract-csharp-ddd/README.md +213 -0
- package/plugins/extract-csharp-ddd/options.schema.json +55 -0
- package/plugins/extract-django/README.md +13 -2
- package/plugins/extract-django/choices.py +47 -0
- package/plugins/extract-django/domain.py +2 -1
- package/plugins/extract-django/extract_test.py +13 -0
- package/plugins/extract-django/lifecycle.py +2 -28
- package/plugins/extract-django/main.py +1 -0
- package/plugins/extract-django/rules.py +154 -0
- package/plugins/extract-django/rules_test.py +158 -0
- package/plugins/extract-go-sqs/options.schema.json +21 -0
- package/plugins/extract-http-clients/describe.go +5 -4
- package/plugins/extract-java/build/org/portolan/extract/Main.class +0 -0
- package/plugins/extract-k8s/options.schema.json +32 -0
- package/plugins/extract-laravel/Cargo.lock +962 -0
- package/plugins/extract-laravel/Cargo.toml +20 -0
- package/plugins/extract-laravel/README.md +200 -0
- package/plugins/extract-laravel/options.schema.json +68 -0
- package/plugins/extract-laravel/rustfmt.toml +1 -0
- package/plugins/extract-php-ddd/Cargo.lock +972 -0
- package/plugins/extract-php-ddd/Cargo.toml +22 -0
- package/plugins/extract-php-ddd/README.md +141 -0
- package/plugins/extract-php-ddd/options.schema.json +50 -0
- package/plugins/extract-php-ddd/rustfmt.toml +1 -0
- package/plugins/extract-python-kafka/main.py +1 -0
- package/plugins/extract-terraform/options.schema.json +26 -0
- package/plugins/extract-ts/main.ts +1 -0
- package/plugins/phpscan/Cargo.lock +953 -0
- package/plugins/phpscan/Cargo.toml +19 -0
- package/plugins/phpscan/rustfmt.toml +1 -0
- package/plugins/portolan-go.wasm +0 -0
- package/plugins/pyplugin/catalog.py +24 -1
- package/plugins/verify-otel/options.schema.json +12 -0
- package/portolan.json +130 -3
- package/rules/builtin.json +218 -0
- package/schema/portolan.schema.json +880 -13
- package/scripts/README.md +3 -1
- package/scripts/delivery-presets.mjs +36 -3
- package/scripts/gen-likec4.mjs +149 -16
- package/scripts/gen-likec4.test.mjs +96 -0
- package/scripts/gen.mjs +30 -3
- package/scripts/gitops-example.test.mjs +108 -0
- package/scripts/host-plugins/fetch-argocd.mjs +338 -0
- package/scripts/host-plugins/fetch-argocd.options.json +49 -0
- package/scripts/host-plugins/fetch-argocd.test.mjs +274 -0
- package/scripts/host-plugins/fetch-bsr.mjs +1 -0
- package/scripts/host-plugins/fetch-csr.mjs +1 -0
- package/scripts/host-plugins/fetch-git.mjs +1 -0
- package/scripts/host-plugins/fetch-k8s.mjs +263 -0
- package/scripts/host-plugins/fetch-k8s.options.json +50 -0
- package/scripts/host-plugins/fetch-k8s.test.mjs +259 -0
- package/scripts/host-plugins/k8s-topology.mjs +183 -0
- package/scripts/json-format.mjs +192 -0
- package/scripts/json-format.test.mjs +97 -0
- package/scripts/local-api.mjs +216 -8
- package/scripts/local-api.test.mjs +88 -2
- package/scripts/local-discovery.mjs +12 -0
- package/scripts/manifest.mjs +10 -1
- package/scripts/plugin-host.mjs +23 -1
- package/scripts/plugins-fresh.mjs +97 -0
- package/scripts/plugins-fresh.test.mjs +64 -0
- package/scripts/run-builtin.mjs +26 -5
- package/scripts/schema.mjs +138 -19
- package/scripts/trace-trials.mjs +176 -0
- package/scripts/trace-trials.test.mjs +142 -0
- package/scripts/warning-policy.mjs +12 -6
- package/scripts/warning-policy.test.mjs +40 -3
- package/src/app/Breadcrumbs.test.ts +3 -0
- package/src/app/Breadcrumbs.tsx +3 -0
- package/src/app/CatalogApp.tsx +2 -0
- package/src/app/SidebarFooter.tsx +20 -4
- package/src/catalog-index.ts +25 -0
- package/src/catalog-model.ts +246 -1
- package/src/catalog-validation.ts +104 -2
- package/src/catalog.test.ts +40 -1
- package/src/components/ChannelRows.test.tsx +76 -1
- package/src/components/ChannelRows.tsx +223 -60
- package/src/components/DeploymentRows.tsx +131 -0
- package/src/components/DocsLinks.test.tsx +27 -0
- package/src/components/DocsLinks.tsx +56 -0
- package/src/components/FieldTree.tsx +5 -2
- package/src/components/HTTPDestinationEvidence.tsx +1 -1
- package/src/components/PluginIcon.tsx +77 -0
- package/src/components/ProblemRow.tsx +173 -153
- package/src/components/RuleMarks.tsx +22 -0
- package/src/components/ShapeRows.tsx +24 -20
- package/src/data.ts +21 -0
- package/src/enrich.test.ts +127 -3
- package/src/enrich.ts +104 -6
- package/src/er/ErCanvas.tsx +218 -12
- package/src/er/GroupNode.tsx +57 -0
- package/src/er/StoreHeader.tsx +1 -0
- package/src/er/layout.test.ts +85 -2
- package/src/er/layout.ts +140 -5
- package/src/er/spec.test.ts +17 -0
- package/src/er/spec.ts +23 -10
- package/src/flow/Recordings.test.tsx +52 -0
- package/src/flow/Recordings.tsx +236 -0
- package/src/flow/StepDetail.tsx +53 -0
- package/src/flow/TraceTrial.tsx +419 -0
- package/src/flow/examples.test.ts +33 -0
- package/src/flow/examples.ts +37 -0
- package/src/flow/outline.test.ts +28 -0
- package/src/flow/outline.ts +7 -2
- package/src/flow/trace-trial-resume.test.ts +42 -0
- package/src/flow/trace-trial-resume.ts +74 -0
- package/src/graph/elk.ts +78 -0
- package/src/index.css +24 -0
- package/src/landing/LandingPage.tsx +15 -11
- package/src/landing/ProductTour.tsx +6 -6
- package/src/lib/all-problems.ts +27 -17
- package/src/lib/centrality.test.ts +251 -0
- package/src/lib/centrality.ts +232 -0
- package/src/lib/confluence.test.ts +37 -0
- package/src/lib/confluence.ts +41 -0
- package/src/lib/context-color.ts +1 -1
- package/src/lib/deployment-drift.ts +22 -0
- package/src/lib/derive.ts +43 -69
- package/src/lib/environments.test.ts +83 -0
- package/src/lib/environments.ts +57 -0
- package/src/lib/integration-url.test.ts +30 -0
- package/src/lib/integration-url.ts +63 -0
- package/src/lib/kafka-ui.ts +3 -45
- package/src/lib/local-api.ts +96 -2
- package/src/lib/notion.ts +13 -0
- package/src/lib/plugin-index.json +2765 -0
- package/src/lib/plugins.test.ts +68 -0
- package/src/lib/plugins.ts +264 -0
- package/src/lib/problem-flows.test.ts +61 -0
- package/src/lib/problem-flows.ts +78 -0
- package/src/lib/problem-rules-cel.d.mts +43 -0
- package/src/lib/problem-rules-cel.mjs +407 -0
- package/src/lib/problem-rules.test.ts +287 -0
- package/src/lib/problem-rules.ts +271 -0
- package/src/lib/problem-subjects.ts +737 -0
- package/src/lib/rule-entries.ts +39 -0
- package/src/lib/{data-problems.test.ts → rules-data.test.ts} +18 -16
- package/src/lib/rules-deploy.test.ts +133 -0
- package/src/lib/{problems.test.ts → rules-edges.test.ts} +8 -3
- package/src/lib/{proto-problems.test.ts → rules-proto.test.ts} +9 -25
- package/src/lib/{wire-problems.test.ts → rules-wire.test.ts} +13 -11
- package/src/lib/rules.test.ts +51 -0
- package/src/lib/rules.ts +86 -0
- package/src/lib/shape.test.ts +32 -0
- package/src/lib/shape.ts +30 -6
- package/src/lib/tech.ts +16 -0
- package/src/lib/trace-project.test.ts +34 -0
- package/src/lib/trace-project.ts +50 -0
- package/src/lib/use-problems.ts +23 -0
- package/src/lib/warnings.test.ts +9 -0
- package/src/lib/warnings.ts +10 -10
- package/src/likec4/ids.test.ts +6 -2
- package/src/likec4/ids.ts +43 -0
- package/src/main.tsx +23 -0
- package/src/merge-deployments.test.ts +127 -0
- package/src/merge.test.ts +82 -0
- package/src/merge.ts +173 -9
- package/src/pages/AggregatePage.tsx +57 -7
- package/src/pages/ContextMap.tsx +45 -3
- package/src/pages/ContextPage.tsx +2 -0
- package/src/pages/EventPage.tsx +15 -5
- package/src/pages/FlowDetail.tsx +23 -2
- package/src/pages/GraphPage.tsx +40 -3
- package/src/pages/Overview.tsx +152 -12
- package/src/pages/PluginIndex.tsx +190 -0
- package/src/pages/Problems.tsx +396 -128
- package/src/pages/ServicePage.tsx +58 -2
- package/src/pages/Settings.tsx +28 -2
- package/src/pages/settings/AboutSettings.tsx +8 -1
- package/src/pages/settings/IntegrationsSettings.tsx +63 -17
- package/src/pages/settings/RecordingSettings.tsx +138 -0
- package/src/pages/settings/RulesSettings.tsx +825 -0
- package/src/routes.test.ts +9 -0
- package/src/routes.ts +22 -1
- package/src/lib/data-problems.ts +0 -314
- package/src/lib/proto-problems.ts +0 -237
- package/src/lib/wire-problems.ts +0 -342
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
[package]
|
|
2
|
+
name = "portolan-extract-php-ddd"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
edition = "2024"
|
|
5
|
+
description = "A PHP service laid out by bounded context, module and hexagonal layer in, a catalog fragment out: the PHP twin of extract-go and extract-rust, on the same protocol."
|
|
6
|
+
publish = false
|
|
7
|
+
|
|
8
|
+
[lib]
|
|
9
|
+
name = "portolan_extract_php_ddd"
|
|
10
|
+
path = "src/lib.rs"
|
|
11
|
+
|
|
12
|
+
[[bin]]
|
|
13
|
+
name = "portolan-extract-php-ddd"
|
|
14
|
+
path = "src/main.rs"
|
|
15
|
+
|
|
16
|
+
[dependencies]
|
|
17
|
+
# The PHP tree as syntax, shared with extract-laravel.
|
|
18
|
+
phpscan = { path = "../phpscan" }
|
|
19
|
+
# Doctrine mappings are XML; roxmltree reads them without a build step.
|
|
20
|
+
roxmltree = "0.21"
|
|
21
|
+
serde = { version = "1", features = ["derive"] }
|
|
22
|
+
serde_json = { version = "1", features = ["preserve_order"] }
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# extract-php-ddd
|
|
2
|
+
|
|
3
|
+
A PHP tree laid out by bounded context, module and hexagonal layer in, a
|
|
4
|
+
catalog fragment out - three, when the route files prove an HTTP contract
|
|
5
|
+
and the Doctrine mappings a database. The PHP twin of `extract-go`,
|
|
6
|
+
`extract-ts` and `extract-rust`: like them, this reads a layout rather than
|
|
7
|
+
a framework, and the layout is the claim. Nothing is annotated for the
|
|
8
|
+
catalog; the directory a class sits in and the base it extends say what it
|
|
9
|
+
is.
|
|
10
|
+
|
|
11
|
+
The layout is the one [CodelyTV's php-ddd-example](https://github.com/CodelyTV/php-ddd-example)
|
|
12
|
+
made common in PHP - `src/<Context>/<Module>/{Domain,Application,Infrastructure}`
|
|
13
|
+
with the deployables under `apps/<context>/<app>` - and it is that project the
|
|
14
|
+
site ships as a profile, read by this extractor alone.
|
|
15
|
+
|
|
16
|
+
Written in Rust and run as a process plugin, `cargo run --quiet
|
|
17
|
+
--manifest-path plugins/extract-php-ddd/Cargo.toml`, on the same reader as
|
|
18
|
+
`extract-laravel`: `plugins/phpscan`, over [Mago](https://github.com/carthage-software/mago)'s
|
|
19
|
+
`mago-syntax`. **The application is never run.** No container, no `composer
|
|
20
|
+
install`: everything is read from syntax, names are resolved by namespace and
|
|
21
|
+
`use` line, and a file that does not parse is read as far as it parsed and
|
|
22
|
+
reported.
|
|
23
|
+
|
|
24
|
+
## The layout it reads
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
src/<Context>/<Module>/Domain the model: root, entities, value objects, events, ports
|
|
28
|
+
src/<Context>/<Module>/Application the use cases: commands, queries, their handlers, subscribers
|
|
29
|
+
src/<Context>/<Module>/Infrastructure the adapters: repositories, *.orm.xml Doctrine mappings
|
|
30
|
+
src/Shared, src/<Context>/Shared the shared kernel: bases, ids; not a context, not a module
|
|
31
|
+
apps/<context>/<app>/config/routes/*.yaml the HTTP edge of one deployable
|
|
32
|
+
apps/<context>/<app>/config/services*.yaml which contexts' code the deployable loads
|
|
33
|
+
apps/<context>/<app>/src/Controller what answers a route
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
`source` and `apps` in the options rename `src/` and `apps/`. `tests/`,
|
|
37
|
+
`vendor/` and everything under an application but `src/` are not read.
|
|
38
|
+
|
|
39
|
+
## What becomes what
|
|
40
|
+
|
|
41
|
+
**Context.** A directory under `src/` other than `Shared`, with its slug as
|
|
42
|
+
id. `classification` in the options applies to every context the tree
|
|
43
|
+
declares; nothing in the tree says which is core.
|
|
44
|
+
|
|
45
|
+
**Service.** Each application under `apps/<context>/` is a service of that
|
|
46
|
+
context - `mooc.backend`, `backoffice.frontend` - with the route files it
|
|
47
|
+
carries as its HTTP interfaces, one per file, `mooc.backend.courses`. The
|
|
48
|
+
context's model is filed under its `backend` application, or its first one
|
|
49
|
+
when it has none of that name. A context with no application at all gets a
|
|
50
|
+
service named after itself, `analytics.analytics`, and a warning: the code
|
|
51
|
+
is there, nothing deploys it.
|
|
52
|
+
|
|
53
|
+
**Aggregate.** A module whose `Domain/` has a class extending
|
|
54
|
+
`AggregateRoot`. The root's constructor parameters are its fields, typed as
|
|
55
|
+
written, `id: CourseId`; a class extending the root is an entity of it, the
|
|
56
|
+
joined subclasses of an abstract `Step`. A value object is a class that wraps
|
|
57
|
+
one value - it extends a `*ValueObject` base or `Uuid`, or answers `value()` -
|
|
58
|
+
with its fields read up the base chain, so `CourseName extends
|
|
59
|
+
StringValueObject` has the parent's `value: string`. Exceptions, collections
|
|
60
|
+
and domain services are not shape and are skipped. A module with no root but
|
|
61
|
+
with use cases - `Auth`, with a command and no aggregate - is a `model-group`
|
|
62
|
+
aggregate; one with neither is a warning and nothing else.
|
|
63
|
+
|
|
64
|
+
**Event.** A class extending `DomainEvent`. Its wire name is what
|
|
65
|
+
`eventName()` answers, `course.created`; its fields are the keys of
|
|
66
|
+
`toPrimitives()`, typed by the constructor parameter of the same name; its
|
|
67
|
+
doc the class docblock. The id is the class name with `DomainEvent` taken
|
|
68
|
+
off, `mooc.backend.courses.CourseCreated`. Every event's `wire.channel` is the
|
|
69
|
+
RabbitMQ exchange, `exchange` in the options, because the code reads it from
|
|
70
|
+
the environment.
|
|
71
|
+
|
|
72
|
+
**Operation.** A class implementing `CommandHandler` or `QueryHandler`; the
|
|
73
|
+
`__invoke` parameter names the message and the operation is the message
|
|
74
|
+
without its suffix, `create-course` for `CreateCourseCommand`. The doc is the
|
|
75
|
+
handler's, or the use case's it holds (`CourseCreator`), or the message's.
|
|
76
|
+
Its `fields` are the message's constructor parameters, typed as written -
|
|
77
|
+
what the caller hands in, and an empty list for a query that takes nothing;
|
|
78
|
+
its `source` is the handler's `__invoke`. `exposedBy` names the routes of
|
|
79
|
+
the operation's own service that dispatch or ask it; a route in another
|
|
80
|
+
application is a call across contexts and lives in the flow instead. A
|
|
81
|
+
class named `*CommandHandler` that implements neither interface is reported:
|
|
82
|
+
the bus never reaches it.
|
|
83
|
+
|
|
84
|
+
**Subscriber.** A class implementing `DomainEventSubscriber`; `subscribedTo()`
|
|
85
|
+
says which events, and `DomainEvent::class` there means every one. Each
|
|
86
|
+
subscriber is a consumer on the events it names, a flow from the bus in, and
|
|
87
|
+
a channel of its own: the RabbitMQ queue `RabbitMqQueueNameFormatter` would
|
|
88
|
+
name for it, `codelytv.mooc.courses_counter.increment_courses_counter_on_course_created`.
|
|
89
|
+
A subscriber in a context no application's `services.yaml` loads is reported:
|
|
90
|
+
declared, wired nowhere.
|
|
91
|
+
|
|
92
|
+
**Store.** The tables the `*.orm.xml` mappings under a context declare, as
|
|
93
|
+
one `mysql` store per context (`storeKind` in the options), owned by the
|
|
94
|
+
context's service: `<id>`, `<field>` and `<embedded>` become columns, the
|
|
95
|
+
embeddable's own mapping supplying the column names; a `JOINED` subclass gets
|
|
96
|
+
its own table keyed to the parent's. Each table `persists` the aggregate its
|
|
97
|
+
entity is the root or an entity of, and its columns `map` to the entity's
|
|
98
|
+
fields. A `*Repository` interface under `Domain/` is a port; the adapter
|
|
99
|
+
implementing it says what answers it - `Doctrine*`/`MySql*` the database,
|
|
100
|
+
`Elasticsearch*` an index, kept as a second store of kind `other` with one
|
|
101
|
+
table per index shaped like the root it keeps; `InMemory*` and `File*`
|
|
102
|
+
nothing, and a warning. Every `$this->repository->save(...)` on a port is an
|
|
103
|
+
access on the port's table, `write CourseRepository.save`, whether or not a
|
|
104
|
+
flow reaches it.
|
|
105
|
+
|
|
106
|
+
**Flow.** One per route whose controller the tree has: the request in, what
|
|
107
|
+
the controller `dispatch`es or `ask`s, then what the handler does, followed
|
|
108
|
+
through the classes it holds by their constructor types - `$this->creator->__invoke(...)`,
|
|
109
|
+
`Course::create(...)`, `apply($this->incrementer, [...])`, a call on a local
|
|
110
|
+
variable tried against the module's root. On the way, `record(new Event)`
|
|
111
|
+
and `publish(new Event)` are event steps to the bus and a call on a port a
|
|
112
|
+
step to its store. When a controller dispatches a command whose handler lives
|
|
113
|
+
in another context - the backoffice front end creating a Mooc course - the
|
|
114
|
+
flow crosses to that context's service with a `call` step and a note: in
|
|
115
|
+
process, over an in-memory bus, but a boundary all the same. One flow per
|
|
116
|
+
subscriber does the same from the queue in.
|
|
117
|
+
|
|
118
|
+
**HTTP.** One OpenAPI 3.1 document per application with routes,
|
|
119
|
+
`openapi.<context>-<app>.yaml` (`openapiOut` in the options, `{service}`
|
|
120
|
+
where the name goes), one operation per route and verb, the path's `{id}`
|
|
121
|
+
as parameters and the controller's docblock as the summary; a route to a
|
|
122
|
+
controller not in the tree is kept and reported.
|
|
123
|
+
|
|
124
|
+
## Options
|
|
125
|
+
|
|
126
|
+
See `options.schema.json`. `repo` defaults to composer.json's
|
|
127
|
+
`support.source` or `homepage`; `exchange` to `domain_events`; `storeKind`
|
|
128
|
+
to `mysql`; `classification` to nothing.
|
|
129
|
+
|
|
130
|
+
## Tests
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
cargo test --manifest-path plugins/extract-php-ddd/Cargo.toml
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
`testdata/mooc` is a small tree in the layout: three contexts with
|
|
137
|
+
applications and two without, a joined-subclass aggregate, an Elasticsearch
|
|
138
|
+
read model, a subscriber to every event, and a front end dispatching another
|
|
139
|
+
context's command. `expected.json`, `expected-stores.json` and the
|
|
140
|
+
`openapi.*.yaml` beside it are what the extractor writes for it; the fixture
|
|
141
|
+
tests explain the rules, the goldens catch what nobody asserted.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "object",
|
|
3
|
+
"additionalProperties": false,
|
|
4
|
+
"properties": {
|
|
5
|
+
"source": {
|
|
6
|
+
"type": "string",
|
|
7
|
+
"description": "The directory the bounded contexts are in, relative to the input root: one directory per context, one per module under it, `Domain`, `Application` and `Infrastructure` under that. A `Shared` directory at either level is the shared kernel and is not a context or a module.",
|
|
8
|
+
"default": "src"
|
|
9
|
+
},
|
|
10
|
+
"apps": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "The directory the deployable applications are in, relative to the input root: `<apps>/<context>/<app>`, each with `config/routes/*.yaml` and `src/Controller/`. Each application is a service of its context; a context with none gets one service named after itself.",
|
|
13
|
+
"default": "apps"
|
|
14
|
+
},
|
|
15
|
+
"repo": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "Where the source lives. Defaults to composer.json's support.source or homepage when either names a repository.",
|
|
18
|
+
"examples": ["github.com/CodelyTV/php-ddd-example"]
|
|
19
|
+
},
|
|
20
|
+
"exchange": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"description": "The RabbitMQ exchange domain events are published to. The code reads it from the environment, so the manifest says.",
|
|
23
|
+
"default": "domain_events"
|
|
24
|
+
},
|
|
25
|
+
"storeKind": {
|
|
26
|
+
"enum": ["postgres", "mysql", "sqlite", "other"],
|
|
27
|
+
"description": "What the Doctrine-mapped tables live in.",
|
|
28
|
+
"default": "mysql"
|
|
29
|
+
},
|
|
30
|
+
"classification": {
|
|
31
|
+
"enum": ["core", "supporting", "generic"],
|
|
32
|
+
"description": "Whether the contexts are core to the business, support it, or are generic and could be bought. One value for every context the tree declares."
|
|
33
|
+
},
|
|
34
|
+
"out": {
|
|
35
|
+
"type": "string",
|
|
36
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
37
|
+
"default": "domain.json"
|
|
38
|
+
},
|
|
39
|
+
"openapiOut": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"description": "Name of the inferred OpenAPI 3.1 document, inside the step's output directory. Written when the route files expose HTTP operations.",
|
|
42
|
+
"default": "openapi.inferred.yaml"
|
|
43
|
+
},
|
|
44
|
+
"storesOut": {
|
|
45
|
+
"type": "string",
|
|
46
|
+
"description": "Name of the store fragment, inside the step's output directory. Written when a Doctrine mapping or a repository adapter names a store.",
|
|
47
|
+
"default": "stores.json"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
max_width = 160
|
|
@@ -18,6 +18,7 @@ HERE = os.path.dirname(os.path.abspath(__file__))
|
|
|
18
18
|
DESCRIPTOR = {
|
|
19
19
|
"name": "extract-python-kafka",
|
|
20
20
|
"summary": "Reads confluent-kafka, kafka-python and aiokafka producers and consumers into message channels and source-backed flows.",
|
|
21
|
+
"category": "messaging",
|
|
21
22
|
"phases": ["extract"],
|
|
22
23
|
}
|
|
23
24
|
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "object",
|
|
3
|
+
"additionalProperties": false,
|
|
4
|
+
"properties": {
|
|
5
|
+
"context": {
|
|
6
|
+
"type": "string",
|
|
7
|
+
"description": "Slug of the bounded context the module deploys into. Defaults to the name of the input directory.",
|
|
8
|
+
"examples": ["shop"]
|
|
9
|
+
},
|
|
10
|
+
"service": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "Slug of the service the module sits beside. Queues, topics and stores nothing in the module claims are listed on it, and it owns every store. A Lambda function whose name slugs to this becomes the service itself; any other becomes a component of kind function in the same context. Defaults to the name of the input directory.",
|
|
13
|
+
"examples": ["fulfillment"]
|
|
14
|
+
},
|
|
15
|
+
"dir": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "Directory of *.tf files to read, relative to the input root. Left out, the root is read when it holds *.tf files, and otherwise the one directory under it that does - when there are several, the first by name, and the rest are named in a warning. Local modules (source = ./...) are followed from wherever they are called; registry modules are not read.",
|
|
18
|
+
"examples": ["deploy/terraform"]
|
|
19
|
+
},
|
|
20
|
+
"out": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"description": "Name of the fragment file, inside the step's output directory.",
|
|
23
|
+
"default": "terraform.json"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -11,6 +11,7 @@ const schema = JSON.parse(readFileSync(new URL("./options.schema.json", import.m
|
|
|
11
11
|
export const descriptor = {
|
|
12
12
|
name: "extract-ts",
|
|
13
13
|
summary: "Reads a TypeScript service by its layout - aggregates, events, use cases, endpoints, policies, clients - into a catalog fragment.",
|
|
14
|
+
category: "code",
|
|
14
15
|
phases: ["extract"],
|
|
15
16
|
options: schema,
|
|
16
17
|
};
|