@ykdz/template 0.0.0 → 0.0.2

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 (75) hide show
  1. package/dist/cli.js +94 -44
  2. package/dist/declarations.js +1 -1
  3. package/dist/devcontainer.d.ts +17 -0
  4. package/dist/devcontainer.d.ts.map +1 -0
  5. package/dist/devcontainer.js +23 -0
  6. package/dist/generation-context.d.ts +24 -0
  7. package/dist/generation-context.d.ts.map +1 -0
  8. package/dist/generation-context.js +12 -0
  9. package/dist/hono-api.d.ts +1 -0
  10. package/dist/hono-api.d.ts.map +1 -1
  11. package/dist/hono-api.js +63 -100
  12. package/dist/module-graph.d.ts +45 -0
  13. package/dist/module-graph.d.ts.map +1 -0
  14. package/dist/module-graph.js +187 -0
  15. package/dist/next-step-instructions.d.ts +22 -0
  16. package/dist/next-step-instructions.d.ts.map +1 -0
  17. package/dist/next-step-instructions.js +99 -0
  18. package/dist/package-addition.d.ts.map +1 -1
  19. package/dist/package-addition.js +31 -51
  20. package/dist/project-github.d.ts +36 -0
  21. package/dist/project-github.d.ts.map +1 -0
  22. package/dist/project-github.js +96 -0
  23. package/dist/renderer.d.ts +2 -0
  24. package/dist/renderer.d.ts.map +1 -1
  25. package/dist/renderer.js +7 -4
  26. package/dist/rust-bin.d.ts +7 -1
  27. package/dist/rust-bin.d.ts.map +1 -1
  28. package/dist/rust-bin.js +68 -66
  29. package/dist/toolchain-resolution.d.ts +35 -0
  30. package/dist/toolchain-resolution.d.ts.map +1 -0
  31. package/dist/toolchain-resolution.js +192 -0
  32. package/dist/ts-lib.d.ts +7 -1
  33. package/dist/ts-lib.d.ts.map +1 -1
  34. package/dist/ts-lib.js +95 -101
  35. package/dist/vue-app.d.ts +1 -0
  36. package/dist/vue-app.d.ts.map +1 -1
  37. package/dist/vue-app.js +78 -116
  38. package/dist/vue-hono-app.d.ts +3 -0
  39. package/dist/vue-hono-app.d.ts.map +1 -1
  40. package/dist/vue-hono-app.js +126 -170
  41. package/package.json +24 -16
  42. package/templates/hono-api/.github/dependabot.yml +10 -0
  43. package/templates/hono-api/.github/workflows/check.yml +19 -0
  44. package/templates/hono-api/src/server.ts +3 -2
  45. package/templates/hono-api/vitest.config.ts +5 -4
  46. package/templates/rust-bin/.github/dependabot.yml +14 -0
  47. package/templates/rust-bin/.github/workflows/check.yml +23 -0
  48. package/templates/shared/oxc/node/oxlint.config.ts +9 -0
  49. package/templates/shared/oxc/oxfmt.config.ts +8 -0
  50. package/templates/shared/oxc/package.json +18 -0
  51. package/templates/shared/oxc/tsconfig.json +11 -0
  52. package/templates/shared/oxc/vue/oxlint.config.ts +9 -0
  53. package/templates/ts-lib/.github/dependabot.yml +10 -0
  54. package/templates/ts-lib/.github/workflows/check.yml +19 -0
  55. package/templates/vue-app/.github/dependabot.yml +10 -0
  56. package/templates/vue-app/.github/workflows/check.yml +20 -0
  57. package/templates/vue-app/playwright.config.ts +5 -5
  58. package/templates/vue-app/src/App.vue +15 -5
  59. package/templates/vue-app/src/main.ts +2 -0
  60. package/templates/vue-app/test/app.test.ts +1 -0
  61. package/templates/vue-app/test/e2e/app.spec.ts +3 -1
  62. package/templates/vue-app/vite.config.ts +6 -5
  63. package/templates/vue-app/vitest.config.ts +5 -4
  64. package/templates/vue-hono-app/.github/dependabot.yml +10 -0
  65. package/templates/vue-hono-app/.github/workflows/check.yml +20 -0
  66. package/templates/vue-hono-app/api/src/server.ts +3 -2
  67. package/templates/vue-hono-app/api/vitest.config.ts +2 -2
  68. package/templates/vue-hono-app/web/playwright.config.ts +9 -7
  69. package/templates/vue-hono-app/web/src/App.vue +12 -4
  70. package/templates/vue-hono-app/web/src/api.ts +1 -1
  71. package/templates/vue-hono-app/web/src/main.ts +2 -0
  72. package/templates/vue-hono-app/web/test/app.test.ts +1 -0
  73. package/templates/vue-hono-app/web/test/e2e/app.spec.ts +3 -1
  74. package/templates/vue-hono-app/web/vite.config.ts +13 -10
  75. package/templates/vue-hono-app/web/vitest.config.ts +6 -5
