@ketvietlab/ketsuite 0.1.3 → 0.1.5

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 (191) hide show
  1. package/dist/cli.js +1 -1
  2. package/dist/deployment.d.ts.map +1 -1
  3. package/dist/deployment.js +3 -0
  4. package/dist/deployment.js.map +1 -1
  5. package/dist/index.d.ts +7 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +6 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/modules/account_staff_channel/channel-routes.d.ts.map +1 -1
  10. package/dist/modules/account_staff_channel/channel-routes.js +1 -12
  11. package/dist/modules/account_staff_channel/channel-routes.js.map +1 -1
  12. package/dist/modules/attendance/channel-routes.d.ts.map +1 -1
  13. package/dist/modules/attendance/channel-routes.js +1 -12
  14. package/dist/modules/attendance/channel-routes.js.map +1 -1
  15. package/dist/modules/backend/design/client/table-selection.d.mts +3 -3
  16. package/dist/modules/backend/design/client/table-selection.d.mts.map +1 -1
  17. package/dist/modules/backend/design/client/table-selection.mjs +1 -1
  18. package/dist/modules/backend/design/client/table-selection.mjs.map +3 -3
  19. package/dist/modules/backend/design/content.css +43 -0
  20. package/dist/modules/backend/design/forms.css +22 -0
  21. package/dist/modules/backend/design/responsive.css +0 -5
  22. package/dist/modules/backend/forms.d.ts +38 -1
  23. package/dist/modules/backend/forms.d.ts.map +1 -1
  24. package/dist/modules/backend/forms.js +29 -0
  25. package/dist/modules/backend/forms.js.map +1 -1
  26. package/dist/modules/backend/index.d.ts +3 -2
  27. package/dist/modules/backend/index.d.ts.map +1 -1
  28. package/dist/modules/backend/index.js +2 -2
  29. package/dist/modules/backend/index.js.map +1 -1
  30. package/dist/modules/backend/messages.d.ts.map +1 -1
  31. package/dist/modules/backend/messages.js +40 -2
  32. package/dist/modules/backend/messages.js.map +1 -1
  33. package/dist/modules/channel_api/core.d.ts +30 -0
  34. package/dist/modules/channel_api/core.d.ts.map +1 -1
  35. package/dist/modules/channel_api/core.js +28 -0
  36. package/dist/modules/channel_api/core.js.map +1 -1
  37. package/dist/modules/crm_staff_channel/channel-routes.d.ts.map +1 -1
  38. package/dist/modules/crm_staff_channel/channel-routes.js +1 -12
  39. package/dist/modules/crm_staff_channel/channel-routes.js.map +1 -1
  40. package/dist/modules/flow/membership.d.ts.map +1 -1
  41. package/dist/modules/flow/membership.js +7 -1
  42. package/dist/modules/flow/membership.js.map +1 -1
  43. package/dist/modules/flow/operations.d.ts +10 -4
  44. package/dist/modules/flow/operations.d.ts.map +1 -1
  45. package/dist/modules/flow/operations.js +10 -4
  46. package/dist/modules/flow/operations.js.map +1 -1
  47. package/dist/modules/flow_staff_channel/channel-routes.d.ts.map +1 -1
  48. package/dist/modules/flow_staff_channel/channel-routes.js +1 -20
  49. package/dist/modules/flow_staff_channel/channel-routes.js.map +1 -1
  50. package/dist/modules/hospitality_core/messages.d.ts.map +1 -1
  51. package/dist/modules/hospitality_core/messages.js +44 -0
  52. package/dist/modules/hospitality_core/messages.js.map +1 -1
  53. package/dist/modules/hospitality_core/night-audit.d.ts.map +1 -1
  54. package/dist/modules/hospitality_core/night-audit.js +7 -0
  55. package/dist/modules/hospitality_core/night-audit.js.map +1 -1
  56. package/dist/modules/hospitality_core/operations.d.ts.map +1 -1
  57. package/dist/modules/hospitality_core/operations.js +150 -40
  58. package/dist/modules/hospitality_core/operations.js.map +1 -1
  59. package/dist/modules/hospitality_core/routes.d.ts.map +1 -1
  60. package/dist/modules/hospitality_core/routes.js +24 -2
  61. package/dist/modules/hospitality_core/routes.js.map +1 -1
  62. package/dist/modules/hospitality_core/screens/check-out-prep.d.ts +46 -0
  63. package/dist/modules/hospitality_core/screens/check-out-prep.d.ts.map +1 -0
  64. package/dist/modules/hospitality_core/screens/check-out-prep.js +133 -0
  65. package/dist/modules/hospitality_core/screens/check-out-prep.js.map +1 -0
  66. package/dist/modules/hospitality_core/screens/folio-detail.d.ts.map +1 -1
  67. package/dist/modules/hospitality_core/screens/folio-detail.js +2 -4
  68. package/dist/modules/hospitality_core/screens/folio-detail.js.map +1 -1
  69. package/dist/modules/hospitality_core/screens/index.d.ts +2 -0
  70. package/dist/modules/hospitality_core/screens/index.d.ts.map +1 -1
  71. package/dist/modules/hospitality_core/screens/index.js +1 -0
  72. package/dist/modules/hospitality_core/screens/index.js.map +1 -1
  73. package/dist/modules/hospitality_core/screens/reservation-detail.d.ts.map +1 -1
  74. package/dist/modules/hospitality_core/screens/reservation-detail.js +8 -1
  75. package/dist/modules/hospitality_core/screens/reservation-detail.js.map +1 -1
  76. package/dist/modules/hospitality_core/screens/shared.d.ts +12 -0
  77. package/dist/modules/hospitality_core/screens/shared.d.ts.map +1 -1
  78. package/dist/modules/hospitality_core/screens/shared.js +25 -4
  79. package/dist/modules/hospitality_core/screens/shared.js.map +1 -1
  80. package/dist/modules/hospitality_core/services.d.ts +48 -0
  81. package/dist/modules/hospitality_core/services.d.ts.map +1 -1
  82. package/dist/modules/hospitality_core/services.js +70 -0
  83. package/dist/modules/hospitality_core/services.js.map +1 -1
  84. package/dist/modules/hospitality_staff_channel/channel-routes.d.ts.map +1 -1
  85. package/dist/modules/hospitality_staff_channel/channel-routes.js +1 -12
  86. package/dist/modules/hospitality_staff_channel/channel-routes.js.map +1 -1
  87. package/dist/modules/inventory_staff_channel/channel-routes.d.ts.map +1 -1
  88. package/dist/modules/inventory_staff_channel/channel-routes.js +1 -12
  89. package/dist/modules/inventory_staff_channel/channel-routes.js.map +1 -1
  90. package/dist/modules/purchase_staff_channel/order-routes.d.ts.map +1 -1
  91. package/dist/modules/purchase_staff_channel/order-routes.js +1 -12
  92. package/dist/modules/purchase_staff_channel/order-routes.js.map +1 -1
  93. package/dist/modules/quality_staff_channel/channel-routes.d.ts.map +1 -1
  94. package/dist/modules/quality_staff_channel/channel-routes.js +1 -12
  95. package/dist/modules/quality_staff_channel/channel-routes.js.map +1 -1
  96. package/dist/modules/sale/functions.d.ts.map +1 -1
  97. package/dist/modules/sale/functions.js +27 -17
  98. package/dist/modules/sale/functions.js.map +1 -1
  99. package/dist/modules/sale_staff_channel/channel-routes.d.ts.map +1 -1
  100. package/dist/modules/sale_staff_channel/channel-routes.js +1 -12
  101. package/dist/modules/sale_staff_channel/channel-routes.js.map +1 -1
  102. package/dist/modules/sale_staff_channel/order-routes.d.ts.map +1 -1
  103. package/dist/modules/sale_staff_channel/order-routes.js +1 -12
  104. package/dist/modules/sale_staff_channel/order-routes.js.map +1 -1
  105. package/dist/modules/stock_staff_channel/operation-routes.d.ts.map +1 -1
  106. package/dist/modules/stock_staff_channel/operation-routes.js +1 -12
  107. package/dist/modules/stock_staff_channel/operation-routes.js.map +1 -1
  108. package/dist/modules/user_backend/messages.d.ts +4 -0
  109. package/dist/modules/user_backend/messages.d.ts.map +1 -1
  110. package/dist/modules/user_backend/messages.js +4 -0
  111. package/dist/modules/user_backend/messages.js.map +1 -1
  112. package/dist/modules/user_backend/routes.d.ts.map +1 -1
  113. package/dist/modules/user_backend/routes.js +28 -1
  114. package/dist/modules/user_backend/routes.js.map +1 -1
  115. package/dist/modules/user_backend/screens/user-form.d.ts +1 -0
  116. package/dist/modules/user_backend/screens/user-form.d.ts.map +1 -1
  117. package/dist/modules/user_backend/screens/user-form.js +28 -0
  118. package/dist/modules/user_backend/screens/user-form.js.map +1 -1
  119. package/dist/modules/website/cms.d.ts.map +1 -1
  120. package/dist/modules/website/cms.js +283 -6
  121. package/dist/modules/website/cms.js.map +1 -1
  122. package/dist/modules/website/index.d.ts.map +1 -1
  123. package/dist/modules/website/index.js +12 -0
  124. package/dist/modules/website/index.js.map +1 -1
  125. package/dist/modules/website/media-usage.d.ts +38 -0
  126. package/dist/modules/website/media-usage.d.ts.map +1 -0
  127. package/dist/modules/website/media-usage.js +87 -0
  128. package/dist/modules/website/media-usage.js.map +1 -0
  129. package/dist/modules/website/paths.js +1 -1
  130. package/dist/modules/website/paths.js.map +1 -1
  131. package/dist/modules/website/sections.d.ts.map +1 -1
  132. package/dist/modules/website/sections.js +12 -1
  133. package/dist/modules/website/sections.js.map +1 -1
  134. package/dist/modules/website_backend/index.js +138 -0
  135. package/dist/modules/website_backend/index.js.map +1 -1
  136. package/dist/modules/website_backend/menus.d.ts.map +1 -1
  137. package/dist/modules/website_backend/menus.js +11 -0
  138. package/dist/modules/website_backend/menus.js.map +1 -1
  139. package/dist/modules/website_backend/routes.d.ts.map +1 -1
  140. package/dist/modules/website_backend/routes.js +414 -31
  141. package/dist/modules/website_backend/routes.js.map +1 -1
  142. package/dist/modules/website_backend/screens/index.d.ts +98 -6
  143. package/dist/modules/website_backend/screens/index.d.ts.map +1 -1
  144. package/dist/modules/website_backend/screens/index.js +600 -154
  145. package/dist/modules/website_backend/screens/index.js.map +1 -1
  146. package/dist/modules/website_backend/screens/page-frame.d.ts +3 -1
  147. package/dist/modules/website_backend/screens/page-frame.d.ts.map +1 -1
  148. package/dist/modules/website_backend/screens/page-frame.js +1 -1
  149. package/dist/modules/website_backend/screens/page-frame.js.map +1 -1
  150. package/dist/modules/website_menu/functions.d.ts.map +1 -1
  151. package/dist/modules/website_menu/functions.js +51 -0
  152. package/dist/modules/website_menu/functions.js.map +1 -1
  153. package/dist/modules/website_menu/index.js +2 -0
  154. package/dist/modules/website_menu/index.js.map +1 -1
  155. package/dist/modules/website_search/functions.d.ts.map +1 -1
  156. package/dist/modules/website_search/functions.js +10 -120
  157. package/dist/modules/website_search/functions.js.map +1 -1
  158. package/dist/modules/website_search/index.js +2 -0
  159. package/dist/modules/website_search/index.js.map +1 -1
  160. package/dist/modules/website_search/jobs.d.ts +3 -0
  161. package/dist/modules/website_search/jobs.d.ts.map +1 -0
  162. package/dist/modules/website_search/jobs.js +101 -0
  163. package/dist/modules/website_search/jobs.js.map +1 -0
  164. package/dist/modules/website_search/rebuild.d.ts +33 -0
  165. package/dist/modules/website_search/rebuild.d.ts.map +1 -0
  166. package/dist/modules/website_search/rebuild.js +125 -0
  167. package/dist/modules/website_search/rebuild.js.map +1 -0
  168. package/dist/permission-catalogue.d.ts.map +1 -1
  169. package/dist/permission-catalogue.js +14 -1
  170. package/dist/permission-catalogue.js.map +1 -1
  171. package/dist/scaffold/index.js +1 -1
  172. package/dist/ui/chrome.d.ts +8 -0
  173. package/dist/ui/chrome.d.ts.map +1 -1
  174. package/dist/ui/chrome.js +9 -1
  175. package/dist/ui/chrome.js.map +1 -1
  176. package/dist/ui/client/table-selection-view.d.ts.map +1 -1
  177. package/dist/ui/client/table-selection-view.js +67 -5
  178. package/dist/ui/client/table-selection-view.js.map +1 -1
  179. package/dist/ui/form.d.ts +2 -0
  180. package/dist/ui/form.d.ts.map +1 -1
  181. package/dist/ui/form.js +1 -0
  182. package/dist/ui/form.js.map +1 -1
  183. package/dist/ui/index.d.ts +2 -2
  184. package/dist/ui/index.d.ts.map +1 -1
  185. package/dist/ui/index.js +2 -2
  186. package/dist/ui/index.js.map +1 -1
  187. package/dist/ui/state.d.ts +20 -1
  188. package/dist/ui/state.d.ts.map +1 -1
  189. package/dist/ui/state.js +17 -0
  190. package/dist/ui/state.js.map +1 -1
  191. package/package.json +4 -4
