@ykdz/template 0.0.10 → 0.0.12

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 (48) hide show
  1. package/dist/cli.js +2 -2
  2. package/node_modules/@ykdz/template-builtin-source/dist/src/index.d.ts +4 -4
  3. package/node_modules/@ykdz/template-builtin-source/dist/src/index.js +12 -5
  4. package/node_modules/@ykdz/template-builtin-source/dist/templates/hono-api/projection.d.ts +1 -1
  5. package/node_modules/@ykdz/template-builtin-source/dist/templates/hono-api/projection.js +1 -1
  6. package/node_modules/@ykdz/template-builtin-source/dist/templates/projection-plans.js +9 -6
  7. package/node_modules/@ykdz/template-builtin-source/dist/templates/rust-bin/projection.d.ts +1 -1
  8. package/node_modules/@ykdz/template-builtin-source/dist/templates/rust-bin/projection.js +1 -1
  9. package/node_modules/@ykdz/template-builtin-source/dist/templates/ts-lib/projection.d.ts +1 -1
  10. package/node_modules/@ykdz/template-builtin-source/dist/templates/ts-lib/projection.js +1 -1
  11. package/node_modules/@ykdz/template-builtin-source/dist/templates/vue-app/projection.d.ts +1 -1
  12. package/node_modules/@ykdz/template-builtin-source/dist/templates/vue-app/projection.js +1 -1
  13. package/node_modules/@ykdz/template-builtin-source/dist/templates/vue-hono-app/projection.d.ts +1 -1
  14. package/node_modules/@ykdz/template-builtin-source/dist/templates/vue-hono-app/projection.js +10 -12
  15. package/node_modules/@ykdz/template-builtin-source/package.json +3 -2
  16. package/node_modules/@ykdz/template-builtin-source/templates/hono-api/vitest.config.ts +1 -0
  17. package/node_modules/@ykdz/template-builtin-source/templates/preset-source.json +35 -9
  18. package/node_modules/@ykdz/template-builtin-source/templates/vue-hono-app/api/vitest.config.ts +7 -0
  19. package/node_modules/@ykdz/template-builtin-source/templates/vue-hono-app/web/playwright.config.ts +23 -7
  20. package/node_modules/@ykdz/template-core/dist/declarations.d.ts +2 -203
  21. package/node_modules/@ykdz/template-core/dist/declarations.js +1 -303
  22. package/node_modules/@ykdz/template-core/dist/devcontainer.d.ts +17 -0
  23. package/node_modules/@ykdz/template-core/dist/devcontainer.js +22 -21
  24. package/node_modules/@ykdz/template-core/dist/editor-customization.d.ts +10 -1
  25. package/node_modules/@ykdz/template-core/dist/editor-customization.js +36 -26
  26. package/node_modules/@ykdz/template-core/dist/generated-scenarios.d.ts +4 -0
  27. package/node_modules/@ykdz/template-core/dist/generated-scenarios.js +32 -22
  28. package/node_modules/@ykdz/template-core/dist/generation-context.d.ts +1 -1
  29. package/node_modules/@ykdz/template-core/dist/module-graph.d.ts +19 -1
  30. package/node_modules/@ykdz/template-core/dist/module-graph.js +42 -3
  31. package/node_modules/@ykdz/template-core/dist/next-step-instructions.d.ts +2 -0
  32. package/node_modules/@ykdz/template-core/dist/next-step-instructions.js +11 -22
  33. package/node_modules/@ykdz/template-core/dist/package-addition-support.d.ts +2 -1
  34. package/node_modules/@ykdz/template-core/dist/package-addition-support.js +2 -4
  35. package/node_modules/@ykdz/template-core/dist/package-addition.js +5 -22
  36. package/node_modules/@ykdz/template-core/dist/package-linking.d.ts +2 -6
  37. package/node_modules/@ykdz/template-core/dist/package-linking.js +1 -1
  38. package/node_modules/@ykdz/template-core/dist/preset-projection.d.ts +1 -2
  39. package/node_modules/@ykdz/template-core/dist/preset-source.d.ts +4 -418
  40. package/node_modules/@ykdz/template-core/dist/preset-source.js +81 -726
  41. package/node_modules/@ykdz/template-core/dist/project-github.js +2 -6
  42. package/node_modules/@ykdz/template-core/dist/projection-capabilities.d.ts +5 -53
  43. package/node_modules/@ykdz/template-core/dist/projection-capabilities.js +103 -515
  44. package/node_modules/@ykdz/template-core/package.json +3 -2
  45. package/node_modules/@ykdz/template-shared/dist/index.d.ts +794 -0
  46. package/node_modules/@ykdz/template-shared/dist/index.js +1637 -0
  47. package/node_modules/@ykdz/template-shared/package.json +32 -0
  48. package/package.json +9 -6
