@shortlink-org/portolan 0.1.0 → 0.2.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.
Files changed (381) hide show
  1. package/README.md +69 -205
  2. package/cli/init.mjs +285 -0
  3. package/cli/init.test.mjs +158 -0
  4. package/cli/portolan.mjs +37 -73
  5. package/index.html +19 -0
  6. package/package.json +5 -10
  7. package/plugins/README.md +66 -27
  8. package/plugins/portolan-go.wasm +0 -0
  9. package/portolan.json +52 -73
  10. package/public/landing/cats/bug-hunter.webp +0 -0
  11. package/public/landing/cats/compass-nap.webp +0 -0
  12. package/public/landing/cats/diagrammer.webp +0 -0
  13. package/public/landing/cats/docs-reader.webp +0 -0
  14. package/public/landing/cats/laptop.webp +0 -0
  15. package/public/landing/cats/map-inspector.webp +0 -0
  16. package/public/landing/cats/server-break.webp +0 -0
  17. package/public/landing/cats/star-mapper.webp +0 -0
  18. package/public/landing/cats/system-builder.webp +0 -0
  19. package/public/landing/cats/thread-tangle.webp +0 -0
  20. package/public/og.png +0 -0
  21. package/public/readme-header.webp +0 -0
  22. package/schema/portolan.schema.json +180 -0
  23. package/scripts/builtin-plugins.mjs +14 -0
  24. package/scripts/delivery-presets.mjs +353 -0
  25. package/scripts/gen.mjs +37 -4
  26. package/scripts/history.mjs +126 -0
  27. package/scripts/history.test.mjs +110 -0
  28. package/scripts/host-plugins/fetch-bsr.mjs +351 -0
  29. package/{plugins/fetch-bsr/options.schema.json → scripts/host-plugins/fetch-bsr.options.json} +4 -0
  30. package/scripts/host-plugins/fetch-bsr.test.mjs +212 -0
  31. package/scripts/host-plugins/fetch-csr.mjs +386 -0
  32. package/scripts/host-plugins/fetch-csr.test.mjs +178 -0
  33. package/scripts/host-plugins/fetch-git.mjs +379 -0
  34. package/scripts/host-plugins/fetch-git.test.mjs +210 -0
  35. package/scripts/local-api.mjs +22 -4
  36. package/scripts/local-api.test.mjs +84 -2
  37. package/scripts/manifest.mjs +3 -2
  38. package/scripts/package-smoke.mjs +6 -2
  39. package/scripts/plugin-host.mjs +77 -18
  40. package/scripts/plugin-host.test.mjs +50 -1
  41. package/scripts/plugin-wasm-worker.mjs +6 -3
  42. package/scripts/run-builtin.mjs +6 -26
  43. package/scripts/schema.mjs +6 -1
  44. package/src/app/App.tsx +24 -429
  45. package/src/app/Breadcrumbs.test.ts +7 -0
  46. package/src/app/Breadcrumbs.tsx +15 -2
  47. package/src/app/CatalogApp.tsx +436 -0
  48. package/src/app/Sidebar.tsx +0 -1
  49. package/src/chat/ChatPanel.tsx +98 -41
  50. package/src/chat/Composer.tsx +4 -2
  51. package/src/chat/Conversation.tsx +79 -15
  52. package/src/chat/Header.tsx +43 -9
  53. package/src/chat/Starter.tsx +64 -3
  54. package/src/chat/Steps.tsx +1 -1
  55. package/src/chat/flags.test.ts +51 -14
  56. package/src/chat/flags.ts +8 -2
  57. package/src/chat/page-context.test.ts +51 -0
  58. package/src/chat/page-context.ts +128 -0
  59. package/src/chat/prompt.test.ts +49 -1
  60. package/src/chat/prompt.ts +42 -1
  61. package/src/chat/tools.ts +7 -2
  62. package/src/chat/transport.ts +16 -4
  63. package/src/components/ProblemRow.tsx +182 -0
  64. package/src/data.ts +20 -5
  65. package/src/er/ErCanvas.tsx +1 -1
  66. package/src/graph/DependencyGraph.tsx +10 -1
  67. package/src/graph/FocusedEventGraph.tsx +1 -1
  68. package/src/graph/GraphToolbar.tsx +2 -4
  69. package/src/index.css +220 -2
  70. package/src/landing/DraggableReveal.tsx +168 -0
  71. package/src/landing/EstateGraph.tsx +28 -0
  72. package/src/landing/FlowPlayback.tsx +282 -0
  73. package/src/landing/HeroMap.tsx +128 -0
  74. package/src/landing/LandingPage.tsx +757 -0
  75. package/src/landing/ProductFrame.tsx +68 -0
  76. package/src/landing/ProductTour.tsx +371 -0
  77. package/src/landing/catalog.ts +25 -0
  78. package/src/landing/motion.tsx +52 -0
  79. package/src/lib/all-problems.ts +28 -0
  80. package/src/lib/local-api.ts +35 -1
  81. package/src/lib/setup-info.test.ts +8 -0
  82. package/src/lib/setup-info.ts +3 -2
  83. package/src/lib/source-code.ts +2 -1
  84. package/src/likec4/C4View.tsx +5 -0
  85. package/src/likec4/InteractiveView.tsx +5 -1
  86. package/src/map/ContextMapGraph.tsx +47 -20
  87. package/src/pages/ContextMap.tsx +5 -1
  88. package/src/pages/FlowDetail.tsx +24 -7
  89. package/src/pages/Overview.tsx +68 -12
  90. package/src/pages/Problems.tsx +6 -193
  91. package/src/pages/Settings.tsx +133 -108
  92. package/src/pages/settings/DeliverySettings.tsx +229 -0
  93. package/src/pages/settings/PreferencesSettings.tsx +101 -0
  94. package/src/routes.test.ts +20 -0
  95. package/src/routes.ts +13 -1
  96. package/vite.config.ts +12 -8
  97. package/catalog/enum_test.go +0 -46
  98. package/catalog/model.go +0 -932
  99. package/catalog/roundtrip_test.go +0 -185
  100. package/catalog/via_test.go +0 -38
  101. package/go.mod +0 -14
  102. package/go.sum +0 -14
  103. package/internal/commands/cargo.go +0 -154
  104. package/internal/commands/commands.go +0 -143
  105. package/internal/commands/commands_test.go +0 -323
  106. package/internal/commands/gradle.go +0 -77
  107. package/internal/commands/justfile.go +0 -82
  108. package/internal/commands/makefile.go +0 -106
  109. package/internal/commands/maven.go +0 -93
  110. package/internal/commands/packagejson.go +0 -159
  111. package/internal/commands/pyproject.go +0 -169
  112. package/internal/commands/taskfile.go +0 -101
  113. package/internal/commands/testdata/estate/.cargo/config.toml +0 -7
  114. package/internal/commands/testdata/estate/Makefile +0 -33
  115. package/internal/commands/testdata/estate/Taskfile.yml +0 -21
  116. package/internal/commands/testdata/estate/build.gradle.kts +0 -21
  117. package/internal/commands/testdata/estate/justfile +0 -20
  118. package/internal/commands/testdata/estate/package.json +0 -13
  119. package/internal/commands/testdata/estate/pom.xml +0 -29
  120. package/internal/commands/testdata/estate/pyproject.toml +0 -27
  121. package/internal/commands/testdata/estate/xtask/src/main.rs +0 -27
  122. package/internal/commands/testdata/golden/commands.json +0 -305
  123. package/internal/gohttp/analyze.go +0 -2500
  124. package/internal/gohttp/endpoints.go +0 -1067
  125. package/internal/gohttp/roots.go +0 -320
  126. package/internal/gohttp/typed.go +0 -143
  127. package/internal/goscan/constants.go +0 -85
  128. package/internal/goscan/goscan_test.go +0 -227
  129. package/internal/goscan/names.go +0 -52
  130. package/internal/goscan/parse_test.go +0 -11
  131. package/internal/goscan/source.go +0 -36
  132. package/internal/goscan/tree.go +0 -155
  133. package/internal/goscan/types.go +0 -99
  134. package/internal/wsdl/ids.go +0 -127
  135. package/internal/wsdl/ids_test.go +0 -21
  136. package/internal/wsdl/model.go +0 -62
  137. package/internal/wsdl/parse.go +0 -920
  138. package/internal/wsdl/parse_test.go +0 -133
  139. package/plugin/describe.go +0 -107
  140. package/plugin/describe_test.go +0 -114
  141. package/plugin/protocol.go +0 -117
  142. package/plugin/schematest/schematest.go +0 -126
  143. package/plugins/extract-adr/describe.go +0 -19
  144. package/plugins/extract-adr/describe_test.go +0 -11
  145. package/plugins/extract-adr/extract.go +0 -153
  146. package/plugins/extract-adr/extract_test.go +0 -350
  147. package/plugins/extract-adr/history.go +0 -99
  148. package/plugins/extract-adr/main.go +0 -65
  149. package/plugins/extract-adr/parse.go +0 -642
  150. package/plugins/extract-adr/parse_test.go +0 -405
  151. package/plugins/extract-asyncapi/describe.go +0 -19
  152. package/plugins/extract-asyncapi/describe_test.go +0 -11
  153. package/plugins/extract-asyncapi/extract.go +0 -315
  154. package/plugins/extract-asyncapi/extract_test.go +0 -197
  155. package/plugins/extract-asyncapi/main.go +0 -48
  156. package/plugins/extract-asyncapi/spec.go +0 -151
  157. package/plugins/extract-commands/describe.go +0 -19
  158. package/plugins/extract-commands/describe_test.go +0 -11
  159. package/plugins/extract-commands/extract.go +0 -79
  160. package/plugins/extract-commands/extract_test.go +0 -92
  161. package/plugins/extract-commands/main.go +0 -55
  162. package/plugins/extract-csr/avro.go +0 -258
  163. package/plugins/extract-csr/describe.go +0 -19
  164. package/plugins/extract-csr/describe_test.go +0 -11
  165. package/plugins/extract-csr/extract.go +0 -338
  166. package/plugins/extract-csr/extract_test.go +0 -374
  167. package/plugins/extract-csr/jsonschema.go +0 -343
  168. package/plugins/extract-csr/lock.go +0 -25
  169. package/plugins/extract-csr/main.go +0 -84
  170. package/plugins/extract-csr/subject.go +0 -102
  171. package/plugins/extract-flows/describe.go +0 -19
  172. package/plugins/extract-flows/describe_test.go +0 -11
  173. package/plugins/extract-flows/extract.go +0 -91
  174. package/plugins/extract-flows/main.go +0 -45
  175. package/plugins/extract-flows/parse.go +0 -593
  176. package/plugins/extract-flows/parse_test.go +0 -204
  177. package/plugins/extract-glossary/describe.go +0 -19
  178. package/plugins/extract-glossary/describe_test.go +0 -11
  179. package/plugins/extract-glossary/extract.go +0 -115
  180. package/plugins/extract-glossary/extract_test.go +0 -220
  181. package/plugins/extract-glossary/main.go +0 -59
  182. package/plugins/extract-glossary/parse.go +0 -214
  183. package/plugins/extract-glossary/parse_test.go +0 -203
  184. package/plugins/extract-go/aggregate.go +0 -214
  185. package/plugins/extract-go/client.go +0 -409
  186. package/plugins/extract-go/client_test.go +0 -266
  187. package/plugins/extract-go/describe.go +0 -19
  188. package/plugins/extract-go/describe_test.go +0 -11
  189. package/plugins/extract-go/enum.go +0 -195
  190. package/plugins/extract-go/enum_test.go +0 -82
  191. package/plugins/extract-go/event.go +0 -99
  192. package/plugins/extract-go/extract.go +0 -191
  193. package/plugins/extract-go/extract_test.go +0 -261
  194. package/plugins/extract-go/flow.go +0 -1441
  195. package/plugins/extract-go/flow_test.go +0 -609
  196. package/plugins/extract-go/httpclient.go +0 -174
  197. package/plugins/extract-go/httpclient_test.go +0 -296
  198. package/plugins/extract-go/ids.go +0 -92
  199. package/plugins/extract-go/layout.go +0 -225
  200. package/plugins/extract-go/layout_test.go +0 -125
  201. package/plugins/extract-go/lifecycle.go +0 -324
  202. package/plugins/extract-go/lifecycle_test.go +0 -108
  203. package/plugins/extract-go/main.go +0 -79
  204. package/plugins/extract-go/operation.go +0 -157
  205. package/plugins/extract-go/source.go +0 -316
  206. package/plugins/extract-go/transport.go +0 -321
  207. package/plugins/extract-go/transport_test.go +0 -145
  208. package/plugins/extract-go/wiring.go +0 -434
  209. package/plugins/extract-go-nats/describe.go +0 -19
  210. package/plugins/extract-go-nats/describe_test.go +0 -11
  211. package/plugins/extract-go-nats/extract.go +0 -177
  212. package/plugins/extract-go-nats/extract_test.go +0 -389
  213. package/plugins/extract-go-nats/index.go +0 -379
  214. package/plugins/extract-go-nats/main.go +0 -42
  215. package/plugins/extract-go-nats/resolve.go +0 -161
  216. package/plugins/extract-go-nats/sites.go +0 -224
  217. package/plugins/extract-graphql/describe.go +0 -19
  218. package/plugins/extract-graphql/describe_test.go +0 -11
  219. package/plugins/extract-graphql/extract.go +0 -433
  220. package/plugins/extract-graphql/extract_test.go +0 -256
  221. package/plugins/extract-graphql/ids.go +0 -49
  222. package/plugins/extract-graphql/lex.go +0 -237
  223. package/plugins/extract-graphql/main.go +0 -51
  224. package/plugins/extract-graphql/parse.go +0 -621
  225. package/plugins/extract-graphql/parse_test.go +0 -122
  226. package/plugins/extract-http-clients/describe.go +0 -19
  227. package/plugins/extract-http-clients/describe_test.go +0 -11
  228. package/plugins/extract-http-clients/extract.go +0 -705
  229. package/plugins/extract-http-clients/extract_test.go +0 -1263
  230. package/plugins/extract-http-clients/main.go +0 -42
  231. package/plugins/extract-openapi/describe.go +0 -19
  232. package/plugins/extract-openapi/describe_test.go +0 -11
  233. package/plugins/extract-openapi/discover.go +0 -243
  234. package/plugins/extract-openapi/extract.go +0 -526
  235. package/plugins/extract-openapi/extract_test.go +0 -545
  236. package/plugins/extract-openapi/main.go +0 -75
  237. package/plugins/extract-openapi/spec.go +0 -350
  238. package/plugins/extract-project/describe.go +0 -19
  239. package/plugins/extract-project/describe_test.go +0 -11
  240. package/plugins/extract-project/extract.go +0 -221
  241. package/plugins/extract-project/extract_test.go +0 -109
  242. package/plugins/extract-project/main.go +0 -41
  243. package/plugins/extract-proto/ast.go +0 -125
  244. package/plugins/extract-proto/consumes.go +0 -77
  245. package/plugins/extract-proto/describe.go +0 -19
  246. package/plugins/extract-proto/extract.go +0 -293
  247. package/plugins/extract-proto/extract_test.go +0 -459
  248. package/plugins/extract-proto/ids.go +0 -89
  249. package/plugins/extract-proto/ids_test.go +0 -57
  250. package/plugins/extract-proto/lex.go +0 -285
  251. package/plugins/extract-proto/main.go +0 -100
  252. package/plugins/extract-proto/module.go +0 -120
  253. package/plugins/extract-proto/parse.go +0 -720
  254. package/plugins/extract-proto/parse_test.go +0 -307
  255. package/plugins/extract-proto/provides.go +0 -236
  256. package/plugins/extract-proto/resolve.go +0 -222
  257. package/plugins/extract-proto/resolve_test.go +0 -119
  258. package/plugins/extract-redis/describe.go +0 -19
  259. package/plugins/extract-redis/describe_test.go +0 -11
  260. package/plugins/extract-redis/extract.go +0 -183
  261. package/plugins/extract-redis/extract_test.go +0 -168
  262. package/plugins/extract-redis/keyspaces.go +0 -469
  263. package/plugins/extract-redis/main.go +0 -44
  264. package/plugins/extract-river/describe.go +0 -19
  265. package/plugins/extract-river/describe_test.go +0 -11
  266. package/plugins/extract-river/extract.go +0 -507
  267. package/plugins/extract-river/extract_test.go +0 -132
  268. package/plugins/extract-river/main.go +0 -42
  269. package/plugins/extract-sql/ddl.go +0 -893
  270. package/plugins/extract-sql/ddl_test.go +0 -401
  271. package/plugins/extract-sql/describe.go +0 -19
  272. package/plugins/extract-sql/describe_test.go +0 -11
  273. package/plugins/extract-sql/layout.go +0 -221
  274. package/plugins/extract-sql/layout_test.go +0 -55
  275. package/plugins/extract-sql/lineage.go +0 -107
  276. package/plugins/extract-sql/main.go +0 -141
  277. package/plugins/extract-sql/maps.go +0 -564
  278. package/plugins/extract-sql/maps_java.go +0 -117
  279. package/plugins/extract-sql/maps_rust.go +0 -333
  280. package/plugins/extract-sql/maps_rust_test.go +0 -70
  281. package/plugins/extract-sql/maps_test.go +0 -204
  282. package/plugins/extract-sql/maps_ts.go +0 -398
  283. package/plugins/extract-sql/maps_ts_test.go +0 -136
  284. package/plugins/extract-sql/projection.go +0 -70
  285. package/plugins/extract-sql/projection_test.go +0 -50
  286. package/plugins/extract-sql/store.go +0 -420
  287. package/plugins/extract-sql/store_test.go +0 -233
  288. package/plugins/extract-sql/view.go +0 -295
  289. package/plugins/extract-watermill/describe.go +0 -19
  290. package/plugins/extract-watermill/describe_test.go +0 -11
  291. package/plugins/extract-watermill/extract.go +0 -1228
  292. package/plugins/extract-watermill/extract_test.go +0 -234
  293. package/plugins/extract-watermill/main.go +0 -41
  294. package/plugins/extract-wsdl/describe.go +0 -19
  295. package/plugins/extract-wsdl/describe_test.go +0 -11
  296. package/plugins/extract-wsdl/extract.go +0 -148
  297. package/plugins/extract-wsdl/extract_test.go +0 -45
  298. package/plugins/extract-wsdl/main.go +0 -53
  299. package/plugins/fetch-bsr/auth.go +0 -114
  300. package/plugins/fetch-bsr/bsr.go +0 -240
  301. package/plugins/fetch-bsr/cache.go +0 -66
  302. package/plugins/fetch-bsr/describe.go +0 -19
  303. package/plugins/fetch-bsr/fetch.go +0 -192
  304. package/plugins/fetch-bsr/fetch_test.go +0 -465
  305. package/plugins/fetch-bsr/lock.go +0 -71
  306. package/plugins/fetch-bsr/main.go +0 -117
  307. package/plugins/fetch-csr/auth.go +0 -95
  308. package/plugins/fetch-csr/cache.go +0 -69
  309. package/plugins/fetch-csr/describe.go +0 -19
  310. package/plugins/fetch-csr/describe_test.go +0 -11
  311. package/plugins/fetch-csr/fetch.go +0 -254
  312. package/plugins/fetch-csr/fetch_test.go +0 -494
  313. package/plugins/fetch-csr/lock.go +0 -95
  314. package/plugins/fetch-csr/main.go +0 -122
  315. package/plugins/fetch-csr/registry.go +0 -209
  316. package/plugins/fetch-git/cache.go +0 -65
  317. package/plugins/fetch-git/describe.go +0 -19
  318. package/plugins/fetch-git/describe_test.go +0 -11
  319. package/plugins/fetch-git/fetch.go +0 -181
  320. package/plugins/fetch-git/fetch_test.go +0 -332
  321. package/plugins/fetch-git/git.go +0 -169
  322. package/plugins/fetch-git/lock.go +0 -72
  323. package/plugins/fetch-git/main.go +0 -127
  324. package/plugins/fetch-git/offline.go +0 -39
  325. package/plugins/fetch-git/pin.go +0 -90
  326. package/plugins/fetch-git/pin_test.go +0 -74
  327. package/plugins/gen-backstage/describe.go +0 -17
  328. package/plugins/gen-backstage/main.go +0 -22
  329. package/plugins/gen-backstage/plugin.go +0 -473
  330. package/plugins/gen-backstage/plugin_test.go +0 -145
  331. package/plugins/gen-backstage.wasm +0 -0
  332. package/plugins/gen-markdown/adr.go +0 -162
  333. package/plugins/gen-markdown/aggregate.go +0 -362
  334. package/plugins/gen-markdown/canonical.go +0 -93
  335. package/plugins/gen-markdown/context.go +0 -90
  336. package/plugins/gen-markdown/coverage_test.go +0 -89
  337. package/plugins/gen-markdown/describe.go +0 -19
  338. package/plugins/gen-markdown/describe_test.go +0 -11
  339. package/plugins/gen-markdown/external.go +0 -71
  340. package/plugins/gen-markdown/flow.go +0 -277
  341. package/plugins/gen-markdown/glossary.go +0 -76
  342. package/plugins/gen-markdown/glossary_test.go +0 -148
  343. package/plugins/gen-markdown/llms.go +0 -302
  344. package/plugins/gen-markdown/main.go +0 -22
  345. package/plugins/gen-markdown/markdown.go +0 -254
  346. package/plugins/gen-markdown/markdown_test.go +0 -100
  347. package/plugins/gen-markdown/module.go +0 -107
  348. package/plugins/gen-markdown/plugin.go +0 -39
  349. package/plugins/gen-markdown/quality_test.go +0 -176
  350. package/plugins/gen-markdown/redis_test.go +0 -38
  351. package/plugins/gen-markdown/render.go +0 -344
  352. package/plugins/gen-markdown/render_test.go +0 -186
  353. package/plugins/gen-markdown/service.go +0 -456
  354. package/plugins/gen-markdown/source.go +0 -177
  355. package/plugins/gen-markdown/store.go +0 -201
  356. package/plugins/gen-markdown.wasm +0 -0
  357. package/plugins/gen-mermaid/describe.go +0 -17
  358. package/plugins/gen-mermaid/main.go +0 -22
  359. package/plugins/gen-mermaid/plugin.go +0 -104
  360. package/plugins/gen-mermaid/plugin_test.go +0 -33
  361. package/plugins/gen-mermaid.wasm +0 -0
  362. package/plugins/openapi/ids.go +0 -261
  363. package/plugins/openapi/ids_test.go +0 -98
  364. package/plugins/verify-codeowners/describe.go +0 -19
  365. package/plugins/verify-codeowners/describe_test.go +0 -11
  366. package/plugins/verify-codeowners/main.go +0 -75
  367. package/plugins/verify-codeowners/match.go +0 -85
  368. package/plugins/verify-codeowners/match_test.go +0 -47
  369. package/plugins/verify-codeowners/owners.go +0 -164
  370. package/plugins/verify-codeowners/owners_test.go +0 -225
  371. package/plugins/verify-codeowners/parse.go +0 -90
  372. package/plugins/verify-codeowners/parse_test.go +0 -62
  373. package/plugins/verify-otel/describe.go +0 -19
  374. package/plugins/verify-otel/describe_test.go +0 -11
  375. package/plugins/verify-otel/main.go +0 -53
  376. package/plugins/verify-otel/match.go +0 -336
  377. package/plugins/verify-otel/otlp.go +0 -200
  378. package/plugins/verify-otel/verify.go +0 -734
  379. package/plugins/verify-otel/verify_test.go +0 -460
  380. /package/{plugins/fetch-csr/options.schema.json → scripts/host-plugins/fetch-csr.options.json} +0 -0
  381. /package/{plugins/fetch-git/options.schema.json → scripts/host-plugins/fetch-git.options.json} +0 -0
