emdash 0.6.0 → 0.7.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 (97) hide show
  1. package/dist/{apply-B4MsLM-w.mjs → apply-5uslYdUu.mjs} +174 -17
  2. package/dist/apply-5uslYdUu.mjs.map +1 -0
  3. package/dist/astro/index.d.mts +4 -4
  4. package/dist/astro/index.mjs +7 -3
  5. package/dist/astro/index.mjs.map +1 -1
  6. package/dist/astro/middleware/auth.d.mts +4 -4
  7. package/dist/astro/middleware/redirect.mjs +1 -1
  8. package/dist/astro/middleware/request-context.mjs +6 -1
  9. package/dist/astro/middleware/request-context.mjs.map +1 -1
  10. package/dist/astro/middleware.mjs +13 -12
  11. package/dist/astro/middleware.mjs.map +1 -1
  12. package/dist/astro/types.d.mts +13 -4
  13. package/dist/astro/types.d.mts.map +1 -1
  14. package/dist/cli/index.mjs +4 -4
  15. package/dist/{content-BsBoyj8G.mjs → content-D7J5y73J.mjs} +27 -1
  16. package/dist/{content-BsBoyj8G.mjs.map → content-D7J5y73J.mjs.map} +1 -1
  17. package/dist/db/index.d.mts +2 -2
  18. package/dist/db/index.mjs +1 -1
  19. package/dist/{index-BYv0mB9g.d.mts → index-De6_Xv3v.d.mts} +77 -3
  20. package/dist/index-De6_Xv3v.d.mts.map +1 -0
  21. package/dist/index.d.mts +4 -4
  22. package/dist/index.mjs +7 -7
  23. package/dist/media/local-runtime.d.mts +4 -4
  24. package/dist/plugins/adapt-sandbox-entry.d.mts +4 -4
  25. package/dist/{query-Bk_3vKvU.mjs → query-g4Ug-9j9.mjs} +3 -3
  26. package/dist/{query-Bk_3vKvU.mjs.map → query-g4Ug-9j9.mjs.map} +1 -1
  27. package/dist/{redirect-7lGhLBNZ.mjs → redirect-CN0Rt9Ob.mjs} +66 -10
  28. package/dist/redirect-CN0Rt9Ob.mjs.map +1 -0
  29. package/dist/{runner-Fl2NcUUz.d.mts → runner-BR2xKwhn.d.mts} +2 -2
  30. package/dist/{runner-Fl2NcUUz.d.mts.map → runner-BR2xKwhn.d.mts.map} +1 -1
  31. package/dist/{runner-Cd-_WyDo.mjs → runner-tQ7BJ4T7.mjs} +211 -134
  32. package/dist/runner-tQ7BJ4T7.mjs.map +1 -0
  33. package/dist/runtime.d.mts +4 -4
  34. package/dist/{search-DI4bM2w9.mjs → search-B0effn3j.mjs} +117 -23
  35. package/dist/search-B0effn3j.mjs.map +1 -0
  36. package/dist/seed/index.d.mts +2 -2
  37. package/dist/seed/index.mjs +3 -3
  38. package/dist/{taxonomies-DbrKzDju.mjs → taxonomies-K2z0Uhnj.mjs} +2 -2
  39. package/dist/{taxonomies-DbrKzDju.mjs.map → taxonomies-K2z0Uhnj.mjs.map} +1 -1
  40. package/dist/{types-8xrvl_68.d.mts → types-C2v0c34j.d.mts} +10 -1
  41. package/dist/{types-8xrvl_68.d.mts.map → types-C2v0c34j.d.mts.map} +1 -1
  42. package/dist/{validate-CaLH1Ia2.d.mts → validate-kM8Pjuf7.d.mts} +2 -2
  43. package/dist/{validate-CaLH1Ia2.d.mts.map → validate-kM8Pjuf7.d.mts.map} +1 -1
  44. package/dist/version-BnTKdfam.mjs +7 -0
  45. package/dist/{version-Uaf2ynPX.mjs.map → version-BnTKdfam.mjs.map} +1 -1
  46. package/package.json +5 -5
  47. package/src/api/handlers/content.ts +2 -0
  48. package/src/api/schemas/content.ts +8 -0
  49. package/src/astro/integration/font-provider.ts +3 -1
  50. package/src/astro/integration/index.ts +2 -0
  51. package/src/astro/integration/runtime.ts +55 -1
  52. package/src/astro/routes/admin.astro +14 -7
  53. package/src/astro/routes/api/auth/magic-link/send.ts +2 -1
  54. package/src/astro/routes/api/auth/passkey/options.ts +2 -1
  55. package/src/astro/routes/api/auth/signup/request.ts +26 -8
  56. package/src/astro/routes/api/comments/[collection]/[contentId]/index.ts +10 -6
  57. package/src/astro/routes/api/content/[collection]/[id]/compare.ts +1 -1
  58. package/src/astro/routes/api/content/[collection]/[id]/preview-url.ts +1 -1
  59. package/src/astro/routes/api/content/[collection]/[id]/revisions.ts +1 -1
  60. package/src/astro/routes/api/content/[collection]/[id]/translations.ts +26 -0
  61. package/src/astro/routes/api/content/[collection]/[id].ts +30 -2
  62. package/src/astro/routes/api/content/[collection]/index.ts +19 -1
  63. package/src/astro/routes/api/content/[collection]/trash.ts +1 -1
  64. package/src/astro/routes/api/import/wordpress-plugin/analyze.ts +4 -3
  65. package/src/astro/routes/api/import/wordpress-plugin/execute.ts +4 -3
  66. package/src/astro/routes/api/manifest.ts +7 -0
  67. package/src/astro/routes/api/oauth/device/code.ts +2 -1
  68. package/src/astro/routes/api/oauth/device/token.ts +2 -1
  69. package/src/astro/routes/api/setup/admin-verify.ts +30 -5
  70. package/src/astro/routes/api/setup/admin.ts +32 -8
  71. package/src/astro/routes/api/setup/index.ts +5 -2
  72. package/src/astro/types.ts +9 -0
  73. package/src/auth/rate-limit.ts +50 -22
  74. package/src/auth/setup-nonce.ts +22 -0
  75. package/src/auth/trusted-proxy.ts +92 -0
  76. package/src/database/migrations/035_bounded_404_log.ts +112 -0
  77. package/src/database/migrations/runner.ts +2 -0
  78. package/src/database/repositories/content.ts +39 -0
  79. package/src/database/repositories/options.ts +25 -0
  80. package/src/database/repositories/redirect.ts +111 -8
  81. package/src/database/types.ts +9 -0
  82. package/src/emdash-runtime.ts +3 -1
  83. package/src/import/registry.ts +4 -3
  84. package/src/import/ssrf.ts +253 -12
  85. package/src/mcp/server.ts +76 -3
  86. package/src/plugins/context.ts +15 -3
  87. package/src/plugins/manager.ts +6 -0
  88. package/src/plugins/request-meta.ts +66 -15
  89. package/src/plugins/routes.ts +3 -1
  90. package/src/seed/apply.ts +26 -0
  91. package/src/visual-editing/toolbar.ts +6 -1
  92. package/dist/apply-B4MsLM-w.mjs.map +0 -1
  93. package/dist/index-BYv0mB9g.d.mts.map +0 -1
  94. package/dist/redirect-7lGhLBNZ.mjs.map +0 -1
  95. package/dist/runner-Cd-_WyDo.mjs.map +0 -1
  96. package/dist/search-DI4bM2w9.mjs.map +0 -1
  97. package/dist/version-Uaf2ynPX.mjs +0 -7
