@sidebase/base-config 0.2.2 → 0.3.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.
package/README.md CHANGED
@@ -175,9 +175,9 @@ covers both.
175
175
 
176
176
  `defineNuxtBaseConfig` returns the config unchanged. Its job is typed editor inference
177
177
  for this payload's knobs: completion and type checking on `ci`, `versions`, `docker`,
178
- `automation`, `security`, `pnpm`, `editor`, and the whole `eslint` option surface, plus `profile`
179
- narrowed to the profile names that actually exist. Without it the object is an untyped
180
- literal, so a typo such as `ci: { unitTest: true }` stays silent in your editor.
178
+ `automation`, `security`, `pnpm` and `editor`, plus `profile` narrowed to the profile
179
+ names that actually exist. Without it the object is an untyped literal, so a typo such as
180
+ `ci: { unitTest: true }` stays silent in your editor.
181
181
 
182
182
  The CLI shape-checks the config against the manifest when it loads it, so a sync still
183
183
  works without the helper. The helper is what moves that feedback into your editor.
@@ -390,6 +390,7 @@ minimumReleaseAgeExclude:
390
390
  - "@sidebase/*"
391
391
  onlyBuiltDependencies: # the postinstall-script allowlist
392
392
  - "@prisma/client"
393
+ - "@prisma/engines"
393
394
  - "esbuild"
394
395
  - "prisma"
395
396
  ```
@@ -399,7 +400,7 @@ onlyBuiltDependencies: # the postinstall-script allowlist
399
400
  installs it. It needs pnpm 10.16 or newer and gates *fresh resolution only*, so
400
401
  `pnpm install --frozen-lockfile` replays the lockfile untouched and CI is unaffected.
401
402
 
402
- The pnpm baseline shipped to consumers is 10.28.1 (`presets/*/preset.json`). This repo's
403
+ The pnpm baseline shipped to consumers is 10.34.5 (`presets/*/preset.json`). This repo's
403
404
  own `packageManager` pin tracks separately and is usually newer; the two are independent
404
405
  by design, not drift.
405
406
 
@@ -460,7 +461,7 @@ The `nuxt-app` preset ships a managed `.github/workflows/ci.yml`. Its `lint-type
460
461
  | ---- | ------- | ------ |
461
462
  | `ci.unitTests` | `false` | Add the `test` job (`pnpm test`) |
462
463
  | `ci.e2e` | `false` | Add the `e2e` job, with a health-checked postgres service |
463
- | `ci.aptPackages` | `[]` | System packages `apt-get`-installed in the `test` and `e2e` jobs |
464
+ | `ci.aptPackages` | `[]` | System packages `apt-get`-installed in the `test` and `e2e` jobs and the upgrade validation |
464
465
 
465
466
  `ci.aptPackages` is the CI counterpart to `docker.aptPackages` below: extra system packages
466
467
  on top of what the runner image already carries, for a binary the suite needs and
@@ -498,7 +499,7 @@ out:
498
499
  | `docker.buildSteps` | the build-command block | `nuxi prepare` / `prisma generate` / `run build` |
499
500
  | `docker.finalStage` | final stage, before `CMD` | `""` |
500
501
  | `docker.prismaRuntime` | final stage | copy the schema + install the `migrate deploy` CLI |
501
- | `docker.startCommand` | inside `CMD` | `prisma migrate deploy` then the node server |
502
+ | `docker.startCommand` | shell-form `CMD`, one line | `prisma migrate deploy` then `exec node ...` |
502
503
 
503
504
  A seventh knob is different in kind: a validated version, not raw text.
504
505
 
@@ -517,7 +518,7 @@ export default {
517
518
  preInstall: "COPY ./vendor ./vendor", // vendored dep needed at install time
518
519
  buildSteps: "RUN pnpm nuxi prepare\nRUN pnpm run build", // a repo with no Prisma
519
520
  prismaRuntime: "", // drop Prisma entirely
520
- startCommand: "node .output/server/index.mjs",
521
+ startCommand: "exec node .output/server/index.mjs",
521
522
  },
522
523
  };
523
524
  ```
@@ -540,7 +541,7 @@ three default to `""`.
540
541
 
541
542
  **`prismaRuntime` and `startCommand` are coupled.** Override one and you must override the
542
543
  other. `prismaRuntime` is what installs the Prisma CLI into the final stage, and the
543
- DEFAULT `startCommand` is `npm exec prisma migrate deploy && node ...`. Setting only
544
+ DEFAULT `startCommand` is `npm exec prisma migrate deploy && exec node ...`. Setting only
544
545
  `prismaRuntime: ""` therefore produces an image whose `CMD` invokes a CLI that is no longer
545
546
  installed, and the container fails to start. The example above overrides both, which is why
546
547
  it is safe to copy; a single-knob change is not. Drop the `migrate deploy` half of
@@ -603,9 +604,9 @@ export default {
603
604
  // prTokenSecret: "STREAMCTL_PR_TOKEN",
604
605
  },
605
606
  // optional: version pins, default to the payload's baseline. `node` feeds
606
- // ci.yml + the Dockerfile; `pnpm` feeds the Dockerfile only (CI pins pnpm
607
- // via package.json#packageManager):
608
- // versions: { node: "24.13.0", pnpm: "10.28.1" },
607
+ // ci.yml, the Dockerfile and this workflow; `pnpm` feeds the Dockerfile only
608
+ // (CI pins pnpm via package.json#packageManager):
609
+ // versions: { node: "24.21.0", pnpm: "10.34.5" },
609
610
  };
610
611
  ```
611
612
 
@@ -624,6 +625,10 @@ receive `Workflows` permission.
624
625
  | `automation.upgradePr` | `false` | Sync the scheduled upgrade workflow |
625
626
  | `automation.allowWorkflowUpdates` | `false` | Include `.github/workflows/**` changes in upgrade PRs |
626
627
  | `automation.prTokenSecret` | `"STREAMCTL_PR_TOKEN"` | Secret used when workflow updates are enabled |
