@ykdz/template 0.0.33 → 0.0.36

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 (98) hide show
  1. package/dist/application.d.ts +2 -1
  2. package/dist/application.js +64 -75
  3. package/dist/main.js +6 -2
  4. package/node_modules/@ykdz/template-builtin-presets/dist/src/foundation.d.ts +50 -36
  5. package/node_modules/@ykdz/template-builtin-presets/dist/src/foundation.js +970 -365
  6. package/node_modules/@ykdz/template-builtin-presets/dist/src/generation-record.d.ts +24 -0
  7. package/node_modules/@ykdz/template-builtin-presets/dist/src/generation-record.js +154 -0
  8. package/node_modules/@ykdz/template-builtin-presets/dist/src/index.d.ts +2 -2
  9. package/node_modules/@ykdz/template-builtin-presets/dist/src/index.js +1 -1
  10. package/node_modules/@ykdz/template-builtin-presets/dist/src/rust-bin/definition.d.ts +31 -2
  11. package/node_modules/@ykdz/template-builtin-presets/dist/src/rust-bin/definition.js +29 -33
  12. package/node_modules/@ykdz/template-builtin-presets/dist/src/shared/development-container.d.ts +1 -0
  13. package/node_modules/@ykdz/template-builtin-presets/dist/src/shared/development-container.js +17 -0
  14. package/node_modules/@ykdz/template-builtin-presets/dist/src/shared/typescript.d.ts +4 -3
  15. package/node_modules/@ykdz/template-builtin-presets/dist/src/shared/typescript.js +9 -5
  16. package/node_modules/@ykdz/template-builtin-presets/dist/src/shared/vue.d.ts +1 -1
  17. package/node_modules/@ykdz/template-builtin-presets/dist/src/shared/vue.js +1 -2
  18. package/node_modules/@ykdz/template-builtin-presets/dist/src/ts-cli/definition.d.ts +31 -2
  19. package/node_modules/@ykdz/template-builtin-presets/dist/src/ts-cli/definition.js +79 -58
  20. package/node_modules/@ykdz/template-builtin-presets/dist/src/ts-lib/definition.d.ts +31 -2
  21. package/node_modules/@ykdz/template-builtin-presets/dist/src/ts-lib/definition.js +31 -23
  22. package/node_modules/@ykdz/template-builtin-presets/dist/src/vike-app/definition.d.ts +22 -2
  23. package/node_modules/@ykdz/template-builtin-presets/dist/src/vike-app/definition.js +61 -35
  24. package/node_modules/@ykdz/template-builtin-presets/dist/src/vue-app/definition.d.ts +26 -2
  25. package/node_modules/@ykdz/template-builtin-presets/dist/src/vue-app/definition.js +19 -8
  26. package/node_modules/@ykdz/template-builtin-presets/dist/src/vue-hono-app/definition.d.ts +22 -2
  27. package/node_modules/@ykdz/template-builtin-presets/dist/src/vue-hono-app/definition.js +31 -21
  28. package/node_modules/@ykdz/template-builtin-presets/package.json +12 -11
  29. package/node_modules/@ykdz/template-builtin-presets/templates/foundation/.github/workflows/check-deployment-diagnostics.yml +1 -1
  30. package/node_modules/@ykdz/template-builtin-presets/templates/foundation/.github/workflows/check-deployment.yml +1 -1
  31. package/node_modules/@ykdz/template-builtin-presets/templates/foundation/.pnpmfile.mjs +19 -0
  32. package/node_modules/@ykdz/template-builtin-presets/templates/foundation/gitignore +1 -0
  33. package/node_modules/@ykdz/template-builtin-presets/templates/foundation/tsconfig.packing-hook.json +8 -0
  34. package/node_modules/@ykdz/template-builtin-presets/templates/shared/devcontainer/github-cli.Dockerfile +9 -0
  35. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/CHANGELOG.md.template +17 -0
  36. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/RELEASING.md +17 -0
  37. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/artifact.ts +1271 -0
  38. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/changelog.ts +283 -0
  39. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/check-artifact.ts +99 -0
  40. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/check-readiness.ts +66 -0
  41. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/cli-command-identity.ts +4 -0
  42. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/handoff.ts +450 -0
  43. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/publish.ts +483 -0
  44. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/readiness.ts +1125 -0
  45. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/release.ts +819 -0
  46. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/release.yml +119 -0
  47. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/root-tsconfig.json +13 -0
  48. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/tsconfig.json +4 -0
  49. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/turbo.json +6 -0
  50. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication-setup/README.md +48 -0
  51. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication-setup/assets/CHANGELOG.md.template +17 -0
  52. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication-setup/assets/LICENSE-APACHE-2.0.txt +202 -0
  53. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication-setup/assets/LICENSE-MIT.txt +21 -0
  54. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication-setup/assets/README.md.template +5 -0
  55. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication-setup/bridge.ts +3336 -0
  56. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication-setup/setup.sh +221 -0
  57. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/src/cli-command-identity.ts +133 -0
  58. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/src/cli.ts +4 -3
  59. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/src/main.ts +5 -4
  60. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/test/integration/command.test.ts +14 -13
  61. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/test/unit/cli-command-identity.test.ts +76 -0
  62. package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/tsconfig.build.json +2 -0
  63. package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/db/src/readiness.ts +1 -1
  64. package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/db/test/global-setup.ts +21 -0
  65. package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/db/tsconfig.json +6 -1
  66. package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/db/vitest.config.ts +7 -0
  67. package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/db-migrations/drizzle.config.ts +5 -1
  68. package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/web/playwright.config.ts +102 -22
  69. package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/web/test/playwright-teardown.ts +12 -0
  70. package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/web/vite.config.ts +39 -1
  71. package/node_modules/@ykdz/template-builtin-presets/templates/vue-app/playwright.config.ts +48 -7
  72. package/node_modules/@ykdz/template-builtin-presets/templates/vue-hono-app/web/playwright.config.ts +59 -8
  73. package/node_modules/@ykdz/template-core/dist/module-graph.d.ts +15 -53
  74. package/node_modules/@ykdz/template-core/dist/module-graph.js +134 -101
  75. package/node_modules/@ykdz/template-core/dist/package-contribution.d.ts +13 -1
  76. package/node_modules/@ykdz/template-core/dist/package-contribution.js +92 -0
  77. package/node_modules/@ykdz/template-core/dist/pnpm-workspace.yaml +14 -10
  78. package/node_modules/@ykdz/template-core/dist/preset-definition.d.ts +71 -13
  79. package/node_modules/@ykdz/template-core/dist/preset-definition.js +16 -1
  80. package/node_modules/@ykdz/template-core/dist/project-blueprint.d.ts +56 -0
  81. package/node_modules/@ykdz/template-core/dist/project-blueprint.js +271 -0
  82. package/node_modules/@ykdz/template-core/dist/project-linking-v2.d.ts +2 -2
  83. package/node_modules/@ykdz/template-core/dist/project-linking-v2.js +2 -2
  84. package/node_modules/@ykdz/template-core/dist/project-projection.d.ts +2 -1
  85. package/node_modules/@ykdz/template-core/dist/project-projection.js +107 -20
  86. package/node_modules/@ykdz/template-core/dist/renderer.d.ts +0 -2
  87. package/node_modules/@ykdz/template-core/dist/renderer.js +17 -38
  88. package/node_modules/@ykdz/template-core/dist/template-boundary-check.d.ts +2 -2
  89. package/node_modules/@ykdz/template-core/dist/template-boundary-check.js +6 -0
  90. package/node_modules/@ykdz/template-core/dist/toolchain-resolution.d.ts +2 -0
  91. package/node_modules/@ykdz/template-core/dist/toolchain-resolution.js +9 -3
  92. package/package.json +3 -3
  93. package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/db-migrations/scripts/prepare-database.ts +0 -45
  94. package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/web/scripts/run-playwright.ts +0 -151
  95. package/node_modules/@ykdz/template-builtin-presets/templates/vue-app/scripts/run-playwright.ts +0 -62
  96. package/node_modules/@ykdz/template-builtin-presets/templates/vue-hono-app/web/scripts/run-playwright.ts +0 -103
  97. package/node_modules/@ykdz/template-core/dist/project-blueprint-v2.d.ts +0 -33
  98. package/node_modules/@ykdz/template-core/dist/project-blueprint-v2.js +0 -182
