sprawlify 0.0.99 → 0.0.100

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 +200 -31
  2. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -8,7 +8,7 @@ import { existsSync } from "fs";
8
8
  import prompts from "prompts";
9
9
  import { faker } from "@faker-js/faker";
10
10
  //#region package.json
11
- var version = "0.0.99";
11
+ var version = "0.0.100";
12
12
  //#endregion
13
13
  //#region src/utils/file-helper.ts
14
14
  const FILE_BACKUP_SUFFIX = ".bak";
@@ -197,18 +197,89 @@ const METAFRAMEWORKS = {
197
197
  const PRESETS = {
198
198
  clay: {
199
199
  name: "Clay",
200
- frameworks: ["react"]
200
+ frameworks: { react: {} }
201
201
  },
202
202
  monochrome: {
203
203
  name: "Monochrome",
204
- frameworks: [
205
- "react",
206
- "solid",
207
- "svelte",
208
- "vue"
209
- ]
204
+ frameworks: {
205
+ react: {
206
+ dependencies: {
207
+ "class-variance-authority": "^0.7.1",
208
+ clsx: "^2.1.1",
209
+ "tailwind-merge": "^3.3.1"
210
+ },
211
+ devDependencies: {},
212
+ items: [{
213
+ name: "utils",
214
+ dependencies: ["clsx", "tailwind-merge"],
215
+ files: [{
216
+ content: "import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n",
217
+ type: "registry:utils",
218
+ path: "utils.ts"
219
+ }]
220
+ }]
221
+ },
222
+ solid: {
223
+ dependencies: {
224
+ "class-variance-authority": "^0.7.1",
225
+ clsx: "^2.1.1",
226
+ "tailwind-merge": "^3.3.1"
227
+ },
228
+ devDependencies: {},
229
+ items: [{
230
+ name: "utils",
231
+ dependencies: ["clsx", "tailwind-merge"],
232
+ files: [{
233
+ content: "import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n",
234
+ type: "registry:utils",
235
+ path: "utils.ts"
236
+ }]
237
+ }]
238
+ },
239
+ svelte: {
240
+ dependencies: {
241
+ "class-variance-authority": "^0.7.1",
242
+ clsx: "^2.1.1",
243
+ "tailwind-merge": "^3.3.1"
244
+ },
245
+ devDependencies: {},
246
+ items: [{
247
+ name: "utils",
248
+ dependencies: ["clsx", "tailwind-merge"],
249
+ files: [{
250
+ content: "import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n",
251
+ type: "registry:utils",
252
+ path: "utils.ts"
253
+ }]
254
+ }]
255
+ },
256
+ vue: {
257
+ dependencies: {
258
+ "class-variance-authority": "^0.7.1",
259
+ clsx: "^2.1.1",
260
+ "tailwind-merge": "^3.3.1"
261
+ },
262
+ devDependencies: {},
263
+ items: [{
264
+ name: "utils",
265
+ dependencies: ["clsx", "tailwind-merge"],
266
+ files: [{
267
+ content: "import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n",
268
+ type: "registry:utils",
269
+ path: "utils.ts"
270
+ }]
271
+ }]
272
+ }
273
+ }
210
274
  }
211
275
  };
276
+ function getPresetItems(presetName, frameworkName) {
277
+ return getFrameworkPreset(presetName, frameworkName)?.items ?? [];
278
+ }
279
+ function getFrameworkPreset(presetName, frameworkName) {
280
+ if (!presetName || !frameworkName) return;
281
+ return PRESETS[presetName]?.frameworks?.[frameworkName];
282
+ }
212
283
  //#endregion
213
284
  //#region src/commands/init/options.ts
214
285
  const initOptionsSchema = z.object({
@@ -295,7 +366,7 @@ async function promptForMissingSelections(options) {
295
366
  choices: Object.entries(PRESETS).map(([key, preset]) => ({
296
367
  title: preset.name,
297
368
  value: key,
298
- disabled: !preset.frameworks.includes(options.framework)
369
+ disabled: !Object.keys(preset.frameworks).includes(options.framework)
299
370
  })),
300
371
  initial: 0
301
372
  });
@@ -427,19 +498,21 @@ dist-ssr
427
498
  "preview": "vite preview"
428
499
  },
429
500
  "dependencies": {
501
+ "@sprawlify/primitives": "^0.0.99",
502
+ "@sprawlify/react": "^0.0.99",
430
503
  "react": "^19.2.4",
431
504
  "react-dom": "^19.2.4"
432
505
  },
433
506
  "devDependencies": {
434
- "@tailwindcss/vite": "^4.2.1",
507
+ "@tailwindcss/vite": "^4.2.2",
435
508
  "@types/node": "^24.12.0",
436
509
  "@types/react": "^19.2.14",
437
510
  "@types/react-dom": "^19.2.3",
438
511
  "@vitejs/plugin-react": "^6.0.1",
439
512
  "globals": "^17.4.0",
440
- "tailwindcss": "^4.2.1",
441
- "typescript": "~5.9.3",
442
- "vite": "^8.0.0"
513
+ "tailwindcss": "^4.2.2",
514
+ "typescript": "^5.9.3",
515
+ "vite": "^8.0.1"
443
516
  }
444
517
  }`
445
518
  },
@@ -598,14 +671,16 @@ dist-ssr
598
671
  "preview": "vite preview"
599
672
  },
600
673
  "dependencies": {
674
+ "@sprawlify/primitives": "^0.0.99",
675
+ "@sprawlify/solid": "^0.0.99",
601
676
  "solid-js": "^1.9.11"
602
677
  },
603
678
  "devDependencies": {
604
- "@tailwindcss/vite": "^4.2.1",
679
+ "@tailwindcss/vite": "^4.2.2",
605
680
  "@types/node": "^24.12.0",
606
- "tailwindcss": "^4.2.1",
607
- "typescript": "~5.9.3",
608
- "vite": "^8.0.0",
681
+ "tailwindcss": "^4.2.2",
682
+ "typescript": "^5.9.3",
683
+ "vite": "^8.0.1",
609
684
  "vite-plugin-solid": "^2.11.11"
610
685
  }
611
686
  }`
