@twango/twiki 0.0.0-stage → 0.1.1

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 (225) hide show
  1. package/.github/actions/product-cache/action.yml +32 -0
  2. package/.github/actions/product-cache/index.mjs +450 -0
  3. package/LICENSE +21 -0
  4. package/README.md +146 -2
  5. package/bun.lock +1701 -0
  6. package/cli/runtime.test.ts +420 -0
  7. package/cli/runtime.ts +385 -0
  8. package/cli/twiki.ts +305 -0
  9. package/package.json +138 -4
  10. package/site/_headers +7 -0
  11. package/site/assets/fonts/OFL.txt +93 -0
  12. package/site/assets/fonts/OverusedGrotesk-SemiBold.ttf +0 -0
  13. package/site/assets/social-background.svg +38 -0
  14. package/site/bun.lock +1701 -0
  15. package/site/database/index.ts +7 -0
  16. package/site/database/schema.ts +95 -0
  17. package/site/drizzle.config.ts +7 -0
  18. package/site/migrations/0001_auth.sql +14 -0
  19. package/site/migrations/0002_site_access.sql +5 -0
  20. package/site/migrations/0003_github_username.sql +1 -0
  21. package/site/migrations/meta/0002_snapshot.json +432 -0
  22. package/site/migrations/meta/0003_snapshot.json +439 -0
  23. package/site/migrations/meta/_journal.json +27 -0
  24. package/site/package.json +120 -0
  25. package/site/src/app.d.ts +14 -0
  26. package/site/src/app.html +11 -0
  27. package/site/src/hooks.server.ts +12 -0
  28. package/site/src/lib/analytics-config.json +1 -0
  29. package/site/src/lib/analytics.ts +40 -0
  30. package/site/src/lib/auth-config.json +3 -0
  31. package/site/src/lib/components/SEO.svelte +113 -0
  32. package/site/src/lib/components/doc/AccessLink.svelte +27 -0
  33. package/site/src/lib/components/doc/Backlinks.svelte +59 -0
  34. package/site/src/lib/components/doc/Breadcrumbs.svelte +29 -0
  35. package/site/src/lib/components/doc/ContentMeta.svelte +61 -0
  36. package/site/src/lib/components/doc/DocPager.svelte +91 -0
  37. package/site/src/lib/components/doc/DocShell.svelte +115 -0
  38. package/site/src/lib/components/doc/LicenseNotice.svelte +26 -0
  39. package/site/src/lib/components/doc/LockedContent.svelte +29 -0
  40. package/site/src/lib/components/doc/NavTree.svelte +158 -0
  41. package/site/src/lib/components/doc/NoteActions.svelte +139 -0
  42. package/site/src/lib/components/doc/PublicationBadge.svelte +49 -0
  43. package/site/src/lib/components/doc/ReaderModeToggle.svelte +19 -0
  44. package/site/src/lib/components/doc/Sidebar.svelte +351 -0
  45. package/site/src/lib/components/doc/Toc.svelte +339 -0
  46. package/site/src/lib/components/doc/enhancements.ts +146 -0
  47. package/site/src/lib/components/doc/heading-tracker.svelte.ts +39 -0
  48. package/site/src/lib/components/doc/image-preview.ts +114 -0
  49. package/site/src/lib/components/doc/reader-mode.svelte.ts +40 -0
  50. package/site/src/lib/components/embeds/mermaid.ts +353 -0
  51. package/site/src/lib/components/files/FileCode.svelte +81 -0
  52. package/site/src/lib/components/files/FileExplorer.svelte +74 -0
  53. package/site/src/lib/components/files/FileHistory.svelte +170 -0
  54. package/site/src/lib/components/files/FileIcon.svelte +28 -0
  55. package/site/src/lib/components/files/FileRmd.svelte +209 -0
  56. package/site/src/lib/components/files/FileTabs.svelte +180 -0
  57. package/site/src/lib/components/files/FileTree.svelte +67 -0
  58. package/site/src/lib/components/files/blame-gutter.ts +45 -0
  59. package/site/src/lib/components/files/code-view.ts +98 -0
  60. package/site/src/lib/components/files/file-workspace.svelte.ts +100 -0
  61. package/site/src/lib/components/graph/GraphPanel.svelte +275 -0
  62. package/site/src/lib/components/graph/GraphView.svelte +100 -0
  63. package/site/src/lib/components/graph/graph-data.ts +137 -0
  64. package/site/src/lib/components/graph/graph-model.ts +103 -0
  65. package/site/src/lib/components/graph/index.ts +3 -0
  66. package/site/src/lib/components/graph/render-graph.ts +626 -0
  67. package/site/src/lib/components/popover/index.ts +1 -0
  68. package/site/src/lib/components/popover/link-popovers.ts +233 -0
  69. package/site/src/lib/components/popover/popover.css +82 -0
  70. package/site/src/lib/components/search/SearchButton.svelte +57 -0
  71. package/site/src/lib/components/search/SearchPalette.svelte +189 -0
  72. package/site/src/lib/components/search/index.ts +3 -0
  73. package/site/src/lib/components/search/pagefind-client.svelte.ts +129 -0
  74. package/site/src/lib/components/search/pagefind-query.ts +22 -0
  75. package/site/src/lib/components/search/pagefind-url.ts +12 -0
  76. package/site/src/lib/components/search/search-state.svelte.ts +22 -0
  77. package/site/src/lib/components/ui/IconButton.svelte +30 -0
  78. package/site/src/lib/components/ui/ThemeToggle.svelte +22 -0
  79. package/site/src/lib/components/ui/index.ts +1 -0
  80. package/site/src/lib/config.ts +9 -0
  81. package/site/src/lib/content-license.ts +7 -0
  82. package/site/src/lib/file-history.ts +37 -0
  83. package/site/src/lib/file-icons.ts +27 -0
  84. package/site/src/lib/file-tabs.ts +72 -0
  85. package/site/src/lib/files.ts +73 -0
  86. package/site/src/lib/github-user.ts +70 -0
  87. package/site/src/lib/metadata.ts +166 -0
  88. package/site/src/lib/notebook-nav.ts +63 -0
  89. package/site/src/lib/publication.ts +1 -0
  90. package/site/src/lib/rmd.ts +156 -0
  91. package/site/src/lib/server/access-admin.ts +33 -0
  92. package/site/src/lib/server/content-model.ts +253 -0
  93. package/site/src/lib/server/content-provider.ts +266 -0
  94. package/site/src/lib/server/content.ts +277 -0
  95. package/site/src/lib/server/runtime-content.ts +34 -0
  96. package/site/src/lib/site-config.json +9 -0
  97. package/site/src/lib/social-image.ts +13 -0
  98. package/site/src/lib/styles/article.css +607 -0
  99. package/site/src/lib/styles/foundation.css +138 -0
  100. package/site/src/lib/styles/print.css +115 -0
  101. package/site/src/lib/styles/shell.css +182 -0
  102. package/site/src/lib/text-exports.ts +5 -0
  103. package/site/src/lib/types.ts +140 -0
  104. package/site/src/lib/utils.ts +6 -0
  105. package/site/src/routes/+error.svelte +16 -0
  106. package/site/src/routes/+layout.server.ts +10 -0
  107. package/site/src/routes/+layout.svelte +72 -0
  108. package/site/src/routes/+layout.ts +3 -0
  109. package/site/src/routes/404/+page.svelte +13 -0
  110. package/site/src/routes/[...slug]/+page.server.ts +24 -0
  111. package/site/src/routes/[...slug]/+page.svelte +180 -0
  112. package/site/src/routes/[course]/files/[...file]/+page.svelte +373 -0
  113. package/site/src/routes/[course]/files/[...file]/+page.ts +38 -0
  114. package/site/src/routes/admin/access/+page.server.ts +53 -0
  115. package/site/src/routes/admin/access/+page.svelte +118 -0
  116. package/site/src/routes/graph.json/+server.ts +7 -0
  117. package/site/src/routes/index.xml/+server.ts +7 -0
  118. package/site/src/routes/layout.css +10 -0
  119. package/site/src/routes/robots.txt/+server.ts +9 -0
  120. package/site/src/routes/sitemap.xml/+server.ts +7 -0
  121. package/site/src/routes/tags/+page.server.ts +5 -0
  122. package/site/src/routes/tags/+page.svelte +38 -0
  123. package/site/src/routes/tags/[...tag]/+page.server.ts +22 -0
  124. package/site/src/routes/tags/[...tag]/+page.svelte +52 -0
  125. package/site/static/favicon.png +0 -0
  126. package/site/static/fonts/JetBrainsMono-Italic-VF.woff2 +0 -0
  127. package/site/static/fonts/JetBrainsMono-VF.woff2 +0 -0
  128. package/site/static/fonts/OverusedGrotesk-VF.woff2 +0 -0
  129. package/site/static/fonts/OverusedGroteskItalic-VF.woff2 +0 -0
  130. package/site/static/fonts/Virgil.woff2 +0 -0
  131. package/site/svelte.config.js +71 -0
  132. package/site/tooling/LICENSE-quartz +25 -0
  133. package/site/tooling/adapter.js +55 -0
  134. package/site/tooling/assets.ts +323 -0
  135. package/site/tooling/benchmark.ts +191 -0
  136. package/site/tooling/build.ts +407 -0
  137. package/site/tooling/cache.ts +133 -0
  138. package/site/tooling/check-diagrams.ts +164 -0
  139. package/site/tooling/check-links.ts +86 -0
  140. package/site/tooling/check-targets.ts +139 -0
  141. package/site/tooling/compiler.ts +1386 -0
  142. package/site/tooling/deploy.ts +112 -0
  143. package/site/tooling/fingerprint.ts +81 -0
  144. package/site/tooling/lib/app-version.js +92 -0
  145. package/site/tooling/lib/application-asset-urls.ts +27 -0
  146. package/site/tooling/lib/application-cache.ts +269 -0
  147. package/site/tooling/lib/asset-hash-cache.ts +116 -0
  148. package/site/tooling/lib/autotag.ts +99 -0
  149. package/site/tooling/lib/build-assembly.ts +148 -0
  150. package/site/tooling/lib/build-workspace.ts +386 -0
  151. package/site/tooling/lib/cache-selection.ts +70 -0
  152. package/site/tooling/lib/cloudflare-prewarm.js +40 -0
  153. package/site/tooling/lib/comments.ts +32 -0
  154. package/site/tooling/lib/content-cache.ts +244 -0
  155. package/site/tooling/lib/content-urls.ts +50 -0
  156. package/site/tooling/lib/course-cache.ts +298 -0
  157. package/site/tooling/lib/course-files.ts +281 -0
  158. package/site/tooling/lib/currency.ts +33 -0
  159. package/site/tooling/lib/deployment-config.ts +222 -0
  160. package/site/tooling/lib/deployment-manifest.ts +274 -0
  161. package/site/tooling/lib/deployment-prepare.ts +325 -0
  162. package/site/tooling/lib/deployment-upload.ts +293 -0
  163. package/site/tooling/lib/dev-git-state.ts +130 -0
  164. package/site/tooling/lib/dev-history.ts +86 -0
  165. package/site/tooling/lib/dev-social-images.ts +38 -0
  166. package/site/tooling/lib/dev-state.ts +107 -0
  167. package/site/tooling/lib/edition-builds.ts +184 -0
  168. package/site/tooling/lib/edition-paths.js +29 -0
  169. package/site/tooling/lib/empty-tag-route.js +23 -0
  170. package/site/tooling/lib/file-history.ts +201 -0
  171. package/site/tooling/lib/file-icons.ts +93 -0
  172. package/site/tooling/lib/file-policy.ts +38 -0
  173. package/site/tooling/lib/file-search.js +13 -0
  174. package/site/tooling/lib/git-revisions.ts +41 -0
  175. package/site/tooling/lib/history-pool.ts +74 -0
  176. package/site/tooling/lib/history-worker.ts +22 -0
  177. package/site/tooling/lib/knit-rmd.R +38 -0
  178. package/site/tooling/lib/lastmod.ts +201 -0
  179. package/site/tooling/lib/markdown-files.ts +51 -0
  180. package/site/tooling/lib/ofm.ts +634 -0
  181. package/site/tooling/lib/output.ts +60 -0
  182. package/site/tooling/lib/product-cache.ts +1006 -0
  183. package/site/tooling/lib/project-config.ts +288 -0
  184. package/site/tooling/lib/public-assets.ts +38 -0
  185. package/site/tooling/lib/public-links.ts +56 -0
  186. package/site/tooling/lib/publishing.ts +156 -0
  187. package/site/tooling/lib/r-runtime.ts +257 -0
  188. package/site/tooling/lib/rebuild-queue.ts +25 -0
  189. package/site/tooling/lib/rmd-preflight.ts +166 -0
  190. package/site/tooling/lib/rmd-preview-cache.ts +93 -0
  191. package/site/tooling/lib/rmd-previews.ts +129 -0
  192. package/site/tooling/lib/runtime-data-modules.ts +30 -0
  193. package/site/tooling/lib/runtime-packaging.ts +321 -0
  194. package/site/tooling/lib/search-cache.js +165 -0
  195. package/site/tooling/lib/search-inputs.js +129 -0
  196. package/site/tooling/lib/slug.ts +377 -0
  197. package/site/tooling/lib/social-images.ts +210 -0
  198. package/site/tooling/lib/text-exports.ts +51 -0
  199. package/site/tooling/lib/visit-elements.ts +17 -0
  200. package/site/tooling/live-test.ts +138 -0
  201. package/site/tooling/pipeline.ts +103 -0
  202. package/site/tooling/prepare.ts +3 -0
  203. package/site/tooling/publish.ts +28 -0
  204. package/site/tooling/r-cache.ts +45 -0
  205. package/site/tooling/r-render-profile.json +7 -0
  206. package/site/tooling/search.js +94 -0
  207. package/site/tooling/verify-deployment.ts +109 -0
  208. package/site/tooling/vite-content.ts +240 -0
  209. package/site/tooling/wrangler-paths.js +25 -0
  210. package/site/tooling/wrangler.ts +19 -0
  211. package/site/tsconfig.json +16 -0
  212. package/site/vite.config.ts +40 -0
  213. package/site/worker/access.ts +57 -0
  214. package/site/worker/analytics.ts +100 -0
  215. package/site/worker/auth-routes.ts +78 -0
  216. package/site/worker/auth.ts +78 -0
  217. package/site/worker/content-runtime.ts +226 -0
  218. package/site/worker/framing.ts +4 -0
  219. package/site/worker/gate.ts +147 -0
  220. package/site/worker/index.ts +9 -0
  221. package/site/worker/login.ts +62 -0
  222. package/site/worker/publication.ts +44 -0
  223. package/site/worker/runtime.ts +104 -0
  224. package/site/worker/tsconfig.json +13 -0
  225. package/site/wrangler.jsonc +37 -0
