@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.
- package/dist/application.d.ts +2 -1
- package/dist/application.js +64 -75
- package/dist/main.js +6 -2
- package/node_modules/@ykdz/template-builtin-presets/dist/src/foundation.d.ts +50 -36
- package/node_modules/@ykdz/template-builtin-presets/dist/src/foundation.js +970 -365
- package/node_modules/@ykdz/template-builtin-presets/dist/src/generation-record.d.ts +24 -0
- package/node_modules/@ykdz/template-builtin-presets/dist/src/generation-record.js +154 -0
- package/node_modules/@ykdz/template-builtin-presets/dist/src/index.d.ts +2 -2
- package/node_modules/@ykdz/template-builtin-presets/dist/src/index.js +1 -1
- package/node_modules/@ykdz/template-builtin-presets/dist/src/rust-bin/definition.d.ts +31 -2
- package/node_modules/@ykdz/template-builtin-presets/dist/src/rust-bin/definition.js +29 -33
- package/node_modules/@ykdz/template-builtin-presets/dist/src/shared/development-container.d.ts +1 -0
- package/node_modules/@ykdz/template-builtin-presets/dist/src/shared/development-container.js +17 -0
- package/node_modules/@ykdz/template-builtin-presets/dist/src/shared/typescript.d.ts +4 -3
- package/node_modules/@ykdz/template-builtin-presets/dist/src/shared/typescript.js +9 -5
- package/node_modules/@ykdz/template-builtin-presets/dist/src/shared/vue.d.ts +1 -1
- package/node_modules/@ykdz/template-builtin-presets/dist/src/shared/vue.js +1 -2
- package/node_modules/@ykdz/template-builtin-presets/dist/src/ts-cli/definition.d.ts +31 -2
- package/node_modules/@ykdz/template-builtin-presets/dist/src/ts-cli/definition.js +79 -58
- package/node_modules/@ykdz/template-builtin-presets/dist/src/ts-lib/definition.d.ts +31 -2
- package/node_modules/@ykdz/template-builtin-presets/dist/src/ts-lib/definition.js +31 -23
- package/node_modules/@ykdz/template-builtin-presets/dist/src/vike-app/definition.d.ts +22 -2
- package/node_modules/@ykdz/template-builtin-presets/dist/src/vike-app/definition.js +61 -35
- package/node_modules/@ykdz/template-builtin-presets/dist/src/vue-app/definition.d.ts +26 -2
- package/node_modules/@ykdz/template-builtin-presets/dist/src/vue-app/definition.js +19 -8
- package/node_modules/@ykdz/template-builtin-presets/dist/src/vue-hono-app/definition.d.ts +22 -2
- package/node_modules/@ykdz/template-builtin-presets/dist/src/vue-hono-app/definition.js +31 -21
- package/node_modules/@ykdz/template-builtin-presets/package.json +12 -11
- package/node_modules/@ykdz/template-builtin-presets/templates/foundation/.github/workflows/check-deployment-diagnostics.yml +1 -1
- package/node_modules/@ykdz/template-builtin-presets/templates/foundation/.github/workflows/check-deployment.yml +1 -1
- package/node_modules/@ykdz/template-builtin-presets/templates/foundation/.pnpmfile.mjs +19 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/foundation/gitignore +1 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/foundation/tsconfig.packing-hook.json +8 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/shared/devcontainer/github-cli.Dockerfile +9 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/CHANGELOG.md.template +17 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/RELEASING.md +17 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/artifact.ts +1271 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/changelog.ts +283 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/check-artifact.ts +99 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/check-readiness.ts +66 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/cli-command-identity.ts +4 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/handoff.ts +450 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/publish.ts +483 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/readiness.ts +1125 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/release.ts +819 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/release.yml +119 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/root-tsconfig.json +13 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/tsconfig.json +4 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication/turbo.json +6 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication-setup/README.md +48 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication-setup/assets/CHANGELOG.md.template +17 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication-setup/assets/LICENSE-APACHE-2.0.txt +202 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication-setup/assets/LICENSE-MIT.txt +21 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication-setup/assets/README.md.template +5 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication-setup/bridge.ts +3336 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/publication-setup/setup.sh +221 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/src/cli-command-identity.ts +133 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/src/cli.ts +4 -3
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/src/main.ts +5 -4
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/test/integration/command.test.ts +14 -13
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/test/unit/cli-command-identity.test.ts +76 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/ts-cli/tsconfig.build.json +2 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/db/src/readiness.ts +1 -1
- package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/db/test/global-setup.ts +21 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/db/tsconfig.json +6 -1
- package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/db/vitest.config.ts +7 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/db-migrations/drizzle.config.ts +5 -1
- package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/web/playwright.config.ts +102 -22
- package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/web/test/playwright-teardown.ts +12 -0
- package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/web/vite.config.ts +39 -1
- package/node_modules/@ykdz/template-builtin-presets/templates/vue-app/playwright.config.ts +48 -7
- package/node_modules/@ykdz/template-builtin-presets/templates/vue-hono-app/web/playwright.config.ts +59 -8
- package/node_modules/@ykdz/template-core/dist/module-graph.d.ts +15 -53
- package/node_modules/@ykdz/template-core/dist/module-graph.js +134 -101
- package/node_modules/@ykdz/template-core/dist/package-contribution.d.ts +13 -1
- package/node_modules/@ykdz/template-core/dist/package-contribution.js +92 -0
- package/node_modules/@ykdz/template-core/dist/pnpm-workspace.yaml +14 -10
- package/node_modules/@ykdz/template-core/dist/preset-definition.d.ts +71 -13
- package/node_modules/@ykdz/template-core/dist/preset-definition.js +16 -1
- package/node_modules/@ykdz/template-core/dist/project-blueprint.d.ts +56 -0
- package/node_modules/@ykdz/template-core/dist/project-blueprint.js +271 -0
- package/node_modules/@ykdz/template-core/dist/project-linking-v2.d.ts +2 -2
- package/node_modules/@ykdz/template-core/dist/project-linking-v2.js +2 -2
- package/node_modules/@ykdz/template-core/dist/project-projection.d.ts +2 -1
- package/node_modules/@ykdz/template-core/dist/project-projection.js +107 -20
- package/node_modules/@ykdz/template-core/dist/renderer.d.ts +0 -2
- package/node_modules/@ykdz/template-core/dist/renderer.js +17 -38
- package/node_modules/@ykdz/template-core/dist/template-boundary-check.d.ts +2 -2
- package/node_modules/@ykdz/template-core/dist/template-boundary-check.js +6 -0
- package/node_modules/@ykdz/template-core/dist/toolchain-resolution.d.ts +2 -0
- package/node_modules/@ykdz/template-core/dist/toolchain-resolution.js +9 -3
- package/package.json +3 -3
- package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/db-migrations/scripts/prepare-database.ts +0 -45
- package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/web/scripts/run-playwright.ts +0 -151
- package/node_modules/@ykdz/template-builtin-presets/templates/vue-app/scripts/run-playwright.ts +0 -62
- package/node_modules/@ykdz/template-builtin-presets/templates/vue-hono-app/web/scripts/run-playwright.ts +0 -103
- package/node_modules/@ykdz/template-core/dist/project-blueprint-v2.d.ts +0 -33
- package/node_modules/@ykdz/template-core/dist/project-blueprint-v2.js +0 -182
package/node_modules/@ykdz/template-builtin-presets/templates/vike-app/web/playwright.config.ts
CHANGED
|
@@ -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
|
|
30
|
-
return
|
|
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
|
|
34
|
-
const
|
|
69
|
+
async function awaitExternalService(baseUrl: string): Promise<void> {
|
|
70
|
+
const deadline = Date.now() + externalReadinessTimeoutMs;
|
|
35
71
|
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
143
|
+
globalTeardown: "./test/playwright-teardown.ts",
|
|
144
|
+
...(externalServiceUrl === undefined
|
|
145
|
+
? {
|
|
67
146
|
webServer: {
|
|
68
|
-
command:
|
|
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: [
|
|
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
|
-
|
|
4
|
-
|
|
8
|
+
const webRoot = path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const stateFile = path.join(webRoot, "node_modules/.tmp/playwright-port");
|
|
5
10
|
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
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 =
|
|
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({
|
package/node_modules/@ykdz/template-builtin-presets/templates/vue-hono-app/web/playwright.config.ts
CHANGED
|
@@ -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
|
-
|
|
4
|
-
|
|
8
|
+
const webRoot = path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const stateFile = path.join(webRoot, "node_modules/.tmp/playwright-ports");
|
|
5
10
|
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
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 =
|
|
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,
|
|
52
|
-
*
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
export
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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;
|