create-vizion-digital-agency 1.0.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.
Files changed (3) hide show
  1. package/README.md +10 -0
  2. package/index.mjs +149 -0
  3. package/package.json +25 -0
package/README.md ADDED
@@ -0,0 +1,10 @@
1
+ # create-vizion-digital-agency
2
+
3
+ Nieuwe projecten van Vizion Digital Agency.
4
+
5
+ ```bash
6
+ npm create vizion-digital-agency@latest
7
+ ```
8
+
9
+ Dit pakket is alleen de opstarter. De componenten staan in een privé repository van Vizion Digital Agency en worden
10
+ met je eigen Git-toegang opgehaald; zonder toegang tot die repository doet dit pakket niets.
package/index.mjs ADDED
@@ -0,0 +1,149 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * create-vizion-digital-agency: nieuwe projecten van Vizion Digital Agency.
4
+ *
5
+ * npm create vizion-digital-agency@latest [map]
6
+ *
7
+ * Dit is alleen de opstarter en bevat zelf geen componenten. Hij zoekt de nieuwste release van de (privé) repository,
8
+ * haalt die op met git (met jouw eigen GitHub-toegang) en start daarna cli/run.mjs uit die kopie. Zo werkt iedereen
9
+ * met een geteste versie, en hoeft dit pakket alleen opnieuw gepubliceerd te worden als dit bestand verandert.
10
+ */
11
+ import fs from "node:fs";
12
+ import os from "node:os";
13
+ import path from "node:path";
14
+ import { spawn, spawnSync } from "node:child_process";
15
+ import { parseArgs } from "node:util";
16
+ import { fileURLToPath, pathToFileURL } from "node:url";
17
+ import * as ui from "@clack/prompts";
18
+
19
+ /** Gelijk houden met package.json (npm test controleert dat). */
20
+ const VERSION = "1.0.0";
21
+ /** Afspraak met cli/run.mjs; alleen ophogen als de aanroep van run() verandert. */
22
+ const CONTRACT = 1;
23
+ const REPOSITORY = "https://github.com/Vizion-Digital-Agency/create-vizion-digital-agency.git";
24
+
25
+ // ── Kleuren (het logo en de rest van het uiterlijk komen uit de repository: cli/lib/ui.mjs) ──
26
+ const tty = !process.env.NO_COLOR && process.stdout.isTTY;
27
+ const paint = (code) => (text) => (tty ? `\x1b[${code}m${text}\x1b[0m` : text);
28
+ const bold = paint(1);
29
+ const dim = paint(2);
30
+ const red = paint(31);
31
+
32
+ const HELP = `
33
+ ${bold("Vizion Digital Agency")}: nieuw project
34
+
35
+ npm create vizion-digital-agency@latest [map]
36
+
37
+ [map] Waar het project komt (standaard: deze map als hij leeg is, anders een nieuwe map)
38
+ --ref <ref> Een andere versie gebruiken: een tag (v1.2.0) of branch (main). Standaard: de nieuwste release
39
+ --answers <bestand> Zonder vragen: alle antwoorden uit een JSON-bestand (voor scripts en tests)
40
+ --local Ontwikkelen: de componenten uit de repository waarin deze launcher staat
41
+ -v, --version Versie van deze launcher
42
+ -h, --help Deze uitleg
43
+
44
+ Nodig: Node.js 22 of nieuwer en Git met toegang tot github.com/Vizion-Digital-Agency.
45
+ `;
46
+
47
+ const { values: options, positionals } = parseArgs({
48
+ allowPositionals: true,
49
+ options: {
50
+ ref: { type: "string" },
51
+ local: { type: "boolean" },
52
+ answers: { type: "string" },
53
+ version: { type: "boolean", short: "v" },
54
+ help: { type: "boolean", short: "h" },
55
+ },
56
+ });
57
+
58
+ if (options.help) {
59
+ console.log(HELP);
60
+ process.exit(0);
61
+ }
62
+ if (options.version) {
63
+ console.log(VERSION);
64
+ process.exit(0);
65
+ }
66
+
67
+ const [major] = process.versions.node.split(".").map(Number);
68
+ if (major < 22) {
69
+ console.error(red(`Node.js 22 of nieuwer is nodig (je hebt ${process.versions.node}). Installeer Node.js 24 LTS.`));
70
+ process.exit(1);
71
+ }
72
+
73
+ /** git zonder shell: argumenten (zoals de map) gaan nooit door een shell. */
74
+ const git = (args) =>
75
+ new Promise((resolve) => {
76
+ const child = spawn("git", args, { stdio: ["ignore", "pipe", "pipe"] });
77
+ let output = "";
78
+ child.stdout.on("data", (chunk) => (output += chunk));
79
+ child.stderr.on("data", (chunk) => (output += chunk));
80
+ child.on("error", (error) => resolve({ ok: false, output: error.message }));
81
+ child.on("close", (code) => resolve({ ok: code === 0, output }));
82
+ });
83
+
84
+ /** De nieuwste release (tag vX.Y.Z), of null als er nog geen is. */
85
+ async function latestRelease(repository) {
86
+ const result = await git(["ls-remote", "--tags", "--refs", repository, "v*"]);
87
+ if (!result.ok) return { error: result.output.trim() };
88
+ const versions = [...result.output.matchAll(/refs\/tags\/(v(\d+)\.(\d+)\.(\d+))$/gm)]
89
+ .map((m) => ({ tag: m[1], parts: [Number(m[2]), Number(m[3]), Number(m[4])] }))
90
+ .sort((a, b) => b.parts[0] - a.parts[0] || b.parts[1] - a.parts[1] || b.parts[2] - a.parts[2]);
91
+ return { tag: versions[0]?.tag ?? null };
92
+ }
93
+
94
+ const accessHint =
95
+ "Heb je toegang tot github.com/Vizion-Digital-Agency/create-vizion-digital-agency, en is Git bij GitHub ingelogd " +
96
+ "(bijv. via GitHub Desktop of Git Credential Manager)?";
97
+
98
+ let sourceRoot;
99
+ let ref = "lokaal";
100
+ let clone = null;
101
+ try {
102
+ if (options.local) {
103
+ sourceRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
104
+ if (!fs.existsSync(path.join(sourceRoot, "cli", "run.mjs"))) {
105
+ ui.cancel("--local werkt alleen vanuit de repository met de componenten.");
106
+ process.exit(1);
107
+ }
108
+ } else {
109
+ if (spawnSync("git", ["--version"], { stdio: "ignore" }).status !== 0) {
110
+ ui.cancel("Git is nodig om de componenten op te halen. Installeer Git en probeer het opnieuw.");
111
+ process.exit(1);
112
+ }
113
+ const repository = process.env.VIZION_REPO ?? REPOSITORY;
114
+ const spinner = ui.spinner();
115
+ spinner.start("Vizion: nieuwste versie zoeken");
116
+ if (options.ref) {
117
+ ref = options.ref;
118
+ } else {
119
+ const release = await latestRelease(repository);
120
+ if (release.error) {
121
+ spinner.stop("GitHub niet bereikbaar", 1);
122
+ ui.log.error(release.error);
123
+ ui.cancel(accessHint);
124
+ process.exit(1);
125
+ }
126
+ ref = release.tag ?? "main";
127
+ }
128
+
129
+ spinner.message(`Componenten ophalen (${ref})`);
130
+ clone = fs.mkdtempSync(path.join(os.tmpdir(), "vizion-"));
131
+ const result = await git(["clone", "--depth", "1", "--quiet", "--branch", ref, repository, clone]);
132
+ if (!result.ok) {
133
+ spinner.stop("Ophalen mislukt", 1);
134
+ ui.log.error(result.output.trim());
135
+ ui.cancel(accessHint);
136
+ process.exitCode = 1;
137
+ } else {
138
+ spinner.stop(`Vizion-componenten opgehaald ${dim(`(${ref})`)}`);
139
+ sourceRoot = clone;
140
+ }
141
+ }
142
+
143
+ if (sourceRoot) {
144
+ const { run } = await import(pathToFileURL(path.join(sourceRoot, "cli", "run.mjs")).href);
145
+ await run({ sourceRoot, options, positionals, ui, cwd: process.cwd(), launcher: { version: VERSION, contract: CONTRACT, ref } });
146
+ }
147
+ } finally {
148
+ if (clone) fs.rmSync(clone, { recursive: true, force: true });
149
+ }
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "create-vizion-digital-agency",
3
+ "version": "1.0.0",
4
+ "description": "Nieuwe projecten van Vizion Digital Agency: npm create vizion-digital-agency",
5
+ "type": "module",
6
+ "bin": {
7
+ "create-vizion-digital-agency": "index.mjs"
8
+ },
9
+ "files": [
10
+ "index.mjs"
11
+ ],
12
+ "engines": {
13
+ "node": ">=22"
14
+ },
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/Vizion-Digital-Agency/create-vizion-digital-agency.git",
18
+ "directory": "packages/create-vizion-digital-agency"
19
+ },
20
+ "author": "Vizion Digital Agency",
21
+ "license": "UNLICENSED",
22
+ "dependencies": {
23
+ "@clack/prompts": "^1.8.1"
24
+ }
25
+ }