@@ -1,159 +0,0 @@
1
- package commands
2
-
3
- import (
4
- "encoding/json"
5
- "strings"
6
-
7
- "github.com/shortlink-org/portolan/catalog"
8
- )
9
-
10
- // readPackageJSON lists the scripts of a package manifest, in the order the
11
- // file lists them, because the author put `build` before `deploy` for a
12
- // reason and a sorted list would lose it. `pre` and `post` hooks of a listed
13
- // script are folded into it, the way the runner runs them. The line to type
14
- // is the runner's: npm keeps `start`, `test`, `stop` and `restart` as
15
- // commands of their own, and a checkout with a pnpm or yarn lockfile is
16
- // typed at that tool instead.
17
- func readPackageJSON(file, src, runner string) ([]catalog.Command, []string) {
18
- scripts, lines, err := packageScripts(src)
19
- if err != nil {
20
- return nil, []string{file + ": " + err.Error()}
21
- }
22
-
23
- out := make([]catalog.Command, 0, len(scripts))
24
- for _, script := range scripts {
25
- out = append(out, catalog.Command{
26
- Runner: runner,
27
- Name: script.name,
28
- Run: runLine(runner, script.name),
29
- Body: script.body,
30
- Source: at(file, lines[script.name]),
31
- })
32
- }
33
-
34
- return hooks(out, "pre", "post"), nil
35
- }
36
-
37
- type script struct{ name, body string }
38
-
39
- // packageScripts walks the document token by token, which is the one way
40
- // encoding/json will give back an object's keys in file order.
41
- func packageScripts(src string) ([]script, map[string]int, error) {
42
- dec := json.NewDecoder(strings.NewReader(src))
43
- tok, err := dec.Token()
44
- if err != nil || tok != json.Delim('{') {
45
- return nil, nil, wrap("not a JSON object", err)
46
- }
47
- for dec.More() {
48
- keyTok, err := dec.Token()
49
- if err != nil {
50
- return nil, nil, wrap("not a JSON object", err)
51
- }
52
- key, _ := keyTok.(string)
53
- if key != "scripts" {
54
- var skip json.RawMessage
55
- if err := dec.Decode(&skip); err != nil {
56
- return nil, nil, wrap("not a JSON object", err)
57
- }
58
-
59
- continue
60
- }
61
-
62
- offset := int(dec.InputOffset())
63
- var raw json.RawMessage
64
- if err := dec.Decode(&raw); err != nil {
65
- return nil, nil, wrap("scripts could not be read", err)
66
- }
67
- var byName map[string]string
68
- if err := json.Unmarshal(raw, &byName); err != nil {
69
- return nil, nil, wrap("scripts is not an object of strings", err)
70
- }
71
- order := keyOrder(raw)
72
- scripts := make([]script, 0, len(order))
73
- for _, name := range order {
74
- scripts = append(scripts, script{name: name, body: byName[name]})
75
- }
76
-
77
- return scripts, keyLines(src, offset, raw), nil
78
- }
79
-
80
- return nil, nil, nil
81
- }
82
-
83
- func wrap(what string, err error) error {
84
- if err == nil {
85
- return errString(what)
86
- }
87
-
88
- return errString(what + ": " + err.Error())
89
- }
90
-
91
- type errString string
92
-
93
- func (e errString) Error() string { return string(e) }
94
-
95
- // keyOrder reads the keys of a JSON object in the order they are written.
96
- func keyOrder(raw json.RawMessage) []string {
97
- dec := json.NewDecoder(strings.NewReader(string(raw)))
98
- if tok, err := dec.Token(); err != nil || tok != json.Delim('{') {
99
- return nil
100
- }
101
- var keys []string
102
- for dec.More() {
103
- tok, err := dec.Token()
104
- if err != nil {
105
- return keys
106
- }
107
- if key, ok := tok.(string); ok {
108
- keys = append(keys, key)
109
- }
110
- var skip json.RawMessage
111
- if err := dec.Decode(&skip); err != nil {
112
- return keys
113
- }
114
- }
115
-
116
- return keys
117
- }
118
-
119
- // keyLines finds the line each script's key sits on. The decoder says where
120
- // the `scripts` key ended, the object opens at the next brace, and each key's
121
- // position inside the object is then a position in the file.
122
- func keyLines(src string, offset int, raw json.RawMessage) map[string]int {
123
- lines := map[string]int{}
124
- brace := strings.Index(src[offset:], "{")
125
- if brace < 0 {
126
- return lines
127
- }
128
- start := offset + brace
129
- object := string(raw)
130
- for _, key := range keyOrder(raw) {
131
- quoted := `"` + key + `"`
132
- at := strings.Index(object, quoted)
133
- if at < 0 {
134
- continue
135
- }
136
- lines[key] = 1 + strings.Count(src[:start+at], "\n")
137
- // Blank the key so a second script whose name contains this one
138
- // (`build` inside `build:watch`) is not found at the first.
139
- object = object[:at] + strings.Repeat(" ", len(quoted)) + object[at+len(quoted):]
140
- }
141
-
142
- return lines
143
- }
144
-
145
- func runLine(runner, name string) string {
146
- switch runner {
147
- case "npm":
148
- switch name {
149
- case "start", "test", "stop", "restart":
150
- return "npm " + name
151
- }
152
-
153
- return "npm run " + name
154
- case "bun":
155
- return "bun run " + name
156
- }
157
-
158
- return runner + " " + name
159
- }
@@ -1,169 +0,0 @@
1
- package commands
2
-
3
- import (
4
- "regexp"
5
- "strings"
6
-
7
- "github.com/shortlink-org/portolan/catalog"
8
- )
9
-
10
- var tomlHeader = regexp.MustCompile(`^\[([^\]]+)\]\s*$`)
11
- var tomlKey = regexp.MustCompile(`^([A-Za-z0-9_.-]+|"[^"]+")\s*=\s*(.*)$`)
12
- var tomlString = regexp.MustCompile(`^(?:"((?:[^"\\]|\\.)*)"|'([^']*)')`)
13
- var tomlInlineField = regexp.MustCompile(`(\w+)\s*=\s*(?:"((?:[^"\\]|\\.)*)"|'([^']*)'|\[([^\]]*)\])`)
14
-
15
- // readPyproject lists the tasks of the two task runners that live in
16
- // pyproject.toml: poe (`[tool.poe.tasks]`) and pdm (`[tool.pdm.scripts]`).
17
- // Python has no runner of its own, and uv has no task section, so a
18
- // pyproject without one of these tables declares no commands.
19
- //
20
- // The reader is a line scanner, not a TOML parser: it follows table headers
21
- // and reads `name = "cmd"`, `name = ["cmd", "arg"]`, `name = { cmd = "...",
22
- // help = "..." }` and `[tool.poe.tasks.name]` subtables. That is the whole of
23
- // what either runner's documentation shows, and a full parser would be a
24
- // dependency for the sake of shapes nobody writes.
25
- func readPyproject(file, src string) []catalog.Command {
26
- runners := []struct {
27
- table string
28
- runner string
29
- run string
30
- }{
31
- {"tool.poe.tasks", "poe", "poe "},
32
- {"tool.pdm.scripts", "pdm", "pdm run "},
33
- }
34
-
35
- lines := strings.Split(src, "\n")
36
- var out []catalog.Command
37
- for _, r := range runners {
38
- var cmds []catalog.Command
39
- byName := map[string]int{}
40
- upsert := func(cmd catalog.Command) {
41
- if i, ok := byName[cmd.Name]; ok {
42
- if cmd.Doc != "" {
43
- cmds[i].Doc = cmd.Doc
44
- }
45
- if cmd.Body != "" {
46
- cmds[i].Body = cmd.Body
47
- }
48
-
49
- return
50
- }
51
- byName[cmd.Name] = len(cmds)
52
- cmds = append(cmds, cmd)
53
- }
54
-
55
- table := ""
56
- for i, line := range lines {
57
- text := strings.TrimSpace(line)
58
- if m := tomlHeader.FindStringSubmatch(text); m != nil {
59
- table = strings.TrimSpace(m[1])
60
-
61
- continue
62
- }
63
- if text == "" || strings.HasPrefix(text, "#") {
64
- continue
65
- }
66
- m := tomlKey.FindStringSubmatch(text)
67
- if m == nil {
68
- continue
69
- }
70
- key, value := strings.Trim(m[1], `"`), strings.TrimSpace(m[2])
71
-
72
- switch {
73
- case table == r.table:
74
- // `name = ...` in the tasks table itself.
75
- cmd := catalog.Command{Runner: r.runner, Name: key, Run: r.run + key, Source: at(file, i+1)}
76
- cmd.Body, cmd.Doc = tomlTask(value)
77
- upsert(cmd)
78
- case strings.HasPrefix(table, r.table+"."):
79
- // `[tool.poe.tasks.name]` and its fields.
80
- name := strings.Trim(strings.TrimPrefix(table, r.table+"."), `"`)
81
- cmd := catalog.Command{Runner: r.runner, Name: name, Run: r.run + name}
82
- if _, known := byName[name]; !known {
83
- cmd.Source = at(file, i+1)
84
- for j := i - 1; j >= 0; j-- {
85
- if tomlHeader.MatchString(strings.TrimSpace(lines[j])) {
86
- cmd.Source = at(file, j+1)
87
-
88
- break
89
- }
90
- }
91
- }
92
- switch key {
93
- case "cmd", "script", "shell", "call", "expr", "ref":
94
- cmd.Body = tomlScalar(value)
95
- case "sequence", "composite":
96
- cmd.Body = strings.Join(tomlList(value), "\n")
97
- case "help":
98
- cmd.Doc = tomlScalar(value)
99
- }
100
- upsert(cmd)
101
- }
102
- }
103
- out = append(out, cmds...)
104
- }
105
-
106
- return hooks(filterTypeable(out), "pre_", "post_")
107
- }
108
-
109
- func filterTypeable(cmds []catalog.Command) []catalog.Command {
110
- kept := cmds[:0]
111
- for _, cmd := range cmds {
112
- if typeable(cmd.Name) {
113
- kept = append(kept, cmd)
114
- }
115
- }
116
-
117
- return kept
118
- }
119
-
120
- // tomlTask reads the value of a task entry: a string, a list, or an inline
121
- // table with a cmd and a help.
122
- func tomlTask(value string) (body, doc string) {
123
- switch {
124
- case strings.HasPrefix(value, "{"):
125
- for _, m := range tomlInlineField.FindAllStringSubmatch(value, -1) {
126
- field := m[1]
127
- text := unescape(m[2] + m[3])
128
- switch field {
129
- case "cmd", "script", "shell", "call", "expr", "ref":
130
- body = text
131
- case "sequence", "composite":
132
- body = strings.Join(tomlList("["+m[4]+"]"), "\n")
133
- case "help":
134
- doc = text
135
- }
136
- }
137
-
138
- return body, doc
139
- case strings.HasPrefix(value, "["):
140
- return strings.Join(tomlList(value), " "), ""
141
- }
142
-
143
- return tomlScalar(value), ""
144
- }
145
-
146
- func tomlScalar(value string) string {
147
- if m := tomlString.FindStringSubmatch(value); m != nil {
148
- return unescape(m[1] + m[2])
149
- }
150
- if strings.HasPrefix(value, `"""`) {
151
- return strings.TrimSpace(strings.Trim(value, `"`))
152
- }
153
-
154
- return strings.TrimSpace(value)
155
- }
156
-
157
- func tomlList(value string) []string {
158
- inner := strings.TrimSuffix(strings.TrimPrefix(strings.TrimSpace(value), "["), "]")
159
- var items []string
160
- for _, m := range regexp.MustCompile(`"((?:[^"\\]|\\.)*)"|'([^']*)'`).FindAllStringSubmatch(inner, -1) {
161
- items = append(items, unescape(m[1]+m[2]))
162
- }
163
-
164
- return items
165
- }
166
-
167
- func unescape(s string) string {
168
- return strings.NewReplacer(`\"`, `"`, `\\`, `\`, `\n`, "\n", `\t`, "\t").Replace(s)
169
- }
@@ -1,101 +0,0 @@
1
- package commands
2
-
3
- import (
4
- "strings"
5
-
6
- "gopkg.in/yaml.v3"
7
-
8
- "github.com/shortlink-org/portolan/catalog"
9
- )
10
-
11
- // readTaskfile lists the tasks of a Taskfile, in the order the file lists
12
- // them. A task marked `internal` is not one `task --list` offers and is not
13
- // one here. `desc` is the doc, and `summary` stands in when there is no desc.
14
- // The cmds are the body; a cmd that calls another task is written as the
15
- // runner would show it.
16
- func readTaskfile(file, src string) ([]catalog.Command, []string) {
17
- var doc yaml.Node
18
- if err := yaml.Unmarshal([]byte(src), &doc); err != nil {
19
- return nil, []string{file + ": not YAML, so no tasks were read: " + err.Error()}
20
- }
21
- root := doc.Content
22
- if len(root) == 0 || root[0].Kind != yaml.MappingNode {
23
- return nil, nil
24
- }
25
- tasks := mappingValue(root[0], "tasks")
26
- if tasks == nil || tasks.Kind != yaml.MappingNode {
27
- return nil, nil
28
- }
29
-
30
- var out []catalog.Command
31
- for i := 0; i+1 < len(tasks.Content); i += 2 {
32
- key, value := tasks.Content[i], tasks.Content[i+1]
33
- name := key.Value
34
- if !typeable(name) {
35
- continue
36
- }
37
- cmd := catalog.Command{
38
- Runner: "task",
39
- Name: name,
40
- Run: "task " + name,
41
- Source: at(file, key.Line),
42
- }
43
- switch value.Kind {
44
- case yaml.ScalarNode:
45
- cmd.Body = value.Value
46
- case yaml.SequenceNode:
47
- cmd.Body = strings.Join(cmdLines(value), "\n")
48
- case yaml.MappingNode:
49
- if internal := mappingValue(value, "internal"); internal != nil && internal.Value == "true" {
50
- continue
51
- }
52
- if desc := mappingValue(value, "desc"); desc != nil {
53
- cmd.Doc = strings.TrimSpace(desc.Value)
54
- } else if summary := mappingValue(value, "summary"); summary != nil {
55
- cmd.Doc = strings.TrimSpace(summary.Value)
56
- }
57
- if cmds := mappingValue(value, "cmds"); cmds != nil {
58
- cmd.Body = strings.Join(cmdLines(cmds), "\n")
59
- } else if single := mappingValue(value, "cmd"); single != nil {
60
- cmd.Body = single.Value
61
- }
62
- }
63
- out = append(out, cmd)
64
- }
65
-
66
- return out, nil
67
- }
68
-
69
- func mappingValue(node *yaml.Node, key string) *yaml.Node {
70
- if node == nil || node.Kind != yaml.MappingNode {
71
- return nil
72
- }
73
- for i := 0; i+1 < len(node.Content); i += 2 {
74
- if node.Content[i].Value == key {
75
- return node.Content[i+1]
76
- }
77
- }
78
-
79
- return nil
80
- }
81
-
82
- func cmdLines(node *yaml.Node) []string {
83
- var lines []string
84
- if node.Kind == yaml.ScalarNode {
85
- return []string{strings.TrimSpace(node.Value)}
86
- }
87
- for _, item := range node.Content {
88
- switch item.Kind {
89
- case yaml.ScalarNode:
90
- lines = append(lines, strings.TrimSpace(item.Value))
91
- case yaml.MappingNode:
92
- if cmd := mappingValue(item, "cmd"); cmd != nil {
93
- lines = append(lines, strings.TrimSpace(cmd.Value))
94
- } else if task := mappingValue(item, "task"); task != nil {
95
- lines = append(lines, "task "+task.Value)
96
- }
97
- }
98
- }
99
-
100
- return lines
101
- }
@@ -1,7 +0,0 @@
1
- [build]
2
- rustflags = ["-D", "warnings"]
3
-
4
- [alias]
5
- xtask = "run --package xtask --"
6
- gen = { cmd = "run --package xtask -- gen" }
7
- _secret = "test --release"
@@ -1,33 +0,0 @@
1
- # The stubs are generated from the contracts vendored in this tree.
2
- GRPC := internal/transport/grpc
3
- BIN ?= bin/pricing
4
-
5
- .PHONY: help
6
- help: ## List the targets
7
- @grep -E '^[a-z].*##' $(MAKEFILE_LIST)
8
-
9
- .PHONY: gen build
10
- gen: ## Regenerate the gRPC stubs
11
- buf generate $(GRPC)/quote/proto -o $(GRPC)/quote/gen
12
- buf generate $(GRPC)/price_list/proto -o $(GRPC)/price_list/gen
13
-
14
- # Compiles every package. Nothing is installed.
15
- build:
16
- go build ./...
17
-
18
- test lint: build
19
- go test ./...
20
-
21
- _internal:
22
- @true
23
-
24
- $(BIN): build
25
- cp out $(BIN)
26
-
27
- %.pb.go: %.proto
28
- protoc $<
29
-
30
- ifeq ($(CI),1)
31
- ci: test
32
- @echo done
33
- endif
@@ -1,21 +0,0 @@
1
- version: "3"
2
-
3
- tasks:
4
- default:
5
- cmds:
6
- - task: build
7
- build:
8
- desc: Compile the binary
9
- cmds:
10
- - go build -o bin/svc ./cmd/svc
11
- migrate:
12
- summary: Apply pending migrations
13
- cmd: goose up
14
- _shared:
15
- cmds:
16
- - echo hidden
17
- lint:
18
- internal: true
19
- cmds:
20
- - golangci-lint run
21
- fmt: gofmt -w .
@@ -1,21 +0,0 @@
1
- plugins {
2
- id("org.springframework.boot") version "4.1.1"
3
- application
4
- }
5
-
6
- tasks.register<Exec>("generateProto") {
7
- description = "Regenerate the gRPC stubs"
8
- commandLine("buf", "generate")
9
- }
10
-
11
- tasks.register("_shared") {
12
- doLast { println("hidden") }
13
- }
14
-
15
- val smokeTest by tasks.registering(Test::class) {
16
- description = "Run the tests that need the compose stack"
17
- }
18
-
19
- task legacyTask {
20
- doLast { println("old syntax") }
21
- }
@@ -1,20 +0,0 @@
1
- set shell := ["bash", "-cu"]
2
- port := "8080"
3
-
4
- alias t := test
5
-
6
- # Run the service against the compose stack
7
- dev:
8
- docker compose up -d
9
- cargo run
10
-
11
- [doc("Run the tests, unit and integration")]
12
- test *args:
13
- cargo test {{args}}
14
-
15
- [private]
16
- release:
17
- cargo build --release
18
-
19
- _setup:
20
- rustup default stable
@@ -1,13 +0,0 @@
1
- {
2
- "name": "cart",
3
- "scripts": {
4
- "build": "tsc -p tsconfig.build.json",
5
- "prebuild": "rimraf dist",
6
- "start": "node dist/main.js",
7
- "test": "vitest run",
8
- "build:watch": "tsc -w",
9
- "generate": "npm run generate:api && npm run generate:auth",
10
- "generate:api": "openapi-typescript openapi.yaml -o types.ts"
11
- },
12
- "dependencies": {}
13
- }
@@ -1,29 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <project>
3
- <groupId>org.portolan.payments</groupId>
4
- <artifactId>ledger</artifactId>
5
- <packaging>jar</packaging>
6
- <dependencies>
7
- <dependency>
8
- <artifactId>flyway-maven-plugin</artifactId>
9
- </dependency>
10
- </dependencies>
11
- <build>
12
- <pluginManagement>
13
- <plugins>
14
- <plugin>
15
- <artifactId>jib-maven-plugin</artifactId>
16
- </plugin>
17
- </plugins>
18
- </pluginManagement>
19
- <plugins>
20
- <plugin>
21
- <groupId>org.springframework.boot</groupId>
22
- <artifactId>spring-boot-maven-plugin</artifactId>
23
- </plugin>
24
- <plugin>
25
- <artifactId>protobuf-maven-plugin</artifactId>
26
- </plugin>
27
- </plugins>
28
- </build>
29
- </project>
@@ -1,27 +0,0 @@
1
- [project]
2
- name = "billing"
3
- version = "0.1.0"
4
-
5
- [project.scripts]
6
- billing = "billing.cli:main"
7
-
8
- [tool.poe.tasks]
9
- test = "pytest"
10
- lint = ["ruff", "check", "."]
11
- serve = { cmd = "python manage.py runserver", help = "Run the dev server" }
12
- _hidden = "echo no"
13
-
14
- [tool.poe.tasks.migrate]
15
- help = "Apply pending migrations"
16
- cmd = "python manage.py migrate"
17
-
18
- [tool.poe.tasks.check]
19
- sequence = ["lint", "test"]
20
-
21
- [tool.pdm.scripts]
22
- pre_test = "echo before"
23
- test = "pytest -x"
24
-
25
- [tool.pdm.scripts.worker]
26
- shell = "celery -A billing worker"
27
- help = "Run the celery worker"
@@ -1,27 +0,0 @@
1
- use clap::{Parser, Subcommand};
2
-
3
- #[derive(Parser)]
4
- struct Cli {
5
- #[command(subcommand)]
6
- command: Command,
7
- }
8
-
9
- #[derive(Subcommand)]
10
- enum Command {
11
- /// Regenerate the gRPC stubs from the vendored protos
12
- Gen,
13
- /// Run fmt, clippy and the tests the way CI does
14
- Ci { #[arg(long)] fix: bool },
15
- #[command(about = "Build the release artefacts")]
16
- Dist(DistArgs),
17
- }
18
-
19
- fn main() {
20
- let arg = std::env::args().nth(1);
21
- match arg.as_deref() {
22
- Some("gen") => gen(),
23
- // Run the benchmarks against the compose stack
24
- Some("bench") | Some("perf") => bench(),
25
- _ => usage(),
26
- }
27
- }