@blinkk/root-cms 3.1.2 → 3.1.4

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 (136) hide show
  1. package/dist/app.js +1 -4
  2. package/dist/chunk-MYN76V3L.js +764 -0
  3. package/dist/{chunk-4VZTYUQ7.js → chunk-NC3CRIFA.js} +191 -13
  4. package/dist/core/ai-tools.d.ts +82 -42
  5. package/dist/core/ai.d.ts +54 -218
  6. package/dist/core/plugin.d.ts +10 -4
  7. package/dist/functions.js +1 -2
  8. package/dist/plugin.js +42 -208
  9. package/dist/shared/ai/models.d.ts +110 -0
  10. package/dist/shared/ai/prompt-utils.d.ts +59 -0
  11. package/dist/ui/AIPage-4W4MFELY.js +1 -0
  12. package/dist/ui/{AssetsPage-KLGNE6D6.js → AssetsPage-QUL2NBWK.js} +1 -1
  13. package/dist/ui/CollectionPage-7VU6SUUP.js +1 -0
  14. package/dist/ui/ComparePage-DCP5QHDE.js +1 -0
  15. package/dist/ui/DataPage-TUVFBALT.js +1 -0
  16. package/dist/ui/DataSourcePage-YE2ZOHYI.js +1 -0
  17. package/dist/ui/DocTranslationsPage-3ILTQOP2.js +1 -0
  18. package/dist/ui/DocumentPage-JFQ3Y2GH.js +1 -0
  19. package/dist/ui/EditDataSourcePage-WHPZDMD4.js +1 -0
  20. package/dist/ui/EditReleasePage-QKWHIURV.js +1 -0
  21. package/dist/ui/EmbeddedAIPage-SQLOV4IT.js +1 -0
  22. package/dist/ui/{EmbeddedDocumentPage-4TLMCDSO.js → EmbeddedDocumentPage-6FYHUHTE.js} +1 -1
  23. package/dist/ui/{ImageEditorDialog-GGS4VFEA.js → ImageEditorDialog-Q44YTLB5.js} +1 -1
  24. package/dist/ui/LogsPage-RC5O722W.js +1 -0
  25. package/dist/ui/NewDataSourcePage-QXW54CHQ.js +1 -0
  26. package/dist/ui/NewReleasePage-TKYWVTOH.js +1 -0
  27. package/dist/ui/{NotFoundPage-A6OCYREA.js → NotFoundPage-RMNPVSD3.js} +1 -1
  28. package/dist/ui/{ProjectPage-UHRXNN7O.js → ProjectPage-VY4EJX6J.js} +1 -1
  29. package/dist/ui/ReleasePage-VZAL4KUI.js +1 -0
  30. package/dist/ui/ReleasesPage-A4BLUNJE.js +1 -0
  31. package/dist/ui/SettingsPage-MP3YHQDP.js +1 -0
  32. package/dist/ui/{SidebarToolsPage-VXVRZ2C3.js → SidebarToolsPage-S5DMIEQ6.js} +1 -1
  33. package/dist/ui/{TaskPage-LDPRN3G6.js → TaskPage-LCBDMA4I.js} +1 -1
  34. package/dist/ui/TasksPage-72KVSUQY.js +1 -0
  35. package/dist/ui/TranslationsArbPage-B7TIRREV.js +2 -0
  36. package/dist/ui/TranslationsEditPage-VQG4YHA6.js +1 -0
  37. package/dist/ui/{TranslationsPage-674JU6L4.js → TranslationsPage-6VCVMNXI.js} +1 -1
  38. package/dist/ui/ai-tools-7S4URTMT.js +1 -0
  39. package/dist/ui/chunk-2PDMFZBF.js +1 -0
  40. package/dist/ui/{chunk-SKQECSUR.js → chunk-3WQCVKK4.js} +1 -1
  41. package/dist/ui/{chunk-WMICEDOT.js → chunk-4N6CPIOQ.js} +1 -1
  42. package/dist/ui/{chunk-NJMNOITA.js → chunk-5SY2SVEX.js} +1 -1
  43. package/dist/ui/chunk-62VPTZJL.js +1 -0
  44. package/dist/ui/{chunk-GT5EQSEX.js → chunk-6P75AZ3B.js} +1 -1
  45. package/dist/ui/{chunk-CAY5NM4Z.js → chunk-74OB6FM4.js} +1 -1
  46. package/dist/ui/{chunk-XWX2622O.js → chunk-76PG55CM.js} +1 -1
  47. package/dist/ui/chunk-AAR7DBEN.js +110 -0
  48. package/dist/ui/{chunk-JS6TK4OP.js → chunk-ATTW36EM.js} +1 -1
  49. package/dist/ui/chunk-AZ2SK2ZK.js +1 -0
  50. package/dist/ui/chunk-CSUKZZK5.js +1 -0
  51. package/dist/ui/chunk-DZYYWCHX.js +3 -0
  52. package/dist/ui/{chunk-NSOTG64N.js → chunk-EIMRPYCD.js} +1 -1
  53. package/dist/ui/{chunk-HARRKJFZ.js → chunk-ELKXEMOU.js} +1 -1
  54. package/dist/ui/{chunk-LROR6N3B.js → chunk-ETPZ3TXX.js} +2 -2
  55. package/dist/ui/{chunk-LROR6N3B.js.LEGAL.txt → chunk-ETPZ3TXX.js.LEGAL.txt} +1 -0
  56. package/dist/ui/{chunk-J5E457OI.js → chunk-EYVQCOAD.js} +1 -1
  57. package/dist/ui/{chunk-Q7IU4QCY.js → chunk-F4F5MH7A.js} +1 -1
  58. package/dist/ui/chunk-FF4CLAZS.js +1 -0
  59. package/dist/ui/{chunk-W6LP22IK.js → chunk-GCMX5V3P.js} +1 -1
  60. package/dist/ui/{chunk-FJLNXXE3.js → chunk-H3PYPGNR.js} +1 -1
  61. package/dist/ui/{chunk-WFQU7V3W.js → chunk-HVYNDEA7.js} +1 -1
  62. package/dist/ui/{chunk-TVYAZN2Q.js → chunk-IMXZTYAA.js} +1 -1
  63. package/dist/ui/{chunk-YXSXWFLZ.js → chunk-J5KDO4RM.js} +1 -1
  64. package/dist/ui/chunk-JSWRHHTZ.js +1 -0
  65. package/dist/ui/{chunk-MSYTAJBV.js → chunk-K3UM5OQF.js} +1 -1
  66. package/dist/ui/{chunk-BW2MKGNP.js → chunk-KBJ4AK5O.js} +1 -1
  67. package/dist/ui/{chunk-4FGASIIX.js → chunk-L3O3CLWO.js} +1 -1
  68. package/dist/ui/{chunk-JTIQBW33.js → chunk-LC6WLVRS.js} +1 -1
  69. package/dist/ui/{chunk-VJUMFJIX.js → chunk-MAZJRNAL.js} +1 -1
  70. package/dist/ui/{chunk-3E6CASIN.js → chunk-MYKJ6VAM.js} +1 -1
  71. package/dist/ui/chunk-NEA3XU6N.js +19 -0
  72. package/dist/ui/{chunk-UUVAD4U4.js → chunk-PR7NB5VK.js} +1 -1
  73. package/dist/ui/{chunk-QF3GPZTI.js → chunk-QHOZXW7Y.js} +1 -1
  74. package/dist/ui/chunk-RN4XVVWD.js +1 -0
  75. package/dist/ui/{chunk-PTPYMVFW.js → chunk-SLLTYDVX.js} +1 -1
  76. package/dist/ui/chunk-SWTNOWNE.js +1 -0
  77. package/dist/ui/{chunk-JBHRZ4EX.js → chunk-SYDHFYRC.js} +1 -1
  78. package/dist/ui/{chunk-ZMS6NIGG.js → chunk-UHK5N75L.js} +1 -1
  79. package/dist/ui/chunk-V3G3554T.js +31 -0
  80. package/dist/ui/chunk-VB5VMEN7.js +1 -0
  81. package/dist/ui/{chunk-2EPQJUGM.js → chunk-VRRRFAIV.js} +1 -1
  82. package/dist/ui/{chunk-4ALFT4ES.js → chunk-W2ZAVRAT.js} +56 -56
  83. package/dist/ui/{chunk-P2Z66DHV.js → chunk-W3ICOHMF.js} +1 -1
  84. package/dist/ui/{chunk-ENQKSLGJ.js → chunk-WAT22UHZ.js} +1 -1
  85. package/dist/ui/chunk-WN7HUDGY.js +1 -0
  86. package/dist/ui/{chunk-BUNR5EU3.js → chunk-WS37MDM3.js} +1 -1
  87. package/dist/ui/chunk-XACLTYBB.js +5 -0
  88. package/dist/ui/chunk-XJUQOX4E.js +1 -0
  89. package/dist/ui/{chunk-QHJOTXYB.js → chunk-XM35ZJBQ.js} +1 -1
  90. package/dist/ui/{chunk-VD6G5NV4.js → chunk-XOWWPE7X.js} +12 -12
  91. package/dist/ui/chunk-YV5SGR24.js +1 -0
  92. package/dist/ui/ui.css +1 -1
  93. package/dist/ui/ui.js +1 -1
  94. package/package.json +3 -3
  95. package/dist/chunk-AJDMNTZQ.js +0 -187
  96. package/dist/chunk-X5CNR4CK.js +0 -1411
  97. package/dist/ui/AIPage-2N5UYBRX.js +0 -1
  98. package/dist/ui/CollectionPage-D7IG6526.js +0 -1
  99. package/dist/ui/ComparePage-726NIJW5.js +0 -1
  100. package/dist/ui/DataPage-YMSQCIVK.js +0 -1
  101. package/dist/ui/DataSourcePage-7VPFUG3K.js +0 -1
  102. package/dist/ui/DocTranslationsPage-FO7O76VK.js +0 -1
  103. package/dist/ui/DocumentPage-M7SJ4ITQ.js +0 -1
  104. package/dist/ui/EditDataSourcePage-Y7YK6IWT.js +0 -1
  105. package/dist/ui/EditReleasePage-XZ4RHHRT.js +0 -1
  106. package/dist/ui/EmbeddedAIPage-RJOUIPF2.js +0 -1
  107. package/dist/ui/LogsPage-IGDDZGEI.js +0 -1
  108. package/dist/ui/NewDataSourcePage-YUPRHL7F.js +0 -1
  109. package/dist/ui/NewReleasePage-6HHLYOQP.js +0 -1
  110. package/dist/ui/ReleasePage-V2JMPWX7.js +0 -1
  111. package/dist/ui/ReleasesPage-SCR4SVKN.js +0 -1
  112. package/dist/ui/SettingsPage-5XKHPG6K.js +0 -1
  113. package/dist/ui/TasksPage-DIXUWYXM.js +0 -1
  114. package/dist/ui/TranslationsArbPage-QPD3ZBT4.js +0 -2
  115. package/dist/ui/TranslationsEditPage-475Z7UPC.js +0 -1
  116. package/dist/ui/ai-tools-4DWMFQS6.js +0 -1
  117. package/dist/ui/chunk-2RAVKX2Z.js +0 -19
  118. package/dist/ui/chunk-2S5HMST6.js +0 -1
  119. package/dist/ui/chunk-344GZOGG.js +0 -84
  120. package/dist/ui/chunk-4ISFTE2G.js +0 -5
  121. package/dist/ui/chunk-AGFPVTBA.js +0 -1
  122. package/dist/ui/chunk-D3UIZHRK.js +0 -1
  123. package/dist/ui/chunk-HO3W4RVG.js +0 -1
  124. package/dist/ui/chunk-KRNQ6L35.js +0 -1
  125. package/dist/ui/chunk-N3JSLTMV.js +0 -1
  126. package/dist/ui/chunk-NWHGT476.js +0 -1
  127. package/dist/ui/chunk-RHAJNURN.js +0 -1
  128. package/dist/ui/chunk-SENZVSVZ.js +0 -1
  129. package/dist/ui/chunk-TOGLZDK3.js +0 -1
  130. package/dist/ui/chunk-TPJCPCRR.js +0 -1
  131. package/dist/ui/chunk-XMESZUC5.js +0 -1
  132. package/dist/ui/chunk-YMBBWVBB.js +0 -3
  133. /package/dist/ui/{ImageEditorDialog-GGS4VFEA.js.LEGAL.txt → ImageEditorDialog-Q44YTLB5.js.LEGAL.txt} +0 -0
  134. /package/dist/ui/{chunk-NJMNOITA.js.LEGAL.txt → chunk-5SY2SVEX.js.LEGAL.txt} +0 -0
  135. /package/dist/ui/{chunk-4ALFT4ES.js.LEGAL.txt → chunk-W2ZAVRAT.js.LEGAL.txt} +0 -0
  136. /package/dist/ui/{chunk-VD6G5NV4.js.LEGAL.txt → chunk-XOWWPE7X.js.LEGAL.txt} +0 -0