@@ -762,16 +837,20 @@ dist-ssr
762
837
  "preview": "vite preview",
763
838
  "check": "svelte-check --tsconfig ./tsconfig.app.json && tsc -p tsconfig.node.json"
764
839
  },
840
+ "dependencies": {
841
+ "@sprawlify/primitives": "^0.0.99",
842
+ "@sprawlify/svelte": "^0.0.99"
843
+ },
765
844
  "devDependencies": {
766
845
  "@sveltejs/vite-plugin-svelte": "^7.0.0",
767
- "@tailwindcss/vite": "^4.2.1",
846
+ "@tailwindcss/vite": "^4.2.2",
768
847
  "@tsconfig/svelte": "^5.0.8",
769
848
  "@types/node": "^24.12.0",
770
849
  "svelte": "^5.54.0",
771
850
  "svelte-check": "^4.4.5",
772
- "tailwindcss": "^4.2.1",
773
- "typescript": "~5.9.3",
774
- "vite": "^8.0.0"
851
+ "tailwindcss": "^4.2.2",
852
+ "typescript": "^5.9.3",
853
+ "vite": "^8.0.1"
775
854
  }
776
855
  }`
777
856
  },
@@ -918,16 +997,18 @@ dist-ssr
918
997
  "preview": "vite preview"
919
998
  },
920
999
  "dependencies": {
1000
+ "@sprawlify/primitives": "^0.0.99",
1001
+ "@sprawlify/vue": "^0.0.99",
921
1002
  "vue": "^3.5.30"
922
1003
  },
923
1004
  "devDependencies": {
924
- "@tailwindcss/vite": "^4.2.1",
1005
+ "@tailwindcss/vite": "^4.2.2",
925
1006
  "@types/node": "^24.12.0",
926
1007
  "@vitejs/plugin-vue": "^6.0.5",
927
1008
  "@vue/tsconfig": "^0.9.0",
928
- "tailwindcss": "^4.2.1",
929
- "typescript": "~5.9.3",
930
- "vite": "^8.0.0",
1009
+ "tailwindcss": "^4.2.2",
1010
+ "typescript": "^5.9.3",
1011
+ "vite": "^8.0.1",
931
1012
  "vue-tsc": "^3.2.6"
932
1013
  }
933
1014
  }`