@@ -0,0 +1,45 @@
1
+ import type { PresetName } from "./declarations.js";
2
+ export type PackageBoundaryOwner = {
3
+ readonly kind: "package-boundary";
4
+ readonly path: "." | "apps/api" | "apps/web";
5
+ };
6
+ export type ComponentOwner = PackageBoundaryOwner;
7
+ export type CheckComponentKind = "typescript-typecheck" | "oxc-lint" | "oxc-format-check" | "build" | "unit-test" | "e2e-test" | "turbo-check" | "rustfmt-check" | "cargo-clippy" | "cargo-test";
8
+ export type FixComponentKind = "oxc-format-write" | "oxc-lint-fix" | "turbo-fix" | "rustfmt-write";
9
+ export type CheckEnvironmentNeed = {
10
+ readonly kind: "playwright-browser-assets";
11
+ readonly browser: "chromium";
12
+ readonly owner: ComponentOwner;
13
+ };
14
+ export type CheckComponent = {
15
+ readonly kind: CheckComponentKind;
16
+ readonly owner: ComponentOwner;
17
+ };
18
+ export type FixComponent = {
19
+ readonly kind: FixComponentKind;
20
+ readonly owner: ComponentOwner;
21
+ };
22
+ export type CheckPlan = {
23
+ readonly components: CheckComponent[];
24
+ readonly environmentNeeds: CheckEnvironmentNeed[];
25
+ };
26
+ export type FixPlan = {
27
+ readonly components: FixComponent[];
28
+ };
29
+ export type NodeCheckPlanTarget = "ts-lib" | "hono-api" | "vue-app" | "vue-hono-root" | "vue-hono-api" | "vue-hono-web";
30
+ export type NodeFixPlanTarget = "ts-lib" | "hono-api" | "vue-app" | "vue-hono-root" | "vue-hono-api" | "vue-hono-web";
31
+ export declare function selectNodeCheckComponents(target: NodeCheckPlanTarget): CheckComponent[];
32
+ export declare function selectNodeFixComponents(target: NodeFixPlanTarget): FixComponent[];
33
+ export declare function selectTsLibCheckComponents(): CheckComponent[];
34
+ export declare function selectTsLibFixComponents(): FixComponent[];
35
+ export declare function planNodeChecks(target: NodeCheckPlanTarget): CheckPlan;
36
+ export declare function planNodeFixes(target: NodeFixPlanTarget): FixPlan;
37
+ export declare function planRustBinChecks(): CheckPlan;
38
+ export declare function planRustBinFixes(): FixPlan;
39
+ export declare function planPresetChecks(preset: PresetName): CheckPlan | undefined;
40
+ export declare function planTsLibChecks(): CheckPlan;
41
+ export declare function planTsLibFixes(): FixPlan;
42
+ export declare function renderRootCheckCommand(plan: CheckPlan): string;
43
+ export declare function renderFixCommand(plan: FixPlan): string;
44
+ export declare function renderPlaywrightBrowserInstallCommand(need: CheckEnvironmentNeed): string;
45
+ //# sourceMappingURL=module-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-graph.d.ts","sourceRoot":"","sources":["../src/module-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,GAAG,GAAG,UAAU,GAAG,UAAU,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,oBAAoB,CAAC;AAElD,MAAM,MAAM,kBAAkB,GAC1B,sBAAsB,GACtB,UAAU,GACV,kBAAkB,GAClB,OAAO,GACP,WAAW,GACX,UAAU,GACV,aAAa,GACb,eAAe,GACf,cAAc,GACd,YAAY,CAAC;AAEjB,MAAM,MAAM,gBAAgB,GACxB,kBAAkB,GAClB,cAAc,GACd,WAAW,GACX,eAAe,CAAC;AAEpB,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,UAAU,EAAE,cAAc,EAAE,CAAC;IACtC,QAAQ,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,CAAC;CACnD,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC;CACrC,CAAC;AAsBF,MAAM,MAAM,mBAAmB,GAC3B,QAAQ,GACR,UAAU,GACV,SAAS,GACT,eAAe,GACf,cAAc,GACd,cAAc,CAAC;AAEnB,MAAM,MAAM,iBAAiB,GACzB,QAAQ,GACR,UAAU,GACV,SAAS,GACT,eAAe,GACf,cAAc,GACd,cAAc,CAAC;AAsCnB,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,EAAE,CAevF;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,YAAY,EAAE,CAajF;AAgBD,wBAAgB,0BAA0B,IAAI,cAAc,EAAE,CAE7D;AAED,wBAAgB,wBAAwB,IAAI,YAAY,EAAE,CAEzD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,mBAAmB,GAAG,SAAS,CAKrE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAEhE;AAED,wBAAgB,iBAAiB,IAAI,SAAS,CAS7C;AAED,wBAAgB,gBAAgB,IAAI,OAAO,CAI1C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAa1E;AAED,wBAAgB,eAAe,IAAI,SAAS,CAE3C;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAwCD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAE9D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEtD;AAED,wBAAgB,qCAAqC,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAMxF"}
@@ -0,0 +1,187 @@
1
+ const tsLibPackageBoundary = {
2
+ kind: "package-boundary",
3
+ path: ".",
4
+ };
5
+ const apiPackageBoundary = {
6
+ kind: "package-boundary",
7
+ path: "apps/api",
8
+ };
9
+ const webPackageBoundary = {
10
+ kind: "package-boundary",
11
+ path: "apps/web",
12
+ };
13
+ const rustPackageBoundary = {
14
+ kind: "package-boundary",
15
+ path: ".",
16
+ };
17
+ function nodeLibraryCheckComponents(owner) {
18
+ return [
19
+ { kind: "typescript-typecheck", owner },
20
+ { kind: "oxc-lint", owner },
21
+ { kind: "oxc-format-check", owner },
22
+ ];
23
+ }
24
+ function honoApiCheckComponents(owner) {
25
+ return [
26
+ { kind: "oxc-format-check", owner },
27
+ { kind: "oxc-lint", owner },
28
+ { kind: "typescript-typecheck", owner },
29
+ { kind: "build", owner },
30
+ { kind: "unit-test", owner },
31
+ ];
32
+ }
33
+ function vueAppCheckComponents(owner) {
34
+ return [
35
+ { kind: "oxc-format-check", owner },
36
+ { kind: "oxc-lint", owner },
37
+ { kind: "typescript-typecheck", owner },
38
+ { kind: "build", owner },
39
+ { kind: "unit-test", owner },
40
+ { kind: "e2e-test", owner },
41
+ ];
42
+ }
43
+ function nodeFixComponents(owner) {
44
+ return [
45
+ { kind: "oxc-format-write", owner },
46
+ { kind: "oxc-lint-fix", owner },
47
+ ];
48
+ }
49
+ export function selectNodeCheckComponents(target) {
50
+ switch (target) {
51
+ case "ts-lib":
52
+ return nodeLibraryCheckComponents(tsLibPackageBoundary);
53
+ case "hono-api":
54
+ return honoApiCheckComponents(tsLibPackageBoundary);
55
+ case "vue-app":
56
+ return vueAppCheckComponents(tsLibPackageBoundary);
57
+ case "vue-hono-root":
58
+ return [{ kind: "turbo-check", owner: tsLibPackageBoundary }];
59
+ case "vue-hono-api":
60
+ return honoApiCheckComponents(apiPackageBoundary);
61
+ case "vue-hono-web":
62
+ return vueAppCheckComponents(webPackageBoundary);
63
+ }
64
+ }
65
+ export function selectNodeFixComponents(target) {
66
+ switch (target) {
67
+ case "ts-lib":
68
+ case "hono-api":
69
+ case "vue-app":
70
+ return nodeFixComponents(tsLibPackageBoundary);
71
+ case "vue-hono-root":
72
+ return [{ kind: "turbo-fix", owner: tsLibPackageBoundary }];
73
+ case "vue-hono-api":
74
+ return nodeFixComponents(apiPackageBoundary);
75
+ case "vue-hono-web":
76
+ return nodeFixComponents(webPackageBoundary);
77
+ }
78
+ }
79
+ function checkEnvironmentNeeds(target) {
80
+ if (target === "vue-app") {
81
+ return [
82
+ { kind: "playwright-browser-assets", browser: "chromium", owner: tsLibPackageBoundary },
83
+ ];
84
+ }
85
+ if (target === "vue-hono-root" || target === "vue-hono-web") {
86
+ return [{ kind: "playwright-browser-assets", browser: "chromium", owner: webPackageBoundary }];
87
+ }
88
+ return [];
89
+ }
90
+ export function selectTsLibCheckComponents() {
91
+ return selectNodeCheckComponents("ts-lib");
92
+ }
93
+ export function selectTsLibFixComponents() {
94
+ return selectNodeFixComponents("ts-lib");
95
+ }
96
+ export function planNodeChecks(target) {
97
+ return {
98
+ components: selectNodeCheckComponents(target),
99
+ environmentNeeds: checkEnvironmentNeeds(target),
100
+ };
101
+ }
102
+ export function planNodeFixes(target) {
103
+ return { components: selectNodeFixComponents(target) };
104
+ }
105
+ export function planRustBinChecks() {
106
+ return {
107
+ components: [
108
+ { kind: "rustfmt-check", owner: rustPackageBoundary },
109
+ { kind: "cargo-clippy", owner: rustPackageBoundary },
110
+ { kind: "cargo-test", owner: rustPackageBoundary },
111
+ ],
112
+ environmentNeeds: [],
113
+ };
114
+ }
115
+ export function planRustBinFixes() {
116
+ return {
117
+ components: [{ kind: "rustfmt-write", owner: rustPackageBoundary }],
118
+ };
119
+ }
120
+ export function planPresetChecks(preset) {
121
+ switch (preset) {
122
+ case "ts-lib":
123
+ case "hono-api":
124
+ case "vue-app":
125
+ return planNodeChecks(preset);
126
+ case "vue-hono-app":
127
+ return planNodeChecks("vue-hono-root");
128
+ case "rust-bin":
129
+ return planRustBinChecks();
130
+ default:
131
+ return undefined;
132
+ }
133
+ }
134
+ export function planTsLibChecks() {
135
+ return planNodeChecks("ts-lib");
136
+ }
137
+ export function planTsLibFixes() {
138
+ return planNodeFixes("ts-lib");
139
+ }
140
+ function renderCheckComponentCommand(component) {
141
+ switch (component.kind) {
142
+ case "typescript-typecheck":
143
+ return "pnpm run typecheck";
144
+ case "oxc-lint":
145
+ return "pnpm run lint";
146
+ case "oxc-format-check":
147
+ return "pnpm run format:check";
148
+ case "build":
149
+ return "pnpm run build";
150
+ case "unit-test":
151
+ return "pnpm run test";
152
+ case "e2e-test":
153
+ return "pnpm run test:e2e";
154
+ case "turbo-check":
155
+ return "turbo run check";
156
+ case "rustfmt-check":
157
+ return "cargo fmt --all -- --check";
158
+ case "cargo-clippy":
159
+ return "cargo clippy --workspace --all-targets -- -D warnings";
160
+ case "cargo-test":
161
+ return "cargo test --workspace";
162
+ }
163
+ }
164
+ function renderFixComponentCommand(component) {
165
+ switch (component.kind) {
166
+ case "oxc-format-write":
167
+ return "pnpm run format:write";
168
+ case "oxc-lint-fix":
169
+ return "pnpm run lint:fix";
170
+ case "turbo-fix":
171
+ return "turbo run fix";
172
+ case "rustfmt-write":
173
+ return "cargo fmt --all";
174
+ }
175
+ }
176
+ export function renderRootCheckCommand(plan) {
177
+ return plan.components.map(renderCheckComponentCommand).join(" && ");
178
+ }
179
+ export function renderFixCommand(plan) {
180
+ return plan.components.map(renderFixComponentCommand).join(" && ");
181
+ }
182
+ export function renderPlaywrightBrowserInstallCommand(need) {
183
+ if (need.owner.path === "apps/web") {
184
+ return `pnpm --filter ./apps/web exec playwright install ${need.browser}`;
185
+ }
186
+ return `pnpm exec playwright install ${need.browser}`;
187
+ }
@@ -0,0 +1,22 @@
1
+ import type { PresetName } from "./declarations.js";
2
+ export type NextStepInstruction = {
3
+ readonly id: string;
4
+ readonly label: string;
5
+ readonly kind: "navigation" | "command";
6
+ readonly command: string;
7
+ readonly args: readonly string[];
8
+ readonly cwd: string;
9
+ readonly display: string;
10
+ readonly machineVerifiable: boolean;
11
+ };
12
+ export type NextStepInstructionPlan = {
13
+ readonly preset: PresetName;
14
+ readonly targetDir: string;
15
+ readonly steps: readonly NextStepInstruction[];
16
+ };
17
+ export type PlanNextStepInstructionsOptions = {
18
+ readonly preset: PresetName;
19
+ readonly targetDir: string;
20
+ };
21
+ export declare function planNextStepInstructions(options: PlanNextStepInstructionsOptions): NextStepInstructionPlan;
22
+ //# sourceMappingURL=next-step-instructions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next-step-instructions.d.ts","sourceRoot":"","sources":["../src/next-step-instructions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AA0FF,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,+BAA+B,GACvC,uBAAuB,CAsBzB"}
@@ -0,0 +1,99 @@
1
+ import path from "node:path";
2
+ import { planPresetChecks, renderPlaywrightBrowserInstallCommand } from "./module-graph.js";
3
+ function rootCheckInstruction() {
4
+ return {
5
+ id: "run-root-check",
6
+ label: "Run Root Check",
7
+ kind: "command",
8
+ command: "pnpm",
9
+ args: ["run", "check"],
10
+ cwd: "",
11
+ display: "pnpm run check",
12
+ machineVerifiable: true,
13
+ };
14
+ }
15
+ function installDependenciesInstruction() {
16
+ return {
17
+ id: "install-dependencies",
18
+ label: "Install dependencies",
19
+ kind: "command",
20
+ command: "pnpm",
21
+ args: ["install"],
22
+ cwd: "",
23
+ display: "pnpm install",
24
+ machineVerifiable: true,
25
+ };
26
+ }
27
+ function fixInstruction() {
28
+ return {
29
+ id: "run-fix",
30
+ label: "Run Fix Command",
31
+ kind: "command",
32
+ command: "pnpm",
33
+ args: ["run", "fix"],
34
+ cwd: "",
35
+ display: "pnpm run fix",
36
+ machineVerifiable: true,
37
+ };
38
+ }
39
+ function checkEnvironmentInstructions(preset) {
40
+ const checkPlan = planPresetChecks(preset);
41
+ if (!checkPlan) {
42
+ return [];
43
+ }
44
+ return checkPlan.environmentNeeds.map((need) => {
45
+ const display = renderPlaywrightBrowserInstallCommand(need);
46
+ const [command, ...args] = display.split(" ");
47
+ return {
48
+ id: need.owner.path === "apps/web"
49
+ ? "install-web-playwright-browsers"
50
+ : "install-playwright-browsers",
51
+ label: need.owner.path === "apps/web"
52
+ ? "Install Playwright browser assets for web workspace"
53
+ : "Install Playwright browser assets",
54
+ kind: "command",
55
+ command,
56
+ args,
57
+ cwd: "",
58
+ display,
59
+ machineVerifiable: true,
60
+ };
61
+ });
62
+ }
63
+ function presetSpecificInstructions(preset) {
64
+ if (preset === "ts-lib" ||
65
+ preset === "hono-api" ||
66
+ preset === "vue-app" ||
67
+ preset === "vue-hono-app" ||
68
+ preset === "rust-bin") {
69
+ return [
70
+ installDependenciesInstruction(),
71
+ fixInstruction(),
72
+ ...checkEnvironmentInstructions(preset),
73
+ rootCheckInstruction(),
74
+ ];
75
+ }
76
+ return [installDependenciesInstruction(), rootCheckInstruction()];
77
+ }
78
+ export function planNextStepInstructions(options) {
79
+ const targetDir = path.resolve(options.targetDir);
80
+ const commandSteps = presetSpecificInstructions(options.preset).map((step) => ({
81
+ ...step,
82
+ cwd: targetDir,
83
+ }));
84
+ const navigationStep = {
85
+ id: "enter-project",
86
+ label: "Enter Generated Repository",
87
+ kind: "navigation",
88
+ command: "cd",
89
+ args: [targetDir],
90
+ cwd: ".",
91
+ display: `cd ${targetDir}`,
92
+ machineVerifiable: false,
93
+ };
94
+ return Object.freeze({
95
+ preset: options.preset,
96
+ targetDir,
97
+ steps: Object.freeze([navigationStep, ...commandSteps].map((step) => Object.freeze(step))),
98
+ });
99
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"package-addition.d.ts","sourceRoot":"","sources":["../src/package-addition.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAyoBF,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0C1E"}
1
+ {"version":3,"file":"package-addition.d.ts","sourceRoot":"","sources":["../src/package-addition.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAqnBF,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2C1E"}
@@ -71,7 +71,7 @@ function tsLibPackageJson(packageName) {
71
71
  typescript: "catalog:"
72
72
  },
73
73
  engines: {
74
- node: ">=22.0.0"
74
+ node: "22"
75
75
  }
76
76
  };
77
77
  }