@@ -1,6 +1,18 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { rmSync } from "node:fs";
3
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
4
+ import { createServer } from "node:net";
5
+ import path from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+
1
8
  import { defineConfig, devices } from "@playwright/test";
2
9
 
3
10
  const externalBaseUrlName = "PLAYWRIGHT_EXTERNAL_BASE_URL";
11
+ const externalReadinessTimeoutMs = 30_000;
12
+ const webRoot = path.dirname(fileURLToPath(import.meta.url));
13
+ const migrationsRoot = path.resolve(webRoot, "../../packages/db-migrations");
14
+ const databaseFile = path.join(webRoot, "node_modules/.tmp/e2e.sqlite");
15
+ const stateFile = path.join(webRoot, "node_modules/.tmp/playwright-port");
4
16
 
5
17
  function externalBaseUrl(): string | undefined {
6
18
  if (!Object.hasOwn(process.env, externalBaseUrlName)) {
@@ -26,31 +38,98 @@ function externalBaseUrl(): string | undefined {
26
38
  return url.toString();
27
39
  }
28
40
 
29
- function requiredPort(name: string): number {
30
- return Number(requiredEnv(name));
41
+ async function availablePort(): Promise<string> {
42
+ return await new Promise((resolve, reject) => {
43
+ const server = createServer();
44
+
45
+ server.once("error", reject);
46
+ server.listen(0, "127.0.0.1", () => {
47
+ const address = server.address();
48
+
49
+ if (typeof address !== "object" || address === null) {
50
+ server.close(() => {
51
+ reject(new Error("Could not allocate a Playwright web port"));
52
+ });
53
+ return;
54
+ }
55
+
56
+ const port = String(address.port);
57
+ server.close((error) => {
58
+ if (error) {
59
+ reject(error);
60
+ return;
61
+ }
62
+
63
+ resolve(port);
64
+ });
65
+ });
66
+ });
31
67
  }
32
68
 
33
- function requiredEnv(name: string): string {
34
- const value = process.env[name];
69
+ async function awaitExternalService(baseUrl: string): Promise<void> {
70
+ const deadline = Date.now() + externalReadinessTimeoutMs;
35
71
 
36
- if (!value) {
37
- throw new Error(`${name} must be set by scripts/run-playwright.ts`);
72
+ while (Date.now() < deadline) {
73
+ try {
74
+ const response = await fetch(baseUrl, {
75
+ signal: AbortSignal.timeout(2_000),
76
+ });
77
+ if (response.ok) {
78
+ return;
79
+ }
80
+ } catch {
81
+ // The externally managed service may still be starting.
82
+ }
83
+
84
+ await new Promise((resolve) => setTimeout(resolve, 250));
38
85
  }
39
86
 
40
- return value;
87
+ throw new Error(
88
+ `External Playwright service at ${baseUrl} was not ready within ${externalReadinessTimeoutMs}ms`,
89
+ );
90
+ }
91
+
92
+ async function sharedPort(envName: string): Promise<{
93
+ readonly port: string;
94
+ readonly prepared: boolean;
95
+ }> {
96
+ const envPort = process.env[envName];
97
+ if (envPort !== undefined) {
98
+ return { port: envPort, prepared: false };
99
+ }
100
+ try {
101
+ return { port: await readFile(stateFile, "utf8"), prepared: false };
102
+ } catch {
103
+ const port = await availablePort();
104
+ await mkdir(path.dirname(stateFile), { recursive: true });
105
+ await writeFile(stateFile, port, "utf8");
106
+ return { port, prepared: true };
107
+ }
108
+ }
109
+
110
+ function prepareLocalDatabase(): void {
111
+ rmSync(databaseFile, { force: true });
112
+ execFileSync("pnpm", ["run", "db:push"], {
113
+ cwd: migrationsRoot,
114
+ env: { ...process.env, DATABASE_FILE: databaseFile },
115
+ stdio: "inherit",
116
+ });
41
117
  }
42
118
 
43
119
  const externalServiceUrl = externalBaseUrl();
44
- const previewPort = externalServiceUrl
45
- ? undefined
46
- : requiredPort("PLAYWRIGHT_WEB_PORT");
47
- const previewUrl = externalServiceUrl ?? `http://127.0.0.1:${previewPort}`;
48
- const databaseFile = externalServiceUrl
49
- ? undefined
50
- : requiredEnv("DATABASE_FILE");
51
-
52
- function shellValue(value: string): string {
53
- return `'${value.replaceAll("'", "'\\''")}'`;
120
+ let previewUrl: string;
121
+
122
+ if (externalServiceUrl === undefined) {
123
+ const { port, prepared } = await sharedPort("PLAYWRIGHT_WEB_PORT");
124
+ previewUrl = `http://127.0.0.1:${port}`;
125
+ process.env.DATABASE_FILE = databaseFile;
126
+ process.env.PORT = port;
127
+ if (prepared) {
128
+ prepareLocalDatabase();
129
+ }
130
+ } else {
131
+ previewUrl = externalServiceUrl;
132
+ await awaitExternalService(externalServiceUrl);
54
133
  }
55
134
 
56
135
  export default defineConfig({
@@ -61,16 +140,17 @@ export default defineConfig({
61
140
  trace: "retain-on-failure",
62
141
  },
63
142
  reporter: [["list"], ["html"]],
64
- ...(externalServiceUrl
65
- ? {}
66
- : {
143
+ globalTeardown: "./test/playwright-teardown.ts",
144
+ ...(externalServiceUrl === undefined
145
+ ? {
67
146
  webServer: {
68
- command: `DATABASE_FILE=${shellValue(databaseFile!)} pnpm --dir ../../packages/db-migrations run db:prepare:test && PORT=${previewPort} node dist/server/index.mjs`,
147
+ command: "node dist/server/index.mjs",
69
148
  reuseExistingServer: !process.env.CI,
70
149
  timeout: 60_000,
71
150
  url: previewUrl,
72
151
  },
73
- }),
152
+ }
153
+ : {}),
74
154
  projects: [
75
155
  {
76
156
  name: "chromium",
@@ -0,0 +1,12 @@
1
+ import { rmSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ const webRoot = path.dirname(fileURLToPath(import.meta.url));
6
+
7
+ export default function teardown(): void {
8
+ rmSync(path.join(webRoot, "node_modules/.tmp/e2e.sqlite"), { force: true });
9
+ rmSync(path.join(webRoot, "node_modules/.tmp/playwright-port"), {
10
+ force: true,
11
+ });
12
+ }
@@ -1,12 +1,50 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
1
5
  import tailwindcss from "@tailwindcss/vite";
2
6
  import vue from "@vitejs/plugin-vue";
3
7
  import telefunc from "telefunc/vite";
4
8
  import vike from "vike/plugin";
5
9
  import { defineConfig, type PluginOption } from "vite";
6
10
 
11
+ const webRoot = path.dirname(fileURLToPath(import.meta.url));
12
+ const migrationsRoot = path.resolve(webRoot, "../../packages/db-migrations");
13
+ const databaseRoot = path.resolve(webRoot, "../../packages/db");
14
+ const databaseFile = path.join(webRoot, "data/app.sqlite");
15
+
7
16
  // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- telefunc/vite currently types its plugin factory as any.
8
17
  const telefuncPlugin = telefunc() as PluginOption;
9
18
 
19
+ async function prepareDatabase(): Promise<void> {
20
+ const env = { ...process.env, DATABASE_FILE: databaseFile };
21
+ process.env.DATABASE_FILE = databaseFile;
22
+ execFileSync("pnpm", ["run", "db:push"], {
23
+ cwd: migrationsRoot,
24
+ env,
25
+ stdio: "inherit",
26
+ });
27
+ execFileSync("pnpm", ["run", "db:seed:example"], {
28
+ cwd: databaseRoot,
29
+ env,
30
+ stdio: "inherit",
31
+ });
32
+ }
33
+
34
+ function databasePreparationPlugin(): PluginOption {
35
+ return {
36
+ name: "database-preparation",
37
+ configureServer: () => prepareDatabase(),
38
+ configurePreviewServer: () => prepareDatabase(),
39
+ };
40
+ }
41
+
10
42
  export default defineConfig({
11
- plugins: [vike(), telefuncPlugin, vue(), tailwindcss()],
43
+ plugins: [
44
+ vike(),
45
+ telefuncPlugin,
46
+ vue(),
47
+ tailwindcss(),
48
+ databasePreparationPlugin(),
49
+ ],
12
50
  });
@@ -1,16 +1,57 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { createServer } from "node:net";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+
1
6
  import { defineConfig, devices } from "@playwright/test";
2
7
 
3
- function requiredPort(name: string): number {
4
- const value = process.env[name];
8
+ const webRoot = path.dirname(fileURLToPath(import.meta.url));
9
+ const stateFile = path.join(webRoot, "node_modules/.tmp/playwright-port");
5
10
 
6
- if (!value) {
7
- throw new Error(`${name} must be set by scripts/run-playwright.ts`);
8
- }
11
+ async function availablePort(): Promise<string> {
12
+ return await new Promise((resolve, reject) => {
13
+ const server = createServer();
14
+
15
+ server.once("error", reject);
16
+ server.listen(0, "127.0.0.1", () => {
17
+ const address = server.address();
18
+
19
+ if (typeof address !== "object" || address === null) {
20
+ server.close(() => {
21
+ reject(new Error("Could not allocate a Playwright web port"));
22
+ });
23
+ return;
24
+ }
25
+
26
+ const port = String(address.port);
27
+ server.close((error) => {
28
+ if (error) {
29
+ reject(error);
30
+ return;
31
+ }
9
32
 
10
- return Number(value);
33
+ resolve(port);
34
+ });
35
+ });
36
+ });
37
+ }
38
+
39
+ async function sharedPort(envName: string): Promise<string> {
40
+ const envPort = process.env[envName];
41
+ if (envPort !== undefined) {
42
+ return envPort;
43
+ }
44
+ try {
45
+ return await readFile(stateFile, "utf8");
46
+ } catch {
47
+ const port = await availablePort();
48
+ await mkdir(path.dirname(stateFile), { recursive: true });
49
+ await writeFile(stateFile, port, "utf8");
50
+ return port;
51
+ }
11
52
  }
12
53
 
13
- const previewPort = requiredPort("PLAYWRIGHT_WEB_PORT");
54
+ const previewPort = await sharedPort("PLAYWRIGHT_WEB_PORT");
14
55
  const previewUrl = `http://127.0.0.1:${previewPort}`;
15
56
 
16
57
  export default defineConfig({
@@ -1,17 +1,68 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { createServer } from "node:net";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+
1
6
  import { defineConfig, devices } from "@playwright/test";
2
7
 
3
- function requiredPort(name: string): number {
4
- const value = process.env[name];
8
+ const webRoot = path.dirname(fileURLToPath(import.meta.url));
9
+ const stateFile = path.join(webRoot, "node_modules/.tmp/playwright-ports");
5
10
 
6
- if (!value) {
7
- throw new Error(`${name} must be set by scripts/run-playwright.ts`);
8
- }
11
+ async function availablePort(): Promise<string> {
12
+ return await new Promise((resolve, reject) => {
13
+ const server = createServer();
14
+
15
+ server.once("error", reject);
16
+ server.listen(0, "127.0.0.1", () => {
17
+ const address = server.address();
18
+
19
+ if (typeof address !== "object" || address === null) {
20
+ server.close(() => {
21
+ reject(new Error("Could not allocate a Playwright web port"));
22
+ });
23
+ return;
24
+ }
25
+
26
+ const port = String(address.port);
27
+ server.close((error) => {
28
+ if (error) {
29
+ reject(error);
30
+ return;
31
+ }
9
32
 
10
- return Number(value);
33
+ resolve(port);
34
+ });
35
+ });
36
+ });
37
+ }
38
+
39
+ async function sharedPorts(): Promise<{
40
+ readonly api: string;
41
+ readonly web: string;
42
+ }> {
43
+ const envApi = process.env.PLAYWRIGHT_API_PORT;
44
+ const envWeb = process.env.PLAYWRIGHT_WEB_PORT;
45
+ if (envApi !== undefined && envWeb !== undefined) {
46
+ return { api: envApi, web: envWeb };
47
+ }
48
+ try {
49
+ const parsed = JSON.parse(await readFile(stateFile, "utf8")) as {
50
+ readonly api: string;
51
+ readonly web: string;
52
+ };
53
+ return parsed;
54
+ } catch {
55
+ const ports = {
56
+ api: envApi ?? (await availablePort()),
57
+ web: envWeb ?? (await availablePort()),
58
+ };
59
+ await mkdir(path.dirname(stateFile), { recursive: true });
60
+ await writeFile(stateFile, JSON.stringify(ports), "utf8");
61
+ return ports;
62
+ }
11
63
  }
12
64
 
13
- const apiPort = requiredPort("PLAYWRIGHT_API_PORT");
14
- const webPort = requiredPort("PLAYWRIGHT_WEB_PORT");
65
+ const { api: apiPort, web: webPort } = await sharedPorts();
15
66
  const apiBaseUrl = `http://127.0.0.1:${apiPort}`;
16
67
  const apiHealthUrl = `${apiBaseUrl}/api/health`;
17
68
  const webBaseUrl = `http://127.0.0.1:${webPort}`;
@@ -11,70 +11,39 @@ export type PlaywrightBrowserAssetsEnvironmentNeed = {
11
11
  readonly kind: "playwright-browser-assets";
12
12
  readonly browser: "chromium";
13
13
  readonly owner: ComponentOwner;
14
- readonly nextStep: {
15
- readonly id: string;
16
- readonly label: string;
17
- readonly command: string;
18
- readonly args: readonly string[];
19
- readonly display: string;
20
- readonly machineVerifiable: boolean;
21
- };
22
14
  };
23
15
  export type ShellCheckEnvironmentNeed = {
24
16
  readonly kind: "shellcheck-command";
25
17
  readonly owner: ComponentOwner;
26
- readonly nextStep: {
27
- readonly id: "install-shellcheck";
28
- readonly label: "Install ShellCheck";
29
- readonly command: "sudo";
30
- readonly args: readonly string[];
31
- readonly display: "sudo apt-get update && sudo apt-get install -y shellcheck";
32
- readonly machineVerifiable: false;
33
- };
34
18
  };
35
19
  /** Rust task leaves require the maintained toolchain in local and CI plans. */
36
20
  export type RustToolchainEnvironmentNeed = {
37
21
  readonly kind: "rust-toolchain";
38
22
  readonly owner: ComponentOwner;
39
23
  readonly toolchain: "stable";
40
- readonly nextStep: {
41
- readonly id: "install-rust-toolchain";
42
- readonly label: "Install Rust toolchain";
43
- readonly command: "rustup";
44
- readonly args: readonly string[];
45
- readonly display: "rustup toolchain install stable --component rustfmt --component clippy";
46
- readonly machineVerifiable: boolean;
47
- };
48
24
  };
49
25
  /**
50
26
  * Docker is needed only by the focused deployment mode. It is deliberately
51
- * outside ordinary Check Environment Needs, whose preparation and next steps
52
- * apply to every generated-check scenario.
27
+ * outside ordinary Check Environment Needs, which apply to every
28
+ * generated-check scenario.
53
29
  */
54
30
  export type DockerEngineEnvironmentNeed = {
55
31
  readonly kind: "docker-engine";
56
- readonly preparation: {
57
- readonly id: "verify-docker-engine";
58
- readonly label: "Verify Docker engine";
59
- readonly command: "docker";
60
- readonly args: readonly ["version", "--format", "{{.Server.Version}}"];
61
- readonly display: "docker version --format {{.Server.Version}}";
62
- readonly machineVerifiable: true;
63
- };
64
32
  };
65
33
  export type CheckEnvironmentNeed = PlaywrightBrowserAssetsEnvironmentNeed | ShellCheckEnvironmentNeed | RustToolchainEnvironmentNeed;
66
34
  export type DeploymentEnvironmentNeed = DockerEngineEnvironmentNeed;
67
- /**
68
- * The durable form of a Check Environment Need. It deliberately retains only
69
- * the explicit preparation fact, never a task name or package execution list.
70
- */
71
- export type CheckEnvironmentNeedFact = Pick<PlaywrightBrowserAssetsEnvironmentNeed, "kind" | "browser" | "owner"> | Pick<ShellCheckEnvironmentNeed, "kind" | "owner"> | Pick<RustToolchainEnvironmentNeed, "kind" | "owner" | "toolchain">;
72
- /** Deployment preparation is likewise durable without selecting an executing package. */
73
- export type DeploymentEnvironmentNeedFact = Pick<DockerEngineEnvironmentNeed, "kind">;
74
- export declare function checkEnvironmentNeedFact(need: CheckEnvironmentNeed): CheckEnvironmentNeedFact;
75
- export declare function checkEnvironmentNeedFromFact(fact: CheckEnvironmentNeedFact): CheckEnvironmentNeed;
76
- export declare function deploymentEnvironmentNeedFact(need: DeploymentEnvironmentNeed): DeploymentEnvironmentNeedFact;
77
- export declare function deploymentEnvironmentNeedFromFact(fact: DeploymentEnvironmentNeedFact): DeploymentEnvironmentNeed;
35
+ export type EnvironmentNeedsMetadata = {
36
+ readonly schemaVersion: 1;
37
+ readonly check: readonly CheckEnvironmentNeed[];
38
+ readonly deployment: readonly DeploymentEnvironmentNeed[];
39
+ };
40
+ /** Validates, deduplicates, and canonically orders durable Environment Needs. */
41
+ export declare function normalizeEnvironmentNeeds(options: {
42
+ readonly check: readonly CheckEnvironmentNeed[];
43
+ readonly deployment: readonly DeploymentEnvironmentNeed[];
44
+ }): EnvironmentNeedsMetadata;
45
+ /** Strict codec for Local Template Metadata consumed by Package Addition. */
46
+ export declare function parseEnvironmentNeedsMetadata(value: unknown): EnvironmentNeedsMetadata;
78
47
  export declare function rustToolchainEnvironmentNeed(owner: ComponentOwner): RustToolchainEnvironmentNeed;
79
48
  export declare function dockerEngineEnvironmentNeed(): DockerEngineEnvironmentNeed;
80
49
  export declare const qualityTaskVocabulary: readonly ["boundaries", "format:check", "lint", "typecheck", "build", "test", "test:e2e"];
@@ -83,18 +52,11 @@ export declare function renderTurboRunCommand(taskNames: readonly string[], args
83
52
  readonly continueAfterFailure?: boolean;
84
53
  readonly taskPrefix?: boolean;
85
54
  }): string;
86
- export declare function renderRootCheckCommand(): string;
55
+ export declare function renderRootCheckCommand(additionalTasks?: readonly string[]): string;
87
56
  export declare function renderDeploymentCheckCommand(): string;
88
57
  export declare function renderFixCommand(): string;
89
- export declare function renderPlaywrightBrowserInstallCommand(need: CheckEnvironmentNeed, options?: {
90
- readonly withDeps?: boolean;
91
- }): string;
92
- export declare function playwrightBrowserAssetsNextStepDescriptor(owner: ComponentOwner): Pick<CheckEnvironmentNeed["nextStep"], "id" | "label">;
93
58
  export declare function playwrightBrowserAssetsEnvironmentNeed(options: {
94
59
  readonly browser: "chromium";
95
60
  readonly owner: ComponentOwner;
96
- readonly id?: string;
97
- readonly label?: string;
98
- readonly machineVerifiable?: boolean;
99
61
  }): PlaywrightBrowserAssetsEnvironmentNeed;
100
62
  export declare function shellCheckEnvironmentNeed(owner: ComponentOwner): ShellCheckEnvironmentNeed;