create-vuetify 2.7.0-beta.3 → 2.7.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 (2) hide show
  1. package/dist/index.mjs +302 -56
  2. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -1,26 +1,19 @@
1
1
  // src/index.ts
2
- import { dirname as dirname3, join as join3, resolve as resolve5 } from "node:path";
2
+ import { dirname as dirname3, join as join4, resolve as resolve6 } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
- import { mkdirSync as mkdirSync2, rmSync, writeFileSync as writeFileSync2 } from "node:fs";
4
+ import { mkdirSync as mkdirSync2, rmSync, writeFileSync as writeFileSync2, existsSync as existsSync5 } from "node:fs";
5
5
 
6
6
  // src/utils/prompts.ts
7
7
  import { join as join2, resolve as resolve3 } from "node:path";
8
8
  import { existsSync as existsSync2, readdirSync } from "node:fs";
9
9
 
10
10
  // src/utils/presets.ts
11
- var defaultContext = {
12
- useEslint: false,
13
- useRouter: false,
14
- useStore: false
15
- };
11
+ var defaultContext = {};
16
12
  var baseContext = {
17
- ...defaultContext,
18
- useEslint: true,
19
- useRouter: true
13
+ ...defaultContext
20
14
  };
21
15
  var essentialsContext = {
22
- ...baseContext,
23
- useStore: true
16
+ ...baseContext
24
17
  };
25
18
  var presets = {
26
19
  "base": baseContext,
@@ -1141,8 +1134,243 @@ async function initPrompts(context) {
1141
1134
  };
1142
1135
  }
1143
1136
 
1144
- // src/index.ts
1137
+ // src/utils/nonInteractivePrompts.ts
1138
+ import { join as join3, resolve as resolve4 } from "node:path";
1139
+ import { existsSync as existsSync3, readdirSync as readdirSync2 } from "node:fs";
1145
1140
  import { red as red2 } from "kolorist";
