create-glion 0.2.0 → 0.26.0
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/index.js +22 -18
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -70,6 +70,27 @@ function extractPickerFlag(args) {
|
|
|
70
70
|
wantsPicker
|
|
71
71
|
};
|
|
72
72
|
}
|
|
73
|
+
async function chooseExample(requested, wantsPicker) {
|
|
74
|
+
if (requested !== void 0) {
|
|
75
|
+
if (!isExampleId(requested)) {
|
|
76
|
+
p.cancel(`Unknown example: ${requested}. Available: ${EXAMPLES.map((e) => e.value).join(", ")}`);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
return requested;
|
|
80
|
+
}
|
|
81
|
+
if (!wantsPicker) return DEFAULT_EXAMPLE;
|
|
82
|
+
const choice = await p.select({
|
|
83
|
+
initialValue: DEFAULT_EXAMPLE,
|
|
84
|
+
message: "Choose an example",
|
|
85
|
+
options: EXAMPLES.map((e) => ({
|
|
86
|
+
hint: e.hint,
|
|
87
|
+
label: e.label,
|
|
88
|
+
value: e.value
|
|
89
|
+
}))
|
|
90
|
+
});
|
|
91
|
+
if (p.isCancel(choice)) abort();
|
|
92
|
+
return choice;
|
|
93
|
+
}
|
|
73
94
|
async function run() {
|
|
74
95
|
const { args: cleanArgs, wantsPicker } = extractPickerFlag(process.argv.slice(2));
|
|
75
96
|
const { values, positionals } = parseArgs({
|
|
@@ -109,24 +130,7 @@ async function run() {
|
|
|
109
130
|
});
|
|
110
131
|
if (p.isCancel(proceed) || !proceed) abort();
|
|
111
132
|
}
|
|
112
|
-
|
|
113
|
-
if (example && !isExampleId(example)) {
|
|
114
|
-
p.cancel(`Unknown example: ${example}. Available: ${EXAMPLES.map((e) => e.value).join(", ")}`);
|
|
115
|
-
process.exit(1);
|
|
116
|
-
}
|
|
117
|
-
if (!example) if (wantsPicker) {
|
|
118
|
-
const choice = await p.select({
|
|
119
|
-
initialValue: DEFAULT_EXAMPLE,
|
|
120
|
-
message: "Choose an example",
|
|
121
|
-
options: EXAMPLES.map((e) => ({
|
|
122
|
-
hint: e.hint,
|
|
123
|
-
label: e.label,
|
|
124
|
-
value: e.value
|
|
125
|
-
}))
|
|
126
|
-
});
|
|
127
|
-
if (p.isCancel(choice)) abort();
|
|
128
|
-
example = choice;
|
|
129
|
-
} else example = DEFAULT_EXAMPLE;
|
|
133
|
+
const example = await chooseExample(values.example, wantsPicker);
|
|
130
134
|
const spinner = p.spinner();
|
|
131
135
|
spinner.start(`Downloading example: ${example}`);
|
|
132
136
|
await downloadTemplate(`${REPO}/examples/${example}`, {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { parseArgs } from \"node:util\";\n\nimport * as p from \"@clack/prompts\";\nimport { downloadTemplate } from \"giget\";\n\nconst REPO = \"github:rethinkhealth/glion\";\nconst DEFAULT_DIR = \"./my-glion-app\";\nconst DEFAULT_EXAMPLE = \"starter\";\n\nconst EXAMPLES = [\n {\n hint: \"Starter Glion — minimal HL7v2 MLLP server (default)\",\n label: \"starter\",\n value: \"starter\",\n },\n {\n hint: \"HL7v2 MLLP server with route handlers (Node.js)\",\n label: \"mllp-server\",\n value: \"mllp-server\",\n },\n {\n hint: \"HL7v2 MLLP server with route handlers (Bun)\",\n label: \"mllp-server-bun\",\n value: \"mllp-server-bun\",\n },\n] as const;\n\ntype ExampleId = (typeof EXAMPLES)[number][\"value\"];\n\nconst HELP = `Usage: create-glion [dir] [--example [name]]\n\nOptions:\n -e, --example [name] Example to clone from examples/. Pass a name to use it\n directly, or pass the flag with no value to open the\n interactive picker. Omit entirely to use the default\n (${DEFAULT_EXAMPLE}).\n -h, --help Show this message\n\nExamples:\n${EXAMPLES.map((e) => ` ${e.value.padEnd(18)} ${e.hint}`).join(\"\\n\")}\n`;\n\nfunction isExampleId(value: string): value is ExampleId {\n return EXAMPLES.some((e) => e.value === value);\n}\n\nfunction abort(message = \"Aborted.\"): never {\n p.cancel(message);\n process.exit(0);\n}\n\n// Detect bare `--example` / `-e` (no value) and `--example=` / `-e=` and strip\n// them from argv so that parseArgs (which requires a value for string options)\n// does not error. The bare form opts into the interactive picker.\nfunction extractPickerFlag(args: string[]): {\n args: string[];\n wantsPicker: boolean;\n} {\n const out: string[] = [];\n let wantsPicker = false;\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === undefined) {\n continue;\n }\n if (arg === \"--example\" || arg === \"-e\") {\n const next = args[i + 1];\n if (next === undefined || next.startsWith(\"-\")) {\n wantsPicker = true;\n continue;\n }\n out.push(arg);\n continue;\n }\n if (arg === \"--example=\" || arg === \"-e=\") {\n wantsPicker = true;\n continue;\n }\n out.push(arg);\n }\n return { args: out, wantsPicker };\n}\n\nasync function run(): Promise<void> {\n const { args: cleanArgs, wantsPicker } = extractPickerFlag(\n process.argv.slice(2)\n );\n const { values, positionals } = parseArgs({\n allowPositionals: true,\n args: cleanArgs,\n options: {\n example: { short: \"e\", type: \"string\" },\n help: { short: \"h\", type: \"boolean\" },\n },\n });\n\n if (values.help) {\n process.stdout.write(`${HELP}\\n`);\n return;\n }\n\n p.intro(\"create-glion\");\n\n let dir = positionals[0];\n if (!dir) {\n const answer = await p.text({\n defaultValue: DEFAULT_DIR,\n message: \"Where should we scaffold your project?\",\n placeholder: DEFAULT_DIR,\n });\n if (p.isCancel(answer)) {\n abort();\n }\n dir = answer.trim().length === 0 ? DEFAULT_DIR : answer;\n }\n\n const target = resolve(process.cwd(), dir);\n\n if (existsSync(target)) {\n const proceed = await p.confirm({\n initialValue: false,\n message: `${target} already exists. Continue and overwrite?`,\n });\n if (p.isCancel(proceed) || !proceed) {\n abort();\n }\n }\n\n
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { parseArgs } from \"node:util\";\n\nimport * as p from \"@clack/prompts\";\nimport { downloadTemplate } from \"giget\";\n\nconst REPO = \"github:rethinkhealth/glion\";\nconst DEFAULT_DIR = \"./my-glion-app\";\nconst DEFAULT_EXAMPLE = \"starter\";\n\nconst EXAMPLES = [\n {\n hint: \"Starter Glion — minimal HL7v2 MLLP server (default)\",\n label: \"starter\",\n value: \"starter\",\n },\n {\n hint: \"HL7v2 MLLP server with route handlers (Node.js)\",\n label: \"mllp-server\",\n value: \"mllp-server\",\n },\n {\n hint: \"HL7v2 MLLP server with route handlers (Bun)\",\n label: \"mllp-server-bun\",\n value: \"mllp-server-bun\",\n },\n] as const;\n\ntype ExampleId = (typeof EXAMPLES)[number][\"value\"];\n\nconst HELP = `Usage: create-glion [dir] [--example [name]]\n\nOptions:\n -e, --example [name] Example to clone from examples/. Pass a name to use it\n directly, or pass the flag with no value to open the\n interactive picker. Omit entirely to use the default\n (${DEFAULT_EXAMPLE}).\n -h, --help Show this message\n\nExamples:\n${EXAMPLES.map((e) => ` ${e.value.padEnd(18)} ${e.hint}`).join(\"\\n\")}\n`;\n\nfunction isExampleId(value: string): value is ExampleId {\n return EXAMPLES.some((e) => e.value === value);\n}\n\nfunction abort(message = \"Aborted.\"): never {\n p.cancel(message);\n process.exit(0);\n}\n\n// Detect bare `--example` / `-e` (no value) and `--example=` / `-e=` and strip\n// them from argv so that parseArgs (which requires a value for string options)\n// does not error. The bare form opts into the interactive picker.\nfunction extractPickerFlag(args: string[]): {\n args: string[];\n wantsPicker: boolean;\n} {\n const out: string[] = [];\n let wantsPicker = false;\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === undefined) {\n continue;\n }\n if (arg === \"--example\" || arg === \"-e\") {\n const next = args[i + 1];\n if (next === undefined || next.startsWith(\"-\")) {\n wantsPicker = true;\n continue;\n }\n out.push(arg);\n continue;\n }\n if (arg === \"--example=\" || arg === \"-e=\") {\n wantsPicker = true;\n continue;\n }\n out.push(arg);\n }\n return { args: out, wantsPicker };\n}\n\nasync function chooseExample(\n requested: string | undefined,\n wantsPicker: boolean\n): Promise<ExampleId> {\n if (requested !== undefined) {\n if (!isExampleId(requested)) {\n p.cancel(\n `Unknown example: ${requested}. Available: ${EXAMPLES.map((e) => e.value).join(\", \")}`\n );\n process.exit(1);\n }\n return requested;\n }\n if (!wantsPicker) {\n return DEFAULT_EXAMPLE;\n }\n const choice = await p.select<ExampleId>({\n initialValue: DEFAULT_EXAMPLE,\n message: \"Choose an example\",\n options: EXAMPLES.map((e) => ({\n hint: e.hint,\n label: e.label,\n value: e.value,\n })),\n });\n if (p.isCancel(choice)) {\n abort();\n }\n return choice;\n}\n\nasync function run(): Promise<void> {\n const { args: cleanArgs, wantsPicker } = extractPickerFlag(\n process.argv.slice(2)\n );\n const { values, positionals } = parseArgs({\n allowPositionals: true,\n args: cleanArgs,\n options: {\n example: { short: \"e\", type: \"string\" },\n help: { short: \"h\", type: \"boolean\" },\n },\n });\n\n if (values.help) {\n process.stdout.write(`${HELP}\\n`);\n return;\n }\n\n p.intro(\"create-glion\");\n\n let dir = positionals[0];\n if (!dir) {\n const answer = await p.text({\n defaultValue: DEFAULT_DIR,\n message: \"Where should we scaffold your project?\",\n placeholder: DEFAULT_DIR,\n });\n if (p.isCancel(answer)) {\n abort();\n }\n dir = answer.trim().length === 0 ? DEFAULT_DIR : answer;\n }\n\n const target = resolve(process.cwd(), dir);\n\n if (existsSync(target)) {\n const proceed = await p.confirm({\n initialValue: false,\n message: `${target} already exists. Continue and overwrite?`,\n });\n if (p.isCancel(proceed) || !proceed) {\n abort();\n }\n }\n\n const example = await chooseExample(values.example, wantsPicker);\n\n const spinner = p.spinner();\n spinner.start(`Downloading example: ${example}`);\n await downloadTemplate(`${REPO}/examples/${example}`, {\n dir: target,\n force: true,\n });\n spinner.stop(`Scaffolded ${example} → ${target}`);\n\n p.note(`cd ${dir}\\npnpm install\\npnpm dev`, \"Next steps\");\n p.outro(\"Happy hacking!\");\n}\n\ntry {\n await run();\n} catch (error: unknown) {\n p.cancel(error instanceof Error ? error.message : String(error));\n process.exit(1);\n}\n"],"mappings":"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"}
|