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.
- package/dist/index.mjs +200 -31
- 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.
|
|
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:
|
|
200
|
+
frameworks: { react: {} }
|
|
201
201
|
},
|
|
202
202
|
monochrome: {
|
|
203
203
|
name: "Monochrome",
|
|
204
|
-
frameworks:
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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.
|
|
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.
|
|
441
|
-
"typescript": "
|
|
442
|
-
"vite": "^8.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.
|
|
679
|
+
"@tailwindcss/vite": "^4.2.2",
|
|
605
680
|
"@types/node": "^24.12.0",
|
|
606
|
-
"tailwindcss": "^4.2.
|
|
607
|
-
"typescript": "
|
|
608
|
-
"vite": "^8.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.
|
|
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.
|
|
773
|
-
"typescript": "
|
|
774
|
-
"vite": "^8.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.
|
|
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.
|
|
929
|
-
"typescript": "
|
|
930
|
-
"vite": "^8.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
|