1141
+ function resolveNonInteractiveContext(context) {
1142
+ if (context.usePreset) {
1143
+ context = {
1144
+ ...context,
1145
+ ...presets[context.usePreset]
1146
+ };
1147
+ }
1148
+ const projectName = context.projectName || "vuetify-project";
1149
+ const projectPath = join3(context.cwd, projectName);
1150
+ const directoryExists = existsSync3(projectPath);
1151
+ const directoryNotEmpty = directoryExists && readdirSync2(projectPath).length > 0;
1152
+ if (directoryNotEmpty && !context.canOverwrite) {
1153
+ console.error("\n\n", red2("\u2716") + ` Target directory ${resolve4(context.cwd, projectName)} exists and is not empty.`);
1154
+ console.error("Use --force or --overwrite flag to overwrite the directory.");
1155
+ process.exit(1);
1156
+ }
1157
+ let useTypeScript = context.useTypeScript;
1158
+ if (useTypeScript === void 0) {
1159
+ const preset = context.usePreset;
1160
+ useTypeScript = preset ? preset.startsWith("nuxt-") : false;
1161
+ }
1162
+ let usePackageManager = context.usePackageManager;
1163
+ if (usePackageManager === void 0) {
1164
+ const preset = context.usePreset;
1165
+ if (!preset || !preset.startsWith("nuxt-")) {
1166
+ usePackageManager = packageManager;
1167
+ }
1168
+ }
1169
+ let installDependencies3 = context.installDependencies;
1170
+ if (installDependencies3 === void 0) {
1171
+ const preset = context.usePreset;
1172
+ installDependencies3 = preset ? !preset.startsWith("nuxt-") : true;
1173
+ }
1174
+ const usePreset = context.usePreset || "default";
1175
+ const useNuxtModule = context.useNuxtModule;
1176
+ const useNuxtSSR = context.useNuxtSSR;
1177
+ const useNuxtSSRClientHints = context.useNuxtSSRClientHints;
1178
+ return {
1179
+ cwd: context.cwd,
1180
+ projectName,
1181
+ canOverwrite: context.canOverwrite || false,
1182
+ useTypeScript: useTypeScript || false,
1183
+ usePackageManager: usePackageManager || "npm",
1184
+ installDependencies: installDependencies3 || false,
1185
+ usePreset,
1186
+ useNuxtModule: useNuxtModule || false,
1187
+ useNuxtSSR: useNuxtSSR || false,
1188
+ useNuxtSSRClientHints: useNuxtSSRClientHints || false
1189
+ };
1190
+ }
1191
+
1192
+ // package.json
1193
+ var package_default = {
1194
+ name: "create-vuetify",
1195
+ version: "2.7.0",
1196
+ author: "Elijah Kotyluk <elijah@elijahkotyluk.com>",
1197
+ license: "MIT",
1198
+ type: "module",
1199
+ bin: {
1200
+ "create-vuetify": "bin/index.js"
1201
+ },
1202
+ files: [
1203
+ "bin/index.js",
1204
+ "template",
1205
+ "dist"
1206
+ ],
1207
+ repository: {
1208
+ type: "git",
1209
+ url: "git+https://github.com/vuetifyjs/create.git"
1210
+ },
1211
+ bugs: {
1212
+ url: "https://github.com/vuetifyjs/create/issues"
1213
+ },
1214
+ keywords: [
1215
+ "vuetify",
1216
+ "vue",
1217
+ "vue3",
1218
+ "ui",
1219
+ "scaffolding",
1220
+ "cli",
1221
+ "template",
1222
+ "create",
1223
+ "boilerplate",
1224
+ "starter",
1225
+ "typescript",
1226
+ "javascript",
1227
+ "vite",
1228
+ "pinia",
1229
+ "vue-router",
1230
+ "nuxt",
1231
+ "material-design",
1232
+ "material-ui",
1233
+ "components"
1234
+ ],
1235
+ scripts: {
1236
+ build: "node ./scripts/build.js",
1237
+ start: "node ./index.js",
1238
+ dev: "node --run build && node --run start",
1239
+ lint: "eslint --fix .",
1240
+ prepublishOnly: "node --run build",
1241
+ release: "bumpp"
1242
+ },
1243
+ dependencies: {
1244
+ kolorist: "^1.8.0",
1245
+ magicast: "^0.3.5",
1246
+ minimist: "^1.2.8",
1247
+ "package-manager-detector": "^1.3.0",
1248
+ prompts: "^2.4.2",
1249
+ tinyexec: "^1.0.1",
1250
+ "validate-npm-package-name": "^6.0.2"
1251
+ },
1252
+ devDependencies: {
1253
+ "@types/minimist": "^1.2.5",
1254
+ "@types/node": "^22.18.5",
1255
+ "@types/prompts": "^2.4.9",
1256
+ "@types/validate-npm-package-name": "^4.0.2",
1257
+ bumpp: "^10.2.3",
1258
+ esbuild: "^0.25.9",
1259
+ eslint: "^9.35.0",
1260
+ "eslint-config-vuetify": "^4.2.0",
1261
+ nypm: "^0.6.2",
1262
+ typescript: "^5.9.2"
1263
+ },
1264
+ packageManager: "pnpm@9.15.9"
1265
+ };
1266
+
1267
+ // src/utils/cli/helpText.ts
1268
+ function getHelpText() {
1269
+ return `
1270
+ Usage: create-vuetify [project-name] [options]
1271
+
1272
+ Options:
1273
+ -p, --preset <preset> Choose a preset (base, default, essentials, nuxt-base, nuxt-default, nuxt-essentials)
1274
+ --ts, --typescript Use TypeScript
1275
+ --pm, --package-manager <manager> Package manager to use (npm, pnpm, yarn, bun, none)
1276
+ -i, --install Install dependencies
1277
+ -f, --force, --overwrite Overwrite existing directory
1278
+ --nuxt-module Use vuetify-nuxt-module (for Nuxt presets)
1279
+ --nuxt-ssr, --ssr Enable Nuxt SSR (for Nuxt presets)
1280
+ --nuxt-ssr-client-hints Enable Nuxt SSR Client Hints (for Nuxt presets)
1281
+ -h, --help Show help
1282
+ -v, --version Show version
1283
+
1284
+ Examples:
1285
+ create-vuetify # Interactive mode
1286
+ create-vuetify my-app --preset default --typescript # Non-interactive with TypeScript
1287
+ create-vuetify my-app --preset nuxt-essentials --ssr # Nuxt project with SSR
1288
+ create-vuetify my-app --force --install --pm pnpm # Force overwrite and install with pnpm
1289
+
1290
+ Presets:
1291
+ default - Barebones (Only Vue & Vuetify)
1292
+ base - Default (Adds routing, ESLint & SASS variables)
1293
+ essentials - Recommended (Everything from Default. Adds auto importing, layouts & pinia)
1294
+ nuxt-base - Nuxt Default (Adds Nuxt ESLint & SASS variables)
1295
+ nuxt-default - Nuxt Barebones (Only Vuetify)
1296
+ nuxt-essentials - Nuxt Recommended (Everything from Default. Enables auto importing & layouts)
1297
+ `.trim();
1298
+ }
1299
+ function getVersionText() {
1300
+ return `${package_default.version}`;
1301
+ }
1302
+
1303
+ // src/utils/cli/parseArgs.ts
1304
+ import minimist from "minimist";
1305
+ var validPresets = ["base", "default", "essentials", "nuxt-base", "nuxt-default", "nuxt-essentials"];
1306
+ var validPackageManagers = ["npm", "pnpm", "yarn", "bun", "none"];
1307
+ function parseCliArgs(args) {
1308
+ const argv = minimist(args, {
1309
+ alias: {
1310
+ typescript: ["ts"],
1311
+ preset: ["p"],
1312
+ packageManager: ["pm", "package-manager"],
1313
+ installDependencies: ["install", "i"],
1314
+ overwrite: ["force", "f"],
1315
+ nuxtModule: ["nuxt-module"],
1316
+ nuxtSSR: ["nuxt-ssr", "ssr"],
1317
+ nuxtSSRClientHints: ["nuxt-ssr-client-hints", "client-hints"],
1318
+ help: ["h"],
1319
+ version: ["v"]
1320
+ },
1321
+ boolean: [
1322
+ "typescript",
1323
+ "installDependencies",
1324
+ "overwrite",
1325
+ "nuxtModule",
1326
+ "nuxtSSR",
1327
+ "nuxtSSRClientHints",
1328
+ "help",
1329
+ "version"
1330
+ ],
1331
+ string: [
1332
+ "preset",
1333
+ "packageManager"
1334
+ ]
1335
+ });
1336
+ if (argv.preset && !validPresets.includes(argv.preset)) {
1337
+ throw new Error(`'${argv.preset}' is not a valid preset. Valid presets are: ${validPresets.join(", ")}.`);
1338
+ }
1339
+ if (argv.packageManager && !validPackageManagers.includes(argv.packageManager)) {
1340
+ throw new Error(`'${argv.packageManager}' is not a valid package manager. Valid options are: ${validPackageManagers.join(", ")}.`);
1341
+ }
1342
+ const projectName = argv._[0];
1343
+ return {
1344
+ projectName,
1345
+ preset: argv.preset,
1346
+ typescript: argv.typescript,
1347
+ packageManager: argv.packageManager,
1348
+ installDependencies: argv.installDependencies,
1349
+ overwrite: argv.overwrite,
1350
+ nuxtModule: argv.nuxtModule,
1351
+ nuxtSSR: argv.nuxtSSR,
1352
+ nuxtSSRClientHints: argv.nuxtSSRClientHints,
1353
+ help: argv.help,
1354
+ version: argv.version
1355
+ };
1356
+ }
1357
+ function cliOptionsToContext(cliOptions, cwd2) {
1358
+ return {
1359
+ cwd: cwd2,
1360
+ projectName: cliOptions.projectName || "vuetify-project",
1361
+ useTypeScript: cliOptions.typescript,
1362
+ usePreset: cliOptions.preset ?? "default",
1363
+ usePackageManager: cliOptions.packageManager === "none" ? void 0 : cliOptions.packageManager,
1364
+ installDependencies: cliOptions.installDependencies,
1365
+ canOverwrite: cliOptions.overwrite ?? false,
1366
+ useNuxtModule: cliOptions.nuxtModule ?? true,
1367
+ useNuxtSSR: cliOptions.nuxtSSR ?? true,
1368
+ useNuxtSSRClientHints: cliOptions.nuxtSSRClientHints ?? (cliOptions.nuxtModule && cliOptions.nuxtSSR)
1369
+ };
1370
+ }
1371
+
1372
+ // src/index.ts
1373
+ import { red as red3 } from "kolorist";
1146
1374
 
