codeply-cli 0.5.0 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES.md +65 -63
- package/bin/codeply.js +1 -1
- package/lib/agent.mjs +133 -24
- package/lib/ai.js +268 -9
- package/lib/ai.mjs +6 -6
- package/lib/apply-patch.js +217 -217
- package/lib/arity-table.json +138 -138
- package/lib/arity.js +70 -70
- package/lib/auth.mjs +6 -6
- package/lib/bots.js +493 -16
- package/lib/chatgpt.js +282 -0
- package/lib/cloud-browser.mjs +143 -143
- package/lib/cloud.mjs +1186 -1105
- package/lib/commands.js +103 -103
- package/lib/config.js +83 -3
- package/lib/design-library/assemble-artifact.mjs +21 -21
- package/lib/design-library/cleanup.mjs +45 -45
- package/lib/design-library/index.json +22379 -22379
- package/lib/design-library/make-table-data.mjs +39 -39
- package/lib/diagnostics.js +192 -192
- package/lib/edit-engine.js +364 -364
- package/lib/github-agent.mjs +311 -311
- package/lib/history.js +75 -75
- package/lib/mail-watch.js +504 -0
- package/lib/mcp.js +258 -258
- package/lib/model-sync.js +114 -0
- package/lib/native-tools.mjs +16 -1
- package/lib/oauth-connectors.js +146 -24
- package/lib/permissions.js +109 -109
- package/lib/plugins.js +353 -353
- package/lib/publish.js +916 -0
- package/lib/reach.js +67 -0
- package/lib/server.mjs +457 -457
- package/lib/session-db.js +220 -220
- package/lib/share.js +168 -168
- package/lib/skills.js +2 -0
- package/lib/snapshot.js +146 -146
- package/lib/telemetry.js +102 -0
- package/lib/terminal-hints.js +154 -154
- package/lib/tools.mjs +316 -14
- package/lib/typecheck-worker.js +147 -147
- package/lib/web-tools.js +209 -158
- package/package.json +49 -49
- package/skills/SOURCE.md +58 -58
- package/skills/accessibility/SKILL.md +147 -147
- package/skills/agent-architecture-audit/SKILL.md +257 -257
- package/skills/agent-eval/SKILL.md +147 -147
- package/skills/agent-harness-construction/SKILL.md +74 -74
- package/skills/agent-introspection-debugging/SKILL.md +154 -154
- package/skills/agent-payment-x402/SKILL.md +225 -225
- package/skills/agent-self-evaluation/SKILL.md +182 -182
- package/skills/agent-self-evaluation/references/evaluation-criteria.md +71 -71
- package/skills/agent-self-evaluation/references/hook-integration.md +64 -64
- package/skills/agent-sort/SKILL.md +216 -216
- package/skills/agentic-engineering/SKILL.md +64 -64
- package/skills/agentic-os/SKILL.md +388 -388
- package/skills/ai-first-engineering/SKILL.md +52 -52
- package/skills/ai-regression-testing/SKILL.md +386 -386
- package/skills/android-clean-architecture/SKILL.md +340 -340
- package/skills/angular-developer/SKILL.md +155 -155
- package/skills/angular-developer/references/angular-animations.md +160 -160
- package/skills/angular-developer/references/angular-aria.md +410 -410
- package/skills/angular-developer/references/cli.md +86 -86
- package/skills/angular-developer/references/component-harnesses.md +59 -59
- package/skills/angular-developer/references/component-styling.md +91 -91
- package/skills/angular-developer/references/components.md +117 -117
- package/skills/angular-developer/references/creating-services.md +97 -97
- package/skills/angular-developer/references/data-resolvers.md +69 -69
- package/skills/angular-developer/references/define-routes.md +67 -67
- package/skills/angular-developer/references/defining-providers.md +72 -72
- package/skills/angular-developer/references/di-fundamentals.md +120 -120
- package/skills/angular-developer/references/e2e-testing.md +56 -56
- package/skills/angular-developer/references/effects.md +83 -83
- package/skills/angular-developer/references/hierarchical-injectors.md +43 -43
- package/skills/angular-developer/references/host-elements.md +80 -80
- package/skills/angular-developer/references/injection-context.md +63 -63
- package/skills/angular-developer/references/inputs.md +101 -101
- package/skills/angular-developer/references/linked-signal.md +59 -59
- package/skills/angular-developer/references/loading-strategies.md +61 -61
- package/skills/angular-developer/references/mcp.md +108 -108
- package/skills/angular-developer/references/navigate-to-routes.md +69 -69
- package/skills/angular-developer/references/outputs.md +86 -86
- package/skills/angular-developer/references/reactive-forms.md +122 -122
- package/skills/angular-developer/references/rendering-strategies.md +44 -44
- package/skills/angular-developer/references/resource.md +77 -77
- package/skills/angular-developer/references/route-animations.md +56 -56
- package/skills/angular-developer/references/route-guards.md +52 -52
- package/skills/angular-developer/references/router-lifecycle.md +45 -45
- package/skills/angular-developer/references/router-testing.md +87 -87
- package/skills/angular-developer/references/show-routes-with-outlets.md +68 -68
- package/skills/angular-developer/references/signal-forms.md +795 -795
- package/skills/angular-developer/references/signals-overview.md +94 -94
- package/skills/angular-developer/references/tailwind-css.md +69 -69
- package/skills/angular-developer/references/template-driven-forms.md +114 -114
- package/skills/angular-developer/references/testing-fundamentals.md +65 -65
- package/skills/api-connector-builder/SKILL.md +121 -121
- package/skills/api-design/SKILL.md +524 -524
- package/skills/architecture-decision-records/SKILL.md +180 -180
- package/skills/article-writing/SKILL.md +80 -80
- package/skills/automation-audit-ops/SKILL.md +143 -143
- package/skills/autonomous-agent-harness/SKILL.md +274 -274
- package/skills/autonomous-loops/SKILL.md +611 -611
- package/skills/backend-patterns/SKILL.md +562 -562
- package/skills/benchmark/SKILL.md +95 -95
- package/skills/benchmark-methodology/SKILL.md +191 -191
- package/skills/benchmark-optimization-loop/SKILL.md +71 -71
- package/skills/blender-motion-state-inspection/SKILL.md +165 -165
- package/skills/blueprint/SKILL.md +106 -106
- package/skills/brand-discovery/SKILL.md +145 -145
- package/skills/brand-discovery/references/10_purpose-why.md +40 -40
- package/skills/brand-discovery/references/20_positioning.md +44 -44
- package/skills/brand-discovery/references/30_audience-niche.md +52 -52
- package/skills/brand-discovery/references/40_personality-archetype.md +57 -57
- package/skills/brand-discovery/references/50_voice-tone.md +59 -59
- package/skills/brand-discovery/references/60_narrative-story.md +50 -50
- package/skills/brand-discovery/references/70_founder-tension.md +49 -49
- package/skills/brand-discovery/references/90_SYNTHESIS.md +133 -133
- package/skills/brand-voice/SKILL.md +98 -98
- package/skills/brand-voice/references/voice-profile-schema.md +55 -55
- package/skills/browser-qa/SKILL.md +105 -105
- package/skills/bun-runtime/SKILL.md +85 -85
- package/skills/canary-watch/SKILL.md +108 -108
- package/skills/carrier-relationship-management/SKILL.md +212 -212
- package/skills/cisco-ios-patterns/SKILL.md +164 -164
- package/skills/ck/SKILL.md +148 -148
- package/skills/claude-devfleet/SKILL.md +112 -112
- package/skills/click-path-audit/SKILL.md +245 -245
- package/skills/clickhouse-io/SKILL.md +445 -445
- package/skills/code-tour/SKILL.md +254 -254
- package/skills/codebase-onboarding/SKILL.md +234 -234
- package/skills/codehealth-mcp/SKILL.md +167 -167
- package/skills/coding-standards/SKILL.md +551 -551
- package/skills/competitive-platform-analysis/SKILL.md +214 -214
- package/skills/competitive-report-structure/SKILL.md +162 -162
- package/skills/compose-multiplatform-patterns/SKILL.md +300 -300
- package/skills/config-gc/SKILL.md +120 -120
- package/skills/configure-ecc/SKILL.md +385 -385
- package/skills/connections-optimizer/SKILL.md +190 -190
- package/skills/content-engine/SKILL.md +132 -132
- package/skills/content-hash-cache-pattern/SKILL.md +162 -162
- package/skills/context-budget/SKILL.md +136 -136
- package/skills/continuous-agent-loop/SKILL.md +46 -46
- package/skills/continuous-learning/SKILL.md +132 -132
- package/skills/continuous-learning-v2/SKILL.md +361 -361
- package/skills/contract-first/SKILL.md +287 -287
- package/skills/cost-aware-llm-pipeline/SKILL.md +184 -184
- package/skills/cost-tracking/SKILL.md +97 -97
- package/skills/council/SKILL.md +204 -204
- package/skills/cpp-coding-standards/SKILL.md +724 -724
- package/skills/cpp-testing/SKILL.md +325 -325
- package/skills/crosspost/SKILL.md +112 -112
- package/skills/csharp-testing/SKILL.md +322 -322
- package/skills/customer-billing-ops/SKILL.md +141 -141
- package/skills/customs-trade-compliance/SKILL.md +263 -263
- package/skills/dart-flutter-patterns/SKILL.md +564 -564
- package/skills/dashboard-builder/SKILL.md +109 -109
- package/skills/data-scraper-agent/SKILL.md +765 -765
- package/skills/data-throughput-accelerator/SKILL.md +74 -74
- package/skills/database-migrations/SKILL.md +430 -430
- package/skills/deep-research/SKILL.md +160 -160
- package/skills/defi-amm-security/SKILL.md +167 -167
- package/skills/delivery-gate/SKILL.md +126 -126
- package/skills/deployment-patterns/SKILL.md +428 -428
- package/skills/design-system/SKILL.md +83 -83
- package/skills/django-celery/SKILL.md +458 -458
- package/skills/django-patterns/SKILL.md +735 -735
- package/skills/django-security/SKILL.md +644 -644
- package/skills/django-tdd/SKILL.md +730 -730
- package/skills/django-verification/SKILL.md +470 -470
- package/skills/dmux-workflows/SKILL.md +192 -192
- package/skills/docker-patterns/SKILL.md +365 -365
- package/skills/documentation-lookup/SKILL.md +91 -91
- package/skills/dotnet-patterns/SKILL.md +322 -322
- package/skills/dynamic-workflow-mode/SKILL.md +124 -124
- package/skills/e2e-testing/SKILL.md +327 -327
- package/skills/ecc-guide/SKILL.md +190 -190
- package/skills/ecc-recipes/SKILL.md +149 -149
- package/skills/ecc-tools-cost-audit/SKILL.md +161 -161
- package/skills/email-ops/SKILL.md +122 -122
- package/skills/energy-procurement/SKILL.md +228 -228
- package/skills/enterprise-agent-ops/SKILL.md +51 -51
- package/skills/error-handling/SKILL.md +377 -377
- package/skills/eval-harness/SKILL.md +271 -271
- package/skills/evm-token-decimals/SKILL.md +131 -131
- package/skills/exa-search/SKILL.md +108 -108
- package/skills/fal-ai-media/SKILL.md +289 -289
- package/skills/fastapi-patterns/SKILL.md +514 -514
- package/skills/finance-billing-ops/SKILL.md +128 -128
- package/skills/flox-environments/SKILL.md +497 -497
- package/skills/flutter-dart-code-review/SKILL.md +436 -436
- package/skills/foundation-models-on-device/SKILL.md +243 -243
- package/skills/frontend-a11y/SKILL.md +446 -446
- package/skills/frontend-design-direction/SKILL.md +93 -93
- package/skills/frontend-patterns/SKILL.md +657 -657
- package/skills/frontend-slides/SKILL.md +185 -185
- package/skills/fsharp-testing/SKILL.md +281 -281
- package/skills/gan-style-harness/SKILL.md +279 -279
- package/skills/gateguard/SKILL.md +133 -133
- package/skills/generating-python-installer/SKILL.md +820 -820
- package/skills/git-workflow/SKILL.md +716 -716
- package/skills/github-ops/SKILL.md +145 -145
- package/skills/golang-patterns/SKILL.md +676 -676
- package/skills/golang-testing/SKILL.md +721 -721
- package/skills/google-workspace-ops/SKILL.md +96 -96
- package/skills/growth-log/SKILL.md +128 -128
- package/skills/healthcare-cdss-patterns/SKILL.md +246 -246
- package/skills/healthcare-emr-patterns/SKILL.md +160 -160
- package/skills/healthcare-eval-harness/SKILL.md +208 -208
- package/skills/healthcare-phi-compliance/SKILL.md +146 -146
- package/skills/hermes-imports/SKILL.md +89 -89
- package/skills/hexagonal-architecture/SKILL.md +277 -277
- package/skills/hipaa-compliance/SKILL.md +79 -79
- package/skills/homelab-network-readiness/SKILL.md +170 -170
- package/skills/homelab-network-setup/SKILL.md +130 -130
- package/skills/homelab-pihole-dns/SKILL.md +275 -275
- package/skills/homelab-vlan-segmentation/SKILL.md +312 -312
- package/skills/homelab-wireguard-vpn/SKILL.md +306 -306
- package/skills/hookify-rules/SKILL.md +128 -128
- package/skills/inherit-legacy-style/SKILL.md +157 -157
- package/skills/intent-driven-development/SKILL.md +360 -360
- package/skills/inventory-demand-planning/SKILL.md +247 -247
- package/skills/investor-materials/SKILL.md +97 -97
- package/skills/investor-outreach/SKILL.md +92 -92
- package/skills/ios-icon-gen/SKILL.md +158 -158
- package/skills/iterative-retrieval/SKILL.md +212 -212
- package/skills/ito-basket-compare/SKILL.md +64 -64
- package/skills/ito-compute/SKILL.md +129 -129
- package/skills/ito-data-atlas-agent/SKILL.md +64 -64
- package/skills/ito-market-intelligence/SKILL.md +61 -61
- package/skills/ito-trade-planner/SKILL.md +68 -68
- package/skills/java-coding-standards/SKILL.md +384 -384
- package/skills/jira-integration/SKILL.md +303 -303
- package/skills/jpa-patterns/SKILL.md +152 -152
- package/skills/knowledge-ops/SKILL.md +155 -155
- package/skills/kotlin-coroutines-flows/SKILL.md +285 -285
- package/skills/kotlin-exposed-patterns/SKILL.md +720 -720
- package/skills/kotlin-ktor-patterns/SKILL.md +690 -690
- package/skills/kotlin-patterns/SKILL.md +712 -712
- package/skills/kotlin-testing/SKILL.md +825 -825
- package/skills/kubernetes-patterns/SKILL.md +756 -756
- package/skills/laravel-patterns/SKILL.md +416 -416
- package/skills/laravel-plugin-discovery/SKILL.md +230 -230
- package/skills/laravel-security/SKILL.md +948 -948
- package/skills/laravel-tdd/SKILL.md +675 -675
- package/skills/laravel-verification/SKILL.md +180 -180
- package/skills/latency-critical-systems/SKILL.md +75 -75
- package/skills/lead-intelligence/SKILL.md +322 -322
- package/skills/liquid-glass-design/SKILL.md +279 -279
- package/skills/llm-trading-agent-security/SKILL.md +147 -147
- package/skills/logistics-exception-management/SKILL.md +222 -222
- package/skills/loop-design-check/SKILL.md +143 -143
- package/skills/mailtrap-email-integration/SKILL.md +77 -77
- package/skills/make-interfaces-feel-better/SKILL.md +152 -152
- package/skills/manim-video/SKILL.md +90 -90
- package/skills/market-research/SKILL.md +76 -76
- package/skills/marketing-campaign/SKILL.md +114 -114
- package/skills/mcp-server-patterns/SKILL.md +70 -70
- package/skills/messages-ops/SKILL.md +105 -105
- package/skills/ml-adoption-playbook/SKILL.md +57 -57
- package/skills/mle-workflow/SKILL.md +348 -348
- package/skills/motion-advanced/SKILL.md +596 -596
- package/skills/motion-foundations/SKILL.md +299 -299
- package/skills/motion-patterns/SKILL.md +434 -434
- package/skills/motion-ui/SKILL.md +576 -576
- package/skills/mysql-patterns/SKILL.md +413 -413
- package/skills/nanoclaw-repl/SKILL.md +34 -34
- package/skills/nestjs-patterns/SKILL.md +231 -231
- package/skills/netmiko-ssh-automation/SKILL.md +174 -174
- package/skills/network-bgp-diagnostics/SKILL.md +168 -168
- package/skills/network-config-validation/SKILL.md +211 -211
- package/skills/network-interface-health/SKILL.md +153 -153
- package/skills/nextjs-turbopack/SKILL.md +58 -58
- package/skills/nodejs-keccak256/SKILL.md +103 -103
- package/skills/nutrient-document-processing/SKILL.md +168 -168
- package/skills/nuxt4-patterns/SKILL.md +101 -101
- package/skills/openclaw-persona-forge/SKILL.md +289 -289
- package/skills/openclaw-persona-forge/references/avatar-style.md +124 -124
- package/skills/openclaw-persona-forge/references/boundary-rules.md +53 -53
- package/skills/openclaw-persona-forge/references/error-handling.md +53 -53
- package/skills/openclaw-persona-forge/references/identity-tension.md +48 -48
- package/skills/openclaw-persona-forge/references/naming-system.md +39 -39
- package/skills/openclaw-persona-forge/references/output-template.md +166 -166
- package/skills/opensource-pipeline/SKILL.md +256 -256
- package/skills/orch-add-feature/SKILL.md +45 -45
- package/skills/orch-build-mvp/SKILL.md +49 -49
- package/skills/orch-change-feature/SKILL.md +43 -43
- package/skills/orch-fix-defect/SKILL.md +43 -43
- package/skills/orch-pipeline/SKILL.md +121 -121
- package/skills/orch-refine-code/SKILL.md +44 -44
- package/skills/parallel-execution-optimizer/SKILL.md +74 -74
- package/skills/perl-patterns/SKILL.md +505 -505
- package/skills/perl-security/SKILL.md +504 -504
- package/skills/perl-testing/SKILL.md +476 -476
- package/skills/plan-canvas/SKILL.md +153 -153
- package/skills/plan-orchestrate/SKILL.md +263 -263
- package/skills/plankton-code-quality/SKILL.md +237 -237
- package/skills/postgres-patterns/SKILL.md +148 -148
- package/skills/prediction-market-oracle-research/SKILL.md +64 -64
- package/skills/prediction-market-risk-review/SKILL.md +61 -61
- package/skills/premium-web-design/SKILL.md +154 -154
- package/skills/prisma-patterns/SKILL.md +401 -401
- package/skills/product-capability/SKILL.md +142 -142
- package/skills/product-lens/SKILL.md +93 -93
- package/skills/production-audit/SKILL.md +207 -207
- package/skills/production-scheduling/SKILL.md +238 -238
- package/skills/project-flow-ops/SKILL.md +112 -112
- package/skills/prompt-optimizer/SKILL.md +398 -398
- package/skills/publish-website/SKILL.md +76 -0
- package/skills/python-patterns/SKILL.md +751 -751
- package/skills/python-testing/SKILL.md +817 -817
- package/skills/pytorch-patterns/SKILL.md +397 -397
- package/skills/quality-nonconformance/SKILL.md +260 -260
- package/skills/quarkus-patterns/SKILL.md +723 -723
- package/skills/quarkus-security/SKILL.md +468 -468
- package/skills/quarkus-tdd/SKILL.md +812 -812
- package/skills/quarkus-verification/SKILL.md +480 -480
- package/skills/ralphinho-rfc-pipeline/SKILL.md +68 -68
- package/skills/react-native-patterns/SKILL.md +326 -326
- package/skills/react-patterns/SKILL.md +342 -342
- package/skills/react-performance/SKILL.md +575 -575
- package/skills/react-testing/SKILL.md +424 -424
- package/skills/recsys-pipeline-architect/SKILL.md +115 -115
- package/skills/recursive-decision-ledger/SKILL.md +81 -81
- package/skills/redis-patterns/SKILL.md +404 -404
- package/skills/regex-vs-llm-structured-text/SKILL.md +221 -221
- package/skills/remotion-video-creation/SKILL.md +43 -43
- package/skills/repo-scan/SKILL.md +79 -79
- package/skills/research-ops/SKILL.md +113 -113
- package/skills/returns-reverse-logistics/SKILL.md +240 -240
- package/skills/rules-distill/SKILL.md +265 -265
- package/skills/rust-patterns/SKILL.md +500 -500
- package/skills/rust-testing/SKILL.md +501 -501
- package/skills/safety-guard/SKILL.md +76 -76
- package/skills/santa-method/SKILL.md +307 -307
- package/skills/scientific-db-pubmed-database/SKILL.md +176 -176
- package/skills/scientific-db-uspto-database/SKILL.md +178 -178
- package/skills/scientific-pkg-gget/SKILL.md +167 -167
- package/skills/scientific-thinking-literature-review/SKILL.md +193 -193
- package/skills/scientific-thinking-scholar-evaluation/SKILL.md +161 -161
- package/skills/search-first/SKILL.md +183 -183
- package/skills/security-bounty-hunter/SKILL.md +100 -100
- package/skills/security-review/SKILL.md +504 -504
- package/skills/security-scan/SKILL.md +166 -166
- package/skills/seo/SKILL.md +155 -155
- package/skills/skill-comply/SKILL.md +59 -59
- package/skills/skill-scout/SKILL.md +141 -141
- package/skills/skill-stocktake/SKILL.md +195 -195
- package/skills/social-graph-ranker/SKILL.md +155 -155
- package/skills/social-publisher/SKILL.md +130 -130
- package/skills/springboot-patterns/SKILL.md +315 -315
- package/skills/springboot-security/SKILL.md +273 -273
- package/skills/springboot-tdd/SKILL.md +159 -159
- package/skills/springboot-verification/SKILL.md +232 -232
- package/skills/strategic-compact/SKILL.md +142 -142
- package/skills/swift-actor-persistence/SKILL.md +144 -144
- package/skills/swift-concurrency-6-2/SKILL.md +216 -216
- package/skills/swift-protocol-di-testing/SKILL.md +191 -191
- package/skills/swiftui-patterns/SKILL.md +259 -259
- package/skills/taste/SKILL.md +264 -264
- package/skills/taste/references/genre-taxonomy.md +87 -87
- package/skills/tdd-workflow/SKILL.md +583 -583
- package/skills/team-agent-orchestration/SKILL.md +111 -111
- package/skills/team-builder/SKILL.md +169 -169
- package/skills/terminal-ops/SKILL.md +110 -110
- package/skills/tinystruct-patterns/SKILL.md +279 -279
- package/skills/tinystruct-patterns/references/architecture.md +90 -90
- package/skills/tinystruct-patterns/references/data-handling.md +60 -60
- package/skills/tinystruct-patterns/references/database.md +99 -99
- package/skills/tinystruct-patterns/references/routing.md +64 -64
- package/skills/tinystruct-patterns/references/system-usage.md +97 -97
- package/skills/tinystruct-patterns/references/testing.md +72 -72
- package/skills/token-budget-advisor/SKILL.md +134 -134
- package/skills/ui-demo/SKILL.md +466 -466
- package/skills/ui-to-vue/SKILL.md +135 -135
- package/skills/uncloud/SKILL.md +344 -344
- package/skills/unified-memory/SKILL.md +170 -170
- package/skills/unified-notifications-ops/SKILL.md +188 -188
- package/skills/verification-loop/SKILL.md +129 -129
- package/skills/video-editing/SKILL.md +311 -311
- package/skills/videodb/SKILL.md +375 -375
- package/skills/visa-doc-translate/SKILL.md +117 -117
- package/skills/vite-patterns/SKILL.md +450 -450
- package/skills/vue-patterns/SKILL.md +471 -471
- package/skills/windows-desktop-e2e/SKILL.md +888 -888
- package/skills/workspace-surface-audit/SKILL.md +126 -126
- package/skills/x-api/SKILL.md +235 -235
|
@@ -1,90 +1,90 @@
|
|
|
1
|
-
# tinystruct Architecture and Configuration
|
|
2
|
-
|
|
3
|
-
## When to Use
|
|
4
|
-
|
|
5
|
-
Choose **tinystruct** when you need a lightweight, high-performance Java framework that treats CLI and HTTP as equal citizens. Ideal for microservices, CLI utilities, and data-driven applications with a small footprint and zero-dependency JSON handling.
|
|
6
|
-
|
|
7
|
-
## How It Works
|
|
8
|
-
|
|
9
|
-
### Core Architecture
|
|
10
|
-
|
|
11
|
-
The framework operates on a singleton `ActionRegistry` that maps URL patterns (or command strings) to `Action` objects. When a request arrives, the system resolves the path and invokes the corresponding method handle.
|
|
12
|
-
|
|
13
|
-
#### Key Abstractions
|
|
14
|
-
|
|
15
|
-
| Class/Interface | Role |
|
|
16
|
-
|---|---|
|
|
17
|
-
| `AbstractApplication` | Base class for all tinystruct applications. Extend this. |
|
|
18
|
-
| `@Action` annotation | Maps a method to a URI path (web) or command name (CLI). The single routing primitive. |
|
|
19
|
-
| `ActionRegistry` | Singleton that maps URL patterns to `Action` objects via regex. Never instantiate directly. |
|
|
20
|
-
| `Action` | Wraps a `MethodHandle` + regex pattern + priority + `Mode` for dispatch. |
|
|
21
|
-
| `Context` | Per-request state store. Access via `getContext()`. Holds CLI args and HTTP request/response. |
|
|
22
|
-
| `Dispatcher` | CLI entry point (`bin/dispatcher`). Reads `--import` to load applications. |
|
|
23
|
-
| `HttpServer` | Built-in HTTP server. Start with `bin/dispatcher start --import org.tinystruct.system.HttpServer`. |
|
|
24
|
-
|
|
25
|
-
### Package Map
|
|
26
|
-
|
|
27
|
-
```
|
|
28
|
-
org.tinystruct/
|
|
29
|
-
├── AbstractApplication.java ← extend this
|
|
30
|
-
├── Application.java ← interface
|
|
31
|
-
├── ApplicationException.java ← checked exception
|
|
32
|
-
├── ApplicationRuntimeException.java ← unchecked exception
|
|
33
|
-
├── application/
|
|
34
|
-
│ ├── Action.java ← runtime action wrapper
|
|
35
|
-
│ ├── ActionRegistry.java ← singleton route registry
|
|
36
|
-
│ └── Context.java ← request context
|
|
37
|
-
├── system/
|
|
38
|
-
│ ├── annotation/Action.java ← @Action annotation + Mode enum
|
|
39
|
-
│ ├── Dispatcher.java ← CLI dispatcher
|
|
40
|
-
│ ├── HttpServer.java ← built-in HTTP server
|
|
41
|
-
│ ├── EventDispatcher.java ← event bus
|
|
42
|
-
│ └── Settings.java ← reads application.properties
|
|
43
|
-
├── data/
|
|
44
|
-
│ ├── component/Builder.java ← JSON object (use instead of Gson/Jackson)
|
|
45
|
-
│ ├── component/Builders.java ← JSON array
|
|
46
|
-
│ ├── component/AbstractData.java ← base POJO for DB persistence
|
|
47
|
-
│ ├── component/Condition.java ← fluent SQL query builder
|
|
48
|
-
│ ├── component/FieldType.java ← SQL-to-Java type mappings
|
|
49
|
-
│ ├── Mapping.java ← reads .map.xml metadata
|
|
50
|
-
│ ├── DatabaseOperator.java ← low-level JDBC wrapper
|
|
51
|
-
│ └── FileEntity.java ← file upload representation
|
|
52
|
-
├── http/ ← Request, Response, Constants
|
|
53
|
-
│ └── SSEPushManager.java ← Server-Sent Events management
|
|
54
|
-
└── net/ ← URLRequest, HTTPHandler (outbound HTTP)
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
### Template Behavior and Dispatch Flow
|
|
58
|
-
|
|
59
|
-
By default, the framework assumes a view template is required. If `templateRequired` is `true`, `toString()` looks for a `.view` file in `src/main/resources/themes/<ClassName>.view`. Use `setVariable("name", value)` to pass data to templates, which use `{%name%}` for interpolation.
|
|
60
|
-
|
|
61
|
-
## Examples
|
|
62
|
-
|
|
63
|
-
### Minimal Application Initialization
|
|
64
|
-
```java
|
|
65
|
-
@Override
|
|
66
|
-
public void init() {
|
|
67
|
-
this.setTemplateRequired(false); // Skip .view template lookup for data-only apps
|
|
68
|
-
// Do NOT call setAction() here — use @Action annotation instead
|
|
69
|
-
}
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
### Action Definition and CLI Invocation
|
|
73
|
-
```java
|
|
74
|
-
@Action("hello")
|
|
75
|
-
public String hello() {
|
|
76
|
-
return "Hello, tinystruct!";
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
**Execution via Dispatcher:**
|
|
80
|
-
```bash
|
|
81
|
-
bin/dispatcher hello
|
|
82
|
-
bin/dispatcher greet/James
|
|
83
|
-
bin/dispatcher echo --words "Hello" --import com.example.HelloApp
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
### Configuration Access
|
|
87
|
-
Located at `src/main/resources/application.properties`:
|
|
88
|
-
```java
|
|
89
|
-
String port = this.getConfiguration("server.port");
|
|
90
|
-
```
|
|
1
|
+
# tinystruct Architecture and Configuration
|
|
2
|
+
|
|
3
|
+
## When to Use
|
|
4
|
+
|
|
5
|
+
Choose **tinystruct** when you need a lightweight, high-performance Java framework that treats CLI and HTTP as equal citizens. Ideal for microservices, CLI utilities, and data-driven applications with a small footprint and zero-dependency JSON handling.
|
|
6
|
+
|
|
7
|
+
## How It Works
|
|
8
|
+
|
|
9
|
+
### Core Architecture
|
|
10
|
+
|
|
11
|
+
The framework operates on a singleton `ActionRegistry` that maps URL patterns (or command strings) to `Action` objects. When a request arrives, the system resolves the path and invokes the corresponding method handle.
|
|
12
|
+
|
|
13
|
+
#### Key Abstractions
|
|
14
|
+
|
|
15
|
+
| Class/Interface | Role |
|
|
16
|
+
|---|---|
|
|
17
|
+
| `AbstractApplication` | Base class for all tinystruct applications. Extend this. |
|
|
18
|
+
| `@Action` annotation | Maps a method to a URI path (web) or command name (CLI). The single routing primitive. |
|
|
19
|
+
| `ActionRegistry` | Singleton that maps URL patterns to `Action` objects via regex. Never instantiate directly. |
|
|
20
|
+
| `Action` | Wraps a `MethodHandle` + regex pattern + priority + `Mode` for dispatch. |
|
|
21
|
+
| `Context` | Per-request state store. Access via `getContext()`. Holds CLI args and HTTP request/response. |
|
|
22
|
+
| `Dispatcher` | CLI entry point (`bin/dispatcher`). Reads `--import` to load applications. |
|
|
23
|
+
| `HttpServer` | Built-in HTTP server. Start with `bin/dispatcher start --import org.tinystruct.system.HttpServer`. |
|
|
24
|
+
|
|
25
|
+
### Package Map
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
org.tinystruct/
|
|
29
|
+
├── AbstractApplication.java ← extend this
|
|
30
|
+
├── Application.java ← interface
|
|
31
|
+
├── ApplicationException.java ← checked exception
|
|
32
|
+
├── ApplicationRuntimeException.java ← unchecked exception
|
|
33
|
+
├── application/
|
|
34
|
+
│ ├── Action.java ← runtime action wrapper
|
|
35
|
+
│ ├── ActionRegistry.java ← singleton route registry
|
|
36
|
+
│ └── Context.java ← request context
|
|
37
|
+
├── system/
|
|
38
|
+
│ ├── annotation/Action.java ← @Action annotation + Mode enum
|
|
39
|
+
│ ├── Dispatcher.java ← CLI dispatcher
|
|
40
|
+
│ ├── HttpServer.java ← built-in HTTP server
|
|
41
|
+
│ ├── EventDispatcher.java ← event bus
|
|
42
|
+
│ └── Settings.java ← reads application.properties
|
|
43
|
+
├── data/
|
|
44
|
+
│ ├── component/Builder.java ← JSON object (use instead of Gson/Jackson)
|
|
45
|
+
│ ├── component/Builders.java ← JSON array
|
|
46
|
+
│ ├── component/AbstractData.java ← base POJO for DB persistence
|
|
47
|
+
│ ├── component/Condition.java ← fluent SQL query builder
|
|
48
|
+
│ ├── component/FieldType.java ← SQL-to-Java type mappings
|
|
49
|
+
│ ├── Mapping.java ← reads .map.xml metadata
|
|
50
|
+
│ ├── DatabaseOperator.java ← low-level JDBC wrapper
|
|
51
|
+
│ └── FileEntity.java ← file upload representation
|
|
52
|
+
├── http/ ← Request, Response, Constants
|
|
53
|
+
│ └── SSEPushManager.java ← Server-Sent Events management
|
|
54
|
+
└── net/ ← URLRequest, HTTPHandler (outbound HTTP)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Template Behavior and Dispatch Flow
|
|
58
|
+
|
|
59
|
+
By default, the framework assumes a view template is required. If `templateRequired` is `true`, `toString()` looks for a `.view` file in `src/main/resources/themes/<ClassName>.view`. Use `setVariable("name", value)` to pass data to templates, which use `{%name%}` for interpolation.
|
|
60
|
+
|
|
61
|
+
## Examples
|
|
62
|
+
|
|
63
|
+
### Minimal Application Initialization
|
|
64
|
+
```java
|
|
65
|
+
@Override
|
|
66
|
+
public void init() {
|
|
67
|
+
this.setTemplateRequired(false); // Skip .view template lookup for data-only apps
|
|
68
|
+
// Do NOT call setAction() here — use @Action annotation instead
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Action Definition and CLI Invocation
|
|
73
|
+
```java
|
|
74
|
+
@Action("hello")
|
|
75
|
+
public String hello() {
|
|
76
|
+
return "Hello, tinystruct!";
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
**Execution via Dispatcher:**
|
|
80
|
+
```bash
|
|
81
|
+
bin/dispatcher hello
|
|
82
|
+
bin/dispatcher greet/James
|
|
83
|
+
bin/dispatcher echo --words "Hello" --import com.example.HelloApp
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Configuration Access
|
|
87
|
+
Located at `src/main/resources/application.properties`:
|
|
88
|
+
```java
|
|
89
|
+
String port = this.getConfiguration("server.port");
|
|
90
|
+
```
|
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
# tinystruct Data Handling (JSON)
|
|
2
|
-
|
|
3
|
-
## When to Use
|
|
4
|
-
|
|
5
|
-
Prefer `org.tinystruct.data.component.Builder` and `Builders` for lightweight, zero-dependency JSON. Use `Builder` for JSON objects (`{}`), `Builders` for JSON arrays (`[]`). **Always use `Builders` instead of `List<Builder>`** to avoid generic type erasure issues.
|
|
6
|
-
|
|
7
|
-
## How It Works
|
|
8
|
-
|
|
9
|
-
`Builder` provides a key-value interface for creating and reading JSON objects. `Builders` provides an indexed list for JSON arrays. Both integrate directly with `AbstractApplication` result handling.
|
|
10
|
-
|
|
11
|
-
### Why Builder/Builders?
|
|
12
|
-
- **Zero External Dependencies** — lean and fast
|
|
13
|
-
- **Native Integration** — works with framework result handling
|
|
14
|
-
- **Type Safety** — `Builders` serializes properly to `[]`; `List<Builder>` can cause casting issues
|
|
15
|
-
|
|
16
|
-
## Examples
|
|
17
|
-
|
|
18
|
-
### Serialize a Single Object
|
|
19
|
-
```java
|
|
20
|
-
import org.tinystruct.data.component.Builder;
|
|
21
|
-
|
|
22
|
-
Builder response = new Builder();
|
|
23
|
-
response.put("status", "success");
|
|
24
|
-
response.put("count", 42);
|
|
25
|
-
return response.toString(); // {"status":"success","count":42}
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
### Serialize a List using Builders
|
|
29
|
-
```java
|
|
30
|
-
import org.tinystruct.data.component.Builder;
|
|
31
|
-
import org.tinystruct.data.component.Builders;
|
|
32
|
-
|
|
33
|
-
Builders dataList = new Builders();
|
|
34
|
-
for (MyModel item : myCollection) {
|
|
35
|
-
Builder b = new Builder();
|
|
36
|
-
b.put("id", item.getId());
|
|
37
|
-
b.put("name", item.getName());
|
|
38
|
-
dataList.add(b);
|
|
39
|
-
}
|
|
40
|
-
Builder response = new Builder();
|
|
41
|
-
response.put("data", dataList);
|
|
42
|
-
return response.toString(); // {"data":[{"id":1,"name":"X"}]}
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
### Parse a JSON Object
|
|
46
|
-
```java
|
|
47
|
-
Builder parsed = new Builder();
|
|
48
|
-
parsed.parse(jsonString);
|
|
49
|
-
String status = parsed.get("status").toString();
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### Parse a JSON Array
|
|
53
|
-
```java
|
|
54
|
-
Builders parsedArray = new Builders();
|
|
55
|
-
parsedArray.parse(jsonArrayString);
|
|
56
|
-
for (int i = 0; i < parsedArray.size(); i++) {
|
|
57
|
-
Builder item = parsedArray.get(i);
|
|
58
|
-
System.out.println(item.get("name"));
|
|
59
|
-
}
|
|
60
|
-
```
|
|
1
|
+
# tinystruct Data Handling (JSON)
|
|
2
|
+
|
|
3
|
+
## When to Use
|
|
4
|
+
|
|
5
|
+
Prefer `org.tinystruct.data.component.Builder` and `Builders` for lightweight, zero-dependency JSON. Use `Builder` for JSON objects (`{}`), `Builders` for JSON arrays (`[]`). **Always use `Builders` instead of `List<Builder>`** to avoid generic type erasure issues.
|
|
6
|
+
|
|
7
|
+
## How It Works
|
|
8
|
+
|
|
9
|
+
`Builder` provides a key-value interface for creating and reading JSON objects. `Builders` provides an indexed list for JSON arrays. Both integrate directly with `AbstractApplication` result handling.
|
|
10
|
+
|
|
11
|
+
### Why Builder/Builders?
|
|
12
|
+
- **Zero External Dependencies** — lean and fast
|
|
13
|
+
- **Native Integration** — works with framework result handling
|
|
14
|
+
- **Type Safety** — `Builders` serializes properly to `[]`; `List<Builder>` can cause casting issues
|
|
15
|
+
|
|
16
|
+
## Examples
|
|
17
|
+
|
|
18
|
+
### Serialize a Single Object
|
|
19
|
+
```java
|
|
20
|
+
import org.tinystruct.data.component.Builder;
|
|
21
|
+
|
|
22
|
+
Builder response = new Builder();
|
|
23
|
+
response.put("status", "success");
|
|
24
|
+
response.put("count", 42);
|
|
25
|
+
return response.toString(); // {"status":"success","count":42}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Serialize a List using Builders
|
|
29
|
+
```java
|
|
30
|
+
import org.tinystruct.data.component.Builder;
|
|
31
|
+
import org.tinystruct.data.component.Builders;
|
|
32
|
+
|
|
33
|
+
Builders dataList = new Builders();
|
|
34
|
+
for (MyModel item : myCollection) {
|
|
35
|
+
Builder b = new Builder();
|
|
36
|
+
b.put("id", item.getId());
|
|
37
|
+
b.put("name", item.getName());
|
|
38
|
+
dataList.add(b);
|
|
39
|
+
}
|
|
40
|
+
Builder response = new Builder();
|
|
41
|
+
response.put("data", dataList);
|
|
42
|
+
return response.toString(); // {"data":[{"id":1,"name":"X"}]}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Parse a JSON Object
|
|
46
|
+
```java
|
|
47
|
+
Builder parsed = new Builder();
|
|
48
|
+
parsed.parse(jsonString);
|
|
49
|
+
String status = parsed.get("status").toString();
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Parse a JSON Array
|
|
53
|
+
```java
|
|
54
|
+
Builders parsedArray = new Builders();
|
|
55
|
+
parsedArray.parse(jsonArrayString);
|
|
56
|
+
for (int i = 0; i < parsedArray.size(); i++) {
|
|
57
|
+
Builder item = parsedArray.get(i);
|
|
58
|
+
System.out.println(item.get("name"));
|
|
59
|
+
}
|
|
60
|
+
```
|
|
@@ -1,99 +1,99 @@
|
|
|
1
|
-
# tinystruct Database Persistence
|
|
2
|
-
|
|
3
|
-
## When to Use
|
|
4
|
-
|
|
5
|
-
Use the built-in ORM-like data layer for database operations. It provides a lightweight alternative to JPA/Hibernate using POJOs extending `AbstractData` and XML mapping files.
|
|
6
|
-
|
|
7
|
-
## How It Works
|
|
8
|
-
|
|
9
|
-
### Architecture
|
|
10
|
-
|
|
11
|
-
Each table is represented by:
|
|
12
|
-
1. **Java POJO**: Extends `AbstractData`, provides getters/setters and `setData(Row)`.
|
|
13
|
-
2. **Mapping XML**: `ClassName.map.xml` in resources, binding Java fields to DB columns.
|
|
14
|
-
|
|
15
|
-
#### Key Base Class: `AbstractData`
|
|
16
|
-
Provides CRUD methods:
|
|
17
|
-
- `append()` / `appendAndGetId()`
|
|
18
|
-
- `update()`
|
|
19
|
-
- `delete()`
|
|
20
|
-
- `findAll()` / `findOneById()` / `findOneByKey(key, value)`
|
|
21
|
-
- `findWith(where, params)`
|
|
22
|
-
- `find(SQL, params)`
|
|
23
|
-
|
|
24
|
-
### POJO Generation (CLI)
|
|
25
|
-
|
|
26
|
-
Introspect a live database table to produce the POJO and mapping file.
|
|
27
|
-
|
|
28
|
-
#### Configuration
|
|
29
|
-
`application.properties`:
|
|
30
|
-
```properties
|
|
31
|
-
driver=com.mysql.cj.jdbc.Driver
|
|
32
|
-
database.url=jdbc:mysql://localhost:3306/mydb
|
|
33
|
-
database.user=root
|
|
34
|
-
database.password=secret
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
#### Command
|
|
38
|
-
```bash
|
|
39
|
-
# Interactive mode
|
|
40
|
-
bin/dispatcher generate
|
|
41
|
-
|
|
42
|
-
# Specify table
|
|
43
|
-
bin/dispatcher generate --tables users
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
## Examples
|
|
47
|
-
|
|
48
|
-
### CRUD Operations
|
|
49
|
-
```java
|
|
50
|
-
// CREATE
|
|
51
|
-
User user = new User();
|
|
52
|
-
user.setUsername("james");
|
|
53
|
-
user.append();
|
|
54
|
-
|
|
55
|
-
// READ
|
|
56
|
-
User user = new User();
|
|
57
|
-
user.setId(42);
|
|
58
|
-
user.findOneById();
|
|
59
|
-
|
|
60
|
-
// UPDATE
|
|
61
|
-
user.setEmail("new@example.com");
|
|
62
|
-
user.update();
|
|
63
|
-
|
|
64
|
-
// DELETE
|
|
65
|
-
user.delete();
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### Querying with Conditions
|
|
69
|
-
```java
|
|
70
|
-
User user = new User();
|
|
71
|
-
Table results = user.findWith("username LIKE ?", new Object[]{"%jam%"});
|
|
72
|
-
|
|
73
|
-
// Fluent Condition Builder
|
|
74
|
-
Condition condition = new Condition();
|
|
75
|
-
condition.setRequestFields("id,username");
|
|
76
|
-
Table filtered = user.find(
|
|
77
|
-
condition.select("`users`").and("email LIKE ?").orderBy("id DESC"),
|
|
78
|
-
new Object[]{"%@example.com"}
|
|
79
|
-
);
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
### Mapping XML Structure
|
|
83
|
-
`User.map.xml`:
|
|
84
|
-
```xml
|
|
85
|
-
<mapping>
|
|
86
|
-
<class name="User" table="users">
|
|
87
|
-
<id name="Id" column="id" increment="true" generate="false" length="11" type="int"/>
|
|
88
|
-
<property name="username" column="username" length="50" type="varchar"/>
|
|
89
|
-
<property name="email" column="email" length="100" type="varchar"/>
|
|
90
|
-
</class>
|
|
91
|
-
</mapping>
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## Important Rules
|
|
95
|
-
|
|
96
|
-
1. **File Placement**: The mapping XML **must** mirror the POJO's package path under `src/main/resources/`.
|
|
97
|
-
2. **Naming**: Table names are singularized for class names (`users` → `User`). Underscored columns become camelCase fields (`created_at` → `createdAt`).
|
|
98
|
-
3. **Setters**: Use `setFieldAsXxx` methods (e.g., `setFieldAsString`) in setters to sync state with the internal field map.
|
|
99
|
-
4. **Id Field**: The primary key field in Java is always named `Id` (inherited from `AbstractData`).
|
|
1
|
+
# tinystruct Database Persistence
|
|
2
|
+
|
|
3
|
+
## When to Use
|
|
4
|
+
|
|
5
|
+
Use the built-in ORM-like data layer for database operations. It provides a lightweight alternative to JPA/Hibernate using POJOs extending `AbstractData` and XML mapping files.
|
|
6
|
+
|
|
7
|
+
## How It Works
|
|
8
|
+
|
|
9
|
+
### Architecture
|
|
10
|
+
|
|
11
|
+
Each table is represented by:
|
|
12
|
+
1. **Java POJO**: Extends `AbstractData`, provides getters/setters and `setData(Row)`.
|
|
13
|
+
2. **Mapping XML**: `ClassName.map.xml` in resources, binding Java fields to DB columns.
|
|
14
|
+
|
|
15
|
+
#### Key Base Class: `AbstractData`
|
|
16
|
+
Provides CRUD methods:
|
|
17
|
+
- `append()` / `appendAndGetId()`
|
|
18
|
+
- `update()`
|
|
19
|
+
- `delete()`
|
|
20
|
+
- `findAll()` / `findOneById()` / `findOneByKey(key, value)`
|
|
21
|
+
- `findWith(where, params)`
|
|
22
|
+
- `find(SQL, params)`
|
|
23
|
+
|
|
24
|
+
### POJO Generation (CLI)
|
|
25
|
+
|
|
26
|
+
Introspect a live database table to produce the POJO and mapping file.
|
|
27
|
+
|
|
28
|
+
#### Configuration
|
|
29
|
+
`application.properties`:
|
|
30
|
+
```properties
|
|
31
|
+
driver=com.mysql.cj.jdbc.Driver
|
|
32
|
+
database.url=jdbc:mysql://localhost:3306/mydb
|
|
33
|
+
database.user=root
|
|
34
|
+
database.password=secret
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
#### Command
|
|
38
|
+
```bash
|
|
39
|
+
# Interactive mode
|
|
40
|
+
bin/dispatcher generate
|
|
41
|
+
|
|
42
|
+
# Specify table
|
|
43
|
+
bin/dispatcher generate --tables users
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Examples
|
|
47
|
+
|
|
48
|
+
### CRUD Operations
|
|
49
|
+
```java
|
|
50
|
+
// CREATE
|
|
51
|
+
User user = new User();
|
|
52
|
+
user.setUsername("james");
|
|
53
|
+
user.append();
|
|
54
|
+
|
|
55
|
+
// READ
|
|
56
|
+
User user = new User();
|
|
57
|
+
user.setId(42);
|
|
58
|
+
user.findOneById();
|
|
59
|
+
|
|
60
|
+
// UPDATE
|
|
61
|
+
user.setEmail("new@example.com");
|
|
62
|
+
user.update();
|
|
63
|
+
|
|
64
|
+
// DELETE
|
|
65
|
+
user.delete();
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Querying with Conditions
|
|
69
|
+
```java
|
|
70
|
+
User user = new User();
|
|
71
|
+
Table results = user.findWith("username LIKE ?", new Object[]{"%jam%"});
|
|
72
|
+
|
|
73
|
+
// Fluent Condition Builder
|
|
74
|
+
Condition condition = new Condition();
|
|
75
|
+
condition.setRequestFields("id,username");
|
|
76
|
+
Table filtered = user.find(
|
|
77
|
+
condition.select("`users`").and("email LIKE ?").orderBy("id DESC"),
|
|
78
|
+
new Object[]{"%@example.com"}
|
|
79
|
+
);
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Mapping XML Structure
|
|
83
|
+
`User.map.xml`:
|
|
84
|
+
```xml
|
|
85
|
+
<mapping>
|
|
86
|
+
<class name="User" table="users">
|
|
87
|
+
<id name="Id" column="id" increment="true" generate="false" length="11" type="int"/>
|
|
88
|
+
<property name="username" column="username" length="50" type="varchar"/>
|
|
89
|
+
<property name="email" column="email" length="100" type="varchar"/>
|
|
90
|
+
</class>
|
|
91
|
+
</mapping>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Important Rules
|
|
95
|
+
|
|
96
|
+
1. **File Placement**: The mapping XML **must** mirror the POJO's package path under `src/main/resources/`.
|
|
97
|
+
2. **Naming**: Table names are singularized for class names (`users` → `User`). Underscored columns become camelCase fields (`created_at` → `createdAt`).
|
|
98
|
+
3. **Setters**: Use `setFieldAsXxx` methods (e.g., `setFieldAsString`) in setters to sync state with the internal field map.
|
|
99
|
+
4. **Id Field**: The primary key field in Java is always named `Id` (inherited from `AbstractData`).
|
|
@@ -1,64 +1,64 @@
|
|
|
1
|
-
# tinystruct @Action Routing Reference
|
|
2
|
-
|
|
3
|
-
## When to Use
|
|
4
|
-
|
|
5
|
-
Use the `@Action` annotation in your applications to define routes for both CLI commands and HTTP endpoints. It is appropriate whenever you need to map logic to a specific path, handle parameterized requests, or restrict execution to specific HTTP methods while maintaining a consistent command structure across environments.
|
|
6
|
-
|
|
7
|
-
## How It Works
|
|
8
|
-
|
|
9
|
-
The `ActionRegistry` parses `@Action` annotations to build a routing table. For parameterized methods, the framework automatically maps Java parameter types to corresponding regex segments.
|
|
10
|
-
|
|
11
|
-
### Regex Generation Rules
|
|
12
|
-
- `getUser(int id)` → pattern: `^/?user/(-?\d+)$`
|
|
13
|
-
- `search(String query)` → pattern: `^/?search/([^/]+)$`
|
|
14
|
-
|
|
15
|
-
Supported parameter types: `String`, `int/Integer`, `long/Long`, `float/Float`, `double/Double`, `boolean/Boolean`, `char/Character`, `short/Short`, `byte/Byte`, `Date` (parsed as `yyyy-MM-dd HH:mm:ss`).
|
|
16
|
-
|
|
17
|
-
### Mode Values
|
|
18
|
-
|
|
19
|
-
| Mode | When it triggers |
|
|
20
|
-
|---|---|
|
|
21
|
-
| `DEFAULT` | Both CLI and HTTP (GET, POST, etc.) |
|
|
22
|
-
| `CLI` | CLI dispatcher only |
|
|
23
|
-
| `HTTP_GET` | HTTP GET only |
|
|
24
|
-
| `HTTP_POST` | HTTP POST only |
|
|
25
|
-
| `HTTP_PUT` | HTTP PUT only |
|
|
26
|
-
| `HTTP_DELETE` | HTTP DELETE only |
|
|
27
|
-
| `HTTP_PATCH` | HTTP PATCH only |
|
|
28
|
-
|
|
29
|
-
> **Note:** You can map HTTP method names to `Mode` using `Action.Mode.fromName(String methodName)`. Unknown or null values return `Mode.DEFAULT`.
|
|
30
|
-
|
|
31
|
-
## Examples
|
|
32
|
-
|
|
33
|
-
### Basic Action Declaration
|
|
34
|
-
```java
|
|
35
|
-
@Action(
|
|
36
|
-
value = "path/subpath", // required: URI segment or CLI command
|
|
37
|
-
description = "What it does", // shown in --help output
|
|
38
|
-
mode = Mode.DEFAULT, // default: Mode.DEFAULT
|
|
39
|
-
example = "bin/dispatcher path/subpath/42"
|
|
40
|
-
)
|
|
41
|
-
public String myAction(int id) { ... }
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
### Parameterized Paths
|
|
45
|
-
```java
|
|
46
|
-
@Action("user/{id}")
|
|
47
|
-
public String getUser(int id) { ... }
|
|
48
|
-
// → CLI: bin/dispatcher user/42
|
|
49
|
-
// → HTTP: /?q=user/42
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### Dependency Injection
|
|
53
|
-
`ActionRegistry` automatically injects `Request` and/or `Response` from `Context` if they are parameters:
|
|
54
|
-
|
|
55
|
-
```java
|
|
56
|
-
@Action(value = "upload", mode = Mode.HTTP_POST)
|
|
57
|
-
public String upload(Request<?, ?> req, Response<?, ?> res) throws ApplicationException {
|
|
58
|
-
// Access raw request/response if needed
|
|
59
|
-
return "ok";
|
|
60
|
-
}
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### Path Matching Priority
|
|
64
|
-
If two methods share the same path, the framework uses the first match in the `ActionRegistry`. Use explicit `Mode` values to disambiguate (e.g., separating a GET for a form and a POST for submission).
|
|
1
|
+
# tinystruct @Action Routing Reference
|
|
2
|
+
|
|
3
|
+
## When to Use
|
|
4
|
+
|
|
5
|
+
Use the `@Action` annotation in your applications to define routes for both CLI commands and HTTP endpoints. It is appropriate whenever you need to map logic to a specific path, handle parameterized requests, or restrict execution to specific HTTP methods while maintaining a consistent command structure across environments.
|
|
6
|
+
|
|
7
|
+
## How It Works
|
|
8
|
+
|
|
9
|
+
The `ActionRegistry` parses `@Action` annotations to build a routing table. For parameterized methods, the framework automatically maps Java parameter types to corresponding regex segments.
|
|
10
|
+
|
|
11
|
+
### Regex Generation Rules
|
|
12
|
+
- `getUser(int id)` → pattern: `^/?user/(-?\d+)$`
|
|
13
|
+
- `search(String query)` → pattern: `^/?search/([^/]+)$`
|
|
14
|
+
|
|
15
|
+
Supported parameter types: `String`, `int/Integer`, `long/Long`, `float/Float`, `double/Double`, `boolean/Boolean`, `char/Character`, `short/Short`, `byte/Byte`, `Date` (parsed as `yyyy-MM-dd HH:mm:ss`).
|
|
16
|
+
|
|
17
|
+
### Mode Values
|
|
18
|
+
|
|
19
|
+
| Mode | When it triggers |
|
|
20
|
+
|---|---|
|
|
21
|
+
| `DEFAULT` | Both CLI and HTTP (GET, POST, etc.) |
|
|
22
|
+
| `CLI` | CLI dispatcher only |
|
|
23
|
+
| `HTTP_GET` | HTTP GET only |
|
|
24
|
+
| `HTTP_POST` | HTTP POST only |
|
|
25
|
+
| `HTTP_PUT` | HTTP PUT only |
|
|
26
|
+
| `HTTP_DELETE` | HTTP DELETE only |
|
|
27
|
+
| `HTTP_PATCH` | HTTP PATCH only |
|
|
28
|
+
|
|
29
|
+
> **Note:** You can map HTTP method names to `Mode` using `Action.Mode.fromName(String methodName)`. Unknown or null values return `Mode.DEFAULT`.
|
|
30
|
+
|
|
31
|
+
## Examples
|
|
32
|
+
|
|
33
|
+
### Basic Action Declaration
|
|
34
|
+
```java
|
|
35
|
+
@Action(
|
|
36
|
+
value = "path/subpath", // required: URI segment or CLI command
|
|
37
|
+
description = "What it does", // shown in --help output
|
|
38
|
+
mode = Mode.DEFAULT, // default: Mode.DEFAULT
|
|
39
|
+
example = "bin/dispatcher path/subpath/42"
|
|
40
|
+
)
|
|
41
|
+
public String myAction(int id) { ... }
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Parameterized Paths
|
|
45
|
+
```java
|
|
46
|
+
@Action("user/{id}")
|
|
47
|
+
public String getUser(int id) { ... }
|
|
48
|
+
// → CLI: bin/dispatcher user/42
|
|
49
|
+
// → HTTP: /?q=user/42
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Dependency Injection
|
|
53
|
+
`ActionRegistry` automatically injects `Request` and/or `Response` from `Context` if they are parameters:
|
|
54
|
+
|
|
55
|
+
```java
|
|
56
|
+
@Action(value = "upload", mode = Mode.HTTP_POST)
|
|
57
|
+
public String upload(Request<?, ?> req, Response<?, ?> res) throws ApplicationException {
|
|
58
|
+
// Access raw request/response if needed
|
|
59
|
+
return "ok";
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Path Matching Priority
|
|
64
|
+
If two methods share the same path, the framework uses the first match in the `ActionRegistry`. Use explicit `Mode` values to disambiguate (e.g., separating a GET for a form and a POST for submission).
|