rimecms 0.30.3 → 0.31.1

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 (86) hide show
  1. package/README.md +1 -39
  2. package/dist/.rime-modules.d.ts +23 -0
  3. package/dist/.rime-modules.json +1 -0
  4. package/dist/adapter-sqlite/generate-schema/write.server.js +6 -6
  5. package/dist/core/areas/config/builder.server.d.ts +0 -1
  6. package/dist/core/collections/auth/hooks/before-upsert/augment-fields-password.server.d.ts +1 -1
  7. package/dist/core/collections/config/builder.server.d.ts +0 -1
  8. package/dist/core/collections/upload/hooks/convert-base64.server.d.ts +1 -1
  9. package/dist/core/collections/upload/hooks/extract-path.server.d.ts +1 -1
  10. package/dist/core/collections/upload/hooks/handle-path-creation.server.d.ts +1 -1
  11. package/dist/core/collections/upload/hooks/process-file-upload.server.d.ts +1 -1
  12. package/dist/core/config/auth/better-auth.server.d.ts +3 -3
  13. package/dist/core/config/client/augment-plugins.d.ts +1 -5
  14. package/dist/core/config/client/augment-plugins.js +3 -3
  15. package/dist/core/config/client/build-config.d.ts +1 -5
  16. package/dist/core/config/config-context.server.d.ts +1 -1
  17. package/dist/core/config/server/augment-plugins.server.d.ts +2 -42
  18. package/dist/core/config/server/augment-plugins.server.js +11 -6
  19. package/dist/core/config/server/build-config.server.d.ts +9 -4007
  20. package/dist/core/config/types.d.ts +12 -11
  21. package/dist/core/dev/cache/index.server.js +1 -1
  22. package/dist/core/dev/cli/clear/index.server.js +2 -0
  23. package/dist/core/dev/cli/generate/index.server.js +4 -0
  24. package/dist/core/dev/cli/generate-manifest/index.server.d.ts +17 -0
  25. package/dist/core/dev/cli/generate-manifest/index.server.js +221 -0
  26. package/dist/core/dev/cli/index.js +42 -0
  27. package/dist/core/dev/cli/init/index.server.js +11 -4
  28. package/dist/core/dev/cli/init/templates.d.ts +1 -1
  29. package/dist/core/dev/cli/init/templates.js +5 -3
  30. package/dist/core/dev/cli/util/package-manager.server.js +5 -3
  31. package/dist/core/dev/constants.d.ts +10 -0
  32. package/dist/core/dev/constants.js +15 -0
  33. package/dist/core/dev/generate/routes/common.server.js +4 -7
  34. package/dist/core/dev/generate/routes/index.server.js +25 -4
  35. package/dist/core/dev/generate/runtime/index.server.d.ts +34 -14
  36. package/dist/core/dev/generate/runtime/index.server.js +56 -57
  37. package/dist/core/dev/generate/runtime/parse-exports.server.d.ts +7 -0
  38. package/dist/core/dev/generate/runtime/parse-exports.server.js +40 -0
  39. package/dist/core/dev/generate/sanitize/index.server.d.ts +0 -7
  40. package/dist/core/dev/generate/sanitize/index.server.js +57 -5
  41. package/dist/core/dev/generate/types/index.server.js +16 -39
  42. package/dist/core/dev/vite/index.server.d.ts +1 -0
  43. package/dist/core/dev/vite/index.server.js +203 -42
  44. package/dist/core/ensure.server.d.ts +4 -3
  45. package/dist/core/ensure.server.js +8 -8
  46. package/dist/core/handlers/index.js +2 -2
  47. package/dist/core/operations/hooks/before-upsert/data-config-map.server.d.ts +1 -1
  48. package/dist/core/operations/hooks/before-upsert/handle-new-version.server.d.ts +1 -1
  49. package/dist/core/operations/hooks/before-upsert/original-config-map.server.d.ts +1 -1
  50. package/dist/core/operations/hooks/before-upsert/set-default-values.server.d.ts +1 -1
  51. package/dist/core/operations/hooks/before-upsert/validate-fields.server.d.ts +1 -1
  52. package/dist/core/operations/hooks/index.server.d.ts +0 -4
  53. package/dist/core/operations/hooks/index.server.js +0 -4
  54. package/dist/core/plugins/api-init/index.d.ts +2 -0
  55. package/dist/core/plugins/api-init/index.js +1 -0
  56. package/dist/core/plugins/api-init/{index.server.d.ts → module.server.d.ts} +0 -1
  57. package/dist/core/plugins/api-init/{index.server.js → module.server.js} +0 -1
  58. package/dist/core/plugins/cache/index.d.ts +2 -5
  59. package/dist/core/plugins/cache/index.js +1 -21
  60. package/dist/core/plugins/cache/module.d.ts +4 -0
  61. package/dist/core/plugins/cache/module.js +22 -0
  62. package/dist/core/plugins/cache/{index.server.d.ts → module.server.d.ts} +1 -2
  63. package/dist/core/plugins/cache/{index.server.js → module.server.js} +0 -1
  64. package/dist/core/plugins/index.d.ts +1 -8
  65. package/dist/core/plugins/index.js +0 -3
  66. package/dist/core/plugins/mailer/index.d.ts +2 -0
  67. package/dist/core/plugins/mailer/index.js +1 -0
  68. package/dist/core/plugins/mailer/{index.server.d.ts → module.server.d.ts} +0 -1
  69. package/dist/core/plugins/mailer/{index.server.js → module.server.js} +0 -1
  70. package/dist/core/plugins/sse/index.d.ts +2 -0
  71. package/dist/core/plugins/sse/index.js +1 -0
  72. package/dist/core/plugins/sse/{index.server.d.ts → module.server.d.ts} +0 -1
  73. package/dist/core/plugins/sse/{index.server.js → module.server.js} +0 -1
  74. package/dist/core/rime.server.d.ts +16 -16
  75. package/dist/fields/link/index.js +59 -56
  76. package/dist/fields/relation/index.js +63 -70
  77. package/dist/index.d.ts +3 -3
  78. package/dist/index.js +3 -3
  79. package/dist/panel/context/config.svelte.d.ts +2 -2
  80. package/dist/panel/context/documentForm.svelte.d.ts +2 -2
  81. package/dist/panel/context/live.svelte.js +1 -1
  82. package/dist/panel/pages/auth/sign-in/SignIn.svelte +6 -1
  83. package/dist/server.d.ts +4 -4
  84. package/dist/server.js +4 -4
  85. package/dist/types.d.ts +1 -1
  86. package/package.json +4 -2
