@autumnsgrove/groveengine 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. package/README.md +163 -0
  2. package/dist/auth/jwt.d.ts +14 -0
  3. package/dist/auth/jwt.js +109 -0
  4. package/dist/auth/session.d.ts +42 -0
  5. package/dist/auth/session.js +105 -0
  6. package/dist/components/admin/GutterManager.svelte +910 -0
  7. package/dist/components/admin/GutterManager.svelte.d.ts +15 -0
  8. package/dist/components/admin/MarkdownEditor.svelte +3114 -0
  9. package/dist/components/admin/MarkdownEditor.svelte.d.ts +43 -0
  10. package/dist/components/custom/CollapsibleSection.svelte +74 -0
  11. package/dist/components/custom/CollapsibleSection.svelte.d.ts +15 -0
  12. package/dist/components/custom/ContentWithGutter.svelte +646 -0
  13. package/dist/components/custom/ContentWithGutter.svelte.d.ts +19 -0
  14. package/dist/components/custom/GutterItem.svelte +201 -0
  15. package/dist/components/custom/GutterItem.svelte.d.ts +11 -0
  16. package/dist/components/custom/LeftGutter.svelte +271 -0
  17. package/dist/components/custom/LeftGutter.svelte.d.ts +17 -0
  18. package/dist/components/custom/MobileTOC.svelte +273 -0
  19. package/dist/components/custom/MobileTOC.svelte.d.ts +11 -0
  20. package/dist/components/custom/TableOfContents.svelte +163 -0
  21. package/dist/components/custom/TableOfContents.svelte.d.ts +11 -0
  22. package/dist/components/gallery/ImageGallery.svelte +681 -0
  23. package/dist/components/gallery/ImageGallery.svelte.d.ts +11 -0
  24. package/dist/components/gallery/Lightbox.svelte +107 -0
  25. package/dist/components/gallery/Lightbox.svelte.d.ts +19 -0
  26. package/dist/components/gallery/LightboxCaption.svelte +25 -0
  27. package/dist/components/gallery/LightboxCaption.svelte.d.ts +11 -0
  28. package/dist/components/gallery/ZoomableImage.svelte +163 -0
  29. package/dist/components/gallery/ZoomableImage.svelte.d.ts +17 -0
  30. package/dist/components/ui/Accordion.svelte +74 -0
  31. package/dist/components/ui/Accordion.svelte.d.ts +42 -0
  32. package/dist/components/ui/Badge.svelte +48 -0
  33. package/dist/components/ui/Badge.svelte.d.ts +26 -0
  34. package/dist/components/ui/Button.svelte +74 -0
  35. package/dist/components/ui/Button.svelte.d.ts +34 -0
  36. package/dist/components/ui/Card.svelte +102 -0
  37. package/dist/components/ui/Card.svelte.d.ts +46 -0
  38. package/dist/components/ui/Dialog.svelte +91 -0
  39. package/dist/components/ui/Dialog.svelte.d.ts +43 -0
  40. package/dist/components/ui/Input.svelte +81 -0
  41. package/dist/components/ui/Input.svelte.d.ts +35 -0
  42. package/dist/components/ui/Select.svelte +69 -0
  43. package/dist/components/ui/Select.svelte.d.ts +36 -0
  44. package/dist/components/ui/Sheet.svelte +98 -0
  45. package/dist/components/ui/Sheet.svelte.d.ts +45 -0
  46. package/dist/components/ui/Skeleton.svelte +31 -0
  47. package/dist/components/ui/Skeleton.svelte.d.ts +26 -0
  48. package/dist/components/ui/Table.svelte +59 -0
  49. package/dist/components/ui/Table.svelte.d.ts +44 -0
  50. package/dist/components/ui/Tabs.svelte +76 -0
  51. package/dist/components/ui/Tabs.svelte.d.ts +41 -0
  52. package/dist/components/ui/Textarea.svelte +81 -0
  53. package/dist/components/ui/Textarea.svelte.d.ts +35 -0
  54. package/dist/components/ui/Toast.svelte +18 -0
  55. package/dist/components/ui/Toast.svelte.d.ts +7 -0
  56. package/dist/components/ui/accordion/accordion-content.svelte +24 -0
  57. package/dist/components/ui/accordion/accordion-content.svelte.d.ts +4 -0
  58. package/dist/components/ui/accordion/accordion-item.svelte +12 -0
  59. package/dist/components/ui/accordion/accordion-item.svelte.d.ts +4 -0
  60. package/dist/components/ui/accordion/accordion-trigger.svelte +29 -0
  61. package/dist/components/ui/accordion/accordion-trigger.svelte.d.ts +7 -0
  62. package/dist/components/ui/accordion/index.d.ts +6 -0
  63. package/dist/components/ui/accordion/index.js +8 -0
  64. package/dist/components/ui/badge/badge.svelte +50 -0
  65. package/dist/components/ui/badge/badge.svelte.d.ts +60 -0
  66. package/dist/components/ui/badge/index.d.ts +2 -0
  67. package/dist/components/ui/badge/index.js +2 -0
  68. package/dist/components/ui/button/button.svelte +82 -0
  69. package/dist/components/ui/button/button.svelte.d.ts +132 -0
  70. package/dist/components/ui/button/index.d.ts +2 -0
  71. package/dist/components/ui/button/index.js +4 -0
  72. package/dist/components/ui/card/card-content.svelte +16 -0
  73. package/dist/components/ui/card/card-content.svelte.d.ts +5 -0
  74. package/dist/components/ui/card/card-description.svelte +16 -0
  75. package/dist/components/ui/card/card-description.svelte.d.ts +5 -0
  76. package/dist/components/ui/card/card-footer.svelte +16 -0
  77. package/dist/components/ui/card/card-footer.svelte.d.ts +5 -0
  78. package/dist/components/ui/card/card-header.svelte +16 -0
  79. package/dist/components/ui/card/card-header.svelte.d.ts +5 -0
  80. package/dist/components/ui/card/card-title.svelte +25 -0
  81. package/dist/components/ui/card/card-title.svelte.d.ts +8 -0
  82. package/dist/components/ui/card/card.svelte +20 -0
  83. package/dist/components/ui/card/card.svelte.d.ts +5 -0
  84. package/dist/components/ui/card/index.d.ts +7 -0
  85. package/dist/components/ui/card/index.js +9 -0
  86. package/dist/components/ui/dialog/dialog-content.svelte +38 -0
  87. package/dist/components/ui/dialog/dialog-content.svelte.d.ts +9 -0
  88. package/dist/components/ui/dialog/dialog-description.svelte +16 -0
  89. package/dist/components/ui/dialog/dialog-description.svelte.d.ts +4 -0
  90. package/dist/components/ui/dialog/dialog-footer.svelte +20 -0
  91. package/dist/components/ui/dialog/dialog-footer.svelte.d.ts +5 -0
  92. package/dist/components/ui/dialog/dialog-header.svelte +20 -0
  93. package/dist/components/ui/dialog/dialog-header.svelte.d.ts +5 -0
  94. package/dist/components/ui/dialog/dialog-overlay.svelte +19 -0
  95. package/dist/components/ui/dialog/dialog-overlay.svelte.d.ts +4 -0
  96. package/dist/components/ui/dialog/dialog-title.svelte +16 -0
  97. package/dist/components/ui/dialog/dialog-title.svelte.d.ts +4 -0
  98. package/dist/components/ui/dialog/index.d.ts +12 -0
  99. package/dist/components/ui/dialog/index.js +14 -0
  100. package/dist/components/ui/index.d.ts +26 -0
  101. package/dist/components/ui/index.js +29 -0
  102. package/dist/components/ui/input/index.d.ts +2 -0
  103. package/dist/components/ui/input/index.js +4 -0
  104. package/dist/components/ui/input/input.svelte +46 -0
  105. package/dist/components/ui/input/input.svelte.d.ts +13 -0
  106. package/dist/components/ui/select/index.d.ts +11 -0
  107. package/dist/components/ui/select/index.js +13 -0
  108. package/dist/components/ui/select/select-content.svelte +39 -0
  109. package/dist/components/ui/select/select-content.svelte.d.ts +7 -0
  110. package/dist/components/ui/select/select-group-heading.svelte +16 -0
  111. package/dist/components/ui/select/select-group-heading.svelte.d.ts +4 -0
  112. package/dist/components/ui/select/select-item.svelte +37 -0
  113. package/dist/components/ui/select/select-item.svelte.d.ts +4 -0
  114. package/dist/components/ui/select/select-scroll-down-button.svelte +19 -0
  115. package/dist/components/ui/select/select-scroll-down-button.svelte.d.ts +4 -0
  116. package/dist/components/ui/select/select-scroll-up-button.svelte +19 -0
  117. package/dist/components/ui/select/select-scroll-up-button.svelte.d.ts +4 -0
  118. package/dist/components/ui/select/select-separator.svelte +13 -0
  119. package/dist/components/ui/select/select-separator.svelte.d.ts +4 -0
  120. package/dist/components/ui/select/select-trigger.svelte +24 -0
  121. package/dist/components/ui/select/select-trigger.svelte.d.ts +4 -0
  122. package/dist/components/ui/separator/index.d.ts +2 -0
  123. package/dist/components/ui/separator/index.js +4 -0
  124. package/dist/components/ui/separator/separator.svelte +22 -0
  125. package/dist/components/ui/separator/separator.svelte.d.ts +4 -0
  126. package/dist/components/ui/sheet/index.d.ts +12 -0
  127. package/dist/components/ui/sheet/index.js +14 -0
  128. package/dist/components/ui/sheet/sheet-content.svelte +53 -0
  129. package/dist/components/ui/sheet/sheet-content.svelte.d.ts +62 -0
  130. package/dist/components/ui/sheet/sheet-description.svelte +16 -0
  131. package/dist/components/ui/sheet/sheet-description.svelte.d.ts +4 -0
  132. package/dist/components/ui/sheet/sheet-footer.svelte +20 -0
  133. package/dist/components/ui/sheet/sheet-footer.svelte.d.ts +5 -0
  134. package/dist/components/ui/sheet/sheet-header.svelte +20 -0
  135. package/dist/components/ui/sheet/sheet-header.svelte.d.ts +5 -0
  136. package/dist/components/ui/sheet/sheet-overlay.svelte +21 -0
  137. package/dist/components/ui/sheet/sheet-overlay.svelte.d.ts +6 -0
  138. package/dist/components/ui/sheet/sheet-title.svelte +16 -0
  139. package/dist/components/ui/sheet/sheet-title.svelte.d.ts +4 -0
  140. package/dist/components/ui/skeleton/index.d.ts +2 -0
  141. package/dist/components/ui/skeleton/index.js +4 -0
  142. package/dist/components/ui/skeleton/skeleton.svelte +17 -0
  143. package/dist/components/ui/skeleton/skeleton.svelte.d.ts +5 -0
  144. package/dist/components/ui/table/index.d.ts +9 -0
  145. package/dist/components/ui/table/index.js +11 -0
  146. package/dist/components/ui/table/table-body.svelte +16 -0
  147. package/dist/components/ui/table/table-body.svelte.d.ts +5 -0
  148. package/dist/components/ui/table/table-caption.svelte +16 -0
  149. package/dist/components/ui/table/table-caption.svelte.d.ts +5 -0
  150. package/dist/components/ui/table/table-cell.svelte +20 -0
  151. package/dist/components/ui/table/table-cell.svelte.d.ts +5 -0
  152. package/dist/components/ui/table/table-footer.svelte +16 -0
  153. package/dist/components/ui/table/table-footer.svelte.d.ts +5 -0
  154. package/dist/components/ui/table/table-head.svelte +23 -0
  155. package/dist/components/ui/table/table-head.svelte.d.ts +5 -0
  156. package/dist/components/ui/table/table-header.svelte +16 -0
  157. package/dist/components/ui/table/table-header.svelte.d.ts +5 -0
  158. package/dist/components/ui/table/table-row.svelte +23 -0
  159. package/dist/components/ui/table/table-row.svelte.d.ts +5 -0
  160. package/dist/components/ui/table/table.svelte +18 -0
  161. package/dist/components/ui/table/table.svelte.d.ts +5 -0
  162. package/dist/components/ui/tabs/index.d.ts +6 -0
  163. package/dist/components/ui/tabs/index.js +8 -0
  164. package/dist/components/ui/tabs/tabs-content.svelte +19 -0
  165. package/dist/components/ui/tabs/tabs-content.svelte.d.ts +4 -0
  166. package/dist/components/ui/tabs/tabs-list.svelte +19 -0
  167. package/dist/components/ui/tabs/tabs-list.svelte.d.ts +4 -0
  168. package/dist/components/ui/tabs/tabs-trigger.svelte +19 -0
  169. package/dist/components/ui/tabs/tabs-trigger.svelte.d.ts +4 -0
  170. package/dist/components/ui/textarea/index.d.ts +2 -0
  171. package/dist/components/ui/textarea/index.js +4 -0
  172. package/dist/components/ui/textarea/textarea.svelte +24 -0
  173. package/dist/components/ui/textarea/textarea.svelte.d.ts +6 -0
  174. package/dist/components/ui/toast.d.ts +86 -0
  175. package/dist/components/ui/toast.js +99 -0
  176. package/dist/db/schema.sql +238 -0
  177. package/dist/index.d.ts +14 -0
  178. package/dist/index.js +20 -0
  179. package/dist/payments/index.d.ts +33 -0
  180. package/dist/payments/index.js +47 -0
  181. package/dist/payments/shop.d.ts +165 -0
  182. package/dist/payments/shop.js +588 -0
  183. package/dist/payments/stripe/client.d.ts +231 -0
  184. package/dist/payments/stripe/client.js +198 -0
  185. package/dist/payments/stripe/index.d.ts +18 -0
  186. package/dist/payments/stripe/index.js +17 -0
  187. package/dist/payments/stripe/provider.d.ts +50 -0
  188. package/dist/payments/stripe/provider.js +530 -0
  189. package/dist/payments/types.d.ts +355 -0
  190. package/dist/payments/types.js +7 -0
  191. package/dist/server/logger.d.ts +53 -0
  192. package/dist/server/logger.js +252 -0
  193. package/dist/styles/content.css +514 -0
  194. package/dist/styles/tokens.css +175 -0
  195. package/dist/utils/api.d.ts +20 -0
  196. package/dist/utils/api.js +109 -0
  197. package/dist/utils/cn.d.ts +15 -0
  198. package/dist/utils/cn.js +18 -0
  199. package/dist/utils/csrf.d.ts +22 -0
  200. package/dist/utils/csrf.js +72 -0
  201. package/dist/utils/debounce.d.ts +7 -0
  202. package/dist/utils/debounce.js +14 -0
  203. package/dist/utils/gallery.d.ts +66 -0
  204. package/dist/utils/gallery.js +181 -0
  205. package/dist/utils/gutter.d.ts +54 -0
  206. package/dist/utils/gutter.js +169 -0
  207. package/dist/utils/imageProcessor.d.ts +58 -0
  208. package/dist/utils/imageProcessor.js +205 -0
  209. package/dist/utils/json.d.ts +17 -0
  210. package/dist/utils/json.js +26 -0
  211. package/dist/utils/markdown.d.ts +101 -0
  212. package/dist/utils/markdown.js +947 -0
  213. package/dist/utils/sanitize.d.ts +25 -0
  214. package/dist/utils/sanitize.js +127 -0
  215. package/dist/utils/validation.d.ts +46 -0
  216. package/dist/utils/validation.js +169 -0
  217. package/dist/utils.d.ts +5 -0
  218. package/dist/utils.js +5 -0
  219. package/package.json +129 -0
