go-duck-cli 1.0.9 → 1.1.12
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 +30 -15
- package/generators/ai_docs.js +130 -0
- package/generators/broker.js +63 -0
- package/generators/config.js +149 -7
- package/generators/devops.js +210 -43
- package/generators/docs.js +23 -4
- package/generators/elasticsearch.js +263 -0
- package/generators/kratos.js +229 -41
- package/generators/metering.js +280 -48
- package/generators/migrations.js +92 -198
- package/generators/mqtt.js +2 -39
- package/generators/multitenancy.js +274 -71
- package/generators/nats.js +39 -0
- package/generators/outbox.js +171 -0
- package/generators/postgrest.js +7 -3
- package/generators/postman.js +405 -0
- package/generators/repository.js +27 -0
- package/generators/router.js +27 -0
- package/generators/security.js +95 -14
- package/generators/serverless.js +147 -0
- package/generators/storage.js +589 -0
- package/generators/swagger.js +84 -60
- package/generators/telemetry.js +23 -32
- package/generators/websocket.js +55 -21
- package/index.js +493 -116
- package/package.json +6 -4
- package/parser/gdl.js +163 -24
- package/templates/docs/index.html.hbs +5 -5
- package/templates/docs/layout.hbs +221 -62
- package/templates/docs/pages/audit.hbs +83 -35
- package/templates/docs/pages/cli.hbs +18 -0
- package/templates/docs/pages/configuration.hbs +241 -0
- package/templates/docs/pages/datadog.hbs +46 -0
- package/templates/docs/pages/elasticsearch.hbs +121 -0
- package/templates/docs/pages/federation.hbs +241 -0
- package/templates/docs/pages/gdl-advanced.hbs +91 -0
- package/templates/docs/pages/gdl-annotations.hbs +137 -0
- package/templates/docs/pages/gdl-entities.hbs +134 -0
- package/templates/docs/pages/gdl-relationships.hbs +80 -0
- package/templates/docs/pages/gdl.hbs +60 -204
- package/templates/docs/pages/graphql.hbs +58 -44
- package/templates/docs/pages/grpc.hbs +53 -90
- package/templates/docs/pages/hybrid-store.hbs +127 -0
- package/templates/docs/pages/index.hbs +418 -149
- package/templates/docs/pages/keycloak.hbs +43 -0
- package/templates/docs/pages/legend.hbs +116 -0
- package/templates/docs/pages/mosquitto.hbs +39 -0
- package/templates/docs/pages/multitenancy.hbs +139 -71
- package/templates/docs/pages/otel.hbs +40 -0
- package/templates/docs/pages/realtime.hbs +38 -12
- package/templates/docs/pages/redis.hbs +40 -0
- package/templates/docs/pages/rest.hbs +120 -202
- package/templates/docs/pages/saga.hbs +94 -0
- package/templates/docs/pages/security.hbs +150 -44
- package/templates/docs/pages/serverless.hbs +157 -0
- package/templates/docs/pages/storage.hbs +127 -0
- package/templates/docs/pages/wizard.hbs +683 -0
- package/templates/docs/triple_identity_registry.png +0 -0
- package/templates/go/controller.go.hbs +287 -283
- package/templates/go/entity.go.hbs +17 -15
- package/templates/go/main.go.hbs +47 -180
- package/templates/go/migrator.go.hbs +65 -0
- package/templates/go/router.go.hbs +272 -0
- package/templates/graphql/resolver.go.hbs +53 -34
- package/templates/graphql/schema.graphql.hbs +17 -5
- package/templates/kratos/service.go.hbs +169 -34
- package/templates/proto/entity.proto.hbs +10 -14
- package/test_nested.gdl +21 -0
- package/templates/docs/intro.mp4 +0 -0
- package/test_parser.js +0 -9
|
@@ -1,100 +1,63 @@
|
|
|
1
|
-
<div class="
|
|
2
|
-
<div class="
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
</div>
|
|
8
|
-
|
|
9
|
-
<section class="mb-10">
|
|
10
|
-
<h2 class="text-2xl font-bold text-slate-800 mb-6 flex items-center">
|
|
11
|
-
<span class="w-8 h-8 rounded-lg bg-slate-100 text-slate-600 flex items-center justify-center mr-3 text-sm">
|
|
12
|
-
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path></svg>
|
|
13
|
-
</span>
|
|
14
|
-
Overview
|
|
15
|
-
</h2>
|
|
16
|
-
<p class="mb-4 text-slate-600 leading-relaxed">The GO-DUCK CLI generated app binds the Gin REST webserver on port 8080 and simultaneously spins up an optimized <strong>Go-Kratos</strong> gRPC listener on <code class="bg-slate-100 px-1.5 py-0.5 rounded text-slate-800 font-mono text-sm">port 9000</code>. Both the REST and gRPC handlers share the exact same clean <code>Repository</code> architecture underneath, guaranteeing 100% data and logic consistency.</p>
|
|
17
|
-
|
|
18
|
-
<div class="bg-emerald-50/80 border border-emerald-200 p-5 mt-6 rounded-xl flex items-start shadow-sm">
|
|
19
|
-
<svg class="w-6 h-6 text-emerald-500 mt-0.5 mr-3 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
|
|
20
|
-
<div>
|
|
21
|
-
<h4 class="font-semibold text-emerald-900 mb-1">Automatic Compilation</h4>
|
|
22
|
-
<p class="text-emerald-800 text-sm leading-relaxed"><code class="bg-emerald-100 text-emerald-900 px-1 py-0.5 rounded">api/v1/*.proto</code> definitions are generated automatically whenever you add an entity or change fields.</p>
|
|
1
|
+
<div class="prose prose-slate max-w-none">
|
|
2
|
+
<div class="flex items-center space-x-3 mb-8 text-blue-700">
|
|
3
|
+
<div class="p-4 bg-gradient-to-br from-blue-600 to-blue-800 rounded-2xl shadow-lg shadow-blue-200">
|
|
4
|
+
<svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
5
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z" />
|
|
6
|
+
</svg>
|
|
23
7
|
</div>
|
|
8
|
+
<h1 class="text-5xl font-black text-slate-900 m-0 tracking-tighter leading-none">Scaffolding gRPC <br><span class="text-blue-600 italic leading-snug">The Kratos Connection.</span></h1>
|
|
24
9
|
</div>
|
|
25
|
-
</section>
|
|
26
10
|
|
|
27
|
-
<
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
<
|
|
38
|
-
|
|
39
|
-
<
|
|
40
|
-
<p class="text-blue-800 text-sm leading-relaxed mb-2">If an event triggers a gRPC call asynchronously in the background (meaning there is NO active human user pushing a token from a frontend), the calling microservice must authenticate itself using a <strong>Keycloak Service Account</strong>.</p>
|
|
41
|
-
<p class="text-blue-800 text-sm leading-relaxed">The calling server sends its own <code class="bg-blue-100 px-1 py-0.5 rounded">Client ID</code> and <code class="bg-blue-100 px-1 py-0.5 rounded">Client Secret</code> directly to Keycloak's Token Endpoint using the <strong>Client Credentials Grant</strong> flow. Keycloak responds with a valid JWT representing the "Server", which is then injected into the gRPC dialer below.</p>
|
|
11
|
+
<p class="text-2xl text-slate-500 font-medium mb-12 leading-relaxed">
|
|
12
|
+
Experience blazing-fast, binary-efficient communication between your services. GO-DUCK automatically generates production-ready gRPC schemas and Kratos service implementations for every GDL entity.
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
<!-- Key Performance Block -->
|
|
16
|
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-8 mb-20 px-4">
|
|
17
|
+
<div class="p-8 bg-blue-50 rounded-[2rem] border border-blue-100 shadow-sm border-l-[1rem] border-l-blue-600">
|
|
18
|
+
<h5 class="font-black text-blue-900 mb-2 uppercase text-xs tracking-widest italic tracking-wide">Protobuf First</h5>
|
|
19
|
+
<p class="text-sm text-blue-800 leading-relaxed font-medium italic">Auto-generated <code>.proto</code> files with deep field validation and secure gRPC-Gateway metadata definitions.</p>
|
|
20
|
+
</div>
|
|
21
|
+
<div class="p-8 bg-blue-50 rounded-[2rem] border border-blue-100 shadow-sm border-l-[1rem] border-l-indigo-600">
|
|
22
|
+
<h5 class="font-black text-blue-900 mb-2 uppercase text-xs tracking-widest italic tracking-wide">Kratos secured</h5>
|
|
23
|
+
<p class="text-sm text-blue-800 leading-relaxed font-medium italic">OIDC/JWT authentication interceptors baked directly into the Kratos middleware for every generated gRPC service.</p>
|
|
42
24
|
</div>
|
|
43
25
|
</div>
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
<
|
|
26
|
+
|
|
27
|
+
<!-- The Proto Lifecycle -->
|
|
28
|
+
<section class="mb-20">
|
|
29
|
+
<h2 class="text-3xl font-black text-slate-900 mb-10 tracking-tight italic text-center underline decoration-blue-200 underline-offset-8">The Protobuf Lifecycle</h2>
|
|
30
|
+
<div class="space-y-6">
|
|
31
|
+
<div class="bg-slate-900 rounded-[2.5rem] p-10 text-white shadow-2xl relative overflow-hidden flex flex-col md:flex-row gap-12 group transition-all duration-300">
|
|
32
|
+
<div class="flex-grow p-6 bg-slate-800/50 rounded-3xl border border-slate-700/50 backdrop-blur-sm self-center">
|
|
33
|
+
<pre class="text-xs text-blue-300 leading-relaxed whitespace-pre font-mono italic">
|
|
34
|
+
<span class="text-slate-500">// Generated Service Schema for {{capitalize (defaultStr (lookup entities "0.name") "Entity")}}</span>
|
|
35
|
+
service {{capitalize (defaultStr (lookup entities "0.name") "Entity")}}Service {
|
|
36
|
+
rpc Get (Get{{capitalize (defaultStr (lookup entities "0.name") "Entity")}}Request) returns ({{capitalize (defaultStr (lookup entities "0.name") "Entity")}}Reply) {
|
|
37
|
+
option (google.api.http) = {
|
|
38
|
+
get: "/v1/{{toLowerCase (defaultStr (lookup entities "0.name") "entity")}}/{id}"
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
</pre>
|
|
52
43
|
</div>
|
|
53
|
-
<span class="text-xs text-slate-300 font-mono">grpc_client.go</span>
|
|
54
44
|
</div>
|
|
55
|
-
<span class="text-[10px] text-slate-400 font-bold uppercase tracking-widest">Go</span>
|
|
56
45
|
</div>
|
|
57
|
-
|
|
58
|
-
<pre><code class="language-go">import (
|
|
59
|
-
"context"
|
|
60
|
-
"log"
|
|
61
|
-
"google.golang.org/grpc"
|
|
62
|
-
"golang.org/x/oauth2/clientcredentials"
|
|
63
|
-
pb "{{appName}}/api/v1"
|
|
64
|
-
)
|
|
65
|
-
|
|
66
|
-
func main() {
|
|
67
|
-
// 1. Configure the Client Credentials Flow
|
|
68
|
-
// These values should match your go-duck.security block in application-dev.yml
|
|
69
|
-
config := clientcredentials.Config{
|
|
70
|
-
ClientID: "internal", // Matches keycloak-client-id
|
|
71
|
-
ClientSecret: "internal", // Matches keycloak-secret
|
|
72
|
-
TokenURL: "http://localhost:9080/realms/master/protocol/openid-connect/token",
|
|
73
|
-
}
|
|
46
|
+
</section>
|
|
74
47
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
// 5. Execute Native Network Call over gRPC
|
|
90
|
-
res, err := client.Get{{capitalize (defaultStr (lookup entities "0.name") "Entity")}}(context.Background(), &pb.Get{{capitalize (defaultStr (lookup entities "0.name") "Entity")}}Request{Id: 1})
|
|
91
|
-
if err != nil {
|
|
92
|
-
log.Fatalf("RPC failed: %v", err)
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
log.Printf("Successfully Received Data Pipeline Object OVER gRPC: %v", res)
|
|
96
|
-
}
|
|
97
|
-
</code></pre>
|
|
48
|
+
<!-- Silo-Aware Repository Wrapper -->
|
|
49
|
+
<section class="mb-20">
|
|
50
|
+
<div class="bg-gradient-to-r from-blue-950 to-blue-900 border border-blue-800/50 rounded-[2.5rem] p-16 text-white text-center shadow-2xl relative overflow-hidden group">
|
|
51
|
+
<h2 class="text-4xl font-black mb-6 tracking-tight italic underline decoration-blue-500 underline-offset-8">Federated gRPC Resolution</h2>
|
|
52
|
+
<p class="text-blue-100 text-lg mb-10 max-w-2xl mx-auto leading-relaxed italic font-medium">
|
|
53
|
+
Our gRPC implementation is natively silo-aware. It uses the same <strong>Repository Layer</strong> as the REST controllers—ensuring that every RPC call is routed to the correct database silo based on the caller's JWT role.
|
|
54
|
+
</p>
|
|
55
|
+
<div class="flex flex-col md:flex-row gap-6 justify-center">
|
|
56
|
+
<div class="px-8 py-4 bg-white/10 rounded-2xl border border-white/10 flex flex-col items-center hover:bg-white/20 transition-all duration-300 cursor-default shadow-md group-hover:scale-110">
|
|
57
|
+
<span class="text-blue-400 font-black text-2xl uppercase italic font-mono">100% Binary</span>
|
|
58
|
+
<span class="text-[0.6rem] text-white/50 tracking-[0.2em] font-bold uppercase mt-2">Maximum Throughput</span>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
98
61
|
</div>
|
|
99
|
-
</
|
|
100
|
-
</
|
|
62
|
+
</section>
|
|
63
|
+
</div>
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
<div class="prose prose-slate max-w-none">
|
|
2
|
+
<!-- Hybrid-Store Hero -->
|
|
3
|
+
<div class="flex items-center space-x-3 mb-10 text-emerald-700">
|
|
4
|
+
<div class="p-4 bg-gradient-to-br from-emerald-600 to-emerald-800 rounded-3xl shadow-xl shadow-emerald-100">
|
|
5
|
+
<svg class="w-10 h-10 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
6
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" />
|
|
7
|
+
</svg>
|
|
8
|
+
</div>
|
|
9
|
+
<div>
|
|
10
|
+
<h1 class="text-4xl font-black text-slate-900 m-0 tracking-tight leading-none">Hybrid-Store Architecture</h1>
|
|
11
|
+
<p class="text-emerald-600 font-bold tracking-widest uppercase text-[10px] mt-2 ml-1">SQL + NoSQL Heterogeneous Persistence</p>
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<p class="text-xl text-slate-600 mb-12 italic border-l-4 border-emerald-500 pl-6 leading-relaxed">
|
|
16
|
+
GO-DUCK represents the pinnacle of modern persistence strategy, enabling the seamless coexistence of <strong>PostgreSQL</strong> (for relational logic) and <strong>MongoDB</strong> (for high-velocity document storage) within a single microservice.
|
|
17
|
+
</p>
|
|
18
|
+
|
|
19
|
+
<!-- CORE CONCEPTS -->
|
|
20
|
+
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-16">
|
|
21
|
+
<div class="p-6 bg-white rounded-3xl border border-slate-100 shadow-sm">
|
|
22
|
+
<h4 class="text-emerald-700 font-black mb-2 uppercase text-xs tracking-widest">PostgreSQL Core</h4>
|
|
23
|
+
<p class="text-sm text-slate-500 italic leading-relaxed">Default store for system registries, billing, and relational entities requiring strict ACID compliance.</p>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="p-6 bg-white rounded-3xl border border-slate-100 shadow-sm">
|
|
26
|
+
<h4 class="text-emerald-700 font-black mb-2 uppercase text-xs tracking-widest">MongoDB Engine</h4>
|
|
27
|
+
<p class="text-sm text-slate-500 italic leading-relaxed">Triggered via <code>@isDocument</code>. Handles nested JSON structures and high-throughput document access.</p>
|
|
28
|
+
</div>
|
|
29
|
+
<div class="p-6 bg-white rounded-3xl border border-slate-100 shadow-sm">
|
|
30
|
+
<h4 class="text-emerald-700 font-black mb-2 uppercase text-xs tracking-widest">Unified Repository</h4>
|
|
31
|
+
<p class="text-sm text-slate-500 italic leading-relaxed">A single internal interface abstracts both engines, ensuring logic parity across REST and gRPC.</p>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<!-- TECHNICAL DEEP DIVE -->
|
|
36
|
+
<h2 class="text-2xl font-black text-slate-900 mb-6 tracking-tight">1. Cross-Database Soft Relationships</h2>
|
|
37
|
+
<p class="mb-8 leading-relaxed text-slate-600">
|
|
38
|
+
One of the most complex challenges in hybrid architectures is maintaining relationships across different database engines. GO-DUCK solves this with <strong>Dynamic ID Mapping</strong>:
|
|
39
|
+
</p>
|
|
40
|
+
|
|
41
|
+
<div class="bg-slate-900 rounded-[2.5rem] p-10 text-white mb-16 shadow-2xl relative overflow-hidden group">
|
|
42
|
+
<div class="absolute inset-0 bg-gradient-to-br from-emerald-900/30 to-transparent"></div>
|
|
43
|
+
<div class="relative z-10">
|
|
44
|
+
<div class="bg-slate-800/80 rounded-2xl p-6 border border-white/10 mb-8">
|
|
45
|
+
<pre><code class="font-mono text-sm leading-relaxed text-emerald-300"><span class="text-slate-500">// Relationship across SQL and MongoDB</span>
|
|
46
|
+
entity User { <span class="text-slate-500">// PostgreSQL (relational)</span>
|
|
47
|
+
string email required
|
|
48
|
+
[Profile] profiles
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
<span class="text-emerald-500">@isDocument</span>
|
|
52
|
+
entity Profile { <span class="text-slate-500">// MongoDB (document)</span>
|
|
53
|
+
string bio
|
|
54
|
+
string avatar
|
|
55
|
+
User owner
|
|
56
|
+
}</code></pre>
|
|
57
|
+
</div>
|
|
58
|
+
<p class="text-slate-400 text-sm italic leading-relaxed m-0 border-l border-emerald-500/30 pl-6">
|
|
59
|
+
GO-DUCK automatically detects that <code>Profile</code> is NoSQL and <code>User</code> is SQL. It generates a <code>uint64</code> owner ID in MongoDB and a <code>string</code> profile pointer in SQL, handling all casting and <code>gorm:"-"</code> shielding automatically.
|
|
60
|
+
</p>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<h2 class="text-2xl font-black text-slate-900 mb-6 tracking-tight">2. Federated Parallel Harvester 2.0</h2>
|
|
65
|
+
<p class="mb-8 leading-relaxed text-slate-600">
|
|
66
|
+
When executing multi-tenant "Harvest" operations (e.g., getting all Users across 50 authorized silos), GO-DUCK uses <strong>Heterogeneous Parallel Execution</strong>.
|
|
67
|
+
</p>
|
|
68
|
+
|
|
69
|
+
<div class="p-8 bg-blue-50 rounded-[2rem] border border-blue-100 mb-16">
|
|
70
|
+
<div class="flex items-start gap-6">
|
|
71
|
+
<div class="w-16 h-16 bg-white rounded-2xl flex items-center justify-center text-3xl shadow-sm">🚀</div>
|
|
72
|
+
<div>
|
|
73
|
+
<h4 class="text-lg font-black text-blue-900 m-0 uppercase tracking-tighter">Concurrency Paradigm</h4>
|
|
74
|
+
<p class="text-sm text-blue-700 italic mt-2 leading-relaxed">
|
|
75
|
+
The Harvester spawns goroutines that simultaneously query PostgreSQL and MongoDB silos. Results are aggregated into a single, unified response stream, regardless of the underlying storage engine for each entity.
|
|
76
|
+
</p>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
|
|
81
|
+
<h2 class="text-2xl font-black text-slate-900 mb-6 tracking-tight">3. BSON & Recursive GDL Support</h2>
|
|
82
|
+
<p class="mb-8 leading-relaxed text-slate-600">
|
|
83
|
+
Entities marked with <code>@isDocument</code> support deep nested brace structures in GDL, which map directly to recursive BSON tags in Go:
|
|
84
|
+
</p>
|
|
85
|
+
|
|
86
|
+
<div class="bg-slate-100 rounded-3xl p-8 mb-16 border border-slate-200">
|
|
87
|
+
<table class="w-full text-left">
|
|
88
|
+
<thead>
|
|
89
|
+
<tr class="border-b border-slate-300">
|
|
90
|
+
<th class="pb-4 font-black text-slate-900 uppercase text-xs tracking-widest">Storage Engine</th>
|
|
91
|
+
<th class="pb-4 font-black text-slate-900 uppercase text-xs tracking-widest">ID Type</th>
|
|
92
|
+
<th class="pb-4 font-black text-slate-900 uppercase text-xs tracking-widest">Key Mapping</th>
|
|
93
|
+
</tr>
|
|
94
|
+
</thead>
|
|
95
|
+
<tbody class="text-slate-600 text-sm italic">
|
|
96
|
+
<tr class="border-b border-slate-200">
|
|
97
|
+
<td class="py-4 font-bold text-slate-900">PostgreSQL</td>
|
|
98
|
+
<td class="py-4"><code>uint64</code></td>
|
|
99
|
+
<td class="py-4">GORM Primary Key / Auto-Increment</td>
|
|
100
|
+
</tr>
|
|
101
|
+
<tr>
|
|
102
|
+
<td class="py-4 font-bold text-emerald-600">MongoDB</td>
|
|
103
|
+
<td class="py-4"><code>string</code></td>
|
|
104
|
+
<td class="py-4">BSON <code>primitive.ObjectID</code> (hex-mapped)</td>
|
|
105
|
+
</tr>
|
|
106
|
+
</tbody>
|
|
107
|
+
</table>
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
<!-- NEXT STEPS -->
|
|
111
|
+
<div class="flex flex-col md:flex-row gap-4 mb-20">
|
|
112
|
+
<a href="federation.html" class="flex-1 p-6 bg-slate-900 rounded-2xl text-white hover:bg-slate-800 transition-colors group">
|
|
113
|
+
<div class="text-xs font-bold text-slate-500 uppercase tracking-widest mb-2">Previous Category</div>
|
|
114
|
+
<div class="text-xl font-bold flex items-center">
|
|
115
|
+
<svg class="w-5 h-5 mr-2 group-hover:-translate-x-1 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 17l-5-5m0 0l5-5m-5 5h12" /></svg>
|
|
116
|
+
🌐 Federated Architecture
|
|
117
|
+
</div>
|
|
118
|
+
</a>
|
|
119
|
+
<a href="serverless.html" class="flex-1 p-6 bg-emerald-700 rounded-2xl text-white hover:bg-emerald-800 transition-colors group text-right">
|
|
120
|
+
<div class="text-xs font-bold text-emerald-200 uppercase tracking-widest mb-2">Next Category</div>
|
|
121
|
+
<div class="text-xl font-bold flex items-center justify-end">
|
|
122
|
+
🚀 Serverless Docs
|
|
123
|
+
<svg class="w-5 h-5 ml-2 group-hover:translate-x-1 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6" /></svg>
|
|
124
|
+
</div>
|
|
125
|
+
</a>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|