package/README.md CHANGED
@@ -76,44 +76,6 @@ The `rime init` command will automatically:
76
76
  - Install dependencies.
77
77
  - Push initial schema
78
78
 
79
- > [!NOTE]
80
- > Please check that these files have been properly configured:
81
-
82
- ```ts
83
- // vite.config.ts
84
- import { defineConfig } from 'vite';
85
- import { sveltekit } from '@sveltejs/kit/vite';
86
- import { rime } from 'rimecms/vite';
87
-
88
- export default defineConfig({
89
- plugins: [rime(), sveltekit()]
90
- });
91
- ```
92
-
93
- ```typescript
94
- // src/hooks.server.ts (should be created)
95
- import config from '$lib/+rime.generated/rime.config.server.js';
96
- import { handlers } from 'rimecms/server';
97
- import { sequence } from '@sveltejs/kit/hooks';
98
-
99
- export const handle = sequence(...(await handlers(config)));
100
- ```
101
-
102
- ```
103
- #.env
104
- BETTER_AUTH_SECRET=super_secret
105
- PUBLIC_RIME_URL=http://localhost:5173
106
-
107
- RIME_LOG_TO_FILE=true
108
- RIME_LOG_LEVEL=DEBUG
109
-
110
- # RIME_CACHE_ENABLED=false
111
- # RIME_SMTP_USER=user@mail.com
112
- # RIME_SMTP_PASSWORD=supersecret
113
- # RIME_SMTP_HOST=smtphost.com
114
- # RIME_SMTP_PORT=465
115
- ```
116
-
117
79
  ### 3. Create the first admin user
118
80
 
119
81
  ```bash
@@ -129,7 +91,7 @@ curl -v POST http://localhost:5173/api/init \
129
91
  ## Configuration Example
130
92
 
131
93
  ```typescript
132
- // ./src/lib/+rime/rime.config.ts
94
+ // ./src/lib/+rime/rime.config.server.ts
133
95
  import { rime, Collection, Area } from '$rime/config';
134
96
  import { adapterSqlite } from 'rimecms/adapter-sqlite';
