@caretcms/core 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 (249) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +191 -0
  3. package/dist/browser-runtime.d.ts +12 -0
  4. package/dist/browser-runtime.d.ts.map +1 -0
  5. package/dist/browser-runtime.js +298 -0
  6. package/dist/browser-runtime.js.map +1 -0
  7. package/dist/index.d.ts +81 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +343 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/loader.d.ts +61 -0
  12. package/dist/loader.d.ts.map +1 -0
  13. package/dist/loader.js +80 -0
  14. package/dist/loader.js.map +1 -0
  15. package/dist/providers/storage/filesystem.d.ts +7 -0
  16. package/dist/providers/storage/filesystem.d.ts.map +1 -0
  17. package/dist/providers/storage/filesystem.js +6 -0
  18. package/dist/providers/storage/filesystem.js.map +1 -0
  19. package/dist/providers/uploads/local.d.ts +6 -0
  20. package/dist/providers/uploads/local.d.ts.map +1 -0
  21. package/dist/providers/uploads/local.js +6 -0
  22. package/dist/providers/uploads/local.js.map +1 -0
  23. package/dist/runtime/auth/cookie-utils.d.ts +3 -0
  24. package/dist/runtime/auth/cookie-utils.d.ts.map +1 -0
  25. package/dist/runtime/auth/cookie-utils.js +33 -0
  26. package/dist/runtime/auth/cookie-utils.js.map +1 -0
  27. package/dist/runtime/auth/demo-session.d.ts +24 -0
  28. package/dist/runtime/auth/demo-session.d.ts.map +1 -0
  29. package/dist/runtime/auth/demo-session.js +42 -0
  30. package/dist/runtime/auth/demo-session.js.map +1 -0
  31. package/dist/runtime/auth/rate-limiter.d.ts +26 -0
  32. package/dist/runtime/auth/rate-limiter.d.ts.map +1 -0
  33. package/dist/runtime/auth/rate-limiter.js +65 -0
  34. package/dist/runtime/auth/rate-limiter.js.map +1 -0
  35. package/dist/runtime/auth/session.d.ts +14 -0
  36. package/dist/runtime/auth/session.d.ts.map +1 -0
  37. package/dist/runtime/auth/session.js +128 -0
  38. package/dist/runtime/auth/session.js.map +1 -0
  39. package/dist/runtime/bind.d.ts +14 -0
  40. package/dist/runtime/bind.d.ts.map +1 -0
  41. package/dist/runtime/bind.js +19 -0
  42. package/dist/runtime/bind.js.map +1 -0
  43. package/dist/runtime/config.d.ts +20 -0
  44. package/dist/runtime/config.d.ts.map +1 -0
  45. package/dist/runtime/config.js +40 -0
  46. package/dist/runtime/config.js.map +1 -0
  47. package/dist/runtime/content.d.ts +28 -0
  48. package/dist/runtime/content.d.ts.map +1 -0
  49. package/dist/runtime/content.js +37 -0
  50. package/dist/runtime/content.js.map +1 -0
  51. package/dist/runtime/index.d.ts +14 -0
  52. package/dist/runtime/index.d.ts.map +1 -0
  53. package/dist/runtime/index.js +16 -0
  54. package/dist/runtime/index.js.map +1 -0
  55. package/dist/runtime/middleware.d.ts +14 -0
  56. package/dist/runtime/middleware.d.ts.map +1 -0
  57. package/dist/runtime/middleware.js +80 -0
  58. package/dist/runtime/middleware.js.map +1 -0
  59. package/dist/runtime/mutations/contracts.d.ts +91 -0
  60. package/dist/runtime/mutations/contracts.d.ts.map +1 -0
  61. package/dist/runtime/mutations/contracts.js +320 -0
  62. package/dist/runtime/mutations/contracts.js.map +1 -0
  63. package/dist/runtime/mutations/engine.d.ts +23 -0
  64. package/dist/runtime/mutations/engine.d.ts.map +1 -0
  65. package/dist/runtime/mutations/engine.js +255 -0
  66. package/dist/runtime/mutations/engine.js.map +1 -0
  67. package/dist/runtime/providers.d.ts +9 -0
  68. package/dist/runtime/providers.d.ts.map +1 -0
  69. package/dist/runtime/providers.js +44 -0
  70. package/dist/runtime/providers.js.map +1 -0
  71. package/dist/runtime/request-context.d.ts +11 -0
  72. package/dist/runtime/request-context.d.ts.map +1 -0
  73. package/dist/runtime/request-context.js +16 -0
  74. package/dist/runtime/request-context.js.map +1 -0
  75. package/dist/runtime/rewrite.d.ts +13 -0
  76. package/dist/runtime/rewrite.d.ts.map +1 -0
  77. package/dist/runtime/rewrite.js +253 -0
  78. package/dist/runtime/rewrite.js.map +1 -0
  79. package/dist/runtime/routes/_helpers.d.ts +17 -0
  80. package/dist/runtime/routes/_helpers.d.ts.map +1 -0
  81. package/dist/runtime/routes/_helpers.js +38 -0
  82. package/dist/runtime/routes/_helpers.js.map +1 -0
  83. package/dist/runtime/routes/admin-entry.d.ts +3 -0
  84. package/dist/runtime/routes/admin-entry.d.ts.map +1 -0
  85. package/dist/runtime/routes/admin-entry.js +170 -0
  86. package/dist/runtime/routes/admin-entry.js.map +1 -0
  87. package/dist/runtime/routes/admin.d.ts +3 -0
  88. package/dist/runtime/routes/admin.d.ts.map +1 -0
  89. package/dist/runtime/routes/admin.js +189 -0
  90. package/dist/runtime/routes/admin.js.map +1 -0
  91. package/dist/runtime/routes/auth-login.d.ts +4 -0
  92. package/dist/runtime/routes/auth-login.d.ts.map +1 -0
  93. package/dist/runtime/routes/auth-login.js +71 -0
  94. package/dist/runtime/routes/auth-login.js.map +1 -0
  95. package/dist/runtime/routes/auth-logout.d.ts +4 -0
  96. package/dist/runtime/routes/auth-logout.d.ts.map +1 -0
  97. package/dist/runtime/routes/auth-logout.js +47 -0
  98. package/dist/runtime/routes/auth-logout.js.map +1 -0
  99. package/dist/runtime/routes/auth-session.d.ts +3 -0
  100. package/dist/runtime/routes/auth-session.d.ts.map +1 -0
  101. package/dist/runtime/routes/auth-session.js +8 -0
  102. package/dist/runtime/routes/auth-session.js.map +1 -0
  103. package/dist/runtime/routes/collection-list.d.ts +3 -0
  104. package/dist/runtime/routes/collection-list.d.ts.map +1 -0
  105. package/dist/runtime/routes/collection-list.js +420 -0
  106. package/dist/runtime/routes/collection-list.js.map +1 -0
  107. package/dist/runtime/routes/collections-metadata.d.ts +3 -0
  108. package/dist/runtime/routes/collections-metadata.d.ts.map +1 -0
  109. package/dist/runtime/routes/collections-metadata.js +17 -0
  110. package/dist/runtime/routes/collections-metadata.js.map +1 -0
  111. package/dist/runtime/routes/editor-assets.d.ts +3 -0
  112. package/dist/runtime/routes/editor-assets.d.ts.map +1 -0
  113. package/dist/runtime/routes/editor-assets.js +73 -0
  114. package/dist/runtime/routes/editor-assets.js.map +1 -0
  115. package/dist/runtime/routes/entries.d.ts +3 -0
  116. package/dist/runtime/routes/entries.d.ts.map +1 -0
  117. package/dist/runtime/routes/entries.js +96 -0
  118. package/dist/runtime/routes/entries.js.map +1 -0
  119. package/dist/runtime/routes/history.d.ts +4 -0
  120. package/dist/runtime/routes/history.d.ts.map +1 -0
  121. package/dist/runtime/routes/history.js +54 -0
  122. package/dist/runtime/routes/history.js.map +1 -0
  123. package/dist/runtime/routes/mutate.d.ts +4 -0
  124. package/dist/runtime/routes/mutate.d.ts.map +1 -0
  125. package/dist/runtime/routes/mutate.js +38 -0
  126. package/dist/runtime/routes/mutate.js.map +1 -0
  127. package/dist/runtime/routes/schema.d.ts +3 -0
  128. package/dist/runtime/routes/schema.d.ts.map +1 -0
  129. package/dist/runtime/routes/schema.js +58 -0
  130. package/dist/runtime/routes/schema.js.map +1 -0
  131. package/dist/runtime/routes/studio-home.d.ts +3 -0
  132. package/dist/runtime/routes/studio-home.d.ts.map +1 -0
  133. package/dist/runtime/routes/studio-home.js +99 -0
  134. package/dist/runtime/routes/studio-home.js.map +1 -0
  135. package/dist/runtime/routes/theme-stylesheet.d.ts +3 -0
  136. package/dist/runtime/routes/theme-stylesheet.d.ts.map +1 -0
  137. package/dist/runtime/routes/theme-stylesheet.js +32 -0
  138. package/dist/runtime/routes/theme-stylesheet.js.map +1 -0
  139. package/dist/runtime/routes/upload.d.ts +3 -0
  140. package/dist/runtime/routes/upload.d.ts.map +1 -0
  141. package/dist/runtime/routes/upload.js +33 -0
  142. package/dist/runtime/routes/upload.js.map +1 -0
  143. package/dist/runtime/sanitize-html.d.ts +8 -0
  144. package/dist/runtime/sanitize-html.d.ts.map +1 -0
  145. package/dist/runtime/sanitize-html.js +86 -0
  146. package/dist/runtime/sanitize-html.js.map +1 -0
  147. package/dist/runtime/schema/template.d.ts +15 -0
  148. package/dist/runtime/schema/template.d.ts.map +1 -0
  149. package/dist/runtime/schema/template.js +38 -0
  150. package/dist/runtime/schema/template.js.map +1 -0
  151. package/dist/runtime/schema-registry.d.ts +17 -0
  152. package/dist/runtime/schema-registry.d.ts.map +1 -0
  153. package/dist/runtime/schema-registry.js +16 -0
  154. package/dist/runtime/schema-registry.js.map +1 -0
  155. package/dist/runtime/storage/filesystem-adapter.d.ts +36 -0
  156. package/dist/runtime/storage/filesystem-adapter.d.ts.map +1 -0
  157. package/dist/runtime/storage/filesystem-adapter.js +291 -0
  158. package/dist/runtime/storage/filesystem-adapter.js.map +1 -0
  159. package/dist/runtime/storage/filesystem-upload-handler.d.ts +11 -0
  160. package/dist/runtime/storage/filesystem-upload-handler.d.ts.map +1 -0
  161. package/dist/runtime/storage/filesystem-upload-handler.js +20 -0
  162. package/dist/runtime/storage/filesystem-upload-handler.js.map +1 -0
  163. package/dist/runtime/storage/image-validation.d.ts +28 -0
  164. package/dist/runtime/storage/image-validation.d.ts.map +1 -0
  165. package/dist/runtime/storage/image-validation.js +94 -0
  166. package/dist/runtime/storage/image-validation.js.map +1 -0
  167. package/dist/runtime/storage/in-memory-adapter.d.ts +29 -0
  168. package/dist/runtime/storage/in-memory-adapter.d.ts.map +1 -0
  169. package/dist/runtime/storage/in-memory-adapter.js +110 -0
  170. package/dist/runtime/storage/in-memory-adapter.js.map +1 -0
  171. package/dist/runtime/storage/quota-upload-handler.d.ts +27 -0
  172. package/dist/runtime/storage/quota-upload-handler.d.ts.map +1 -0
  173. package/dist/runtime/storage/quota-upload-handler.js +34 -0
  174. package/dist/runtime/storage/quota-upload-handler.js.map +1 -0
  175. package/dist/runtime/storage/session-overlay-adapter.d.ts +33 -0
  176. package/dist/runtime/storage/session-overlay-adapter.d.ts.map +1 -0
  177. package/dist/runtime/storage/session-overlay-adapter.js +121 -0
  178. package/dist/runtime/storage/session-overlay-adapter.js.map +1 -0
  179. package/dist/runtime/themes/preset-tokens.d.ts +17 -0
  180. package/dist/runtime/themes/preset-tokens.d.ts.map +1 -0
  181. package/dist/runtime/themes/preset-tokens.js +47 -0
  182. package/dist/runtime/themes/preset-tokens.js.map +1 -0
  183. package/dist/runtime/utils.d.ts +6 -0
  184. package/dist/runtime/utils.d.ts.map +1 -0
  185. package/dist/runtime/utils.js +29 -0
  186. package/dist/runtime/utils.js.map +1 -0
  187. package/dist/runtime/views/studio-layout.d.ts +25 -0
  188. package/dist/runtime/views/studio-layout.d.ts.map +1 -0
  189. package/dist/runtime/views/studio-layout.js +108 -0
  190. package/dist/runtime/views/studio-layout.js.map +1 -0
  191. package/dist/schema-utils.d.ts +16 -0
  192. package/dist/schema-utils.d.ts.map +1 -0
  193. package/dist/schema-utils.js +62 -0
  194. package/dist/schema-utils.js.map +1 -0
  195. package/dist/types.d.ts +76 -0
  196. package/dist/types.d.ts.map +1 -0
  197. package/dist/types.js +2 -0
  198. package/dist/types.js.map +1 -0
  199. package/editor-runtime.d.ts +6 -0
  200. package/editor-runtime.js +2 -0
  201. package/package.json +88 -0
  202. package/static/cms/admin-entry.css +207 -0
  203. package/static/cms/admin-entry.js +1083 -0
  204. package/static/cms/editor/config.js +118 -0
  205. package/static/cms/editor/content-map.css +141 -0
  206. package/static/cms/editor/content-map.js +172 -0
  207. package/static/cms/editor/guards.js +72 -0
  208. package/static/cms/editor/helpers.js +51 -0
  209. package/static/cms/editor/image-edit.js +151 -0
  210. package/static/cms/editor/image-utils.js +84 -0
  211. package/static/cms/editor/image.css +133 -0
  212. package/static/cms/editor/link-follow.js +144 -0
  213. package/static/cms/editor/link-ui.css +199 -0
  214. package/static/cms/editor/linkify.js +55 -0
  215. package/static/cms/editor/panel.css +91 -0
  216. package/static/cms/editor/panel.js +70 -0
  217. package/static/cms/editor/rich-toolbar.css +67 -0
  218. package/static/cms/editor/rich-toolbar.js +200 -0
  219. package/static/cms/editor/sanitize.js +89 -0
  220. package/static/cms/editor/save-queue.js +166 -0
  221. package/static/cms/editor/section-controls/activation.js +10 -0
  222. package/static/cms/editor/section-controls/api.js +87 -0
  223. package/static/cms/editor/section-controls/constants.js +24 -0
  224. package/static/cms/editor/section-controls/index.js +622 -0
  225. package/static/cms/editor/section-controls/model.js +76 -0
  226. package/static/cms/editor/section-controls/mutations.js +112 -0
  227. package/static/cms/editor/section-controls/page-context.js +34 -0
  228. package/static/cms/editor/section-controls/pickers.js +196 -0
  229. package/static/cms/editor/section-controls/reorder.js +92 -0
  230. package/static/cms/editor/section-controls/selection.js +54 -0
  231. package/static/cms/editor/section-controls/spacing-drag.js +83 -0
  232. package/static/cms/editor/section-controls/ui-elements.js +54 -0
  233. package/static/cms/editor/section-controls/utils.js +35 -0
  234. package/static/cms/editor/section-controls.css +349 -0
  235. package/static/cms/editor/section-controls.js +1 -0
  236. package/static/cms/editor/security.js +48 -0
  237. package/static/cms/editor/sync.js +72 -0
  238. package/static/cms/editor/text-edit.js +151 -0
  239. package/static/cms/editor/text-link-interactions.js +254 -0
  240. package/static/cms/editor/toast.css +50 -0
  241. package/static/cms/editor/toast.js +29 -0
  242. package/static/cms/editor/tokens-and-text.css +93 -0
  243. package/static/cms/editor/toolbar.css +249 -0
  244. package/static/cms/editor/toolbar.js +117 -0
  245. package/static/cms/editor.css +12 -0
  246. package/static/cms/editor.js +116 -0
  247. package/static/cms/studio-login.css +300 -0
  248. package/static/cms/studio-tokens.css +85 -0
  249. package/static/cms/studio.css +437 -0
