mikuru 1.0.8 → 1.0.10

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/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.10
4
+
5
+ ### Added
6
+
7
+ - Added template discovery with `mikuru --list-templates`, `mikuru create --list-templates`, template descriptions, and `mikuru create -t <name>`.
8
+ - Added interactive `mikuru create` prompts for missing project name/template values, with `--yes` / `-y` defaulting for non-interactive runs.
9
+ - Added `mikuru create --dry-run` to preview the target, selected template, and generated files without writing them.
10
+ - Added generated app `npm run typecheck` scripts, template `tsconfig.json` files, and CSS module declarations.
11
+ - Added template version, generated app typecheck, docs smoke, and package smoke coverage for the create flow.
12
+
13
+ ### Changed
14
+
15
+ - Made generated project templates use the installed Mikuru package version instead of hard-coded release versions.
16
+ - Improved `mikuru create .` output so it does not print an unnecessary `cd .` next step.
17
+ - Split create-template metadata out of the CLI entrypoint to keep future CLI options easier to add.
18
+ - Clarified release checklist steps for pushing `master`, pushing tags, creating GitHub Releases, and deleting merged work branches.
19
+
20
+ ### Fixed
21
+
22
+ - Added friendlier unknown-template errors with typo suggestions such as `Did you mean starter?`.
23
+ - Removed the Windows npm pack smoke path that triggered Node's `DEP0190` shell warning.
24
+
25
+ ## 1.0.9
26
+
27
+ - Updated generated project templates to depend on Mikuru `^1.0.9`.
28
+
3
29
  ## 1.0.8
4
30
 
5
31
  - Added a realworld app architecture guide and split the realworld example into page, feature, API, store, UI, and test layers.
package/README.md CHANGED
@@ -17,6 +17,7 @@ The fastest way to try Mikuru is the package CLI:
17
17
  npx mikuru create my-app
18
18
  cd my-app
19
19
  npm install
20
+ npm run typecheck
20
21
  npm run dev
21
22
  ```
22
23
 
@@ -25,10 +26,26 @@ The generated starter includes Vite, TypeScript, the package-provided `.mikuru`
25
26
  Use the `basic` template when you want a small component composition example:
26
27
 
27
28
  ```sh
28
- npx mikuru create my-basic-app --template basic
29
+ npx mikuru create my-basic-app -t basic
30
+ ```
31
+
32
+ List available templates:
33
+
34
+ ```sh
35
+ npx mikuru --list-templates
36
+ starter - minimal Vite app
37
+ basic - component composition example
29
38
  ```
30
39
 
31
- `mikuru create` also accepts `--force` for non-empty directories and `--yes` / `-y` to use default answers for prompts.
40
+ Run a dry-run to preview the target, template, and files without writing them:
41
+
42
+ ```sh
43
+ npx mikuru create my-app -t basic --dry-run
44
+ ```
45
+
46
+ When run in a terminal, `mikuru create` asks for a project name and template if they are omitted. Use `--yes` / `-y` to skip interactive prompts and accept defaults. `mikuru create` also accepts `--force` for non-empty directories.
47
+
48
+ Generated apps include `npm run typecheck` for a quick TypeScript validation pass before running or building.
32
49
 
33
50
  ## Add Mikuru to a Vite App
34
51
 
@@ -153,7 +170,8 @@ The package also provides the `mikuru` binary:
153
170
 
154
171
  ```sh
155
172
  npx mikuru create my-app