@@ -1,12 +1,12 @@
1
1
  import { n as validateJsonFieldName, r as validatePluginIdentifier, t as validateIdentifier } from "./validate-VPnKoIzW.mjs";
2
2
  import { o as jsonExtractExpr } from "./dialect-helpers-DhTzaUxP.mjs";
3
- import { a as slugify, r as RevisionRepository, t as ContentRepository } from "./content-BsBoyj8G.mjs";
3
+ import { a as slugify, r as RevisionRepository, t as ContentRepository } from "./content-D7J5y73J.mjs";
4
4
  import { r as encodeBase64, t as decodeBase64 } from "./base64-MBPo9ozB.mjs";
5
5
  import { n as decodeCursor, r as encodeCursor, t as EmDashValidationError } from "./types-CMMN0pNg.mjs";
6
6
  import { t as MediaRepository } from "./media-DqHVh136.mjs";
7
- import { a as stripCredentialHeaders, f as OptionsRepository, i as ssrfSafeFetch, o as validateExternalUrl, r as SsrfError } from "./apply-B4MsLM-w.mjs";
7
+ import { a as ssrfSafeFetch, i as resolveAndValidateExternalUrl, o as stripCredentialHeaders, p as OptionsRepository, r as SsrfError, s as validateExternalUrl } from "./apply-5uslYdUu.mjs";
8
8
  import { t as withTransaction } from "./transaction-Cn2rjY78.mjs";
