feat: add canonical URL handling and entity quality checks

- Implemented canonical URL strategies for city-specific domains and entities.
- Added helper functions for domain and city resolution.
- Created tests for canonical URL generation and domain resolution.
- Introduced entity quality checks for doctors and clinics to ensure meaningful content.
- Developed unique introductory texts for listing pages to avoid duplicate content.
- Established robots.txt policies for listing pages to manage indexing based on user filters.
- Enhanced specialty content with dynamic introductions and FAQs to improve SEO.
This commit is contained in:
hamed
2026-07-19 07:52:50 +03:30
parent 36816eded2
commit fd48b48613
48 changed files with 3951 additions and 733 deletions
+9 -1
View File
@@ -368,11 +368,19 @@
"366": "Community 366",
"367": "Community 367",
"368": "Community 368",
"369": "Community 369",
"370": "Community 370",
"371": "Community 371",
"372": "Community 372",
"373": "Community 373",
"374": "Community 374",
"375": "Community 375",
"376": "Community 376",
"377": "Community 377",
"378": "Community 378",
"379": "Community 379"
"379": "Community 379",
"380": "Community 380",
"381": "Community 381",
"382": "Community 382",
"383": "Community 383"
}
+102 -59
View File
@@ -1,16 +1,16 @@
# Graph Report - nobat724_front (2026-07-18)
# Graph Report - nobat724_front (2026-07-19)
## Corpus Check
- 607 files · ~553,226 words
- 619 files · ~559,739 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 2187 nodes · 2167 edges · 376 communities (346 shown, 30 thin omitted)
- Extraction: 95% EXTRACTED · 5% INFERRED · 0% AMBIGUOUS · INFERRED: 100 edges (avg confidence: 0.8)
- 2261 nodes · 2301 edges · 384 communities (351 shown, 33 thin omitted)
- Extraction: 94% EXTRACTED · 6% INFERRED · 0% AMBIGUOUS · INFERRED: 137 edges (avg confidence: 0.8)
- Token cost: 0 input · 0 output
## Graph Freshness
- Built from commit: `b3709604`
- Built from commit: `36816ede`
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost).
@@ -135,6 +135,10 @@
- [[_COMMUNITY_Community 121|Community 121]]
- [[_COMMUNITY_Community 122|Community 122]]
- [[_COMMUNITY_Community 124|Community 124]]
- [[_COMMUNITY_Community 125|Community 125]]
- [[_COMMUNITY_Community 126|Community 126]]
- [[_COMMUNITY_Community 128|Community 128]]
- [[_COMMUNITY_Community 140|Community 140]]
- [[_COMMUNITY_Community 195|Community 195]]
- [[_COMMUNITY_Community 339|Community 339]]
- [[_COMMUNITY_Community 347|Community 347]]
@@ -143,6 +147,10 @@
- [[_COMMUNITY_Community 366|Community 366]]
- [[_COMMUNITY_Community 367|Community 367]]
- [[_COMMUNITY_Community 368|Community 368]]
- [[_COMMUNITY_Community 369|Community 369]]
- [[_COMMUNITY_Community 370|Community 370]]
- [[_COMMUNITY_Community 371|Community 371]]
- [[_COMMUNITY_Community 372|Community 372]]
- [[_COMMUNITY_Community 373|Community 373]]
- [[_COMMUNITY_Community 374|Community 374]]
- [[_COMMUNITY_Community 375|Community 375]]
@@ -150,63 +158,66 @@
- [[_COMMUNITY_Community 377|Community 377]]
- [[_COMMUNITY_Community 378|Community 378]]
- [[_COMMUNITY_Community 379|Community 379]]
- [[_COMMUNITY_Community 380|Community 380]]
- [[_COMMUNITY_Community 381|Community 381]]
- [[_COMMUNITY_Community 382|Community 382]]
## God Nodes (most connected - your core abstractions)
1. `getStateInfo()` - 24 edges
1. `getStateInfo()` - 26 edges
2. `🏥 نوبت724 (Nobat724) - سیستم نوبت‌دهی آنلاین پزشکی` - 19 edges
3. `تقسیم ممیزی SEO به پرامپت‌های کوچک اجرایی — nobat724` - 17 edges
4. `imageUrl()` - 15 edges
5. `Dashboard()` - 10 edges
6. `بهینه‌سازی SEO تک‌تک شهرها در city.json (سطح حرفه‌ای)` - 10 edges
7. `بازطراحی حرفه‌ای پوستر اشتراک‌گذاری پزشک (دانلود)` - 10 edges
8. `وظایف` - 10 edges
9. `وظایف` - 10 edges
5. `Doctor()` - 11 edges
6. `Blog()` - 10 edges
7. `Dashboard()` - 10 edges
8. `بهینه‌سازی SEO تک‌تک شهرها در city.json (سطح حرفه‌ای)` - 10 edges
9. `بازطراحی حرفه‌ای پوستر اشتراک‌گذاری پزشک (دانلود)` - 10 edges
10. `وظایف` - 10 edges
## Surprising Connections (you probably didn't know these)
- `Dashboard()` --calls--> `safeJsonParse()` [INFERRED]
app/dashboard/page.js → lib/sanitize.js
- `Doctor()` --calls--> `buildDoctorFaq()` [INFERRED]
app/doctor/[slug]/page.js → lib/specialtyContent.js
- `SpecialtyDetail()` --calls--> `buildSpecialtyFaq()` [INFERRED]
app/specialties/[slug]/page.js → lib/specialtyContent.js
- `AboutUsPage()` --calls--> `getStateInfo()` [INFERRED]
components/aboutUs/index.js → lib/getStateInfo.js
- `ContactUsPage()` --calls--> `getStateInfo()` [INFERRED]
components/contactUs/index.js → lib/getStateInfo.js
- `SearchBar()` --calls--> `getStateInfo()` [INFERRED]
components/home/search/index.js → lib/getStateInfo.js
- `StLayout()` --calls--> `getStateInfo()` [INFERRED]
components/layout/StLayout.js → lib/getStateInfo.js
- `generateMetadata()` --calls--> `getStateInfo()` [INFERRED]
app/about-us/page.js → lib/getStateInfo.js
## Import Cycles
- None detected.
## Communities (376 total, 30 thin omitted)
## Communities (384 total, 33 thin omitted)
### Community 0 - "Community 0"
Cohesion: 0.05
Nodes (27): BgGray(), ButtonMenu(), Col(), ModalLogout(), Footer(), head, LogoNamad(), Namads (+19 more)
### Community 1 - "Community 1"
Cohesion: 0.24
Nodes (8): Head(), convertTimestampToJalali(), convertTimestampToTime(), ButtonData(), DetailLg(), DetailSm(), Head(), Card()
Cohesion: 0.36
Nodes (5): convertTimestampToTime(), ButtonData(), DetailLg(), DetailSm(), Head()
### Community 2 - "Community 2"
Cohesion: 0.04
Nodes (48): dependencies, altcha, aos, axios, @casl/ability, @casl/react, date-fns, dayjs (+40 more)
### Community 3 - "Community 3"
Cohesion: 0.24
Nodes (14): getCurrentDomain(), robots(), cityFilterParams(), fetchAllPages(), getBlogUrls(), getCityScope(), getClinicUrls(), getCurrentDomain() (+6 more)
Cohesion: 0.21
Nodes (17): getCurrentDomain(), robots(), CITY_IDS_WITH_DOMAIN, cityFilterParams(), fetchAllPages(), getBlogUrls(), getCityScope(), getClinicUrls() (+9 more)
### Community 4 - "Community 4"
Cohesion: 0.07
Nodes (21): ContentDetail(), About(), ListBime(), Services(), Specialties(), TextDetail(), listTab, AddComment() (+13 more)
### Community 5 - "Community 5"
Cohesion: 0.07
Nodes (23): AppointmentList(), ItemAppointment(), AboutDcotor(), ClaimProfileSection(), currentUserMobile(), initialForm, DetailDoctor(), Link() (+15 more)
Cohesion: 0.06
Nodes (26): bookingState(), DAY_NAMES, formatJalali(), AppointmentList(), ItemAppointment(), AboutDcotor(), ClaimProfileSection(), currentUserMobile() (+18 more)
### Community 6 - "Community 6"
Cohesion: 0.12
Nodes (10): Dashboard(), metadata, defineAbilitiesFor(), getUser(), buildPatientUser(), safeJsonLd(), safeJsonParse(), getServerAccessToken() (+2 more)
Cohesion: 0.08
Nodes (13): Dashboard(), metadata, defineAbilitiesFor(), getUser(), buildPatientUser(), getServerAccessToken(), clearAccessToken(), LogIn() (+5 more)
### Community 8 - "Community 8"
Cohesion: 0.07
@@ -293,8 +304,8 @@ Cohesion: 0.12
Nodes (16): دیپلوی nobat724_front روی Liara (پلتفرم Next.js), زمینه, فایل‌های مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی, وظایف, پروژه (+8 more)
### Community 29 - "Community 29"
Cohesion: 0.12
Nodes (10): generateMetadata(), generateMetadata(), Appointment(), metadata, fetchSiteContext(), getStateInfo(), siteContextCache, ContentLogin() (+2 more)
Cohesion: 0.08
Nodes (20): generateMetadata(), generateMetadata(), Clinics(), generateMetadata(), Appointment(), metadata, Doctors(), generateMetadata() (+12 more)
### Community 30 - "Community 30"
Cohesion: 0.12
@@ -357,12 +368,12 @@ Cohesion: 0.14
Nodes (13): `hours/List.js`, آبجکت اسلات (از `adaptSlots` / API), تأیید و سخت‌سازی غیرفعال‌بودن اسلات‌های گذشته در صفحه‌ی نوبت, زمینه, فایل‌های مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی (کد واقعی) (+5 more)
### Community 45 - "Community 45"
Cohesion: 0.29
Nodes (6): generateMetadata(), imageUrl(), normalizeBlog(), ItemClinic(), Blog(), getBlog
Cohesion: 0.23
Nodes (16): generateMetadata(), generateMetadata(), generateMetadata(), imageUrl(), normalizeBlog(), extractEntityCityId(), getEntityOrigin(), Blog() (+8 more)
### Community 46 - "Community 46"
Cohesion: 0.09
Nodes (18): formatToman(), rialToToman(), Messages(), Message(), Paying(), Card(), PAYMENT_STATUS, TYPE_LABELS (+10 more)
Cohesion: 0.22
Nodes (6): Messages(), Message(), Head(), listTab, UserAccountPage(), NotfoundDashboard()
### Community 47 - "Community 47"
Cohesion: 0.15
@@ -382,7 +393,7 @@ Nodes (12): زمینه, فایل‌های مرتبط, مشکل / هدف, نما
### Community 51 - "Community 51"
Cohesion: 0.06
Nodes (20): ClinicsPage(), ProvinceContext, ProvinceProvider(), Probe(), useProvince(), Content(), Form(), SubmitData() (+12 more)
Nodes (21): ProvinceContext, ProvinceProvider(), Probe(), useProvince(), Content(), Form(), SubmitData(), EditField() (+13 more)
### Community 52 - "Community 52"
Cohesion: 0.24
@@ -457,16 +468,16 @@ Cohesion: 0.20
Nodes (9): رفع جهت تبدیل تاریخ تولد هنگام ایجاد پروفایل, زمینه, فایل‌های مرتبط, مشکل / هدف, نکات مهم, وضعیت فعلی (کد واقعی), وظایف, پروژه (+1 more)
### Community 70 - "Community 70"
Cohesion: 0.25
Nodes (7): Clinics(), FILTER_KEYS, generateMetadata(), listingRobots(), buildClinicParams(), axiosInstance, fetchReq()
Cohesion: 0.13
Nodes (13): ClinicsPage(), AutoComplete(), ButtonFilter(), Content(), ModalSearchCity(), AutoSearch(), FilterButton(), SearchBar() (+5 more)
### Community 71 - "Community 71"
Cohesion: 0.22
Nodes (7): degree, Form(), gender, degree, Form(), gender, filterList()
### Community 72 - "Community 72"
Cohesion: 0.39
Nodes (8): generateMetadata(), RootLayout(), buildCanonicalPath(), buildCanonicalUrl(), buildMainCanonicalUrl(), getCanonicalUrl(), getRequestOrigin(), normalizeHost()
Cohesion: 0.27
Nodes (13): generateMetadata(), buildCanonicalPath(), buildCanonicalQuery(), buildCanonicalUrl(), buildMainCanonicalUrl(), buildSpecialtyCanonicalPath(), CANONICAL_QUERY_KEYS, getCanonicalUrl() (+5 more)
### Community 73 - "Community 73"
Cohesion: 0.32
@@ -481,8 +492,8 @@ Cohesion: 0.29
Nodes (7): Authentication & Authorization, Development Tools, Frontend Framework, State Management & Data Fetching, UI/UX, 🏗️ معماری و تکنولوژی, کتابخانه‌های تخصصی
### Community 76 - "Community 76"
Cohesion: 0.07
Nodes (20): Allergies(), ItemAllergie(), HeadTab(), setNewData(), DetailUser(), Disease(), FamilyHistory(), ItemHistory() (+12 more)
Cohesion: 0.33
Nodes (5): HeadTab(), setNewData(), DetailUser(), Disease(), IsTurnsDetails()
### Community 79 - "Community 79"
Cohesion: 0.17
@@ -498,16 +509,20 @@ Nodes (11): رفع خطای `TypeError: fetch failed` در sitemap هنگام د
### Community 83 - "Community 83"
Cohesion: 0.24
Nodes (6): STATUS_LABELS, Head(), listTab, Turns(), List(), STATUS_LABELS
Nodes (7): Card(), STATUS_LABELS, Head(), listTab, Turns(), List(), STATUS_LABELS
### Community 86 - "Community 86"
Cohesion: 0.40
Nodes (5): Doctors(), FILTER_KEYS, generateMetadata(), listingRobots(), buildDoctorParams()
Cohesion: 0.21
Nodes (10): generateMetadata(), DoctorsPage(), findCityById(), findDomainByCityId(), resolveCityDisplayName(), isRootCity(), ListDoctors(), findSpecialty() (+2 more)
### Community 87 - "Community 87"
Cohesion: 0.33
Nodes (6): 1. افزودن صفحه جدید, 2. افزودن API Endpoint جدید, 3. افزودن کامپوننت جدید, 4. کار با تاریخ شمسی, 5. استفاده از Context, 📝 نکات توسعه
### Community 89 - "Community 89"
Cohesion: 0.28
Nodes (4): Head(), convertTimestampToJalali(), RelatedContent(), Item()
### Community 90 - "Community 90"
Cohesion: 0.50
Nodes (4): buildDays(), InlineJalaliMonth(), MONTHS, WEEKDAYS
@@ -560,6 +575,22 @@ Nodes (4): Metadata داینامیک بر اساس شهر, ساختار دامن
Cohesion: 0.67
Nodes (3): Feature Components, Layout Components, 🧩 کامپوننت‌های اصلی
### Community 125 - "Community 125"
Cohesion: 0.14
Nodes (13): زمینه, فایل‌های مرتبط, مشکل / هدف, نوار موبایل — `components/doctor/appointmentList/index.js:20-24`, نکات مهم, وضعیت فعلی, وضعیت «نوبت‌دهی فعال/غیرفعال» پروفایل پزشک از booking_locations, وظایف (+5 more)
### Community 126 - "Community 126"
Cohesion: 0.33
Nodes (7): bodyVariants(), buildDoctorFaq(), buildSpecialtyFaq(), buildSpecialtyIntro(), closingVariants(), openingVariants(), pick()
### Community 128 - "Community 128"
Cohesion: 0.40
Nodes (3): Allergies(), ItemAllergie(), ModalAddAlergie()
### Community 140 - "Community 140"
Cohesion: 0.33
Nodes (5): RootLayout(), normalize(), Pageguide(), safeJsonLd(), safeJsonParse()
### Community 365 - "Community 365"
Cohesion: 0.08
Nodes (23): endpoint جدید, انتخاب محل نوبت‌دهی (مطب شخصی / کلینیک) در جریان رزرو, زمینه, فایل‌های مرتبط, قرارداد API (آمادهٔ مصرف), مشکل / هدف, نکات مهم, وضعیت فعلی (+15 more)
@@ -569,12 +600,24 @@ Cohesion: 0.11
Nodes (17): P10 — بلاگ شهر-محور (C4), P11 — FAQPage schema و متن مقدمهٔ یکتا (M1 + M2), P1 — بررسی robots.txt (پیش‌نیاز اعتبارسنجی), P2 — هلپرهای مشترک (زیرساخت), P3 — رفع noindex سیستمیک صفحات لیست (C5 — بدترین باگ), P4 — استراتژی canonical سه‌دسته + تصمیم pagination (C1-a/b/c + M3-B), P5 — بازسازی sitemap (C2), P6 — صفحات موجودیت: Soft-404 و noindex کلینیک خالی (H4 + H7) (+9 more)
### Community 367 - "Community 367"
Cohesion: 0.15
Nodes (5): clearAccessToken(), api, handleSessionExpired(), request, removeToken()
Cohesion: 0.40
Nodes (3): FamilyHistory(), ItemHistory(), ModalAddHistory()
### Community 368 - "Community 368"
Cohesion: 0.70
Nodes (4): generateMetadata(), Clinic(), computeClinicRating(), getClinic
Cohesion: 0.40
Nodes (3): Medications(), ItemMedication(), ModalAddMedications()
### Community 369 - "Community 369"
Cohesion: 0.40
Nodes (3): ModalAddRelatives(), Relatives(), ItemRelatives()
### Community 370 - "Community 370"
Cohesion: 0.40
Nodes (3): ModalAddSurgeries(), Surgeries(), ItemSurgeries()
### Community 372 - "Community 372"
Cohesion: 0.60
Nodes (4): hasRealName(), isThinClinic(), isThinDoctor(), PLACEHOLDER_NAMES
### Community 373 - "Community 373"
Cohesion: 0.12
@@ -597,28 +640,28 @@ Cohesion: 0.36
Nodes (4): SearchBar(), ButtonFilter(), Fields(), RedirectLink()
### Community 378 - "Community 378"
Cohesion: 0.60
Nodes (5): generateMetadata(), Doctor(), getBookingLocations, getDoctor, getDoctorAddresses
Cohesion: 0.40
Nodes (3): KOHGILUYEH, scope, YASUJ
## Knowledge Gaps
- **793 isolated node(s):** `metadata`, `FILTER_KEYS`, `fallbackLabels`, `MaterialUISwitch`, `fixedIconData` (+788 more)
- **815 isolated node(s):** `metadata`, `fallbackLabels`, `MaterialUISwitch`, `fixedIconData`, `metadata` (+810 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **30 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
- **33 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
- **Why does `imageUrl()` connect `Community 45` to `Community 0`, `Community 4`, `Community 7`, `Community 368`, `Community 81`, `Community 55`, `Community 56`, `Community 89`, `Community 378`?**
_High betweenness centrality (0.037) - this node is a cross-community bridge._
- **Why does `getStateInfo()` connect `Community 29` to `Community 0`, `Community 67`, `Community 70`, `Community 6`, `Community 72`, `Community 45`, `Community 14`, `Community 16`, `Community 368`, `Community 51`, `Community 86`, `Community 377`, `Community 378`?**
- **Why does `imageUrl()` connect `Community 45` to `Community 0`, `Community 4`, `Community 7`, `Community 81`, `Community 55`, `Community 56`, `Community 89`, `Community 380`?**
_High betweenness centrality (0.038) - this node is a cross-community bridge._
- **Why does `getStateInfo()` connect `Community 29` to `Community 0`, `Community 67`, `Community 6`, `Community 72`, `Community 140`, `Community 45`, `Community 14`, `Community 16`, `Community 86`, `Community 377`?**
_High betweenness centrality (0.034) - this node is a cross-community bridge._
- **Why does `isRootCity()` connect `Community 51` to `Community 3`, `Community 29`?**
_High betweenness centrality (0.016) - this node is a cross-community bridge._
- **Are the 22 inferred relationships involving `getStateInfo()` (e.g. with `generateMetadata()` and `AboutUsPage()`) actually correct?**
_`getStateInfo()` has 22 INFERRED edges - model-reasoned connections that need verification._
- **Why does `isRootCity()` connect `Community 86` to `Community 51`, `Community 3`, `Community 29`, `Community 70`?**
_High betweenness centrality (0.023) - this node is a cross-community bridge._
- **Are the 24 inferred relationships involving `getStateInfo()` (e.g. with `generateMetadata()` and `AboutUsPage()`) actually correct?**
_`getStateInfo()` has 24 INFERRED edges - model-reasoned connections that need verification._
- **Are the 14 inferred relationships involving `imageUrl()` (e.g. with `generateMetadata()` and `generateMetadata()`) actually correct?**
_`imageUrl()` has 14 INFERRED edges - model-reasoned connections that need verification._
- **What connects `metadata`, `FILTER_KEYS`, `fallbackLabels` to the rest of the system?**
_793 weakly-connected nodes found - possible documentation gaps or missing edges._
- **What connects `metadata`, `fallbackLabels`, `MaterialUISwitch` to the rest of the system?**
_815 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `Community 0` be split into smaller, more focused modules?**
_Cohesion score 0.05263157894736842 - nodes in this community are weakly interconnected._
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2543 -391
View File
File diff suppressed because it is too large Load Diff
+135 -75
View File
@@ -34,14 +34,9 @@
"ast_hash": "b4fd1efd2e3de5280cd81eb855f99aa0",
"semantic_hash": ""
},
"app/blog/[slug]/loading.js": {
"mtime": 1783776875.6702917,
"ast_hash": "016627769c04cbebb73b4b3cfb0d23c6",
"semantic_hash": ""
},
"app/blog/[slug]/page.js": {
"mtime": 1783788127.1066604,
"ast_hash": "8a7dd8b28cc39eadd631e4e93cd2c9a2",
"mtime": 1784407027.0477514,
"ast_hash": "3ef2ccdd2e5e6f053e46597a16e25c26",
"semantic_hash": ""
},
"app/blogs/loading.js": {
@@ -50,18 +45,13 @@
"semantic_hash": ""
},
"app/blogs/page.js": {
"mtime": 1783788127.1070502,
"ast_hash": "c3171fa9e851483e1cf602dbf0cb61a1",
"semantic_hash": ""
},
"app/clinic/[slug]/loading.js": {
"mtime": 1783776875.6710782,
"ast_hash": "14e0d7de5c9a363ea15b7e93cee5184f",
"mtime": 1784406632.8936884,
"ast_hash": "29bdf4c9f75d6efdcf03f153fb9e10c1",
"semantic_hash": ""
},
"app/clinic/[slug]/page.js": {
"mtime": 1783788127.107519,
"ast_hash": "4f60ebf11d1b5372c11ec251f5813353",
"mtime": 1784407022.8888147,
"ast_hash": "a0fa950517333d4dfbd2cf07173297e5",
"semantic_hash": ""
},
"app/clinics/loading.js": {
@@ -70,8 +60,8 @@
"semantic_hash": ""
},
"app/clinics/page.js": {
"mtime": 1783788127.1081054,
"ast_hash": "4812011bfb3102ac75cf14833b65f5f3",
"mtime": 1784406347.6483262,
"ast_hash": "5bba3feb0c956e665183bcd1ec40c6ac",
"semantic_hash": ""
},
"app/component/AnimationTextHead.js": {
@@ -130,8 +120,8 @@
"semantic_hash": ""
},
"app/component/Pageguide.js": {
"mtime": 1783776875.673467,
"ast_hash": "0300a0cab556d111d5c5b8f4a87e9018",
"mtime": 1784406207.271761,
"ast_hash": "9d7f746731e37d418ca709cbf67dd0fe",
"semantic_hash": ""
},
"app/component/Pagination.js": {
@@ -305,8 +295,8 @@
"semantic_hash": ""
},
"app/component/head/index.js": {
"mtime": 1783776875.6768641,
"ast_hash": "e821e9f2887d9a99a6d61b79394ebbdd",
"mtime": 1784406294.1020348,
"ast_hash": "82dc3526e0ee2be2ecd34b6b1fb17b31",
"semantic_hash": ""
},
"app/component/loading/Circular.js": {
@@ -414,14 +404,9 @@
"ast_hash": "55e4510b0ffae397bde137577f541559",
"semantic_hash": ""
},
"app/doctor/[slug]/loading.js": {
"mtime": 1783776875.67893,
"ast_hash": "0162c799a2207f950e524d2775162b84",
"semantic_hash": ""
},
"app/doctor/[slug]/page.js": {
"mtime": 1784372994.657654,
"ast_hash": "b895af9c7f69b7ee5cfa72afb54157a8",
"mtime": 1784407284.5098457,
"ast_hash": "db96a84c61baa865908cdee7d6d4e897",
"semantic_hash": ""
},
"app/doctors/loading.js": {
@@ -430,8 +415,8 @@
"semantic_hash": ""
},
"app/doctors/page.js": {
"mtime": 1783788127.109245,
"ast_hash": "89750247d7b8c327fcaaca9b7bd21e17",
"mtime": 1784406341.5437217,
"ast_hash": "6540db05ff1cc0de7d0e1c55e5ae3471",
"semantic_hash": ""
},
"app/error.js": {
@@ -485,13 +470,13 @@
"semantic_hash": ""
},
"app/sitemap.js": {
"mtime": 1783837670.0674648,
"ast_hash": "87d7e8351aeaf78013c8f1e073e32bff",
"mtime": 1784407686.3603573,
"ast_hash": "a0279f915ade8ee96f23023100d5dc1a",
"semantic_hash": ""
},
"app/specialties/page.js": {
"mtime": 1783788127.1106946,
"ast_hash": "4a7b55c186bacc3fe56649ba43559ac0",
"mtime": 1784406352.8949425,
"ast_hash": "ae805b4462ea5a3b0be07fae1b113182",
"semantic_hash": ""
},
"app/theme/theme.js": {
@@ -515,7 +500,7 @@
"semantic_hash": ""
},
"components/appointment/Container.js": {
"mtime": 1784372894.7871401,
"mtime": 1784391828.218286,
"ast_hash": "8cb736f55e88a28042211b0a6035739f",
"semantic_hash": ""
},
@@ -555,7 +540,7 @@
"semantic_hash": ""
},
"components/appointment/detail/SubmitData.js": {
"mtime": 1784369779.2972658,
"mtime": 1784391828.219858,
"ast_hash": "c2f66995b3be5c3608bec79c5392674c",
"semantic_hash": ""
},
@@ -570,7 +555,7 @@
"semantic_hash": ""
},
"components/appointment/index.js": {
"mtime": 1784372880.5497036,
"mtime": 1784391828.2210534,
"ast_hash": "9e19a1e1b6ecb5f32b040fc6e5e65688",
"semantic_hash": ""
},
@@ -615,7 +600,7 @@
"semantic_hash": ""
},
"components/appointment/successPay/index.js": {
"mtime": 1783776875.6890368,
"mtime": 1784391828.2219212,
"ast_hash": "8e6daf759ebf175178eb070c03e77f28",
"semantic_hash": ""
},
@@ -645,13 +630,13 @@
"semantic_hash": ""
},
"components/blog/head/index.js": {
"mtime": 1783776875.689889,
"ast_hash": "815d7aaefc944ccc3307ed1e3a88b7dd",
"mtime": 1784406682.6597717,
"ast_hash": "2eab10468e5fce355b3b4ac944aa2a8a",
"semantic_hash": ""
},
"components/blog/index.js": {
"mtime": 1760953552.2328737,
"ast_hash": "46848c06aa6bf6b4456ba026b547d9d0",
"mtime": 1784406695.3540223,
"ast_hash": "554031757727365554d14e77fd91449a",
"semantic_hash": ""
},
"components/blog/relatedContent/Item.js": {
@@ -695,8 +680,8 @@
"semantic_hash": ""
},
"components/clinic/components/about/ContentDetail.js": {
"mtime": 1760953552.2337117,
"ast_hash": "b6a8ef012a217eac89c90b0433253c29",
"mtime": 1784406329.917917,
"ast_hash": "ee2ec0cb42264f573e20f4bf95d475f5",
"semantic_hash": ""
},
"components/clinic/components/about/ListBime.js": {
@@ -740,8 +725,8 @@
"semantic_hash": ""
},
"components/clinic/components/about/index.js": {
"mtime": 1760953552.2343261,
"ast_hash": "cf9cedf1c7ff66c2be4a252ce67641c1",
"mtime": 1784406333.9955986,
"ast_hash": "d7f7f6437879967221185d3b02a6f5bb",
"semantic_hash": ""
},
"components/clinic/components/contact/ContentDetail.js": {
@@ -865,8 +850,8 @@
"semantic_hash": ""
},
"components/clinic/index.js": {
"mtime": 1764813617.2930207,
"ast_hash": "9040f0915df145d14b69e97a034e9c32",
"mtime": 1784406236.7860522,
"ast_hash": "591faaba172c34e9941f65aed342ce42",
"semantic_hash": ""
},
"components/clinics/head/AutoSearch.js": {
@@ -910,8 +895,8 @@
"semantic_hash": ""
},
"components/clinics/index.js": {
"mtime": 1783776875.6953976,
"ast_hash": "f06fbe6a0d4ae74e3b7ad91f0023af94",
"mtime": 1784406767.4070415,
"ast_hash": "4da5edf0ad30361e217b56759a7e6cb0",
"semantic_hash": ""
},
"components/clinics/list/ItemClinic.js": {
@@ -920,8 +905,8 @@
"semantic_hash": ""
},
"components/clinics/list/index.js": {
"mtime": 1783776875.6957505,
"ast_hash": "94309b5c74e5b249f91909700fd98718",
"mtime": 1784406215.5236862,
"ast_hash": "d74c2cf770f7a2eb7cc9bf31357bb0b4",
"semantic_hash": ""
},
"components/common/InlineJalaliMonth.js": {
@@ -1275,13 +1260,13 @@
"semantic_hash": ""
},
"components/doctor/appointmentList/ItemAppointment.js": {
"mtime": 1783776875.7039776,
"ast_hash": "4122e2d8e034376e9fec85aba74cc311",
"mtime": 1784379062.7296646,
"ast_hash": "7d4054f02a1066a0f749c878e96c3a51",
"semantic_hash": ""
},
"components/doctor/appointmentList/index.js": {
"mtime": 1783776875.704231,
"ast_hash": "c0f474f78abf0e43b0779315ce514128",
"mtime": 1784379037.3930647,
"ast_hash": "852922a8c3c20031afa776b03cf116ef",
"semantic_hash": ""
},
"components/doctor/appointmentList/modal/index.js": {
@@ -1370,8 +1355,8 @@
"semantic_hash": ""
},
"components/doctor/index.js": {
"mtime": 1784373003.075006,
"ast_hash": "5ac231f0d8d5d450450c548f8c4ef558",
"mtime": 1784406821.2247164,
"ast_hash": "104b3b1ca3276bd1adb0a9b21d0c0cc1",
"semantic_hash": ""
},
"components/doctor/poster/PosterLight.js": {
@@ -1395,8 +1380,8 @@
"semantic_hash": ""
},
"components/doctors/head/FilterLocate.js": {
"mtime": 1760953552.2439659,
"ast_hash": "58d248e3c46201f47464c8b9748e0dbd",
"mtime": 1784406269.086647,
"ast_hash": "802760f7ca9d22f809dfd93cb5961326",
"semantic_hash": ""
},
"components/doctors/head/index.js": {
@@ -1405,8 +1390,8 @@
"semantic_hash": ""
},
"components/doctors/index.js": {
"mtime": 1784014948.7366664,
"ast_hash": "2cbc3523c140670b5b28330dadc591da",
"mtime": 1784406756.4799144,
"ast_hash": "42c5dcc1c26fd4b24ab8ef9751f4f036",
"semantic_hash": ""
},
"components/doctors/listDoctors/index.js": {
@@ -1500,8 +1485,8 @@
"semantic_hash": ""
},
"components/home/TextHeader.js": {
"mtime": 1783776875.712511,
"ast_hash": "9e2b62254d4d2b345f260736c82f7a1c",
"mtime": 1784406262.2477946,
"ast_hash": "8201cbb392459c065a388fb49387e20e",
"semantic_hash": ""
},
"components/home/index.js": {
@@ -2500,18 +2485,18 @@
"semantic_hash": ""
},
"components/specialties/index.js": {
"mtime": 1783776875.721483,
"ast_hash": "3974ee8a727b469cced3f740d2767b4a",
"mtime": 1784406300.7337966,
"ast_hash": "1a62094048ae0e3700ba0564247de886",
"semantic_hash": ""
},
"components/specialties/list/ItemSpecialties.js": {
"mtime": 1783776875.7216527,
"ast_hash": "b5893cfe7f6c5c41a61a721d7c817fee",
"mtime": 1784406551.3291972,
"ast_hash": "63d9537e1db9afa8f533e42eb9328ca2",
"semantic_hash": ""
},
"components/specialties/list/index.js": {
"mtime": 1783776875.7218535,
"ast_hash": "27b0dae4c89e8a6a86f8bcef50841e46",
"mtime": 1784406305.8913972,
"ast_hash": "845165cec7a0f15a4ab5a6c2cb056dc4",
"semantic_hash": ""
},
"constans/index.js": {
@@ -2605,8 +2590,8 @@
"semantic_hash": ""
},
"lib/getCanonicalUrl.js": {
"mtime": 1783776875.7578259,
"ast_hash": "71161f91c45f487c53ef50e4c114147f",
"mtime": 1784407010.2048862,
"ast_hash": "382b422d12683c05d27032df15d46bd5",
"semantic_hash": ""
},
"lib/getStateInfo.js": {
@@ -2695,8 +2680,8 @@
"semantic_hash": ""
},
"proxy.js": {
"mtime": 1783776875.7619658,
"ast_hash": "21f794f5fc7902cb191878f2c473c29b",
"mtime": 1784405767.8895226,
"ast_hash": "bf1fcfe5ec3952788994411a3910ea50",
"semantic_hash": ""
},
"services/api.js": {
@@ -3483,5 +3468,80 @@
"mtime": 1784371536.5668268,
"ast_hash": "9ef9470308b23df8f93dae9b76d33d91",
"semantic_hash": ""
},
"app/specialties/[slug]/page.js": {
"mtime": 1784406541.9613838,
"ast_hash": "9bcbf931390b23e3159e7a0eac913688",
"semantic_hash": ""
},
"components/doctor/appointmentList/bookingState.js": {
"mtime": 1784379017.0738394,
"ast_hash": "21d4c5671791aed50246b158116683d8",
"semantic_hash": ""
},
"components/specialties/detail/DoctorGrid.js": {
"mtime": 1784406425.8105416,
"ast_hash": "b1b846c9a9160a1f461a9958d69b30f5",
"semantic_hash": ""
},
"components/specialties/detail/Faq.js": {
"mtime": 1784406509.289054,
"ast_hash": "ba065f63dadc37c0dcd9d0a40f817282",
"semantic_hash": ""
},
"components/specialties/detail/index.js": {
"mtime": 1784406519.0040174,
"ast_hash": "9fa7eef69222ea971d829772150cb141",
"semantic_hash": ""
},
"lib/canonicalStrategy.test.js": {
"mtime": 1784405945.6683788,
"ast_hash": "2071f0a5b2e217101a01a02e3c0617d3",
"semantic_hash": ""
},
"lib/domainHelpers.js": {
"mtime": 1784406639.1672857,
"ast_hash": "90adb0743935709743883af7c9225688",
"semantic_hash": ""
},
"lib/domainHelpers.test.js": {
"mtime": 1784405652.7269192,
"ast_hash": "fc23deafe26cf454e8c96e57c3a0f049",
"semantic_hash": ""
},
"lib/entityQuality.js": {
"mtime": 1784406054.8168738,
"ast_hash": "51fb7d01b553143993b6bb4dab0c2724",
"semantic_hash": ""
},
"lib/listingIntro.js": {
"mtime": 1784407866.2714968,
"ast_hash": "41f72b224d43827ed1e76a400e6db122",
"semantic_hash": ""
},
"lib/listingRobots.js": {
"mtime": 1784405698.0589795,
"ast_hash": "c80b07a640e35536acf44404dde1076f",
"semantic_hash": ""
},
"lib/listingRobots.test.js": {
"mtime": 1784405747.7086,
"ast_hash": "c85cc1f9006477adc1bc0fce070b74ae",
"semantic_hash": ""
},
"lib/specialtyContent.js": {
"mtime": 1784407570.458993,
"ast_hash": "c723f71b8073175c55ef1f155c75c3b8",
"semantic_hash": ""
},
"lib/specialtyContent.test.js": {
"mtime": 1784407873.0701578,
"ast_hash": "5312548dd11cc5207a3f53bd272c2d3b",
"semantic_hash": ""
},
".claude/prompt/doctor-profile-booking-state-from-locations.md": {
"mtime": 1784377204.9349537,
"ast_hash": "5c45fd5c8cc1d2a002c6bbf3d8c8066f",
"semantic_hash": ""
}
}