628
+ | `automation.prepare` | `"pnpm prisma generate"` | One-line command run before validation |
629
+
630
+ `automation.prepare` generates what `pnpm install` does not, before validation. One line;
631
+ chain with `&&`. Set `""` for a repo without Prisma.
627
632
 
628
633
  The upgrade job runs `streamctl check` and every available lint, typecheck, test, and
629
634
  build script before opening a ready PR. PRs created with `GITHUB_TOKEN` do not trigger
@@ -658,8 +663,8 @@ out and provide its own install authentication.
658
663
 
659
664
  Every action in every managed workflow and CI job fragment is pinned by full commit SHA,
660
665
  with the version tag in a trailing comment. Moving tags can be re-pointed, so tags are
661
- never trusted, secrets or not. `test/workflow-pins.test.ts` sweeps all preset
662
- templates and fails on any `uses:` that is not a 40-hex SHA.
666
+ never trusted, secrets or not. `test/payload.test.ts` renders every managed workflow
667
+ and fails on any `uses:` that is not a 40-hex SHA.
663
668
 
664
669
  The shipped pins track `actions/checkout` v6, `actions/setup-node` v6, and
665
670
  `pnpm/action-setup` v6. These majors run on the node24 action runtime, which needs a
package/dist/config.d.mts CHANGED
@@ -1,5 +1,3 @@
1
- import { C as CreateSidebaseEslintOptions } from './shared/base-config.BoberVUk.mjs';
2
-
3
1
  /**
4
2
  * Version-baseline profile, named for the framework and its major so two majors can
5
3
  * coexist during a migration.
@@ -18,8 +16,8 @@ interface NuxtBaseCiConfig {
18
16
  /** Include the e2e job + postgres service. */
19
17
  e2e?: boolean;
20
18
  /**
21
- * Packages apt-installed in the `test` and `e2e` jobs, for a binary the suite needs
22
- * that `ubuntu-latest` lacks. Empty renders the install step inert, not absent.
19
+ * Packages apt-installed in the `test` and `e2e` jobs and the upgrade validation, for
20
+ * a binary the suite needs that `ubuntu-latest` lacks. Empty renders the step inert.
23
21
  *
24
22
  * Package names only: the rendered `run:` line is unquoted so word splitting reaches
25
23
  * apt-get, so every element is metacharacter-checked.
@@ -30,7 +28,7 @@ interface NuxtBaseCiConfig {
30
28
  * Runtime version pins (`config.versions.*`). `node` feeds every render (`ci.yml`,
31
29
  * the Dockerfile, the upgrade workflow); `pnpm` feeds the Dockerfile only, because CI
32
30
  * takes pnpm from `package.json#packageManager`. Defaults come from the version
33
- * baseline (node 24.13.0, pnpm 10.28.1).
31
+ * baseline (node 24.21.0, pnpm 10.34.5).
34
32
  */
35
33
  interface NuxtBaseVersionsConfig {
36
34
  /** Node version for CI jobs, the Docker base image, and the upgrade workflow. */
@@ -86,9 +84,8 @@ interface NuxtBaseDockerConfig {
86
84
  */
87
85
  prismaVersion?: string;
88
86
  /**
89
- * The `sh -c` argument of the final `CMD`. Defaults to
90
- * `prisma migrate deploy` then the node server; override e.g. for `db push`
91
- * or a repo with no Prisma. Lands verbatim.
87
+ * The shell-form final `CMD`, one line. Defaults to `prisma migrate deploy` then
88
+ * `exec node ...`; override e.g. for `db push` or a repo with no Prisma.
92
89
  */
93
90
  startCommand?: string;
94
91
  }
@@ -103,6 +100,8 @@ interface NuxtBaseAutomationConfig {
103
100
  allowWorkflowUpdates?: boolean;
104
101
  /** Repository secret used when workflow updates are allowed. */
105
102
  prTokenSecret?: string;
103
+ /** One-line shell command run before validation (default: `pnpm prisma generate`, `""` skips). */
104
+ prepare?: string;
106
105
  }
107
106
  /**
108
107
  * Supply-chain knobs (`config.security.*`): the pnpm install cooldown rendered into
@@ -123,8 +122,9 @@ interface NuxtBaseSecurityConfig {
123
122
  interface NuxtBasePnpmConfig {
124
123
  /**
125
124
  * Packages allowed to run install lifecycle scripts, on top of the baseline
126
- * (`@prisma/client`, `esbuild`, `prisma`). Use this instead of `pnpm approve-builds`,
127
- * which writes to the managed file and is reverted on the next sync.
125
+ * (`@prisma/client`, `@prisma/engines`, `esbuild`, `prisma`). Use this instead of
126
+ * `pnpm approve-builds`, which writes to the managed file and is reverted on the next
127
+ * sync.
128
128
  */
129
129
  onlyBuiltDependencies?: string[];
130
130
  }
@@ -175,8 +175,6 @@ interface NuxtBaseConfig {
175
175
  pnpm?: NuxtBasePnpmConfig;
176
176
  /** Optional editor knobs (the i18n-ally source language). */
177
177
  editor?: NuxtBaseEditorConfig;
178
- /** ESLint factory options, typed with the payload's own option surface. */
179
- eslint?: CreateSidebaseEslintOptions;
180
178
  }
181
179
  /**
182
180
  * Identity helper giving editor inference for this payload's knobs, the analog of the
package/dist/config.d.ts CHANGED
@@ -1,5 +1,3 @@
1
- import { C as CreateSidebaseEslintOptions } from './shared/base-config.BoberVUk.js';
2
-
3
1
  /**
4
2
  * Version-baseline profile, named for the framework and its major so two majors can
5
3
  * coexist during a migration.
@@ -18,8 +16,8 @@ interface NuxtBaseCiConfig {
18
16
  /** Include the e2e job + postgres service. */
19
17
  e2e?: boolean;