156
- npx mikuru create my-basic-app --template basic
173
+ npx mikuru create my-basic-app -t basic
174
+ npx mikuru --list-templates
157
175
  ```
158
176
 
159
177
  ## Not Included in v1
@@ -0,0 +1 @@
1
+ export declare function handleCreateCommand(createArgs: string[], packageVersion: string): Promise<void>;
@@ -0,0 +1,263 @@
1
+ import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
2
+ import { basename, dirname, join, relative, resolve } from "node:path";
3
+ import { createInterface } from "node:readline/promises";
4
+ import { fileURLToPath } from "node:url";
5
+ import { availableTemplates, formatTemplateList, formatTemplatesForError, isTemplateName, suggestTemplateName, templateDescriptions } from "./templates.js";
6
+ export async function handleCreateCommand(createArgs, packageVersion) {
7
+ const createOptions = parseCreateArgs(createArgs);
8
+ if (!createOptions) {
9
+ process.exit(1);
10
+ }
11
+ const resolvedOptions = await resolveCreateOptions(createOptions);
12
+ const { dryRun, force, targetArg, templateName } = resolvedOptions;
13
+ const targetDir = resolve(process.cwd(), targetArg ?? "mikuru-app");
14
+ const appName = toPackageName(basename(targetDir));
15
+ const templateDir = resolve(dirname(fileURLToPath(import.meta.url)), `../../templates/${templateName}`);
16
+ if (!dryRun && !force && existsSync(targetDir) && readdirSync(targetDir).length > 0) {
17
+ console.error(`Cannot create a Mikuru app in a non-empty directory: ${targetDir}`);
18
+ console.error("Choose a new directory name, empty the target directory, or pass --force to overwrite template files.");
19
+ process.exit(1);
20
+ }
21
+ if (dryRun) {
22
+ printCreateDryRun(templateDir, targetDir, { appName, packageVersion, templateName });
23
+ process.exit(0);
24
+ }
25
+ copyTemplate(templateDir, targetDir, { appName, packageVersion });
26
+ printCreateSuccess(targetDir, appName, templateName);
27
+ }
28
+ function printCreateHelp() {
29
+ console.log(`Usage:
30
+ mikuru create [project-name] [--template starter|basic]
31
+
32
+ Options:
33
+ -t, --template <name> Template to use. Available: ${availableTemplates.join(", ")}.
34
+ --list-templates List available create templates with descriptions.
35
+ --dry-run Print the target, template, and files without writing them.
36
+ --force Create into a non-empty directory and overwrite template files.
37
+ -y, --yes Use default answers and skip interactive prompts.
38
+ -h, --help Show create help.`);
39
+ }
40
+ function printTemplates() {
41
+ console.log(formatTemplateList());
42
+ }
43
+ function printTemplateNextStep(templateName) {
44
+ if (templateName === "basic") {
45
+ console.log(" edit src/App.mikuru and src/MoodBadge.mikuru");
46
+ return;
47
+ }
48
+ console.log(" edit src/App.mikuru");
49
+ }
50
+ function parseCreateArgs(createArgs) {
51
+ let dryRun = false;
52
+ let force = false;
53
+ let targetArg;
54
+ let templateName = "starter";
55
+ let templateProvided = false;
56
+ let yes = false;
57
+ for (let i = 0; i < createArgs.length; i++) {
58
+ const arg = createArgs[i];
59
+ if (arg === "--help" || arg === "-h") {
60
+ printCreateHelp();
61
+ process.exit(0);
62
+ }
63
+ if (arg === "--force") {
64
+ force = true;
65
+ continue;
66
+ }
67
+ if (arg === "--dry-run") {
68
+ dryRun = true;
69
+ continue;
70
+ }
71
+ if (arg === "--yes" || arg === "-y") {
72
+ yes = true;
73
+ continue;
74
+ }
75
+ if (arg === "--list-templates") {
76
+ printTemplates();
77
+ process.exit(0);
78
+ }
79
+ if (arg === "--template" || arg === "-t") {
80
+ const nextValue = createArgs[++i];
81
+ if (!nextValue) {
82
+ console.error(`Missing value for ${arg}.`);
83
+ printCreateHelp();
84
+ return undefined;
85
+ }
86
+ templateName = nextValue;
87
+ templateProvided = true;
88
+ continue;
89
+ }
90
+ if (arg.startsWith("--template=")) {
91
+ templateName = arg.slice("--template=".length);
92
+ templateProvided = true;
93
+ continue;
94
+ }
95
+ if (arg.startsWith("-")) {
96
+ console.error(`Unknown create option: ${arg}`);
97
+ printCreateHelp();
98
+ return undefined;
99
+ }
100
+ if (targetArg) {
101
+ console.error(`Unexpected extra argument: ${arg}`);
102
+ printCreateHelp();
103
+ return undefined;
104
+ }
105
+ targetArg = arg;
106
+ }
107
+ if (!isTemplateName(templateName)) {
108
+ console.error(`Unknown template: ${templateName}`);
109
+ const suggestion = suggestTemplateName(templateName);
110
+ if (suggestion) {
111
+ console.error(`Did you mean ${suggestion}?`);
112
+ }
113
+ console.error("Available templates:");
114
+ console.error(formatTemplatesForError());
115
+ console.error("Run `mikuru create --list-templates` to see template descriptions.");
116
+ return undefined;
117
+ }
118
+ return { dryRun, force, targetArg, templateName, templateProvided, yes };
119
+ }
120
+ async function resolveCreateOptions(options) {
121
+ if (options.yes || !canPrompt()) {
122
+ return options;
123
+ }
124
+ if (process.env.MIKURU_TEST_FORCE_PROMPTS === "1") {
125
+ return resolveCreateOptionsFromInput(options, readFileSync(0, "utf8").split(/\r?\n/));
126
+ }
127
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
128
+ try {
129
+ let targetArg = options.targetArg;
130
+ let templateName = options.templateName;
131
+ let templateProvided = options.templateProvided;
132
+ if (!targetArg) {
133
+ const answer = (await rl.question("Project name (mikuru-app): ")).trim();
134
+ targetArg = answer || "mikuru-app";
135
+ }
136
+ if (!templateProvided) {
137
+ printTemplates();
138
+ const answer = (await rl.question("Template (starter): ")).trim();
139
+ if (answer) {
140
+ const suggestion = isTemplateName(answer) ? undefined : suggestTemplateName(answer);
141
+ if (!isTemplateName(answer)) {
142
+ console.error(`Unknown template: ${answer}`);
143
+ if (suggestion) {
144
+ console.error(`Did you mean ${suggestion}?`);
145
+ }
146
+ console.error("Available templates:");
147
+ console.error(formatTemplatesForError());
148
+ process.exit(1);
149
+ }
150
+ templateName = answer;
151
+ templateProvided = true;
152
+ }
153
+ }
154
+ return { ...options, targetArg, templateName, templateProvided };
155
+ }
156
+ finally {
157
+ rl.close();
158
+ }
159
+ }
160
+ function resolveCreateOptionsFromInput(options, answers) {
161
+ let targetArg = options.targetArg;
162
+ let templateName = options.templateName;
163
+ let templateProvided = options.templateProvided;
164
+ if (!targetArg) {
165
+ process.stdout.write("Project name (mikuru-app): ");
166
+ targetArg = answers.shift()?.trim() || "mikuru-app";
167
+ }
168
+ if (!templateProvided) {
169
+ printTemplates();
170
+ process.stdout.write("Template (starter): ");
171
+ const answer = answers.shift()?.trim();
172
+ if (answer) {
173
+ if (!isTemplateName(answer)) {
174
+ console.error(`Unknown template: ${answer}`);
175
+ const suggestion = suggestTemplateName(answer);
176
+ if (suggestion) {
177
+ console.error(`Did you mean ${suggestion}?`);
178
+ }
179
+ console.error("Available templates:");
180
+ console.error(formatTemplatesForError());
181
+ process.exit(1);
182
+ }
183
+ templateName = answer;
184
+ templateProvided = true;
185
+ }
186
+ }
187
+ return { ...options, targetArg, templateName, templateProvided };
188
+ }
189
+ function canPrompt() {
190
+ return process.env.MIKURU_TEST_FORCE_PROMPTS === "1" || Boolean(process.stdin.isTTY && process.stdout.isTTY);
191
+ }
192
+ function printCreateSuccess(targetDir, appName, templateName) {
193
+ console.log(`Created ${appName}`);
194
+ console.log(` Template: ${templateName}`);
195
+ console.log(` Location: ${targetDir}`);
196
+ console.log("");
197
+ console.log("Next steps:");
198
+ const relativeTargetDir = relative(process.cwd(), targetDir);
199
+ if (relativeTargetDir && relativeTargetDir !== ".") {
200
+ console.log(` cd ${relativeTargetDir}`);
201
+ }
202
+ console.log(" npm install");
203
+ console.log(" npm run dev");
204
+ printTemplateNextStep(templateName);
205
+ }
206
+ function printCreateDryRun(templateDir, targetDir, variables) {
207
+ console.log("Dry run: no files will be written.");
208
+ console.log(` App name: ${variables.appName}`);
209
+ console.log(` Template: ${variables.templateName} - ${templateDescriptions[variables.templateName]}`);
210
+ console.log(` Location: ${targetDir}`);
211
+ console.log("");
212
+ console.log("Files:");
213
+ for (const filePath of listTemplateFiles(templateDir, targetDir)) {
214
+ console.log(` ${relative(process.cwd(), filePath)}`);
215
+ }
216
+ }
217
+ function listTemplateFiles(sourceDir, targetDir) {
218
+ const files = [];
219
+ for (const entry of readdirSync(sourceDir)) {
220
+ const sourcePath = join(sourceDir, entry);
221
+ const targetName = entry === "_gitignore" ? ".gitignore" : entry;
222
+ const targetPath = join(targetDir, targetName);
223
+ const stat = statSync(sourcePath);
224
+ if (stat.isDirectory()) {
225
+ files.push(...listTemplateFiles(sourcePath, targetPath));
226
+ continue;
227
+ }
228
+ files.push(targetPath);
229
+ }
230
+ return files;
231
+ }
232
+ function copyTemplate(sourceDir, targetDir, variables) {
233
+ mkdirSync(targetDir, { recursive: true });
234
+ for (const entry of readdirSync(sourceDir)) {
235
+ const sourcePath = join(sourceDir, entry);
236
+ const targetName = entry === "_gitignore" ? ".gitignore" : entry;
237
+ const targetPath = join(targetDir, targetName);
238
+ const stat = statSync(sourcePath);
239
+ if (stat.isDirectory()) {
240
+ copyTemplate(sourcePath, targetPath, variables);
241
+ continue;
242
+ }
243
+ if (isTextTemplate(sourcePath)) {
244
+ const content = readFileSync(sourcePath, "utf8")
245
+ .replaceAll("__MIKURU_APP_NAME__", variables.appName)
246
+ .replaceAll("__MIKURU_VERSION__", variables.packageVersion);
247
+ writeFileSync(targetPath, content);
248
+ continue;
249
+ }
250
+ copyFileSync(sourcePath, targetPath);
251
+ }
252
+ }
253
+ function isTextTemplate(path) {
254
+ return /\.(css|html|json|mikuru|svg|ts)$/.test(path) || path.endsWith("_gitignore");
255
+ }
256
+ function toPackageName(value) {
257
+ return value
258
+ .trim()
259
+ .toLowerCase()
260
+ .replace(/[^a-z0-9._-]+/g, "-")
261
+ .replace(/^-+|-+$/g, "") || "mikuru-app";
262
+ }
263
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/cli/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const availableTemplates: readonly ["starter", "basic"];
2
+ export type TemplateName = (typeof availableTemplates)[number];
3
+ export declare const templateDescriptions: Record<TemplateName, string>;
4
+ export declare function formatTemplateList(): string;
5
+ export declare function formatTemplatesForError(): string;
6
+ export declare function isTemplateName(value: string): value is TemplateName;
7
+ export declare function suggestTemplateName(value: string): TemplateName | undefined;
@@ -0,0 +1,40 @@
1
+ export const availableTemplates = ["starter", "basic"];
2
+ export const templateDescriptions = {
3
+ starter: "minimal Vite app",
4
+ basic: "component composition example"
5
+ };
6
+ export function formatTemplateList() {
7
+ return availableTemplates.map((name) => `${name} - ${templateDescriptions[name]}`).join("\n");
8
+ }
9
+ export function formatTemplatesForError() {
10
+ return availableTemplates.map((name) => ` ${name} - ${templateDescriptions[name]}`).join("\n");
11
+ }
12
+ export function isTemplateName(value) {
13
+ return availableTemplates.includes(value);
14
+ }
15
+ export function suggestTemplateName(value) {
16
+ let bestName;
17
+ let bestDistance = Number.POSITIVE_INFINITY;
18
+ for (const templateName of availableTemplates) {
19
+ const distance = levenshtein(value, templateName);
20
+ if (distance < bestDistance) {
21
+ bestDistance = distance;
22
+ bestName = templateName;
23
+ }
24
+ }
25
+ return bestDistance <= 2 ? bestName : undefined;
26
+ }
27
+ function levenshtein(left, right) {
28
+ const previous = Array.from({ length: right.length + 1 }, (_, index) => index);
29
+ const current = Array.from({ length: right.length + 1 }, () => 0);
30
+ for (let leftIndex = 1; leftIndex <= left.length; leftIndex++) {
31
+ current[0] = leftIndex;
32
+ for (let rightIndex = 1; rightIndex <= right.length; rightIndex++) {
33
+ const cost = left[leftIndex - 1] === right[rightIndex - 1] ? 0 : 1;
34
+ current[rightIndex] = Math.min(current[rightIndex - 1] + 1, previous[rightIndex] + 1, previous[rightIndex - 1] + cost);
35
+ }
36
+ previous.splice(0, previous.length, ...current);
37
+ }
38
+ return previous[right.length];
39
+ }
40
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/cli/templates.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,OAAO,CAAU,CAAC;AAIhE,MAAM,CAAC,MAAM,oBAAoB,GAAiC;IAChE,OAAO,EAAE,kBAAkB;IAC3B,KAAK,EAAE,+BAA+B;CACvC,CAAC;AAEF,MAAM,UAAU,kBAAkB;IAChC,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,MAAM,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,MAAM,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClG,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAQ,kBAAwC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,IAAI,QAAkC,CAAC;IACvC,IAAI,YAAY,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAE5C,KAAK,MAAM,YAAY,IAAI,kBAAkB,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAClD,IAAI,QAAQ,GAAG,YAAY,EAAE,CAAC;YAC5B,YAAY,GAAG,QAAQ,CAAC;YACxB,QAAQ,GAAG,YAAY,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa;IAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;IAC/E,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAElE,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;QAC9D,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACvB,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,IAAI,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC;YAClE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,GAAG,CAC5B,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,EAC3B,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EACxB,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,IAAI,CAChC,CAAC;QACJ,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC"}
package/dist/cli.js CHANGED
@@ -1,151 +1,46 @@
1
1
  #!/usr/bin/env node
2
- import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
3
- import { basename, dirname, join, resolve } from "node:path";
2
+ import { readFileSync } from "node:fs";
3
+ import { dirname, resolve } from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
- const availableTemplates = ["starter", "basic"];
6
- const args = process.argv.slice(2);
7
- const command = args[0];
8
- if (command === "--help" || command === "-h" || !command) {
9
- printHelp();
10
- process.exit(0);
11
- }
12
- if (command === "--version" || command === "-v") {
13
- console.log(readPackageVersion());
14
- process.exit(0);
15
- }
16
- if (command !== "create") {
17
- console.error(`Unknown command: ${command}`);
18
- printHelp();
19
- process.exit(1);
20
- }
21
- const createOptions = parseCreateArgs(args.slice(1));
22
- if (!createOptions) {
23
- process.exit(1);
24
- }
25
- const { force, targetArg, templateName } = createOptions;
26
- const targetDir = resolve(process.cwd(), targetArg ?? "mikuru-app");
27
- const appName = toPackageName(basename(targetDir));
28
- if (!force && existsSync(targetDir) && readdirSync(targetDir).length > 0) {
29
- console.error(`Cannot create a Mikuru app in a non-empty directory: ${targetDir}`);
30
- console.error("Choose a new directory name, empty the target directory, or pass --force to overwrite template files.");
31
- process.exit(1);
5
+ import { handleCreateCommand } from "./cli/create.js";
6
+ import { formatTemplateList } from "./cli/templates.js";
7
+ await main();
8
+ async function main() {
9
+ const args = process.argv.slice(2);
10
+ const command = args[0];
11
+ if (command === "--help" || command === "-h" || !command) {
12
+ printHelp();
13
+ process.exit(0);
14
+ }
15
+ if (command === "--version" || command === "-v") {
16
+ console.log(readPackageVersion());
17
+ process.exit(0);
18
+ }
19
+ if (command === "--list-templates") {
20
+ console.log(formatTemplateList());
21
+ process.exit(0);
22
+ }
23
+ if (command !== "create") {
24
+ console.error(`Unknown command: ${command}`);
25
+ printHelp();
26
+ process.exit(1);
27
+ }
28
+ await handleCreateCommand(args.slice(1), readPackageVersion());
32
29
  }
33
- const templateDir = resolve(dirname(fileURLToPath(import.meta.url)), `../templates/${templateName}`);
34
- copyTemplate(templateDir, targetDir, { appName });
35
- console.log(`Created ${appName}`);
36
- console.log(` Template: ${templateName}`);
37
- console.log(` Location: ${targetDir}`);
38
- console.log("");
39
- console.log("Next steps:");
40
- console.log(` cd ${basename(targetDir)}`);
41
- console.log(" npm install");
42
- console.log(" npm run dev");
43
30
  function printHelp() {
44
31
  console.log(`Usage:
45
32
  mikuru create [project-name] [--template starter|basic]
46
33
  mikuru --version
47
34
  mikuru --help
35
+ mikuru --list-templates
48
36
 
49
37
  Commands:
50
38
  create Create a new Mikuru app.
51
39
 
52
40
  Options:
53
- -h, --help Show help.
54
- -v, --version Show the installed Mikuru version.`);
55
- }
56
- function printCreateHelp() {
57
- console.log(`Usage:
58
- mikuru create [project-name] [--template starter|basic]
59
-
60
- Options:
61
- --template <name> Template to use. Available: ${availableTemplates.join(", ")}.
62
- --force Create into a non-empty directory and overwrite template files.
63
- -y, --yes Use default answers for prompts. Currently accepted for future compatibility.
64
- -h, --help Show create help.`);
65
- }
66
- function parseCreateArgs(createArgs) {
67
- let force = false;
68
- let targetArg;
69
- let templateName = "starter";
70
- let yes = false;
71
- for (let i = 0; i < createArgs.length; i++) {
72
- const arg = createArgs[i];
73
- if (arg === "--help" || arg === "-h") {
74
- printCreateHelp();
75
- process.exit(0);
76
- }
77
- if (arg === "--force") {
78
- force = true;
79
- continue;
80
- }
81
- if (arg === "--yes" || arg === "-y") {
82
- yes = true;
83
- continue;
84
- }
85
- if (arg === "--template") {
86
- const nextValue = createArgs[++i];
87
- if (!nextValue) {
88
- console.error("Missing value for --template.");
89
- printCreateHelp();
90
- return undefined;
91
- }
92
- templateName = nextValue;
93
- continue;
94
- }
95
- if (arg.startsWith("--template=")) {
96
- templateName = arg.slice("--template=".length);
97
- continue;
98
- }
99
- if (arg.startsWith("-")) {
100
- console.error(`Unknown create option: ${arg}`);
101
- printCreateHelp();
102
- return undefined;
103
- }
104
- if (targetArg) {
105
- console.error(`Unexpected extra argument: ${arg}`);
106
- printCreateHelp();
107
- return undefined;
108
- }
109
- targetArg = arg;
110
- }
111
- if (!isTemplateName(templateName)) {
112
- console.error(`Unknown template: ${templateName}`);
113
- console.error(`Available templates: ${availableTemplates.join(", ")}`);
114
- return undefined;
115
- }
116
- return { force, targetArg, templateName, yes };
117
- }
118
- function isTemplateName(value) {
119
- return availableTemplates.includes(value);
120
- }
121
- function copyTemplate(sourceDir, targetDir, variables) {
122
- mkdirSync(targetDir, { recursive: true });
123
- for (const entry of readdirSync(sourceDir)) {
124
- const sourcePath = join(sourceDir, entry);
125
- const targetName = entry === "_gitignore" ? ".gitignore" : entry;
126
- const targetPath = join(targetDir, targetName);
127
- const stat = statSync(sourcePath);
128
- if (stat.isDirectory()) {
129
- copyTemplate(sourcePath, targetPath, variables);
130
- continue;
131
- }
132
- if (isTextTemplate(sourcePath)) {
133
- const content = readFileSync(sourcePath, "utf8").replaceAll("__MIKURU_APP_NAME__", variables.appName);
134
- writeFileSync(targetPath, content);
135
- continue;
136
- }
137
- copyFileSync(sourcePath, targetPath);
138
- }
139
- }
140
- function isTextTemplate(path) {
141
- return /\.(css|html|json|mikuru|svg|ts)$/.test(path) || path.endsWith("_gitignore");
142
- }
143
- function toPackageName(value) {
144
- return value
145
- .trim()
146
- .toLowerCase()
147
- .replace(/[^a-z0-9._-]+/g, "-")
148
- .replace(/^-+|-+$/g, "") || "mikuru-app";
41
+ -h, --help Show help.
42
+ -v, --version Show the installed Mikuru version.
43
+ --list-templates List available create templates with descriptions.`);
149
44
  }
