@easy-cms/core 1.7.1 → 1.8.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.
@@ -4426,7 +4426,7 @@ function read(response, maxBytes, deadline) {
4426
4426
  var keys = (list) => new Set(list.split(/\s+/).filter(Boolean));
4427
4427
  var CONFIG = keys(`secret db serverURL cors cronSecret timeZone webhooks events jobs localization routes admin
4428
4428
  upload auth collections globals endpoints cliCommands onRequest fieldTypes apiKeys email backups
4429
- audit logs plugins`);
4429
+ audit logs countCacheSeconds plugins`);
4430
4430
  var ADMIN = keys("path locale brand siteURL nav commands modules pages dashboard switcher");
4431
4431
  var AUTH = keys(`roles rbac tokenExpiration maxLoginAttempts lockWindow trustedOrigins
4432
4432
  resetPasswordExpiration inviteExpiration providers providerSignUp password setupCode members emails`);
@@ -4888,6 +4888,7 @@ function validateConfig(config) {
4888
4888
  validateBackups(config, add, (issue) => issues.push(issue));
4889
4889
  validateAudit(config, add);
4890
4890
  validateLogs(config, add);
4891
+ validateCountCache(config, add);
4891
4892
  validateAuth(config, add);
4892
4893
  validateCors(config.cors, add);
4893
4894
  validateLocalization(config, add);
@@ -5510,6 +5511,11 @@ function validateUpload(config, add) {
5510
5511
  var FOLDER_KEY = /^[a-z0-9][a-z0-9_-]{0,59}$/;
5511
5512
  var MIME_PATTERN = /^([\w.+-]+\/(\*|[\w.+-]+)|documents|office|archives)$/i;
5512
5513
  var HOST_PATTERN = /^(\*|(\*\.)?[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*)$/i;
5514
+ function validateCountCache(config, add) {
5515
+ const seconds = config.countCacheSeconds;
5516
+ if (seconds !== void 0 && !(typeof seconds === "number" && Number.isFinite(seconds) && seconds >= 0))
5517
+ add("countCacheSeconds", "must be a number of seconds, 0 or more");
5518
+ }
5513
5519
  function validateLogs(config, add) {
5514
5520
  const logs = config.logs;
5515
5521
  if (logs === void 0) return;
@@ -6534,7 +6540,9 @@ var EasyCMS = class {
6534
6540
  locale === ALL_LOCALES ? this.config.localization?.defaultLocale ?? locale : locale,
6535
6541
  this.config.localization?.locales ?? []
6536
6542
  );
6537
- const result = await this.db.find({ collection: collection2, where, sort, limit, page });
6543
+ const args = { collection: collection2, where, sort, limit, page };
6544
+ const count = options.count !== false || limit === 0;
6545
+ const result = count ? await this.db.find(args) : this.db.findPage ? await this.db.findPage(args) : { ...await this.db.find(args), totalDocs: null, totalPages: null };
6538
6546
  const found = draft ? await this.withDrafts(config, result.docs) : result.docs;
6539
6547
  const docs = await this.output(config, found, guard, { ...options, draft });
6540
6548
  return { ...result, docs };
@@ -9806,7 +9814,7 @@ async function readAdminModule(cms, index) {
9806
9814
  }
9807
9815
 
9808
9816
  // src/version.ts
9809
- var VERSION = true ? "1.7.1" : "0.0.0-dev";
9817
+ var VERSION = true ? "1.8.0" : "0.0.0-dev";
9810
9818
 
9811
9819
  // src/rest/handler.ts
9812
9820
  import { randomUUID as randomUUID4 } from "crypto";
@@ -10695,6 +10703,10 @@ function parseListQuery(url) {
10695
10703
  if (sort) query.sort = sort;
10696
10704
  const depth = integer("depth", params.depth, 0, 3);
10697
10705
  if (depth !== void 0) query.depth = depth;
10706
+ if (params.count !== void 0 && params.count !== "true") {
10707
+ if (params.count !== "false") throw new QueryError("count must be true or false");
10708
+ query.count = false;
10709
+ }
10698
10710
  return query;
10699
10711
  }
10700
10712
  function parseDepth(url) {
@@ -30,4 +30,5 @@ declare function matchesCondition(condition: FieldCondition, data: Data): boolea
30
30
  /** Problems with a condition, for the config's checks; `[]` when it's fine. */
31
31
  declare function conditionIssues(condition: unknown, siblings: readonly string[]): string[];
32
32
 
33
- export { type FieldCondition, conditionIssues, matchesCondition };
33
+ export { conditionIssues, matchesCondition };
34
+ export type { FieldCondition };
@@ -136,6 +136,11 @@ interface PaginatedDocs<T> {
136
136
  hasNextPage: boolean;
137
137
  hasPrevPage: boolean;
138
138
  }
139
+ /** A page read with `count: false`: no totals, which saves counting every matching document. */
140
+ interface UncountedDocs<T> extends Omit<PaginatedDocs<T>, 'totalDocs' | 'totalPages'> {
141
+ totalDocs: null;
142
+ totalPages: null;
143
+ }
139
144
  /**
140
145
  * How the adapter treats the database schema on startup.
141
146
  * - `push`: apply schema changes directly (development).
@@ -173,6 +178,11 @@ interface CreateMigrationResult {
173
178
  /** A connected database bound to one config. Returned by `DatabaseAdapter.init`. */
174
179
  interface Database {
175
180
  find(args: FindArgs): Promise<PaginatedDocs<RawDocument>>;
181
+ /**
182
+ * A page without counting the matching documents (`find` with `count: false`): `hasNextPage`
183
+ * from one row more. Optional: without it, `find` runs and its totals are dropped.
184
+ */
185
+ findPage?(args: FindArgs): Promise<UncountedDocs<RawDocument>>;
176
186
  findById(args: {
177
187
  collection: string;
178
188
  id: ID;
@@ -1670,6 +1680,11 @@ interface FindOptions extends ReadOptions {
1670
1680
  readonly limit?: number;
1671
1681
  /** 1-based. Default 1. */
1672
1682
  readonly page?: number;
1683
+ /**
1684
+ * `false` skips counting the matching documents: `totalDocs` and `totalPages` are `null`, and
1685
+ * `hasNextPage` still says whether there is more. Default `true`.
1686
+ */
1687
+ readonly count?: boolean;
1673
1688
  }
1674
1689
  interface CreateEasyCMSOptions {
1675
1690
  /** Project root. Default `process.cwd()`. */
@@ -1731,6 +1746,10 @@ declare class EasyCMS<C extends Config = Config> {
1731
1746
  user: AuthUser | null;
1732
1747
  context: RequestContext;
1733
1748
  }>;
1749
+ find<S extends Slug<C>, L extends string | undefined = undefined>(collection: S, options: FindOptions & {
1750
+ readonly locale?: L;
1751
+ readonly count: false;
1752
+ }): Promise<UncountedDocs<Doc<C, S, L>>>;
1734
1753
  find<S extends Slug<C>, L extends string | undefined = undefined>(collection: S, options?: FindOptions & {
1735
1754
  readonly locale?: L;
1736
1755
  }): Promise<PaginatedDocs<Doc<C, S, L>>>;
@@ -3308,6 +3327,13 @@ interface Config {
3308
3327
  * request id. Ignored when `createEasyCMS` is given a `logger`.
3309
3328
  */
3310
3329
  readonly logs?: LogsConfig;
3330
+ /**
3331
+ * How long, in seconds, the total of a paginated list (`totalDocs`, `totalPages`) is reused for
3332
+ * the same query. Counting reads every matching document, and many people open the same lists.
3333
+ * The documents themselves are always current; a total can be this old. `0` counts every time.
3334
+ * Default 5.
3335
+ */
3336
+ readonly countCacheSeconds?: number;
3311
3337
  readonly plugins?: readonly Plugin[];
3312
3338
  }
3313
3339
  /** The config after plugins ran, validation passed and defaults were applied. */
@@ -3339,4 +3365,5 @@ interface ResolvedConfig extends Omit<Config, 'cors' | 'localization' | 'routes'
3339
3365
  */
3340
3366
  declare function defineConfig<const TConfig extends Config>(config: TConfig): TConfig;
3341
3367
 
3342
- export { type BuiltinMediaCollection as $, ADAPTER_API_VERSION as A, type ApiKeyOperation as B, type ApiKeyPermissions as C, type ArrayField as D, type EmailSetting as E, type AuditChange as F, type AuditConfig as G, type AuditEntry as H, type ID as I, AuditLog as J, type AuditPage as K, type AuditVerification as L, Auth as M, type AuthConfig as N, type AuthProvider as O, type PaginatedDocs as P, type AuthProviderProfile as Q, type AuthProviderRequest as R, type AuthUser as S, type BackupsConfig as T, type BeforeChangeHook as U, type BeforeDeleteHook as V, type BeforeValidateHook as W, type Block as X, type BlocksField as Y, type BooleanField as Z, type BuiltinApiKeysCollection as _, ADMIN_ICONS as a, type GlobalDocument as a$, type BuiltinMediaFoldersCollection as a0, type BuiltinUsersCollection as a1, type BundleHints as a2, type CliCommand as a3, type CollectionAccess as a4, type CollectionAdmin as a5, type CollectionConfig as a6, type CollectionDocument as a7, type CollectionHooks as a8, type CollectionListAdmin as a9, type EndpointRequest as aA, type ErrorCode as aB, FIELD_TYPES as aC, type Field as aD, type FieldAccess as aE, type FieldAccessFn as aF, type FieldAdmin as aG, type FieldError as aH, type FieldRule as aI, type FieldType as aJ, type FieldTypeBase as aK, type FieldTypeDefinition as aL, type FieldTypeValidateContext as aM, type FieldValidate as aN, type FieldValidateContext as aO, type FieldValue as aP, type FieldsInput as aQ, type FieldsValue as aR, type FilterOptions as aS, type FilterOptionsArgs as aT, type FindArgs as aU, type FindOptions as aV, type FolderLevel as aW, type FolderPermissions as aX, ForbiddenError as aY, type GlobalAccess as aZ, type GlobalConfig as a_, type CollectionSlug as aa, type Config as ab, ConfigError as ac, type ConfigIssue as ad, type ContainerAdmin as ae, type CreateEasyCMSOptions as af, type CreateInput as ag, type CreateMigrationResult as ah, type CustomField as ai, type CustomFieldTypes as aj, type DashboardWidget as ak, type Database as al, type DatabaseAdapter as am, type DatabaseInitArgs as an, type DatabaseTransfer as ao, type DateField as ap, type DepthOptions as aq, type DirectUpload as ar, type DiskStorageOptions as as, type DocumentOf as at, EasyCMS as au, EasyCMSError as av, type EmailAdapter as aw, type EmailField as ax, type EmailMessage as ay, type Endpoint as az, type Access as b, type SignupResult as b$, type GlobalHooks as b0, type GlobalInput as b1, type GlobalSlug as b2, type GroupField as b3, type ImageSize as b4, type IncrementOptions as b5, type InferCollection as b6, type InferGlobal as b7, type JobConfig as b8, type JsonField as b9, type Plugin as bA, type PluginInfo as bB, type PluginTypes as bC, type PreviewTarget as bD, type PreviewURL as bE, QueryError as bF, ROLE_OPERATIONS as bG, type RawDocument as bH, type ReadOptions as bI, type RelationshipField as bJ, type RequestContext as bK, type ResolvedConfig as bL, type RichTextDocument as bM, type RichTextField as bN, type Role as bO, type RoleOperation as bP, type RolePermissions as bQ, Roles as bR, type RoutesConfig as bS, type ScheduledPublish as bT, SchemaError as bU, type SchemaMode as bV, type SelectField as bW, type SelectOption as bX, type Session as bY, type SidebarPanel as bZ, type SignupArgs as b_, type Label as ba, type LayoutNode as bb, type LivePreview as bc, type LocaleOf as bd, type LocalizationConfig as be, type LogDetails as bf, type Logger as bg, type LoginArgs as bh, type LogsConfig as bi, type MediaDocument as bj, type MediaSize as bk, type MembersConfig as bl, type MembersSignup as bm, type MigrationInfo as bn, type NavGroup as bo, NotFoundError as bp, type NumberField as bq, type OnRequest as br, type OnRequestArgs as bs, type Operation as bt, PLUGIN_API_VERSION as bu, type PasswordEmail as bv, type PasswordEmailArgs as bw, type PasswordEmailFn as bx, type PasswordLinkOptions as by, PayloadTooLargeError as bz, type AccessArgs as c, SingleSignOn as c0, type SlugField as c1, type SlugOf as c2, type SsoOutcome as c3, type SsoProviderRef as c4, type StorageAdapter as c5, type StoredFile as c6, type TextField as c7, type TextareaField as c8, TooManyRequestsError as c9, hasRows as cA, isAdmin as cB, isHasMany as cC, isSignedIn as cD, isStaff as cE, isSystemAdmin as cF, jsonLogger as cG, mimeAllowedBy as cH, rowFields as cI, silentLogger as cJ, uniqueWithinOf as cK, API_KEYS as cL, API_KEY_GLOBAL_OPERATIONS as cM, API_KEY_OPERATIONS as cN, DEFAULT_MAX_VERSIONS as cO, DEFAULT_PASSWORD_EMAILS as cP, FIELD_TYPE_BASES as cQ, FOLDER_LEVELS as cR, MediaFolders as cS, SSO_COOKIE as cT, codeOfStatus as cU, isJsonLogger as cV, keyAllows as cW, logFormat as cX, type TypedPlugin as ca, UnauthorizedError as cb, type UpdateInput as cc, type UpdateOptions as cd, type UploadConfig as ce, type UploadField as cf, type UploadFromURLConfig as cg, type UserIdentity as ch, ValidationError as ci, type Version as cj, type VersionSummary as ck, type VersionsConfig as cl, WEBHOOK_EVENTS as cm, type WebhookConfig as cn, type WebhookEvent as co, type WebhookPayload as cp, type Where as cq, type WhereOperators as cr, anyone as cs, consoleEmail as ct, consoleLogger as cu, createEasyCMS as cv, defineConfig as cw, defineFieldType as cx, definePlugin as cy, diskStorage as cz, type AccessOptions as d, type AdminBrand as e, type AdminCommand as f, type AdminComponent as g, type AdminConfig as h, type AdminFieldArgs as i, type AdminIcon as j, type AdminLocale as k, type AdminPage as l, type AdminRole as m, type AdminRoleChange as n, type AdminRoleField as o, type AdminRoleTarget as p, type AdminRoleView as q, type AdminRoles as r, type AdminSso as s, type AdminSwitcher as t, type AdminViewAccess as u, type AfterChangeHook as v, type AfterDeleteHook as w, type AfterReadHook as x, type ApiKeyContext as y, type ApiKeyGlobalOperation as z };
3368
+ export { ADAPTER_API_VERSION as A, AuditLog as J, Auth as M, ADMIN_ICONS as a, FIELD_TYPES as aC, ForbiddenError as aY, ConfigError as ac, EasyCMS as au, EasyCMSError as av, QueryError as bF, ROLE_OPERATIONS as bG, Roles as bR, SchemaError as bU, NotFoundError as bp, PLUGIN_API_VERSION as bu, PayloadTooLargeError as bz, SingleSignOn as c0, TooManyRequestsError as c9, diskStorage as cA, hasRows as cB, isAdmin as cC, isHasMany as cD, isSignedIn as cE, isStaff as cF, isSystemAdmin as cG, jsonLogger as cH, mimeAllowedBy as cI, rowFields as cJ, silentLogger as cK, uniqueWithinOf as cL, API_KEYS as cM, API_KEY_GLOBAL_OPERATIONS as cN, API_KEY_OPERATIONS as cO, DEFAULT_MAX_VERSIONS as cP, DEFAULT_PASSWORD_EMAILS as cQ, FIELD_TYPE_BASES as cR, FOLDER_LEVELS as cS, MediaFolders as cT, SSO_COOKIE as cU, codeOfStatus as cV, isJsonLogger as cW, keyAllows as cX, logFormat as cY, UnauthorizedError as cb, ValidationError as cj, WEBHOOK_EVENTS as cn, anyone as ct, consoleEmail as cu, consoleLogger as cv, createEasyCMS as cw, defineConfig as cx, defineFieldType as cy, definePlugin as cz };
3369
+ export type { BuiltinMediaCollection as $, ApiKeyOperation as B, ApiKeyPermissions as C, ArrayField as D, EmailSetting as E, AuditChange as F, AuditConfig as G, AuditEntry as H, ID as I, AuditPage as K, AuditVerification as L, AuthConfig as N, AuthProvider as O, PaginatedDocs as P, AuthProviderProfile as Q, AuthProviderRequest as R, AuthUser as S, BackupsConfig as T, BeforeChangeHook as U, BeforeDeleteHook as V, BeforeValidateHook as W, Block as X, BlocksField as Y, BooleanField as Z, BuiltinApiKeysCollection as _, GlobalDocument as a$, BuiltinMediaFoldersCollection as a0, BuiltinUsersCollection as a1, BundleHints as a2, CliCommand as a3, CollectionAccess as a4, CollectionAdmin as a5, CollectionConfig as a6, CollectionDocument as a7, CollectionHooks as a8, CollectionListAdmin as a9, EndpointRequest as aA, ErrorCode as aB, Field as aD, FieldAccess as aE, FieldAccessFn as aF, FieldAdmin as aG, FieldError as aH, FieldRule as aI, FieldType as aJ, FieldTypeBase as aK, FieldTypeDefinition as aL, FieldTypeValidateContext as aM, FieldValidate as aN, FieldValidateContext as aO, FieldValue as aP, FieldsInput as aQ, FieldsValue as aR, FilterOptions as aS, FilterOptionsArgs as aT, FindArgs as aU, FindOptions as aV, FolderLevel as aW, FolderPermissions as aX, GlobalAccess as aZ, GlobalConfig as a_, CollectionSlug as aa, Config as ab, ConfigIssue as ad, ContainerAdmin as ae, CreateEasyCMSOptions as af, CreateInput as ag, CreateMigrationResult as ah, CustomField as ai, CustomFieldTypes as aj, DashboardWidget as ak, Database as al, DatabaseAdapter as am, DatabaseInitArgs as an, DatabaseTransfer as ao, DateField as ap, DepthOptions as aq, DirectUpload as ar, DiskStorageOptions as as, DocumentOf as at, EmailAdapter as aw, EmailField as ax, EmailMessage as ay, Endpoint as az, Access as b, SignupResult as b$, GlobalHooks as b0, GlobalInput as b1, GlobalSlug as b2, GroupField as b3, ImageSize as b4, IncrementOptions as b5, InferCollection as b6, InferGlobal as b7, JobConfig as b8, JsonField as b9, Plugin as bA, PluginInfo as bB, PluginTypes as bC, PreviewTarget as bD, PreviewURL as bE, RawDocument as bH, ReadOptions as bI, RelationshipField as bJ, RequestContext as bK, ResolvedConfig as bL, RichTextDocument as bM, RichTextField as bN, Role as bO, RoleOperation as bP, RolePermissions as bQ, RoutesConfig as bS, ScheduledPublish as bT, SchemaMode as bV, SelectField as bW, SelectOption as bX, Session as bY, SidebarPanel as bZ, SignupArgs as b_, Label as ba, LayoutNode as bb, LivePreview as bc, LocaleOf as bd, LocalizationConfig as be, LogDetails as bf, Logger as bg, LoginArgs as bh, LogsConfig as bi, MediaDocument as bj, MediaSize as bk, MembersConfig as bl, MembersSignup as bm, MigrationInfo as bn, NavGroup as bo, NumberField as bq, OnRequest as br, OnRequestArgs as bs, Operation as bt, PasswordEmail as bv, PasswordEmailArgs as bw, PasswordEmailFn as bx, PasswordLinkOptions as by, AccessArgs as c, SlugField as c1, SlugOf as c2, SsoOutcome as c3, SsoProviderRef as c4, StorageAdapter as c5, StoredFile as c6, TextField as c7, TextareaField as c8, TypedPlugin as ca, UncountedDocs as cc, UpdateInput as cd, UpdateOptions as ce, UploadConfig as cf, UploadField as cg, UploadFromURLConfig as ch, UserIdentity as ci, Version as ck, VersionSummary as cl, VersionsConfig as cm, WebhookConfig as co, WebhookEvent as cp, WebhookPayload as cq, Where as cr, WhereOperators as cs, AccessOptions as d, AdminBrand as e, AdminCommand as f, AdminComponent as g, AdminConfig as h, AdminFieldArgs as i, AdminIcon as j, AdminLocale as k, AdminPage as l, AdminRole as m, AdminRoleChange as n, AdminRoleField as o, AdminRoleTarget as p, AdminRoleView as q, AdminRoles as r, AdminSso as s, AdminSwitcher as t, AdminViewAccess as u, AfterChangeHook as v, AfterDeleteHook as w, AfterReadHook as x, ApiKeyContext as y, ApiKeyGlobalOperation as z };
@@ -1,4 +1,4 @@
1
- import { I as ID, ab as Config, au as EasyCMS, be as LocalizationConfig, aD as Field, aH as FieldError, aS as FilterOptions, af as CreateEasyCMSOptions, bL as ResolvedConfig } from './config-CzW6kBeb.js';
1
+ import { I as ID, ab as Config, au as EasyCMS, be as LocalizationConfig, aD as Field, aH as FieldError, aS as FilterOptions, af as CreateEasyCMSOptions, bL as ResolvedConfig } from './config-zh7mTozB.js';
2
2
 
3
3
  /** Decrypts a file from `encryptBackup`; throws for another key or a changed file. */
4
4
  declare function decryptBackup(data: Uint8Array, encryptionKey: string): Uint8Array;
@@ -193,4 +193,5 @@ declare function createRootEndpointHandler<C extends Config>(instance: EasyCMS<C
193
193
  /** A cookie of the request; the `__Host-` one (set over HTTPS) first. */
194
194
  declare function readCookie(request: Request, name: string): string | undefined;
195
195
 
196
- export { type AdminBackup as A, type BackupState as B, CONFIG_FILE_NAMES as C, DEFAULT_ADMIN_PATH as D, readCookie as E, validateFields as F, writeBackupFile as G, 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, decryptBackup as p, fillMissing as q, resolveConfig as r, sharedEasyCMS as s, findConfigFile as t, forwardedClientIp as u, generateSlugs as v, importConfig as w, mergeForUpdate as x, parseId as y, platformClientIp as z };
196
+ export { CONFIG_FILE_NAMES as C, DEFAULT_ADMIN_PATH as D, readCookie as E, validateFields as F, writeBackupFile as G, 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, decryptBackup as p, fillMissing as q, resolveConfig as r, sharedEasyCMS as s, findConfigFile as t, forwardedClientIp as u, generateSlugs as v, importConfig as w, mergeForUpdate as x, parseId as y, platformClientIp as z };
197
+ export type { AdminBackup as A, BackupState as B, LoadConfigOptions as L, RestHandler as R, AdminBackups as a, ApiHandlerOptions as b, RestHandlerOptions as c };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { P as PaginatedDocs, I as ID, E as EmailSetting } from './config-CzW6kBeb.js';
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 LocaleOf, be as LocalizationConfig, bf as LogDetails, bg as Logger, bh as LoginArgs, bi as LogsConfig, bj as MediaDocument, bk as MediaSize, bl as MembersConfig, bm as MembersSignup, bn as MigrationInfo, bo as NavGroup, bp as NotFoundError, bq as NumberField, br as OnRequest, bs as OnRequestArgs, bt as Operation, bu as PLUGIN_API_VERSION, bv as PasswordEmail, bw as PasswordEmailArgs, bx as PasswordEmailFn, by as PasswordLinkOptions, bz as PayloadTooLargeError, bA as Plugin, bB as PluginInfo, bC as PluginTypes, bD as PreviewTarget, bE as PreviewURL, bF as QueryError, bG as ROLE_OPERATIONS, bH as RawDocument, bI as ReadOptions, bJ as RelationshipField, bK as RequestContext, bL as ResolvedConfig, bM as RichTextDocument, bN as RichTextField, bO as Role, bP as RoleOperation, bQ as RolePermissions, bR as Roles, bS as RoutesConfig, bT as ScheduledPublish, bU as SchemaError, bV as SchemaMode, bW as SelectField, bX as SelectOption, bY as Session, bZ as SidebarPanel, b_ as SignupArgs, b$ as SignupResult, c0 as SingleSignOn, c1 as SlugField, c2 as SlugOf, c3 as SsoOutcome, c4 as SsoProviderRef, c5 as StorageAdapter, c6 as StoredFile, c7 as TextField, c8 as TextareaField, c9 as TooManyRequestsError, ca as TypedPlugin, cb as UnauthorizedError, cc as UpdateInput, cd as UpdateOptions, ce as UploadConfig, cf as UploadField, cg as UploadFromURLConfig, ch as UserIdentity, ci as ValidationError, cj as Version, ck as VersionSummary, cl as VersionsConfig, cm as WEBHOOK_EVENTS, cn as WebhookConfig, co as WebhookEvent, cp as WebhookPayload, cq as Where, cr as WhereOperators, cs as anyone, ct as consoleEmail, cu as consoleLogger, cv as createEasyCMS, cw as defineConfig, cx as defineFieldType, cy as definePlugin, cz as diskStorage, cA as hasRows, cB as isAdmin, cC as isHasMany, cD as isSignedIn, cE as isStaff, cF as isSystemAdmin, cG as jsonLogger, cH as mimeAllowedBy, cI as rowFields, cJ as silentLogger, cK as uniqueWithinOf } from './config-CzW6kBeb.js';
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-BmKxHxuu.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-BsBQ-2qf.js';
1
+ import { P as PaginatedDocs, I as ID, E as EmailSetting } from './config-zh7mTozB.js';
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 LocaleOf, be as LocalizationConfig, bf as LogDetails, bg as Logger, bh as LoginArgs, bi as LogsConfig, bj as MediaDocument, bk as MediaSize, bl as MembersConfig, bm as MembersSignup, bn as MigrationInfo, bo as NavGroup, bp as NotFoundError, bq as NumberField, br as OnRequest, bs as OnRequestArgs, bt as Operation, bu as PLUGIN_API_VERSION, bv as PasswordEmail, bw as PasswordEmailArgs, bx as PasswordEmailFn, by as PasswordLinkOptions, bz as PayloadTooLargeError, bA as Plugin, bB as PluginInfo, bC as PluginTypes, bD as PreviewTarget, bE as PreviewURL, bF as QueryError, bG as ROLE_OPERATIONS, bH as RawDocument, bI as ReadOptions, bJ as RelationshipField, bK as RequestContext, bL as ResolvedConfig, bM as RichTextDocument, bN as RichTextField, bO as Role, bP as RoleOperation, bQ as RolePermissions, bR as Roles, bS as RoutesConfig, bT as ScheduledPublish, bU as SchemaError, bV as SchemaMode, bW as SelectField, bX as SelectOption, bY as Session, bZ as SidebarPanel, b_ as SignupArgs, b$ as SignupResult, c0 as SingleSignOn, c1 as SlugField, c2 as SlugOf, c3 as SsoOutcome, c4 as SsoProviderRef, c5 as StorageAdapter, c6 as StoredFile, c7 as TextField, c8 as TextareaField, c9 as TooManyRequestsError, ca as TypedPlugin, cb as UnauthorizedError, cc as UncountedDocs, cd as UpdateInput, ce as UpdateOptions, cf as UploadConfig, cg as UploadField, ch as UploadFromURLConfig, ci as UserIdentity, cj as ValidationError, ck as Version, cl as VersionSummary, cm as VersionsConfig, cn as WEBHOOK_EVENTS, co as WebhookConfig, cp as WebhookEvent, cq as WebhookPayload, cr as Where, cs as WhereOperators, ct as anyone, cu as consoleEmail, cv as consoleLogger, cw as createEasyCMS, cx as defineConfig, cy as defineFieldType, cz as definePlugin, cA as diskStorage, cB as hasRows, cC as isAdmin, cD as isHasMany, cE as isSignedIn, cF as isStaff, cG as isSystemAdmin, cH as jsonLogger, cI as mimeAllowedBy, cJ as rowFields, cK as silentLogger, cL as uniqueWithinOf } from './config-zh7mTozB.js';
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-uSB31Kh0.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-CVBEpaJ6.js';
5
5
  export { FieldCondition, matchesCondition } from './conditions.js';
6
6
 
7
7
  type DeliveryKind = 'webhook' | 'email';
@@ -221,4 +221,5 @@ interface AdminStatus {
221
221
  /** The version of `@easy-cms/core`, set when the package is built. */
222
222
  declare const VERSION: string;
223
223
 
224
- export { type AdminAttention, type AdminDeliveries, type AdminDelivery, type AdminEmail, type AdminEmailDelivery, type AdminJob, type AdminJobs, type AdminScheduledJob, type AdminStatus, type AdminWebhookDelivery, type BuiltInJob, type DeliveryKind, type DeliveryState, type EmailCheck, EmailSetting, ID, PaginatedDocs, type SearchHit, VERSION };
224
+ export { EmailSetting, ID, PaginatedDocs, VERSION };
225
+ export type { AdminAttention, AdminDeliveries, AdminDelivery, AdminEmail, AdminEmailDelivery, AdminJob, AdminJobs, AdminScheduledJob, AdminStatus, AdminWebhookDelivery, BuiltInJob, DeliveryKind, DeliveryState, EmailCheck, SearchHit };
package/dist/index.js CHANGED
@@ -24,7 +24,7 @@ import {
24
24
  sharedEasyCMS,
25
25
  silentLogger,
26
26
  slugify
27
- } from "./chunk-ERXCJ3V6.js";
27
+ } from "./chunk-CB2FT4WA.js";
28
28
  import {
29
29
  matchesCondition
30
30
  } from "./chunk-U266LV4M.js";
@@ -1,6 +1,6 @@
1
- import { ab as Config, al as Database, au as EasyCMS, bo as NavGroup, a6 as CollectionConfig, I as ID, bH as RawDocument, aD as Field, bL as ResolvedConfig, ad as ConfigIssue } from './config-CzW6kBeb.js';
2
- export { cL as API_KEYS, cM as API_KEY_GLOBAL_OPERATIONS, cN as API_KEY_OPERATIONS, cO as DEFAULT_MAX_VERSIONS, cP as DEFAULT_PASSWORD_EMAILS, cQ as FIELD_TYPE_BASES, cR as FOLDER_LEVELS, cS as MediaFolders, cT as SSO_COOKIE, cU as codeOfStatus, cA as hasRows, cC as isHasMany, cV as isJsonLogger, cW as keyAllows, cX as logFormat, cH as mimeAllowedBy, cI as rowFields, cK as uniqueWithinOf } from './config-CzW6kBeb.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 decryptBackup, q as fillMissing, t as findConfigFile, u as forwardedClientIp, v as generateSlugs, w as importConfig, x as mergeForUpdate, y as parseId, z as platformClientIp, E as readCookie, F as validateFields, G as writeBackupFile } from './handler-BsBQ-2qf.js';
1
+ import { Config, Database, EasyCMS, NavGroup, CollectionConfig, ID, RawDocument, Field, ResolvedConfig, ConfigIssue } from './index.js';
2
+ export { cM as API_KEYS, cN as API_KEY_GLOBAL_OPERATIONS, cO as API_KEY_OPERATIONS, cP as DEFAULT_MAX_VERSIONS, cQ as DEFAULT_PASSWORD_EMAILS, cR as FIELD_TYPE_BASES, cS as FOLDER_LEVELS, cT as MediaFolders, cU as SSO_COOKIE, cV as codeOfStatus, cB as hasRows, cD as isHasMany, cW as isJsonLogger, cX as keyAllows, cY as logFormat, cI as mimeAllowedBy, cJ as rowFields, cL as uniqueWithinOf } from './config-zh7mTozB.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 decryptBackup, q as fillMissing, t as findConfigFile, u as forwardedClientIp, v as generateSlugs, w as importConfig, x as mergeForUpdate, y as parseId, z as platformClientIp, E as readCookie, F as validateFields, G as writeBackupFile } from './handler-CVBEpaJ6.js';
4
4
  export { conditionIssues } from './conditions.js';
5
5
 
6
6
  /** The session cookie the REST API sets at login. */
@@ -141,4 +141,5 @@ declare const BUILTIN_COLLECTIONS: readonly ["users", "media"];
141
141
  /** Checks a config and returns every problem found. An empty array means it is valid. */
142
142
  declare function validateConfig(config: Config): ConfigIssue[];
143
143
 
144
- export { BUILTIN_COLLECTIONS, BUILTIN_NAV, type CopyProgress, type CopyResult, DEFAULT_DEPTH, EXTENSIONS, type HealthCheck, INTERNAL_COLLECTIONS, MAX_DEPTH, MEDIA, MEDIA_FOLDERS, MIME_GROUPS, MIN_PASSWORD_LENGTH, MIN_SECRET_LENGTH, SESSION_COOKIE, checkFormToken, checkRenamedOptions, configSignature, copyDatabase, expandMimeTypes, formToken, generateTypes, hashPassword, healthResponse, honeypotName, imageDimensions, mimeAllowed, populate, rateKeys, resolveAdminModule, singularize, sniffMimeType, validateConfig, verifyPassword, verifyTurnstile };
144
+ export { BUILTIN_COLLECTIONS, BUILTIN_NAV, DEFAULT_DEPTH, EXTENSIONS, INTERNAL_COLLECTIONS, MAX_DEPTH, MEDIA, MEDIA_FOLDERS, MIME_GROUPS, MIN_PASSWORD_LENGTH, MIN_SECRET_LENGTH, SESSION_COOKIE, checkFormToken, checkRenamedOptions, configSignature, copyDatabase, expandMimeTypes, formToken, generateTypes, hashPassword, healthResponse, honeypotName, imageDimensions, mimeAllowed, populate, rateKeys, resolveAdminModule, singularize, sniffMimeType, validateConfig, verifyPassword, verifyTurnstile };
145
+ export type { CopyProgress, CopyResult, HealthCheck };
package/dist/internal.js CHANGED
@@ -56,7 +56,7 @@ import {
56
56
  verifyPassword,
57
57
  verifyTurnstile,
58
58
  writeBackupFile
59
- } from "./chunk-ERXCJ3V6.js";
59
+ } from "./chunk-CB2FT4WA.js";
60
60
  import {
61
61
  conditionIssues
62
62
  } from "./chunk-U266LV4M.js";
@@ -37,4 +37,5 @@ declare function isLivePreview(): boolean;
37
37
  */
38
38
  declare function subscribeLivePreview<T = Record<string, unknown>>(onChange: (doc: T, message: LivePreviewMessage<T>) => void, options?: LivePreviewOptions): () => void;
39
39
 
40
- export { type LivePreviewMessage, type LivePreviewOptions, PREVIEW_PARAM, READY_MESSAGE, getPreviewToken, isLivePreview, subscribeLivePreview };
40
+ export { PREVIEW_PARAM, READY_MESSAGE, getPreviewToken, isLivePreview, subscribeLivePreview };
41
+ export type { LivePreviewMessage, LivePreviewOptions };
@@ -1,4 +1,4 @@
1
- import { ba as Label, aD as Field, I as ID, k as AdminLocale, t as AdminSwitcher, c4 as SsoProviderRef } from './config-CzW6kBeb.js';
1
+ import { ba as Label, aD as Field, I as ID, k as AdminLocale, t as AdminSwitcher, c4 as SsoProviderRef } from './config-zh7mTozB.js';
2
2
  import { FieldCondition } from './conditions.js';
3
3
 
4
4
  /** A Web Component from an admin module, with its `props` (plain JSON). */
@@ -339,4 +339,5 @@ interface SetFieldDetail {
339
339
  */
340
340
  declare function warnDeprecated(code: string, message: string): void;
341
341
 
342
- export { ADMIN_API_VERSION as A, type SetFieldDetail as S, type AdminCollection as a, type AdminComponentRef as b, type AdminElementProps as c, type AdminField as d, type AdminGlobal as e, type AdminLayoutNode as f, type AdminNavGroup as g, type AdminNavItem as h, type AdminNavNode as i, type AdminPageRef as j, type AdminPageRoute as k, type AdminSchema as l, type AdminWidgetRef as m, warnDeprecated as w };
342
+ export { ADMIN_API_VERSION as A, warnDeprecated as w };
343
+ export type { SetFieldDetail as S, AdminCollection as a, AdminComponentRef as b, AdminElementProps as c, AdminField as d, AdminGlobal as e, AdminLayoutNode as f, AdminNavGroup as g, AdminNavItem as h, AdminNavNode as i, AdminPageRef as j, AdminPageRoute as k, AdminSchema as l, AdminWidgetRef as m };
package/dist/plugin.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { a as ADMIN_ICONS, g as AdminComponent, j as AdminIcon, S as AuthUser, a3 as CliCommand, a4 as CollectionAccess, a6 as CollectionConfig, ab as Config, ac as ConfigError, ak as DashboardWidget, av as EasyCMSError, az as Endpoint, aA as EndpointRequest, aB as ErrorCode, aD as Field, aE as FieldAccess, aH as FieldError, aK as FieldTypeBase, aL as FieldTypeDefinition, aM as FieldTypeValidateContext, aY as ForbiddenError, a_ as GlobalConfig, I as ID, b8 as JobConfig, ba as Label, bo as NavGroup, bp as NotFoundError, br as OnRequest, bs as OnRequestArgs, bu as PLUGIN_API_VERSION, bz as PayloadTooLargeError, bA as Plugin, bB as PluginInfo, bC as PluginTypes, bF as QueryError, bK as RequestContext, c9 as TooManyRequestsError, ca as TypedPlugin, cb as UnauthorizedError, ci as ValidationError, cq as Where, cx as defineFieldType, cy as definePlugin } from './config-CzW6kBeb.js';
2
- export { A as ADMIN_API_VERSION, c as AdminElementProps, k as AdminPageRoute, S as SetFieldDetail, w as warnDeprecated } from './plugin-BmKxHxuu.js';
1
+ export { a as ADMIN_ICONS, g as AdminComponent, j as AdminIcon, S as AuthUser, a3 as CliCommand, a4 as CollectionAccess, a6 as CollectionConfig, ab as Config, ac as ConfigError, ak as DashboardWidget, av as EasyCMSError, az as Endpoint, aA as EndpointRequest, aB as ErrorCode, aD as Field, aE as FieldAccess, aH as FieldError, aK as FieldTypeBase, aL as FieldTypeDefinition, aM as FieldTypeValidateContext, aY as ForbiddenError, a_ as GlobalConfig, I as ID, b8 as JobConfig, ba as Label, bo as NavGroup, bp as NotFoundError, br as OnRequest, bs as OnRequestArgs, bu as PLUGIN_API_VERSION, bz as PayloadTooLargeError, bA as Plugin, bB as PluginInfo, bC as PluginTypes, bF as QueryError, bK as RequestContext, c9 as TooManyRequestsError, ca as TypedPlugin, cb as UnauthorizedError, cj as ValidationError, cr as Where, cy as defineFieldType, cz as definePlugin } from './config-zh7mTozB.js';
2
+ export { A as ADMIN_API_VERSION, c as AdminElementProps, k as AdminPageRoute, S as SetFieldDetail, w as warnDeprecated } from './plugin-uSB31Kh0.js';
3
3
  import './conditions.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easy-cms/core",
3
- "version": "1.7.1",
3
+ "version": "1.8.0",
4
4
  "description": "Embedded, code-first headless CMS for Nuxt and Next.js",
5
5
  "license": "MIT",
6
6
  "type": "module",