components-differ 1.0.7 → 1.0.8

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 (52) hide show
  1. package/README.md +8 -0
  2. package/dist/components.d.ts +6 -0
  3. package/dist/components.d.ts.map +1 -0
  4. package/dist/components.js +106 -0
  5. package/dist/components.js.map +1 -0
  6. package/dist/create-diff.d.ts +14 -0
  7. package/dist/create-diff.d.ts.map +1 -0
  8. package/dist/create-diff.js +61 -0
  9. package/dist/create-diff.js.map +1 -0
  10. package/dist/git.d.ts +5 -0
  11. package/dist/git.d.ts.map +1 -0
  12. package/dist/git.js +120 -0
  13. package/dist/git.js.map +1 -0
  14. package/dist/index.d.ts +3 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +103 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/parse-file-path.d.ts +3 -0
  19. package/dist/parse-file-path.d.ts.map +1 -0
  20. package/dist/parse-file-path.js +36 -0
  21. package/dist/parse-file-path.js.map +1 -0
  22. package/dist/types.d.ts +34 -0
  23. package/dist/types.d.ts.map +1 -0
  24. package/dist/types.js +2 -0
  25. package/dist/types.js.map +1 -0
  26. package/package.json +18 -7
  27. package/index.mjs +0 -114
  28. package/src/components.mjs +0 -98
  29. package/src/create-diff.mjs +0 -91
  30. package/src/git.mjs +0 -141
  31. package/src/parse-file-path.mjs +0 -32
  32. package/tests/fixtures/non-src-dir/app/page.tsx +0 -1
  33. package/tests/fixtures/non-src-dir/components/comp.tsx +0 -1
  34. package/tests/fixtures/non-src-dir/components/ui/new-ui-comp.tsx +0 -1
  35. package/tests/fixtures/non-src-dir/components/ui/select.tsx +0 -1
  36. package/tests/fixtures/non-src-dir/components.json +0 -20
  37. package/tests/fixtures/non-src-dir/hooks/hook.ts +0 -1
  38. package/tests/fixtures/non-src-dir/lib/lib.ts +0 -1
  39. package/tests/fixtures/non-src-dir/non-src-sub/test.ts +0 -1
  40. package/tests/fixtures/non-src-dir/package.json +0 -42
  41. package/tests/fixtures/src-dir/components.json +0 -20
  42. package/tests/fixtures/src-dir/non-src-sub/test.ts +0 -1
  43. package/tests/fixtures/src-dir/package.json +0 -42
  44. package/tests/fixtures/src-dir/src/app/page.tsx +0 -1
  45. package/tests/fixtures/src-dir/src/components/comp.tsx +0 -1
  46. package/tests/fixtures/src-dir/src/components/ui/new-ui-comp.tsx +0 -1
  47. package/tests/fixtures/src-dir/src/components/ui/select.tsx +0 -1
  48. package/tests/fixtures/src-dir/src/hooks/hook.ts +0 -1
  49. package/tests/fixtures/src-dir/src/lib/lib.ts +0 -1
  50. package/tests/tests/__snapshots__/test-fixtures.spec.mjs.snap +0 -129
  51. package/tests/tests/parse-file-path.spec.mjs +0 -105
  52. package/tests/tests/test-fixtures.spec.mjs +0 -86
package/README.md CHANGED
@@ -29,3 +29,11 @@ npx shadcn@latest add http://your-json-output-url
29
29
  # Why is this useful?
30
30
 
31
31
  This allows library maintainers or SaaS services to create a one step installer for their library or service into an existing project, or to bootstrap a new project with the library or service.