150
45
  function readPackageVersion() {
151
46
  const packageJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), "../package.json");
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,IAAI,EAAE,CAAC;AAEb,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACzD,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,KAAK,kBAAkB,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QAC7C,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;yEAY2D,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAC5F,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAyB,CAAC;IAC9F,OAAO,WAAW,CAAC,OAAO,IAAI,OAAO,CAAC;AACxC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mikuru",
3
- "version": "1.0.8",
3
+ "version": "1.0.10",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "A compile-first JavaScript framework with Vue-like authoring and Svelte-like generated DOM updates.",
@@ -54,7 +54,7 @@
54
54
  "build:realworld": "vite build --config examples/realworld/vite.config.ts",
55
55
  "build:mikuru-sample": "vite build --config examples/mikuru-sample/vite.config.ts",
56
56
  "build:mikuru-vue-like": "vite build --config examples/mikuru-vue-like/vite.config.ts",
57
- "ci": "npm run typecheck && npm test && npm run build && npm run test:create && npm run build:basic && npm run build:realworld && npm run build:dogfood && npm run test:package && npm run test:pack && npm run test:e2e && npm run test:e2e:dogfood",
57
+ "ci": "npm run typecheck && npm test && npm run test:templates && npm run test:docs && npm run build && npm run test:create && npm run build:basic && npm run build:realworld && npm run build:dogfood && npm run test:package && npm run test:pack && npm run test:e2e && npm run test:e2e:dogfood",
58
58
  "dev:basic": "vite --config examples/basic/vite.config.ts",