135
97
  import { Settings2 } from '@lucide/svelte';
@@ -0,0 +1,23 @@
1
+ declare module '$rime/modules/rimecms/core/plugins/sse' {
2
+ export * from 'rimecms/dist/core/plugins/sse/module.server.js';
3
+ }
4
+
5
+ declare module '$rime/modules/rimecms/core/plugins/cache' {
6
+ export * from 'rimecms/dist/core/plugins/cache/module.server.js';
7
+ }
8
+
9
+ declare module '$rime/modules/rimecms/core/plugins/mailer' {
10
+ export * from 'rimecms/dist/core/plugins/mailer/module.server.js';
11
+ }
12
+
13
+ declare module '$rime/modules/rimecms/core/plugins/api-init' {
14
+ export * from 'rimecms/dist/core/plugins/api-init/module.server.js';
15
+ }
16
+
17
+ declare module '$rime/modules/rimecms/fields/relation' {
18
+ export * from 'rimecms/dist/fields/relation/module.server.js';
19
+ }
20
+
21
+ declare module '$rime/modules/rimecms/fields/link' {
22
+ export * from 'rimecms/dist/fields/link/module.server.js';
23
+ }
@@ -0,0 +1 @@
1
+ {"core/plugins/sse":{"server":"core/plugins/sse/module.server.js"},"core/plugins/cache":{"client":"core/plugins/cache/module.js","server":"core/plugins/cache/module.server.js"},"core/plugins/mailer":{"server":"core/plugins/mailer/module.server.js"},"core/plugins/api-init":{"server":"core/plugins/api-init/module.server.js"},"fields/relation":{"client":"fields/relation/module.js","server":"fields/relation/module.server.js"},"fields/link":{"client":"fields/link/module.js","server":"fields/link/module.server.js"}}
@@ -1,19 +1,19 @@
1
1
  import cache from '../../core/dev/cache/index.server.js';
2
2
  import { getPackageManager } from '../../core/dev/cli/util/package-manager.server.js';
3
+ import { schemaPath } from '../../core/dev/constants.js';
3
4
  import { logger } from '../../core/logger/index.server.js';
4
5
  import fs from 'fs';
5
6
  import { spawnSync } from 'node:child_process';
6
7
  import path from 'node:path';