@@ -3,7 +3,7 @@ import path from "node:path";
3
3
  import { execa } from "execa";
4
4
  import * as v from "valibot";
5
5
  import { assembleGenerationContext } from "./generation-context.js";
6
- import { renderPlaywrightBrowserInstallCommand, } from "./module-graph.js";
6
+ import { playwrightBrowserAssetsEnvironmentNeed, } from "./module-graph.js";
7
7
  import { planNextStepInstructions } from "./next-step-instructions.js";
8
8
  import { findPresetSourceManifestPreset } from "./preset-source.js";
9
9
  import { blueprintForPresetSourcePreset, projectPresetSourcePreset, } from "./projection-capabilities.js";
@@ -248,13 +248,18 @@ function machineVerifiableNextStepsForPreset(presetName, projectDir, manifest, o
248
248
  });
249
249
  return plan.steps
250
250
  .filter((step) => step.machineVerifiable && step.kind === "command")
251
- .map((step) => ({
252
- id: step.id,
253
- command: step.command,
254
- args: step.args,
255
- cwd: step.cwd,
256
- display: step.display,
257
- }));
251
+ .map((step) => {
252
+ return {
253
+ id: step.id,
254
+ command: step.command,
255
+ args: step.args,
256
+ cwd: step.cwd,
257
+ display: step.display,
258
+ ...(step.environmentNeedKind === undefined
259
+ ? {}
260
+ : { environmentNeedKind: step.environmentNeedKind }),
261
+ };
262
+ });
258
263
  }
259
264
  function addedPresetEnvironmentNeeds(manifest, scenario, projectDir, addedPackagePath, options) {
260
265
  if (!scenario.addedPreset || !addedPackagePath) {
@@ -264,30 +269,35 @@ function addedPresetEnvironmentNeeds(manifest, scenario, projectDir, addedPackag
264
269
  if (need.owner.kind !== "package-boundary") {
265
270
  return need;
266
271
  }
267
- return {
268
- ...need,
272
+ return playwrightBrowserAssetsEnvironmentNeed({
273
+ browser: need.browser,
269
274
  owner: { kind: "package-boundary", path: addedPackagePath },
270
- };
275
+ machineVerifiable: need.nextStep.machineVerifiable,
276
+ });
271
277
  });
272
278
  }
273
279
  function environmentNeedStep(need, projectDir) {
274
- const display = renderPlaywrightBrowserInstallCommand(need);
275
- const [command, ...args] = display.split(" ");
276
- if (command === undefined) {
277
- throw new Error(`Cannot parse environment setup command: ${display}`);
278
- }
279
280
  return {
280
- id: `install-${need.owner.path}-playwright-browsers`,
281
- command,
282
- args,
281
+ id: need.nextStep.id,
282
+ command: need.nextStep.command,
283
+ args: [...need.nextStep.args],
283
284
  cwd: projectDir,
284
- display,
285
+ display: need.nextStep.display,
286
+ environmentNeedKind: need.kind,
285
287
  };
286
288
  }