59
59
  "dev:dogfood": "vite --config examples/dogfood/vite.config.ts",
60
60
  "dev:realworld": "vite --config examples/realworld/vite.config.ts",
@@ -64,8 +64,10 @@
64
64
  "test:e2e": "playwright test",
65
65
  "test:e2e:dogfood": "playwright test --config playwright.dogfood.config.ts",
66
66
  "test:create": "node tests/create-cli-smoke.mjs",
67
+ "test:docs": "node tests/docs-smoke.mjs",
67
68
  "test:pack": "node tests/npm-pack-smoke.mjs",
68
69
  "test:package": "node tests/package-usage.mjs",
70
+ "test:templates": "node tests/template-version-smoke.mjs",
69
71
  "typecheck": "tsc -p tsconfig.json --noEmit"
70
72
  },
71
73
  "keywords": [
@@ -3,13 +3,14 @@
3
3
  "private": true,
4
4
  "version": "0.0.0",
5
5
  "type": "module",
6
- "scripts": {
7
- "dev": "vite",
8
- "build": "vite build",
9
- "preview": "vite preview"
10
- },
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "preview": "vite preview",
10
+ "typecheck": "tsc --noEmit"
11
+ },
11
12
  "dependencies": {
12
- "mikuru": "^1.0.6"
13
+ "mikuru": "^__MIKURU_VERSION__"
13
14
  },
14
15
  "devDependencies": {
15
16
  "typescript": "^6.0.3",
@@ -0,0 +1 @@
1
+ declare module "*.css";
@@ -1 +1 @@
1
- import "mikuru/env";
1
+ import "mikuru/env";
@@ -0,0 +1,11 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
7
+ "strict": true,
8
+ "skipLibCheck": true
9
+ },
10
+ "include": ["src/**/*.ts", "src/**/*.d.ts"]
11
+ }
@@ -6,10 +6,11 @@
6
6
  "scripts": {
7
7
  "dev": "vite",
8
8
  "build": "vite build",
9
- "preview": "vite preview"
9
+ "preview": "vite preview",
10
+ "typecheck": "tsc --noEmit"
10
11
  },
11
12
  "dependencies": {
12
- "mikuru": "^1.0.6"
13
+ "mikuru": "^__MIKURU_VERSION__"
13
14
  },
14
15
  "devDependencies": {
15
16
  "typescript": "^6.0.3",
@@ -0,0 +1 @@
1
+ declare module "*.css";
@@ -0,0 +1,11 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
7
+ "strict": true,
8
+ "skipLibCheck": true
9
+ },
10
+ "include": ["src/**/*.ts", "src/**/*.d.ts"]
11
+ }