@@ -108,24 +108,16 @@ function tsLibPackageOperations(packagePath, packageName) {
108
108
  }
109
109
  },
110
110
  {
111
- kind: "writeJson",
112
- to: `${packagePath}/.oxlintrc.json`,
113
- value: {
114
- categories: {
115
- correctness: "error",
116
- suspicious: "error"
117
- },
118
- plugins: ["typescript", "oxc"]
119
- }
111
+ kind: "copyFile",
112
+ sourceRoot: "sharedOxc",
113
+ from: "node/oxlint.config.ts",
114
+ to: `${packagePath}/oxlint.config.ts`
120
115
  },
121
116
  {
122
- kind: "writeJson",
123
- to: `${packagePath}/.oxfmtrc.json`,
124
- value: {
125
- printWidth: 100,
126
- singleQuote: false,
127
- trailingComma: "none"
128
- }
117
+ kind: "copyFile",
118
+ sourceRoot: "sharedOxc",
119
+ from: "oxfmt.config.ts",
120
+ to: `${packagePath}/oxfmt.config.ts`
129
121
  },
130
122
  {
131
123
  kind: "copyFile",
@@ -165,7 +157,7 @@ function honoApiPackageJson(packageName) {
165
157
  vitest: "catalog:"
166
158
  },
167
159
  engines: {
168
- node: ">=22.0.0"
160
+ node: "22"
169
161
  }
170
162
  };