32
+
33
+ ## Development
34
+
35
+ - `pnpm install` – install dependencies.
36
+ - `pnpm build` – compile the TypeScript sources to `dist/`.
37
+ - `pnpm test` or `pnpm test:watch` – run the Vitest suite.
38
+
39
+ The published package ships the compiled JavaScript from `dist/`. During local development you can run the CLI with `pnpm build && node dist/index.js ...` or by linking the package.
@@ -0,0 +1,6 @@
1
+ import type { ComponentsConfig, FileEntry } from "./types.js";
2
+ export declare function findComponentFiles(config: ComponentsConfig, originalFiles: FileEntry[]): string[];
3
+ export declare function readComponentsManifest(dir: string): ComponentsConfig;
4
+ export declare function getAliasedPaths(config: ComponentsConfig): string[];
5
+ export declare function isBuiltinComponent(config: ComponentsConfig, filePath: string): boolean;
6
+ //# sourceMappingURL=components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA4D9D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAoBjG;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAepE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAQlE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQtF"}
@@ -0,0 +1,106 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs";
3
+ const WHITELISTED_COMPONENTS = new Set([
4
+ "accordion",
5
+ "alert",
6
+ "alert-dialog",
7
+ "aspect-ratio",
8
+ "avatar",
9
+ "badge",
10
+ "breadcrumb",
11
+ "button",
12
+ "calendar",
13
+ "card",
14
+ "carousel",
15
+ "chart",
16
+ "checkbox",
17
+ "collapsible",
18
+ "command",
19
+ "context-menu",
20
+ "table",
21
+ "dialog",
22
+ "drawer",
23
+ "dropdown-menu",
24
+ "form",
25
+ "hover-card",
26
+ "input",
27
+ "input-otp",
28
+ "label",
29
+ "menubar",
30
+ "navigation-menu",
31
+ "pagination",
32
+ "popover",
33
+ "progress",
34
+ "radio-group",
35
+ "resizable",
36
+ "scroll-area",
37
+ "select",
38
+ "separator",
39
+ "sheet",
40
+ "skeleton",
41
+ "slider",
42
+ "sonner",
43
+ "switch",
44
+ "tabs",
45
+ "textarea",
46
+ "toast",
47
+ "toggle",
48
+ "toggle-group",
49
+ "tooltip",
50
+ ]);
51
+ function resolveAlias(config, key) {
52
+ const alias = config[key];
53
+ if (typeof alias !== "string") {
54
+ throw new Error(`Missing alias for ${key.toString()} in components configuration`);
55
+ }
56
+ return alias.replace("@/", config.isSrcDir ? "src/" : "");
57
+ }
58
+ export function findComponentFiles(config, originalFiles) {
59
+ const registryDependencies = [];
60
+ const componentDirectory = resolveAlias(config, "ui");
61
+ for (const { path: filePath } of originalFiles) {
62
+ if (!filePath.startsWith(componentDirectory)) {
63
+ continue;
64
+ }
65
+ const extension = path.extname(filePath);
66
+ if (extension !== ".tsx" && extension !== ".jsx") {
67
+ continue;
68
+ }
69
+ const fileName = path.basename(filePath, extension);
70
+ if (WHITELISTED_COMPONENTS.has(fileName)) {
71
+ registryDependencies.push(fileName);
72
+ }
73
+ }
74
+ return registryDependencies;
75
+ }
76
+ export function readComponentsManifest(dir) {
77
+ const manifestPath = path.join(dir, "./components.json");
78
+ if (!fs.existsSync(manifestPath)) {
79
+ throw new Error("Components manifest not found");
80
+ }
81
+ const contents = fs.readFileSync(manifestPath, "utf-8");
82
+ const manifest = JSON.parse(contents);
83
+ const config = manifest.aliases;
84
+ if (!config) {
85
+ throw new Error("Invalid components manifest format: missing aliases");
86
+ }
87
+ return config;
88
+ }
89
+ export function getAliasedPaths(config) {
90
+ return [
91
+ config.components.replace("@/", ""),
92
+ config.utils.replace("@/", ""),
93
+ config.ui.replace("@/", ""),
94
+ config.lib.replace("@/", ""),
95
+ config.hooks.replace("@/", ""),
96
+ ];
97
+ }
98
+ export function isBuiltinComponent(config, filePath) {
99
+ const uiDirectory = config.ui.replace("@/", "");
100
+ if (!filePath.startsWith(uiDirectory)) {
101
+ return false;
102
+ }
103
+ const componentName = path.basename(filePath, path.extname(filePath));
104
+ return WHITELISTED_COMPONENTS.has(componentName);
105
+ }
106
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ComponentsConfig, DiffResult, FileEntry } from "./types.js";
2
+ interface CreateDiffParams {
3
+ name: string;
4
+ config: ComponentsConfig & {
5
+ isSrcDir: boolean;
6
+ };
7
+ alteredFiles: FileEntry[];
8
+ specificFiles: Record<string, string>;
9
+ currentFiles: FileEntry[];
10
+ currentPackageJson: string;
11
+ }
12
+ export declare function createDiff({ name, config, alteredFiles, specificFiles, currentFiles, currentPackageJson, }: CreateDiffParams): DiffResult;
13
+ export {};
14
+ //# sourceMappingURL=create-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-diff.d.ts","sourceRoot":"","sources":["../src/create-diff.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE1E,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,gBAAgB,GAAG;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;IACjD,YAAY,EAAE,SAAS,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,YAAY,EAAE,SAAS,EAAE,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAyDD,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,MAAM,EACN,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,kBAAkB,GACnB,EAAE,gBAAgB,GAAG,UAAU,CAwB/B"}
@@ -0,0 +1,61 @@
1
+ import { findComponentFiles, getAliasedPaths, isBuiltinComponent } from "./components.js";
2
+ import { parseFilePath } from "./parse-file-path.js";
3
+ function addFile(output, config, inSrcDir, relativeFilePath, content) {
4
+ if (isBuiltinComponent(config, relativeFilePath)) {
5
+ return;
6
+ }
7
+ output.files.push(parseFilePath(inSrcDir, config, `./${relativeFilePath}`, content));
8
+ }
9
+ function addDependencies(output, initialPackageContents, currentPackageContents) {
10
+ const initialPackageJson = initialPackageContents ? JSON.parse(initialPackageContents) : {};
11
+ const currentPackageJson = JSON.parse(currentPackageContents);
12
+ const initialDependencies = (initialPackageJson.dependencies ?? {});
13
+ const initialDevDependencies = (initialPackageJson.devDependencies ?? {});
14
+ const currentDependencies = (currentPackageJson.dependencies ?? {});
15
+ const currentDevDependencies = (currentPackageJson.devDependencies ?? {});
16
+ output.dependencies = Object.keys(currentDependencies).filter((dep) => !(dep in initialDependencies));
17
+ output.devDependencies = Object.keys(currentDevDependencies).filter((dep) => !(dep in initialDevDependencies));
18
+ }
19
+ function scanWithSrcDir(output, config, alteredFiles) {
20
+ for (const { path, content } of alteredFiles) {
21
+ if (path.startsWith("src/")) {
22
+ addFile(output, config, true, path.replace(/^src\//, ""), content);
23
+ }
24
+ else {
25
+ addFile(output, config, false, path, content);
26
+ }
27
+ }
28
+ }
29
+ function isInAppDir(filePath) {
30
+ return filePath.startsWith("app/");
31
+ }
32
+ function scanWithoutSrcDir(output, config, alteredFiles) {
33
+ const aliasedPaths = new Set(getAliasedPaths(config));
34
+ for (const { path, content } of alteredFiles) {
35
+ const inSrcDir = aliasedPaths.has(path) || isInAppDir(path);
36
+ addFile(output, config, inSrcDir, path, content);
37
+ }
38
+ }
39
+ export function createDiff({ name, config, alteredFiles, specificFiles, currentFiles, currentPackageJson, }) {
40
+ const output = {
41
+ name,
42
+ type: "registry:block",
43
+ dependencies: [],
44
+ devDependencies: [],
45
+ registryDependencies: [],
46
+ files: [],
47
+ tailwind: {},
48
+ cssVars: {},
49
+ meta: {},
50
+ };
51
+ if (config.isSrcDir) {
52
+ scanWithSrcDir(output, config, alteredFiles);
53
+ }
54
+ else {
55
+ scanWithoutSrcDir(output, config, alteredFiles);
56
+ }
57
+ output.registryDependencies = findComponentFiles(config, currentFiles);
58
+ addDependencies(output, specificFiles["./package.json"], currentPackageJson);
59
+ return output;
60
+ }
61
+ //# sourceMappingURL=create-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-diff.js","sourceRoot":"","sources":["../src/create-diff.ts"],"names":[],"mappings":"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"}
package/dist/git.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import type { AlteredFilesResult, FileEntry } from "./types.js";
2
+ export declare function scanForFiles(startDir: string, checkFile?: boolean): FileEntry[];
3
+ export declare function scanForAlteredFiles(specificFilesToReturn?: string[]): AlteredFilesResult;
4
+ export declare function hasSrcDir(dir: string): boolean;
5
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAuEhE,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,UAAQ,GAAG,SAAS,EAAE,CA4C7E;AAED,wBAAgB,mBAAmB,CAAC,qBAAqB,GAAE,MAAM,EAAO,GAAG,kBAAkB,CAmB5F;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9C"}
package/dist/git.js ADDED
@@ -0,0 +1,120 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { execSync } from "node:child_process";
4
+ import ignore from "ignore";
5
+ const INITIAL_DIR = "_initial";
6
+ const EXCLUDE_DIRS = new Set([
7
+ "node_modules",
8
+ "dist",
9
+ "fonts",
10
+ "build",
11
+ "public",
12
+ "static",
13
+ ".next",
14
+ ".git",
15
+ INITIAL_DIR,
16
+ ]);
17
+ const EXCLUDE_FILES = new Set([
18
+ ".DS_Store",
19
+ "next-env.d.ts",
20
+ "package-lock.json",
21
+ "yarn.lock",
22
+ "pnpm-lock.yaml",
23
+ "bun.lockb",
24
+ "package.json",
25
+ "tailwind.config.ts",
26
+ "tailwind.config.js",
27
+ "components.json",
28
+ "favicon.ico",
29
+ ]);
30
+ function cloneInitialCommit() {
31
+ deleteInitialDir();
32
+ try {
33
+ const initialCommit = execSync("git rev-list --max-parents=0 HEAD").toString().trim();
34
+ execSync(`git worktree add -f ${INITIAL_DIR} ${initialCommit}`, { stdio: "ignore" });
35
+ }
36
+ catch (error) {
37
+ const message = error instanceof Error ? error.message : String(error);
38
+ console.error("Error cloning initial commit:", message);
39
+ process.exit(1);
40
+ }
41
+ }
42
+ function deleteInitialDir() {
43
+ if (!fs.existsSync(INITIAL_DIR)) {
44
+ return;
45
+ }
46
+ fs.rmSync(INITIAL_DIR, { recursive: true, force: true });
47
+ try {
48
+ execSync("git worktree prune", { stdio: "ignore" });
49
+ }
50
+ catch (error) {
51
+ const message = error instanceof Error ? error.message : String(error);
52
+ console.error("Error pruning git worktree:", message);
53
+ }
54
+ }
55
+ function checkIfFileIsChanged(relativeFilePath) {
56
+ const initialFilePath = path.join(INITIAL_DIR, relativeFilePath);
57
+ const fullPath = path.join(process.cwd(), relativeFilePath);
58
+ if (!fs.existsSync(initialFilePath)) {
59
+ return true;
60
+ }
61
+ const currentContent = fs.readFileSync(fullPath, "utf-8");
62
+ const initialContent = fs.readFileSync(initialFilePath, "utf-8");
63
+ return currentContent !== initialContent;
64
+ }
65
+ export function scanForFiles(startDir, checkFile = false) {
66
+ const foundFiles = [];
67
+ let ignorer;
68
+ const gitignorePath = path.join(startDir, ".gitignore");
69
+ if (fs.existsSync(gitignorePath)) {
70
+ const gitIgnore = ignore().add(fs.readFileSync(gitignorePath).toString());
71
+ ignorer = (relativeFilePath) => gitIgnore.ignores(relativeFilePath);
72
+ }
73
+ function scanDirectory(dir, relativePath = "") {
74
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
75
+ for (const entry of entries) {
76
+ const fullPath = path.join(dir, entry.name);
77
+ const relativeFilePath = path.join(relativePath, entry.name);
78
+ if (entry.isDirectory()) {
79
+ if (!EXCLUDE_DIRS.has(entry.name)) {
80
+ scanDirectory(fullPath, relativeFilePath);
81
+ }
82
+ continue;
83
+ }
84
+ if (EXCLUDE_FILES.has(entry.name)) {
85
+ continue;
86
+ }
87
+ if (ignorer?.(relativeFilePath)) {
88
+ continue;
89
+ }
90
+ if (!checkFile || checkIfFileIsChanged(relativeFilePath)) {
91
+ foundFiles.push({
92
+ path: relativeFilePath,
93
+ content: fs.readFileSync(fullPath, "utf-8"),
94
+ });
95
+ }
96
+ }
97
+ }
98
+ scanDirectory(startDir);
99
+ return foundFiles;
100
+ }
101
+ export function scanForAlteredFiles(specificFilesToReturn = []) {
102
+ cloneInitialCommit();
103
+ const alteredFiles = scanForFiles(process.cwd(), true);
104
+ const specificFiles = specificFilesToReturn.reduce((acc, file) => {
105
+ const fullPath = path.join(process.cwd(), INITIAL_DIR, file);
106
+ if (fs.existsSync(fullPath)) {
107
+ acc[file] = fs.readFileSync(fullPath, "utf-8");
108
+ }
109
+ return acc;
110
+ }, {});
111
+ deleteInitialDir();
112
+ return {
113
+ alteredFiles,
114
+ specificFiles,
115
+ };
116
+ }
117
+ export function hasSrcDir(dir) {
118
+ return fs.existsSync(path.join(dir, "src"));
119
+ }
120
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,MAAM,MAAM,QAAQ,CAAC;AAI5B,MAAM,WAAW,GAAG,UAAU,CAAC;AAE/B,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,cAAc;IACd,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;IACN,WAAW;CACZ,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,WAAW;IACX,eAAe;IACf,mBAAmB;IACnB,WAAW;IACX,gBAAgB;IAChB,WAAW;IACX,cAAc;IACd,oBAAoB;IACpB,oBAAoB;IACpB,iBAAiB;IACjB,aAAa;CACd,CAAC,CAAC;AAEH,SAAS,kBAAkB;IACzB,gBAAgB,EAAE,CAAC;IAEnB,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,QAAQ,CAAC,mCAAmC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QACtF,QAAQ,CAAC,uBAAuB,WAAW,IAAI,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,OAAO,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB;IACvB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IAED,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzD,IAAI,CAAC;QACH,QAAQ,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,gBAAwB;IACpD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAE5D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACjE,OAAO,cAAc,KAAK,cAAc,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,SAAS,GAAG,KAAK;IAC9D,MAAM,UAAU,GAAgB,EAAE,CAAC;IAEnC,IAAI,OAA4D,CAAC;IACjE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAExD,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1E,OAAO,GAAG,CAAC,gBAAgB,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtE,CAAC;IAED,SAAS,aAAa,CAAC,GAAW,EAAE,YAAY,GAAG,EAAE;QACnD,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAE7D,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClC,aAAa,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;gBAC5C,CAAC;gBACD,SAAS;YACX,CAAC;YAED,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,SAAS;YACX,CAAC;YAED,IAAI,OAAO,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAChC,SAAS;YACX,CAAC;YAED,IAAI,CAAC,SAAS,IAAI,oBAAoB,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACzD,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC;iBAC5C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,aAAa,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,wBAAkC,EAAE;IACtE,kBAAkB,EAAE,CAAC;IAErB,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAEvD,MAAM,aAAa,GAAG,qBAAqB,CAAC,MAAM,CAAyB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACvF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QAC7D,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,gBAAgB,EAAE,CAAC;IAEnB,OAAO;QACL,YAAY;QACZ,aAAa;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { execSync } from "node:child_process";
5
+ import { program } from "commander";
6
+ import { scanForAlteredFiles, scanForFiles, hasSrcDir } from "./git.js";
7
+ import { readComponentsManifest } from "./components.js";
8
+ import { createDiff } from "./create-diff.js";
9
+ program.option("-n, --name <name>", "Name of the component set to diff");
10
+ program.option("--init", "Initialise a git repository for the current directory");
11
+ program.parse();
12
+ const options = program.opts();
13
+ function runCommand(command) {
14
+ try {
15
+ execSync(command, { stdio: "inherit" });
16
+ }
17
+ catch (error) {
18
+ console.error(`Failed to execute command: ${command}`);
19
+ process.exit(1);
20
+ }
21
+ }
22
+ function ensureGitignore() {
23
+ const gitignorePath = path.join(process.cwd(), ".gitignore");
24
+ if (fs.existsSync(gitignorePath)) {
25
+ console.log(".gitignore file already exists.");
26
+ return;
27
+ }
28
+ console.log(".gitignore file is missing. Creating one...");
29
+ const content = `
30
+ /node_modules
31
+ /.pnp
32
+ .pnp.*
33
+ .yarn/*
34
+ !.yarn/patches
35
+ !.yarn/plugins
36
+ !.yarn/releases
37
+ !.yarn/versions
38
+
39
+ # testing
40
+ /coverage
41
+
42
+ # next.js
43
+ /.next/
44
+ /out/
45
+
46
+ # production
47
+ /build
48
+
49
+ # misc
50
+ .DS_Store
51
+ *.pem
52
+
53
+ # debug
54
+ npm-debug.log*
55
+ yarn-debug.log*
56
+ yarn-error.log*
57
+
58
+ # env files (can opt-in for committing if needed)
59
+ .env*
60
+
61
+ # vercel
62
+ .vercel
63
+
64
+ # typescript
65
+ *.tsbuildinfo
66
+ next-env.d.ts
67
+ `.trimStart();
68
+ fs.writeFileSync(gitignorePath, content, "utf8");
69
+ console.log(".gitignore file created with default rules.");
70
+ }
71
+ function initRepository() {
72
+ console.log("Initializing git repository for new component");
73
+ if (process.platform === "win32") {
74
+ runCommand('rmdir /s /q .git && git init && git add . && git commit -m "Initial commit"');
75
+ }
76
+ else {
77
+ runCommand('rm -fr .git && git init && git add . && git commit -m "Initial commit"');
78
+ }
79
+ ensureGitignore();
80
+ }
81
+ function main() {
82
+ if (options.init) {
83
+ initRepository();
84
+ return;
85
+ }
86
+ const name = options.name ?? path.basename(process.cwd());
87
+ const { alteredFiles, specificFiles } = scanForAlteredFiles(["./package.json"]);
88
+ const currentFiles = scanForFiles(process.cwd());
89
+ const currentPackageJson = fs.readFileSync("./package.json", "utf-8");
90
+ const config = readComponentsManifest(process.cwd());
91
+ config.isSrcDir = hasSrcDir(process.cwd());
92
+ const output = createDiff({
93
+ name,
94
+ config: config,
95
+ alteredFiles,
96
+ specificFiles,
97
+ currentFiles,
98
+ currentPackageJson,
99
+ });
100
+ console.log(JSON.stringify(output, null, 2));
101
+ }
102
+ main();
103
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ComponentsConfig, DiffFile } from "./types.js";
2
+ export declare function parseFilePath(wasInSrcDir: boolean, config: ComponentsConfig, filePath: string, content?: string): DiffFile;
3
+ //# sourceMappingURL=parse-file-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-file-path.d.ts","sourceRoot":"","sources":["../src/parse-file-path.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAc7D,wBAAgB,aAAa,CAC3B,WAAW,EAAE,OAAO,EACpB,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,GACf,QAAQ,CAuBV"}
@@ -0,0 +1,36 @@
1
+ function fixAlias(alias) {
2
+ return alias.replace("@", ".");
3
+ }
4
+ function isWithinAlias(config, filePath, aliasKey) {
5
+ const alias = config[aliasKey];
6
+ if (typeof alias !== "string") {
7
+ return false;
8
+ }
9
+ return filePath.startsWith(fixAlias(alias));
10
+ }
11
+ export function parseFilePath(wasInSrcDir, config, filePath, content) {
12
+ const output = {
13
+ path: filePath,
14
+ content: content ?? "",
15
+ type: "registry:example",
16
+ target: wasInSrcDir ? filePath : `~/${filePath.replace("./", "")}`,
17
+ };
18
+ if (isWithinAlias(config, filePath, "ui")) {
19
+ output.type = "registry:ui";
20
+ output.target = undefined;
21
+ }
22
+ else if (isWithinAlias(config, filePath, "components")) {
23
+ output.type = "registry:block";
24
+ output.target = undefined;
25
+ }
26
+ else if (isWithinAlias(config, filePath, "hooks")) {
27
+ output.type = "registry:hook";
28
+ output.target = undefined;
29
+ }
30
+ else if (isWithinAlias(config, filePath, "lib")) {
31
+ output.type = "registry:lib";
32
+ output.target = undefined;
33
+ }
34
+ return output;
35
+ }
36
+ //# sourceMappingURL=parse-file-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-file-path.js","sourceRoot":"","sources":["../src/parse-file-path.ts"],"names":[],"mappings":"AAEA,SAAS,QAAQ,CAAC,KAAa;IAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,aAAa,CAAC,MAAwB,EAAE,QAAgB,EAAE,QAAgC;IACjG,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,WAAoB,EACpB,MAAwB,EACxB,QAAgB,EAChB,OAAgB;IAEhB,MAAM,MAAM,GAAa;QACvB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,OAAO,IAAI,EAAE;QACtB,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE;KACnE,CAAC;IAEF,IAAI,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,GAAG,aAAa,CAAC;QAC5B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;IAC5B,CAAC;SAAM,IAAI,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC;QACzD,MAAM,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC/B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;IAC5B,CAAC;SAAM,IAAI,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;QACpD,MAAM,CAAC,IAAI,GAAG,eAAe,CAAC;QAC9B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;IAC5B,CAAC;SAAM,IAAI,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,GAAG,cAAc,CAAC;QAC7B,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,34 @@
1
+ export interface ComponentsConfig {
2
+ components: string;
3
+ utils: string;
4
+ ui: string;
5
+ lib: string;
6
+ hooks: string;
7
+ isSrcDir?: boolean;
8
+ }
9
+ export interface FileEntry {
10
+ path: string;
11
+ content: string;
12
+ }
13
+ export interface DiffFile {
14
+ path: string;
15
+ content: string;
16
+ type: "registry:block" | "registry:example" | "registry:ui" | "registry:hook" | "registry:lib";
17
+ target?: string;
18
+ }
19
+ export interface DiffResult {
20
+ name: string;
21
+ type: "registry:block";
22
+ dependencies: string[];
23
+ devDependencies: string[];
24
+ registryDependencies: string[];
25
+ files: DiffFile[];
26
+ tailwind: Record<string, unknown>;
27
+ cssVars: Record<string, unknown>;
28
+ meta: Record<string, unknown>;
29
+ }
30
+ export interface AlteredFilesResult {
31
+ alteredFiles: FileEntry[];
32
+ specificFiles: Record<string, string>;
33
+ }
34
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,gBAAgB,GAAG,kBAAkB,GAAG,aAAa,GAAG,eAAe,GAAG,cAAc,CAAC;IAC/F,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,gBAAgB,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,SAAS,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,21 +1,32 @@
1
1
  {
2
2
  "name": "components-differ",
3
- "version": "1.0.7",
3
+ "version": "1.0.8",
4
4
  "description": "Simple CLI to create Shadcn components from project",
5
- "main": "index.mjs",
6
- "bin": "index.mjs",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": "dist/index.js",
8
+ "types": "dist/index.d.ts",
7
9
  "directories": {
8
10
  "test": "tests"
9
11
  },
12
+ "files": [
13
+ "dist"
14
+ ],
10
15
  "dependencies": {
11
- "commander": "^12.1.0",
12
- "ignore": "^6.0.2"
16
+ "commander": "^14.0.2",
17
+ "ignore": "^7.0.5"
13
18
  },
14
19
  "devDependencies": {
15
- "vitest": "^2.1.1"
20
+ "@types/node": "^22.19.0",
21
+ "tslib": "^2.8.1",
22
+ "typescript": "^5.9.3",
23
+ "vitest": "^4.0.8"
16
24
  },
17
25
  "scripts": {
18
- "test": "npx vitest"
26
+ "build": "tsc --project tsconfig.json",
27
+ "bump": "node scripts/bump-version.mjs",
28
+ "test": "vitest run",
29
+ "test:watch": "vitest"
19
30
  },
20
31
  "repository": {
21
32
  "type": "git",