@appaflytech/zeyrek-ai-mcp 0.0.43 → 0.0.46
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/dist/knowledge/backendConstraints.js +86 -2
- package/dist/knowledge/componentCatalog.js +63 -26
- package/dist/knowledge/componentEvents.js +6 -0
- package/dist/knowledge/connectDataBind.js +43 -6
- package/dist/knowledge/connectDataDefinition.js +74 -3
- package/dist/knowledge/connectDataRules.js +14 -0
- package/dist/knowledge/mobileComponentCatalog.js +67 -8
- package/dist/knowledge/mobileStore.js +61 -2
- package/dist/knowledge/platform/lint.js +23 -0
- package/dist/knowledge/platform/mobile.js +1 -1
- package/dist/knowledge/platform/mobileOffline.js +45 -0
- package/dist/knowledge/platform/mobileRules.js +8 -1
- package/dist/knowledge/platform/mobileTabs.js +31 -2
- package/dist/knowledge/platform/web.js +1 -1
- package/dist/knowledge/rules.js +220 -7
- package/dist/knowledge/textHooks.js +434 -0
- package/dist/platform/capture/capture.js +1 -1
- package/dist/platform/capture/readiness.js +4 -0
- package/dist/platform/errors.js +22 -2
- package/dist/prompts/mobilePublish.js +21 -0
- package/dist/resources/examples/flow-biometric-confirm.json +199 -0
- package/dist/resources/examples/microfunction-node-dependencies.json +19 -0
- package/dist/resources/examples/mobile-offline-list.json +357 -0
- package/dist/resources/examples/mobile-offline-queue.json +82 -0
- package/dist/resources/examples/mobile-offline-seamless.json +1520 -0
- package/dist/resources/guides/access.md +4 -4
- package/dist/resources/guides/component.md +20 -4
- package/dist/resources/guides/deployment.md +98 -0
- package/dist/resources/guides/entity.md +1 -1
- package/dist/resources/guides/expressions.md +5 -1
- package/dist/resources/guides/external-component.md +6 -4
- package/dist/resources/guides/merge.md +81 -4
- package/dist/resources/guides/microfunction.md +104 -9
- package/dist/resources/guides/microservice.md +34 -5
- package/dist/resources/guides/mobile-connect-data.md +70 -0
- package/dist/resources/guides/mobile-flow.md +64 -0
- package/dist/resources/guides/mobile-publish.md +161 -16
- package/dist/resources/guides/mobile-steps.md +21 -1
- package/dist/resources/guides/mobile.md +45 -23
- package/dist/resources/guides/page.md +122 -5
- package/dist/resources/guides/translation.md +97 -2
- package/dist/resources/knowledge.js +3 -1
- package/dist/resources/prompts/mobile-publish-prepare.md +89 -0
- package/dist/resources/schema-fingerprint.json +4 -4
- package/dist/resources/schemas/ApplyMicrofunctionArchiveChangesCommand.json +76 -0
- package/dist/resources/schemas/ConnectDataDescribeDto.json +44 -0
- package/dist/resources/schemas/ConnectDataResultDto.json +10 -0
- package/dist/resources/schemas/CreateMicrofunctionCommand.json +8 -0
- package/dist/resources/schemas/CreateMicroserviceCommand.json +3 -0
- package/dist/resources/schemas/InvokeMicrofunctionCommand.json +0 -4
- package/dist/resources/schemas/MicroserviceDto.json +3 -0
- package/dist/resources/schemas/MobileStorePreflightScope.json +13 -0
- package/dist/resources/schemas/StartMobileBuildCommand.json +35 -1
- package/dist/resources/schemas/UpdateMicrofunctionCommand.json +8 -0
- package/dist/resources/schemas/UpdateMicroserviceCommand.json +3 -0
- package/dist/resources/schemas/UpsertMobileStoreSettingsCommand.json +75 -0
- package/dist/server.js +2 -0
- package/dist/tools/accessRuntime.js +1 -1
- package/dist/tools/applications.js +16 -2
- package/dist/tools/common.js +6 -0
- package/dist/tools/components.js +19 -6
- package/dist/tools/connectData.js +9 -4
- package/dist/tools/deployments.js +1 -1
- package/dist/tools/designSchemaPatch.js +16 -4
- package/dist/tools/environments.js +3 -3
- package/dist/tools/files.js +1 -1
- package/dist/tools/flows.js +118 -7
- package/dist/tools/layouts.js +32 -12
- package/dist/tools/merges.js +8 -8
- package/dist/tools/microfunctions.js +53 -3
- package/dist/tools/mobileStore.js +83 -21
- package/dist/tools/pages.js +59 -24
- package/dist/tools/platformInfo.js +4 -2
- package/dist/tools/textHookGuard.js +116 -0
- package/package.json +2 -2
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_meta": {
|
|
3
|
+
"synthetic": true,
|
|
4
|
+
"note": "Ödeme gibi bir eylemden önce kullanıcıyı Face ID / parmak izi ile doğrulayan düğme akışı (kök docs/adr/0021-biyometrik-dogrulama-adimi-ve-uygulama-kilidi.md): başarı always dalında işi yapar, vazgeçme ve doğrulanamama error dalında kullanıcıya söylenir. 'Bu cihazda biyometri yok' metni Device.biometric.available'a bağlıdır.",
|
|
5
|
+
"harvestedFrom": "canlı doğrulama 2026-10-15: lokal test projesi mobile-app, /dev önizlemesinde 'Doğrulandı say' → Doğrulandı: {\"verified\":true}, vazgeç → Hata: cancelled; aynı akış page_screenshot ile (click → awaiting-user → preview-biometric__verify) sürüldü"
|
|
6
|
+
},
|
|
7
|
+
"_rules": {
|
|
8
|
+
"args": "args.title sistem penceresindeki gerekçe, args.cancelText vazgeç düğmesi (metin şablonu; boşsa uygulama dilindeki varsayılan). args.value yedek, DÜZ METİN: 'device' (biyometri olmazsa cihaz parolası; boş = bu) ya da 'none'. Küme dışı 422; fallback/reason/cancelLabel anahtarı sessizce düşer — FLOW-042.",
|
|
9
|
+
"branches": "Dallar 'always' ve 'error'. Vazgeçme bir HATADIR: error dalı → akışın hata adımları → ikisi de yoksa akış bu adımda BİTER ve always'e bağlı iş koşmaz (FLOW-042 uyarır).",
|
|
10
|
+
"output": "Başarı Steps.<adım ADI>.data = { verified: true }; hata Steps.<ad>.error.status: cancelled · not-enrolled · lockout · failed · unavailable · unsupported · invalid.",
|
|
11
|
+
"where": "Studio önizlemesi, canlı kip, /dev ve /branch sormaz: 'Doğrulandı say' / vazgeç penceresi açar. Production /view ve web uygulaması unsupported döner. Oynatıcıda (Expo Go) yedeği none olan adım hep unavailable.",
|
|
12
|
+
"security": "Yerel bir kapıdır, sunucu için kanıt değildir: sunucu tarafı yetkiyi ayrıca denetleyin.",
|
|
13
|
+
"binding": "Akışı olaya bağlamak ayrı adımdır: page_schema_patch set_event { target: 'btn_ode', event: 'click', eventValue: '<flow id>' }."
|
|
14
|
+
},
|
|
15
|
+
"pageOps": [
|
|
16
|
+
{
|
|
17
|
+
"op": "add_component",
|
|
18
|
+
"parent": "page_container",
|
|
19
|
+
"component": {
|
|
20
|
+
"elementId": "tx_biyometri_yok",
|
|
21
|
+
"name": "tx_biyometri_yok",
|
|
22
|
+
"type": "text",
|
|
23
|
+
"props": {
|
|
24
|
+
"content": "Bu cihazda biyometri ya da cihaz parolası kurulu değil",
|
|
25
|
+
"isHidden": {
|
|
26
|
+
"type": "code",
|
|
27
|
+
"ref": "{{ Device.biometric.available }}"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"blocks": [
|
|
31
|
+
{
|
|
32
|
+
"breakpoint": 1024,
|
|
33
|
+
"size": {
|
|
34
|
+
"w": 12,
|
|
35
|
+
"h": 1
|
|
36
|
+
},
|
|
37
|
+
"position": {
|
|
38
|
+
"x": 0,
|
|
39
|
+
"y": 1
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"op": "add_component",
|
|
47
|
+
"parent": "page_container",
|
|
48
|
+
"component": {
|
|
49
|
+
"elementId": "btn_ode",
|
|
50
|
+
"name": "btn_ode",
|
|
51
|
+
"type": "button",
|
|
52
|
+
"props": {
|
|
53
|
+
"text": "Ödemeyi onayla"
|
|
54
|
+
},
|
|
55
|
+
"blocks": [
|
|
56
|
+
{
|
|
57
|
+
"breakpoint": 1024,
|
|
58
|
+
"size": {
|
|
59
|
+
"w": 12,
|
|
60
|
+
"h": 1
|
|
61
|
+
},
|
|
62
|
+
"position": {
|
|
63
|
+
"x": 0,
|
|
64
|
+
"y": 2
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"op": "add_component",
|
|
72
|
+
"parent": "page_container",
|
|
73
|
+
"component": {
|
|
74
|
+
"elementId": "tx_sonuc",
|
|
75
|
+
"name": "tx_sonuc",
|
|
76
|
+
"type": "text",
|
|
77
|
+
"props": {
|
|
78
|
+
"content": ""
|
|
79
|
+
},
|
|
80
|
+
"blocks": [
|
|
81
|
+
{
|
|
82
|
+
"breakpoint": 1024,
|
|
83
|
+
"size": {
|
|
84
|
+
"w": 12,
|
|
85
|
+
"h": 1
|
|
86
|
+
},
|
|
87
|
+
"position": {
|
|
88
|
+
"x": 0,
|
|
89
|
+
"y": 3
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
],
|
|
96
|
+
"flowCreateArgs": {
|
|
97
|
+
"host": "page",
|
|
98
|
+
"hostId": "<page id>",
|
|
99
|
+
"name": "btn_ode - click",
|
|
100
|
+
"slug": "btn-ode-click",
|
|
101
|
+
"steps": [
|
|
102
|
+
{
|
|
103
|
+
"stepId": "start",
|
|
104
|
+
"name": "start",
|
|
105
|
+
"type": "start",
|
|
106
|
+
"kind": "normal",
|
|
107
|
+
"args": {},
|
|
108
|
+
"branches": [
|
|
109
|
+
{
|
|
110
|
+
"name": "always",
|
|
111
|
+
"nextStepId": "dogrula"
|
|
112
|
+
}
|
|
113
|
+
]
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"stepId": "dogrula",
|
|
117
|
+
"name": "dogrula",
|
|
118
|
+
"type": "biometric-auth",
|
|
119
|
+
"kind": "normal",
|
|
120
|
+
"args": {
|
|
121
|
+
"title": "Ödemeyi onaylayın",
|
|
122
|
+
"cancelText": "Vazgeç",
|
|
123
|
+
"value": "device"
|
|
124
|
+
},
|
|
125
|
+
"branches": [
|
|
126
|
+
{
|
|
127
|
+
"name": "always",
|
|
128
|
+
"nextStepId": "onaylandi"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"name": "error",
|
|
132
|
+
"nextStepId": "olmadi"
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"stepId": "onaylandi",
|
|
138
|
+
"name": "onaylandi",
|
|
139
|
+
"type": "setter",
|
|
140
|
+
"kind": "normal",
|
|
141
|
+
"args": {
|
|
142
|
+
"iteratees": [
|
|
143
|
+
{
|
|
144
|
+
"element": "tx_sonuc",
|
|
145
|
+
"property": "content",
|
|
146
|
+
"source": "component",
|
|
147
|
+
"mapping": {
|
|
148
|
+
"source": "",
|
|
149
|
+
"mappings": {}
|
|
150
|
+
},
|
|
151
|
+
"type": "change",
|
|
152
|
+
"value": {
|
|
153
|
+
"type": "code",
|
|
154
|
+
"ref": "'Onaylandı'"
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
]
|
|
158
|
+
},
|
|
159
|
+
"branches": [
|
|
160
|
+
{
|
|
161
|
+
"name": "always",
|
|
162
|
+
"nextStepId": null
|
|
163
|
+
}
|
|
164
|
+
]
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"stepId": "olmadi",
|
|
168
|
+
"name": "olmadi",
|
|
169
|
+
"type": "setter",
|
|
170
|
+
"kind": "normal",
|
|
171
|
+
"args": {
|
|
172
|
+
"iteratees": [
|
|
173
|
+
{
|
|
174
|
+
"element": "tx_sonuc",
|
|
175
|
+
"property": "content",
|
|
176
|
+
"source": "component",
|
|
177
|
+
"mapping": {
|
|
178
|
+
"source": "",
|
|
179
|
+
"mappings": {}
|
|
180
|
+
},
|
|
181
|
+
"type": "change",
|
|
182
|
+
"value": {
|
|
183
|
+
"type": "code",
|
|
184
|
+
"ref": "Steps.dogrula.error.status === 'cancelled' ? 'Vazgeçildi' : 'Doğrulanamadı: ' + Steps.dogrula.error.status"
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
]
|
|
188
|
+
},
|
|
189
|
+
"branches": [
|
|
190
|
+
{
|
|
191
|
+
"name": "always",
|
|
192
|
+
"nextStepId": null
|
|
193
|
+
}
|
|
194
|
+
]
|
|
195
|
+
}
|
|
196
|
+
],
|
|
197
|
+
"errorSteps": []
|
|
198
|
+
}
|
|
199
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_meta": {
|
|
3
|
+
"synthetic": false,
|
|
4
|
+
"note": "microfunction-faz-2/development ortamında gerçek uçta doğrulandı (2026-09-29): publish:true ile kayıt 'publishing' döndü, Fission builder dayjs ve ms paketlerini kurdu (build günlüğü 'added 2 packages'), ~4-6 sn sonra 'published' oldu; microfunction_invoke {} → ok:true output {year:2026, twoDays:172800000}. Kurallar: dependencies SATIR BAŞINA BİR PAKET, node'da 'ad@aralık' (aralıksız satır latest olur); inline kaynakta entrypoint GÖNDERİLMEZ; paketler yalnız Built-In'de kurulur (aws-lambda'da MF-007 uyarısı); kurulum düşerse publish-failed ve publishError build günlüğünün son 4 KB'ını taşır."
|
|
5
|
+
},
|
|
6
|
+
"microfunction": {
|
|
7
|
+
"name": "tarih-araci",
|
|
8
|
+
"description": "dayjs ve ms paketleriyle yılı ve iki günün milisaniye karşılığını döner.",
|
|
9
|
+
"language": "node",
|
|
10
|
+
"provider": "built-in",
|
|
11
|
+
"sourceKind": "inline",
|
|
12
|
+
"code": "const dayjs = require('dayjs')\nconst ms = require('ms')\nexports.handler = async () => ({ year: dayjs('2026-09-29').year(), twoDays: ms('2d') })\n",
|
|
13
|
+
"dependencies": "dayjs@^1.11\nms@^2.1",
|
|
14
|
+
"timeoutSeconds": 30,
|
|
15
|
+
"memoryMb": 256,
|
|
16
|
+
"environmentVariables": {},
|
|
17
|
+
"publish": true
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_meta": {
|
|
3
|
+
"synthetic": true,
|
|
4
|
+
"note": "Mobil uygulamada çevrimdışı okunan liste (kök ADR 0023): uygulamanın veri önbelleği açıktır; 'siparisler' mount'ta GET servisini çağırır, satırları repeater'a ve 'son güncelleme' satırını adımın önbellek işaretinden (Steps.<ad>.cache.at) yazar. Ağ varken satır gizli kalır; ağ yokken son başarılı yanıt saklandığı anla birlikte çizilir. Kayıt da yoksa hata dalı 'bağlantı yok'u Steps.<ad>.error.network'ten ayırır. Sayfa mizanpaj sözleşmesine uyar, akış mobil profilden bulgusuz geçer (test/mobile-rules.test.ts, test/mobile-layout-lint.test.ts).",
|
|
5
|
+
"pairsWith": "mobile-list-detail-form (aynı liste deseninin satıra dokunma ve form ayağı), mobile-app-shell-stack ya da mobile-app-shell-tab (kabuk)",
|
|
6
|
+
"sourceRef": "platform_guide('page') §Kural 1g-4; MOB-033; kök docs/adr/0023-mobil-cevrimdisi-yerel-kopya-ve-uygulama-paketi.md K2, K8, K13"
|
|
7
|
+
},
|
|
8
|
+
"_rules": {
|
|
9
|
+
"setting": "Veri önbelleği uygulamanın ayarıdır: application_update properties.mobile.offline = { data: true } (isteğe bağlı maxAgeDays: 1 | 7 | 30, varsayılan 7; screens varsayılan açık, yazılmaz). properties gövdesi REPLACE'tir: application_get'teki properties'in TAMAMI (mobile.tabs, mobile.transition ve öteki anahtarlar) aynen gönderilir, yalnız mobile.offline eklenir — eksik gönderilen anahtar silinir. Okunamayan değer MOB-033 uyarısıdır; cihaz onu varsayılana düşürür.",
|
|
10
|
+
"whatIsStored": "Saklanan: isRaw: false yazılmış GET servis adımlarının yanıtı (isRaw yazılmamış ya da true olan, dosya/akış sonucu dönen adım saklanmaz) ve connectData okumaları (list, describe, lookup). Yazma servisleri (POST/PUT/DELETE) ve connectData yazmaları saklanmaz, ağ yokken hata verir. Kayıtlar kullanıcıya ve ortama bağlıdır; çıkışta ve kullanıcı değişince silinir.",
|
|
11
|
+
"cacheMark": "Önbellekten yanıtlanan adım BAŞARI yolundan sürer ve storage'ında cache: { at } taşır (at: saklandığı an, ms). Ağdan gelen yanıtta cache alanı YOKTUR — satırın gizli kalmasını buradan alın: isHidden = !Steps.load_orders.cache.",
|
|
12
|
+
"networkError": "Yanıt hiç alınamadıysa (bağlantı yok; saklanan okumalarda 8 sn süre sınırı da) ve kayıt yoksa adım hata dalına gider: Steps.<ad>.error.network true, status 503. 503'ü sunucu da döner — 'bağlantı yok' için network'e bakın (MOB-033 bilgi notu; status == 503 && !network sunucu arızasını ayıran doğru desendir, not almaz). network alanı yalnız veri önbelleği açık uygulamada yazılır. Saklanmayan isteklerde süre sınırı yoktur: yanıt vermeyen sunucuda adım bekler.",
|
|
13
|
+
"stale": "Önbellek son başarılı yanıtı aynen verir: her çağrıda değişen bir GET (sayaç, zaman, rastgele) ağ yokken eski değerini döner. Parametreler ve veri dili isteğin parçasıdır; başka parametreli çağrı başka kayıttır.",
|
|
14
|
+
"detailFromSteps": "Satırlar ve güncelleme satırı SETTER adımıyla yazılır: `{{ Steps.… }}` kod bağı ilk çizimde okunur, Steps'e yazmak düğümü yeniden okutmaz (mobile-list-detail-form ile aynı desen).",
|
|
15
|
+
"preview": "Önizleme (/dev, Studio, page_screenshot) önbellek KULLANMAZ — ayar açık olsa da her okuma ağdan gider ve cache alanı hiç yazılmaz; güncelleme satırı önizlemede gizli kalır. page_screenshot ağı kesemez: çevrimdışı davranış yalnız cihazda (uçak modu) görülür.",
|
|
16
|
+
"verify": "page_runtime_get ile sayfa paketi ve akış okunur; page_screenshot({ applicationSlug: '<uygulama>', pageSlug: 'siparisler' }) satırları çizer, txt_guncelleme görünmez."
|
|
17
|
+
},
|
|
18
|
+
"pages": [
|
|
19
|
+
{
|
|
20
|
+
"applicationUpdateArgs": {
|
|
21
|
+
"properties": {
|
|
22
|
+
"...": "<application_get'teki properties'in öteki anahtarları — gövde REPLACE, hepsi aynen gönderilir>",
|
|
23
|
+
"mobile": {
|
|
24
|
+
"...": "<mevcut properties.mobile anahtarları (tabs, transition) aynen>",
|
|
25
|
+
"offline": {
|
|
26
|
+
"data": true
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"pageCreateArgs": {
|
|
32
|
+
"name": "Siparişler",
|
|
33
|
+
"slug": "siparisler"
|
|
34
|
+
},
|
|
35
|
+
"schemaPatchOps": [
|
|
36
|
+
{
|
|
37
|
+
"op": "add_component",
|
|
38
|
+
"parent": "page_container",
|
|
39
|
+
"component": {
|
|
40
|
+
"elementId": "txt_baslik",
|
|
41
|
+
"name": "txt_baslik",
|
|
42
|
+
"type": "text",
|
|
43
|
+
"kind": "component",
|
|
44
|
+
"props": {
|
|
45
|
+
"content": {
|
|
46
|
+
"type": "static",
|
|
47
|
+
"ref": null,
|
|
48
|
+
"data": "Siparişler"
|
|
49
|
+
},
|
|
50
|
+
"type": {
|
|
51
|
+
"type": "static",
|
|
52
|
+
"ref": null,
|
|
53
|
+
"data": "h2"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"appearance": {
|
|
57
|
+
"marginType": "none",
|
|
58
|
+
"widthType": "fill"
|
|
59
|
+
},
|
|
60
|
+
"blocks": [],
|
|
61
|
+
"events": [],
|
|
62
|
+
"validations": [],
|
|
63
|
+
"stateBindings": [],
|
|
64
|
+
"children": []
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"op": "add_component",
|
|
69
|
+
"parent": "page_container",
|
|
70
|
+
"component": {
|
|
71
|
+
"elementId": "txt_guncelleme",
|
|
72
|
+
"name": "txt_guncelleme",
|
|
73
|
+
"type": "text",
|
|
74
|
+
"kind": "component",
|
|
75
|
+
"props": {
|
|
76
|
+
"content": {
|
|
77
|
+
"type": "static",
|
|
78
|
+
"ref": null,
|
|
79
|
+
"data": ""
|
|
80
|
+
},
|
|
81
|
+
"type": {
|
|
82
|
+
"type": "static",
|
|
83
|
+
"ref": null,
|
|
84
|
+
"data": "small"
|
|
85
|
+
},
|
|
86
|
+
"isHidden": {
|
|
87
|
+
"type": "static",
|
|
88
|
+
"ref": null,
|
|
89
|
+
"data": true
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
"appearance": {
|
|
93
|
+
"marginType": "none",
|
|
94
|
+
"widthType": "fill"
|
|
95
|
+
},
|
|
96
|
+
"blocks": [],
|
|
97
|
+
"events": [],
|
|
98
|
+
"validations": [],
|
|
99
|
+
"stateBindings": [],
|
|
100
|
+
"children": []
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"op": "add_component",
|
|
105
|
+
"parent": "page_container",
|
|
106
|
+
"component": {
|
|
107
|
+
"elementId": "scr_siparis",
|
|
108
|
+
"name": "scr_siparis",
|
|
109
|
+
"type": "scroll-view",
|
|
110
|
+
"kind": "component",
|
|
111
|
+
"props": {
|
|
112
|
+
"refreshable": {
|
|
113
|
+
"type": "static",
|
|
114
|
+
"ref": null,
|
|
115
|
+
"data": true
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
"appearance": {
|
|
119
|
+
"marginType": "none",
|
|
120
|
+
"widthType": "fill",
|
|
121
|
+
"heightType": "fill"
|
|
122
|
+
},
|
|
123
|
+
"blocks": [],
|
|
124
|
+
"events": [],
|
|
125
|
+
"validations": [],
|
|
126
|
+
"stateBindings": [],
|
|
127
|
+
"children": []
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"op": "add_component",
|
|
132
|
+
"parent": "scr_siparis",
|
|
133
|
+
"component": {
|
|
134
|
+
"elementId": "lst_siparis",
|
|
135
|
+
"name": "lst_siparis",
|
|
136
|
+
"type": "repeater",
|
|
137
|
+
"kind": "component",
|
|
138
|
+
"props": {
|
|
139
|
+
"rows": {
|
|
140
|
+
"type": "static",
|
|
141
|
+
"ref": null,
|
|
142
|
+
"data": []
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
"appearance": {
|
|
146
|
+
"marginType": "none",
|
|
147
|
+
"widthType": "fill"
|
|
148
|
+
},
|
|
149
|
+
"blocks": [],
|
|
150
|
+
"events": [],
|
|
151
|
+
"validations": [],
|
|
152
|
+
"stateBindings": [],
|
|
153
|
+
"children": [
|
|
154
|
+
{
|
|
155
|
+
"elementId": "lst_siparis_satir",
|
|
156
|
+
"name": "lst_siparis_satir",
|
|
157
|
+
"type": "view",
|
|
158
|
+
"kind": "component",
|
|
159
|
+
"props": {},
|
|
160
|
+
"blocks": [],
|
|
161
|
+
"children": [
|
|
162
|
+
{
|
|
163
|
+
"elementId": "row_siparis",
|
|
164
|
+
"name": "row_siparis",
|
|
165
|
+
"type": "card",
|
|
166
|
+
"kind": "component",
|
|
167
|
+
"props": {
|
|
168
|
+
"title": {
|
|
169
|
+
"type": "code",
|
|
170
|
+
"ref": "{{ item.no }}"
|
|
171
|
+
},
|
|
172
|
+
"description": {
|
|
173
|
+
"type": "code",
|
|
174
|
+
"ref": "{{ item.durum }}"
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
"appearance": {
|
|
178
|
+
"marginType": "none",
|
|
179
|
+
"widthType": "fill"
|
|
180
|
+
},
|
|
181
|
+
"blocks": [],
|
|
182
|
+
"events": [],
|
|
183
|
+
"validations": [],
|
|
184
|
+
"stateBindings": [],
|
|
185
|
+
"children": []
|
|
186
|
+
}
|
|
187
|
+
]
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"elementId": "lst_siparis_bos_gorunum",
|
|
191
|
+
"name": "lst_siparis_bos_gorunum",
|
|
192
|
+
"type": "view",
|
|
193
|
+
"kind": "component",
|
|
194
|
+
"props": {},
|
|
195
|
+
"blocks": [],
|
|
196
|
+
"children": [
|
|
197
|
+
{
|
|
198
|
+
"elementId": "lst_siparis_bos",
|
|
199
|
+
"name": "lst_siparis_bos",
|
|
200
|
+
"type": "emptystate",
|
|
201
|
+
"kind": "component",
|
|
202
|
+
"props": {
|
|
203
|
+
"title": {
|
|
204
|
+
"type": "static",
|
|
205
|
+
"data": "Sipariş yok"
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
"blocks": [],
|
|
209
|
+
"children": []
|
|
210
|
+
}
|
|
211
|
+
]
|
|
212
|
+
}
|
|
213
|
+
]
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
],
|
|
217
|
+
"mountFlowCreateArgs": {
|
|
218
|
+
"host": "page",
|
|
219
|
+
"hostId": "<siparisler sayfa id>",
|
|
220
|
+
"name": "siparisler mount",
|
|
221
|
+
"slug": "siparisler-mount",
|
|
222
|
+
"steps": [
|
|
223
|
+
{
|
|
224
|
+
"stepId": "start",
|
|
225
|
+
"name": "start",
|
|
226
|
+
"type": "start",
|
|
227
|
+
"kind": "normal",
|
|
228
|
+
"args": {},
|
|
229
|
+
"branches": [
|
|
230
|
+
{
|
|
231
|
+
"id": "<GUID>",
|
|
232
|
+
"name": "always",
|
|
233
|
+
"nextStepId": "load_orders"
|
|
234
|
+
}
|
|
235
|
+
]
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
"stepId": "load_orders",
|
|
239
|
+
"name": "load_orders",
|
|
240
|
+
"type": "microservice",
|
|
241
|
+
"kind": "normal",
|
|
242
|
+
"args": {
|
|
243
|
+
"microserviceId": "<sipariş listesi GET microservice id>",
|
|
244
|
+
"isRaw": false,
|
|
245
|
+
"parameters": []
|
|
246
|
+
},
|
|
247
|
+
"branches": [
|
|
248
|
+
{
|
|
249
|
+
"id": "<GUID>",
|
|
250
|
+
"name": "success",
|
|
251
|
+
"nextStepId": "apply_rows"
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
"id": "<GUID>",
|
|
255
|
+
"name": "error",
|
|
256
|
+
"nextStepId": "warn_offline"
|
|
257
|
+
}
|
|
258
|
+
]
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
"stepId": "apply_rows",
|
|
262
|
+
"name": "apply_rows",
|
|
263
|
+
"type": "setter",
|
|
264
|
+
"kind": "normal",
|
|
265
|
+
"args": {
|
|
266
|
+
"iteratees": [
|
|
267
|
+
{
|
|
268
|
+
"id": "<GUID>",
|
|
269
|
+
"type": "change",
|
|
270
|
+
"source": "component",
|
|
271
|
+
"element": "lst_siparis",
|
|
272
|
+
"property": "rows",
|
|
273
|
+
"mapping": {
|
|
274
|
+
"source": "",
|
|
275
|
+
"mappings": {}
|
|
276
|
+
},
|
|
277
|
+
"value": {
|
|
278
|
+
"type": "code",
|
|
279
|
+
"ref": "Steps.load_orders.data"
|
|
280
|
+
}
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
"id": "<GUID>",
|
|
284
|
+
"type": "change",
|
|
285
|
+
"source": "component",
|
|
286
|
+
"element": "txt_guncelleme",
|
|
287
|
+
"property": "content",
|
|
288
|
+
"mapping": {
|
|
289
|
+
"source": "",
|
|
290
|
+
"mappings": {}
|
|
291
|
+
},
|
|
292
|
+
"value": {
|
|
293
|
+
"type": "code",
|
|
294
|
+
"ref": "Steps.load_orders.cache ? `Son güncelleme: ${new Date(Steps.load_orders.cache.at).toLocaleString()}` : ''"
|
|
295
|
+
}
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
"id": "<GUID>",
|
|
299
|
+
"type": "change",
|
|
300
|
+
"source": "component",
|
|
301
|
+
"element": "txt_guncelleme",
|
|
302
|
+
"property": "isHidden",
|
|
303
|
+
"mapping": {
|
|
304
|
+
"source": "",
|
|
305
|
+
"mappings": {}
|
|
306
|
+
},
|
|
307
|
+
"value": {
|
|
308
|
+
"type": "code",
|
|
309
|
+
"ref": "!Steps.load_orders.cache"
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
]
|
|
313
|
+
},
|
|
314
|
+
"branches": [
|
|
315
|
+
{
|
|
316
|
+
"id": "<GUID>",
|
|
317
|
+
"name": "always",
|
|
318
|
+
"nextStepId": null
|
|
319
|
+
}
|
|
320
|
+
]
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
"stepId": "warn_offline",
|
|
324
|
+
"name": "warn_offline",
|
|
325
|
+
"type": "alert",
|
|
326
|
+
"kind": "normal",
|
|
327
|
+
"args": {
|
|
328
|
+
"message": "{{ Steps.load_orders.error?.network ? 'Bağlantı yok ve bu liste daha önce açılmamış' : 'Siparişler yüklenemedi' }}",
|
|
329
|
+
"alertType": "info"
|
|
330
|
+
},
|
|
331
|
+
"branches": [
|
|
332
|
+
{
|
|
333
|
+
"id": "<GUID>",
|
|
334
|
+
"name": "always",
|
|
335
|
+
"nextStepId": null
|
|
336
|
+
}
|
|
337
|
+
]
|
|
338
|
+
}
|
|
339
|
+
]
|
|
340
|
+
},
|
|
341
|
+
"bindOps": [
|
|
342
|
+
{
|
|
343
|
+
"op": "set_event",
|
|
344
|
+
"target": "page_container",
|
|
345
|
+
"event": "mount",
|
|
346
|
+
"eventValue": "<mount akış id>"
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
"op": "set_event",
|
|
350
|
+
"target": "scr_siparis",
|
|
351
|
+
"event": "refresh",
|
|
352
|
+
"eventValue": "<mount akış id>"
|
|
353
|
+
}
|
|
354
|
+
]
|
|
355
|
+
}
|
|
356
|
+
]
|
|
357
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_meta": {
|
|
3
|
+
"synthetic": true,
|
|
4
|
+
"note": "Mobil uygulamada ağ yokken yapılan yazma (kök ADR 0022): bir dozu 'alındı' işaretleyen akış. Servis tanımı offlineWritable bildirir; akışın microservice adımında queued dalı bağlıdır. Ağ yokken çağrı cihazın kuyruğuna girer ve queued dalı 'bağlantı gelince işlenecek' der; bağlantı gelince kayıt aynı Idempotency-Key ile bir kez gönderilir. Akış mobil profilden ve kendi lint kurallarından bulgusuz geçer (test/mobile-rules.test.ts).",
|
|
5
|
+
"pairsWith": "mobile-offline-list (okuma tarafı: veri önbelleği ve error.network), mobile-list-detail-form (satırdan işlem)",
|
|
6
|
+
"sourceRef": "platform_guide('page') §Kural 1g-4; FLOW-043; MS-025; kök docs/adr/0022-mobil-yazma-kuyrugu.md; plans/mobil-cevrimdisi-calisma/00-sozlesme.md"
|
|
7
|
+
},
|
|
8
|
+
"_rules": {
|
|
9
|
+
"declare": "Servis tarafı: microservice_patch ile /offlineWritable = true. Anlamı 'aynı istek iki kez gelirse bir kez uygulanır, çakışmada son yazan kazanır'. Okuyan uca (tablo get/count, görünüm) verilirse MS-025 uyarır.",
|
|
10
|
+
"branch": "Akış tarafı: microservice adımına queued dalı (yalnız mobil). Ağ hatasında (yanıt hiç yok) dal bağlıysa, yöntem yazansa ve dosya parametresi yoksa çağrı kuyruğa girer ve queued koşar: Steps.<ad>.data null, Steps.<ad>.queued = { clientRequestId, at }. Dal bağlı değilse adım bugünkü gibi error'a gider. HTTP hatası (4xx, 5xx, önündeki vekil sunucunun 502'si) kuyruğa girmez.",
|
|
11
|
+
"serverDecides": "Cihaz servisin bildirimini bilmez — kararı sunucu verir. queued dalı bağlı yazmanın İLK isteği de Idempotency-Key taşır ve kuyruğa aynı kimlikle girer: yanıtı yolda kaybolan yazma kuyruktan gelince 200 { code: 'Duplicate' } alır, ikinci kez uygulanmaz. Bildirimsiz servis anahtarlı isteği 422 OfflineReplayNotAllowedException ile reddeder — adım çevrimiçiyken de her çağrıda error'a gider. Bildirimsiz servise queued bağlamayı FLOW-043 yazımda uyarır.",
|
|
12
|
+
"visibility": "Kaydın sonucu akışa dönmez. Bekleyen ve reddedilen sayısı Device.offline.queue = { pending, rejected }, reddedilenler Device.offline.rejected (id, service, at, status, code, message). Kod adımında Page.offline.list(), Page.offline.count(), Page.offline.sync() ve Page.offline.resolve(id, 'retry' | 'discard').",
|
|
13
|
+
"sync": "Gönderim: bağlantının dönüşü, uygulamanın ön plana dönüşü ve ağla soğuk açılış. Sıra kuyruğa giriş zamanı; tek tek; 4xx kaydı reddeder ve sıra sürer, oturum (401/403), 408, 429, 5xx ve ağ hatası sırayı durdurur.",
|
|
14
|
+
"limits": "Kuyruktaki kayda bağlı ikinci işlem yok: queued yolu Steps.<ad>.data okumaz (dönen kimliği bekleyen adım çevrimdışıyken koşamaz). Dosya parametreli çağrı kuyruğa girmez — adım error'a gider, Steps.<ad>.error.code = 'fileNotQueued'. Kayıt 7 günde gönderilemezse 'expired' ile reddedilir. Kayıtlar kullanıcıya bağlıdır: başkasının bekleyeni gönderilmez, çıkışta silinmez.",
|
|
15
|
+
"preview": "Studio önizlemesi ve web çalışma zamanında kuyruk yoktur (barındırıcı depo vermez): queued dalı hiç koşmaz. page_screenshot ağı kesemez; davranış yalnız cihazda görülür. Açık ekran ilk çizildiği kopyayla kalır: akışa eklenen queued dalı ekran bir sonraki açılışta etkindir.",
|
|
16
|
+
"verify": "microservice_get ile offlineWritable, flow_get ile queued dalı okunur. Cihazda: bağlantıyı kes, dozu işaretle (queued dalı koşar), bağlantıyı aç; row_list'te tek kayıt."
|
|
17
|
+
},
|
|
18
|
+
"microservicePatchArgs": {
|
|
19
|
+
"applicationId": "<uygulama id ya da slug>",
|
|
20
|
+
"id": "<doz-isle microservice id>",
|
|
21
|
+
"operations": [{ "op": "add", "path": "/offlineWritable", "value": true }]
|
|
22
|
+
},
|
|
23
|
+
"flowCreateArgs": {
|
|
24
|
+
"host": "page",
|
|
25
|
+
"hostId": "<bugun sayfa id>",
|
|
26
|
+
"name": "doz-al",
|
|
27
|
+
"slug": "doz-al",
|
|
28
|
+
"steps": [
|
|
29
|
+
{
|
|
30
|
+
"stepId": "start",
|
|
31
|
+
"name": "start",
|
|
32
|
+
"type": "start",
|
|
33
|
+
"kind": "normal",
|
|
34
|
+
"args": {},
|
|
35
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": "al" }]
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"stepId": "al",
|
|
39
|
+
"name": "al",
|
|
40
|
+
"type": "microservice",
|
|
41
|
+
"kind": "normal",
|
|
42
|
+
"args": {
|
|
43
|
+
"microserviceId": "<doz-isle microservice id>",
|
|
44
|
+
"isRaw": false,
|
|
45
|
+
"parameters": [
|
|
46
|
+
{ "name": "dozSaatiId", "type": "text", "source": "body", "value": { "type": "code", "ref": "Row.dozSaatiId" } },
|
|
47
|
+
{ "name": "durum", "type": "text", "source": "body", "value": { "type": "code", "ref": "'alindi'" } }
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
"branches": [
|
|
51
|
+
{ "id": "<GUID>", "name": "always", "nextStepId": "tamam" },
|
|
52
|
+
{ "id": "<GUID>", "name": "error", "nextStepId": "hata" },
|
|
53
|
+
{ "id": "<GUID>", "name": "queued", "nextStepId": "kuyrukta" }
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"stepId": "tamam",
|
|
58
|
+
"name": "tamam",
|
|
59
|
+
"type": "alert",
|
|
60
|
+
"kind": "normal",
|
|
61
|
+
"args": { "message": "Doz kaydedildi", "alertType": "success" },
|
|
62
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": null }]
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"stepId": "hata",
|
|
66
|
+
"name": "hata",
|
|
67
|
+
"type": "alert",
|
|
68
|
+
"kind": "normal",
|
|
69
|
+
"args": { "message": "{{ Steps.al.error?.code === 'fileNotQueued' ? 'Dosyalı işlem bağlantı gerektirir' : 'Doz kaydedilemedi' }}", "alertType": "error" },
|
|
70
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": null }]
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"stepId": "kuyrukta",
|
|
74
|
+
"name": "kuyrukta",
|
|
75
|
+
"type": "alert",
|
|
76
|
+
"kind": "normal",
|
|
77
|
+
"args": { "message": "{{ Steps.al.queued ? 'Doz kuyruğa alındı — bağlantı gelince işlenecek' : '' }}", "alertType": "info" },
|
|
78
|
+
"branches": [{ "id": "<GUID>", "name": "always", "nextStepId": null }]
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
}
|