171
163
  }
@@ -210,24 +202,16 @@ function honoApiPackageOperations(packagePath, packageName) {
210
202
  }
211
203
  },
212
204
  {
213
- kind: "writeJson",
214
- to: `${packagePath}/.oxlintrc.json`,
215
- value: {
216
- categories: {
217
- correctness: "error",
218
- suspicious: "error"
219
- },
220
- plugins: ["typescript", "oxc"]
221
- }
205
+ kind: "copyFile",
206
+ sourceRoot: "sharedOxc",
207
+ from: "node/oxlint.config.ts",
208
+ to: `${packagePath}/oxlint.config.ts`
222
209
  },
223
210
  {
224
- kind: "writeJson",
225
- to: `${packagePath}/.oxfmtrc.json`,
226
- value: {
227
- printWidth: 100,
228
- singleQuote: false,
229
- trailingComma: "none"
230
- }
211
+ kind: "copyFile",
212
+ sourceRoot: "sharedOxc",
213
+ from: "oxfmt.config.ts",
214
+ to: `${packagePath}/oxfmt.config.ts`
231
215
  },
232
216
  { kind: "copyFile", from: "src/app.ts", to: `${packagePath}/src/app.ts` },
233
217
  { kind: "copyFile", from: "src/server.ts", to: `${packagePath}/src/server.ts` },