@@ -1,4 +1,5 @@
1
- import { asc, defineFn, deleteFrom, desc, eq, from, gt, inArray, isNotNull, ne } from '@ketvietlab/ketjs';
1
+ import { defineFn, desc, eq, from, like, likeLiteral } from '@ketvietlab/ketjs';
2
+ import { indexEffects, isCurrent, rebuildPass, servedSite, stateFor } from './rebuild.js';
2
3
  /**
3
4
  * Building and reading the index.
4
5
  *
@@ -7,8 +8,6 @@ import { asc, defineFn, deleteFrom, desc, eq, from, gt, inArray, isNotNull, ne }
7
8
  * builder, not a new source of truth. And a stale index degrades the search
8
9
  * rather than answering wrongly: callers are told, and can fall back.
9
10
  */
10
- /** How many entries one rebuild pass reads. A pass is meant to fit in a request. */
11
- const BATCH = 200;
12
11
  /** How many passes `searchIndexed` will run itself before answering degraded. */
13
12
  const INLINE_PASSES = 3;
14
13
  const MAX_TERM = 100;
@@ -21,119 +20,6 @@ const term = (value) => String(value ?? '')
21
20
  .trim()
22
21
  .toLocaleLowerCase()
23
22
  .slice(0, MAX_TERM);