package/dist/index.js ADDED
@@ -0,0 +1,343 @@
1
+ export { FilesystemAdapter } from "./runtime/storage/filesystem-adapter.js";
2
+ export { InMemoryAdapter } from "./runtime/storage/in-memory-adapter.js";
3
+ export { FilesystemUploadHandler } from "./runtime/storage/filesystem-upload-handler.js";
4
+ export { bindEntry } from "./runtime/bind.js";
5
+ export { caretLoader, CaretLoaderError } from "./loader.js";
6
+ const VIRTUAL_PROVIDER_MODULE_ID = "virtual:caretcms/providers";
7
+ const RESOLVED_VIRTUAL_PROVIDER_MODULE_ID = `\0${VIRTUAL_PROVIDER_MODULE_ID}`;
8
+ const VIRTUAL_SCHEMAS_MODULE_ID = "virtual:caretcms/schemas";
9
+ const RESOLVED_VIRTUAL_SCHEMAS_MODULE_ID = `\0${VIRTUAL_SCHEMAS_MODULE_ID}`;
10
+ const FILESYSTEM_STORAGE_ENTRYPOINT = "@caretcms/core/providers/storage/filesystem";
11
+ const LOCAL_UPLOADS_ENTRYPOINT = "@caretcms/core/providers/uploads/local";
12
+ export function defineStorageProvider(options) {
13
+ return {
14
+ kind: "storage",
15
+ entrypoint: options.entrypoint,
16
+ exportName: options.exportName ?? "default",
17
+ options: options.options ?? null,
18
+ };
19
+ }
20
+ export function defineUploadProvider(options) {
21
+ return {
22
+ kind: "uploads",
23
+ entrypoint: options.entrypoint,
24
+ exportName: options.exportName ?? "default",
25
+ options: options.options ?? null,
26
+ };
27
+ }
28
+ export function filesystemStorage(options) {
29
+ return defineStorageProvider({
30
+ entrypoint: FILESYSTEM_STORAGE_ENTRYPOINT,
31
+ exportName: "filesystemStorageProvider",
32
+ options,
33
+ });
34
+ }
35
+ export function localUploads(options) {
36
+ return defineUploadProvider({
37
+ entrypoint: LOCAL_UPLOADS_ENTRYPOINT,
38
+ exportName: "localUploadsProvider",
39
+ options,
40
+ });
41
+ }
42
+ import { normalizePath as normalizeMountPath } from "./runtime/config.js";
43
+ function normalizeMode(input) {
44
+ return input ?? "embedded";
45
+ }
46
+ function normalizeCloudOptions(input) {
47
+ const endpoint = input.endpoint.trim().replace(/\/$/, "");
48
+ const projectId = input.projectId.trim();
49
+ if (!endpoint) {
50
+ throw new Error("[caretcms] Cloud mode requires cloud.endpoint.");
51
+ }
52
+ if (!projectId) {
53
+ throw new Error("[caretcms] Cloud mode requires cloud.projectId.");
54
+ }
55
+ return {
56
+ endpoint,
57
+ projectId,
58
+ contentPath: input.contentPath?.trim() || "/content",
59
+ publicToken: input.publicToken?.trim() || undefined,
60
+ environment: input.environment?.trim() || undefined,
61
+ };
62
+ }
63
+ function isProviderReference(value, kind) {
64
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
65
+ return false;
66
+ }
67
+ const candidate = value;
68
+ return (candidate.kind === kind &&
69
+ typeof candidate.entrypoint === "string" &&
70
+ candidate.entrypoint.trim().length > 0);
71
+ }
72
+ function defaultProviders(mode) {
73
+ if (mode === "cloud") {
74
+ return {
75
+ storage: null,
76
+ uploads: null,
77
+ };
78
+ }
79
+ return {
80
+ storage: filesystemStorage(),
81
+ uploads: localUploads(),
82
+ };
83
+ }
84
+ function resolveTheme(input) {
85
+ if (!input)
86
+ return { presetId: null, tokenOverrides: {} };
87
+ if (typeof input === "string") {
88
+ return { presetId: input, tokenOverrides: {} };
89
+ }
90
+ return {
91
+ presetId: input.preset ?? null,
92
+ tokenOverrides: input.tokens ?? {},
93
+ };
94
+ }
95
+ function resolveBrand(input) {
96
+ return {
97
+ name: input?.name?.trim() || "Content Studio",
98
+ logo: input?.logo?.trim() || null,
99
+ faviconUrl: input?.faviconUrl?.trim() || null,
100
+ };
101
+ }
102
+ function resolveCaretOptions(options) {
103
+ const mode = normalizeMode(options.mode);
104
+ const defaults = defaultProviders(mode);
105
+ const cloud = mode === "cloud"
106
+ ? normalizeCloudOptions(options.cloud)
107
+ : null;
108
+ return {
109
+ mountPath: normalizeMountPath(options.mountPath, "/admin"),
110
+ apiBasePath: normalizeMountPath(options.apiBasePath, "/api/cms"),
111
+ mode,
112
+ storage: isProviderReference(options.storage, "storage")
113
+ ? options.storage
114
+ : defaults.storage,
115
+ uploads: isProviderReference(options.uploads, "uploads")
116
+ ? options.uploads
117
+ : defaults.uploads,
118
+ enableAdmin: options.enableAdmin ?? mode !== "cloud",
119
+ enableInlineEditor: options.enableInlineEditor ?? mode !== "cloud",
120
+ cloud,
121
+ schemas: options.schemas ?? {},
122
+ theme: resolveTheme(options.theme),
123
+ brand: resolveBrand(options.brand),
124
+ };
125
+ }
126
+ function buildProviderLoader(functionName, reference) {
127
+ if (!reference) {
128
+ return `export async function ${functionName}(){return null;}`;
129
+ }
130
+ const importName = `__caret_${functionName}`;
131
+ return [
132
+ `import * as ${importName} from ${JSON.stringify(reference.entrypoint)};`,
133
+ `export async function ${functionName}(){`,
134
+ ` const resolvedExport = ${importName}[${JSON.stringify(reference.exportName ?? "default")}] ?? ${importName}.default;`,
135
+ " if (resolvedExport == null) {",
136
+ ` throw new Error(${JSON.stringify(`[caretcms] Could not resolve provider export "${reference.exportName ?? "default"}" from ${reference.entrypoint}.`)});`,
137
+ " }",
138
+ " return typeof resolvedExport === 'function'",
139
+ ` ? await resolvedExport(${JSON.stringify(reference.options ?? null)})`,
140
+ " : resolvedExport;",
141
+ "}",
142
+ ].join("\n");
143
+ }
144
+ function createRuntimeProvidersPlugin(resolved) {
145
+ const source = [
146
+ buildProviderLoader("loadConfiguredStorage", resolved.storage),
147
+ buildProviderLoader("loadConfiguredUploadHandler", resolved.uploads),
148
+ ].join("\n\n");
149
+ return {
150
+ name: "caretcms:runtime-providers",
151
+ resolveId(id) {
152
+ if (id === VIRTUAL_PROVIDER_MODULE_ID) {
153
+ return RESOLVED_VIRTUAL_PROVIDER_MODULE_ID;
154
+ }
155
+ return null;
156
+ },
157
+ load(id) {
158
+ if (id === RESOLVED_VIRTUAL_PROVIDER_MODULE_ID) {
159
+ return source;
160
+ }
161
+ return null;
162
+ },
163
+ };
164
+ }
165
+ function createSchemasPlugin(schemas) {
166
+ const hasSchemas = Object.keys(schemas).length > 0;
167
+ const source = hasSchemas
168
+ ? [
169
+ `import { registerCollectionSchema } from "@caretcms/core/schema-registry";`,
170
+ `import { buildTemplate } from "@caretcms/core/schema-utils";`,
171
+ `const schemas = ${JSON.stringify(schemas)};`,
172
+ `for (const [collection, schema] of Object.entries(schemas)) {`,
173
+ ` registerCollectionSchema(collection, schema, buildTemplate(schema));`,
174
+ `}`,
175
+ `export const registered = true;`,
176
+ ].join("\n")
177
+ : `export const registered = false;`;
178
+ return {
179
+ name: "caretcms:schemas",
180
+ resolveId(id) {
181
+ if (id === VIRTUAL_SCHEMAS_MODULE_ID) {
182
+ return RESOLVED_VIRTUAL_SCHEMAS_MODULE_ID;
183
+ }
184
+ return null;
185
+ },
186
+ load(id) {
187
+ if (id === RESOLVED_VIRTUAL_SCHEMAS_MODULE_ID) {
188
+ return source;
189
+ }
190
+ return null;
191
+ },
192
+ };
193
+ }
194
+ function describeProvider(reference) {
195
+ if (!reference)
196
+ return "none";
197
+ return `${reference.entrypoint}#${reference.exportName ?? "default"}`;
198
+ }
199
+ function buildCloudBootstrapScript(clientConfig, cloud) {
200
+ return [
201
+ `window.__CARET__ = ${JSON.stringify(clientConfig)};`,
202
+ `import { bootstrapCloudCms, hasCloudCmsSession, redirectToCloudCmsLogin } from "@caretcms/core/browser-runtime";`,
203
+ `const __caretCloudConfig = ${JSON.stringify(cloud)};`,
204
+ `bootstrapCloudCms(__caretCloudConfig).then(async () => {`,
205
+ ` const url = new URL(window.location.href);`,
206
+ ` const wantsEditor = url.searchParams.get("cms") === "1";`,
207
+ ` if (hasCloudCmsSession(__caretCloudConfig)) {`,
208
+ ` await import("@caretcms/core/editor-runtime");`,
209
+ ` return;`,
210
+ ` }`,
211
+ ` if (wantsEditor) {`,
212
+ ` redirectToCloudCmsLogin(__caretCloudConfig, window.location.href);`,
213
+ ` }`,
214
+ `}).catch((error) => {`,
215
+ ` console.warn("[caretcms] Cloud runtime bootstrap failed.", error);`,
216
+ "});",
217
+ ].join("\n");
218
+ }
219
+ export function caret(options = {}) {
220
+ const resolved = resolveCaretOptions(options);
221
+ return {
222
+ name: "caretcms",
223
+ hooks: {
224
+ "astro:config:setup": ({ config, logger, addMiddleware, injectRoute, injectScript, updateConfig }) => {
225
+ const isStaticOutput = config.output === "static";
226
+ updateConfig({
227
+ vite: {
228
+ define: {
229
+ __ASTRO_CARET_MOUNT_PATH__: JSON.stringify(resolved.mountPath),
230
+ __ASTRO_CARET_API_BASE_PATH__: JSON.stringify(resolved.apiBasePath),
231
+ __ASTRO_CARET_MODE__: JSON.stringify(resolved.mode),
232
+ __ASTRO_CARET_THEME_CONFIG__: JSON.stringify(JSON.stringify(resolved.theme)),
233
+ __ASTRO_CARET_BRAND_CONFIG__: JSON.stringify(JSON.stringify(resolved.brand)),
234
+ },
235
+ plugins: [
236
+ createRuntimeProvidersPlugin(resolved),
237
+ createSchemasPlugin(resolved.schemas),
238
+ ],
239
+ },
240
+ });
241
+ const clientConfig = {
242
+ mode: resolved.mode,
243
+ mountPath: resolved.mountPath,
244
+ apiBasePath: resolved.apiBasePath,
245
+ cloud: resolved.cloud ?? undefined,
246
+ };
247
+ if (resolved.mode === "cloud") {
248
+ injectScript("page", buildCloudBootstrapScript(clientConfig, resolved.cloud));
249
+ logger.warn("[caretcms] mode: 'cloud' is alpha. The hosted control plane is not yet generally available — bootstrap requests will fail silently against placeholder endpoints. Use embedded mode for production today.");
250
+ logger.info(`[caretcms] cloud mode loaded (projectId=${resolved.cloud.projectId}, endpoint=${resolved.cloud.endpoint}, static=${isStaticOutput})`);
251
+ return;
252
+ }
253
+ if (isStaticOutput) {
254
+ logger.warn(`[caretcms] ${resolved.mode} mode needs Astro server output for local editing routes. Static output detected, so embedded CMS middleware and routes were skipped.`);
255
+ return;
256
+ }
257
+ addMiddleware({
258
+ order: "pre",
259
+ entrypoint: new URL("./runtime/middleware.js", import.meta.url),
260
+ });
261
+ if (resolved.enableAdmin) {
262
+ injectRoute({
263
+ pattern: resolved.mountPath,
264
+ entrypoint: new URL("./runtime/routes/admin.js", import.meta.url),
265
+ });
266
+ injectRoute({
267
+ pattern: `${resolved.mountPath}/cms`,
268
+ entrypoint: new URL("./runtime/routes/studio-home.js", import.meta.url),
269
+ });
270
+ injectRoute({
271
+ pattern: `${resolved.mountPath}/cms/[collection]`,
272
+ entrypoint: new URL("./runtime/routes/collection-list.js", import.meta.url),
273
+ });
274
+ injectRoute({
275
+ pattern: `${resolved.mountPath}/cms/[collection]/[id]`,
276
+ entrypoint: new URL("./runtime/routes/admin-entry.js", import.meta.url),
277
+ });
278
+ }
279
+ injectRoute({
280
+ pattern: `${resolved.apiBasePath}/entries`,
281
+ entrypoint: new URL("./runtime/routes/entries.js", import.meta.url),
282
+ });
283
+ injectRoute({
284
+ pattern: `${resolved.apiBasePath}/mutate`,
285
+ entrypoint: new URL("./runtime/routes/mutate.js", import.meta.url),
286
+ });
287
+ injectRoute({
288
+ pattern: `${resolved.apiBasePath}/schema`,
289
+ entrypoint: new URL("./runtime/routes/schema.js", import.meta.url),
290
+ });
291
+ injectRoute({
292
+ pattern: `${resolved.apiBasePath}/collections-metadata`,
293
+ entrypoint: new URL("./runtime/routes/collections-metadata.js", import.meta.url),
294
+ });
295
+ injectRoute({
296
+ pattern: `${resolved.apiBasePath}/auth/login`,
297
+ entrypoint: new URL("./runtime/routes/auth-login.js", import.meta.url),
298
+ });
299
+ injectRoute({
300
+ pattern: `${resolved.apiBasePath}/auth/session`,
301
+ entrypoint: new URL("./runtime/routes/auth-session.js", import.meta.url),
302
+ });
303
+ injectRoute({
304
+ pattern: `${resolved.apiBasePath}/auth/logout`,
305
+ entrypoint: new URL("./runtime/routes/auth-logout.js", import.meta.url),
306
+ });
307
+ injectRoute({
308
+ pattern: `${resolved.apiBasePath}/theme.css`,
309
+ entrypoint: new URL("./runtime/routes/theme-stylesheet.js", import.meta.url),
310
+ });
311
+ injectRoute({
312
+ pattern: `${resolved.apiBasePath}/history`,
313
+ entrypoint: new URL("./runtime/routes/history.js", import.meta.url),
314
+ });
315
+ injectRoute({
316
+ pattern: `${resolved.apiBasePath}/upload`,
317
+ entrypoint: new URL("./runtime/routes/upload.js", import.meta.url),
318
+ });
319
+ if (resolved.enableInlineEditor) {
320
+ injectRoute({
321
+ pattern: "/__caret/[...path]",
322
+ entrypoint: new URL("./runtime/routes/editor-assets.js", import.meta.url),
323
+ });
324
+ injectScript("page", `(function(){
325
+ if(!document.querySelector('[data-caret]'))return;
326
+ fetch(${JSON.stringify(`${resolved.apiBasePath}/auth/session`)},{credentials:'same-origin'})
327
+ .then(function(response){return response.ok?response.json():null;})
328
+ .then(function(session){
329
+ if(!session||session.authenticated!==true)return;
330
+ var l=document.createElement('link');l.rel='stylesheet';l.href='/__caret/editor.css';document.head.appendChild(l);
331
+ window.__CARET__=${JSON.stringify(clientConfig)};
332
+ var s=document.createElement('script');s.type='module';s.src='/__caret/editor.js?v='+Date.now();document.head.appendChild(s);
333
+ })
334
+ .catch(function(){});
335
+ })();`);
336
+ }
337
+ logger.info(`[caretcms] core loaded (mode=${resolved.mode}, mountPath=${resolved.mountPath}, apiBasePath=${resolved.apiBasePath}, storage=${describeProvider(resolved.storage)}, uploads=${describeProvider(resolved.uploads)}, enableAdmin=${resolved.enableAdmin}, inlineEditor=${resolved.enableInlineEditor})`);
338
+ },
339
+ },
340
+ };
341
+ }
342
+ export default caret;
343
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Astro LiveLoader backed by the configured StorageAdapter.
3
+ *
4
+ * Compatible with Astro 6 (stable live content collections) and Astro 5.10+
5
+ * (where the feature lives behind `experimental.liveContentCollections`).
6
+ *
7
+ * Usage in src/caret.config.ts:
8
+ *
9
+ * import { defineLiveCollection } from 'astro:content';
10
+ * import { caretLoader } from '@caretcms/core';
11
+ *
12
+ * const pages = defineLiveCollection({
13
+ * loader: caretLoader('pages'),
14
+ * });
15
+ * export const collections = { pages };
16
+ */
17
+ export declare class CaretLoaderError extends Error {
18
+ constructor(message: string, cause?: unknown);
19
+ }
20
+ type CaretEntryFilter = {
21
+ id: string;
22
+ };
23
+ type CaretLiveDataEntry = {
24
+ id: string;
25
+ data: Record<string, unknown>;
26
+ };
27
+ type CaretLiveDataCollection = {
28
+ entries: CaretLiveDataEntry[];
29
+ };
30
+ type CaretLoadEntryContext = {
31
+ filter: CaretEntryFilter;
32
+ collection: string;
33
+ };
34
+ type CaretLoadCollectionContext = {
35
+ filter?: Record<string, unknown>;
36
+ collection: string;
37
+ };
38
+ /**
39
+ * Structural LiveLoader type that is compatible with Astro's LiveLoader
40
+ * interface (stable in 6.x, experimental in 5.10+) without importing it
41
+ * directly — avoids hard peer-dep coupling at the type level and lets a
42
+ * single build target both major versions.
43
+ */
44
+ export type CaretLiveLoader = {
45
+ name: string;
46
+ loadEntry: (context: CaretLoadEntryContext) => Promise<CaretLiveDataEntry | undefined | {
47
+ error: CaretLoaderError;
48
+ }>;
49
+ loadCollection: (context: CaretLoadCollectionContext) => Promise<CaretLiveDataCollection | {
50
+ error: CaretLoaderError;
51
+ }>;
52
+ };
53
+ /**
54
+ * Create an Astro LiveLoader that reads from the configured StorageAdapter.
55
+ * Works on Astro 6 (stable) and Astro 5.10+ (experimental flag required).
56
+ *
57
+ * @param collection - The collection name (must be known to the adapter).
58
+ */
59
+ export declare function caretLoader(collection: string): CaretLiveLoader;
60
+ export {};
61
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAO7C;AAmBD,KAAK,gBAAgB,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,KAAK,kBAAkB,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,CAAC;AAEF,KAAK,uBAAuB,GAAG;IAC7B,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B,CAAC;AAEF,KAAK,qBAAqB,GAAG;IAC3B,MAAM,EAAE,gBAAgB,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,CACT,OAAO,EAAE,qBAAqB,KAC3B,OAAO,CAAC,kBAAkB,GAAG,SAAS,GAAG;QAAE,KAAK,EAAE,gBAAgB,CAAA;KAAE,CAAC,CAAC;IAC3E,cAAc,EAAE,CACd,OAAO,EAAE,0BAA0B,KAChC,OAAO,CAAC,uBAAuB,GAAG;QAAE,KAAK,EAAE,gBAAgB,CAAA;KAAE,CAAC,CAAC;CACrE,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,GACjB,eAAe,CAyCjB"}
package/dist/loader.js ADDED
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Astro LiveLoader backed by the configured StorageAdapter.
3
+ *
4
+ * Compatible with Astro 6 (stable live content collections) and Astro 5.10+
5
+ * (where the feature lives behind `experimental.liveContentCollections`).
6
+ *
7
+ * Usage in src/caret.config.ts:
8
+ *
9
+ * import { defineLiveCollection } from 'astro:content';
10
+ * import { caretLoader } from '@caretcms/core';
11
+ *
12
+ * const pages = defineLiveCollection({
13
+ * loader: caretLoader('pages'),
14
+ * });
15
+ * export const collections = { pages };
16
+ */
17
+ import { requireRequestContext } from "./runtime/request-context.js";
18
+ export class CaretLoaderError extends Error {
19
+ constructor(message, cause) {
20
+ super(message);
21
+ this.name = "CaretLoaderError";
22
+ if (cause !== undefined) {
23
+ this.cause = cause;
24
+ }
25
+ }
26
+ }
27
+ function requireAdapter() {
28
+ try {
29
+ return requireRequestContext().adapter;
30
+ }
31
+ catch (cause) {
32
+ throw new CaretLoaderError("StorageAdapter not initialized. " +
33
+ "Ensure @caretcms/core middleware runs before page rendering " +
34
+ "(the integration registers it with order: 'pre').", cause);
35
+ }
36
+ }
37
+ /**
38
+ * Create an Astro LiveLoader that reads from the configured StorageAdapter.
39
+ * Works on Astro 6 (stable) and Astro 5.10+ (experimental flag required).
40
+ *
41
+ * @param collection - The collection name (must be known to the adapter).
42
+ */
43
+ export function caretLoader(collection) {
44
+ return {
45
+ name: `caret:${collection}`,
46
+ async loadEntry({ filter }) {
47
+ try {
48
+ const adapter = requireAdapter();
49
+ const id = filter.id;
50
+ const entry = await adapter.getEntry(collection, id);
51
+ if (!entry)
52
+ return undefined;
53
+ return { id: entry.id, data: entry.data };
54
+ }
55
+ catch (error) {
56
+ return {
57
+ error: new CaretLoaderError(`Failed to load entry ${collection}::${filter.id}`, error),
58
+ };
59
+ }
60
+ },
61
+ async loadCollection() {
62
+ try {
63
+ const adapter = requireAdapter();
64
+ const allEntries = await adapter.listEntries(collection);
65
+ return {
66
+ entries: allEntries.map((entry) => ({
67
+ id: entry.id,
68
+ data: entry.data,
69
+ })),
70
+ };
71
+ }
72
+ catch (error) {
73
+ return {
74
+ error: new CaretLoaderError(`Failed to load collection ${collection}`, error),
75
+ };
76
+ }
77
+ },
78
+ };
79
+ }
80
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACvB,IAAoC,CAAC,KAAK,GAAG,KAAK,CAAC;QACtD,CAAC;IACH,CAAC;CACF;AAED,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,OAAO,qBAAqB,EAAE,CAAC,OAAO,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,gBAAgB,CACxB,kCAAkC;YAChC,8DAA8D;YAC9D,mDAAmD,EACrD,KAAK,CACN,CAAC;IACJ,CAAC;AACH,CAAC;AA2CD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,UAAkB;IAElB,OAAO;QACL,IAAI,EAAE,SAAS,UAAU,EAAE;QAE3B,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE;YACxB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;gBACjC,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;gBACrB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;gBACrD,IAAI,CAAC,KAAK;oBAAE,OAAO,SAAS,CAAC;gBAC7B,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;YAC5C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO;oBACL,KAAK,EAAE,IAAI,gBAAgB,CACzB,wBAAwB,UAAU,KAAK,MAAM,CAAC,EAAE,EAAE,EAClD,KAAK,CACN;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,KAAK,CAAC,cAAc;YAClB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;gBACjC,MAAM,UAAU,GAAgB,MAAM,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;gBACtE,OAAO;oBACL,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;wBAClC,EAAE,EAAE,KAAK,CAAC,EAAE;wBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;qBACjB,CAAC,CAAC;iBACJ,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO;oBACL,KAAK,EAAE,IAAI,gBAAgB,CACzB,6BAA6B,UAAU,EAAE,EACzC,KAAK,CACN;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { FilesystemAdapter } from "../../runtime/storage/filesystem-adapter.js";
2
+ export declare function filesystemStorageProvider(options?: {
3
+ dataRoot?: string;
4
+ metaRoot?: string;
5
+ }): FilesystemAdapter;
6
+ export default filesystemStorageProvider;
7
+ //# sourceMappingURL=filesystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../../src/providers/storage/filesystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAEhF,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,iBAAiB,CAEpB;AAED,eAAe,yBAAyB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { FilesystemAdapter } from "../../runtime/storage/filesystem-adapter.js";
2
+ export function filesystemStorageProvider(options) {
3
+ return new FilesystemAdapter(options);
4
+ }
5
+ export default filesystemStorageProvider;
6
+ //# sourceMappingURL=filesystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../../src/providers/storage/filesystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAEhF,MAAM,UAAU,yBAAyB,CAAC,OAGzC;IACC,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,eAAe,yBAAyB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { FilesystemUploadHandler } from "../../runtime/storage/filesystem-upload-handler.js";
2
+ export declare function localUploadsProvider(options?: {
3
+ uploadsDir?: string;
4
+ }): FilesystemUploadHandler;
5
+ export default localUploadsProvider;
6
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../src/providers/uploads/local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oDAAoD,CAAC;AAE7F,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,uBAAuB,CAE1B;AAED,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { FilesystemUploadHandler } from "../../runtime/storage/filesystem-upload-handler.js";
2
+ export function localUploadsProvider(options) {
3
+ return new FilesystemUploadHandler(options);
4
+ }
5
+ export default localUploadsProvider;
6
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../../src/providers/uploads/local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oDAAoD,CAAC;AAE7F,MAAM,UAAU,oBAAoB,CAAC,OAEpC;IACC,OAAO,IAAI,uBAAuB,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function shouldUseSecureCookies(request?: Request): boolean;
2
+ export declare function sanitizeRedirect(value: string | null | undefined, fallback: string): string;
3
+ //# sourceMappingURL=cookie-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie-utils.d.ts","sourceRoot":"","sources":["../../../src/runtime/auth/cookie-utils.ts"],"names":[],"mappings":"AAOA,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAmBjE;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,QAAQ,EAAE,MAAM,GACf,MAAM,CAGR"}
@@ -0,0 +1,33 @@
1
+ function isProxyTrusted() {
2
+ const raw = process.env.CARET_TRUST_PROXY;
3
+ if (!raw)
4
+ return false;
5
+ const value = raw.trim().toLowerCase();
6
+ return value === "1" || value === "true" || value === "yes";
7
+ }
8
+ export function shouldUseSecureCookies(request) {
9
+ // Only honor X-Forwarded-Proto when the deployment has explicitly opted in
10
+ // via CARET_TRUST_PROXY. Otherwise any client could send
11
+ // `X-Forwarded-Proto: http` to suppress the Secure flag on the session
12
+ // cookie, leaking it on a TLS downgrade.
13
+ if (isProxyTrusted()) {
14
+ const forwarded = request?.headers.get("x-forwarded-proto")?.split(",")[0]?.trim();
15
+ if (forwarded)
16
+ return forwarded === "https";
17
+ }
18
+ if (request) {
19
+ try {
20
+ return new URL(request.url).protocol === "https:";
21
+ }
22
+ catch {
23
+ // fall through to NODE_ENV
24
+ }
25
+ }
26
+ return process.env.NODE_ENV === "production";
27
+ }
28
+ export function sanitizeRedirect(value, fallback) {
29
+ if (!value)
30
+ return fallback;
31
+ return value.startsWith("/") && !value.startsWith("//") ? value : fallback;
32
+ }
33
+ //# sourceMappingURL=cookie-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie-utils.js","sourceRoot":"","sources":["../../../src/runtime/auth/cookie-utils.ts"],"names":[],"mappings":"AAAA,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC1C,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACvC,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAiB;IACtD,2EAA2E;IAC3E,yDAAyD;IACzD,uEAAuE;IACvE,yCAAyC;IACzC,IAAI,cAAc,EAAE,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACnF,IAAI,SAAS;YAAE,OAAO,SAAS,KAAK,OAAO,CAAC;IAC9C,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,KAAgC,EAChC,QAAgB;IAEhB,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAC5B,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,24 @@
1
+ type CookieBag = {
2
+ cookies?: {
3
+ get: (name: string) => {
4
+ value: string;
5
+ } | undefined;
6
+ };
7
+ };
8
+ /**
9
+ * Detect demo mode from any available env source. Workers populate env via
10
+ * `context.locals.runtime.env` (Astro Cloudflare adapter); Node hosts use
11
+ * `process.env`. Pass `runtimeEnv` when available — falls back to process.env.
12
+ */
13
+ export declare function isDemoModeEnabled(runtimeEnv?: Record<string, unknown> | null): boolean;
14
+ export interface DemoSessionResolution {
15
+ sessionId: string;
16
+ setCookieHeader: string;
17
+ }
18
+ /**
19
+ * Read the demo session cookie or mint a new one. Always refreshes the TTL,
20
+ * giving us a sliding 2h window per active visitor.
21
+ */
22
+ export declare function resolveDemoSession(context: CookieBag, request: Request): DemoSessionResolution;
23
+ export {};
24
+ //# sourceMappingURL=demo-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo-session.d.ts","sourceRoot":"","sources":["../../../src/runtime/auth/demo-session.ts"],"names":[],"mappings":"AAMA,KAAK,SAAS,GAAG;IACf,OAAO,CAAC,EAAE;QAAE,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAA;KAAE,CAAC;CACpE,CAAC;AAcF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAC1C,OAAO,CAMT;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,OAAO,GACf,qBAAqB,CAOvB"}