@@ -1001,6 +1082,80 @@ export default defineConfig({
1001
1082
  };
1002
1083
  //#endregion
1003
1084
  //#region src/commands/init/run-init.ts
1085
+ function resolvePresetFilePath(cwd, file) {
1086
+ const srcPath = path.resolve(cwd, "src");
1087
+ const appPath = path.resolve(cwd, "app");
1088
+ if (file.type === "registry:utils") {
1089
+ if (fsExtra.existsSync(srcPath)) return path.resolve(srcPath, "lib", file.path);
1090
+ if (fsExtra.existsSync(appPath)) return path.resolve(appPath, "lib", file.path);
1091
+ return path.resolve(srcPath, "lib", file.path);
1092
+ }
1093
+ return path.resolve(cwd, file.path);
1094
+ }
1095
+ function resolveItemsToApply(presetItems, requestedComponents) {
1096
+ const presetItemsByName = new Map(presetItems.map((item) => [item.name, item]));
1097
+ const itemNamesToApply = /* @__PURE__ */ new Set();
1098
+ const packageNames = /* @__PURE__ */ new Set();
1099
+ const unresolvedNames = /* @__PURE__ */ new Set();
1100
+ const queue = requestedComponents.size === 0 ? presetItems.map((item) => item.name) : [...requestedComponents];
1101
+ while (queue.length > 0) {
1102
+ const dependencyName = queue.shift();
1103
+ if (!dependencyName) continue;
1104
+ const matchingItem = presetItemsByName.get(dependencyName);
1105
+ if (matchingItem) {
1106
+ if (itemNamesToApply.has(matchingItem.name)) continue;
1107
+ itemNamesToApply.add(matchingItem.name);
1108
+ for (const nestedDependency of matchingItem.dependencies ?? []) queue.push(nestedDependency);
1109
+ continue;
1110
+ }
1111
+ packageNames.add(dependencyName);
1112
+ }
1113
+ if (requestedComponents.size > 0) {
1114
+ for (const componentName of requestedComponents) if (!presetItemsByName.has(componentName)) unresolvedNames.add(componentName);
1115
+ }
1116
+ return {
1117
+ itemsToApply: [...itemNamesToApply].map((itemName) => presetItemsByName.get(itemName)).filter((item) => Boolean(item)),
1118
+ packageNames,
1119
+ unresolvedNames
1120
+ };
1121
+ }
1122
+ async function applyPresetPackageDependencies(cwd, frameworkPreset, packageNames) {
1123
+ if (!frameworkPreset || packageNames.size === 0) return;
1124
+ const packageJsonPath = path.resolve(cwd, "package.json");
1125
+ if (!fsExtra.existsSync(packageJsonPath)) {
1126
+ logger.warn("Skipping preset package dependencies because package.json was not found.");
1127
+ return;
1128
+ }
1129
+ const packageJson = await fsExtra.readJson(packageJsonPath);
1130
+ let didChange = false;
1131
+ const missingPackages = [];
1132
+ packageJson.dependencies ??= {};
1133
+ packageJson.devDependencies ??= {};
1134
+ for (const packageName of packageNames) {
1135
+ const dependencyVersion = frameworkPreset.dependencies?.[packageName];
1136
+ if (dependencyVersion) {
1137
+ if (!packageJson.dependencies[packageName]) {
1138
+ packageJson.dependencies[packageName] = dependencyVersion;
1139
+ didChange = true;
1140
+ }
1141
+ continue;
1142
+ }
1143
+ const devDependencyVersion = frameworkPreset.devDependencies?.[packageName];
1144
+ if (devDependencyVersion) {
1145
+ if (!packageJson.devDependencies[packageName]) {
1146
+ packageJson.devDependencies[packageName] = devDependencyVersion;
1147
+ didChange = true;
1148
+ }
1149
+ continue;
1150
+ }
1151
+ missingPackages.push(packageName);
1152
+ }
1153
+ if (didChange) {
1154
+ await fsExtra.writeJson(packageJsonPath, packageJson, { spaces: 2 });
1155
+ logger.success("Updated package.json with preset package dependencies.");
1156
+ }
1157
+ if (missingPackages.length > 0) logger.warn(`Skipping unresolved preset packages: ${missingPackages.map((packageName) => highlighter.info(packageName)).join(", ")}.`);
1158
+ }
1004
1159
  async function runInit(options) {
1005
1160
  let cwd = options.cwd;
1006
1161
  if (options.name && options.name !== ".") {
@@ -1026,12 +1181,7 @@ async function runInit(options) {
1026
1181
  $schema: "https://ui.primitives.com/schema.json",
1027
1182
  framework: options.framework,
1028
1183
  preset: options.preset,
1029
- metaframework: options.metaframework,
1030
- aliases: {
1031
- components: "@/components",
1032
- ui: "@/components/ui",
1033
- utils: "@/lib/utils"
1034
- }
1184
+ metaframework: options.metaframework
1035
1185
  };
1036
1186
  let backupPath = null;
1037
1187
  if (fsExtra.existsSync(componentsJsonPath)) {
@@ -1052,6 +1202,25 @@ async function runInit(options) {
1052
1202
  }
1053
1203
  throw error;
1054
1204
  }
1205
+ const frameworkPreset = getFrameworkPreset(options.preset, options.framework);
1206
+ const { itemsToApply, packageNames, unresolvedNames } = resolveItemsToApply(getPresetItems(options.preset, options.framework), new Set(options.components ?? []));
1207
+ if (unresolvedNames.size > 0) logger.warn(`Skipping unknown preset component options: ${[...unresolvedNames].map((componentName) => highlighter.info(componentName)).join(", ")}.`);
1208
+ if (itemsToApply.length === 0) {
1209
+ await applyPresetPackageDependencies(cwd, frameworkPreset, packageNames);
1210
+ return;
1211
+ }
1212
+ await applyPresetPackageDependencies(cwd, frameworkPreset, packageNames);
1213
+ logger.info(`Applying preset components: ${itemsToApply.map((item) => highlighter.info(item.name)).join(", ")}.`);
1214
+ for (const item of itemsToApply) for (const file of item.files ?? []) {
1215
+ const targetPath = resolvePresetFilePath(cwd, file);
1216
+ if (fsExtra.existsSync(targetPath) && !options.override) {
1217
+ logger.warn(`Skipping ${highlighter.info(path.relative(cwd, targetPath))} because it already exists. Use ${highlighter.info("--override")} to replace it.`);
1218
+ continue;
1219
+ }
1220
+ await fsExtra.ensureDir(path.dirname(targetPath));
1221
+ await fsExtra.writeFile(targetPath, file.content, "utf8");
1222
+ logger.success(`Created ${highlighter.info(path.relative(cwd, targetPath))} from preset component ${highlighter.info(item.name)}.`);
1223
+ }
1055
1224
  }
1056
1225
  //#endregion
1057
1226
  //#region src/commands/init.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sprawlify",
3
- "version": "0.0.99",
3
+ "version": "0.0.100",
4
4
  "type": "module",
5
5
  "description": "A command-line interface for Sprawlify.",
6
6
  "author": "sprawlify <npm@sprawlify.com>",