@@ -276,7 +260,7 @@ function vueAppPackageJson(packageName) {
276
260
  "vue-tsc": "catalog:"
277
261
  },
278
262
  engines: {
279
- node: ">=22.0.0"
263
+ node: "22"
280
264
  }
281
265
  };
282
266
  }
@@ -351,24 +335,16 @@ function vueAppPackageOperations(packagePath, packageName) {
351
335
  }
352
336
  },
353
337
  {
354
- kind: "writeJson",
355
- to: `${packagePath}/.oxlintrc.json`,
356
- value: {
357
- categories: {
358
- correctness: "error",
359
- suspicious: "error"
360
- },
361
- plugins: ["typescript", "oxc", "vue"]
362
- }
338
+ kind: "copyFile",
339
+ sourceRoot: "sharedOxc",
340
+ from: "vue/oxlint.config.ts",
341
+ to: `${packagePath}/oxlint.config.ts`
363
342
  },
364
343
  {
365
- kind: "writeJson",
366
- to: `${packagePath}/.oxfmtrc.json`,
367
- value: {
368
- printWidth: 100,
369
- singleQuote: false,
370
- trailingComma: "none"
371
- }
344
+ kind: "copyFile",
345
+ sourceRoot: "sharedOxc",
346
+ from: "oxfmt.config.ts",
347
+ to: `${packagePath}/oxfmt.config.ts`
372
348
  },