@@ -1,187 +0,0 @@
1
- import {
2
- SearchIndexService
3
- } from "./chunk-4VZTYUQ7.js";
4
- import {
5
- RootCMSClient,
6
- getCmsPlugin
7
- } from "./chunk-AFBSITEO.js";
8
-
9
- // core/cron.ts
10
- import { Timestamp as Timestamp2 } from "firebase-admin/firestore";
11
-
12
- // core/versions.ts
13
- import fs from "node:fs";
14
- import path from "node:path";
15
- import { Timestamp } from "firebase-admin/firestore";
16
- import glob from "tiny-glob";
17
- var DOCUMENT_SAVE_OFFSET = 5 * 60 * 1e3;
18
- var VersionsService = class {
19
- constructor(rootConfig) {
20
- this.rootConfig = rootConfig;
21
- const cmsPlugin = getCmsPlugin(rootConfig);
22
- const cmsPluginOptions = cmsPlugin.getConfig();
23
- const projectId = cmsPluginOptions.id || "default";
24
- this.projectId = projectId;
25
- this.db = cmsPlugin.getFirestore();
26
- }
27
- /**
28
- * Saves a version of all documents that have been edited since the last run.
29
- */
30
- async saveVersions() {
31
- const lastRun = await this.getLastRun();
32
- const lastRunWithOffset = lastRun === 0 ? lastRun : lastRun - DOCUMENT_SAVE_OFFSET;
33
- const changedDocs = await this.getDocsModifiedAfter(lastRunWithOffset);
34
- const now = Timestamp.now().toMillis();
35
- const versions = changedDocs.filter((doc) => {
36
- const modifiedAt = doc.sys.modifiedAt.toMillis();
37
- if (modifiedAt > now - DOCUMENT_SAVE_OFFSET) {
38
- return false;
39
- }
40
- const publishedAt = doc.sys.publishedAt?.toMillis?.();
41
- if (publishedAt && Math.abs(publishedAt - modifiedAt) < 5e3) {
42
- return false;
43
- }
44
- return true;
45
- });
46
- if (versions.length > 0) {
47
- this.saveVersionsToFirestore(versions);
48
- }
49
- this.saveLastRun(now);
50
- }
51
- async saveVersionsToFirestore(versions) {
52
- const batch = this.db.batch();
53
- versions.forEach((version) => {
54
- if (!version.collection || !version.slug || !version.sys?.modifiedAt) {
55
- return;
56
- }
57
- const modifiedAtMillis = version.sys.modifiedAt.toMillis();
58
- const versionPath = `Projects/${this.projectId}/Collections/${version.collection}/Drafts/${version.slug}/Versions/${modifiedAtMillis}`;
59
- console.log(versionPath);
60
- const versionRef = this.db.doc(versionPath);
61
- batch.set(versionRef, version);
62
- });
63
- await batch.commit();
64
- console.log(`versions: saved ${versions.length} versions`);
65
- }
66
- /**
67
- * Returns the last time (in millis) saveVersions() was run, or 0 if has
68
- * never been run.
69
- */
70
- async getLastRun() {
71
- const projectDocRef = this.db.collection("Projects").doc(this.projectId);
72
- const projectDoc = await projectDocRef.get();
73
- if (projectDoc.exists) {
74
- const data = projectDoc.data() || {};
75
- const ts = data.versionsLastRun;
76
- if (ts) {
77
- return ts.toMillis();
78
- }
79
- }
80
- return 0;
81
- }
82
- /**
83
- * Saves {versionLastRun: <timestamp>} to the Projects/<projectId> doc.
84
- */
85
- async saveLastRun(millis) {
86
- const ts = Timestamp.fromMillis(millis);
87
- const projectDocRef = this.db.collection("Projects").doc(this.projectId);
88
- await projectDocRef.set({ versionsLastRun: ts }, { merge: true });
89
- }
90
- /**
91
- * Returns a list of all docs that were edited after a certain time.
92
- */
93
- async getDocsModifiedAfter(millis) {
94
- const ts = Timestamp.fromMillis(millis);
95
- const results = [];
96
- const collectionIds = await this.listCollections();
97
- for (const collectionId of collectionIds) {
98
- const collectionPath = `Projects/${this.projectId}/Collections/${collectionId}/Drafts`;
99
- const query = this.db.collection(collectionPath).where("sys.modifiedAt", ">=", ts);
100
- const querySnapshot = await query.get();
101
- querySnapshot.forEach((doc) => {
102
- results.push(doc.data());
103
- });
104
- }
105
- return results;
106
- }
107
- /**
108
- * Returns a list of collection ids for the Root project.
109
- */
110
- async listCollections() {
111
- const collectionsDir = path.join(this.rootConfig.rootDir, "collections");
112
- if (!fs.existsSync(collectionsDir)) {
113
- return [];
114
- }
115
- const collectionIds = [];
116
- const collectionFileNames = await glob("*.schema.ts", {
117
- cwd: collectionsDir
118
- });
119
- collectionFileNames.forEach((filename) => {
120
- collectionIds.push(filename.slice(0, -10));
121
- });
122
- return collectionIds;
123
- }
124
- };
125
-
126
- // core/cron.ts
127
- var SEARCH_INDEX_MIN_INTERVAL_MS = 5 * 60 * 1e3;
128
- async function runCronJobs(rootConfig, options = {}) {
129
- await Promise.all([
130
- runCronJob("publishScheduledDocs", runPublishScheduledDocs, rootConfig),
131
- runCronJob(
132
- "syncScheduledDataSources",
133
- runSyncScheduledDataSources,
134
- rootConfig
135
- ),
136
- runCronJob("saveVersions", runSaveVersions, rootConfig),
137
- runCronJob(
138
- "incrementalSearchIndex",
139
- runIncrementalSearchIndex,
140
- rootConfig,
141
- options.loadSchema
142
- )
143
- ]);
144
- }
145
- async function runCronJob(name, fn, ...args) {
146
- try {
147
- await fn(...args);
148
- } catch (err) {
149
- console.log(`cron failed: ${name}`);
150
- console.error(String(err.stack || err));
151
- throw err;
152
- }
153
- }
154
- async function runPublishScheduledDocs(rootConfig) {
155
- const cmsClient = new RootCMSClient(rootConfig);
156
- await cmsClient.publishScheduledDocs();
157
- await cmsClient.publishScheduledReleases();
158
- }
159
- async function runSyncScheduledDataSources(rootConfig) {
160
- const cmsClient = new RootCMSClient(rootConfig);
161
- await cmsClient.syncScheduledDataSources();
162
- }
163
- async function runSaveVersions(rootConfig) {
164
- const service = new VersionsService(rootConfig);
165
- await service.saveVersions();
166
- }
167
- async function runIncrementalSearchIndex(rootConfig, loadSchema) {
168
- const service = new SearchIndexService(rootConfig, loadSchema);
169
- const status = await service.getStatus();
170
- if (status.lastRun !== null) {
171
- const elapsed = Date.now() - status.lastRun;
172
- if (elapsed < SEARCH_INDEX_MIN_INTERVAL_MS) {
173
- return;
174
- }
175
- const hasChanges = await service.hasChangesSince(
176
- Timestamp2.fromMillis(status.lastRun)
177
- );
178
- if (!hasChanges) {
179
- return;
180
- }
181
- }
182
- await service.rebuildIndex({ force: false });
183
- }
184
-
185
- export {
186
- runCronJobs
187
- };