20
18
  /**
21
- * Packages apt-installed in the `test` and `e2e` jobs, for a binary the suite needs
22
- * that `ubuntu-latest` lacks. Empty renders the install step inert, not absent.
19
+ * Packages apt-installed in the `test` and `e2e` jobs and the upgrade validation, for
20
+ * a binary the suite needs that `ubuntu-latest` lacks. Empty renders the step inert.
23
21
  *
24
22
  * Package names only: the rendered `run:` line is unquoted so word splitting reaches
25
23
  * apt-get, so every element is metacharacter-checked.
@@ -30,7 +28,7 @@ interface NuxtBaseCiConfig {
30
28
  * Runtime version pins (`config.versions.*`). `node` feeds every render (`ci.yml`,
31
29
  * the Dockerfile, the upgrade workflow); `pnpm` feeds the Dockerfile only, because CI
32
30
  * takes pnpm from `package.json#packageManager`. Defaults come from the version
33
- * baseline (node 24.13.0, pnpm 10.28.1).
31
+ * baseline (node 24.21.0, pnpm 10.34.5).
34
32
  */
35
33
  interface NuxtBaseVersionsConfig {
36
34
  /** Node version for CI jobs, the Docker base image, and the upgrade workflow. */
@@ -86,9 +84,8 @@ interface NuxtBaseDockerConfig {
86
84
  */
87
85
  prismaVersion?: string;
88
86
  /**
89
- * The `sh -c` argument of the final `CMD`. Defaults to
90
- * `prisma migrate deploy` then the node server; override e.g. for `db push`
91
- * or a repo with no Prisma. Lands verbatim.
87
+ * The shell-form final `CMD`, one line. Defaults to `prisma migrate deploy` then
88
+ * `exec node ...`; override e.g. for `db push` or a repo with no Prisma.
92
89
  */
93
90
  startCommand?: string;
94
91
  }
@@ -103,6 +100,8 @@ interface NuxtBaseAutomationConfig {
103
100
  allowWorkflowUpdates?: boolean;
104
101
  /** Repository secret used when workflow updates are allowed. */
105
102
  prTokenSecret?: string;
103
+ /** One-line shell command run before validation (default: `pnpm prisma generate`, `""` skips). */
104
+ prepare?: string;
106
105
  }
107
106
  /**
108
107
  * Supply-chain knobs (`config.security.*`): the pnpm install cooldown rendered into
@@ -123,8 +122,9 @@ interface NuxtBaseSecurityConfig {
123
122
  interface NuxtBasePnpmConfig {
124
123
  /**
125
124
  * Packages allowed to run install lifecycle scripts, on top of the baseline
126
- * (`@prisma/client`, `esbuild`, `prisma`). Use this instead of `pnpm approve-builds`,
127
- * which writes to the managed file and is reverted on the next sync.
125
+ * (`@prisma/client`, `@prisma/engines`, `esbuild`, `prisma`). Use this instead of
126
+ * `pnpm approve-builds`, which writes to the managed file and is reverted on the next
127
+ * sync.
128
128
  */
129
129
  onlyBuiltDependencies?: string[];
130
130
  }
@@ -175,8 +175,6 @@ interface NuxtBaseConfig {
175
175
  pnpm?: NuxtBasePnpmConfig;
176
176
  /** Optional editor knobs (the i18n-ally source language). */
177
177
  editor?: NuxtBaseEditorConfig;
178
- /** ESLint factory options, typed with the payload's own option surface. */
179
- eslint?: CreateSidebaseEslintOptions;
180
178
  }
181
179
  /**
182
180
  * Identity helper giving editor inference for this payload's knobs, the analog of the
package/dist/config.mjs CHANGED
@@ -26,7 +26,8 @@ const NUXT_BASE_DOCKER_KEYS = knobKeys({
26
26
  const NUXT_BASE_AUTOMATION_KEYS = knobKeys({
27
27
  upgradePr: 0,
28
28
  allowWorkflowUpdates: 0,
29
- prTokenSecret: 0
29
+ prTokenSecret: 0,
30
+ prepare: 0
30
31
  });
31
32
  const NUXT_BASE_SECURITY_KEYS = knobKeys({
32
33
  minimumReleaseAge: 0
@@ -37,9 +38,7 @@ const NUXT_BASE_PNPM_KEYS = knobKeys({
37
38
  const NUXT_BASE_EDITOR_KEYS = knobKeys({
38
39
  i18nSourceLanguage: 0
39
40
  });
40
- const NUXT_BASE_TOP_LEVEL_KNOBS = knobKeys({
41
- eslint: 0
42
- });
41
+ const NUXT_BASE_TOP_LEVEL_KNOBS = knobKeys({});
43
42
  const NUXT_BASE_CONFIG_KEYS = [
44
43
  ...NUXT_BASE_CI_KEYS.map((key) => `ci.${key}`),
45
44
  ...NUXT_BASE_VERSIONS_KEYS.map((key) => `versions.${key}`),
@@ -1,7 +1,46 @@
1
- import { C as CreateSidebaseEslintOptions } from '../shared/base-config.BoberVUk.mjs';
2
- export { E as ESLINT_OPTION_KEYS } from '../shared/base-config.BoberVUk.mjs';
3
1
  import antfu, { TypedFlatConfigItem } from '@antfu/eslint-config';
4
2
 
3
+ /** Options for the published ESLint factory (`@sidebase/base-config/eslint`). */
4
+ interface CreateSidebaseEslintOptions {
5
+ /** Zod `.extend()/.merge()/.passthrough()` bans and/or `import * as z` enforcement. Default `"none"` (opt-in). */
6
+ zod?: "full" | "import-style" | "none";
7
+ /** Allow-list of permitted console methods, or a hard error. Default `"error"`. */
8
+ console?: string[] | "error";
9
+ /** Ban `publicProcedure` in `server/trpc/routers/**`. Default `false`. */
10
+ trpcGuard?: boolean;
11
+ /** Restrict `~~/prisma/` client imports on the app side. Default `false`. */
12
+ prismaImportGuard?: boolean;
13
+ /** `ts/consistent-type-definitions`. Default `"interface"`. */
14
+ typeDefStyle?: "interface" | "type";
15
+ /** Paths banned from direct import (Nuxt auto-import). Default `["utils/", "composables/", "~~/shared/types/"]`. */
16
+ autoImportPaths?: string[];
17
+ /**
18
+ * Subset of {@link autoImportPaths} where `import type { ... }` is still allowed
19
+ * (value imports stay banned), for repos that import a path like `composables/`
20
+ * only for its types. Default `[]` (opt-in).
21
+ */
22
+ autoImportTypeOnly?: string[];
23
+ /**
24
+ * Files excluded from antfu's type-aware program (only relevant when
25
+ * type-aware). Default excludes `prisma.config.ts`, `eslint.config.ts`, the
26
+ * root `streamctl.config.ts`, and the legacy `.streamctl` TS files (see
27
+ * `resolveEslintOptions`).
28
+ */
29
+ ignoresTypeAware?: string[];
30
+ /**
31
+ * Globs for test / spec / story files where the `process.env` + auto-import
32
+ * bans are relaxed. Defaults to the standard `.test.`/`.spec.`/
33
+ * `.stories.` `ts`/`tsx` globs (see `resolveEslintOptions`).
34
+ */
35
+ testFilePattern?: string[];
36
+ }
37
+ /**
38
+ * Runtime list of every {@link CreateSidebaseEslintOptions} key. The `satisfies` map
39
+ * keeps it exhaustive: a new option fails to compile until it is listed here, so the
40
+ * validator allow-list cannot drift.
41
+ */
42
+ declare const ESLINT_OPTION_KEYS: string[];
43
+
5
44
  /** {@link CreateSidebaseEslintOptions} with all defaults applied + the computed type-aware gate. */