@@ -0,0 +1,439 @@
1
+ {
2
+ "version": "6",
3
+ "dialect": "sqlite",
4
+ "id": "985badad-7bbe-45f1-bae2-4e331b9a1e2b",
5
+ "prevId": "73e8066d-0361-4459-b8da-1be8f9b1c6de",
6
+ "tables": {
7
+ "account": {
8
+ "name": "account",
9
+ "columns": {
10
+ "id": {
11
+ "name": "id",
12
+ "type": "text",
13
+ "primaryKey": true,
14
+ "notNull": true,
15
+ "autoincrement": false
16
+ },
17
+ "issuer": {
18
+ "name": "issuer",
19
+ "type": "text",
20
+ "primaryKey": false,
21
+ "notNull": true,
22
+ "autoincrement": false
23
+ },
24
+ "accountId": {
25
+ "name": "accountId",
26
+ "type": "text",
27
+ "primaryKey": false,
28
+ "notNull": true,
29
+ "autoincrement": false
30
+ },
31
+ "providerId": {
32
+ "name": "providerId",
33
+ "type": "text",
34
+ "primaryKey": false,
35
+ "notNull": true,
36
+ "autoincrement": false
37
+ },
38
+ "userId": {
39
+ "name": "userId",
40
+ "type": "text",
41
+ "primaryKey": false,
42
+ "notNull": true,
43
+ "autoincrement": false
44
+ },
45
+ "accessToken": {
46
+ "name": "accessToken",
47
+ "type": "text",
48
+ "primaryKey": false,
49
+ "notNull": false,
50
+ "autoincrement": false
51
+ },
52
+ "refreshToken": {
53
+ "name": "refreshToken",
54
+ "type": "text",
55
+ "primaryKey": false,
56
+ "notNull": false,
57
+ "autoincrement": false
58
+ },
59
+ "idToken": {
60
+ "name": "idToken",
61
+ "type": "text",
62
+ "primaryKey": false,
63
+ "notNull": false,
64
+ "autoincrement": false
65
+ },
66
+ "accessTokenExpiresAt": {
67
+ "name": "accessTokenExpiresAt",
68
+ "type": "date",
69
+ "primaryKey": false,
70
+ "notNull": false,
71
+ "autoincrement": false
72
+ },
73
+ "refreshTokenExpiresAt": {
74
+ "name": "refreshTokenExpiresAt",
75
+ "type": "date",
76
+ "primaryKey": false,
77
+ "notNull": false,
78
+ "autoincrement": false
79
+ },
80
+ "scope": {
81
+ "name": "scope",
82
+ "type": "text",
83
+ "primaryKey": false,
84
+ "notNull": false,
85
+ "autoincrement": false
86
+ },
87
+ "password": {
88
+ "name": "password",
89
+ "type": "text",
90
+ "primaryKey": false,
91
+ "notNull": false,
92
+ "autoincrement": false
93
+ },
94
+ "createdAt": {
95
+ "name": "createdAt",
96
+ "type": "date",
97
+ "primaryKey": false,
98
+ "notNull": true,
99
+ "autoincrement": false
100
+ },
101
+ "updatedAt": {
102
+ "name": "updatedAt",
103
+ "type": "date",
104
+ "primaryKey": false,
105
+ "notNull": true,
106
+ "autoincrement": false
107
+ }
108
+ },
109
+ "indexes": {
110
+ "account_userId_idx": {
111
+ "name": "account_userId_idx",
112
+ "columns": ["userId"],
113
+ "isUnique": false
114
+ },
115
+ "account_issuer_accountId_uidx": {
116
+ "name": "account_issuer_accountId_uidx",
117
+ "columns": ["issuer", "accountId"],
118
+ "isUnique": true
119
+ }
120
+ },
121
+ "foreignKeys": {
122
+ "account_userId_user_id_fk": {
123
+ "name": "account_userId_user_id_fk",
124
+ "tableFrom": "account",
125
+ "tableTo": "user",
126
+ "columnsFrom": ["userId"],
127
+ "columnsTo": ["id"],
128
+ "onDelete": "cascade",
129
+ "onUpdate": "no action"
130
+ }
131
+ },
132
+ "compositePrimaryKeys": {},
133
+ "uniqueConstraints": {},
134
+ "checkConstraints": {}
135
+ },
136
+ "rateLimit": {
137
+ "name": "rateLimit",
138
+ "columns": {
139
+ "id": {
140
+ "name": "id",
141
+ "type": "text",
142
+ "primaryKey": true,
143
+ "notNull": true,
144
+ "autoincrement": false
145
+ },
146
+ "key": {
147
+ "name": "key",
148
+ "type": "text",
149
+ "primaryKey": false,
150
+ "notNull": true,
151
+ "autoincrement": false
152
+ },
153
+ "count": {
154
+ "name": "count",
155
+ "type": "integer",
156
+ "primaryKey": false,
157
+ "notNull": true,
158
+ "autoincrement": false
159
+ },
160
+ "lastRequest": {
161
+ "name": "lastRequest",
162
+ "type": "bigint",
163
+ "primaryKey": false,
164
+ "notNull": true,
165
+ "autoincrement": false
166
+ }
167
+ },
168
+ "indexes": {
169
+ "rateLimit_key_unique": {
170
+ "name": "rateLimit_key_unique",
171
+ "columns": ["key"],
172
+ "isUnique": true
173
+ }
174
+ },
175
+ "foreignKeys": {},
176
+ "compositePrimaryKeys": {},
177
+ "uniqueConstraints": {},
178
+ "checkConstraints": {}
179
+ },
180
+ "session": {
181
+ "name": "session",
182
+ "columns": {
183
+ "id": {
184
+ "name": "id",
185
+ "type": "text",
186
+ "primaryKey": true,
187
+ "notNull": true,
188
+ "autoincrement": false
189
+ },
190
+ "expiresAt": {
191
+ "name": "expiresAt",
192
+ "type": "date",
193
+ "primaryKey": false,
194
+ "notNull": true,
195
+ "autoincrement": false
196
+ },
197
+ "token": {
198
+ "name": "token",
199
+ "type": "text",
200
+ "primaryKey": false,
201
+ "notNull": true,
202
+ "autoincrement": false
203
+ },
204
+ "createdAt": {
205
+ "name": "createdAt",
206
+ "type": "date",
207
+ "primaryKey": false,
208
+ "notNull": true,
209
+ "autoincrement": false
210
+ },
211
+ "updatedAt": {
212
+ "name": "updatedAt",
213
+ "type": "date",
214
+ "primaryKey": false,
215
+ "notNull": true,
216
+ "autoincrement": false
217
+ },
218
+ "ipAddress": {
219
+ "name": "ipAddress",
220
+ "type": "text",
221
+ "primaryKey": false,
222
+ "notNull": false,
223
+ "autoincrement": false
224
+ },
225
+ "userAgent": {
226
+ "name": "userAgent",
227
+ "type": "text",
228
+ "primaryKey": false,
229
+ "notNull": false,
230
+ "autoincrement": false
231
+ },
232
+ "userId": {
233
+ "name": "userId",
234
+ "type": "text",
235
+ "primaryKey": false,
236
+ "notNull": true,
237
+ "autoincrement": false
238
+ }
239
+ },
240
+ "indexes": {
241
+ "session_token_unique": {
242
+ "name": "session_token_unique",
243
+ "columns": ["token"],
244
+ "isUnique": true
245
+ },
246
+ "session_userId_idx": {
247
+ "name": "session_userId_idx",
248
+ "columns": ["userId"],
249
+ "isUnique": false
250
+ }
251
+ },
252
+ "foreignKeys": {
253
+ "session_userId_user_id_fk": {
254
+ "name": "session_userId_user_id_fk",
255
+ "tableFrom": "session",
256
+ "tableTo": "user",
257
+ "columnsFrom": ["userId"],
258
+ "columnsTo": ["id"],
259
+ "onDelete": "cascade",
260
+ "onUpdate": "no action"
261
+ }
262
+ },
263
+ "compositePrimaryKeys": {},
264
+ "uniqueConstraints": {},
265
+ "checkConstraints": {}
266
+ },
267
+ "siteAccess": {
268
+ "name": "siteAccess",
269
+ "columns": {
270
+ "githubId": {
271
+ "name": "githubId",
272
+ "type": "text",
273
+ "primaryKey": true,
274
+ "notNull": true,
275
+ "autoincrement": false
276
+ },
277
+ "githubLogin": {
278
+ "name": "githubLogin",
279
+ "type": "text",
280
+ "primaryKey": false,
281
+ "notNull": true,
282
+ "autoincrement": false
283
+ },
284
+ "createdAt": {
285
+ "name": "createdAt",
286
+ "type": "integer",
287
+ "primaryKey": false,
288
+ "notNull": true,
289
+ "autoincrement": false
290
+ }
291
+ },
292
+ "indexes": {},
293
+ "foreignKeys": {},
294
+ "compositePrimaryKeys": {},
295
+ "uniqueConstraints": {},
296
+ "checkConstraints": {}
297
+ },
298
+ "user": {
299
+ "name": "user",
300
+ "columns": {
301
+ "id": {
302
+ "name": "id",
303
+ "type": "text",
304
+ "primaryKey": true,
305
+ "notNull": true,
306
+ "autoincrement": false
307
+ },
308
+ "name": {
309
+ "name": "name",
310
+ "type": "text",
311
+ "primaryKey": false,
312
+ "notNull": true,
313
+ "autoincrement": false
314
+ },
315
+ "githubUsername": {
316
+ "name": "githubUsername",
317
+ "type": "text",
318
+ "primaryKey": false,
319
+ "notNull": false,
320
+ "autoincrement": false
321
+ },
322
+ "email": {
323
+ "name": "email",
324
+ "type": "text",
325
+ "primaryKey": false,
326
+ "notNull": true,
327
+ "autoincrement": false
328
+ },
329
+ "emailVerified": {
330
+ "name": "emailVerified",
331
+ "type": "integer",
332
+ "primaryKey": false,
333
+ "notNull": true,
334
+ "autoincrement": false
335
+ },
336
+ "image": {
337
+ "name": "image",
338
+ "type": "text",
339
+ "primaryKey": false,
340
+ "notNull": false,
341
+ "autoincrement": false
342
+ },
343
+ "createdAt": {
344
+ "name": "createdAt",
345
+ "type": "date",
346
+ "primaryKey": false,
347
+ "notNull": true,
348
+ "autoincrement": false
349
+ },
350
+ "updatedAt": {
351
+ "name": "updatedAt",
352
+ "type": "date",
353
+ "primaryKey": false,
354
+ "notNull": true,
355
+ "autoincrement": false
356
+ }
357
+ },
358
+ "indexes": {
359
+ "user_email_unique": {
360
+ "name": "user_email_unique",
361
+ "columns": ["email"],
362
+ "isUnique": true
363
+ }
364
+ },
365
+ "foreignKeys": {},
366
+ "compositePrimaryKeys": {},
367
+ "uniqueConstraints": {},
368
+ "checkConstraints": {}
369
+ },
370
+ "verification": {
371
+ "name": "verification",
372
+ "columns": {
373
+ "id": {
374
+ "name": "id",
375
+ "type": "text",
376
+ "primaryKey": true,
377
+ "notNull": true,
378
+ "autoincrement": false
379
+ },
380
+ "identifier": {
381
+ "name": "identifier",
382
+ "type": "text",
383
+ "primaryKey": false,
384
+ "notNull": true,
385
+ "autoincrement": false
386
+ },
387
+ "value": {
388
+ "name": "value",
389
+ "type": "text",
390
+ "primaryKey": false,
391
+ "notNull": true,
392
+ "autoincrement": false
393
+ },
394
+ "expiresAt": {
395
+ "name": "expiresAt",
396
+ "type": "date",
397
+ "primaryKey": false,
398
+ "notNull": true,
399
+ "autoincrement": false
400
+ },
401
+ "createdAt": {
402
+ "name": "createdAt",
403
+ "type": "date",
404
+ "primaryKey": false,
405
+ "notNull": true,
406
+ "autoincrement": false
407
+ },
408
+ "updatedAt": {
409
+ "name": "updatedAt",
410
+ "type": "date",
411
+ "primaryKey": false,
412
+ "notNull": true,
413
+ "autoincrement": false
414
+ }
415
+ },
416
+ "indexes": {
417
+ "verification_identifier_idx": {
418
+ "name": "verification_identifier_idx",
419
+ "columns": ["identifier"],
420
+ "isUnique": false
421
+ }
422
+ },
423
+ "foreignKeys": {},
424
+ "compositePrimaryKeys": {},
425
+ "uniqueConstraints": {},
426
+ "checkConstraints": {}
427
+ }
428
+ },
429
+ "views": {},
430
+ "enums": {},
431
+ "_meta": {
432
+ "schemas": {},
433
+ "tables": {},
434
+ "columns": {}
435
+ },
436
+ "internal": {
437
+ "indexes": {}
438
+ }
439
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "version": "7",
3
+ "dialect": "sqlite",
4
+ "entries": [
5
+ {
6
+ "idx": 1,
7
+ "version": "6",
8
+ "when": 1788573479000,
9
+ "tag": "0001_auth",
10
+ "breakpoints": true
11
+ },
12
+ {
13
+ "idx": 2,
14
+ "version": "6",
15
+ "when": 1788573479001,
16
+ "tag": "0002_site_access",
17
+ "breakpoints": true
18
+ },
19
+ {
20
+ "idx": 3,
21
+ "version": "6",
22
+ "when": 1790280010701,
23
+ "tag": "0003_github_username",
24
+ "breakpoints": true
25
+ }
26
+ ]
27
+ }
@@ -0,0 +1,120 @@
1
+ {
2
+ "name": "twiki-engine",
3
+ "private": true,
4
+ "version": "0.0.1",
5
+ "type": "module",
6
+ "scripts": {
7
+ "publish:check": "bun tooling/publish.ts",
8
+ "db:generate": "drizzle-kit generate",
9
+ "content:prepare": "bun tooling/prepare.ts",
10
+ "build:all": "bun tooling/build.ts",
11
+ "test": "bun test ./tests/unit",
12
+ "test:e2e": "playwright test",
13
+ "test:publishing": "bun tests/publication.ts",
14
+ "dev": "vite dev",
15
+ "dev:host": "vite dev --host",
16
+ "build": "vite build",
17
+ "preview": "bun tooling/wrangler.ts dev --persist-to build/.wrangler/state --port 4173",
18
+ "prepare": "WISCONSIN_SKIP_CONTENT=1 svelte-kit sync",
19
+ "check": "bun run --sequential --no-exit-on-error check:types check:links check:targets check:diagrams",
20
+ "check:types": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json && tsc -p worker/tsconfig.json",
21
+ "check:links": "bun tooling/check-links.ts",
22
+ "check:targets": "bun tooling/check-targets.ts",
23
+ "check:diagrams": "bun tooling/check-diagrams.ts",
24
+ "test:content": "bun tests/content-dev.ts",
25
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
26
+ "lint": "prettier --check .",
27
+ "format": "prettier --write .",
28
+ "build:app": "bun tooling/build.ts --app",
29
+ "build:content": "bun tooling/build.ts --content",
30
+ "build:static": "bun tooling/build.ts --static",
31
+ "deploy:incremental": "bun tooling/deploy.ts --upload"
32
+ },
33
+ "dependencies": {
34
+ "@actions/cache": "6.3.0",
35
+ "@better-auth/drizzle-adapter": "1.7.2",
36
+ "@cloudflare/workers-types": "5.20261006.1",
37
+ "@codemirror/commands": "6.11.0",
38
+ "@codemirror/language": "6.12.4",
39
+ "@codemirror/language-data": "6.5.2",
40
+ "@codemirror/search": "6.7.2",
41
+ "@codemirror/state": "6.7.4",
42
+ "@codemirror/view": "6.43.11",
43
+ "@floating-ui/dom": "1.7.6",
44
+ "@flowershow/remark-wiki-link": "3.4.0",
45
+ "@lucide/svelte": "1.17.0",
46
+ "@playwright/test": "1.61.1",
47
+ "@resvg/resvg-js": "2.6.2",
48
+ "@rybbit/js": "0.6.2",
49
+ "@sveltejs/adapter-cloudflare": "7.2.8",
50
+ "@sveltejs/kit": "2.70.2",
51
+ "@sveltejs/vite-plugin-svelte": "7.1.2",
52
+ "@tailwindcss/typography": "0.5.20",
53
+ "@tailwindcss/vite": "4.3.0",
54
+ "@tweenjs/tween.js": "25.0.0",
55
+ "@types/bun": "1.4.1",
56
+ "@types/d3-drag": "3.0.7",
57
+ "@types/d3-force": "3.0.10",
58
+ "@types/d3-selection": "3.0.11",
59
+ "@types/d3-zoom": "3.0.8",
60
+ "@types/hast": "3.0.4",
61
+ "@types/js-yaml": "4.0.9",
62
+ "@types/mdast": "4.0.4",
63
+ "@types/node": "25.9.3",
64
+ "better-auth": "1.7.2",
65
+ "bits-ui": "2.18.1",
66
+ "blake3-wasm": "2.1.5",
67
+ "clsx": "2.1.1",
68
+ "d3-drag": "3.0.0",
69
+ "d3-force": "3.0.0",
70
+ "d3-selection": "3.0.0",
71
+ "d3-zoom": "3.0.0",
72
+ "drizzle-kit": "0.31.10",
73
+ "drizzle-orm": "0.45.2",
74
+ "esrap": "2.2.11",
75
+ "github-slugger": "2.0.0",
76
+ "gray-matter": "4.0.3",
77
+ "hast-util-to-html": "9.0.5",
78
+ "hast-util-to-string": "3.0.1",
79
+ "ignore": "7.0.5",
80
+ "js-yaml": "3.15.2",
81
+ "katex": "0.18.2",
82
+ "material-icon-theme": "5.38.1",
83
+ "mdast-util-find-and-replace": "3.0.2",
84
+ "mdast-util-to-hast": "13.2.1",
85
+ "mdast-util-to-string": "4.0.0",
86
+ "mermaid": "11.16.1",
87
+ "mime": "4.0.7",
88
+ "miniflare": "5.20261006.1-alpha",
89
+ "mode-watcher": "1.1.0",
90
+ "pagefind": "1.5.2",
91
+ "photoswipe": "5.4.4",
92
+ "pixi.js": "8.19.0",
93
+ "prettier": "3.8.4",
94
+ "prettier-plugin-svelte": "4.1.0",
95
+ "prettier-plugin-tailwindcss": "0.8.0",
96
+ "rehype-katex": "7.0.1",
97
+ "rehype-raw": "7.0.0",
98
+ "rehype-slug": "6.0.0",
99
+ "remark-gfm": "4.0.1",
100
+ "remark-math": "6.0.0",
101
+ "remark-parse": "11.0.0",
102
+ "remark-rehype": "11.1.2",
103
+ "remark-smartypants": "3.0.2",
104
+ "rolldown": "1.0.3",
105
+ "satori": "0.33.4",
106
+ "shiki": "4.2.0",
107
+ "simple-icons": "16.29.0",
108
+ "svelte": "5.56.3",
109
+ "svelte-check": "4.6.0",
110
+ "tailwind-merge": "3.6.0",
111
+ "tailwindcss": "4.3.0",
112
+ "typescript": "6.0.3",
113
+ "unified": "11.0.5",
114
+ "unist-util-visit": "5.1.0",
115
+ "vite": "8.0.16",
116
+ "webr": "0.5.8",
117
+ "wrangler": "4.149.0",
118
+ "yaml": "2.9.0"
119
+ }
120
+ }
@@ -0,0 +1,14 @@
1
+ import type { AuthEnv } from '../worker/auth';
2
+
3
+ declare global {
4
+ namespace App {
5
+ interface Platform {
6
+ env: AuthEnv & {
7
+ WISCONSIN_CONTENT_CONTEXT?: import('./lib/server/content-provider').ContentContext;
8
+ ASSETS: { fetch(request: Request): Promise<Response> };
9
+ };
10
+ }
11
+ }
12
+ }
13
+
14
+ export {};
@@ -0,0 +1,11 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ %sveltekit.head%
7
+ </head>
8
+ <body data-sveltekit-preload-data="hover">
9
+ <div style="display: contents">%sveltekit.body%</div>
10
+ </body>
11
+ </html>
@@ -0,0 +1,12 @@
1
+ import type { Handle } from '@sveltejs/kit';
2
+
3
+ const fileBrowserNotice = '<noscript><p>Enable JavaScript to use the file browser.</p></noscript>';
4
+
5
+ export const handle: Handle = ({ event, resolve }) => {
6
+ if (event.route.id !== '/[course]/files/[...file]') return resolve(event);
7
+ // The file browser disables SSR for the whole component tree. Transform its
8
+ // actual HTML shell so the notice also exists before client startup.
9
+ return resolve(event, {
10
+ transformPageChunk: ({ html }) => html.replace('</body>', `${fileBrowserNotice}</body>`)
11
+ });
12
+ };
@@ -0,0 +1 @@
1
+ null
@@ -0,0 +1,40 @@
1
+ import rybbit from '@rybbit/js';
2
+ import { authEnabled } from './config';
3
+ import configuredAnalytics from './analytics-config.json';
4
+ const analytics = configuredAnalytics as { siteId: string; endpoint?: string } | null;
5
+
6
+ function hasOptedOut() {
7
+ if ((window as Window & { __RYBBIT_OPTOUT__?: boolean }).__RYBBIT_OPTOUT__) return true;
8
+ try {
9
+ return localStorage.getItem('disable-rybbit') !== null;
10
+ } catch {
11
+ return false;
12
+ }
13
+ }
14
+
15
+ export async function initializeAnalytics() {
16
+ // SDK 0.6.2 checks opt-out for events, but not identify requests.
17
+ if (!analytics || hasOptedOut()) return;
18
+
19
+ // Resolve the current login before init schedules its initial pageview.
20
+ let username: string | null = null;
21
+ try {
22
+ const response = authEnabled
23
+ ? await fetch('/api/access', {
24
+ cache: 'no-store',
25
+ signal: AbortSignal.timeout(5000)
26
+ })
27
+ : undefined;
28
+ if (response?.ok) {
29
+ const access = await response.json();
30
+ if (typeof access.githubUsername === 'string' && access.githubUsername.trim())
31
+ username = access.githubUsername;
32
+ }
33
+ } catch {
34
+ // Do not reuse a previous user's identity when the session cannot be checked.
35
+ }
36
+
37
+ await rybbit.init({ analyticsHost: '/api/analytics', siteId: analytics.siteId });
38
+ if (username) rybbit.identify(username);
39
+ else rybbit.clearUserId();
40
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "enabled": false
3
+ }