1147
1375
  // src/utils/banner.ts
1148
1376
  import { blue } from "kolorist";
@@ -1158,16 +1386,9 @@ function createBanner() {
1158
1386
  return "\x1B[38;2;22;151;246mV\x1B[39m\x1B[38;2;22;147;242mu\x1B[39m\x1B[38;2;22;144;238me\x1B[39m\x1B[38;2;22;140;234mt\x1B[39m\x1B[38;2;23;136;229mi\x1B[39m\x1B[38;2;23;133;225mf\x1B[39m\x1B[38;2;23;129;221my\x1B[39m\x1B[38;2;23;125;217m.\x1B[39m\x1B[38;2;23;121;213mj\x1B[39m\x1B[38;2;23;118;209ms\x1B[39m \x1B[38;2;24;114;204m-\x1B[39m \x1B[38;2;24;110;200mM\x1B[39m\x1B[38;2;24;107;196ma\x1B[39m\x1B[38;2;24;103;192mt\x1B[39m\x1B[38;2;32;110;197me\x1B[39m\x1B[38;2;39;118;202mr\x1B[39m\x1B[38;2;47;125;207mi\x1B[39m\x1B[38;2;54;132;211ma\x1B[39m\x1B[38;2;62;140;216ml\x1B[39m \x1B[38;2;70;147;221mC\x1B[39m\x1B[38;2;77;154;226mo\x1B[39m\x1B[38;2;85;161;231mm\x1B[39m\x1B[38;2;93;169;236mp\x1B[39m\x1B[38;2;100;176;240mo\x1B[39m\x1B[38;2;108;183;245mn\x1B[39m\x1B[38;2;115;191;250me\x1B[39m\x1B[38;2;123;198;255mn\x1B[39m\x1B[38;2;126;199;255mt\x1B[39m \x1B[38;2;129;201;255mF\x1B[39m\x1B[38;2;133;202;255mr\x1B[39m\x1B[38;2;136;204;255ma\x1B[39m\x1B[38;2;139;205;255mm\x1B[39m\x1B[38;2;142;207;255me\x1B[39m\x1B[38;2;145;208;255mw\x1B[39m\x1B[38;2;149;210;255mo\x1B[39m\x1B[38;2;152;211;255mr\x1B[39m\x1B[38;2;155;212;255mk\x1B[39m \x1B[38;2;158;214;255mf\x1B[39m\x1B[38;2;161;215;255mo\x1B[39m\x1B[38;2;164;217;255mr\x1B[39m \x1B[38;2;168;218;255mV\x1B[39m\x1B[38;2;171;220;255mu\x1B[39m\x1B[38;2;174;221;255me\x1B[39m";
1159
1387
  }