6
45
  interface ResolvedEslintOptions {
7
46
  zod: "full" | "import-style" | "none";
@@ -48,5 +87,5 @@ declare function buildEslintLayers(options: ResolvedEslintOptions): TypedFlatCon
48
87
  */
49
88
  declare function createSidebaseEslint(options?: CreateSidebaseEslintOptions): ReturnType<typeof antfu>;
50
89
 
51
- export { CreateSidebaseEslintOptions, buildEslintLayers, createSidebaseEslint, isTypeAware, resolveEslintOptions };
52
- export type { ResolvedEslintOptions };
90
+ export { ESLINT_OPTION_KEYS, buildEslintLayers, createSidebaseEslint, isTypeAware, resolveEslintOptions };
91
+ export type { CreateSidebaseEslintOptions, ResolvedEslintOptions };
@@ -1,7 +1,46 @@
1
- import { C as CreateSidebaseEslintOptions } from '../shared/base-config.BoberVUk.js';
2
- export { E as ESLINT_OPTION_KEYS } from '../shared/base-config.BoberVUk.js';
3
1
  import antfu, { TypedFlatConfigItem } from '@antfu/eslint-config';
4
2
 
3
+ /** Options for the published ESLint factory (`@sidebase/base-config/eslint`). */
4
+ interface CreateSidebaseEslintOptions {
5
+ /** Zod `.extend()/.merge()/.passthrough()` bans and/or `import * as z` enforcement. Default `"none"` (opt-in). */
6
+ zod?: "full" | "import-style" | "none";
7
+ /** Allow-list of permitted console methods, or a hard error. Default `"error"`. */
8
+ console?: string[] | "error";
9
+ /** Ban `publicProcedure` in `server/trpc/routers/**`. Default `false`. */
10
+ trpcGuard?: boolean;
11
+ /** Restrict `~~/prisma/` client imports on the app side. Default `false`. */
12
+ prismaImportGuard?: boolean;
13
+ /** `ts/consistent-type-definitions`. Default `"interface"`. */
14
+ typeDefStyle?: "interface" | "type";
15
+ /** Paths banned from direct import (Nuxt auto-import). Default `["utils/", "composables/", "~~/shared/types/"]`. */
16
+ autoImportPaths?: string[];
17
+ /**
18
+ * Subset of {@link autoImportPaths} where `import type { ... }` is still allowed
19
+ * (value imports stay banned), for repos that import a path like `composables/`
20
+ * only for its types. Default `[]` (opt-in).
21
+ */
22
+ autoImportTypeOnly?: string[];
23
+ /**
24
+ * Files excluded from antfu's type-aware program (only relevant when
25
+ * type-aware). Default excludes `prisma.config.ts`, `eslint.config.ts`, the
26
+ * root `streamctl.config.ts`, and the legacy `.streamctl` TS files (see
27
+ * `resolveEslintOptions`).
28
+ */
29
+ ignoresTypeAware?: string[];
30
+ /**
31
+ * Globs for test / spec / story files where the `process.env` + auto-import
32
+ * bans are relaxed. Defaults to the standard `.test.`/`.spec.`/
33
+ * `.stories.` `ts`/`tsx` globs (see `resolveEslintOptions`).
34
+ */
35
+ testFilePattern?: string[];
36
+ }
37
+ /**
38
+ * Runtime list of every {@link CreateSidebaseEslintOptions} key. The `satisfies` map
39
+ * keeps it exhaustive: a new option fails to compile until it is listed here, so the
40
+ * validator allow-list cannot drift.
41
+ */
42
+ declare const ESLINT_OPTION_KEYS: string[];
43
+
5
44
  /** {@link CreateSidebaseEslintOptions} with all defaults applied + the computed type-aware gate. */
6
45
  interface ResolvedEslintOptions {
7
46
  zod: "full" | "import-style" | "none";
@@ -48,5 +87,5 @@ declare function buildEslintLayers(options: ResolvedEslintOptions): TypedFlatCon
48
87
  */
49
88
  declare function createSidebaseEslint(options?: CreateSidebaseEslintOptions): ReturnType<typeof antfu>;
50
89
 
51
- export { CreateSidebaseEslintOptions, buildEslintLayers, createSidebaseEslint, isTypeAware, resolveEslintOptions };
52
- export type { ResolvedEslintOptions };
90
+ export { ESLINT_OPTION_KEYS, buildEslintLayers, createSidebaseEslint, isTypeAware, resolveEslintOptions };
91
+ export type { CreateSidebaseEslintOptions, ResolvedEslintOptions };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sidebase/base-config",
3
- "version": "0.2.2",
3
+ "version": "0.3.0",
4
4
  "description": "Shared @sidebase base configuration for Nuxt repos: ESLint / Prisma / tsconfig factories on npm, plus the streamctl file-sync preset payload",
5
5
  "keywords": [
6
6
  "sidebase",
@@ -50,9 +50,9 @@
50
50
  }
51
51
  },
52
52
  "engines": {
53
- "node": ">=22"
53
+ "node": ">=24.13"
54
54
  },
55
- "packageManager": "pnpm@10.29.1",
55
+ "packageManager": "pnpm@10.34.5",
56
56
  "scripts": {
57
57
  "build": "unbuild",
58
58
  "typecheck": "tsc --noEmit -p tsconfig.json && tsc -p tsconfig.test.json",
@@ -60,10 +60,11 @@
60
60
  "lint": "eslint .",
61
61
  "validate:presets": "node scripts/validate-presets.mjs",
62
62
  "e2e:dry-run": "pnpm build && node scripts/e2e-dry-run.mjs",
63
+ "e2e:docker": "pnpm build && node scripts/docker-build-leg.mjs",
63
64
  "prepack": "pnpm build"
64
65
  },
65
66
  "dependencies": {
66
- "@antfu/eslint-config": "^7.4",
67
+ "@antfu/eslint-config": "^9.5.1",
67
68
  "ufo": "^1.6.4"
68
69
  },
69
70
  "peerDependencies": {
@@ -83,14 +84,14 @@
83
84
  "@arethetypeswrong/cli": "^0.18.5",
84
85
  "@prisma/client": "^6.19.3",
85
86
  "@sidebase/streamctl": "^0.3.0",
86
- "@types/node": "^24.0.0",
87
- "eslint": "^10.5.0",
87
+ "@types/node": "^24.13.5",
88
+ "eslint": "^10.10.0",
88
89
  "jiti": "^2.7.0",
89
90
  "prisma": "^6.19.3",
90
- "publint": "^0.3.21",
91
- "typescript": "^6.0.0",
92
- "unbuild": "^3.5.0",
93
- "vitest": "^3.0.0",
94
- "yaml": "^2.9.0"
91
+ "publint": "^0.3.24",
92
+ "typescript": "^6.0.3",
93
+ "unbuild": "^3.6.1",
94
+ "vitest": "^5.0.1",
95
+ "yaml": "^2.9.1"
95
96
  }
96
97
  }
