@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.
- package/README.md +163 -0
- package/dist/auth/jwt.d.ts +14 -0
- package/dist/auth/jwt.js +109 -0
- package/dist/auth/session.d.ts +42 -0
- package/dist/auth/session.js +105 -0
- package/dist/components/admin/GutterManager.svelte +910 -0
- package/dist/components/admin/GutterManager.svelte.d.ts +15 -0
- package/dist/components/admin/MarkdownEditor.svelte +3114 -0
- package/dist/components/admin/MarkdownEditor.svelte.d.ts +43 -0
- package/dist/components/custom/CollapsibleSection.svelte +74 -0
- package/dist/components/custom/CollapsibleSection.svelte.d.ts +15 -0
- package/dist/components/custom/ContentWithGutter.svelte +646 -0
- package/dist/components/custom/ContentWithGutter.svelte.d.ts +19 -0
- package/dist/components/custom/GutterItem.svelte +201 -0
- package/dist/components/custom/GutterItem.svelte.d.ts +11 -0
- package/dist/components/custom/LeftGutter.svelte +271 -0
- package/dist/components/custom/LeftGutter.svelte.d.ts +17 -0
- package/dist/components/custom/MobileTOC.svelte +273 -0
- package/dist/components/custom/MobileTOC.svelte.d.ts +11 -0
- package/dist/components/custom/TableOfContents.svelte +163 -0
- package/dist/components/custom/TableOfContents.svelte.d.ts +11 -0
- package/dist/components/gallery/ImageGallery.svelte +681 -0
- package/dist/components/gallery/ImageGallery.svelte.d.ts +11 -0
- package/dist/components/gallery/Lightbox.svelte +107 -0
- package/dist/components/gallery/Lightbox.svelte.d.ts +19 -0
- package/dist/components/gallery/LightboxCaption.svelte +25 -0
- package/dist/components/gallery/LightboxCaption.svelte.d.ts +11 -0
- package/dist/components/gallery/ZoomableImage.svelte +163 -0
- package/dist/components/gallery/ZoomableImage.svelte.d.ts +17 -0
- package/dist/components/ui/Accordion.svelte +74 -0
- package/dist/components/ui/Accordion.svelte.d.ts +42 -0
- package/dist/components/ui/Badge.svelte +48 -0
- package/dist/components/ui/Badge.svelte.d.ts +26 -0
- package/dist/components/ui/Button.svelte +74 -0
- package/dist/components/ui/Button.svelte.d.ts +34 -0
- package/dist/components/ui/Card.svelte +102 -0
- package/dist/components/ui/Card.svelte.d.ts +46 -0
- package/dist/components/ui/Dialog.svelte +91 -0
- package/dist/components/ui/Dialog.svelte.d.ts +43 -0
- package/dist/components/ui/Input.svelte +81 -0
- package/dist/components/ui/Input.svelte.d.ts +35 -0
- package/dist/components/ui/Select.svelte +69 -0
- package/dist/components/ui/Select.svelte.d.ts +36 -0
- package/dist/components/ui/Sheet.svelte +98 -0
- package/dist/components/ui/Sheet.svelte.d.ts +45 -0
- package/dist/components/ui/Skeleton.svelte +31 -0
- package/dist/components/ui/Skeleton.svelte.d.ts +26 -0
- package/dist/components/ui/Table.svelte +59 -0
- package/dist/components/ui/Table.svelte.d.ts +44 -0
- package/dist/components/ui/Tabs.svelte +76 -0
- package/dist/components/ui/Tabs.svelte.d.ts +41 -0
- package/dist/components/ui/Textarea.svelte +81 -0
- package/dist/components/ui/Textarea.svelte.d.ts +35 -0
- package/dist/components/ui/Toast.svelte +18 -0
- package/dist/components/ui/Toast.svelte.d.ts +7 -0
- package/dist/components/ui/accordion/accordion-content.svelte +24 -0
- package/dist/components/ui/accordion/accordion-content.svelte.d.ts +4 -0
- package/dist/components/ui/accordion/accordion-item.svelte +12 -0
- package/dist/components/ui/accordion/accordion-item.svelte.d.ts +4 -0
- package/dist/components/ui/accordion/accordion-trigger.svelte +29 -0
- package/dist/components/ui/accordion/accordion-trigger.svelte.d.ts +7 -0
- package/dist/components/ui/accordion/index.d.ts +6 -0
- package/dist/components/ui/accordion/index.js +8 -0
- package/dist/components/ui/badge/badge.svelte +50 -0
- package/dist/components/ui/badge/badge.svelte.d.ts +60 -0
- package/dist/components/ui/badge/index.d.ts +2 -0
- package/dist/components/ui/badge/index.js +2 -0
- package/dist/components/ui/button/button.svelte +82 -0
- package/dist/components/ui/button/button.svelte.d.ts +132 -0
- package/dist/components/ui/button/index.d.ts +2 -0
- package/dist/components/ui/button/index.js +4 -0
- package/dist/components/ui/card/card-content.svelte +16 -0
- package/dist/components/ui/card/card-content.svelte.d.ts +5 -0
- package/dist/components/ui/card/card-description.svelte +16 -0
- package/dist/components/ui/card/card-description.svelte.d.ts +5 -0
- package/dist/components/ui/card/card-footer.svelte +16 -0
- package/dist/components/ui/card/card-footer.svelte.d.ts +5 -0
- package/dist/components/ui/card/card-header.svelte +16 -0
- package/dist/components/ui/card/card-header.svelte.d.ts +5 -0
- package/dist/components/ui/card/card-title.svelte +25 -0
- package/dist/components/ui/card/card-title.svelte.d.ts +8 -0
- package/dist/components/ui/card/card.svelte +20 -0
- package/dist/components/ui/card/card.svelte.d.ts +5 -0
- package/dist/components/ui/card/index.d.ts +7 -0
- package/dist/components/ui/card/index.js +9 -0
- package/dist/components/ui/dialog/dialog-content.svelte +38 -0
- package/dist/components/ui/dialog/dialog-content.svelte.d.ts +9 -0
- package/dist/components/ui/dialog/dialog-description.svelte +16 -0
- package/dist/components/ui/dialog/dialog-description.svelte.d.ts +4 -0
- package/dist/components/ui/dialog/dialog-footer.svelte +20 -0
- package/dist/components/ui/dialog/dialog-footer.svelte.d.ts +5 -0
- package/dist/components/ui/dialog/dialog-header.svelte +20 -0
- package/dist/components/ui/dialog/dialog-header.svelte.d.ts +5 -0
- package/dist/components/ui/dialog/dialog-overlay.svelte +19 -0
- package/dist/components/ui/dialog/dialog-overlay.svelte.d.ts +4 -0
- package/dist/components/ui/dialog/dialog-title.svelte +16 -0
- package/dist/components/ui/dialog/dialog-title.svelte.d.ts +4 -0
- package/dist/components/ui/dialog/index.d.ts +12 -0
- package/dist/components/ui/dialog/index.js +14 -0
- package/dist/components/ui/index.d.ts +26 -0
- package/dist/components/ui/index.js +29 -0
- package/dist/components/ui/input/index.d.ts +2 -0
- package/dist/components/ui/input/index.js +4 -0
- package/dist/components/ui/input/input.svelte +46 -0
- package/dist/components/ui/input/input.svelte.d.ts +13 -0
- package/dist/components/ui/select/index.d.ts +11 -0
- package/dist/components/ui/select/index.js +13 -0
- package/dist/components/ui/select/select-content.svelte +39 -0
- package/dist/components/ui/select/select-content.svelte.d.ts +7 -0
- package/dist/components/ui/select/select-group-heading.svelte +16 -0
- package/dist/components/ui/select/select-group-heading.svelte.d.ts +4 -0
- package/dist/components/ui/select/select-item.svelte +37 -0
- package/dist/components/ui/select/select-item.svelte.d.ts +4 -0
- package/dist/components/ui/select/select-scroll-down-button.svelte +19 -0
- package/dist/components/ui/select/select-scroll-down-button.svelte.d.ts +4 -0
- package/dist/components/ui/select/select-scroll-up-button.svelte +19 -0
- package/dist/components/ui/select/select-scroll-up-button.svelte.d.ts +4 -0
- package/dist/components/ui/select/select-separator.svelte +13 -0
- package/dist/components/ui/select/select-separator.svelte.d.ts +4 -0
- package/dist/components/ui/select/select-trigger.svelte +24 -0
- package/dist/components/ui/select/select-trigger.svelte.d.ts +4 -0
- package/dist/components/ui/separator/index.d.ts +2 -0
- package/dist/components/ui/separator/index.js +4 -0
- package/dist/components/ui/separator/separator.svelte +22 -0
- package/dist/components/ui/separator/separator.svelte.d.ts +4 -0
- package/dist/components/ui/sheet/index.d.ts +12 -0
- package/dist/components/ui/sheet/index.js +14 -0
- package/dist/components/ui/sheet/sheet-content.svelte +53 -0
- package/dist/components/ui/sheet/sheet-content.svelte.d.ts +62 -0
- package/dist/components/ui/sheet/sheet-description.svelte +16 -0
- package/dist/components/ui/sheet/sheet-description.svelte.d.ts +4 -0
- package/dist/components/ui/sheet/sheet-footer.svelte +20 -0
- package/dist/components/ui/sheet/sheet-footer.svelte.d.ts +5 -0
- package/dist/components/ui/sheet/sheet-header.svelte +20 -0
- package/dist/components/ui/sheet/sheet-header.svelte.d.ts +5 -0
- package/dist/components/ui/sheet/sheet-overlay.svelte +21 -0
- package/dist/components/ui/sheet/sheet-overlay.svelte.d.ts +6 -0
- package/dist/components/ui/sheet/sheet-title.svelte +16 -0
- package/dist/components/ui/sheet/sheet-title.svelte.d.ts +4 -0
- package/dist/components/ui/skeleton/index.d.ts +2 -0
- package/dist/components/ui/skeleton/index.js +4 -0
- package/dist/components/ui/skeleton/skeleton.svelte +17 -0
- package/dist/components/ui/skeleton/skeleton.svelte.d.ts +5 -0
- package/dist/components/ui/table/index.d.ts +9 -0
- package/dist/components/ui/table/index.js +11 -0
- package/dist/components/ui/table/table-body.svelte +16 -0
- package/dist/components/ui/table/table-body.svelte.d.ts +5 -0
- package/dist/components/ui/table/table-caption.svelte +16 -0
- package/dist/components/ui/table/table-caption.svelte.d.ts +5 -0
- package/dist/components/ui/table/table-cell.svelte +20 -0
- package/dist/components/ui/table/table-cell.svelte.d.ts +5 -0
- package/dist/components/ui/table/table-footer.svelte +16 -0
- package/dist/components/ui/table/table-footer.svelte.d.ts +5 -0
- package/dist/components/ui/table/table-head.svelte +23 -0
- package/dist/components/ui/table/table-head.svelte.d.ts +5 -0
- package/dist/components/ui/table/table-header.svelte +16 -0
- package/dist/components/ui/table/table-header.svelte.d.ts +5 -0
- package/dist/components/ui/table/table-row.svelte +23 -0
- package/dist/components/ui/table/table-row.svelte.d.ts +5 -0
- package/dist/components/ui/table/table.svelte +18 -0
- package/dist/components/ui/table/table.svelte.d.ts +5 -0
- package/dist/components/ui/tabs/index.d.ts +6 -0
- package/dist/components/ui/tabs/index.js +8 -0
- package/dist/components/ui/tabs/tabs-content.svelte +19 -0
- package/dist/components/ui/tabs/tabs-content.svelte.d.ts +4 -0
- package/dist/components/ui/tabs/tabs-list.svelte +19 -0
- package/dist/components/ui/tabs/tabs-list.svelte.d.ts +4 -0
- package/dist/components/ui/tabs/tabs-trigger.svelte +19 -0
- package/dist/components/ui/tabs/tabs-trigger.svelte.d.ts +4 -0
- package/dist/components/ui/textarea/index.d.ts +2 -0
- package/dist/components/ui/textarea/index.js +4 -0
- package/dist/components/ui/textarea/textarea.svelte +24 -0
- package/dist/components/ui/textarea/textarea.svelte.d.ts +6 -0
- package/dist/components/ui/toast.d.ts +86 -0
- package/dist/components/ui/toast.js +99 -0
- package/dist/db/schema.sql +238 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +20 -0
- package/dist/payments/index.d.ts +33 -0
- package/dist/payments/index.js +47 -0
- package/dist/payments/shop.d.ts +165 -0
- package/dist/payments/shop.js +588 -0
- package/dist/payments/stripe/client.d.ts +231 -0
- package/dist/payments/stripe/client.js +198 -0
- package/dist/payments/stripe/index.d.ts +18 -0
- package/dist/payments/stripe/index.js +17 -0
- package/dist/payments/stripe/provider.d.ts +50 -0
- package/dist/payments/stripe/provider.js +530 -0
- package/dist/payments/types.d.ts +355 -0
- package/dist/payments/types.js +7 -0
- package/dist/server/logger.d.ts +53 -0
- package/dist/server/logger.js +252 -0
- package/dist/styles/content.css +514 -0
- package/dist/styles/tokens.css +175 -0
- package/dist/utils/api.d.ts +20 -0
- package/dist/utils/api.js +109 -0
- package/dist/utils/cn.d.ts +15 -0
- package/dist/utils/cn.js +18 -0
- package/dist/utils/csrf.d.ts +22 -0
- package/dist/utils/csrf.js +72 -0
- package/dist/utils/debounce.d.ts +7 -0
- package/dist/utils/debounce.js +14 -0
- package/dist/utils/gallery.d.ts +66 -0
- package/dist/utils/gallery.js +181 -0
- package/dist/utils/gutter.d.ts +54 -0
- package/dist/utils/gutter.js +169 -0
- package/dist/utils/imageProcessor.d.ts +58 -0
- package/dist/utils/imageProcessor.js +205 -0
- package/dist/utils/json.d.ts +17 -0
- package/dist/utils/json.js +26 -0
- package/dist/utils/markdown.d.ts +101 -0
- package/dist/utils/markdown.js +947 -0
- package/dist/utils/sanitize.d.ts +25 -0
- package/dist/utils/sanitize.js +127 -0
- package/dist/utils/validation.d.ts +46 -0
- package/dist/utils/validation.js +169 -0
- package/dist/utils.d.ts +5 -0
- package/dist/utils.js +5 -0
- 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);
|
package/dist/index.d.ts
ADDED
|
@@ -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 {};
|