9
- import { t as RedirectRepository } from "./redirect-7lGhLBNZ.mjs";
9
+ import { t as RedirectRepository } from "./redirect-CN0Rt9Ob.mjs";
10
10
  import { n as chunks, t as SQL_BATCH_SIZE } from "./chunks-HGz06Soa.mjs";
11
11
  import { t as BylineRepository } from "./byline-C4OVd8b3.mjs";
12
12
  import { r as isI18nEnabled } from "./config-BXwuX8Bx.mjs";
@@ -1298,7 +1298,8 @@ async function handleContentUpdate(db, collection, id, body) {
1298
1298
  data: body.data,
1299
1299
  slug: body.slug,
1300
1300
  status: body.status,
1301
- authorId: body.authorId
1301
+ authorId: body.authorId,
1302
+ publishedAt: body.publishedAt
1302
1303
  });
1303
1304
  if (body.bylines !== void 0) {
1304
1305
  await bylineRepo.setContentBylines(collection, resolvedId, body.bylines);
@@ -2640,6 +2641,11 @@ const contentListQuery = cursorPaginationQuery.extend({
2640
2641
  order: z$1.enum(["asc", "desc"]).optional(),
2641
2642
  locale: localeCode.optional()
2642
2643
  }).meta({ id: "ContentListQuery" });
2644
+ /** ISO 8601 datetime for `publishedAt` / `createdAt`. Routes gate writes behind `content:publish_any`. */
2645
+ const contentDateOverride = z$1.iso.datetime({
2646
+ offset: true,
2647
+ message: "must be an ISO 8601 datetime"
2648
+ }).nullish();
2643
2649
  const contentCreateBody = z$1.object({
2644
2650
  data: z$1.record(z$1.string(), z$1.unknown()),
2645
2651
  slug: z$1.string().nullish(),
@@ -2647,7 +2653,9 @@ const contentCreateBody = z$1.object({
2647
2653
  bylines: z$1.array(contentBylineInputSchema).optional(),
2648
2654
  locale: localeCode.optional(),
2649
2655
  translationOf: z$1.string().optional(),
2650
- seo: contentSeoInput.optional()
2656
+ seo: contentSeoInput.optional(),
2657
+ publishedAt: contentDateOverride,
2658
+ createdAt: contentDateOverride
2651
2659
  }).meta({ id: "ContentCreateBody" });
2652
2660
  const contentUpdateBody = z$1.object({
2653
2661
  data: z$1.record(z$1.string(), z$1.unknown()).optional(),
@@ -2657,7 +2665,8 @@ const contentUpdateBody = z$1.object({
2657
2665
  bylines: z$1.array(contentBylineInputSchema).optional(),
2658
2666
  _rev: z$1.string().optional().meta({ description: "Opaque revision token for optimistic concurrency" }),
2659
2667
  skipRevision: z$1.boolean().optional(),
2660
- seo: contentSeoInput.optional()
2668
+ seo: contentSeoInput.optional(),
2669
+ publishedAt: contentDateOverride
2661
2670
  }).meta({ id: "ContentUpdateBody" });
2662
2671
  const contentScheduleBody = z$1.object({ scheduledAt: z$1.string().min(1, "scheduledAt is required").meta({
2663
2672
  description: "ISO 8601 datetime for scheduled publishing",
@@ -4983,6 +4992,55 @@ function resolveHook(hook, pluginId) {
4983
4992
  };
4984
4993
  }
4985
4994
 
4995
+ //#endregion
4996
+ //#region src/auth/trusted-proxy.ts
4997
+ /**
4998
+ * RFC 7230 token — valid characters for an HTTP header name. Invalid names
4999
+ * passed to `Headers.get()` throw a TypeError at runtime, which would
5000
+ * otherwise surface as a 500 from every auth route.
5001
+ */
5002
+ const HEADER_NAME_PATTERN = /^[!#$%&'*+\-.^_`|~0-9a-z]+$/;
5003
+ /**
5004
+ * Normalise a list of header names the way both the config path and any
5005
+ * caller passing a pre-resolved list should do: trim, lowercase, drop
5006
+ * empty, drop anything that isn't a valid RFC 7230 token. Invalid names
5007
+ * would crash `Headers.get()` at runtime.
5008
+ */
5009
+ function normalizeTrustedHeaders(names) {
5010
+ return names.map((h) => h.trim().toLowerCase()).filter((h) => h.length > 0 && HEADER_NAME_PATTERN.test(h));
5011
+ }
5012
+ function isValidHeaderName(name) {
5013
+ return HEADER_NAME_PATTERN.test(name);
5014
+ }
5015
+ /** Cache for the env-derived value. `null` means "not yet parsed". */
5016
+ let _envCache = null;
5017
+ function getEnvTrustedHeaders() {
5018
+ if (_envCache !== null) return _envCache;
5019
+ let raw;
5020
+ try {
5021
+ const importMetaEnv = import.meta.env;
5022
+ raw = (typeof process !== "undefined" ? process.env?.EMDASH_TRUSTED_PROXY_HEADERS : void 0) || importMetaEnv?.EMDASH_TRUSTED_PROXY_HEADERS;
5023
+ } catch {
5024
+ raw = void 0;
5025
+ }
5026
+ if (!raw) {
5027
+ _envCache = [];
5028
+ return _envCache;
5029
+ }
5030
+ _envCache = raw.split(",").map((s) => s.trim().toLowerCase()).filter((s) => s.length > 0 && isValidHeaderName(s));
5031
+ return _envCache;
5032
+ }
5033
+ /**
5034
+ * Return the lowercased list of headers to trust for client-IP resolution.
5035
+ *
5036
+ * When `config?.trustedProxyHeaders` is explicitly set (even to `[]`), it
5037
+ * wins. Otherwise fall through to the env var, then to `[]`.
5038
+ */
5039
+ function getTrustedProxyHeaders(config) {
5040
+ if (config && config.trustedProxyHeaders !== void 0) return config.trustedProxyHeaders.map((h) => h.trim().toLowerCase()).filter((h) => h.length > 0 && isValidHeaderName(h));
5041
+ return getEnvTrustedHeaders();
5042
+ }
5043
+
4986
5044
  //#endregion
4987
5045
  //#region src/plugins/request-meta.ts
4988
5046
  /**
@@ -5004,6 +5062,20 @@ function parseFirstForwardedIp(header) {
5004
5062
  return IP_PATTERN.test(trimmed) ? trimmed : null;
5005
5063
  }
5006
5064
  /**
5065
+ * Read an IP from an operator-declared trusted header. XFF-style headers
5066
+ * (any name ending in `forwarded-for`) are parsed as comma-separated lists
5067
+ * and the first entry is used; everything else is treated as a single
5068
+ * trimmed value.
5069
+ */
5070
+ function readIpFromHeader(headers, name) {
5071
+ const value = headers.get(name);
5072
+ if (!value) return null;
5073
+ if (name.endsWith("forwarded-for")) return parseFirstForwardedIp(value);
5074
+ const trimmed = value.trim();
5075
+ if (!trimmed) return null;
5076
+ return IP_PATTERN.test(trimmed) ? trimmed : null;
5077
+ }
5078
+ /**
5007
5079
  * Get the Cloudflare `cf` object from the request, if present.
5008
5080
  * Returns undefined when not running on Cloudflare Workers.
5009
5081
  */
@@ -5030,24 +5102,39 @@ function extractGeo(cf) {
5030
5102
  * Extract normalized request metadata from a Request object.
5031
5103
  *
5032
5104
  * IP resolution order:
5033
- * 1. `CF-Connecting-IP` header — only trusted when a `cf` object is
5034
- * present on the request (proving the request came through Cloudflare's
5035
- * edge, which strips/overwrites client-supplied values).
5036
- * 2. `X-Forwarded-For` header (first entry) — best-effort, spoofable
5037
- * when there is no trusted reverse proxy.
5038
- * 3. `null`
5039
- */
5040
- function extractRequestMeta(request) {
5105
+ * 1. `CF-Connecting-IP` — trusted only when a `cf` object is present on the
5106
+ * request. CF edge overwrites any client-supplied value, so this is the
5107
+ * cryptographically trustworthy path on Workers. Operator-declared
5108
+ * trusted headers cannot override it.
5109
+ * 2. `X-Forwarded-For` first entry — trusted only with a `cf` object.
5110
+ * 3. Operator-declared trusted proxy headers (from `config.trustedProxyHeaders`
5111
+ * or the `EMDASH_TRUSTED_PROXY_HEADERS` env var), tried in order. Used as
5112
+ * the primary source off-CF and as a fill-in on CF.
5113
+ * 4. `null`
5114
+ *
5115
+ * The second argument accepts either the EmDash config or a pre-resolved
5116
+ * list of trusted headers, so callers that already have the list don't have
5117
+ * to round-trip through the config every request.
5118
+ */
5119
+ function extractRequestMeta(request, configOrTrustedHeaders) {
5041
5120
  const headers = request.headers;
5042
5121
  const cf = getCfObject(request);
5122
+ const trusted = resolveTrustedHeaders(configOrTrustedHeaders);
5043
5123
  let ip = null;
5044
5124
  if (cf) {
5045
5125
  const cfIp = headers.get("cf-connecting-ip")?.trim();
5046
5126
  if (cfIp && IP_PATTERN.test(cfIp)) ip = cfIp;
5127
+ if (!ip) {
5128
+ const xff = headers.get("x-forwarded-for");
5129
+ ip = xff ? parseFirstForwardedIp(xff) : null;
5130
+ }
5047
5131
  }
5048
- if (!ip && cf) {
5049
- const xff = headers.get("x-forwarded-for");
5050
- ip = xff ? parseFirstForwardedIp(xff) : null;
5132
+ if (!ip) for (const name of trusted) {
5133
+ const value = readIpFromHeader(headers, name);
5134
+ if (value) {
5135
+ ip = value;
5136
+ break;
5137
+ }
5051
5138
  }
5052
5139
  const userAgent = headers.get("user-agent")?.trim() || null;
5053
5140
  const referer = headers.get("referer")?.trim() || null;
@@ -5059,6 +5146,10 @@ function extractRequestMeta(request) {
5059
5146
  geo
5060
5147
  };
5061
5148
  }
5149
+ function resolveTrustedHeaders(value) {
5150
+ if (Array.isArray(value)) return normalizeTrustedHeaders(value);
5151
+ return getTrustedProxyHeaders(value);
5152
+ }
5062
5153
  /**
5063
5154
  * Headers that must never cross the RPC boundary to sandboxed plugins.
5064
5155
  * Session tokens, auth credentials, and infrastructure headers are stripped
@@ -5707,7 +5798,7 @@ function createUnrestrictedHttpAccess(pluginId) {
5707
5798
  let currentInit = init;
5708
5799
  for (let i = 0; i <= MAX_PLUGIN_REDIRECTS; i++) {
5709
5800
  try {
5710
- validateExternalUrl(currentUrl);
5801
+ await resolveAndValidateExternalUrl(currentUrl);
5711
5802
  } catch (e) {
5712
5803
  const msg = e instanceof SsrfError ? e.message : "SSRF validation failed";
5713
5804
  throw new Error(`Plugin "${pluginId}": blocked fetch to "${new URL(currentUrl).hostname}": ${msg}`, { cause: e });
@@ -7001,9 +7092,11 @@ async function devConsoleEmailDeliver(event, _ctx) {
7001
7092
  var PluginRouteHandler = class {
7002
7093
  contextFactory;
7003
7094
  plugin;
7095
+ trustedProxyHeaders;
7004
7096
  constructor(plugin, factoryOptions) {
7005
7097
  this.plugin = plugin;
7006
7098
  this.contextFactory = new PluginContextFactory(factoryOptions);
7099
+ this.trustedProxyHeaders = factoryOptions.trustedProxyHeaders ?? [];
7007
7100
  }
7008
7101
  /**
7009
7102
  * Invoke a route by name
@@ -7036,7 +7129,7 @@ var PluginRouteHandler = class {
7036
7129
  ...this.contextFactory.createContext(this.plugin),
7037
7130
  input: validatedInput,
7038
7131
  request: options.request,
7039
- requestMeta: extractRequestMeta(options.request)
7132
+ requestMeta: extractRequestMeta(options.request, this.trustedProxyHeaders)
7040
7133
  };
7041
7134
  try {
7042
7135
  return {
@@ -7215,7 +7308,8 @@ var PluginManager = class {
7215
7308
  this.factoryOptions = {
7216
7309
  db: options.db,
7217
7310
  storage: options.storage,
7218
- getUploadUrl: options.getUploadUrl
7311
+ getUploadUrl: options.getUploadUrl,
7312
+ trustedProxyHeaders: options.trustedProxyHeaders
7219
7313
  };
7220
7314
  }
7221
7315
  /**
@@ -7712,7 +7806,7 @@ async function probeUrl(url) {
7712
7806
  let normalizedUrl = url.trim();
7713
7807
  if (!normalizedUrl.startsWith("http")) normalizedUrl = `https://${normalizedUrl}`;
7714
7808
  normalizedUrl = normalizedUrl.replace(TRAILING_SLASHES_PATTERN, "");
7715
- validateExternalUrl(normalizedUrl);
7809
+ await resolveAndValidateExternalUrl(normalizedUrl);
7716
7810
  const results = [];
7717
7811
  const probePromises = getUrlSources().map(async (source) => {
7718
7812
  try {
@@ -9396,5 +9490,5 @@ function extractSearchableFields(entry, fields) {
9396
9490
  }
9397
9491
 
9398
9492
  //#endregion
9399
- export { isSafeHref as $, isStandardPluginDefinition as A, handleContentRestore as At, EmailPipeline as B, getAllSources as C, handleContentDuplicate as Ct, probeUrl as D, handleContentListTrashed as Dt, getUrlSources as E, handleContentList as Et, createPluginManager as F, handleContentUpdate as Ft, extractRequestMeta as G, createHookPipeline as H, PluginRouteError as I, validateRev as It, parseWxr as J, sanitizeHeadersForSandbox as K, PluginRouteRegistry as L, portableText as Lt, SandboxNotAvailableError as M, handleContentTranslations as Mt, createNoopSandboxRunner as N, handleContentUnpublish as Nt, registerSource as O, handleContentPermanentDelete as Ot, PluginManager as P, handleContentUnschedule as Pt, prosemirrorToPortableText as Q, DEV_CONSOLE_EMAIL_PLUGIN_ID as R, reference as Rt, clearSources as S, handleContentDiscardDraft as St, getSource as T, handleContentGetIncludingTrashed as Tt, resolveExclusiveHooks as U, HookPipeline as V, CronExecutor as W, after as X, parseWxrString as Y, portableTextToProsemirror as Z, buildPreviewUrl as _, handleContentCompare as _t, search as a, getCollectionInfo as at, parseWxrDate as b, handleContentCreate as bt, getWidgetArea as c, handleMediaGet as ct, getMenu as d, handleRevisionGet as dt, sanitizeHref as et, getMenus as f, handleRevisionList as ft, isPreviewRequest as g, hashString as gt, getPreviewToken as h, computeContentHash as ht, getSuggestions as i, PluginStateRepository as it, NoopSandboxRunner as j, handleContentSchedule as jt, importReusableBlocksAsSections as k, handleContentPublish as kt, getWidgetAreas as l, handleMediaList as lt, getComments as m, generateManifest as mt, extractSearchableFields as n, getSection as nt, searchCollection as o, handleMediaCreate as ot, getCommentCount as p, handleRevisionRestore as pt, definePlugin as q, getSearchStats as r, getSections as rt, searchWithDb as s, handleMediaDelete as st, extractPlainText as t, loadBundleFromR2 as tt, getWidgetComponents as u, handleMediaUpdate as ut, getPreviewUrl as v, handleContentCountScheduled as vt, getFileSources as w, handleContentGet as wt, wxrSource as x, handleContentDelete as xt, wordpressRestSource as y, handleContentCountTrashed as yt, devConsoleEmailDeliver as z, image as zt };
9400
- //# sourceMappingURL=search-DI4bM2w9.mjs.map
9493
+ export { prosemirrorToPortableText as $, isStandardPluginDefinition as A, handleContentPublish as At, EmailPipeline as B, image as Bt, getAllSources as C, handleContentDiscardDraft as Ct, probeUrl as D, handleContentList as Dt, getUrlSources as E, handleContentGetIncludingTrashed as Et, createPluginManager as F, handleContentUnschedule as Ft, extractRequestMeta as G, createHookPipeline as H, PluginRouteError as I, handleContentUpdate as It, definePlugin as J, sanitizeHeadersForSandbox as K, PluginRouteRegistry as L, validateRev as Lt, SandboxNotAvailableError as M, handleContentSchedule as Mt, createNoopSandboxRunner as N, handleContentTranslations as Nt, registerSource as O, handleContentListTrashed as Ot, PluginManager as P, handleContentUnpublish as Pt, portableTextToProsemirror as Q, DEV_CONSOLE_EMAIL_PLUGIN_ID as R, portableText as Rt, clearSources as S, handleContentDelete as St, getSource as T, handleContentGet as Tt, resolveExclusiveHooks as U, HookPipeline as V, CronExecutor as W, parseWxrString as X, parseWxr as Y, after as Z, buildPreviewUrl as _, hashString as _t, search as a, PluginStateRepository as at, parseWxrDate as b, handleContentCountTrashed as bt, getWidgetArea as c, handleMediaDelete as ct, getMenu as d, handleMediaUpdate as dt, isSafeHref as et, getMenus as f, handleRevisionGet as ft, isPreviewRequest as g, computeContentHash as gt, getPreviewToken as h, generateManifest as ht, getSuggestions as i, getSections as it, NoopSandboxRunner as j, handleContentRestore as jt, importReusableBlocksAsSections as k, handleContentPermanentDelete as kt, getWidgetAreas as l, handleMediaGet as lt, getComments as m, handleRevisionRestore as mt, extractSearchableFields as n, loadBundleFromR2 as nt, searchCollection as o, getCollectionInfo as ot, getCommentCount as p, handleRevisionList as pt, getTrustedProxyHeaders as q, getSearchStats as r, getSection as rt, searchWithDb as s, handleMediaCreate as st, extractPlainText as t, sanitizeHref as tt, getWidgetComponents as u, handleMediaList as ut, getPreviewUrl as v, handleContentCompare as vt, getFileSources as w, handleContentDuplicate as wt, wxrSource as x, handleContentCreate as xt, wordpressRestSource as y, handleContentCountScheduled as yt, devConsoleEmailDeliver as z, reference as zt };
9494
+ //# sourceMappingURL=search-B0effn3j.mjs.map