@@ -24,11 +24,6 @@ follow. They are the same across every repo in the fleet.
24
24
  - Use precise types; avoid `any` and unchecked casts. Parse and validate external input at the boundary instead of trusting it downstream.
25
25
  - Handle the error and empty-result paths, not just the happy path.
26
26
 
27
- ## Tests & verification
28
-
29
- - Run the project's typecheck, lint, and test scripts before proposing a change.
30
- - Add or update tests for the behavior you change; don't weaken existing assertions to make a change pass.
31
-
32
27
  ## Commits & pull requests
33
28
 
34
29
  - Use Conventional Commits (`feat:`, `fix:`, `refactor:`, `test:`, `docs:`).
@@ -16,23 +16,27 @@ permissions:
16
16
  env:
17
17
  ALLOW_WORKFLOW_UPDATES: "${ALLOW_WORKFLOW_UPDATES}"
18
18
  NODE_VERSION: "${NODE_VERSION}"
19
+ CI_APT_PACKAGES: "${CI_APT_PACKAGES}"
20
+ # Block scalar so quotes, `#` and `: ` in the command stay literal.
21
+ PREPARE_COMMAND: >-
22
+ ${PREPARE_COMMAND}
19
23
 
20
24
  jobs:
21
25
  upgrade:
22
26
  runs-on: ubuntu-latest
23
27
  steps:
24
28
  - name: Checkout
25
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
29
+ uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
26
30
  with:
27
31
  persist-credentials: false
28
32
 
29
33
  - name: Set up pnpm
30
- uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
34
+ uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
31
35
  with:
32
36
  run_install: false
33
37
 
34
38
  - name: Set up Node.js
35
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
39
+ uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6.5.0
36
40
  with:
37
41
  node-version: ${{ env.NODE_VERSION }}
38
42
  cache: pnpm
@@ -225,6 +229,14 @@ jobs:
225
229
  done < "$RUNNER_TEMP/streamctl-held.txt"
226
230
  echo "applied=true" >> "$GITHUB_OUTPUT"
227
231
 
232
+ - name: Install apt packages
233
+ if: ${{ steps.outcome.outputs.completed == 'true' && env.CI_APT_PACKAGES != '' }}
234
+ run: sudo apt-get update && sudo apt-get install -y --no-install-recommends $CI_APT_PACKAGES
235
+
236
+ - name: Prepare the validation
237
+ if: ${{ steps.outcome.outputs.completed == 'true' && env.PREPARE_COMMAND != '' }}
238
+ run: eval "$PREPARE_COMMAND"
239
+
228
240
  - name: Validate the completed upgrade
229
241
  if: ${{ steps.outcome.outputs.completed == 'true' && steps.workflow_changes.outputs.blocked == 'false' }}
230
242
  run: |
@@ -277,7 +289,7 @@ jobs:
277
289
 
278
290
  - name: Open the completed upgrade PR
279
291
  if: ${{ steps.outcome.outputs.completed == 'true' && steps.workflow_changes.outputs.blocked == 'false' }}
280
- uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
292
+ uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7.0.11
281
293
  with:
282
294
  token: ${{ env.ALLOW_WORKFLOW_UPDATES == 'true' && secrets.${PR_TOKEN_SECRET} || github.token }}
283
295
  branch: chore/streamctl-upgrade-${{ steps.check.outputs.target }}
@@ -335,7 +347,7 @@ jobs:
335
347
 
336
348
  - name: Open the workflow-update PR
337
349
  if: ${{ steps.workflow_changes.outputs.blocked == 'true' }}
338
- uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
350
+ uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7.0.11
339
351
  with:
340
352
  token: ${{ env.ALLOW_WORKFLOW_UPDATES == 'true' && secrets.${PR_TOKEN_SECRET} || github.token }}