7
- const OUTPUT_DIR = '+rime.generated';
8
8
  const write = (schema) => {
9
9
  const cachedSchema = cache.get('schema');
10
10
  if (cachedSchema && cachedSchema === schema) {
11
11
  return;
12
12
  }
13
- const outputPath = path.join('./src/lib', OUTPUT_DIR);
14
- const outputFile = path.join(outputPath, 'schema.server.ts');
15
- if (!fs.existsSync(outputPath)) {
16
- fs.mkdirSync(outputPath);
13
+ const outputFile = schemaPath();
14
+ const outputDir = path.dirname(outputFile);
15
+ if (!fs.existsSync(outputDir)) {
16
+ fs.mkdirSync(outputDir, { recursive: true });
17
17
  }
18
18
  try {
19
19
  fs.writeFileSync(outputFile, schema);
@@ -30,7 +30,7 @@ const write = (schema) => {
30
30
  deno: 'npx'
31
31
  };
32
32
  const command = commandMap[pm];
33
- logger.info('[✓] Schema: generated at src/lib/server/schema.ts');
33
+ logger.info(`[✓] Schema: generated at ${outputFile}`);
34
34
  console.log(`\n ⚡︎ ${command} drizzle-kit generate \n`);
35
35
  const generateResult = spawnSync(command, ['drizzle-kit', 'generate'], { stdio: 'inherit' });
36
36
  if (generateResult.error || generateResult.status !== 0) {
@@ -8,7 +8,6 @@ export declare const hook: {
8
8
  beforeUpsert: <S extends import("../../types/doc").DocType = "raw">(handler: import("../../operations/hooks/index.server.js").Hook<S, "create" | "update", "before">) => import("../../operations/hooks/index.server.js").Hook<S, "create" | "update", "before">;
9
9
  beforeUpdate: <S extends import("../../types/doc").DocType = "raw">(handler: import("../../operations/hooks/index.server.js").Hook<S, "update", "before">) => import("../../operations/hooks/index.server.js").Hook<S, "update", "before">;
10
10
  beforeDelete: <S extends import("../../types/doc").DocType = "raw">(handler: import("../../operations/hooks/index.server.js").Hook<S, "delete", "before">) => import("../../operations/hooks/index.server.js").Hook<S, "delete", "before">;
11
- afterRead: <S extends import("../../types/doc").DocType = "raw">(handler: import("../../operations/hooks/index.server.js").Hook<S, "read", "after">) => import("../../operations/hooks/index.server.js").Hook<S, "read", "after">;
12
11
  afterCreate: <S extends import("../../types/doc").DocType = "raw">(handler: import("../../operations/hooks/index.server.js").Hook<S, "create", "after">) => import("../../operations/hooks/index.server.js").Hook<S, "create", "after">;
13
12
  afterUpsert: <S extends import("../../types/doc").DocType = "raw">(handler: import("../../operations/hooks/index.server.js").Hook<S, "create" | "update", "after">) => import("../../operations/hooks/index.server.js").Hook<S, "create" | "update", "after">;
14
13
  afterUpdate: <S extends import("../../types/doc").DocType = "raw">(handler: import("../../operations/hooks/index.server.js").Hook<S, "update", "after">) => import("../../operations/hooks/index.server.js").Hook<S, "update", "after">;
@@ -3,4 +3,4 @@
3
3
  * add fields password and confirmPassword
4
4
  * to add validations
5
5
  */
6
- export declare const augmentFieldsPassword: import("../../../../operations/hooks/index.server.js").Hook<"auth", "update" | "create", "before">;
6
+ export declare const augmentFieldsPassword: import("../../../../operations/hooks/index.server.js").Hook<"auth", "create" | "update", "before">;
@@ -8,7 +8,6 @@ export declare const hook: {
8
8
  beforeUpsert: <S extends import("../../types/doc.js").DocType = "raw">(handler: import("../../operations/hooks/index.server.js").Hook<S, "create" | "update", "before">) => import("../../operations/hooks/index.server.js").Hook<S, "create" | "update", "before">;
9
9
  beforeUpdate: <S extends import("../../types/doc.js").DocType = "raw">(handler: import("../../operations/hooks/index.server.js").Hook<S, "update", "before">) => import("../../operations/hooks/index.server.js").Hook<S, "update", "before">;
10
10
  beforeDelete: <S extends import("../../types/doc.js").DocType = "raw">(handler: import("../../operations/hooks/index.server.js").Hook<S, "delete", "before">) => import("../../operations/hooks/index.server.js").Hook<S, "delete", "before">;
11
- afterRead: <S extends import("../../types/doc.js").DocType = "raw">(handler: import("../../operations/hooks/index.server.js").Hook<S, "read", "after">) => import("../../operations/hooks/index.server.js").Hook<S, "read", "after">;
12
11
  afterCreate: <S extends import("../../types/doc.js").DocType = "raw">(handler: import("../../operations/hooks/index.server.js").Hook<S, "create", "after">) => import("../../operations/hooks/index.server.js").Hook<S, "create", "after">;
13
12
  afterUpsert: <S extends import("../../types/doc.js").DocType = "raw">(handler: import("../../operations/hooks/index.server.js").Hook<S, "create" | "update", "after">) => import("../../operations/hooks/index.server.js").Hook<S, "create" | "update", "after">;
14
13
  afterUpdate: <S extends import("../../types/doc.js").DocType = "raw">(handler: import("../../operations/hooks/index.server.js").Hook<S, "update", "after">) => import("../../operations/hooks/index.server.js").Hook<S, "update", "after">;
@@ -10,4 +10,4 @@
10
10
  * @param args Hook arguments containing the document to process
11
11
  * @returns Updated args object with converted file data
12
12
  */
13
- export declare const castBase64ToFile: import("../../../operations/hooks/index.server.js").Hook<"upload", "update" | "create", "before">;
13
+ export declare const castBase64ToFile: import("../../../operations/hooks/index.server.js").Hook<"upload", "create" | "update", "before">;
@@ -3,4 +3,4 @@
3
3
  * the function normalize and validate path ({slug}_directories.id).
4
4
  * Then extract parent, name from the given path.
5
5
  */
6
- export declare const exctractPath: import("../../../operations/hooks/index.server.js").Hook<"directory", "update" | "create", "before">;
6
+ export declare const exctractPath: import("../../../operations/hooks/index.server.js").Hook<"directory", "create" | "update", "before">;
@@ -3,4 +3,4 @@
3
3
  * the function get the document _path and check if it exists,
4
4
  * if it doesn't it create {upload_slug}_directories entries recursively
5
5
  */
6
- export declare const handlePathCreation: import("../../../operations/hooks/index.server.js").Hook<"upload", "update" | "create", "before">;
6
+ export declare const handlePathCreation: import("../../../operations/hooks/index.server.js").Hook<"upload", "create" | "update", "before">;
@@ -17,4 +17,4 @@
17
17
  * - Cleans up image variations
18
18
  * - Nullifies related document fields
19
19
  */
20
- export declare const processFileUpload: import("../../../operations/hooks/index.server.js").Hook<"upload", "update" | "create", "before">;
20
+ export declare const processFileUpload: import("../../../operations/hooks/index.server.js").Hook<"upload", "create" | "update", "before">;
@@ -1,4 +1,4 @@
1
- import type { MailerActions } from '../../plugins/mailer/index.server.js';
1
+ import type { MailerActions } from '../../plugins/mailer/module.server.js';
2
2
  import type { ConfigContext } from '../../rime.server.js';
3
3
  import type { Config } from '../../../types.js';
4
4
  export declare function getBaseAuthConfig<const C extends Config>(ctx: {
@@ -1752,13 +1752,13 @@ export declare function getBaseAuthConfig<const C extends Config>(ctx: {
1752
1752
  $Infer: {
1753
1753
  body: ({
1754
1754
  permission: {
1755
- readonly user?: ("update" | "create" | "delete" | "list" | "get" | "set-role" | "ban" | "impersonate" | "set-password")[] | undefined;
1755
+ readonly user?: ("create" | "update" | "delete" | "list" | "get" | "set-role" | "ban" | "impersonate" | "set-password")[] | undefined;
1756
1756
  readonly session?: ("delete" | "list" | "revoke")[] | undefined;
1757
1757
  };
1758
1758
  permissions?: never | undefined;
1759
1759
  } | {
1760
1760
  permissions: {
1761
- readonly user?: ("update" | "create" | "delete" | "list" | "get" | "set-role" | "ban" | "impersonate" | "set-password")[] | undefined;
1761
+ readonly user?: ("create" | "update" | "delete" | "list" | "get" | "set-role" | "ban" | "impersonate" | "set-password")[] | undefined;
1762
1762
  readonly session?: ("delete" | "list" | "revoke")[] | undefined;
1763
1763
  };
1764
1764
  permission?: never | undefined;
@@ -1,8 +1,4 @@
1
1
  import type { SanitizedConfigClient } from '../types.js';
2
2
  export declare const augmentPlugins: <const T extends SanitizedConfigClient>(config: T) => T & {
3
- readonly plugins: (import("../../plugins/index.js").PluginClient | {
4
- readonly name: "cache/client";
5
- readonly type: "client";
6
- readonly configure: <const C extends SanitizedConfigClient>(config: C) => C;
7
- })[];
3
+ readonly plugins: any[];
8
4
  };
@@ -1,6 +1,6 @@
1
- import { cacheClient } from '../../plugins/cache/index.js';
1
+ import { cache } from '../../plugins/cache/index.js';
2
2
  export const augmentPlugins = (config) => {
3
- const plugins = [cacheClient(), ...(config.plugins || [])];
3
+ const plugins = [cache(), ...(config.plugins || [])];
4
4
  for (const plugin of plugins) {
5
5
  if ('configure' in plugin && typeof plugin.configure === 'function') {
6
6
  config = plugin.configure(config);
@@ -8,6 +8,6 @@ export const augmentPlugins = (config) => {
8
8
  }
9
9
  return {
10
10
  ...config,
11
- plugins: plugins.filter((p) => p.type === 'client')
11
+ plugins
12
12
  };
13
13
  };
@@ -37,9 +37,5 @@ export declare const buildConfigClient: <C extends SanitizedConfigClient>(config
37
37
  } & {
38
38
  readonly collections: readonly import("../types.js").BuiltCollection[];
39
39
  } & {
40
- readonly plugins: (import("../../plugins/index.js").PluginClient | {
41
- readonly name: "cache/client";
42
- readonly type: "client";
43
- readonly configure: <const C_1 extends SanitizedConfigClient>(config: C_1) => C_1;
44
- })[];
40
+ readonly plugins: any[];
45
41
  };
@@ -54,7 +54,7 @@ export declare function createConfigContext<const C extends Config>(config: Buil
54
54
  /**
55
55
  * Retrieves either an area or collection configuration by its slug
56
56
  */
57
- getBySlug: (slug: string) => import("../../types.js").BuiltArea | import("../../types.js").BuiltCollection;
57
+ getBySlug: (slug: string) => import("../../types.js").BuiltCollection | import("../../types.js").BuiltArea;
58
58
  /**
59
59
  * Checks if a slug represents a collection
60
60
  */
@@ -1,45 +1,5 @@
1
1
  import type { Config } from '../types.js';
2
+ import type { Plugin } from '../../plugins/index.js';
2
3
  export declare const augmentPluginsServer: <const T extends Config>(config: T) => T & {
3
- readonly $plugins: readonly [{
4
- readonly name: "sse";
5
- readonly type: "server";
6
- readonly actions: {
7
- readonly broadcast: (data: import("../../plugins/sse/types").ContentUpdatePayload) => void;
8
- };
9
- readonly routes: {
10
- readonly '/api/sse': {
11
- readonly GET: import("@sveltejs/kit").RequestHandler;
12
- };
13
- };
14
- }, {
15
- readonly name: "cache";
16
- readonly type: "server";
17
- readonly configure: <const C extends Config>(config: C) => C;
18
- readonly routes: {
19
- readonly '/api/clear-cache': {
20
- readonly POST: () => Response;
21
- };
22
- };
23
- readonly actions: import("../../plugins/cache/index.server.js").CacheActions;
24
- readonly handler: import("@sveltejs/kit").Handle;
25
- }, ...(import("../../plugins").Plugin | {
26
- readonly name: "apiInit";
27
- readonly type: "server";
28
- readonly routes: {
29
- readonly '/api/init': {
30
- readonly POST: import("@sveltejs/kit").RequestHandler;
31
- };
32
- };
33
- } | {
34
- readonly name: "mailer";
35
- readonly type: "server";
36
- readonly actions: {
37
- readonly sendMail: (args: {
38
- to: string;
39
- subject: string;
40
- text: string;
41
- html?: string;
42
- }) => Promise<import("nodemailer/lib/smtp-transport").SentMessageInfo>;
43
- };
44
- })[]];
4
+ readonly $plugins: Plugin[];
45
5
  };
@@ -1,9 +1,8 @@
1
1
  import { dev } from '$app/environment';
2
- import { apiInit } from '../../plugins/api-init/index.server.js';
3
- import { cache } from '../../plugins/cache/index.server.js';
4
- import { mailer } from '../../plugins/mailer/index.server.js';
5
- import { sse } from '../../plugins/sse/index.server.js';
6
- // export type WithPluginsServer<T> = T & { $plugins: ReturnType<Plugin>[] };
2
+ import { apiInit } from '../../plugins/api-init/index.js';
3
+ import { cache } from '../../plugins/cache/index.js';
4
+ import { mailer } from '../../plugins/mailer/index.js';
5
+ import { sse } from '../../plugins/sse/index.js';
7
6
  export const augmentPluginsServer = (config) => {
8
7
  //
9
8
  const corePluginsServer = [
@@ -16,7 +15,13 @@ export const augmentPluginsServer = (config) => {
16
15
  // Mailer plugin
17
16
  ...(config.$smtp ? [mailer(config.$smtp)] : [])
18
17
  ];
19
- const plugins = [...corePluginsServer, ...(config.$plugins || [])];
18
+ // Widened to Plugin[] on purpose: each factory's own `as const satisfies Plugin` return
19
+ // keeps a precise literal shape (no `handler` key at all on sse's, no `actions` on
20
+ // apiInit's, ...) — left as a tuple, downstream code reading `.handler`/`.actions` off
21
+ // the union fails to typecheck even though both are optional on Plugin. Doesn't affect
22
+ // build-config.server.ts's ExtractCustomPlugins/InferCorePlugins, which infer off the
23
+ // pre-augmentation config type, not this array.
24
+ const plugins = [...corePluginsServer, ...(config.plugins || [])];
20
25
  let configWithPlugins = config;
21
26
  for (const plugin of plugins) {
22
27
  if ('configure' in plugin && typeof plugin.configure === 'function') {