@astro-live-cms/core 0.2.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 (163) hide show
  1. package/dist/index.d.ts +15 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +122 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/runtime/auth/session.d.ts +14 -0
  6. package/dist/runtime/auth/session.d.ts.map +1 -0
  7. package/dist/runtime/auth/session.js +77 -0
  8. package/dist/runtime/auth/session.js.map +1 -0
  9. package/dist/runtime/bind.d.ts +14 -0
  10. package/dist/runtime/bind.d.ts.map +1 -0
  11. package/dist/runtime/bind.js +11 -0
  12. package/dist/runtime/bind.js.map +1 -0
  13. package/dist/runtime/config.d.ts +6 -0
  14. package/dist/runtime/config.d.ts.map +1 -0
  15. package/dist/runtime/config.js +18 -0
  16. package/dist/runtime/config.js.map +1 -0
  17. package/dist/runtime/content.d.ts +30 -0
  18. package/dist/runtime/content.d.ts.map +1 -0
  19. package/dist/runtime/content.js +48 -0
  20. package/dist/runtime/content.js.map +1 -0
  21. package/dist/runtime/index.d.ts +10 -0
  22. package/dist/runtime/index.d.ts.map +1 -0
  23. package/dist/runtime/index.js +12 -0
  24. package/dist/runtime/index.js.map +1 -0
  25. package/dist/runtime/markers.d.ts +17 -0
  26. package/dist/runtime/markers.d.ts.map +1 -0
  27. package/dist/runtime/markers.js +17 -0
  28. package/dist/runtime/markers.js.map +1 -0
  29. package/dist/runtime/middleware.d.ts +12 -0
  30. package/dist/runtime/middleware.d.ts.map +1 -0
  31. package/dist/runtime/middleware.js +37 -0
  32. package/dist/runtime/middleware.js.map +1 -0
  33. package/dist/runtime/mutations/contracts.d.ts +57 -0
  34. package/dist/runtime/mutations/contracts.d.ts.map +1 -0
  35. package/dist/runtime/mutations/contracts.js +242 -0
  36. package/dist/runtime/mutations/contracts.js.map +1 -0
  37. package/dist/runtime/mutations/engine.d.ts +23 -0
  38. package/dist/runtime/mutations/engine.d.ts.map +1 -0
  39. package/dist/runtime/mutations/engine.js +161 -0
  40. package/dist/runtime/mutations/engine.js.map +1 -0
  41. package/dist/runtime/routes/_helpers.d.ts +6 -0
  42. package/dist/runtime/routes/_helpers.d.ts.map +1 -0
  43. package/dist/runtime/routes/_helpers.js +23 -0
  44. package/dist/runtime/routes/_helpers.js.map +1 -0
  45. package/dist/runtime/routes/admin.d.ts +3 -0
  46. package/dist/runtime/routes/admin.d.ts.map +1 -0
  47. package/dist/runtime/routes/admin.js +110 -0
  48. package/dist/runtime/routes/admin.js.map +1 -0
  49. package/dist/runtime/routes/auth-login.d.ts +4 -0
  50. package/dist/runtime/routes/auth-login.d.ts.map +1 -0
  51. package/dist/runtime/routes/auth-login.js +66 -0
  52. package/dist/runtime/routes/auth-login.js.map +1 -0
  53. package/dist/runtime/routes/auth-logout.d.ts +4 -0
  54. package/dist/runtime/routes/auth-logout.d.ts.map +1 -0
  55. package/dist/runtime/routes/auth-logout.js +51 -0
  56. package/dist/runtime/routes/auth-logout.js.map +1 -0
  57. package/dist/runtime/routes/editor-assets.d.ts +3 -0
  58. package/dist/runtime/routes/editor-assets.d.ts.map +1 -0
  59. package/dist/runtime/routes/editor-assets.js +47 -0
  60. package/dist/runtime/routes/editor-assets.js.map +1 -0
  61. package/dist/runtime/routes/entries.d.ts +3 -0
  62. package/dist/runtime/routes/entries.d.ts.map +1 -0
  63. package/dist/runtime/routes/entries.js +89 -0
  64. package/dist/runtime/routes/entries.js.map +1 -0
  65. package/dist/runtime/routes/history.d.ts +4 -0
  66. package/dist/runtime/routes/history.d.ts.map +1 -0
  67. package/dist/runtime/routes/history.js +56 -0
  68. package/dist/runtime/routes/history.js.map +1 -0
  69. package/dist/runtime/routes/mutate.d.ts +4 -0
  70. package/dist/runtime/routes/mutate.d.ts.map +1 -0
  71. package/dist/runtime/routes/mutate.js +35 -0
  72. package/dist/runtime/routes/mutate.js.map +1 -0
  73. package/dist/runtime/routes/schema.d.ts +3 -0
  74. package/dist/runtime/routes/schema.d.ts.map +1 -0
  75. package/dist/runtime/routes/schema.js +27 -0
  76. package/dist/runtime/routes/schema.js.map +1 -0
  77. package/dist/runtime/routes/studio-home.d.ts +3 -0
  78. package/dist/runtime/routes/studio-home.d.ts.map +1 -0
  79. package/dist/runtime/routes/studio-home.js +174 -0
  80. package/dist/runtime/routes/studio-home.js.map +1 -0
  81. package/dist/runtime/routes/theme-bootstrap.d.ts +4 -0
  82. package/dist/runtime/routes/theme-bootstrap.d.ts.map +1 -0
  83. package/dist/runtime/routes/theme-bootstrap.js +65 -0
  84. package/dist/runtime/routes/theme-bootstrap.js.map +1 -0
  85. package/dist/runtime/routes/theme-factory.d.ts +3 -0
  86. package/dist/runtime/routes/theme-factory.d.ts.map +1 -0
  87. package/dist/runtime/routes/theme-factory.js +142 -0
  88. package/dist/runtime/routes/theme-factory.js.map +1 -0
  89. package/dist/runtime/routes/upload.d.ts +3 -0
  90. package/dist/runtime/routes/upload.d.ts.map +1 -0
  91. package/dist/runtime/routes/upload.js +29 -0
  92. package/dist/runtime/routes/upload.js.map +1 -0
  93. package/dist/runtime/schema/infer-json-schema.d.ts +12 -0
  94. package/dist/runtime/schema/infer-json-schema.d.ts.map +1 -0
  95. package/dist/runtime/schema/infer-json-schema.js +75 -0
  96. package/dist/runtime/schema/infer-json-schema.js.map +1 -0
  97. package/dist/runtime/storage/filesystem-adapter.d.ts +29 -0
  98. package/dist/runtime/storage/filesystem-adapter.d.ts.map +1 -0
  99. package/dist/runtime/storage/filesystem-adapter.js +182 -0
  100. package/dist/runtime/storage/filesystem-adapter.js.map +1 -0
  101. package/dist/runtime/storage/filesystem-upload-handler.d.ts +11 -0
  102. package/dist/runtime/storage/filesystem-upload-handler.d.ts.map +1 -0
  103. package/dist/runtime/storage/filesystem-upload-handler.js +37 -0
  104. package/dist/runtime/storage/filesystem-upload-handler.js.map +1 -0
  105. package/dist/runtime/storage/in-memory-adapter.d.ts +24 -0
  106. package/dist/runtime/storage/in-memory-adapter.d.ts.map +1 -0
  107. package/dist/runtime/storage/in-memory-adapter.js +78 -0
  108. package/dist/runtime/storage/in-memory-adapter.js.map +1 -0
  109. package/dist/runtime/themes/preset-catalog.d.ts +9 -0
  110. package/dist/runtime/themes/preset-catalog.d.ts.map +1 -0
  111. package/dist/runtime/themes/preset-catalog.js +47 -0
  112. package/dist/runtime/themes/preset-catalog.js.map +1 -0
  113. package/dist/runtime/utils.d.ts +6 -0
  114. package/dist/runtime/utils.d.ts.map +1 -0
  115. package/dist/runtime/utils.js +29 -0
  116. package/dist/runtime/utils.js.map +1 -0
  117. package/dist/types.d.ts +28 -0
  118. package/dist/types.d.ts.map +1 -0
  119. package/dist/types.js +2 -0
  120. package/dist/types.js.map +1 -0
  121. package/dist/vite/virtual-config-plugin.d.ts +7 -0
  122. package/dist/vite/virtual-config-plugin.d.ts.map +1 -0
  123. package/dist/vite/virtual-config-plugin.js +25 -0
  124. package/dist/vite/virtual-config-plugin.js.map +1 -0
  125. package/package.json +35 -0
  126. package/static/cms/editor/config.js +6 -0
  127. package/static/cms/editor/guards.js +68 -0
  128. package/static/cms/editor/helpers.js +16 -0
  129. package/static/cms/editor/image-edit.js +148 -0
  130. package/static/cms/editor/image-utils.js +84 -0
  131. package/static/cms/editor/image.css +133 -0
  132. package/static/cms/editor/link-ui.css +143 -0
  133. package/static/cms/editor/linkify.js +55 -0
  134. package/static/cms/editor/panel.css +91 -0
  135. package/static/cms/editor/panel.js +64 -0
  136. package/static/cms/editor/save-queue.js +167 -0
  137. package/static/cms/editor/section-controls/activation.js +10 -0
  138. package/static/cms/editor/section-controls/api.js +88 -0
  139. package/static/cms/editor/section-controls/constants.js +24 -0
  140. package/static/cms/editor/section-controls/index.js +622 -0
  141. package/static/cms/editor/section-controls/model.js +76 -0
  142. package/static/cms/editor/section-controls/mutations.js +112 -0
  143. package/static/cms/editor/section-controls/page-context.js +34 -0
  144. package/static/cms/editor/section-controls/pickers.js +196 -0
  145. package/static/cms/editor/section-controls/reorder.js +92 -0
  146. package/static/cms/editor/section-controls/selection.js +54 -0
  147. package/static/cms/editor/section-controls/spacing-drag.js +83 -0
  148. package/static/cms/editor/section-controls/ui-elements.js +54 -0
  149. package/static/cms/editor/section-controls/utils.js +35 -0
  150. package/static/cms/editor/section-controls.css +349 -0
  151. package/static/cms/editor/section-controls.js +1 -0
  152. package/static/cms/editor/security.js +23 -0
  153. package/static/cms/editor/sync.js +64 -0
  154. package/static/cms/editor/text-edit.js +129 -0
  155. package/static/cms/editor/text-link-interactions.js +191 -0
  156. package/static/cms/editor/toast.css +50 -0
  157. package/static/cms/editor/toast.js +29 -0
  158. package/static/cms/editor/tokens-and-text.css +94 -0
  159. package/static/cms/editor/toolbar.css +261 -0
  160. package/static/cms/editor/toolbar.js +110 -0
  161. package/static/cms/editor.css +10 -0
  162. package/static/cms/editor.js +101 -0
  163. package/static/cms/studio.css +312 -0