289
+ export function generatedScenarioEnvironmentNeedSteps(needs, projectDir) {
290
+ return needs
291
+ .filter((need) => need.nextStep.machineVerifiable)
292
+ .map((need) => environmentNeedStep(need, projectDir));
293
+ }
294
+ export function generatedScenarioRequiresSerializedRootCheck(steps) {
295
+ return steps.some((step) => step.environmentNeedKind === "playwright-browser-assets");
296
+ }
287
297
  export function generatedScenarioQualityGateSteps(manifest, scenario, projectDir, addedPackagePath, options) {
288
298
  const normalizedOptions = normalizeRunnerOptions(options);
289
299
  const steps = machineVerifiableNextStepsForPreset(scenario.basePreset, projectDir, manifest, normalizedOptions);
290
- const addedEnvironmentSteps = addedPresetEnvironmentNeeds(manifest, scenario, projectDir, addedPackagePath, normalizedOptions).map((need) => environmentNeedStep(need, projectDir));
300
+ const addedEnvironmentSteps = generatedScenarioEnvironmentNeedSteps(addedPresetEnvironmentNeeds(manifest, scenario, projectDir, addedPackagePath, normalizedOptions), projectDir);
291
301
  const existingDisplays = new Set(steps.map((step) => step.display));
292
302
  const extraEnvironmentSteps = addedEnvironmentSteps.filter((step) => !existingDisplays.has(step.display));
293
303
  if (extraEnvironmentSteps.length === 0) {
@@ -305,7 +315,7 @@ export function generatedScenarioQualityGateSteps(manifest, scenario, projectDir
305
315
  }
306
316
  async function runGeneratedScenarioQualityGate(manifest, scenario, projectDir, addedPackagePath, options) {
307
317
  const steps = generatedScenarioQualityGateSteps(manifest, scenario, projectDir, addedPackagePath, options);
308
- const requiresSerializedPlaywrightRootCheck = steps.some((step) => step.id.endsWith("-playwright-browsers"));
318
+ const requiresSerializedPlaywrightRootCheck = generatedScenarioRequiresSerializedRootCheck(steps);
309
319
  for (const step of steps) {
310
320
  const env = step.id === "run-root-check" ? { CI: "1" } : undefined;
311
321
  const runStep = async () => {
@@ -1,4 +1,4 @@
1
- import type { PackageManager, ProjectBlueprint } from "./declarations.js";
1
+ import type { PackageManager, ProjectBlueprint } from "@ykdz/template-shared";
2
2
  import type { ResolvedToolchainVersions } from "./toolchain-resolution.js";
3
3
  export type ProjectName = {
4
4
  readonly kind: "ProjectName";
@@ -13,6 +13,14 @@ export type CheckEnvironmentNeed = {
13
13
  readonly kind: "playwright-browser-assets";
14
14
  readonly browser: "chromium";
15
15
  readonly owner: ComponentOwner;
16
+ readonly nextStep: {
17
+ readonly id: string;
18
+ readonly label: string;
19
+ readonly command: string;
20
+ readonly args: readonly string[];
21
+ readonly display: string;
22
+ readonly machineVerifiable: boolean;
23
+ };
16
24
  };
17
25
  export type CheckComponent = {
18
26
  readonly kind: CheckComponentKind;
@@ -31,4 +39,14 @@ export type FixPlan = {
31
39
  };
32
40
  export declare function renderRootCheckCommand(plan: CheckPlan): string;
33
41
  export declare function renderFixCommand(plan: FixPlan): string;
34
- export declare function renderPlaywrightBrowserInstallCommand(need: CheckEnvironmentNeed): string;
42
+ export declare function renderPlaywrightBrowserInstallCommand(need: CheckEnvironmentNeed, options?: {
43
+ readonly withDeps?: boolean;
44
+ }): string;
45
+ export declare function playwrightBrowserAssetsNextStepDescriptor(owner: ComponentOwner): Pick<CheckEnvironmentNeed["nextStep"], "id" | "label">;
46
+ export declare function playwrightBrowserAssetsEnvironmentNeed(options: {
47
+ readonly browser: "chromium";
48
+ readonly owner: ComponentOwner;
49
+ readonly id?: string;
50
+ readonly label?: string;
51
+ readonly machineVerifiable?: boolean;
52
+ }): CheckEnvironmentNeed;
@@ -58,9 +58,48 @@ export function renderRootCheckCommand(plan) {
58
58
  export function renderFixCommand(plan) {
59
59
  return plan.components.map(renderFixComponentCommand).join(" && ");
60
60
  }
61
- export function renderPlaywrightBrowserInstallCommand(need) {
61
+ function playwrightBrowserInstallArgs(need, options = {}) {
62
+ const installArgs = [
63
+ "exec",
64
+ "playwright",
65
+ "install",
66
+ ...(options.withDeps ? ["--with-deps"] : []),
67
+ need.browser,
68
+ ];
62
69
  if (need.owner.kind === "package-boundary" && need.owner.path !== ".") {
63
- return `pnpm --filter ./${need.owner.path} exec playwright install ${need.browser}`;
70
+ return ["--filter", `./${need.owner.path}`, ...installArgs];
64
71
  }
65
- return `pnpm exec playwright install ${need.browser}`;
72
+ return installArgs;
73
+ }
74
+ export function renderPlaywrightBrowserInstallCommand(need, options = {}) {
75
+ return ["pnpm", ...playwrightBrowserInstallArgs(need, options)].join(" ");
76
+ }
77
+ export function playwrightBrowserAssetsNextStepDescriptor(owner) {
78
+ if (owner.kind === "package-boundary" && owner.path !== ".") {
79
+ return {
80
+ id: `install-${owner.path.replaceAll("/", "-")}-playwright-browsers`,
81
+ label: `Install Playwright browser assets for ${owner.path} package`,
82
+ };
83
+ }
84
+ return {
85
+ id: "install-workspace-playwright-browsers",
86
+ label: "Install Playwright browser assets for workspace",
87
+ };
88
+ }
89
+ export function playwrightBrowserAssetsEnvironmentNeed(options) {
90
+ const args = playwrightBrowserInstallArgs(options);
91
+ const descriptor = playwrightBrowserAssetsNextStepDescriptor(options.owner);
92
+ return {
93
+ kind: "playwright-browser-assets",
94
+ browser: options.browser,
95
+ owner: options.owner,
96
+ nextStep: {
97
+ id: options.id ?? descriptor.id,
98
+ label: options.label ?? descriptor.label,
99
+ command: "pnpm",
100
+ args,
101
+ display: ["pnpm", ...args].join(" "),
102
+ machineVerifiable: options.machineVerifiable ?? true,
103
+ },
104
+ };
66
105
  }
@@ -1,3 +1,4 @@
1
+ import type { CheckEnvironmentNeed } from "./module-graph.js";
1
2
  import type { PresetProjectionPlan } from "./preset-projection.js";
2
3
  export type NextStepInstruction = {
3
4
  readonly id: string;
@@ -8,6 +9,7 @@ export type NextStepInstruction = {
8
9
  readonly cwd: string;
9
10
  readonly display: string;
10
11
  readonly machineVerifiable: boolean;
12
+ readonly environmentNeedKind?: CheckEnvironmentNeed["kind"];
11
13
  };
12
14
  export type NextStepInstructionPlan = {
13
15
  readonly targetDir: string;
@@ -1,4 +1,3 @@
1
- import { renderPlaywrightBrowserInstallCommand } from "./module-graph.js";
2
1
  function rootCheckInstruction() {
3
2
  return {
4
3
  id: "run-root-check",
@@ -70,27 +69,17 @@ function fixInstruction() {
70
69
  };
71
70
  }
72
71
  function checkEnvironmentInstructions(plan) {
73
- return plan.checkPlan.environmentNeeds.map((need) => {
74
- const display = renderPlaywrightBrowserInstallCommand(need);
75
- const [command, ...args] = display.split(" ");
76
- if (command === undefined) {
77
- throw new Error(`Cannot parse environment setup command: ${display}`);
78
- }
79
- return {
80
- id: need.owner.path === "apps/web"
81
- ? "install-web-playwright-browsers"
82
- : "install-playwright-browsers",
83
- label: need.owner.path === "apps/web"
84
- ? "Install Playwright browser assets for web workspace"
85
- : "Install Playwright browser assets",
86
- kind: "command",
87
- command,
88
- args,
89
- cwd: "",
90
- display,
91
- machineVerifiable: true,
92
- };
93
- });
72
+ return plan.checkPlan.environmentNeeds.map((need) => ({
73
+ id: need.nextStep.id,
74
+ label: need.nextStep.label,
75
+ kind: "command",
76
+ command: need.nextStep.command,
77
+ args: need.nextStep.args,
78
+ cwd: "",
79
+ display: need.nextStep.display,
80
+ machineVerifiable: need.nextStep.machineVerifiable,
81
+ environmentNeedKind: need.kind,
82
+ }));
94
83
  }
95
84
  function projectionInstructions(plan) {
96
85
  const steps = [installDependenciesInstruction()];
@@ -1,5 +1,6 @@
1
+ import type { PackageAdditionSupport as SharedPackageAdditionSupportType } from "@ykdz/template-shared";
1
2
  export declare const PackageAdditionSupport: {
2
3
  readonly Supported: "supported";
3
4
  readonly Unsupported: "unsupported";
4
5
  };
5
- export type PackageAdditionSupport = (typeof PackageAdditionSupport)[keyof typeof PackageAdditionSupport];
6
+ export type PackageAdditionSupport = SharedPackageAdditionSupportType;
@@ -1,4 +1,2 @@
1
- export const PackageAdditionSupport = {
2
- Supported: "supported",
3
- Unsupported: "unsupported",
4
- };
1
+ import { PackageAdditionSupport as SharedPackageAdditionSupport } from "@ykdz/template-shared";
2
+ export const PackageAdditionSupport = SharedPackageAdditionSupport;
@@ -1,8 +1,8 @@
1
1
  import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
2
2
  import path from "node:path";
3
- import { validateProjectBlueprint, } from "./declarations.js";
3
+ import { validateProjectBlueprint, } from "@ykdz/template-shared";
4
+ import { PackageAdditionSupport, } from "@ykdz/template-shared";
4
5
  import { collectGeneratedManifestCatalogReferences, pnpmWorkspaceYamlWithCatalogDependencies, } from "./dependency-catalog.js";
5
- import { PackageAdditionSupport } from "./package-addition-support.js";
6
6
  import { assertTypeScriptPackageBoundaryForLinkIntent, packageTurboTasks, planPackageLinks, } from "./package-linking.js";
7
7
  import { findPresetSourceManifestPreset, } from "./preset-source.js";
8
8
  import { defaultPackagePathForPresetSourcePackageAddition, planPresetSourcePackageAddition, } from "./projection-capabilities.js";
@@ -407,21 +407,6 @@ function rootScriptWithTurboPackageTask(script, task, workspacePackageGlobs) {
407
407
  commands[turboCommandIndex] = turboPackageTaskCommand(task, workspacePackageGlobs);
408
408
  return commands.join(" && ");
409
409
  }
410
- function turboTaskNamesForPackageManifests(manifests) {
411
- const taskNames = [];
412
- for (const taskName of [
413
- "typecheck",
414
- "build",
415
- "test",
416
- "test:e2e",
417
- "check",
418
- ]) {
419
- if (manifests.some((manifest) => typeof manifest.scripts?.[taskName] === "string")) {
420
- taskNames.push(taskName);
421
- }
422
- }
423
- return taskNames;
424
- }
425
410
  function rootScriptWithTurboPackageTasks(options) {
426
411
  const rootCommands = options.script
427
412
  .split(" && ")
@@ -429,11 +414,9 @@ function rootScriptWithTurboPackageTasks(options) {
429
414
  const turboCommands = options.taskNames.map((taskName) => turboPackageTaskCommand(taskName, options.workspacePackageGlobs));
430
415
  return [...rootCommands, ...turboCommands].join(" && ");
431
416
  }
432
- function rootPackageJsonWithPackageTaskFilters(input, blueprint, packageManifests) {
417
+ function rootPackageJsonWithPackageTaskFilters(input, blueprint) {
433
418
  assertRootPackageJson(input);
434
419
  const workspacePackageGlobs = workspacePackageGlobsFromBlueprint(blueprint);
435
- const taskNames = turboTaskNamesForPackageManifests(packageManifests);
436
- const rootCheckTaskNames = taskNames.filter((taskName) => taskName !== "test:e2e");
437
420
  const checkScript = input.scripts.check;
438
421
  const fixScript = input.scripts.fix;
439
422
  if (checkScript === undefined || fixScript === undefined) {
@@ -445,7 +428,7 @@ function rootPackageJsonWithPackageTaskFilters(input, blueprint, packageManifest
445
428
  ...input.scripts,
446
429
  check: rootScriptWithTurboPackageTasks({
447
430
  script: checkScript,
448
- taskNames: rootCheckTaskNames,
431
+ taskNames: ["check"],
449
432
  workspacePackageGlobs,
450
433
  }),
451
434
  fix: rootScriptWithTurboPackageTask(fixScript, "fix", workspacePackageGlobs),
@@ -539,7 +522,7 @@ async function planRootUpdates(root, blueprint, packageName, packagePath, packag
539
522
  manifestOverrides,
540
523
  });
541
524
  const workspaceText = pnpmWorkspaceYamlWithCatalogDependencies(workspaceTextWithPackageGlob(await readFile(path.join(root, "pnpm-workspace.yaml"), "utf8"), workspacePackageGlob), catalogDependenciesWithSharedOxcRuntimeDependencies(catalogDependencies, requiresSharedOxcConfiguration));
542
- const rootPackageJson = rootPackageJsonWithPackageTaskFilters(await readJson(path.join(root, "package.json")), nextBlueprint, packageManifests);
525
+ const rootPackageJson = rootPackageJsonWithPackageTaskFilters(await readJson(path.join(root, "package.json")), nextBlueprint);
543
526
  return {
544
527
  blueprint: nextBlueprint,
545
528
  rootPackageJson: rootPackageJsonWithSharedOxcRuntimeDependencies(rootPackageJson, requiresSharedOxcConfiguration),
@@ -1,15 +1,11 @@
1
- export type PackageRole = "runtime-service" | "shared-library";
2
- export type PackageSourcePreset = "hono-api" | "ts-lib" | "vue-app";
1
+ import type { PackageLinkIntent, PackageRole, PackageSourcePreset } from "@ykdz/template-shared";
2
+ export type { PackageLinkIntent, PackageRole, PackageSourcePreset, } from "@ykdz/template-shared";
3
3
  export type PackageDefinition = {
4
4
  readonly name: string;
5
5
  readonly path: string;
6
6
  readonly role?: PackageRole;
7
7
  readonly sourcePreset?: PackageSourcePreset;
8
8
  };
9
- export type PackageLinkIntent = {
10
- readonly consumerPackagePath: string;
11
- readonly providerPackagePath: string;
12
- };
13
9
  export type JitSourcePackageExposure = {
14
10
  readonly kind: "jit-source";
15
11
  readonly entrypoint: string;
@@ -75,7 +75,7 @@ export function packageTurboTasks({ dependencyBuildsRequired, }) {
75
75
  "test:e2e": {
76
76
  dependsOn: dependencyBuildsRequired ? ["build", "^build"] : ["build"],
77
77
  },
78
- check: { dependsOn: ["typecheck", "build", "test", "test:e2e"] },
78
+ check: { dependsOn: ["typecheck", "build", "test"] },
79
79
  fix: { cache: false },
80
80
  };
81
81
  }
@@ -1,8 +1,7 @@
1
- import type { BuiltInPreset, ProjectBlueprint } from "./declarations.js";
1
+ import type { BuiltInPreset, PackageRole, PackageSourcePreset, ProjectBlueprint } from "@ykdz/template-shared";
2
2
  import type { GenerationContext } from "./generation-context.js";
3
3
  import { type CheckPlan, type FixPlan } from "./module-graph.js";
4
4
  import { type NextStepInstruction } from "./next-step-instructions.js";
5
- import type { PackageRole, PackageSourcePreset } from "./package-linking.js";
6
5
  import type { DependencyMaintenancePolicy } from "./project-github.js";
7
6
  import type { RenderOperation } from "./renderer.js";
8
7
  export type PresetPackageAdditionOptions = {