@easy-cms/core 0.63.0 → 0.64.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.
@@ -33,8 +33,9 @@ import {
33
33
  typeFromName,
34
34
  uniqueWithinOf,
35
35
  warnDeprecated,
36
+ withCharset,
36
37
  withPrivacy
37
- } from "./chunk-FPFWLQB5.js";
38
+ } from "./chunk-RTKWMVAC.js";
38
39
 
39
40
  // src/access.ts
40
41
  var isSystemAdmin = (user) => user?.role === "admin" && !user.apiKey && user.scoped !== true;
@@ -1015,6 +1016,21 @@ async function verifyTurnstile(secretKey, response, ip, fetcher = fetch) {
1015
1016
 
1016
1017
  // src/auth/cookie.ts
1017
1018
  var SESSION_COOKIE = "ecms-session";
1019
+ var hostCookie = (name) => `__Host-${name}`;
1020
+ function cookieValue(header, name) {
1021
+ if (!header) return void 0;
1022
+ let plain;
1023
+ for (const part of header.split(";")) {
1024
+ const eq = part.indexOf("=");
1025
+ if (eq <= 0) continue;
1026
+ const key = part.slice(0, eq).trim();
1027
+ if (key !== name && key !== hostCookie(name)) continue;
1028
+ const value = decodeURIComponent(part.slice(eq + 1).trim());
1029
+ if (key !== name) return value;
1030
+ plain ??= value;
1031
+ }
1032
+ return plain;
1033
+ }
1018
1034
 
1019
1035
  // src/auth/emails.ts
1020
1036
  var esc = (value) => value.replace(
@@ -1911,12 +1927,8 @@ var Auth = class {
1911
1927
  async userFromHeaders(headers) {
1912
1928
  const authorization = headers.get("authorization");
1913
1929
  if (authorization?.startsWith("Bearer ")) return this.verify(authorization.slice(7).trim());
1914
- for (const part of headers.get("cookie")?.split(";") ?? []) {
1915
- const eq = part.indexOf("=");
1916
- if (eq > 0 && part.slice(0, eq).trim() === SESSION_COOKIE)
1917
- return this.verify(decodeURIComponent(part.slice(eq + 1).trim()));
1918
- }
1919
- return null;
1930
+ const cookie2 = cookieValue(headers.get("cookie"), SESSION_COOKIE);
1931
+ return cookie2 ? this.verify(cookie2) : null;
1920
1932
  }
1921
1933
  /**
1922
1934
  * Returns the user for a signed session token, or for an API key (`ecms_…`, with `apiKey` set
@@ -6827,7 +6839,7 @@ var EasyCMS = class {
6827
6839
  const filename = withPrivacy(storageKey(file.name, mimeType, random2), isPrivate);
6828
6840
  const stored = [];
6829
6841
  try {
6830
- await storage.put(filename, file.data, { contentType: mimeType });
6842
+ await storage.put(filename, file.data, { contentType: withCharset(mimeType) });
6831
6843
  stored.push(filename);
6832
6844
  const dimensions = imageDimensions(file.data, mimeType);
6833
6845
  const sizes = await this.resizeImage(
@@ -7173,7 +7185,7 @@ var EasyCMS = class {
7173
7185
  const old = [String(doc.filename)];
7174
7186
  const copy = async (source, target) => {
7175
7187
  const file = await from.get(source);
7176
- if (file) await to.put(target, file.body, { contentType });
7188
+ if (file) await to.put(target, file.body, { contentType: withCharset(contentType) });
7177
7189
  };
7178
7190
  await copy(String(doc.filename), filename);
7179
7191
  const sizes = {};
@@ -9093,7 +9105,7 @@ async function readAdminModule(cms, index) {
9093
9105
  }
9094
9106
 
9095
9107
  // src/version.ts
9096
- var VERSION = true ? "0.63.0" : "0.0.0-dev";
9108
+ var VERSION = true ? "0.64.0" : "0.0.0-dev";
9097
9109
 
9098
9110
  // src/rest/admin-deliveries.ts
9099
9111
  var PER_PAGE = 50;
@@ -10029,7 +10041,8 @@ async function respond(cms, request, url, path, root, options, production) {
10029
10041
  const headers = new Headers({
10030
10042
  "content-type": "application/json; charset=utf-8",
10031
10043
  "cache-control": "no-store",
10032
- "x-content-type-options": "nosniff"
10044
+ "x-content-type-options": "nosniff",
10045
+ ...production ? { "strict-transport-security": "max-age=31536000" } : {}
10033
10046
  });
10034
10047
  try {
10035
10048
  if (path === null) throw new HttpError("Not found", 404);
@@ -10046,7 +10059,8 @@ async function respond(cms, request, url, path, root, options, production) {
10046
10059
  context,
10047
10060
  via: signedIn ? via : null,
10048
10061
  token,
10049
- headers
10062
+ headers,
10063
+ trustProxy: options.trustProxy === true
10050
10064
  };
10051
10065
  const method = request.method.toUpperCase();
10052
10066
  if (method !== "GET" && method !== "HEAD") checkCsrf(cms, ctx);
@@ -10222,6 +10236,7 @@ async function route(cms, ctx, method, path, options) {
10222
10236
  case "POST logout": {
10223
10237
  if (ctx.token) await cms.auth.logout(ctx.token);
10224
10238
  clearSessionCookies(ctx);
10239
+ ctx.headers.set("clear-site-data", '"cache"');
10225
10240
  return { body: { message: "Logged out" } };
10226
10241
  }
10227
10242
  case "GET me": {
@@ -10916,23 +10931,17 @@ function readToken(request) {
10916
10931
  return { token, via: token ? "cookie" : null };
10917
10932
  }
10918
10933
  function readCookie(request, name) {
10919
- const header = request.headers.get("cookie");
10920
- if (!header) return void 0;
10921
- for (const part of header.split(";")) {
10922
- const eq = part.indexOf("=");
10923
- if (eq > 0 && part.slice(0, eq).trim() === name)
10924
- return decodeURIComponent(part.slice(eq + 1).trim());
10925
- }
10926
- return void 0;
10934
+ return cookieValue(request.headers.get("cookie"), name);
10927
10935
  }
10928
- function sameHost(origin, request) {
10936
+ function sameHost(origin, request, trustProxy) {
10929
10937
  let host;
10930
10938
  try {
10931
10939
  host = new URL(origin).host;
10932
10940
  } catch {
10933
10941
  return false;
10934
10942
  }
10935
- const forwarded = request.headers.get("x-forwarded-host")?.split(",")[0]?.trim();
10943
+ const trusted = trustProxy || !!process.env.VERCEL || !!process.env.NETLIFY;
10944
+ const forwarded = trusted ? request.headers.get("x-forwarded-host")?.split(",")[0]?.trim() : void 0;
10936
10945
  return host === (forwarded || request.headers.get("host"));
10937
10946
  }
10938
10947
  function checkCsrf(cms, ctx) {
@@ -10940,7 +10949,7 @@ function checkCsrf(cms, ctx) {
10940
10949
  const fetchSite = ctx.request.headers.get("sec-fetch-site");
10941
10950
  const cookie2 = ctx.via === "cookie" && ctx.token !== void 0;
10942
10951
  const { cors } = cms.config;
10943
- const trusted = origin !== null && (origin === ctx.url.origin || sameHost(origin, ctx.request) || cms.config.auth.trustedOrigins.includes(origin) || !cookie2 && (cors === "*" || cors.includes(origin)));
10952
+ const trusted = origin !== null && (origin === ctx.url.origin || sameHost(origin, ctx.request, ctx.trustProxy) || cms.config.auth.trustedOrigins.includes(origin) || !cookie2 && (cors === "*" || cors.includes(origin)));
10944
10953
  if (origin !== null && !trusted) throw new ForbiddenError("CSRF check failed: untrusted origin");
10945
10954
  if (origin === null && fetchSite === "cross-site")
10946
10955
  throw new ForbiddenError("CSRF check failed: cross-site request");
@@ -10962,7 +10971,7 @@ async function serveFile(cms, key, head) {
10962
10971
  const file = await cms.storage.get(key);
10963
10972
  if (!file) throw new HttpError("Not found", 404);
10964
10973
  const extension = key.slice(key.lastIndexOf(".") + 1);
10965
- const type = TYPE_BY_EXTENSION[extension] ?? "application/octet-stream";
10974
+ const type = withCharset(TYPE_BY_EXTENSION[extension] ?? "application/octet-stream");
10966
10975
  return new Response(
10967
10976
  head ? null : file.body,
10968
10977
  {
@@ -11005,7 +11014,9 @@ async function servePrivateFile(cms, ctx, key, head) {
11005
11014
  }
11006
11015
  const file = await cms.privateStorage.get(key);
11007
11016
  if (!file) throw new HttpError("Not found", 404);
11008
- const type = TYPE_BY_EXTENSION[key.slice(key.lastIndexOf(".") + 1)] ?? "application/octet-stream";
11017
+ const type = withCharset(
11018
+ TYPE_BY_EXTENSION[key.slice(key.lastIndexOf(".") + 1)] ?? "application/octet-stream"
11019
+ );
11009
11020
  return new Response(
11010
11021
  head ? null : file.body,
11011
11022
  {
@@ -11116,9 +11127,14 @@ function isSecure(ctx) {
11116
11127
  return ctx.url.protocol === "https:" || process.env.NODE_ENV === "production";
11117
11128
  }
11118
11129
  function cookie(ctx, name, value, opts) {
11119
- const parts = [`${name}=${encodeURIComponent(value)}`, "Path=/", "SameSite=Lax"];
11130
+ const secure = isSecure(ctx);
11131
+ const parts = [
11132
+ `${secure ? hostCookie(name) : name}=${encodeURIComponent(value)}`,
11133
+ "Path=/",
11134
+ "SameSite=Lax"
11135
+ ];
11120
11136
  if (opts.httpOnly) parts.push("HttpOnly");
11121
- if (isSecure(ctx)) parts.push("Secure");
11137
+ if (secure) parts.push("Secure");
11122
11138
  if (opts.maxAge !== void 0) parts.push(`Max-Age=${opts.maxAge}`);
11123
11139
  return parts.join("; ");
11124
11140
  }
@@ -11197,6 +11213,9 @@ function setSessionCookies(cms, ctx, session) {
11197
11213
  function clearSessionCookies(ctx) {
11198
11214
  ctx.headers.append("set-cookie", cookie(ctx, SESSION_COOKIE, "", { httpOnly: true, maxAge: 0 }));
11199
11215
  ctx.headers.append("set-cookie", cookie(ctx, CSRF_COOKIE, "", { httpOnly: false, maxAge: 0 }));
11216
+ if (isSecure(ctx))
11217
+ for (const name of [SESSION_COOKIE, CSRF_COOKIE])
11218
+ ctx.headers.append("set-cookie", `${name}=; Path=/; Max-Age=0; Secure; SameSite=Lax`);
11200
11219
  }
11201
11220
  function errorResponse(cms, error, headers, production) {
11202
11221
  if (error instanceof EasyCMSError) {
@@ -11262,6 +11281,7 @@ function createApiHandler(config, options = {}) {
11262
11281
  if (!handler) {
11263
11282
  handler = createRestHandler(cms, {
11264
11283
  getClientIp,
11284
+ trustProxy: options.trustProxy === true,
11265
11285
  ...options.basePath ? { basePath: options.basePath } : {}
11266
11286
  });
11267
11287
  handlers.set(cms, handler);
@@ -271,6 +271,12 @@ function sizeKey(filename, size) {
271
271
  return filename.replace(/\.([^.]+)$/, `-${size}.$1`);
272
272
  }
273
273
  var PRIVATE_KEY = /^[\p{L}\p{M}\p{N}-]+\.private(-[\p{L}\p{N}_-]+)?\.[a-z0-9]+$/u;
274
+ function withCharset(type) {
275
+ if (/;\s*charset=/i.test(type)) return type;
276
+ const base = type.split(";")[0]?.trim().toLowerCase() ?? "";
277
+ const text = base.startsWith("text/") || /^application\/(json|xml|javascript|ecmascript)$/.test(base) || /\+(json|xml)$/.test(base);
278
+ return text ? `${type}; charset=utf-8` : type;
279
+ }
274
280
 
275
281
  // src/fields.ts
276
282
  var uniqueWithinOf = (field) => field.uniqueWithin === void 0 ? [] : [field.uniqueWithin].flat();
@@ -534,6 +540,7 @@ export {
534
540
  withPrivacy,
535
541
  sizeKey,
536
542
  PRIVATE_KEY,
543
+ withCharset,
537
544
  uniqueWithinOf,
538
545
  isHasMany,
539
546
  mimeAllowedBy,
@@ -172,6 +172,11 @@ interface RestHandlerOptions {
172
172
  readonly basePath?: string;
173
173
  /** Client IP, used with the email to rate-limit logins. Adapters provide it. */
174
174
  readonly getClientIp?: (request: Request) => string | undefined;
175
+ /**
176
+ * Behind a reverse proxy you control: its `X-Forwarded-Host` names the public host (for the
177
+ * CSRF check of a request's Origin). Vercel and Netlify are recognized without it.
178
+ */
179
+ readonly trustProxy?: boolean;
175
180
  }
176
181
  type RestHandler = (request: Request) => Promise<Response>;
177
182
  /** Creates the REST API as a Web-standard `(Request) => Response` handler. */
@@ -183,6 +188,7 @@ declare function createRestHandler<C extends Config>(instance: EasyCMS<C>, optio
183
188
  * use it; the standalone server does.
184
189
  */
185
190
  declare function createRootEndpointHandler<C extends Config>(instance: EasyCMS<C>, options?: Pick<RestHandlerOptions, 'getClientIp'>): (request: Request) => Promise<Response | undefined>;
191
+ /** A cookie of the request; the `__Host-` one (set over HTTPS) first. */
186
192
  declare function readCookie(request: Request, name: string): string | undefined;
187
193
 
188
194
  export { type AdminBackup as A, type BackupState as B, CONFIG_FILE_NAMES as C, DEFAULT_ADMIN_PATH as D, validateFields as E, writeBackupFile as F, type LoadConfigOptions as L, type RestHandler as R, type AdminBackups as a, type ApiHandlerOptions as b, type RestHandlerOptions as c, createApiHandler as d, createRestHandler as e, slugify as f, CSRF_COOKIE as g, CSRF_HEADER as h, DEFAULT_API_PATH as i, DEFAULT_MAX_FILE_SIZE as j, DEFAULT_TOKEN_EXPIRATION as k, loadConfig as l, applyDefaults as m, applyPlugins as n, createRootEndpointHandler as o, fillMissing as p, findConfigFile as q, resolveConfig as r, sharedEasyCMS as s, forwardedClientIp as t, generateSlugs as u, importConfig as v, mergeForUpdate as w, parseId as x, platformClientIp as y, readCookie as z };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { P as PaginatedDocs, I as ID, E as EmailSetting } from './config-Dgs6FE0S.js';
2
2
  export { A as ADAPTER_API_VERSION, a as ADMIN_ICONS, b as Access, c as AccessArgs, d as AccessOptions, e as AdminBrand, f as AdminCommand, g as AdminComponent, h as AdminConfig, i as AdminFieldArgs, j as AdminIcon, k as AdminLocale, l as AdminPage, m as AdminRole, n as AdminRoleChange, o as AdminRoleField, p as AdminRoleTarget, q as AdminRoleView, r as AdminRoles, s as AdminSso, t as AdminSwitcher, u as AdminViewAccess, v as AfterChangeHook, w as AfterDeleteHook, x as AfterReadHook, y as ApiKeyContext, z as ApiKeyGlobalOperation, B as ApiKeyOperation, C as ApiKeyPermissions, D as ArrayField, F as AuditChange, G as AuditConfig, H as AuditEntry, J as AuditLog, K as AuditPage, L as AuditVerification, M as Auth, N as AuthConfig, O as AuthProvider, Q as AuthProviderProfile, R as AuthProviderRequest, S as AuthUser, T as BackupsConfig, U as BeforeChangeHook, V as BeforeDeleteHook, W as BeforeValidateHook, X as Block, Y as BlocksField, Z as BooleanField, _ as BuiltinApiKeysCollection, $ as BuiltinMediaCollection, a0 as BuiltinMediaFoldersCollection, a1 as BuiltinUsersCollection, a2 as BundleHints, a3 as CliCommand, a4 as CollectionAccess, a5 as CollectionAdmin, a6 as CollectionConfig, a7 as CollectionDocument, a8 as CollectionHooks, a9 as CollectionListAdmin, aa as CollectionSlug, ab as Config, ac as ConfigError, ad as ConfigIssue, ae as ContainerAdmin, af as CreateEasyCMSOptions, ag as CreateInput, ah as CreateMigrationResult, ai as CustomField, aj as CustomFieldTypes, ak as DashboardWidget, al as Database, am as DatabaseAdapter, an as DatabaseInitArgs, ao as DatabaseTransfer, ap as DateField, aq as DepthOptions, ar as DirectUpload, as as DiskStorageOptions, at as DocumentOf, au as EasyCMS, av as EasyCMSError, aw as EmailAdapter, ax as EmailField, ay as EmailMessage, az as Endpoint, aA as EndpointRequest, aB as ErrorCode, aC as FIELD_TYPES, aD as Field, aE as FieldAccess, aF as FieldAccessFn, aG as FieldAdmin, aH as FieldError, aI as FieldRule, aJ as FieldType, aK as FieldTypeBase, aL as FieldTypeDefinition, aM as FieldTypeValidateContext, aN as FieldValidate, aO as FieldValidateContext, aP as FieldValue, aQ as FieldsInput, aR as FieldsValue, aS as FilterOptions, aT as FilterOptionsArgs, aU as FindArgs, aV as FindOptions, aW as FolderLevel, aX as FolderPermissions, aY as ForbiddenError, aZ as GlobalAccess, a_ as GlobalConfig, a$ as GlobalDocument, b0 as GlobalHooks, b1 as GlobalInput, b2 as GlobalSlug, b3 as GroupField, b4 as ImageSize, b5 as IncrementOptions, b6 as InferCollection, b7 as InferGlobal, b8 as JobConfig, b9 as JsonField, ba as Label, bb as LayoutNode, bc as LivePreview, bd as LocalizationConfig, be as Logger, bf as LoginArgs, bg as MediaDocument, bh as MediaSize, bi as MembersConfig, bj as MembersSignup, bk as MigrationInfo, bl as NavGroup, bm as NotFoundError, bn as NumberField, bo as OnRequest, bp as OnRequestArgs, bq as Operation, br as PLUGIN_API_VERSION, bs as PasswordEmail, bt as PasswordEmailArgs, bu as PasswordEmailFn, bv as PasswordLinkOptions, bw as PayloadTooLargeError, bx as Plugin, by as PluginInfo, bz as PluginTypes, bA as PreviewTarget, bB as PreviewURL, bC as QueryError, bD as ROLE_OPERATIONS, bE as RawDocument, bF as ReadOptions, bG as RelationshipField, bH as RequestContext, bI as ResolvedConfig, bJ as RichTextDocument, bK as RichTextField, bL as Role, bM as RoleOperation, bN as RolePermissions, bO as Roles, bP as RoutesConfig, bQ as ScheduledPublish, bR as SchemaError, bS as SchemaMode, bT as SelectField, bU as SelectOption, bV as Session, bW as SidebarPanel, bX as SignupArgs, bY as SignupResult, bZ as SingleSignOn, b_ as SlugField, b$ as SlugOf, c0 as SsoOutcome, c1 as SsoProviderRef, c2 as StorageAdapter, c3 as StoredFile, c4 as TextField, c5 as TextareaField, c6 as TooManyRequestsError, c7 as TypedPlugin, c8 as UnauthorizedError, c9 as UpdateInput, ca as UpdateOptions, cb as UploadConfig, cc as UploadField, cd as UploadFromURLConfig, ce as UserIdentity, cf as ValidationError, cg as Version, ch as VersionSummary, ci as VersionsConfig, cj as WEBHOOK_EVENTS, ck as WebhookConfig, cl as WebhookEvent, cm as WebhookPayload, cn as Where, co as WhereOperators, cp as anyone, cq as consoleEmail, cr as consoleLogger, cs as createEasyCMS, ct as defineConfig, cu as defineFieldType, cv as definePlugin, cw as diskStorage, cx as hasRows, cy as isAdmin, cz as isHasMany, cA as isSignedIn, cB as isStaff, cC as isSystemAdmin, cD as mimeAllowedBy, cE as rowFields, cF as silentLogger, cG as uniqueWithinOf } from './config-Dgs6FE0S.js';
3
3
  export { A as ADMIN_API_VERSION, a as AdminCollection, b as AdminComponentRef, c as AdminElementProps, d as AdminField, e as AdminGlobal, f as AdminLayoutNode, g as AdminNavGroup, h as AdminNavItem, i as AdminNavNode, j as AdminPageRef, k as AdminPageRoute, l as AdminSchema, m as AdminWidgetRef, S as SetFieldDetail, w as warnDeprecated } from './plugin-8hrkYMuR.js';
4
- export { A as AdminBackup, a as AdminBackups, b as ApiHandlerOptions, B as BackupState, L as LoadConfigOptions, R as RestHandler, c as RestHandlerOptions, d as createApiHandler, e as createRestHandler, l as loadConfig, r as resolveConfig, s as sharedEasyCMS, f as slugify } from './handler-CcQjkj5Q.js';
4
+ export { A as AdminBackup, a as AdminBackups, b as ApiHandlerOptions, B as BackupState, L as LoadConfigOptions, R as RestHandler, c as RestHandlerOptions, d as createApiHandler, e as createRestHandler, l as loadConfig, r as resolveConfig, s as sharedEasyCMS, f as slugify } from './handler-CcmsrLs8.js';
5
5
  export { FieldCondition, matchesCondition } from './conditions.js';
6
6
 
7
7
  type DeliveryKind = 'webhook' | 'email';
package/dist/index.js CHANGED
@@ -23,7 +23,7 @@ import {
23
23
  sharedEasyCMS,
24
24
  silentLogger,
25
25
  slugify
26
- } from "./chunk-LN4M4BUP.js";
26
+ } from "./chunk-JZW6G6XI.js";
27
27
  import {
28
28
  matchesCondition
29
29
  } from "./chunk-U266LV4M.js";
@@ -48,7 +48,7 @@ import {
48
48
  defineFieldType,
49
49
  definePlugin,
50
50
  warnDeprecated
51
- } from "./chunk-FPFWLQB5.js";
51
+ } from "./chunk-RTKWMVAC.js";
52
52
  export {
53
53
  ADAPTER_API_VERSION,
54
54
  ADMIN_API_VERSION,
@@ -1,6 +1,6 @@
1
1
  import { ab as Config, al as Database, bl as NavGroup, a6 as CollectionConfig, I as ID, bE as RawDocument, aD as Field, bI as ResolvedConfig, ad as ConfigIssue } from './config-Dgs6FE0S.js';
2
2
  export { cH as API_KEYS, cI as API_KEY_GLOBAL_OPERATIONS, cJ as API_KEY_OPERATIONS, cK as DEFAULT_MAX_VERSIONS, cL as DEFAULT_PASSWORD_EMAILS, cM as FIELD_TYPE_BASES, cN as FOLDER_LEVELS, cO as MediaFolders, cP as SSO_COOKIE, cQ as codeOfStatus, cx as hasRows, cz as isHasMany, cR as keyAllows, cD as mimeAllowedBy, cE as rowFields, cG as uniqueWithinOf } from './config-Dgs6FE0S.js';
3
- export { C as CONFIG_FILE_NAMES, g as CSRF_COOKIE, h as CSRF_HEADER, D as DEFAULT_ADMIN_PATH, i as DEFAULT_API_PATH, j as DEFAULT_MAX_FILE_SIZE, k as DEFAULT_TOKEN_EXPIRATION, m as applyDefaults, n as applyPlugins, o as createRootEndpointHandler, p as fillMissing, q as findConfigFile, t as forwardedClientIp, u as generateSlugs, v as importConfig, w as mergeForUpdate, x as parseId, y as platformClientIp, z as readCookie, E as validateFields, F as writeBackupFile } from './handler-CcQjkj5Q.js';
3
+ export { C as CONFIG_FILE_NAMES, g as CSRF_COOKIE, h as CSRF_HEADER, D as DEFAULT_ADMIN_PATH, i as DEFAULT_API_PATH, j as DEFAULT_MAX_FILE_SIZE, k as DEFAULT_TOKEN_EXPIRATION, m as applyDefaults, n as applyPlugins, o as createRootEndpointHandler, p as fillMissing, q as findConfigFile, t as forwardedClientIp, u as generateSlugs, v as importConfig, w as mergeForUpdate, x as parseId, y as platformClientIp, z as readCookie, E as validateFields, F as writeBackupFile } from './handler-CcmsrLs8.js';
4
4
  export { conditionIssues } from './conditions.js';
5
5
 
6
6
  /** The session cookie the REST API sets at login. */
package/dist/internal.js CHANGED
@@ -52,7 +52,7 @@ import {
52
52
  verifyPassword,
53
53
  verifyTurnstile,
54
54
  writeBackupFile
55
- } from "./chunk-LN4M4BUP.js";
55
+ } from "./chunk-JZW6G6XI.js";
56
56
  import {
57
57
  conditionIssues
58
58
  } from "./chunk-U266LV4M.js";
@@ -70,7 +70,7 @@ import {
70
70
  rowFields,
71
71
  sniffMimeType,
72
72
  uniqueWithinOf
73
- } from "./chunk-FPFWLQB5.js";
73
+ } from "./chunk-RTKWMVAC.js";
74
74
 
75
75
  // src/typegen.ts
76
76
  var pascal = (name) => name.split(/[^A-Za-z0-9]+/).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
package/dist/plugin.js CHANGED
@@ -16,7 +16,7 @@ import {
16
16
  defineFieldType,
17
17
  definePlugin,
18
18
  warnDeprecated
19
- } from "./chunk-FPFWLQB5.js";
19
+ } from "./chunk-RTKWMVAC.js";
20
20
  export {
21
21
  ADMIN_API_VERSION,
22
22
  ADMIN_ICONS,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easy-cms/core",
3
- "version": "0.63.0",
3
+ "version": "0.64.0",
4
4
  "description": "Embedded, code-first headless CMS for Nuxt and Next.js",
5
5
  "license": "MIT",
6
6
  "type": "module",