@@ -0,0 +1,238 @@
1
+ -- D1 Schema for Git Stats Historical Data
2
+ -- Database: autumnsgrove-git-stats
3
+
4
+ -- Track repositories being monitored
5
+ CREATE TABLE IF NOT EXISTS repositories (
6
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
7
+ owner TEXT NOT NULL,
8
+ name TEXT NOT NULL,
9
+ full_name TEXT NOT NULL,
10
+ description TEXT,
11
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
12
+ updated_at TEXT NOT NULL DEFAULT (datetime('now')),
13
+ UNIQUE(owner, name)
14
+ );
15
+
16
+ -- Store daily snapshots of repository stats
17
+ CREATE TABLE IF NOT EXISTS repo_snapshots (
18
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
19
+ repo_id INTEGER NOT NULL,
20
+ snapshot_date TEXT NOT NULL,
21
+ total_commits INTEGER DEFAULT 0,
22
+ total_additions INTEGER DEFAULT 0,
23
+ total_deletions INTEGER DEFAULT 0,
24
+ open_issues INTEGER DEFAULT 0,
25
+ stars INTEGER DEFAULT 0,
26
+ forks INTEGER DEFAULT 0,
27
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
28
+ FOREIGN KEY (repo_id) REFERENCES repositories(id),
29
+ UNIQUE(repo_id, snapshot_date)
30
+ );
31
+
32
+ -- Store individual commits for history tracking
33
+ CREATE TABLE IF NOT EXISTS commits (
34
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
35
+ repo_id INTEGER NOT NULL,
36
+ sha TEXT NOT NULL,
37
+ message TEXT,
38
+ author TEXT,
39
+ committed_at TEXT NOT NULL,
40
+ additions INTEGER DEFAULT 0,
41
+ deletions INTEGER DEFAULT 0,
42
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
43
+ FOREIGN KEY (repo_id) REFERENCES repositories(id),
44
+ UNIQUE(repo_id, sha)
45
+ );
46
+
47
+ -- Store TODO snapshots for progress tracking
48
+ CREATE TABLE IF NOT EXISTS todo_snapshots (
49
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
50
+ repo_id INTEGER NOT NULL,
51
+ snapshot_date TEXT NOT NULL,
52
+ total_todos INTEGER DEFAULT 0,
53
+ completed_todos INTEGER DEFAULT 0,
54
+ code_todos INTEGER DEFAULT 0,
55
+ markdown_todos INTEGER DEFAULT 0,
56
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
57
+ FOREIGN KEY (repo_id) REFERENCES repositories(id),
58
+ UNIQUE(repo_id, snapshot_date)
59
+ );
60
+
61
+ -- Store AI analysis results
62
+ CREATE TABLE IF NOT EXISTS ai_analyses (
63
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
64
+ repo_id INTEGER NOT NULL,
65
+ analysis_date TEXT NOT NULL,
66
+ health_score INTEGER,
67
+ raw_analysis TEXT,
68
+ input_tokens INTEGER DEFAULT 0,
69
+ output_tokens INTEGER DEFAULT 0,
70
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
71
+ FOREIGN KEY (repo_id) REFERENCES repositories(id)
72
+ );
73
+
74
+ -- Store commit activity by hour/day for heatmaps
75
+ CREATE TABLE IF NOT EXISTS commit_activity (
76
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
77
+ repo_id INTEGER NOT NULL,
78
+ activity_date TEXT NOT NULL,
79
+ hour INTEGER NOT NULL CHECK(hour >= 0 AND hour <= 23),
80
+ day_of_week INTEGER NOT NULL CHECK(day_of_week >= 0 AND day_of_week <= 6),
81
+ commit_count INTEGER DEFAULT 1,
82
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
83
+ FOREIGN KEY (repo_id) REFERENCES repositories(id),
84
+ UNIQUE(repo_id, activity_date, hour)
85
+ );
86
+
87
+ -- Store daily development summaries for timeline display
88
+ CREATE TABLE IF NOT EXISTS daily_summaries (
89
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
90
+ summary_date TEXT NOT NULL UNIQUE, -- YYYY-MM-DD format
91
+ brief_summary TEXT, -- 1-2 sentence overview (null for rest days)
92
+ detailed_timeline TEXT, -- Full markdown breakdown
93
+ gutter_content TEXT, -- JSON array of gutter items for side comments
94
+ commit_count INTEGER DEFAULT 0,
95
+ repos_active TEXT, -- JSON array of repo names
96
+ total_additions INTEGER DEFAULT 0,
97
+ total_deletions INTEGER DEFAULT 0,
98
+ ai_model TEXT, -- Model used for generation
99
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
100
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
101
+ );
102
+
103
+ -- Track AI usage and costs across providers
104
+ CREATE TABLE IF NOT EXISTS ai_usage (
105
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
106
+ usage_date TEXT NOT NULL, -- YYYY-MM-DD format
107
+ provider TEXT NOT NULL, -- 'anthropic', 'cloudflare', 'moonshot'
108
+ model TEXT NOT NULL, -- Full model ID
109
+ request_count INTEGER DEFAULT 1,
110
+ input_tokens INTEGER DEFAULT 0,
111
+ output_tokens INTEGER DEFAULT 0,
112
+ estimated_cost_usd REAL DEFAULT 0, -- Estimated cost in USD
113
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
114
+ updated_at TEXT NOT NULL DEFAULT (datetime('now')),
115
+ UNIQUE(usage_date, provider, model)
116
+ );
117
+
118
+ -- Track individual AI requests for detailed cost analysis
119
+ CREATE TABLE IF NOT EXISTS ai_requests (
120
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
121
+ request_date TEXT NOT NULL, -- YYYY-MM-DD format
122
+ request_time TEXT NOT NULL DEFAULT (datetime('now')),
123
+ provider TEXT NOT NULL,
124
+ model TEXT NOT NULL,
125
+ purpose TEXT, -- 'daily_summary', 'analysis', etc.
126
+ input_tokens INTEGER DEFAULT 0,
127
+ output_tokens INTEGER DEFAULT 0,
128
+ estimated_cost_usd REAL DEFAULT 0,
129
+ summary_date TEXT, -- Link to daily_summaries if applicable
130
+ success INTEGER DEFAULT 1, -- 1 = success, 0 = failure
131
+ error_message TEXT
132
+ );
133
+
134
+ -- Track background jobs for async processing
135
+ CREATE TABLE IF NOT EXISTS background_jobs (
136
+ id TEXT PRIMARY KEY, -- UUID for job
137
+ job_type TEXT NOT NULL, -- 'backfill', 'single_summary', etc.
138
+ status TEXT NOT NULL DEFAULT 'pending', -- 'pending', 'processing', 'completed', 'failed'
139
+ progress INTEGER DEFAULT 0, -- Percentage complete (0-100)
140
+ total_items INTEGER DEFAULT 0, -- Total items to process
141
+ completed_items INTEGER DEFAULT 0, -- Items completed so far
142
+ result TEXT, -- JSON result data
143
+ error_message TEXT, -- Error if failed
144
+ metadata TEXT, -- JSON metadata (dates, model, etc.)
145
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
146
+ updated_at TEXT NOT NULL DEFAULT (datetime('now')),
147
+ completed_at TEXT -- When job finished
148
+ );
149
+
150
+ -- Indexes for common queries
151
+ CREATE INDEX IF NOT EXISTS idx_repo_snapshots_date ON repo_snapshots(snapshot_date);
152
+ CREATE INDEX IF NOT EXISTS idx_commits_committed_at ON commits(committed_at);
153
+ CREATE INDEX IF NOT EXISTS idx_commits_repo ON commits(repo_id);
154
+ CREATE INDEX IF NOT EXISTS idx_todo_snapshots_date ON todo_snapshots(snapshot_date);
155
+ CREATE INDEX IF NOT EXISTS idx_commit_activity_date ON commit_activity(activity_date);
156
+ CREATE INDEX IF NOT EXISTS idx_daily_summaries_date ON daily_summaries(summary_date DESC);
157
+ CREATE INDEX IF NOT EXISTS idx_ai_usage_date ON ai_usage(usage_date DESC);
158
+ CREATE INDEX IF NOT EXISTS idx_ai_requests_date ON ai_requests(request_date DESC);
159
+ CREATE INDEX IF NOT EXISTS idx_background_jobs_status ON background_jobs(status);
160
+ CREATE INDEX IF NOT EXISTS idx_background_jobs_created ON background_jobs(created_at DESC);
161
+
162
+ -- Gallery System Tables
163
+ -- Image metadata with hybrid R2 + D1 approach
164
+
165
+ -- Gallery image metadata (hybrid R2 + D1 approach)
166
+ CREATE TABLE IF NOT EXISTS gallery_images (
167
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
168
+ r2_key TEXT NOT NULL UNIQUE, -- R2 object key (filename/path)
169
+
170
+ -- Parsed metadata (auto-extracted from filename)
171
+ parsed_date TEXT, -- YYYY-MM-DD from filename
172
+ parsed_category TEXT, -- e.g., 'minecraft', 'selfies' from path
173
+ parsed_slug TEXT, -- e.g., 'forest-walk' from 'forest-walk.jpg'
174
+
175
+ -- Custom metadata (manually added via admin)
176
+ custom_title TEXT, -- Override parsed slug
177
+ custom_description TEXT, -- Rich description
178
+ custom_date TEXT, -- Override parsed date
179
+
180
+ -- R2 cached data (synced periodically)
181
+ file_size INTEGER,
182
+ uploaded_at TEXT,
183
+ cdn_url TEXT,
184
+
185
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
186
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
187
+ );
188
+
189
+ -- Gallery tags (user-defined categories)
190
+ CREATE TABLE IF NOT EXISTS gallery_tags (
191
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
192
+ name TEXT NOT NULL UNIQUE, -- e.g., 'minecraft', 'food', 'selfies'
193
+ slug TEXT NOT NULL UNIQUE, -- URL-safe version
194
+ color TEXT DEFAULT '#5cb85f', -- Hex color for badge
195
+ description TEXT, -- Optional tag description
196
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
197
+ );
198
+
199
+ -- Many-to-many: images to tags
200
+ CREATE TABLE IF NOT EXISTS gallery_image_tags (
201
+ image_id INTEGER NOT NULL,
202
+ tag_id INTEGER NOT NULL,
203
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
204
+ PRIMARY KEY (image_id, tag_id),
205
+ FOREIGN KEY (image_id) REFERENCES gallery_images(id) ON DELETE CASCADE,
206
+ FOREIGN KEY (tag_id) REFERENCES gallery_tags(id) ON DELETE CASCADE
207
+ );
208
+
209
+ -- Gallery collections (curated albums)
210
+ CREATE TABLE IF NOT EXISTS gallery_collections (
211
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
212
+ name TEXT NOT NULL, -- e.g., 'Pride 2024', 'Grove Progress'
213
+ slug TEXT NOT NULL UNIQUE,
214
+ description TEXT,
215
+ cover_image_id INTEGER, -- Featured image for collection
216
+ display_order INTEGER DEFAULT 0, -- Sort order for display
217
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
218
+ updated_at TEXT NOT NULL DEFAULT (datetime('now')),
219
+ FOREIGN KEY (cover_image_id) REFERENCES gallery_images(id) ON DELETE SET NULL
220
+ );
221
+
222
+ -- Many-to-many: images to collections
223
+ CREATE TABLE IF NOT EXISTS gallery_collection_images (
224
+ collection_id INTEGER NOT NULL,
225
+ image_id INTEGER NOT NULL,
226
+ display_order INTEGER DEFAULT 0, -- Order within collection
227
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
228
+ PRIMARY KEY (collection_id, image_id),
229
+ FOREIGN KEY (collection_id) REFERENCES gallery_collections(id) ON DELETE CASCADE,
230
+ FOREIGN KEY (image_id) REFERENCES gallery_images(id) ON DELETE CASCADE
231
+ );
232
+
233
+ -- Indexes for gallery performance
234
+ CREATE INDEX IF NOT EXISTS idx_gallery_images_parsed_date ON gallery_images(parsed_date DESC);
235
+ CREATE INDEX IF NOT EXISTS idx_gallery_images_parsed_category ON gallery_images(parsed_category);
236
+ CREATE INDEX IF NOT EXISTS idx_gallery_images_r2_key ON gallery_images(r2_key);
237
+ CREATE INDEX IF NOT EXISTS idx_gallery_tags_slug ON gallery_tags(slug);
238
+ CREATE INDEX IF NOT EXISTS idx_gallery_collections_slug ON gallery_collections(slug);
@@ -0,0 +1,14 @@
1
+ export { default as ContentWithGutter } from './components/custom/ContentWithGutter.svelte';
2
+ export { default as GutterItem } from './components/custom/GutterItem.svelte';
3
+ export { default as LeftGutter } from './components/custom/LeftGutter.svelte';
4
+ export { default as TableOfContents } from './components/custom/TableOfContents.svelte';
5
+ export { default as MobileTOC } from './components/custom/MobileTOC.svelte';
6
+ export { default as CollapsibleSection } from './components/custom/CollapsibleSection.svelte';
7
+ export { default as MarkdownEditor } from './components/admin/MarkdownEditor.svelte';
8
+ export { default as GutterManager } from './components/admin/GutterManager.svelte';
9
+ export { default as ImageGallery } from './components/gallery/ImageGallery.svelte';
10
+ export { default as Lightbox } from './components/gallery/Lightbox.svelte';
11
+ export { default as LightboxCaption } from './components/gallery/LightboxCaption.svelte';
12
+ export { default as ZoomableImage } from './components/gallery/ZoomableImage.svelte';
13
+ export * from './components/ui/index';
14
+ export { cn } from './utils/cn';
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ // Main entry point for @autumnsgrove/groveengine
2
+ // Custom components
3
+ export { default as ContentWithGutter } from './components/custom/ContentWithGutter.svelte';
4
+ export { default as GutterItem } from './components/custom/GutterItem.svelte';
5
+ export { default as LeftGutter } from './components/custom/LeftGutter.svelte';
6
+ export { default as TableOfContents } from './components/custom/TableOfContents.svelte';
7
+ export { default as MobileTOC } from './components/custom/MobileTOC.svelte';
8
+ export { default as CollapsibleSection } from './components/custom/CollapsibleSection.svelte';
9
+ // Admin components
10
+ export { default as MarkdownEditor } from './components/admin/MarkdownEditor.svelte';
11
+ export { default as GutterManager } from './components/admin/GutterManager.svelte';
12
+ // Gallery components
13
+ export { default as ImageGallery } from './components/gallery/ImageGallery.svelte';
14
+ export { default as Lightbox } from './components/gallery/Lightbox.svelte';
15
+ export { default as LightboxCaption } from './components/gallery/LightboxCaption.svelte';
16
+ export { default as ZoomableImage } from './components/gallery/ZoomableImage.svelte';
17
+ // UI components - re-export all from the UI index
18
+ export * from './components/ui/index';
19
+ // Utilities
20
+ export { cn } from './utils/cn';
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Grove Payments Module
3
+ *
4
+ * Abstract payment provider system with pluggable implementations.
5
+ * Currently supports Stripe, designed for easy addition of Paddle, LemonSqueezy, etc.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { createPaymentProvider, type PaymentProvider } from './';
10
+ *
11
+ * // Create a Stripe provider
12
+ * const payments = createPaymentProvider('stripe', {
13
+ * secretKey: platform.env.STRIPE_SECRET_KEY,
14
+ * webhookSecret: platform.env.STRIPE_WEBHOOK_SECRET,
15
+ * });
16
+ *
17
+ * // Use the provider
18
+ * const session = await payments.createCheckoutSession(items, options, resolveVariant);
19
+ * ```
20
+ */
21
+ import type { PaymentProvider, PaymentProviderConfig } from './types.js';
22
+ export type ProviderType = 'stripe' | 'paddle' | 'lemonsqueezy';
23
+ /**
24
+ * Create a payment provider instance
25
+ *
26
+ * @param type - The payment provider type ('stripe', 'paddle', etc.)
27
+ * @param config - Provider-specific configuration
28
+ * @returns A PaymentProvider implementation
29
+ */
30
+ export declare function createPaymentProvider(type: ProviderType, config: PaymentProviderConfig): PaymentProvider;
31
+ export * from './types.js';
32
+ export { StripeClient, StripeAPIError, StripeProvider, createStripeProvider, } from './stripe/index.js';
33
+ export type { StripeClientConfig, StripeProduct, StripePrice, StripeCheckoutSession, StripeEvent, } from './stripe/index.js';
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Grove Payments Module
3
+ *
4
+ * Abstract payment provider system with pluggable implementations.
5
+ * Currently supports Stripe, designed for easy addition of Paddle, LemonSqueezy, etc.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { createPaymentProvider, type PaymentProvider } from './';
10
+ *
11
+ * // Create a Stripe provider
12
+ * const payments = createPaymentProvider('stripe', {
13
+ * secretKey: platform.env.STRIPE_SECRET_KEY,
14
+ * webhookSecret: platform.env.STRIPE_WEBHOOK_SECRET,
15
+ * });
16
+ *
17
+ * // Use the provider
18
+ * const session = await payments.createCheckoutSession(items, options, resolveVariant);
19
+ * ```
20
+ */
21
+ import { createStripeProvider } from './stripe/index.js';
22
+ /**
23
+ * Create a payment provider instance
24
+ *
25
+ * @param type - The payment provider type ('stripe', 'paddle', etc.)
26
+ * @param config - Provider-specific configuration
27
+ * @returns A PaymentProvider implementation
28
+ */
29
+ export function createPaymentProvider(type, config) {
30
+ switch (type) {
31
+ case 'stripe':
32
+ return createStripeProvider(config);
33
+ case 'paddle':
34
+ throw new Error('Paddle provider not yet implemented');
35
+ case 'lemonsqueezy':
36
+ throw new Error('LemonSqueezy provider not yet implemented');
37
+ default:
38
+ throw new Error(`Unknown payment provider: ${type}`);
39
+ }
40
+ }
41
+ // =============================================================================
42
+ // RE-EXPORTS
43
+ // =============================================================================
44
+ // All types from the types module
45
+ export * from './types.js';
46
+ // Stripe-specific exports (for advanced usage)
47
+ export { StripeClient, StripeAPIError, StripeProvider, createStripeProvider, } from './stripe/index.js';
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Shop Database Operations
3
+ *
4
+ * Utilities for managing products, orders, and customers in D1.
5
+ */
6
+ import type { Product, ProductVariant, ProductType, ProductStatus, Order, OrderStatus, PaymentStatus, Customer, PricingType, BillingInterval } from './types.js';
7
+ interface D1Database {
8
+ prepare(query: string): D1PreparedStatement;
9
+ batch<T = unknown>(statements: D1PreparedStatement[]): Promise<D1Result<T>[]>;
10
+ }
11
+ interface D1PreparedStatement {
12
+ bind(...values: unknown[]): D1PreparedStatement;
13
+ first<T = unknown>(): Promise<T | null>;
14
+ all<T = unknown>(): Promise<D1Result<T>>;
15
+ run(): Promise<D1Result>;
16
+ }
17
+ interface D1Result<T = unknown> {
18
+ results: T[];
19
+ success: boolean;
20
+ meta?: {
21
+ changes?: number;
22
+ last_row_id?: number;
23
+ };
24
+ }
25
+ export declare function getProducts(db: D1Database, tenantId: string, options?: {
26
+ status?: ProductStatus;
27
+ type?: ProductType;
28
+ category?: string;
29
+ limit?: number;
30
+ offset?: number;
31
+ }): Promise<Product[]>;
32
+ export declare function getProductBySlug(db: D1Database, tenantId: string, slug: string): Promise<Product | null>;
33
+ export declare function getProductById(db: D1Database, productId: string): Promise<Product | null>;
34
+ export declare function createProduct(db: D1Database, tenantId: string, data: {
35
+ name: string;
36
+ slug: string;
37
+ description?: string;
38
+ shortDescription?: string;
39
+ type?: ProductType;
40
+ status?: ProductStatus;
41
+ images?: string[];
42
+ featuredImage?: string;
43
+ category?: string;
44
+ tags?: string[];
45
+ metadata?: Record<string, string>;
46
+ }): Promise<{
47
+ id: string;
48
+ }>;
49
+ export declare function updateProduct(db: D1Database, productId: string, data: Partial<{
50
+ name: string;
51
+ slug: string;
52
+ description: string;
53
+ shortDescription: string;
54
+ type: ProductType;
55
+ status: ProductStatus;
56
+ images: string[];
57
+ featuredImage: string;
58
+ category: string;
59
+ tags: string[];
60
+ providerProductId: string;
61
+ metadata: Record<string, string>;
62
+ }>): Promise<void>;
63
+ export declare function deleteProduct(db: D1Database, productId: string): Promise<void>;
64
+ export declare function getProductVariants(db: D1Database, productId: string): Promise<ProductVariant[]>;
65
+ export declare function getVariantById(db: D1Database, variantId: string): Promise<ProductVariant | null>;
66
+ export declare function createVariant(db: D1Database, productId: string, tenantId: string, data: {
67
+ name: string;
68
+ sku?: string;
69
+ priceAmount: number;
70
+ priceCurrency?: string;
71
+ compareAtPrice?: number;
72
+ pricingType?: PricingType;
73
+ billingInterval?: BillingInterval;
74
+ billingIntervalCount?: number;
75
+ inventoryQuantity?: number;
76
+ inventoryPolicy?: 'deny' | 'continue';
77
+ trackInventory?: boolean;
78
+ downloadUrl?: string;
79
+ downloadLimit?: number;
80
+ requiresShipping?: boolean;
81
+ isDefault?: boolean;
82
+ position?: number;
83
+ metadata?: Record<string, string>;
84
+ }): Promise<{
85
+ id: string;
86
+ }>;
87
+ export declare function updateVariant(db: D1Database, variantId: string, data: Partial<{
88
+ name: string;
89
+ sku: string;
90
+ priceAmount: number;
91
+ compareAtPrice: number;
92
+ pricingType: PricingType;
93
+ billingInterval: BillingInterval;
94
+ billingIntervalCount: number;
95
+ inventoryQuantity: number;
96
+ inventoryPolicy: 'deny' | 'continue';
97
+ trackInventory: boolean;
98
+ downloadUrl: string;
99
+ downloadLimit: number;
100
+ requiresShipping: boolean;
101
+ providerPriceId: string;
102
+ isDefault: boolean;
103
+ position: number;
104
+ metadata: Record<string, string>;
105
+ }>): Promise<void>;
106
+ export declare function deleteVariant(db: D1Database, variantId: string): Promise<void>;
107
+ export declare function generateOrderNumber(db: D1Database, tenantId: string): Promise<string>;
108
+ export declare function createOrder(db: D1Database, tenantId: string, data: {
109
+ customerEmail: string;
110
+ customerName?: string;
111
+ customerId?: string;
112
+ lineItems: Array<{
113
+ productId?: string;
114
+ variantId?: string;
115
+ productName: string;
116
+ variantName: string;
117
+ sku?: string;
118
+ quantity: number;
119
+ unitPrice: number;
120
+ taxAmount?: number;
121
+ requiresShipping?: boolean;
122
+ }>;
123
+ subtotal: number;
124
+ taxTotal?: number;
125
+ shippingTotal?: number;
126
+ discountTotal?: number;
127
+ total: number;
128
+ currency?: string;
129
+ shippingAddress?: object;
130
+ billingAddress?: object;
131
+ providerSessionId?: string;
132
+ customerNotes?: string;
133
+ metadata?: Record<string, string>;
134
+ }): Promise<{
135
+ id: string;
136
+ orderNumber: string;
137
+ }>;
138
+ export declare function getOrderById(db: D1Database, orderId: string): Promise<Order | null>;
139
+ export declare function getOrderBySessionId(db: D1Database, sessionId: string): Promise<Order | null>;
140
+ export declare function updateOrderStatus(db: D1Database, orderId: string, data: {
141
+ status?: OrderStatus;
142
+ paymentStatus?: PaymentStatus;
143
+ providerPaymentId?: string;
144
+ paidAt?: number;
145
+ }): Promise<void>;
146
+ export declare function getOrders(db: D1Database, tenantId: string, options?: {
147
+ status?: OrderStatus;
148
+ paymentStatus?: PaymentStatus;
149
+ limit?: number;
150
+ offset?: number;
151
+ }): Promise<Order[]>;
152
+ export declare function getOrCreateCustomer(db: D1Database, tenantId: string, email: string, data?: {
153
+ name?: string;
154
+ phone?: string;
155
+ }): Promise<Customer>;
156
+ export declare function updateCustomer(db: D1Database, customerId: string, data: Partial<{
157
+ name: string;
158
+ phone: string;
159
+ providerCustomerId: string;
160
+ defaultShippingAddress: object;
161
+ defaultBillingAddress: object;
162
+ totalOrders: number;
163
+ totalSpent: number;
164
+ }>): Promise<void>;
165
+ export {};