373
349
  { kind: "copyFile", from: "env.d.ts", to: `${packagePath}/env.d.ts` },
374
350
  { kind: "copyFile", from: "index.html", to: `${packagePath}/index.html` },
@@ -417,6 +393,9 @@ function rootTsReferencesForPreset(preset, packagePath) {
417
393
  function templateSourceRoot(preset) {
418
394
  return path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "templates", preset);
419
395
  }
396
+ function sharedOxcSourceRoot() {
397
+ return path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "templates", "shared", "oxc");
398
+ }
420
399
  function localPortsFromText(text) {
421
400
  return [
422
401
  ...text.matchAll(/port:\s*(\d+)/g),
@@ -568,6 +547,7 @@ export async function addPackage(options) {
568
547
  await mkdir(path.join(root, packagePath), { recursive: true });
569
548
  await renderProject({
570
549
  sourceRoot: templateSourceRoot(options.preset),
550
+ sourceRoots: { sharedOxc: sharedOxcSourceRoot() },
571
551
  targetRoot: root,
572
552
  operations: packageOperationsForPreset(options.preset, packagePath, packageName)
573
553
  });
@@ -0,0 +1,36 @@
1
+ import type { PresetName } from "./declarations.js";
2
+ import { type CheckPlan } from "./module-graph.js";
3
+ export type CiCapability = {
4
+ readonly workflowName: "Check";
5
+ readonly jobName: "check";
6
+ readonly runner: "ubuntu-latest";
7
+ };
8
+ export type CiEnvironmentPreparation = {
9
+ readonly nodeFromPackageMetadata: boolean;
10
+ readonly rustToolchain: boolean;
11
+ };
12
+ export type PnpmTaskLayer = {
13
+ readonly installCommand: "pnpm install";
14
+ readonly checkCommand: "pnpm run check";
15
+ };
16
+ export type DependencyEcosystem = "npm" | "cargo" | "github-actions";
17
+ export type DependencyMaintenancePolicy = {
18
+ readonly ecosystems: DependencyEcosystem[];
19
+ readonly interval: "weekly";
20
+ };
21
+ type ProjectCheckWorkflowOptions = {
22
+ readonly checkPlan: CheckPlan;
23
+ readonly capability?: CiCapability;
24
+ readonly environmentPreparation?: Partial<CiEnvironmentPreparation>;
25
+ readonly taskLayer?: PnpmTaskLayer;
26
+ readonly rustToolchain?: boolean;
27
+ };
28
+ export declare function projectPresetGithubCheckWorkflow(preset: PresetName): string;
29
+ export declare function projectCheckWorkflow(options: ProjectCheckWorkflowOptions): string;
30
+ export declare function projectPresetDependencyMaintenancePolicy(preset: PresetName): DependencyMaintenancePolicy;
31
+ export declare function projectPresetDependabotConfig(preset: PresetName): string;
32
+ export declare function projectDependabotConfig(policy: DependencyMaintenancePolicy): string;
33
+ export declare function projectTsLibGithubCheckWorkflow(): string;
34
+ export declare function projectRustBinGithubCheckWorkflow(): string;
35
+ export {};
36
+ //# sourceMappingURL=project-github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-github.d.ts","sourceRoot":"","sources":["../src/project-github.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAEL,KAAK,SAAS,EAIf,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,OAAO,GAAG,gBAAgB,CAAC;AAErE,MAAM,MAAM,2BAA2B,GAAG;IACxC,QAAQ,CAAC,UAAU,EAAE,mBAAmB,EAAE,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B,CAAC;AAEF,KAAK,2BAA2B,GAAG;IACjC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC;IACnC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACpE,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC,CAAC;AAaF,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAW3E;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM,CAmDjF;AAED,wBAAgB,wCAAwC,CACtD,MAAM,EAAE,UAAU,GACjB,2BAA2B,CAa7B;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAExE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,2BAA2B,GAAG,MAAM,CAYnF;AAUD,wBAAgB,+BAA+B,IAAI,MAAM,CAExD;AAED,wBAAgB,iCAAiC,IAAI,MAAM,CAE1D"}
@@ -0,0 +1,96 @@
1
+ import { planNodeChecks, planPresetChecks, planRustBinChecks, } from "./module-graph.js";
2
+ const defaultCiCapability = {
3
+ workflowName: "Check",
4
+ jobName: "check",
5
+ runner: "ubuntu-latest",
6
+ };
7
+ const pnpmTaskLayer = {
8
+ installCommand: "pnpm install",
9
+ checkCommand: "pnpm run check",
10
+ };
11
+ export function projectPresetGithubCheckWorkflow(preset) {
12
+ const checkPlan = planPresetChecks(preset);
13
+ if (!checkPlan) {
14
+ throw new Error(`Unsupported preset for GitHub check workflow projection: ${preset}`);
15
+ }
16
+ return projectCheckWorkflow({
17
+ checkPlan,
18
+ rustToolchain: preset === "rust-bin",
19
+ });
20
+ }
21
+ export function projectCheckWorkflow(options) {
22
+ const capability = options.capability ?? defaultCiCapability;
23
+ const environmentPreparation = {
24
+ nodeFromPackageMetadata: true,
25
+ rustToolchain: options.rustToolchain ?? false,
26
+ ...options.environmentPreparation,
27
+ };
28
+ const taskLayer = options.taskLayer ?? pnpmTaskLayer;
29
+ const lines = [
30
+ `name: ${capability.workflowName}`,
31
+ "",
32
+ "on:",
33
+ " pull_request:",
34
+ " push:",
35
+ " branches:",
36
+ " - main",
37
+ "",
38
+ "jobs:",
39
+ ` ${capability.jobName}:`,
40
+ ` runs-on: ${capability.runner}`,
41
+ " steps:",
42
+ " - uses: actions/checkout@v6",
43
+ ];
44
+ if (environmentPreparation.nodeFromPackageMetadata) {
45
+ lines.push(" - uses: actions/setup-node@v6", " with:", " node-version-file: package.json", " - run: corepack enable");
46
+ }
47
+ if (environmentPreparation.rustToolchain) {
48
+ lines.push(" - uses: dtolnay/rust-toolchain@stable", " with:", " components: rustfmt, clippy", " - uses: Swatinem/rust-cache@v2");
49
+ }
50
+ lines.push(` - run: ${taskLayer.installCommand}`);
51
+ lines.push(...options.checkPlan.environmentNeeds.map((need) => ` - run: ${renderCiEnvironmentNeedCommand(need)}`));
52
+ lines.push(` - run: ${taskLayer.checkCommand}`, "");
53
+ return lines.join("\n");
54
+ }
55
+ export function projectPresetDependencyMaintenancePolicy(preset) {
56
+ switch (preset) {
57
+ case "ts-lib":
58
+ case "hono-api":
59
+ case "vue-app":
60
+ case "vue-hono-app":
61
+ return { ecosystems: ["npm", "github-actions"], interval: "weekly" };
62
+ case "rust-bin":
63
+ return { ecosystems: ["npm", "cargo", "github-actions"], interval: "weekly" };
64
+ case "ts-app":
65
+ case "node-cli":
66
+ throw new Error(`Unsupported preset for Dependency Maintenance Policy projection: ${preset}`);
67
+ }
68
+ }
69
+ export function projectPresetDependabotConfig(preset) {
70
+ return projectDependabotConfig(projectPresetDependencyMaintenancePolicy(preset));
71
+ }
72
+ export function projectDependabotConfig(policy) {
73
+ return [
74
+ "version: 2",
75
+ "updates:",
76
+ ...policy.ecosystems.flatMap((ecosystem) => [
77
+ ` - package-ecosystem: ${ecosystem}`,
78
+ " directory: /",
79
+ " schedule:",
80
+ ` interval: ${policy.interval}`,
81
+ ]),
82
+ "",
83
+ ].join("\n");
84
+ }
85
+ function renderCiEnvironmentNeedCommand(need) {
86
+ if (need.kind === "playwright-browser-assets" && need.owner.path === "apps/web") {
87
+ return `pnpm --filter ./apps/web exec playwright install --with-deps ${need.browser}`;
88
+ }
89
+ return `pnpm exec playwright install --with-deps ${need.browser}`;
90
+ }
91
+ export function projectTsLibGithubCheckWorkflow() {
92
+ return projectCheckWorkflow({ checkPlan: planNodeChecks("ts-lib") });
93
+ }
94
+ export function projectRustBinGithubCheckWorkflow() {
95
+ return projectCheckWorkflow({ checkPlan: planRustBinChecks(), rustToolchain: true });
96
+ }
@@ -3,6 +3,7 @@ export type CopyFileOperation = {
3
3
  kind: "copyFile";
4
4
  from: string;
5
5
  to: string;
6
+ sourceRoot?: string;
6
7
  };
7
8
  export type WriteJsonOperation = {
8
9
  kind: "writeJson";
@@ -34,6 +35,7 @@ export type ReplaceAnchorsOperation = {
34
35
  export type RenderOperation = CopyFileOperation | WriteJsonOperation | MergeJsonOperation | WriteTextOperation | SetExecutableOperation | ReplaceAnchorsOperation;
35
36
  export type RenderProjectOptions = {
36
37
  sourceRoot: string;
38
+ sourceRoots?: Record<string, string>;
37
39
  targetRoot: string;
38
40
  variables?: RenderVariables;
39
41
  operations: RenderOperation[];