1160
1388
  function createPlainBanner() {
1161
- return "Vuetify.js - Material Component Framework for Vue";
1389
+ return "Vuetify - Vue Component Framework";
1162
1390
  }
1163
1391
 
1164
- // src/index.ts
1165
- import minimist from "minimist";
1166
-
1167
- // src/utils/renderTemplate.ts
1168
- import { copyFileSync, mkdirSync, readdirSync as readdirSync2, readFileSync, statSync, writeFileSync } from "node:fs";
1169
- import { basename as basename2, dirname as dirname2, resolve as resolve4 } from "node:path";
1170
-
1171
1392
  // src/utils/deepMerge.ts
1172
1393
  var isObject = (v) => {
1173
1394
  return v === Object(v) && v !== null && !Array.isArray(v);
@@ -1186,26 +1407,30 @@ var deepMerge = (...sources) => sources.reduce((acc, curr) => {
1186
1407
  }, {});
1187
1408
 
1188
1409
  // src/utils/renderTemplate.ts
1410
+ import { copyFileSync, mkdirSync, readdirSync as readdirSync3, readFileSync, statSync, writeFileSync, existsSync as existsSync4 } from "node:fs";
1411
+ import { basename as basename2, dirname as dirname2, resolve as resolve5 } from "node:path";
1189
1412
  function mergePkg(source, destination) {
1190
- const target = JSON.parse(readFileSync(destination, "utf8"));
1413
+ const target = existsSync4(destination) ? JSON.parse(readFileSync(destination, "utf8")) : {};
1191
1414
  const src = JSON.parse(readFileSync(source, "utf8"));
1192
1415
  const mergedPkg = deepMerge(target, src);
1193
1416
  const keysToSort = ["devDependencies", "dependencies"];
1194
1417
  for (const k of keysToSort) {
1195
- mergedPkg[k] = Object.keys(mergedPkg[k]).toSorted().reduce((a, c) => (a[c] = mergedPkg[k][c], a), {});
1418
+ if (mergedPkg[k]) {
1419
+ mergedPkg[k] = Object.keys(mergedPkg[k]).toSorted().reduce((a, c) => (a[c] = mergedPkg[k][c], a), {});
1420
+ }
1196
1421
  }
1197
1422
  writeFileSync(destination, JSON.stringify(mergedPkg, null, 2) + "\n");
1198
1423
  }
1199
1424
  function renderDirectory(source, destination) {
1200
1425
  mkdirSync(destination, { recursive: true });
1201
- for (const path4 of readdirSync2(source)) {
1202
- renderTemplate(resolve4(source, path4), resolve4(destination, path4));
1426
+ for (const path4 of readdirSync3(source)) {
1427
+ renderTemplate(resolve5(source, path4), resolve5(destination, path4));
1203
1428
  }
1204
1429
  }
1205
1430
  function renderFile(source, destination) {
1206
1431
  const filename = basename2(source);
1207
1432
  if (filename.startsWith("_")) {
1208
- destination = resolve4(dirname2(destination), filename.replace("_", "."));
1433
+ destination = resolve5(dirname2(destination), filename.replace("_", "."));
1209
1434
  }
1210
1435
  if (filename === "package.json") {
1211
1436
  mergePkg(source, destination);
@@ -1856,30 +2081,51 @@ function prepareProject(ctx) {
1856
2081
  }
1857
2082
 
1858
2083
  // src/index.ts
1859
- var validPresets = ["base", "custom", "default", "essentials"];
1860
2084
  async function run() {
1861
- const argv = minimist(process.argv.slice(2), {
1862
- alias: {
1863
- typescript: ["ts"]
1864
- }
1865
- });
1866
- if (argv.preset && !validPresets.includes(argv.preset)) {
1867
- throw new Error(`'${argv.preset}' is not a valid preset. Valid presets are: ${validPresets.join(", ")}.`);
1868
- }
2085
+ const args = process.argv.slice(2).slice();
1869
2086
  const banner = createBanner();
2087
+ if (args.length === 0) {
2088
+ console.log(`
2089
+ ${banner}
2090
+ `);
2091
+ const initialContext2 = {
2092
+ canOverwrite: false,
2093
+ cwd: process.cwd(),
2094
+ projectName: "vuetify-project"
2095
+ };
2096
+ const finalContext2 = await initPrompts(initialContext2);
2097
+ await createProject(finalContext2);
2098
+ return;
2099
+ }
2100
+ const cliOptions = parseCliArgs(args);
2101
+ if (cliOptions.help) {
2102
+ console.log(getHelpText());
2103
+ process.exit(0);
2104
+ }
2105
+ if (cliOptions.version) {
2106
+ console.log(getVersionText());
2107
+ process.exit(0);
2108
+ }
1870
2109
  console.log(`
1871
2110
  ${banner}
1872
2111
  `);
1873
- const context = {
1874
- canOverwrite: false,
1875
- cwd: process.cwd(),
1876
- projectName: "vuetify-project",
1877
- useRouter: false,
1878
- useTypeScript: argv.typescript,
1879
- usePreset: argv.preset,
1880
- useStore: void 0,
1881
- usePackageManager: void 0
2112
+ const cliContext = cliOptionsToContext(cliOptions, process.cwd());
2113
+ const initialContext = {
2114
+ cwd: cliContext.cwd,
2115
+ projectName: cliContext.projectName,
2116
+ canOverwrite: cliContext.canOverwrite,
2117
+ useTypeScript: cliContext.useTypeScript,
2118
+ usePreset: cliContext.usePreset,
2119
+ usePackageManager: cliContext.usePackageManager,
2120
+ installDependencies: cliContext.installDependencies,
2121
+ useNuxtModule: cliContext.useNuxtModule,
2122
+ useNuxtSSR: cliContext.useNuxtSSR,
2123
+ useNuxtSSRClientHints: cliContext.useNuxtSSRClientHints
1882
2124
  };
2125
+ const finalContext = resolveNonInteractiveContext(initialContext);
2126
+ await createProject(finalContext);
2127
+ }
2128
+ async function createProject(finalContext) {
1883
2129
  const {
1884
2130
  canOverwrite,
1885
2131
  cwd: cwd2,
@@ -1891,15 +2137,15 @@ ${banner}
1891
2137
  useNuxtModule,
1892
2138
  useNuxtSSR,
1893
2139
  useNuxtSSRClientHints
1894
- } = await initPrompts(context);
1895
- const projectRoot = join3(cwd2, projectName);
1896
- if (canOverwrite) {
2140
+ } = finalContext;
2141
+ const projectRoot = join4(cwd2, projectName);
2142
+ if (canOverwrite && existsSync5(projectRoot)) {
1897
2143
  rmSync(projectRoot, { recursive: true });
1898
2144
  }
1899
- const preset = context.usePreset ?? usePreset;
2145
+ const preset = finalContext.usePreset ?? usePreset;
1900
2146
  if (preset.startsWith("nuxt-")) {
1901
- const templateRoot = resolve5(dirname3(fileURLToPath(import.meta.url)), "../template/typescript");
1902
- const templatePath = resolve5(dirname3(fileURLToPath(import.meta.url)), "../template/typescript/nuxt");
2147
+ const templateRoot = resolve6(dirname3(fileURLToPath(import.meta.url)), "../template/typescript");
2148
+ const templatePath = resolve6(dirname3(fileURLToPath(import.meta.url)), "../template/typescript/nuxt");
1903
2149
  await renderNuxtTemplate({
1904
2150
  cwd: cwd2,
1905
2151
  projectName,
@@ -1913,16 +2159,16 @@ ${banner}
1913
2159
  });
1914
2160
  } else {
1915
2161
  mkdirSync2(projectRoot);
1916
- writeFileSync2(resolve5(projectRoot, "package.json"), JSON.stringify({ name: projectName }, null, 2));
2162
+ writeFileSync2(resolve6(projectRoot, "package.json"), JSON.stringify({ name: projectName }, null, 2));
1917
2163
  console.log("\n\u25CC Generating scaffold...");
1918
2164
  const jsOrTs = useTypeScript ? "typescript" : "javascript";
1919
- const templatePath = resolve5(dirname3(fileURLToPath(import.meta.url)), "../template", jsOrTs);
1920
- renderTemplate(resolve5(templatePath, "default"), projectRoot);
2165
+ const templatePath = resolve6(dirname3(fileURLToPath(import.meta.url)), "../template", jsOrTs);
2166
+ renderTemplate(resolve6(templatePath, "default"), projectRoot);
1921
2167
  if (["base", "essentials"].includes(usePreset)) {
1922
- renderTemplate(resolve5(templatePath, "base"), projectRoot);
2168
+ renderTemplate(resolve6(templatePath, "base"), projectRoot);
1923
2169
  }
1924
2170
  if (["essentials", "recommended"].includes(usePreset)) {
1925
- renderTemplate(resolve5(templatePath, "essentials"), projectRoot);
2171
+ renderTemplate(resolve6(templatePath, "essentials"), projectRoot);
1926
2172
  }
1927
2173
  if (usePackageManager && installDeps) {
1928
2174
  console.log(`\u25CC Installing dependencies with ${usePackageManager}...
@@ -1941,7 +2187,7 @@ run().then(() => {
1941
2187
  process.exit(0);
1942
2188
  }).catch((error) => {
1943
2189
  console.error(`
1944
- ${red2("\u2716")} ${error}
2190
+ ${red3("\u2716")} ${error}
1945
2191
  `);
1946
2192
  process.exit(1);
1947
2193
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-vuetify",
3
- "version": "2.7.0-beta.3",
3
+ "version": "2.7.0",
4
4
  "author": "Elijah Kotyluk <elijah@elijahkotyluk.com>",
5
5
  "license": "MIT",
6
6
  "type": "module",