341
353
  branch: chore/streamctl-upgrade-${{ steps.check.outputs.target }}
@@ -388,7 +400,7 @@ jobs:
388
400
 
389
401
  - name: Open the manual upgrade PR
390
402
  if: ${{ steps.upgrade.outputs.code == '2' && steps.conflicts.outputs.safe == 'false' }}
391
- uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
403
+ uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7.0.11
392
404
  with:
393
405
  token: ${{ env.ALLOW_WORKFLOW_UPDATES == 'true' && secrets.${PR_TOKEN_SECRET} || github.token }}
394
406
  branch: chore/streamctl-upgrade-${{ steps.check.outputs.target }}
@@ -16,5 +16,6 @@ minimumReleaseAgeExclude:
16
16
  - "@sidebase/*"
17
17
  onlyBuiltDependencies:
18
18
  - "@prisma/client"
19
+ - "@prisma/engines"
19
20
  - "esbuild"
20
21
  - "prisma"
@@ -16,8 +16,10 @@
16
16
  "automation-upgrade": {
17
17
  "placeholders": {
18
18
  "ALLOW_WORKFLOW_UPDATES": { "configPath": "automation.allowWorkflowUpdates", "default": "false", "pattern": "^(?:true|false)$" },
19
- "NODE_VERSION": { "configPath": "versions.node", "default": "24.13.0", "pattern": "^[\\w.+-]+$" },
20
- "PR_TOKEN_SECRET": { "configPath": "automation.prTokenSecret", "default": "STREAMCTL_PR_TOKEN", "pattern": "^(?![Gg][Ii][Tt][Hh][Uu][Bb]_)[A-Za-z_][A-Za-z0-9_]*$" }
19
+ "CI_APT_PACKAGES": { "configPath": "ci.aptPackages", "default": "", "pattern": "^$|^[a-z0-9][a-z0-9 +.-]*$", "join": "space" },
20
+ "NODE_VERSION": { "configPath": "versions.node", "default": "24.21.0", "pattern": "^[\\w.+-]+$" },
21
+ "PR_TOKEN_SECRET": { "configPath": "automation.prTokenSecret", "default": "STREAMCTL_PR_TOKEN", "pattern": "^(?![Gg][Ii][Tt][Hh][Uu][Bb]_)[A-Za-z_][A-Za-z0-9_]*$" },
22
+ "PREPARE_COMMAND": { "configPath": "automation.prepare", "default": "pnpm prisma generate", "pattern": "^[^\\r\\n]*$" }
21
23
  }
22
24
  },