24
- /** The site a visitor is actually being served, and the set it is serving. */
25
- const servedSite = async (ctx, siteId) => {
26
- const Site = ctx.table('website.Site');
27
- return ctx.db.one(from(Site).where(eq(Site.id, siteId), eq(Site.active, true)));
28
- };
29
- const stateFor = async (ctx, siteId) => {
30
- const State = ctx.table('website_search.SearchIndexState');
31
- return ctx.db.one(from(State).where(eq(State.siteId, siteId)));
32
- };
33
- /**
34
- * An index is current when it was built for the publication now active — or,
35
- * for a site that publishes one page at a time, when it has completed at all
36
- * and nothing has been published since it finished.
37
- */
38
- const isCurrent = (state, site) => {
39
- if (state?.state !== 'ready')
40
- return false;
41
- return String(state.publicationId ?? '') === String(site.activePublicationId ?? '');
42
- };
43
- const documentOf = (entry, revision) => ({
44
- id: `${String(entry.siteId)}:${String(entry.id)}`,
45
- siteId: entry.siteId,
46
- entryId: entry.id,
47
- type: entry.type,
48
- path: entry.path,
49
- title: revision.title,
50
- excerpt: revision.excerpt ?? null,
51
- haystack: `${String(revision.title)}\n${String(revision.excerpt ?? '')}`.toLocaleLowerCase(),
52
- publishedAt: entry.publishedAt ?? null,
53
- });
54
- const indexEffects = [
55
- 'read:website.Site',
56
- 'read:website.Entry',
57
- 'read:website.EntryRevision',
58
- 'read:website_search.SearchDocument',
59
- 'write:website_search.SearchDocument',
60
- 'read:website_search.SearchIndexState',
61
- 'write:website_search.SearchIndexState',
62
- ];
63
- /**
64
- * One pass of a rebuild.
65
- *
66
- * Checkpointed on the entry path, which is stable and unique per site, so a
67
- * pass that stops halfway resumes where it left off rather than starting again.
68
- * Returns whether there is more to do.
69
- */
70
- const rebuildPass = async (ctx, site) => {
71
- const siteId = site.id;
72
- const existing = await stateFor(ctx, siteId);
73
- const target = String(site.activePublicationId ?? '');
74
- const fresh = existing?.state !== 'building' || String(existing.publicationId ?? '') !== target;
75
- const cursor = fresh ? '' : String(existing?.cursor ?? '');
76
- const now = new Date().toISOString();
77
- if (fresh) {
78
- // A rebuild for a different publication starts clean: leftovers from the
79
- // previous one describe pages that may no longer be served.
80
- const Document = ctx.table('website_search.SearchDocument');
81
- await ctx.db.del(deleteFrom(Document).where(eq(Document.siteId, siteId)));
82
- const row = {
83
- id: String(siteId),
84
- siteId,
85
- publicationId: site.activePublicationId ?? null,
86
- state: 'building',
87
- cursor: '',
88
- documentCount: 0,
89
- startedAt: now,
90
- completedAt: null,
91
- };
92
- if (existing)
93
- await ctx.db.update('website_search.SearchIndexState', { id: String(siteId) }, row);
94
- else
95
- await ctx.db.insert('website_search.SearchIndexState', row);
96
- }
97
- // The same publication gate the reader and the sitemap apply, so the index
98
- // can never offer a page the reader would refuse.
99
- const Entry = ctx.table('website.Entry');
100
- let query = from(Entry)
101
- .where(eq(Entry.siteId, siteId), isNotNull(Entry.publishedRevisionId), ne(Entry.status, 'trash'))
102
- .orderBy(asc(Entry.path))
103
- .limit(BATCH + 1);
104
- if (cursor)
105
- query = query.where(gt(Entry.path, cursor));
106
- const scanned = await ctx.db.all(query);
107
- const batch = scanned.slice(0, BATCH);
108
- const more = scanned.length > BATCH;
109
- if (batch.length) {
110
- const Revision = ctx.table('website.EntryRevision');
111
- const revisions = new Map();
112
- const ids = batch.map((entry) => entry.publishedRevisionId);
113
- for (const revision of await ctx.db.all(from(Revision)
114
- .select(Revision.id, Revision.entryId, Revision.title, Revision.excerpt)
115
- .where(inArray(Revision.id, ids))))
116
- revisions.set(String(revision.id), revision);
117
- for (const entry of batch) {
118
- const revision = revisions.get(String(entry.publishedRevisionId));
119
- if (!revision || revision.entryId !== entry.id)
120
- continue;
121
- const document = documentOf(entry, revision);
122
- const inserted = await ctx.db.insertIfAbsent('website_search.SearchDocument', document);
123
- if (!('dryRun' in inserted) && !inserted.inserted)
124
- await ctx.db.update('website_search.SearchDocument', { id: document.id }, document);
125
- }
126
- }
127
- const state = await stateFor(ctx, siteId);
128
- const written = Number(state?.documentCount ?? 0) + batch.length;
129
- await ctx.db.update('website_search.SearchIndexState', { id: String(siteId) }, {
130
- state: more ? 'building' : 'ready',
131
- cursor: more ? String(batch[batch.length - 1]?.path ?? '') : null,
132
- documentCount: written,
133
- completedAt: more ? null : new Date().toISOString(),
134
- });
135
- return { done: !more, written: batch.length };
136
- };
137
23
  export const functions = {
138
24
  /**
139
25
  * Rebuild the index for a site, one pass at a time.
@@ -217,10 +103,14 @@ export const functions = {
217
103
  }
218
104
  const Document = ctx.table('website_search.SearchDocument');
219
105
  const paging = page(args.limit, args.offset);
220
- const rows = await ctx.db.all(from(Document).where(eq(Document.siteId, args.siteId)).orderBy(desc(Document.publishedAt)));
221
- const matches = rows.filter((row) => String(row.haystack).includes(needle));
106
+ // Both sides are already lowercased, so a case-sensitive LIKE is the
107
+ // cheaper operator and means the same thing.
108
+ const matching = from(Document)
109
+ .where(eq(Document.siteId, args.siteId))
110
+ .where(like(Document.haystack, `%${likeLiteral(needle)}%`, true));
111
+ const rows = await ctx.db.all(matching.orderBy(desc(Document.publishedAt)).limit(paging.limit).offset(paging.offset));
222
112
  return {
223
- hits: matches.slice(paging.offset, paging.offset + paging.limit).map((row) => ({
113
+ hits: rows.map((row) => ({
224
114
  id: row.entryId,
225
115
  type: row.type,
226
116
  path: row.path,
@@ -228,7 +118,7 @@ export const functions = {
228
118
  excerpt: row.excerpt ?? null,
229
119
  publishedAt: row.publishedAt ?? null,
230
120
  })),
231
- total: matches.length,
121
+ total: await ctx.db.count(matching),
232
122
  // The visitor gets an answer either way; the caller gets to say so.
233
123
  stale: !isCurrent(state, site),
234
124
  indexed: true,
@@ -1 +1 @@
1
- {"version":3,"file":"functions.js","sourceRoot":"","sources":["../../../../../../../packages/ketsuite/src/modules/website_search/functions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAA;AAGzG;;;;;;;GAOG;AAEH,oFAAoF;AACpF,MAAM,KAAK,GAAG,GAAG,CAAA;AAEjB,iFAAiF;AACjF,MAAM,aAAa,GAAG,CAAC,CAAA;AAEvB,MAAM,QAAQ,GAAG,GAAG,CAAA;AACpB,MAAM,QAAQ,GAAG,CAAC,CAAA;AAElB,MAAM,IAAI,GAAG,CAAC,KAAc,EAAE,MAAe,EAAE,EAAE,CAAC,CAAC;IACjD,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC;IAC/E,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC;CACtF,CAAC,CAAA;AAEF,MAAM,IAAI,GAAG,CAAC,KAAc,EAAU,EAAE,CACtC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;KAChB,IAAI,EAAE;KACN,iBAAiB,EAAE;KACnB,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;AAEvB,8EAA8E;AAC9E,MAAM,UAAU,GAAG,KAAK,EAAE,GAAQ,EAAE,MAAe,EAAuB,EAAE;IAC1E,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;IACtC,OAAO,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;AACjF,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAQ,EAAE,MAAe,EAAuB,EAAE;IACxE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAA;IAC1D,OAAO,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;AAChE,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,SAAS,GAAG,CAAC,KAAiB,EAAE,IAAS,EAAW,EAAE;IAC1D,IAAI,KAAK,EAAE,KAAK,KAAK,OAAO;QAAE,OAAO,KAAK,CAAA;IAC1C,OAAO,MAAM,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAA;AACrF,CAAC,CAAA;AAED,MAAM,UAAU,GAAG,CAAC,KAAU,EAAE,QAAa,EAAO,EAAE,CAAC,CAAC;IACtD,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;IACjD,MAAM,EAAE,KAAK,CAAC,MAAM;IACpB,OAAO,EAAE,KAAK,CAAC,EAAE;IACjB,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,KAAK,EAAE,QAAQ,CAAC,KAAK;IACrB,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,IAAI;IACjC,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC,iBAAiB,EAAE;IAC5F,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;CACvC,CAAC,CAAA;AAEF,MAAM,YAAY,GAAG;IACnB,mBAAmB;IACnB,oBAAoB;IACpB,4BAA4B;IAC5B,oCAAoC;IACpC,qCAAqC;IACrC,sCAAsC;IACtC,uCAAuC;CACxC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,WAAW,GAAG,KAAK,EAAE,GAAQ,EAAE,IAAS,EAA+C,EAAE;IAC7F,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAA;IACtB,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAA;IACrD,MAAM,KAAK,GAAG,QAAQ,EAAE,KAAK,KAAK,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,IAAI,EAAE,CAAC,KAAK,MAAM,CAAA;IAE/F,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,CAAC,CAAA;IAC1D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAEpC,IAAI,KAAK,EAAE,CAAC;QACV,yEAAyE;QACzE,4DAA4D;QAC5D,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAA;QAC3D,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;QACzE,MAAM,GAAG,GAAG;YACV,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC;YAClB,MAAM;YACN,aAAa,EAAE,IAAI,CAAC,mBAAmB,IAAI,IAAI;YAC/C,KAAK,EAAE,UAAU;YACjB,MAAM,EAAE,EAAE;YACV,aAAa,EAAE,CAAC;YAChB,SAAS,EAAE,GAAG;YACd,WAAW,EAAE,IAAI;SAClB,CAAA;QACD,IAAI,QAAQ;YAAE,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,iCAAiC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;;YAC5F,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAA;IAClE,CAAC;IAED,2EAA2E;IAC3E,kDAAkD;IAClD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;IACxC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;SACpB,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SAChG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SACxB,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;IACnB,IAAI,MAAM;QAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;IACvD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACrC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,CAAA;IAEnC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;QACnD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAe,CAAA;QACxC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;QAC3D,KAAK,MAAM,QAAQ,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CACrC,IAAI,CAAC,QAAQ,CAAC;aACX,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC;aACvE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CACpC;YACC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAA;QAE9C,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAA;YACjE,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,KAAK,CAAC,EAAE;gBAAE,SAAQ;YACxD,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YAC5C,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC,+BAA+B,EAAE,QAAQ,CAAC,CAAA;YACvF,IAAI,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ;gBAC/C,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,+BAA+B,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;QACvF,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAA;IAChE,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,iCAAiC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE;QAC7E,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO;QAClC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;QACjE,aAAa,EAAE,OAAO;QACtB,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC7C,CAAC,CAAA;IACT,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,CAAA;AAC/C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAA2B;IAC/C;;;;;OAKG;IACH,WAAW,EAAE,QAAQ,CAAC;QACpB,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;QACvC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE;QAC9D,OAAO,EAAE,YAAY;QACrB,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,KAAK,EAAE,GAAQ,EAAE,IAAI,EAAE,EAAE;YAChC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YAC/C,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAA;YAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACjG,IAAI,OAAO,GAAG,CAAC,CAAA;YACf,IAAI,IAAI,GAAG,KAAK,CAAA;YAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5C,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;gBACzC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAA;gBACvB,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;YAClB,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC,EAAE,CAAA;QAC5E,CAAC;KACF,CAAC;IAEF,WAAW,EAAE,QAAQ,CAAC;QACpB,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;QACvB,MAAM,EAAE;YACN,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,KAAK;YACpB,aAAa,EAAE,OAAO;YACtB,WAAW,EAAE,WAAW;SACzB;QACD,OAAO,EAAE,CAAC,mBAAmB,EAAE,sCAAsC,CAAC;QACtE,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,KAAK,EAAE,GAAQ,EAAE,IAAI,EAAE,EAAE;YAChC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YAC/C,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,CAAA;YACvE,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YAC9C,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,IAAI,QAAQ,CAAC;gBACvC,OAAO,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC;gBAC/B,aAAa,EAAE,MAAM,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC;gBAChD,aAAa,EAAE,KAAK,EAAE,aAAa,IAAI,IAAI;gBAC3C,WAAW,EAAE,KAAK,EAAE,WAAW,IAAI,IAAI;aACxC,CAAA;QACH,CAAC;KACF,CAAC;IAEF;;;;;;;OAOG;IACH,aAAa,EAAE,QAAQ,CAAC;QACtB,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;QACjE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;QACtE,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,KAAK,EAAE,GAAQ,EAAE,IAAI,EAAE,EAAE;YAChC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC3B,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YAC/C,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,GAAG,QAAQ;gBAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;YAElG,IAAI,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YAC5C,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1C,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;oBACzC,IAAI,IAAI,CAAC,IAAI;wBAAE,MAAK;gBACtB,CAAC;gBACD,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YAC1C,CAAC;YAED,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAA;YAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YAC5C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAC3B,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAC3F,CAAA;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;YAC3E,OAAO;gBACL,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC7E,EAAE,EAAE,GAAG,CAAC,OAAO;oBACf,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI;oBAC5B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;iBACrC,CAAC,CAAC;gBACH,KAAK,EAAE,OAAO,CAAC,MAAM;gBACrB,oEAAoE;gBACpE,KAAK,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC;gBAC9B,OAAO,EAAE,IAAI;aACd,CAAA;QACH,CAAC;KACF,CAAC;CACH,CAAA"}
1
+ {"version":3,"file":"functions.js","sourceRoot":"","sources":["../../../../../../../packages/ketsuite/src/modules/website_search/functions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/E,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAGzF;;;;;;;GAOG;AAEH,iFAAiF;AACjF,MAAM,aAAa,GAAG,CAAC,CAAA;AAEvB,MAAM,QAAQ,GAAG,GAAG,CAAA;AACpB,MAAM,QAAQ,GAAG,CAAC,CAAA;AAElB,MAAM,IAAI,GAAG,CAAC,KAAc,EAAE,MAAe,EAAE,EAAE,CAAC,CAAC;IACjD,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC;IAC/E,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC;CACtF,CAAC,CAAA;AAEF,MAAM,IAAI,GAAG,CAAC,KAAc,EAAU,EAAE,CACtC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;KAChB,IAAI,EAAE;KACN,iBAAiB,EAAE;KACnB,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;AAEvB,MAAM,CAAC,MAAM,SAAS,GAA2B;IAC/C;;;;;OAKG;IACH,WAAW,EAAE,QAAQ,CAAC;QACpB,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;QACvC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE;QAC9D,OAAO,EAAE,YAAY;QACrB,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,KAAK,EAAE,GAAQ,EAAE,IAAI,EAAE,EAAE;YAChC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YAC/C,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAA;YAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACjG,IAAI,OAAO,GAAG,CAAC,CAAA;YACf,IAAI,IAAI,GAAG,KAAK,CAAA;YAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5C,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;gBACzC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAA;gBACvB,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;YAClB,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC,EAAE,CAAA;QAC5E,CAAC;KACF,CAAC;IAEF,WAAW,EAAE,QAAQ,CAAC;QACpB,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;QACvB,MAAM,EAAE;YACN,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,KAAK;YACpB,aAAa,EAAE,OAAO;YACtB,WAAW,EAAE,WAAW;SACzB;QACD,OAAO,EAAE,CAAC,mBAAmB,EAAE,sCAAsC,CAAC;QACtE,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,KAAK,EAAE,GAAQ,EAAE,IAAI,EAAE,EAAE;YAChC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YAC/C,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE,CAAA;YACvE,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YAC9C,OAAO;gBACL,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,IAAI,QAAQ,CAAC;gBACvC,OAAO,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC;gBAC/B,aAAa,EAAE,MAAM,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC;gBAChD,aAAa,EAAE,KAAK,EAAE,aAAa,IAAI,IAAI;gBAC3C,WAAW,EAAE,KAAK,EAAE,WAAW,IAAI,IAAI;aACxC,CAAA;QACH,CAAC;KACF,CAAC;IAEF;;;;;;;OAOG;IACH,aAAa,EAAE,QAAQ,CAAC;QACtB,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;QACjE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;QACtE,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,KAAK,EAAE,GAAQ,EAAE,IAAI,EAAE,EAAE;YAChC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC3B,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YAC/C,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,GAAG,QAAQ;gBAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;YAElG,IAAI,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YAC5C,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1C,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;oBACzC,IAAI,IAAI,CAAC,IAAI;wBAAE,MAAK;gBACtB,CAAC;gBACD,KAAK,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YAC1C,CAAC;YAED,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAA;YAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YAC5C,qEAAqE;YACrE,6CAA6C;YAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;iBAC5B,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;iBACvC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;YACnE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAC3B,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CACvF,CAAA;YACD,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBACvB,EAAE,EAAE,GAAG,CAAC,OAAO;oBACf,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI;oBAC5B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;iBACrC,CAAC,CAAC;gBACH,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;gBACnC,oEAAoE;gBACpE,KAAK,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC;gBAC9B,OAAO,EAAE,IAAI;aACd,CAAA;QACH,CAAC;KACF,CAAC;CACH,CAAA"}
@@ -2,6 +2,7 @@ import { defineModule } from '@ketvietlab/ketjs';
2
2
  import { fills } from './fills.js';
3
3
  import { functions } from './functions.js';
4
4
  import { islands } from './islands.js';
5
+ import { jobs } from './jobs.js';
5
6
  import { models } from './models.js';
6
7
  export default defineModule({
7
8
  name: 'website_search',
@@ -27,5 +28,6 @@ export default defineModule({
27
28
  functions,
28
29
  islands,
29
30
  models,
31
+ jobs,
30
32
  });
31
33
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/ketsuite/src/modules/website_search/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,eAAe,YAAY,CAAC;IAC1B,IAAI,EAAE,gBAAgB;IACtB,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,UAAU;IACjB,OAAO,EAAE,2CAA2C;IACpD,QAAQ,EAAE,SAAS;IACnB,MAAM,EAAE,IAAI,GAAG,CAAC,WAAW,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC;IAC7C,QAAQ,EAAE;QACR,EAAE,EAAE;YACF,WAAW,EAAE,UAAU;YACvB,aAAa,EAAE,2CAA2C;YAC1D,cAAc,EAAE,SAAS;SAC1B;QACD,EAAE,EAAE;YACF,WAAW,EAAE,QAAQ;YACrB,aAAa,EAAE,mCAAmC;YAClD,cAAc,EAAE,SAAS;SAC1B;KACF;IACD,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,KAAK;IACL,SAAS;IACT,OAAO;IACP,MAAM;CACP,CAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/ketsuite/src/modules/website_search/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,eAAe,YAAY,CAAC;IAC1B,IAAI,EAAE,gBAAgB;IACtB,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,UAAU;IACjB,OAAO,EAAE,2CAA2C;IACpD,QAAQ,EAAE,SAAS;IACnB,MAAM,EAAE,IAAI,GAAG,CAAC,WAAW,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC;IAC7C,QAAQ,EAAE;QACR,EAAE,EAAE;YACF,WAAW,EAAE,UAAU;YACvB,aAAa,EAAE,2CAA2C;YAC1D,cAAc,EAAE,SAAS;SAC1B;QACD,EAAE,EAAE;YACF,WAAW,EAAE,QAAQ;YACrB,aAAa,EAAE,mCAAmC;YAClD,cAAc,EAAE,SAAS;SAC1B;KACF;IACD,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,KAAK;IACL,SAAS;IACT,OAAO;IACP,MAAM;IACN,IAAI;CACL,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { JobSpec } from '@ketvietlab/ketjs';
2
+ export declare const jobs: Record<string, JobSpec>;
3
+ //# sourceMappingURL=jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../../../../../packages/ketsuite/src/modules/website_search/jobs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAO,OAAO,EAAO,MAAM,mBAAmB,CAAA;AAwB1D,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAsFxC,CAAA"}
@@ -0,0 +1,101 @@
1
+ import { defineJob, eq, from } from '@ketvietlab/ketjs';
2
+ import { isCurrent, rebuildPass, stateFor } from './rebuild.js';
3
+ /**
4
+ * Keeping the index level with what is being served.
5
+ *
6
+ * `reindexSite` says in its own comment that it exists "so an operator or a job
7
+ * can drive a long rebuild", and there was no job — so between publications the
8
+ * index only caught up through `searchIndexed`, three passes at a time, paid
9
+ * for by whichever visitors happened to search first. They also got `stale`
10
+ * results while they paid. That is a sound fallback and a poor schedule.
11
+ */
12
+ /** How many rebuild passes one run spends before handing the rest on. */
13
+ const PASSES_PER_RUN = 10;
14
+ const dayStamp = (now) => now.toISOString().slice(0, 10);
15
+ /** The sites a rebuild could apply to: the ones actually being served. */
16
+ const servedSites = async (ctx) => {
17
+ const Site = ctx.table('website.Site');
18
+ return ctx.db.all(from(Site).where(eq(Site.active, true)));
19
+ };
20
+ export const jobs = {
21
+ indexSweep: defineJob({
22
+ input: {},
23
+ idempotent: true,
24
+ crossCompany: true,
25
+ /**
26
+ * `every`, not `dailyAt`: an index is behind or it is not, and that has no
27
+ * opinion about what time it is anywhere. An hour is short enough that a
28
+ * publication is searchable well before anyone notices, and long enough
29
+ * that a site nobody edits costs one query an hour.
30
+ */
31
+ schedule: { every: '1h' },
32
+ effects: ['read:website.Site', 'enqueue:website_search.rebuildStale'],
33
+ handler: async (ctx) => {
34
+ const now = new Date();
35
+ const companies = new Set();
36
+ for (const site of await servedSites(ctx)) {
37
+ const company = site.companyId == null ? '' : String(site.companyId);
38
+ if (company)
39
+ companies.add(company);
40
+ }
41
+ // One job per legal entity, keyed on the hour: a sweep retried after a
42
+ // worker restart finds this hour's job already queued rather than
43
+ // queueing a second one behind it.
44
+ const stamp = `${dayStamp(now)}T${String(now.getUTCHours()).padStart(2, '0')}`;
45
+ for (const company of [...companies].sort())
46
+ await ctx.jobs.enqueue('website_search.rebuildStale', { pass: 1 }, { company, uniqueKey: `website_search.sweep:${company}:${stamp}:1` });
47
+ },
48
+ }),
49
+ rebuildStale: defineJob({
50
+ input: { pass: 'int?' },
51
+ idempotent: true,
52
+ effects: [
53
+ 'read:website.Site',
54
+ 'read:website.Entry',
55
+ 'read:website.EntryRevision',
56
+ 'read:website.Publication',
57
+ 'read:website_search.SearchDocument',
58
+ 'write:website_search.SearchDocument',
59
+ 'read:website_search.SearchIndexState',
60
+ 'write:website_search.SearchIndexState',
61
+ 'enqueue:website_search.rebuildStale',
62
+ ],
63
+ handler: async (ctx, args) => {
64
+ const now = new Date();
65
+ const pass = Number.isInteger(Number(args.pass)) ? Math.max(Number(args.pass), 1) : 1;
66
+ let budget = PASSES_PER_RUN;
67
+ let unfinished = false;
68
+ for (const site of await servedSites(ctx)) {
69
+ if (budget === 0) {
70
+ // Sites this run never reached.
71
+ unfinished = true;
72
+ break;
73
+ }
74
+ // The same passes the screen and the visitor path drive - a job
75
+ // context cannot reach a declared function, so this is the import
76
+ // rather than the call, and the behaviour is identical either way.
77
+ if (isCurrent(await stateFor(ctx, site.id), site))
78
+ continue;
79
+ let done = false;
80
+ while (!done && budget > 0) {
81
+ done = (await rebuildPass(ctx, site)).done;
82
+ budget -= 1;
83
+ }
84
+ if (!done)
85
+ unfinished = true;
86
+ }
87
+ // A backlog is finished by another run rather than by a longer one, so a
88
+ // first build over a large site cannot hold a worker slot long enough to
89
+ // be killed and retried from the beginning.
90
+ //
91
+ // The company is in the key because a unique job key is unique per
92
+ // tenant, not per company: without it two companies both needing a
93
+ // second pass in the same hour would collide and one would never run.
94
+ if (unfinished) {
95
+ const stamp = `${dayStamp(now)}T${String(now.getUTCHours()).padStart(2, '0')}`;
96
+ await ctx.jobs.enqueue('website_search.rebuildStale', { pass: pass + 1 }, { uniqueKey: `website_search.sweep:${ctx.scope.company ?? ''}:${stamp}:${pass + 1}` });
97
+ }
98
+ },
99
+ }),
100
+ };
101
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../../../../../../packages/ketsuite/src/modules/website_search/jobs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { Ctx, Row } from '@ketvietlab/ketjs';
2
+ /**
3
+ * Building the index, kept apart from reading it.
4
+ *
5
+ * A job cannot reach a declared function - a JobContext has no `call` - so the
6
+ * passes have to be an ordinary import, the way `website_form` keeps its purge.
7
+ * Separating them says the same thing the model does: the index is derived, and
8
+ * building it is not the same act as answering with it.
9
+ */
10
+ /** How many entries one rebuild pass reads. A pass is meant to fit in a request. */
11
+ export declare const BATCH = 200;
12
+ export declare const indexEffects: string[];
13
+ /** The site a visitor is actually being served, and the set it is serving. */
14
+ export declare const servedSite: (ctx: Ctx, siteId: unknown) => Promise<Row | null>;
15
+ export declare const stateFor: (ctx: Ctx, siteId: unknown) => Promise<Row | null>;
16
+ /**
17
+ * An index is current when it was built for the publication now active — or,
18
+ * for a site that publishes one page at a time, when it has completed at all
19
+ * and nothing has been published since it finished.
20
+ */
21
+ export declare const isCurrent: (state: Row | null, site: Row) => boolean;
22
+ /**
23
+ * One pass of a rebuild.
24
+ *
25
+ * Checkpointed on the entry path, which is stable and unique per site, so a
26
+ * pass that stops halfway resumes where it left off rather than starting again.
27
+ * Returns whether there is more to do.
28
+ */
29
+ export declare const rebuildPass: (ctx: Ctx, site: Row) => Promise<{
30
+ done: boolean;
31
+ written: number;
32
+ }>;
33
+ //# sourceMappingURL=rebuild.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rebuild.d.ts","sourceRoot":"","sources":["../../../../../../packages/ketsuite/src/modules/website_search/rebuild.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAEjD;;;;;;;GAOG;AAEH,oFAAoF;AACpF,eAAO,MAAM,KAAK,MAAM,CAAA;AAExB,eAAO,MAAM,YAAY,UAQxB,CAAA;AAED,8EAA8E;AAC9E,eAAO,MAAM,UAAU,QAAe,GAAG,UAAU,OAAO,KAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAG9E,CAAA;AAED,eAAO,MAAM,QAAQ,QAAe,GAAG,UAAU,OAAO,KAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAG5E,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,UAAW,GAAG,GAAG,IAAI,QAAQ,GAAG,KAAG,OAGxD,CAAA;AAcD;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,QAAe,GAAG,QAAQ,GAAG,KAAG,OAAO,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAsEjG,CAAA"}
@@ -0,0 +1,125 @@
1
+ import { asc, deleteFrom, eq, from, gt, inArray, isNotNull, ne } from '@ketvietlab/ketjs';
2
+ /**
3
+ * Building the index, kept apart from reading it.
4
+ *
5
+ * A job cannot reach a declared function - a JobContext has no `call` - so the
6
+ * passes have to be an ordinary import, the way `website_form` keeps its purge.
7
+ * Separating them says the same thing the model does: the index is derived, and
8
+ * building it is not the same act as answering with it.
9
+ */
10
+ /** How many entries one rebuild pass reads. A pass is meant to fit in a request. */
11
+ export const BATCH = 200;
12
+ export const indexEffects = [
13
+ 'read:website.Site',
14
+ 'read:website.Entry',
15
+ 'read:website.EntryRevision',
16
+ 'read:website_search.SearchDocument',
17
+ 'write:website_search.SearchDocument',
18
+ 'read:website_search.SearchIndexState',
19
+ 'write:website_search.SearchIndexState',
20
+ ];
21
+ /** The site a visitor is actually being served, and the set it is serving. */
22
+ export const servedSite = async (ctx, siteId) => {
23
+ const Site = ctx.table('website.Site');
24
+ return ctx.db.one(from(Site).where(eq(Site.id, siteId), eq(Site.active, true)));
25
+ };
26
+ export const stateFor = async (ctx, siteId) => {
27
+ const State = ctx.table('website_search.SearchIndexState');
28
+ return ctx.db.one(from(State).where(eq(State.siteId, siteId)));
29
+ };
30
+ /**
31
+ * An index is current when it was built for the publication now active — or,
32
+ * for a site that publishes one page at a time, when it has completed at all
33
+ * and nothing has been published since it finished.
34
+ */
35
+ export const isCurrent = (state, site) => {
36
+ if (state?.state !== 'ready')
37
+ return false;
38
+ return String(state.publicationId ?? '') === String(site.activePublicationId ?? '');
39
+ };
40
+ const documentOf = (entry, revision) => ({
41
+ id: `${String(entry.siteId)}:${String(entry.id)}`,
42
+ siteId: entry.siteId,
43
+ entryId: entry.id,
44
+ type: entry.type,
45
+ path: entry.path,
46
+ title: revision.title,
47
+ excerpt: revision.excerpt ?? null,
48
+ haystack: `${String(revision.title)}\n${String(revision.excerpt ?? '')}`.toLocaleLowerCase(),
49
+ publishedAt: entry.publishedAt ?? null,
50
+ });
51
+ /**
52
+ * One pass of a rebuild.
53
+ *
54
+ * Checkpointed on the entry path, which is stable and unique per site, so a
55
+ * pass that stops halfway resumes where it left off rather than starting again.
56
+ * Returns whether there is more to do.
57
+ */
58
+ export const rebuildPass = async (ctx, site) => {
59
+ const siteId = site.id;
60
+ const existing = await stateFor(ctx, siteId);
61
+ const target = String(site.activePublicationId ?? '');
62
+ const fresh = existing?.state !== 'building' || String(existing.publicationId ?? '') !== target;
63
+ const cursor = fresh ? '' : String(existing?.cursor ?? '');
64
+ const now = new Date().toISOString();
65
+ if (fresh) {
66
+ // A rebuild for a different publication starts clean: leftovers from the
67
+ // previous one describe pages that may no longer be served.
68
+ const Document = ctx.table('website_search.SearchDocument');
69
+ await ctx.db.del(deleteFrom(Document).where(eq(Document.siteId, siteId)));
70
+ const row = {
71
+ id: String(siteId),
72
+ siteId,
73
+ publicationId: site.activePublicationId ?? null,
74
+ state: 'building',
75
+ cursor: '',
76
+ documentCount: 0,
77
+ startedAt: now,
78
+ completedAt: null,
79
+ };
80
+ if (existing)
81
+ await ctx.db.update('website_search.SearchIndexState', { id: String(siteId) }, row);
82
+ else
83
+ await ctx.db.insert('website_search.SearchIndexState', row);
84
+ }
85
+ // The same publication gate the reader and the sitemap apply, so the index
86
+ // can never offer a page the reader would refuse.
87
+ const Entry = ctx.table('website.Entry');
88
+ let query = from(Entry)
89
+ .where(eq(Entry.siteId, siteId), isNotNull(Entry.publishedRevisionId), ne(Entry.status, 'trash'))
90
+ .orderBy(asc(Entry.path))
91
+ .limit(BATCH + 1);
92
+ if (cursor)
93
+ query = query.where(gt(Entry.path, cursor));
94
+ const scanned = await ctx.db.all(query);
95
+ const batch = scanned.slice(0, BATCH);
96
+ const more = scanned.length > BATCH;
97
+ if (batch.length) {
98
+ const Revision = ctx.table('website.EntryRevision');
99
+ const revisions = new Map();
100
+ const ids = batch.map((entry) => entry.publishedRevisionId);
101
+ for (const revision of await ctx.db.all(from(Revision)
102
+ .select(Revision.id, Revision.entryId, Revision.title, Revision.excerpt)
103
+ .where(inArray(Revision.id, ids))))
104
+ revisions.set(String(revision.id), revision);
105
+ for (const entry of batch) {
106
+ const revision = revisions.get(String(entry.publishedRevisionId));
107
+ if (!revision || revision.entryId !== entry.id)
108
+ continue;
109
+ const document = documentOf(entry, revision);
110
+ const inserted = await ctx.db.insertIfAbsent('website_search.SearchDocument', document);
111
+ if (!('dryRun' in inserted) && !inserted.inserted)
112
+ await ctx.db.update('website_search.SearchDocument', { id: document.id }, document);
113
+ }
114
+ }
115
+ const state = await stateFor(ctx, siteId);
116
+ const written = Number(state?.documentCount ?? 0) + batch.length;
117
+ await ctx.db.update('website_search.SearchIndexState', { id: String(siteId) }, {
118
+ state: more ? 'building' : 'ready',
119
+ cursor: more ? String(batch[batch.length - 1]?.path ?? '') : null,
120
+ documentCount: written,
121
+ completedAt: more ? null : new Date().toISOString(),
122
+ });
123
+ return { done: !more, written: batch.length };
124
+ };
125
+ //# sourceMappingURL=rebuild.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rebuild.js","sourceRoot":"","sources":["../../../../../../../packages/ketsuite/src/modules/website_search/rebuild.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"permission-catalogue.d.ts","sourceRoot":"","sources":["../../../../packages/ketsuite/src/permission-catalogue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EAIrB,MAAM,mBAAmB,CAAA;AAw8C1B,+FAA+F;AAC/F,eAAO,MAAM,yBAAyB,EA0CjC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;AAEzC,eAAO,MAAM,6BAA6B,mBAAsC,CAAA"}
1
+ {"version":3,"file":"permission-catalogue.d.ts","sourceRoot":"","sources":["../../../../packages/ketsuite/src/permission-catalogue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EAIrB,MAAM,mBAAmB,CAAA;AAq9C1B,+FAA+F;AAC/F,eAAO,MAAM,yBAAyB,EA0CjC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;AAEzC,eAAO,MAAM,6BAA6B,mBAAsC,CAAA"}
@@ -482,6 +482,7 @@ const sources = {
482
482
  cancelReservation: ['approve', 'approve', 'hospitality_core.domain-policy'],
483
483
  checkIn: ['operate', 'operate'],
484
484
  checkOut: ['operate', 'operate'],
485
+ checkOutReadiness: ['read', ['view', 'operate']],
485
486
  cleaningTaskSummary: ['operate', ['operate', 'housekeeping-attend', 'housekeeping-supervise']],
486
487
  completeCleaningTask: ['approve', ['approve', 'housekeeping-attend'], 'hospitality_core.domain-policy'],
487
488
  confirmStayNotice: ['approve', ['approve', 'compliance-operate'], 'hospitality_core.domain-policy'],
@@ -1332,6 +1333,7 @@ const sources = {
1332
1333
  addMenuItem: ['configure', 'configure', 'website.configuration-audit'],
1333
1334
  listMenu: ['read', 'view'],
1334
1335
  preflightMenu: ['read', 'view'],
1336
+ moveMenuItem: ['configure', 'configure', 'website.configuration-audit'],
1335
1337
  removeMenuItem: ['configure', 'configure', 'website.configuration-audit'],
1336
1338
  snapshotMenu: ['configure', 'configure', 'website.configuration-audit'],
1337
1339
  },
@@ -1370,6 +1372,7 @@ const sources = {
1370
1372
  countPages: ['read', 'view'],
1371
1373
  createPreviewToken: ['sensitive', 'sensitive', 'website.sensitive-data'],
1372
1374
  deleteMediaMetadata: ['configure', 'configure', 'website.configuration-audit'],
1375
+ deleteDomain: ['configure', 'configure', 'website.configuration-audit'],
1373
1376
  deleteTerm: ['configure', 'configure', 'website.configuration-audit'],
1374
1377
  diffRevisions: ['read', 'view'],
1375
1378
  getEntry: ['read', 'view'],
@@ -1377,8 +1380,10 @@ const sources = {
1377
1380
  getTaxonomyTerm: ['read', 'view'],
1378
1381
  listDomains: ['read', 'view'],
1379
1382
  listEntries: ['read', 'view'],
1383
+ listEntryTerms: ['read', 'view'],
1380
1384
  listMedia: ['read', 'view'],
1381
1385
  listPages: ['read', 'view'],
1386
+ mediaUsage: ['read', 'view'],
1382
1387
  listRedirects: ['read', 'view'],
1383
1388
  listRevisions: ['read', 'view'],
1384
1389
  listSiteMembers: ['read', 'view'],
@@ -1393,6 +1398,7 @@ const sources = {
1393
1398
  publishPage: ['configure', 'configure', 'website.configuration-audit'],
1394
1399
  removeSiteMember: ['security', 'security', 'website.security-audit'],
1395
1400
  restoreRevision: ['operate', 'operate'],
1401
+ unpublishEntry: ['configure', 'configure', 'website.configuration-audit'],
1396
1402
  revokePreviewTokens: ['sensitive', 'sensitive', 'website.sensitive-data'],
1397
1403
  saveDomain: ['configure', 'configure', 'website.configuration-audit'],
1398
1404
  saveEntry: ['configure', 'configure', 'website.configuration-audit'],
@@ -1402,6 +1408,9 @@ const sources = {
1402
1408
  saveSite: ['configure', 'configure', 'website.configuration-audit'],
1403
1409
  saveSiteMember: ['configure', 'configure', 'website.configuration-audit'],
1404
1410
  saveTerm: ['configure', 'configure', 'website.configuration-audit'],
1411
+ trashEntry: ['configure', 'configure', 'website.configuration-audit'],
1412
+ unassignTerm: ['configure', 'configure', 'website.configuration-audit'],
1413
+ untrashEntry: ['configure', 'configure', 'website.configuration-audit'],
1405
1414
  },
1406
1415
  exemptions: {
1407
1416
  authenticateCustomer: ['anonymous', 'declared-public-or-cryptographic-realm-boundary'],
@@ -1449,7 +1458,11 @@ const capabilityLabels = {
1449
1458
  'night-audit': { en: 'Run night audit', vi: 'Chạy kiểm toán đêm' },
1450
1459
  'order-operate': { en: 'Operate orders', vi: 'Vận hành đơn hàng' },
1451
1460
  operate: { en: 'Operate', vi: 'Vận hành' },
1452
- 'project-access': { en: 'Read every project', vi: 'Đọc mọi dự án' },
1461
+ // Not "read every project" that is the grant row this capability hands out,
1462
+ // and holding the capability without a row of your own reads nothing. The
1463
+ // label said otherwise, which would have told a role screen that ticking this
1464
+ // box opens the projects; it opens the ability to open them for somebody.
1465
+ 'project-access': { en: 'Administer project access', vi: 'Quản trị quyền đọc dự án' },
1453
1466
  'project-delete': { en: 'Delete projects for good', vi: 'Xóa hẳn dự án' },
1454
1467
  'property-reference': { en: 'Reference properties', vi: 'Tham chiếu cơ sở lưu trú' },
1455
1468
  reconcile: { en: 'Reconcile', vi: 'Đối soát' },