@@ -0,0 +1,182 @@
1
+ import { mkdir, readFile, readdir, unlink, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ const COLLECTION_NAME_RE = /^[a-z][a-z0-9_-]*$/;
4
+ const HISTORY_LIMIT = 50;
5
+ function asObjectRecord(value) {
6
+ if (!value || typeof value !== "object" || Array.isArray(value))
7
+ return null;
8
+ return value;
9
+ }
10
+ function isHistoryEntry(value) {
11
+ if (!value || typeof value !== "object" || Array.isArray(value))
12
+ return false;
13
+ const obj = value;
14
+ return (typeof obj.ts === "number" &&
15
+ Number.isFinite(obj.ts) &&
16
+ typeof obj.action === "string" &&
17
+ "data" in obj);
18
+ }
19
+ export class FilesystemAdapter {
20
+ seedsRoot;
21
+ metaRoot;
22
+ constructor(options) {
23
+ this.seedsRoot = options?.seedsRoot ?? join(process.cwd(), "src", "content", "seeds");
24
+ this.metaRoot = options?.metaRoot ?? join(process.cwd(), ".astro-live-cms");
25
+ }
26
+ collectionDir(collection) {
27
+ return join(this.seedsRoot, collection);
28
+ }
29
+ revisionStorePath() {
30
+ return join(this.metaRoot, "revisions.json");
31
+ }
32
+ revisionMapKey(collection, id) {
33
+ return `${collection}::${id}`;
34
+ }
35
+ historyFilePath(collection, id) {
36
+ return join(this.metaRoot, "history", collection, `${id}.json`);
37
+ }
38
+ // --- Collections ---
39
+ async discoverCollections() {
40
+ try {
41
+ const entries = await readdir(this.seedsRoot, { withFileTypes: true });
42
+ return entries
43
+ .filter((e) => e.isDirectory() && COLLECTION_NAME_RE.test(e.name))
44
+ .map((e) => e.name)
45
+ .sort((a, b) => a.localeCompare(b));
46
+ }
47
+ catch {
48
+ return [];
49
+ }
50
+ }
51
+ async isKnownCollection(collection) {
52
+ if (!COLLECTION_NAME_RE.test(collection))
53
+ return false;
54
+ try {
55
+ const entries = await readdir(this.seedsRoot, { withFileTypes: true });
56
+ return entries.some((e) => e.isDirectory() && e.name === collection);
57
+ }
58
+ catch {
59
+ return false;
60
+ }
61
+ }
62
+ // --- Entries ---
63
+ async getEntry(collection, id) {
64
+ const filePath = join(this.collectionDir(collection), `${id}.json`);
65
+ try {
66
+ const raw = await readFile(filePath, "utf8");
67
+ const parsed = JSON.parse(raw);
68
+ const data = asObjectRecord(parsed);
69
+ if (!data)
70
+ return null;
71
+ return { id, data };
72
+ }
73
+ catch {
74
+ return null;
75
+ }
76
+ }
77
+ async listEntryIds(collection) {
78
+ try {
79
+ const files = await readdir(this.collectionDir(collection), { withFileTypes: true });
80
+ return files
81
+ .filter((item) => item.isFile() && item.name.endsWith(".json"))
82
+ .map((item) => item.name.slice(0, -".json".length))
83
+ .sort((a, b) => a.localeCompare(b));
84
+ }
85
+ catch {
86
+ return [];
87
+ }
88
+ }
89
+ async listEntries(collection) {
90
+ const ids = await this.listEntryIds(collection);
91
+ const entries = await Promise.all(ids.map((id) => this.getEntry(collection, id)));
92
+ return entries.filter((entry) => Boolean(entry));
93
+ }
94
+ async writeEntry(collection, id, data) {
95
+ const dir = this.collectionDir(collection);
96
+ await mkdir(dir, { recursive: true });
97
+ const filePath = join(dir, `${id}.json`);
98
+ await writeFile(filePath, `${JSON.stringify(data, null, 2)}\n`, "utf8");
99
+ }
100
+ async deleteEntry(collection, id) {
101
+ const filePath = join(this.collectionDir(collection), `${id}.json`);
102
+ try {
103
+ await unlink(filePath);
104
+ }
105
+ catch (error) {
106
+ const maybeErr = error;
107
+ if (maybeErr?.code === "ENOENT")
108
+ return;
109
+ throw error;
110
+ }
111
+ }
112
+ // --- Revisions ---
113
+ async readRevisionMap() {
114
+ const filePath = this.revisionStorePath();
115
+ try {
116
+ const raw = await readFile(filePath, "utf8");
117
+ const parsed = JSON.parse(raw);
118
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
119
+ return {};
120
+ const map = parsed;
121
+ const out = {};
122
+ Object.entries(map).forEach(([key, value]) => {
123
+ if (typeof value === "number" && Number.isInteger(value) && value >= 0) {
124
+ out[key] = value;
125
+ }
126
+ });
127
+ return out;
128
+ }
129
+ catch {
130
+ return {};
131
+ }
132
+ }
133
+ async writeRevisionMap(map) {
134
+ const filePath = this.revisionStorePath();
135
+ await mkdir(this.metaRoot, { recursive: true });
136
+ await writeFile(filePath, `${JSON.stringify(map, null, 2)}\n`, "utf8");
137
+ }
138
+ async getRevision(collection, id) {
139
+ const map = await this.readRevisionMap();
140
+ const value = map[this.revisionMapKey(collection, id)];
141
+ return typeof value === "number" && Number.isInteger(value) && value >= 0 ? value : 0;
142
+ }
143
+ async bumpRevision(collection, id) {
144
+ const map = await this.readRevisionMap();
145
+ const key = this.revisionMapKey(collection, id);
146
+ const current = typeof map[key] === "number" && Number.isInteger(map[key]) && map[key] >= 0
147
+ ? map[key]
148
+ : 0;
149
+ const next = current + 1;
150
+ map[key] = next;
151
+ await this.writeRevisionMap(map);
152
+ return next;
153
+ }
154
+ // --- History ---
155
+ async readHistoryFile(collection, id) {
156
+ const filePath = this.historyFilePath(collection, id);
157
+ try {
158
+ const raw = await readFile(filePath, "utf8");
159
+ const parsed = JSON.parse(raw);
160
+ if (!Array.isArray(parsed))
161
+ return [];
162
+ return parsed.filter(isHistoryEntry);
163
+ }
164
+ catch {
165
+ return [];
166
+ }
167
+ }
168
+ async writeHistoryFile(collection, id, entries) {
169
+ const filePath = this.historyFilePath(collection, id);
170
+ await mkdir(join(this.metaRoot, "history", collection), { recursive: true });
171
+ await writeFile(filePath, `${JSON.stringify(entries, null, 2)}\n`, "utf8");
172
+ }
173
+ async getHistory(collection, id) {
174
+ return this.readHistoryFile(collection, id);
175
+ }
176
+ async appendHistory(collection, id, entry) {
177
+ const current = await this.readHistoryFile(collection, id);
178
+ const next = [entry, ...current].slice(0, HISTORY_LIMIT);
179
+ await this.writeHistoryFile(collection, id, next);
180
+ }
181
+ }
182
+ //# sourceMappingURL=filesystem-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem-adapter.js","sourceRoot":"","sources":["../../../src/runtime/storage/filesystem-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { UploadHandler } from "../../types.js";
2
+ export declare class FilesystemUploadHandler implements UploadHandler {
3
+ private readonly uploadsDir;
4
+ constructor(options?: {
5
+ uploadsDir?: string;
6
+ });
7
+ upload(file: File): Promise<{
8
+ url: string;
9
+ }>;
10
+ }
11
+ //# sourceMappingURL=filesystem-upload-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem-upload-handler.d.ts","sourceRoot":"","sources":["../../../src/runtime/storage/filesystem-upload-handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAkBpD,qBAAa,uBAAwB,YAAW,aAAa;IAC3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;IAIvC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAkBnD"}
@@ -0,0 +1,37 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ const ALLOWED_TYPES = new Set([
4
+ "image/jpeg",
5
+ "image/png",
6
+ "image/webp",
7
+ "image/avif",
8
+ ]);
9
+ const MAX_SIZE = 10 * 1024 * 1024; // 10MB
10
+ function sanitizeFilename(name) {
11
+ return name
12
+ .replace(/[^a-zA-Z0-9._-]/g, "-")
13
+ .replace(/-+/g, "-")
14
+ .slice(0, 100);
15
+ }
16
+ export class FilesystemUploadHandler {
17
+ uploadsDir;
18
+ constructor(options) {
19
+ this.uploadsDir = options?.uploadsDir ?? join(process.cwd(), "public", "uploads");
20
+ }
21
+ async upload(file) {
22
+ if (!ALLOWED_TYPES.has(file.type)) {
23
+ throw new Error("File type not allowed");
24
+ }
25
+ if (file.size > MAX_SIZE) {
26
+ throw new Error("File too large (max 10MB)");
27
+ }
28
+ const timestamp = Date.now().toString(36);
29
+ const safeName = sanitizeFilename(file.name) || `upload-${timestamp}`;
30
+ const filename = `${timestamp}-${safeName}`;
31
+ await mkdir(this.uploadsDir, { recursive: true });
32
+ const buffer = Buffer.from(await file.arrayBuffer());
33
+ await writeFile(join(this.uploadsDir, filename), buffer);
34
+ return { url: `/uploads/${filename}` };
35
+ }
36
+ }
37
+ //# sourceMappingURL=filesystem-upload-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem-upload-handler.js","sourceRoot":"","sources":["../../../src/runtime/storage/filesystem-upload-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,YAAY;CACb,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AAE1C,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,IAAI;SACR,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC;SAChC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,OAAO,uBAAuB;IACjB,UAAU,CAAS;IAEpC,YAAY,OAAiC;QAC3C,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACpF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAU;QACrB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,UAAU,SAAS,EAAE,CAAC;QACtE,MAAM,QAAQ,GAAG,GAAG,SAAS,IAAI,QAAQ,EAAE,CAAC;QAE5C,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACrD,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QAEzD,OAAO,EAAE,GAAG,EAAE,YAAY,QAAQ,EAAE,EAAE,CAAC;IACzC,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ import type { EntryData, HistoryEntry, StorageAdapter } from "../../types.js";
2
+ export declare class InMemoryAdapter implements StorageAdapter {
3
+ private collections;
4
+ private revisions;
5
+ private history;
6
+ private revisionKey;
7
+ /** Seed initial data for testing or demo bootstrap. */
8
+ seed(collection: string, entries: Array<{
9
+ id: string;
10
+ data: Record<string, unknown>;
11
+ }>): void;
12
+ discoverCollections(): Promise<string[]>;
13
+ isKnownCollection(collection: string): Promise<boolean>;
14
+ getEntry(collection: string, id: string): Promise<EntryData | null>;
15
+ listEntryIds(collection: string): Promise<string[]>;
16
+ listEntries(collection: string): Promise<EntryData[]>;
17
+ writeEntry(collection: string, id: string, data: Record<string, unknown>): Promise<void>;
18
+ deleteEntry(collection: string, id: string): Promise<void>;
19
+ getRevision(collection: string, id: string): Promise<number>;
20
+ bumpRevision(collection: string, id: string): Promise<number>;
21
+ getHistory(collection: string, id: string): Promise<HistoryEntry[]>;
22
+ appendHistory(collection: string, id: string, entry: HistoryEntry): Promise<void>;
23
+ }
24
+ //# sourceMappingURL=in-memory-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-adapter.d.ts","sourceRoot":"","sources":["../../../src/runtime/storage/in-memory-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAI9E,qBAAa,eAAgB,YAAW,cAAc;IACpD,OAAO,CAAC,WAAW,CAA2D;IAC9E,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,OAAO,CAAqC;IAEpD,OAAO,CAAC,WAAW;IAInB,uDAAuD;IACvD,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,GAAG,IAAI;IAWvF,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIxC,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvD,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAMnE,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMnD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAQrD,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IASxF,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1D,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5D,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ7D,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAKnE,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAMxF"}
@@ -0,0 +1,78 @@
1
+ const HISTORY_LIMIT = 50;
2
+ export class InMemoryAdapter {
3
+ collections = new Map();
4
+ revisions = new Map();
5
+ history = new Map();
6
+ revisionKey(collection, id) {
7
+ return `${collection}::${id}`;
8
+ }
9
+ /** Seed initial data for testing or demo bootstrap. */
10
+ seed(collection, entries) {
11
+ let col = this.collections.get(collection);
12
+ if (!col) {
13
+ col = new Map();
14
+ this.collections.set(collection, col);
15
+ }
16
+ for (const entry of entries) {
17
+ col.set(entry.id, structuredClone(entry.data));
18
+ }
19
+ }
20
+ async discoverCollections() {
21
+ return [...this.collections.keys()].sort((a, b) => a.localeCompare(b));
22
+ }
23
+ async isKnownCollection(collection) {
24
+ return this.collections.has(collection);
25
+ }
26
+ async getEntry(collection, id) {
27
+ const data = this.collections.get(collection)?.get(id);
28
+ if (!data)
29
+ return null;
30
+ return { id, data: structuredClone(data) };
31
+ }
32
+ async listEntryIds(collection) {
33
+ const col = this.collections.get(collection);
34
+ if (!col)
35
+ return [];
36
+ return [...col.keys()].sort((a, b) => a.localeCompare(b));
37
+ }
38
+ async listEntries(collection) {
39
+ const col = this.collections.get(collection);
40
+ if (!col)
41
+ return [];
42
+ return [...col.entries()]
43
+ .sort(([a], [b]) => a.localeCompare(b))
44
+ .map(([id, data]) => ({ id, data: structuredClone(data) }));
45
+ }
46
+ async writeEntry(collection, id, data) {
47
+ let col = this.collections.get(collection);
48
+ if (!col) {
49
+ col = new Map();
50
+ this.collections.set(collection, col);
51
+ }
52
+ col.set(id, structuredClone(data));
53
+ }
54
+ async deleteEntry(collection, id) {
55
+ this.collections.get(collection)?.delete(id);
56
+ }
57
+ async getRevision(collection, id) {
58
+ return this.revisions.get(this.revisionKey(collection, id)) ?? 0;
59
+ }
60
+ async bumpRevision(collection, id) {
61
+ const key = this.revisionKey(collection, id);
62
+ const current = this.revisions.get(key) ?? 0;
63
+ const next = current + 1;
64
+ this.revisions.set(key, next);
65
+ return next;
66
+ }
67
+ async getHistory(collection, id) {
68
+ const entries = this.history.get(this.revisionKey(collection, id));
69
+ return entries ? structuredClone(entries) : [];
70
+ }
71
+ async appendHistory(collection, id, entry) {
72
+ const key = this.revisionKey(collection, id);
73
+ const current = this.history.get(key) ?? [];
74
+ const next = [structuredClone(entry), ...current].slice(0, HISTORY_LIMIT);
75
+ this.history.set(key, next);
76
+ }
77
+ }
78
+ //# sourceMappingURL=in-memory-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-adapter.js","sourceRoot":"","sources":["../../../src/runtime/storage/in-memory-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type ThemePresetSummary = {
2
+ themeId: string;
3
+ label: string;
4
+ description: string;
5
+ thumbnail: string;
6
+ };
7
+ export declare const themePresetCatalog: ThemePresetSummary[];
8
+ export declare function isKnownThemePreset(themeId: string): boolean;
9
+ //# sourceMappingURL=preset-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset-catalog.d.ts","sourceRoot":"","sources":["../../../src/runtime/themes/preset-catalog.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAqBF,eAAO,MAAM,kBAAkB,EAAE,kBAAkB,EAyBlD,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE3D"}
@@ -0,0 +1,47 @@
1
+ function svgThumbnail(label, start, end) {
2
+ const svg = [
3
+ "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 800 500'>",
4
+ "<defs>",
5
+ `<linearGradient id='g' x1='0%' y1='0%' x2='100%' y2='100%'>`,
6
+ `<stop offset='0%' stop-color='${start}'/>`,
7
+ `<stop offset='100%' stop-color='${end}'/>`,
8
+ "</linearGradient>",
9
+ "</defs>",
10
+ "<rect width='800' height='500' fill='url(#g)'/>",
11
+ "<rect x='56' y='62' width='688' height='376' rx='18' fill='rgba(255,255,255,0.12)' stroke='rgba(255,255,255,0.45)'/>",
12
+ `<text x='90' y='180' fill='white' font-family='ui-sans-serif,Segoe UI,sans-serif' font-size='44' font-weight='700'>${label}</text>`,
13
+ "<text x='90' y='235' fill='rgba(255,255,255,0.88)' font-family='ui-sans-serif,Segoe UI,sans-serif' font-size='22'>Starter-ready preset</text>",
14
+ "</svg>",
15
+ ].join("");
16
+ return `data:image/svg+xml,${encodeURIComponent(svg)}`;
17
+ }
18
+ export const themePresetCatalog = [
19
+ {
20
+ themeId: "astro-starter-blog-template",
21
+ label: "Astro Starter Blog",
22
+ description: "Starter preset aligned with the Astro starter blog template structure.",
23
+ thumbnail: svgThumbnail("Astro Starter Blog", "#1f3a8a", "#0f766e"),
24
+ },
25
+ {
26
+ themeId: "diamondistic",
27
+ label: "Diamondistic",
28
+ description: "Rich editorial theme with luxury typography and warm tones.",
29
+ thumbnail: "/themes/diamondistic/cover.svg",
30
+ },
31
+ {
32
+ themeId: "lexington",
33
+ label: "Lexington",
34
+ description: "Classic professional theme with restrained spacing and earthy palette.",
35
+ thumbnail: "/themes/lexington/cover.svg",
36
+ },
37
+ {
38
+ themeId: "cosmic",
39
+ label: "Cosmic",
40
+ description: "Bold modern theme with electric accents and developer-forward aesthetic.",
41
+ thumbnail: "/themes/cosmic/cover.svg",
42
+ },
43
+ ];
44
+ export function isKnownThemePreset(themeId) {
45
+ return themePresetCatalog.some((preset) => preset.themeId === themeId);
46
+ }
47
+ //# sourceMappingURL=preset-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset-catalog.js","sourceRoot":"","sources":["../../../src/runtime/themes/preset-catalog.ts"],"names":[],"mappings":"AAOA,SAAS,YAAY,CAAC,KAAa,EAAE,KAAa,EAAE,GAAW;IAC7D,MAAM,GAAG,GAAG;QACV,gEAAgE;QAChE,QAAQ;QACR,6DAA6D;QAC7D,iCAAiC,KAAK,KAAK;QAC3C,mCAAmC,GAAG,KAAK;QAC3C,mBAAmB;QACnB,SAAS;QACT,iDAAiD;QACjD,sHAAsH;QACtH,sHAAsH,KAAK,SAAS;QACpI,+IAA+I;QAC/I,QAAQ;KACT,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEX,OAAO,sBAAsB,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAyB;IACtD;QACE,OAAO,EAAE,6BAA6B;QACtC,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,wEAAwE;QACrF,SAAS,EAAE,YAAY,CAAC,oBAAoB,EAAE,SAAS,EAAE,SAAS,CAAC;KACpE;IACD;QACE,OAAO,EAAE,cAAc;QACvB,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,6DAA6D;QAC1E,SAAS,EAAE,gCAAgC;KAC5C;IACD;QACE,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,wEAAwE;QACrF,SAAS,EAAE,6BAA6B;KACzC;IACD;QACE,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,0EAA0E;QACvF,SAAS,EAAE,0BAA0B;KACtC;CACF,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Shared deep-value helper used by both markers/bind and mutation engine.
3
+ */
4
+ /** Set a deeply nested value by dot-path. Mutates `obj` in place. */
5
+ export declare function setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void;
6
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/runtime/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,qEAAqE;AACrE,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,GACb,IAAI,CAmBN"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Shared deep-value helper used by both markers/bind and mutation engine.
3
+ */
4
+ const FORBIDDEN_KEYS = new Set(["__proto__", "prototype", "constructor"]);
5
+ function assertSafeKey(key) {
6
+ if (FORBIDDEN_KEYS.has(key)) {
7
+ throw new Error(`Forbidden key in path: ${key}`);
8
+ }
9
+ }
10
+ /** Set a deeply nested value by dot-path. Mutates `obj` in place. */
11
+ export function setNestedValue(obj, path, value) {
12
+ const keys = path.split(".");
13
+ if (keys.length === 0)
14
+ throw new Error("Invalid field path");
15
+ let current = obj;
16
+ for (let i = 0; i < keys.length - 1; i++) {
17
+ const key = keys[i];
18
+ assertSafeKey(key);
19
+ const next = current[key];
20
+ if (typeof next !== "object" || next === null) {
21
+ current[key] = /^\d+$/.test(keys[i + 1]) ? [] : {};
22
+ }
23
+ current = current[key];
24
+ }
25
+ const last = keys[keys.length - 1];
26
+ assertSafeKey(last);
27
+ current[last] = value;
28
+ }
29
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/runtime/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;AAE1E,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,cAAc,CAC5B,GAA4B,EAC5B,IAAY,EACZ,KAAc;IAEd,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC7D,IAAI,OAAO,GAA4B,GAAG,CAAC;IAE3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,aAAa,CAAC,GAAG,CAAC,CAAC;QAEnB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,GAAG,CAA4B,CAAC;IACpD,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnC,aAAa,CAAC,IAAI,CAAC,CAAC;IACpB,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;AACxB,CAAC"}
@@ -0,0 +1,28 @@
1
+ export type EntryData = {
2
+ id: string;
3
+ data: Record<string, unknown>;
4
+ };
5
+ export type HistoryEntry = {
6
+ ts: number;
7
+ data: unknown;
8
+ action: string;
9
+ };
10
+ export interface StorageAdapter {
11
+ discoverCollections(): Promise<string[]>;
12
+ isKnownCollection(collection: string): Promise<boolean>;
13
+ getEntry(collection: string, id: string): Promise<EntryData | null>;
14
+ listEntryIds(collection: string): Promise<string[]>;
15
+ listEntries(collection: string): Promise<EntryData[]>;
16
+ writeEntry(collection: string, id: string, data: Record<string, unknown>): Promise<void>;
17
+ deleteEntry(collection: string, id: string): Promise<void>;
18
+ getRevision(collection: string, id: string): Promise<number>;
19
+ bumpRevision(collection: string, id: string): Promise<number>;
20
+ getHistory(collection: string, id: string): Promise<HistoryEntry[]>;
21
+ appendHistory(collection: string, id: string, entry: HistoryEntry): Promise<void>;
22
+ }
23
+ export interface UploadHandler {
24
+ upload(file: File): Promise<{
25
+ url: string;
26
+ }>;
27
+ }
28
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AACtE,MAAM,MAAM,YAAY,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IACpE,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACtD,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzF,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7D,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9D,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACpE,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnF;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9C"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { Plugin } from "vite";
2
+ /**
3
+ * SSR-only virtual module per ADR-002.
4
+ * Resolves `virtual:astro-live-cms/config` to re-export the user's live config.
5
+ */
6
+ export declare function virtualConfigPlugin(resolvedConfigPath: string): Plugin;
7
+ //# sourceMappingURL=virtual-config-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-config-plugin.d.ts","sourceRoot":"","sources":["../../src/vite/virtual-config-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,kBAAkB,EAAE,MAAM,GAAG,MAAM,CAiBtE"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * SSR-only virtual module per ADR-002.
3
+ * Resolves `virtual:astro-live-cms/config` to re-export the user's live config.
4
+ */
5
+ export function virtualConfigPlugin(resolvedConfigPath) {
6
+ const virtualId = "virtual:astro-live-cms/config";
7
+ const resolvedVirtualId = `\0${virtualId}`;
8
+ return {
9
+ name: "astro-live-cms-virtual-config",
10
+ resolveId(id) {
11
+ // Vite 7 environment gating per ADR-002
12
+ if (this.environment?.name !== "ssr")
13
+ return null;
14
+ if (id === virtualId)
15
+ return resolvedVirtualId;
16
+ return null;
17
+ },
18
+ load(id) {
19
+ if (id !== resolvedVirtualId)
20
+ return null;
21
+ return `export * from '${resolvedConfigPath}';`;
22
+ },
23
+ };
24
+ }
25
+ //# sourceMappingURL=virtual-config-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-config-plugin.js","sourceRoot":"","sources":["../../src/vite/virtual-config-plugin.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,kBAA0B;IAC5D,MAAM,SAAS,GAAG,+BAA+B,CAAC;IAClD,MAAM,iBAAiB,GAAG,KAAK,SAAS,EAAE,CAAC;IAE3C,OAAO;QACL,IAAI,EAAE,+BAA+B;QACrC,SAAS,CAAC,EAAE;YACV,wCAAwC;YACxC,IAAK,IAAuD,CAAC,WAAW,EAAE,IAAI,KAAK,KAAK;gBAAE,OAAO,IAAI,CAAC;YACtG,IAAI,EAAE,KAAK,SAAS;gBAAE,OAAO,iBAAiB,CAAC;YAC/C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,EAAE;YACL,IAAI,EAAE,KAAK,iBAAiB;gBAAE,OAAO,IAAI,CAAC;YAC1C,OAAO,kBAAkB,kBAAkB,IAAI,CAAC;QAClD,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@astro-live-cms/core",
3
+ "version": "0.2.0",
4
+ "type": "module",
5
+ "description": "Platform-neutral core for Astro Live CMS: StorageAdapter interface, mutation engine, API routes, studio UI, inline editor.",
6
+ "license": "MIT",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./runtime": {
15
+ "types": "./dist/runtime/index.d.ts",
16
+ "import": "./dist/runtime/index.js"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "static"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsc -p tsconfig.build.json",
25
+ "typecheck": "tsc -p tsconfig.json",
26
+ "clean": "rm -rf dist"
27
+ },
28
+ "peerDependencies": {
29
+ "astro": "^5.0.0 || ^6.0.0-beta.0"
30
+ },
31
+ "devDependencies": {
32
+ "@types/node": "^24.3.0",
33
+ "typescript": "^5.9.3"
34
+ }
35
+ }
@@ -0,0 +1,6 @@
1
+ /** Runtime config injected by the integration bootstrap script. */
2
+ const defaults = { mountPath: '/admin', apiBasePath: '/api/cms' };
3
+ const cfg = (typeof window !== 'undefined' && window.__LIVE_CMS__) || defaults;
4
+
5
+ export const MOUNT_PATH = cfg.mountPath || defaults.mountPath;
6
+ export const API_BASE = cfg.apiBasePath || defaults.apiBasePath;