23
25
  "editor": {
@@ -37,7 +39,9 @@
37
39
  "configKeys": {
38
40
  "automation.allowWorkflowUpdates": "boolean",
39
41
  "automation.prTokenSecret": "string",
42
+ "automation.prepare": "string",
40
43
  "automation.upgradePr": "boolean",
44
+ "ci.aptPackages": "string[]",
41
45
  "editor.i18nSourceLanguage": "string",
42
46
  "security.minimumReleaseAge": "string",
43
47
  "pnpm.onlyBuiltDependencies": "string[]",
@@ -10,10 +10,9 @@ export default defineNuxtBaseConfig({
10
10
 
11
11
  // Optional knobs, uncomment to enable:
12
12
  // ci: { unitTests: true, e2e: true, aptPackages: ['libxml2-utils'] }, // apt extras for the test/e2e jobs
13
- // versions: { node: '24.13.0', pnpm: '10.28.1' },
13
+ // versions: { node: '24.21.0', pnpm: '10.34.5' },
14
14
  // docker: { aptPackages: ['ffmpeg'] }, // extras; openssl is always installed
15
15
  // security: { minimumReleaseAge: '10080' }, // minutes before pnpm installs a release; '0' disables
16
- // pnpm: { onlyBuiltDependencies: ['sharp'] }, // extras on top of prisma + esbuild
16
+ // pnpm: { onlyBuiltDependencies: ['sharp'] }, // extras on top of the prisma packages + esbuild
17
17
  // editor: { i18nSourceLanguage: 'en' }, // i18n-ally source language (default: 'de')
18
- // eslint: { trpcGuard: true },
19
18
  })
@@ -1,3 +1,4 @@
1
+ # check=skip=JSONArgsRecommended
1
2
  # see https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact
2
3
  ARG NODE_VERSION=node:${NODE_VERSION}
3
4
  ARG PNPM_VERSION=${PNPM_VERSION}
@@ -55,4 +56,4 @@ ${DOCKER_FINAL_STAGE}
55
56
  # Set docker.finalStage to "USER node" to opt back in.
56
57
 
57
58
  # start the app
58
- CMD [ "sh", "-c", "${DOCKER_START_COMMAND}" ]
59
+ CMD ${DOCKER_START_COMMAND}
@@ -26,15 +26,15 @@ jobs:
26
26
  lint-typecheck:
27
27
  runs-on: ubuntu-latest
28
28
  steps:
29
- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
29
+ - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
30
30
 
31
31
  - name: Set up pnpm
32
- uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
32
+ uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
33
33
  with:
34
34
  run_install: false
35
35
 
36
36
  - name: Use Node.js ${{ env.NODE_VERSION }}
37
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
37
+ uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6.5.0
38
38
  with:
39
39
  node-version: ${{ env.NODE_VERSION }}
40
40
  cache: pnpm
@@ -51,15 +51,15 @@ jobs:
51
51
  needs: lint-typecheck
52
52
  runs-on: ubuntu-latest
53
53
  steps:
54
- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
54
+ - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
55
55
 
56
56
  - name: Set up pnpm
57
- uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
57
+ uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
58
58
  with:
59
59
  run_install: false
60
60
 
61
61
  - name: Use Node.js ${{ env.NODE_VERSION }}
62
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
62
+ uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6.5.0
63
63
  with:
64
64
  node-version: ${{ env.NODE_VERSION }}
65
65
  cache: pnpm
@@ -13,7 +13,7 @@
13
13
  "ci": {
14
14
  "placeholders": {
15
15
  "CI_APT_PACKAGES": { "configPath": "ci.aptPackages", "default": "", "pattern": "^$|^[a-z0-9][a-z0-9 +.-]*$", "join": "space" },
16
- "NODE_VERSION": { "configPath": "versions.node", "default": "24.13.0", "pattern": "^[\\w.+-]+$" }
16
+ "NODE_VERSION": { "configPath": "versions.node", "default": "24.21.0", "pattern": "^[\\w.+-]+$" }
17
17
  },
18
18
  "fragments": [
19
19
  { "toggle": "ci.unitTests", "source": "nuxt-app/templates/ci/test-job.yml" },
@@ -23,15 +23,15 @@
23
23
  "dockerfile": {
24
24
  "placeholders": {
25
25
  "APT_PACKAGES": { "configPath": "docker.aptPackages", "default": "", "pattern": "^$|^[a-z0-9][a-z0-9 +.-]*$", "join": "space" },
26
- "NODE_VERSION": { "configPath": "versions.node", "default": "24.13.0", "pattern": "^[\\w.+-]+$" },
27
- "PNPM_VERSION": { "configPath": "versions.pnpm", "default": "10.28.1", "pattern": "^[\\w.+-]+$" },
26
+ "NODE_VERSION": { "configPath": "versions.node", "default": "24.21.0", "pattern": "^[\\w.+-]+$" },
27
+ "PNPM_VERSION": { "configPath": "versions.pnpm", "default": "10.34.5", "pattern": "^[\\w.+-]+$" },
28
28
  "DOCKER_PRE_INSTALL": { "configPath": "docker.preInstall", "default": "" },
29
29
  "DOCKER_BUILD_ARGS": { "configPath": "docker.buildArgs", "default": "" },
30
30
  "DOCKER_BUILD_STEPS": { "configPath": "docker.buildSteps", "default": "RUN pnpm nuxi prepare\nRUN pnpm prisma generate\nRUN pnpm run build" },
31
31
  "DOCKER_FINAL_STAGE": { "configPath": "docker.finalStage", "default": "" },
32
32
  "DOCKER_PRISMA_RUNTIME": { "configPath": "docker.prismaRuntime", "default": "COPY --chown=node:node --from=production-base /app/prisma /app/prisma\n\n# Prisma CLI for `migrate deploy`. Override the pin with --build-arg.\nARG PRISMA_VERSION=${PRISMA_VERSION_DEFAULT}\n\n# Chowned to uid 1000 in the same layer, so a later USER switch needs no\n# second pass over node_modules.\nRUN npm i -D prisma@${PRISMA_VERSION} && chown -R node:node /app/node_modules" },
33
- "PRISMA_VERSION_DEFAULT": { "configPath": "docker.prismaVersion", "fromDependency": "prisma", "default": "6.19.1", "pattern": "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$" },
34
- "DOCKER_START_COMMAND": { "configPath": "docker.startCommand", "default": "npm exec prisma migrate deploy && node --max-old-space-size-percentage=75 .output/server/index.mjs" }
33
+ "PRISMA_VERSION_DEFAULT": { "configPath": "docker.prismaVersion", "fromDependency": "prisma", "default": "6.19.3", "pattern": "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$" },
34
+ "DOCKER_START_COMMAND": { "configPath": "docker.startCommand", "default": "npm exec prisma migrate deploy && exec node --max-old-space-size-percentage=75 .output/server/index.mjs", "pattern": "^[^\\r\\n]+$" }
35
35
  },
36
36
  "passthrough": ["PRISMA_VERSION"]
37
37
  }
@@ -39,7 +39,6 @@
39
39
  "configKeys": {
40
40
  "ci.unitTests": "boolean",
41
41
  "ci.e2e": "boolean",
42
- "ci.aptPackages": "string[]",
43
42
  "docker.aptPackages": "string[]",
44
43
  "docker.preInstall": "string",
45
44
  "docker.buildArgs": "string",
@@ -47,23 +46,22 @@
47
46
  "docker.finalStage": "string",
48
47
  "docker.prismaRuntime": "string",
49
48
  "docker.prismaVersion": "string",
50
- "docker.startCommand": "string",
51
- "eslint": "object"
49
+ "docker.startCommand": "string"
52
50
  },
53
51
  "versionProfiles": {
54
52
  "nuxt-4": {
55
- "engines.node": ">=24.13.0",
56
- "engines.pnpm": ">=10.28.1",
57
- "packageManager": "pnpm@10.28.1",
58
- "devDependencies.nuxt": "^4.3.0",
59
- "devDependencies.typescript": "^6.0.2",
60
- "devDependencies.eslint": "^10.5.0",
61
- "devDependencies.oxlint": "^1.43.0",
62
- "devDependencies.prisma": "^6.19.1",
63
- "devDependencies.@prisma/client": "^6.19.1",
64
- "devDependencies.jiti": "^2.2.0",
65
- "devDependencies.json-sort-cli": "^4.1.3",
66
- "devDependencies.vitest": "^3.0.0",
53
+ "engines.node": ">=24.21.0",
54
+ "engines.pnpm": ">=10.34.5",
55
+ "packageManager": "pnpm@10.34.5",
56
+ "devDependencies.nuxt": "^4.5.2",
57
+ "devDependencies.typescript": "^6.0.3",
58
+ "devDependencies.eslint": "^10.10.0",
59
+ "devDependencies.oxlint": "^1.83.0",
60
+ "devDependencies.prisma": "^6.19.3",
61
+ "devDependencies.@prisma/client": "^6.19.3",
62
+ "devDependencies.jiti": "^2.7.0",
63
+ "devDependencies.json-sort-cli": "^4.3.1",
64
+ "devDependencies.vitest": "^3.2.7",
67
65
  "scripts.postinstall": "nuxt prepare",
68
66
  "scripts.lint": "oxlint -c .oxlintrc.json --deny-warnings && eslint --max-warnings 0 ."
69
67
  }
@@ -22,12 +22,12 @@
22
22
  --health-timeout 5s
23
23
  --health-retries 5
24
24
  steps:
25
- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
25
+ - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
26
26
  - name: Install apt packages
27
27
  if: ${{ env.CI_APT_PACKAGES != '' }}
28
28
  run: sudo apt-get update && sudo apt-get install -y --no-install-recommends $CI_APT_PACKAGES
29
- - uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
30
- - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
29
+ - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
30
+ - uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6.5.0
31
31
  with:
32
32
  node-version: ${{ env.NODE_VERSION }}
33
33
  cache: pnpm
@@ -1,12 +1,12 @@
1
1
  test:
2
2
  runs-on: ubuntu-latest
3
3
  steps:
4
- - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
4
+ - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
5
5
  - name: Install apt packages
6
6
  if: ${{ env.CI_APT_PACKAGES != '' }}
7
7
  run: sudo apt-get update && sudo apt-get install -y --no-install-recommends $CI_APT_PACKAGES
8
- - uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9
9
- - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
8
+ - uses: pnpm/action-setup@ea17c68df8912ef543352723c149a84f56e3d413 # v6.1.0
9
+ - uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6.5.0
10
10
  with:
11
11
  node-version: ${{ env.NODE_VERSION }}
12
12
  cache: pnpm
@@ -1,43 +0,0 @@
1
- /** Options for the published ESLint factory (`@sidebase/base-config/eslint`). */
2
- interface CreateSidebaseEslintOptions {
3
- /** Zod `.extend()/.merge()/.passthrough()` bans and/or `import * as z` enforcement. Default `"none"` (opt-in). */
4
- zod?: "full" | "import-style" | "none";
5
- /** Allow-list of permitted console methods, or a hard error. Default `"error"`. */
6
- console?: string[] | "error";
7
- /** Ban `publicProcedure` in `server/trpc/routers/**`. Default `false`. */
8
- trpcGuard?: boolean;
9
- /** Restrict `~~/prisma/` client imports on the app side. Default `false`. */
10
- prismaImportGuard?: boolean;
11
- /** `ts/consistent-type-definitions`. Default `"interface"`. */
12
- typeDefStyle?: "interface" | "type";
13
- /** Paths banned from direct import (Nuxt auto-import). Default `["utils/", "composables/", "~~/shared/types/"]`. */
14
- autoImportPaths?: string[];
15
- /**
16
- * Subset of {@link autoImportPaths} where `import type { ... }` is still allowed
17
- * (value imports stay banned), for repos that import a path like `composables/`
18
- * only for its types. Default `[]` (opt-in).
19
- */
20
- autoImportTypeOnly?: string[];
21
- /**
22
- * Files excluded from antfu's type-aware program (only relevant when
23
- * type-aware). Default excludes `prisma.config.ts`, `eslint.config.ts`, the
24
- * root `streamctl.config.ts`, and the legacy `.streamctl` TS files (see
25
- * `resolveEslintOptions`).
26
- */
27
- ignoresTypeAware?: string[];
28
- /**
29
- * Globs for test / spec / story files where the `process.env` + auto-import
30
- * bans are relaxed. Defaults to the standard `.test.`/`.spec.`/
31
- * `.stories.` `ts`/`tsx` globs (see `resolveEslintOptions`).
32
- */
33
- testFilePattern?: string[];
34
- }
35
- /**
36
- * Runtime list of every {@link CreateSidebaseEslintOptions} key. The `satisfies` map
37
- * keeps it exhaustive: a new option fails to compile until it is listed here, so the
38
- * validator allow-list cannot drift.
39
- */
40
- declare const ESLINT_OPTION_KEYS: string[];
41
-
42
- export { ESLINT_OPTION_KEYS as E };
43
- export type { CreateSidebaseEslintOptions as C };
@@ -1,43 +0,0 @@
1
- /** Options for the published ESLint factory (`@sidebase/base-config/eslint`). */
2
- interface CreateSidebaseEslintOptions {
3
- /** Zod `.extend()/.merge()/.passthrough()` bans and/or `import * as z` enforcement. Default `"none"` (opt-in). */
4
- zod?: "full" | "import-style" | "none";
5
- /** Allow-list of permitted console methods, or a hard error. Default `"error"`. */
6
- console?: string[] | "error";
7
- /** Ban `publicProcedure` in `server/trpc/routers/**`. Default `false`. */
8
- trpcGuard?: boolean;
9
- /** Restrict `~~/prisma/` client imports on the app side. Default `false`. */
10
- prismaImportGuard?: boolean;
11
- /** `ts/consistent-type-definitions`. Default `"interface"`. */
12
- typeDefStyle?: "interface" | "type";
13
- /** Paths banned from direct import (Nuxt auto-import). Default `["utils/", "composables/", "~~/shared/types/"]`. */
14
- autoImportPaths?: string[];
15
- /**
16
- * Subset of {@link autoImportPaths} where `import type { ... }` is still allowed
17
- * (value imports stay banned), for repos that import a path like `composables/`
18
- * only for its types. Default `[]` (opt-in).
19
- */
20
- autoImportTypeOnly?: string[];
21
- /**
22
- * Files excluded from antfu's type-aware program (only relevant when
23
- * type-aware). Default excludes `prisma.config.ts`, `eslint.config.ts`, the
24
- * root `streamctl.config.ts`, and the legacy `.streamctl` TS files (see
25
- * `resolveEslintOptions`).
26
- */
27
- ignoresTypeAware?: string[];
28
- /**
29
- * Globs for test / spec / story files where the `process.env` + auto-import
30
- * bans are relaxed. Defaults to the standard `.test.`/`.spec.`/
31
- * `.stories.` `ts`/`tsx` globs (see `resolveEslintOptions`).
32
- */
33
- testFilePattern?: string[];
34
- }
35
- /**
36
- * Runtime list of every {@link CreateSidebaseEslintOptions} key. The `satisfies` map
37
- * keeps it exhaustive: a new option fails to compile until it is listed here, so the
38
- * validator allow-list cannot drift.
39
- */
40
- declare const ESLINT_OPTION_KEYS: string[];
41
-
42
- export { ESLINT_OPTION_KEYS as E };
43
- export type { CreateSidebaseEslintOptions as C };