@sidebase/base-config 0.2.2 → 0.3.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.
- package/README.md +165 -586
- package/dist/config.d.mts +10 -12
- package/dist/config.d.ts +10 -12
- package/dist/config.mjs +3 -4
- package/dist/eslint/index.d.mts +43 -4
- package/dist/eslint/index.d.ts +43 -4
- package/package.json +12 -11
- package/presets/base/AGENTS.md +0 -5
- package/presets/base/github/workflows/streamctl-upgrade.yml +22 -8
- package/presets/base/pnpm-workspace.yaml +1 -0
- package/presets/base/preset.json +6 -2
- package/presets/config.template.ts +2 -3
- package/presets/nuxt-app/Dockerfile +2 -1
- package/presets/nuxt-app/github/workflows/ci.yml +6 -6
- package/presets/nuxt-app/preset.json +18 -20
- package/presets/nuxt-app/templates/ci/e2e-job.yml +3 -3
- package/presets/nuxt-app/templates/ci/test-job.yml +3 -3
- package/dist/shared/base-config.BoberVUk.d.mts +0 -43
- package/dist/shared/base-config.BoberVUk.d.ts +0 -43
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
|
|
22
|
-
* that `ubuntu-latest` lacks. Empty renders the
|
|
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.
|
|
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
|
|
90
|
-
* `
|
|
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` when Prisma is installed, `""` 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
|
|
127
|
-
* which writes to the managed file and is reverted on the next
|
|
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
|
|
22
|
-
* that `ubuntu-latest` lacks. Empty renders the
|
|
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.
|
|
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
|
|
90
|
-
* `
|
|
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` when Prisma is installed, `""` 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
|
|
127
|
-
* which writes to the managed file and is reverted on the next
|
|
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}`),
|
package/dist/eslint/index.d.mts
CHANGED
|
@@ -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 {
|
|
52
|
-
export type { ResolvedEslintOptions };
|
|
90
|
+
export { ESLINT_OPTION_KEYS, buildEslintLayers, createSidebaseEslint, isTypeAware, resolveEslintOptions };
|
|
91
|
+
export type { CreateSidebaseEslintOptions, ResolvedEslintOptions };
|
package/dist/eslint/index.d.ts
CHANGED
|
@@ -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 {
|
|
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.
|
|
3
|
+
"version": "0.3.1",
|
|
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": ">=
|
|
53
|
+
"node": ">=24.13"
|
|
54
54
|
},
|
|
55
|
-
"packageManager": "pnpm@10.
|
|
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": "^
|
|
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.
|
|
87
|
-
"eslint": "^10.
|
|
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.
|
|
91
|
-
"typescript": "^6.0.
|
|
92
|
-
"unbuild": "^3.
|
|
93
|
-
"vitest": "^
|
|
94
|
-
"yaml": "^2.9.
|
|
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
|
}
|
package/presets/base/AGENTS.md
CHANGED
|
@@ -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@
|
|
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@
|
|
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@
|
|
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@
|
|
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 }}
|
|
@@ -320,7 +332,8 @@ jobs:
|
|
|
320
332
|
{
|
|
321
333
|
echo "## Status"
|
|
322
334
|
echo
|
|
323
|
-
echo "
|
|
335
|
+
echo "> [!CAUTION]"
|
|
336
|
+
echo "> This update omits GitHub Actions workflow changes. Do not merge this pull request yet."
|
|
324
337
|
echo
|
|
325
338
|
printf -- '- Updated the streamctl payload from `%s` to `%s`.\n' "$from" "$TARGET"
|
|
326
339
|
echo "- Applied every other safe managed-file change."
|
|
@@ -335,7 +348,7 @@ jobs:
|
|
|
335
348
|
|
|
336
349
|
- name: Open the workflow-update PR
|
|
337
350
|
if: ${{ steps.workflow_changes.outputs.blocked == 'true' }}
|
|
338
|
-
uses: peter-evans/create-pull-request@
|
|
351
|
+
uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7.0.11
|
|
339
352
|
with:
|
|
340
353
|
token: ${{ env.ALLOW_WORKFLOW_UPDATES == 'true' && secrets.${PR_TOKEN_SECRET} || github.token }}
|
|
341
354
|
branch: chore/streamctl-upgrade-${{ steps.check.outputs.target }}
|
|
@@ -357,7 +370,8 @@ jobs:
|
|
|
357
370
|
{
|
|
358
371
|
echo "## Status"
|
|
359
372
|
echo
|
|
360
|
-
echo "
|
|
373
|
+
echo "> [!CAUTION]"
|
|
374
|
+
echo "> This update needs manual conflict resolution. Do not merge this pull request yet."
|
|
361
375
|
echo
|
|
362
376
|
printf -- '- Updated the streamctl payload from `%s` to `%s`.\n' "$from" "$TARGET"
|
|
363
377
|
if [[ "$APPLIED" == "true" ]]; then
|
|
@@ -388,7 +402,7 @@ jobs:
|
|
|
388
402
|
|
|
389
403
|
- name: Open the manual upgrade PR
|
|
390
404
|
if: ${{ steps.upgrade.outputs.code == '2' && steps.conflicts.outputs.safe == 'false' }}
|
|
391
|
-
uses: peter-evans/create-pull-request@
|
|
405
|
+
uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7.0.11
|
|
392
406
|
with:
|
|
393
407
|
token: ${{ env.ALLOW_WORKFLOW_UPDATES == 'true' && secrets.${PR_TOKEN_SECRET} || github.token }}
|
|
394
408
|
branch: chore/streamctl-upgrade-${{ steps.check.outputs.target }}
|
package/presets/base/preset.json
CHANGED
|
@@ -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
|
-
"
|
|
20
|
-
"
|
|
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": "if [ -e node_modules/.bin/prisma ]; then pnpm prisma generate; fi", "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
|
+
// 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
|
|
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@
|
|
29
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
|
|
30
30
|
|
|
31
31
|
- name: Set up pnpm
|
|
32
|
-
uses: pnpm/action-setup@
|
|
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@
|
|
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@
|
|
54
|
+
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
|
|
55
55
|
|
|
56
56
|
- name: Set up pnpm
|
|
57
|
-
uses: pnpm/action-setup@
|
|
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@
|
|
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.
|
|
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.
|
|
27
|
-
"PNPM_VERSION": { "configPath": "versions.pnpm", "default": "10.
|
|
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.
|
|
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.
|
|
56
|
-
"engines.pnpm": ">=10.
|
|
57
|
-
"packageManager": "pnpm@10.
|
|
58
|
-
"devDependencies.nuxt": "^4.
|
|
59
|
-
"devDependencies.typescript": "^6.0.
|
|
60
|
-
"devDependencies.eslint": "^10.
|
|
61
|
-
"devDependencies.oxlint": "^1.
|
|
62
|
-
"devDependencies.prisma": "^6.19.
|
|
63
|
-
"devDependencies.@prisma/client": "^6.19.
|
|
64
|
-
"devDependencies.jiti": "^2.
|
|
65
|
-
"devDependencies.json-sort-cli": "^4.1
|
|
66
|
-
"devDependencies.vitest": "^3.
|
|
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@
|
|
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@
|
|
30
|
-
- uses: actions/setup-node@
|
|
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@
|
|
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@
|
|
9
|
-
- uses: actions/setup-node@
|
|
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
|