components-differ 1.0.6 → 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.
- package/README.md +8 -0
- package/dist/components.d.ts +6 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/components.js +106 -0
- package/dist/components.js.map +1 -0
- package/dist/create-diff.d.ts +14 -0
- package/dist/create-diff.d.ts.map +1 -0
- package/dist/create-diff.js +61 -0
- package/dist/create-diff.js.map +1 -0
- package/dist/git.d.ts +5 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +120 -0
- package/dist/git.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +103 -0
- package/dist/index.js.map +1 -0
- package/dist/parse-file-path.d.ts +3 -0
- package/dist/parse-file-path.d.ts.map +1 -0
- package/dist/parse-file-path.js +36 -0
- package/dist/parse-file-path.js.map +1 -0
- package/dist/types.d.ts +34 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +18 -7
- package/index.mjs +0 -114
- package/src/components.mjs +0 -98
- package/src/create-diff.mjs +0 -91
- package/src/git.mjs +0 -141
- package/src/parse-file-path.mjs +0 -32
- package/tests/fixtures/non-src-dir/app/page.tsx +0 -1
- package/tests/fixtures/non-src-dir/components/comp.tsx +0 -1
- package/tests/fixtures/non-src-dir/components/ui/new-ui-comp.tsx +0 -1
- package/tests/fixtures/non-src-dir/components/ui/select.tsx +0 -1
- package/tests/fixtures/non-src-dir/components.json +0 -20
- package/tests/fixtures/non-src-dir/hooks/hook.ts +0 -1
- package/tests/fixtures/non-src-dir/lib/lib.ts +0 -1
- package/tests/fixtures/non-src-dir/non-src-sub/test.ts +0 -1
- package/tests/fixtures/non-src-dir/package.json +0 -42
- package/tests/fixtures/src-dir/components.json +0 -20
- package/tests/fixtures/src-dir/non-src-sub/test.ts +0 -1
- package/tests/fixtures/src-dir/package.json +0 -42
- package/tests/fixtures/src-dir/src/app/page.tsx +0 -1
- package/tests/fixtures/src-dir/src/components/comp.tsx +0 -1
- package/tests/fixtures/src-dir/src/components/ui/new-ui-comp.tsx +0 -1
- package/tests/fixtures/src-dir/src/components/ui/select.tsx +0 -1
- package/tests/fixtures/src-dir/src/hooks/hook.ts +0 -1
- package/tests/fixtures/src-dir/src/lib/lib.ts +0 -1
- package/tests/tests/__snapshots__/test-fixtures.spec.mjs.snap +0 -129
- package/tests/tests/parse-file-path.spec.mjs +0 -105
- 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":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAIzB,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,WAAW;IACX,OAAO;IACP,cAAc;IACd,cAAc;IACd,QAAQ;IACR,OAAO;IACP,YAAY;IACZ,QAAQ;IACR,UAAU;IACV,MAAM;IACN,UAAU;IACV,OAAO;IACP,UAAU;IACV,aAAa;IACb,SAAS;IACT,cAAc;IACd,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,eAAe;IACf,MAAM;IACN,YAAY;IACZ,OAAO;IACP,WAAW;IACX,OAAO;IACP,SAAS;IACT,iBAAiB;IACjB,YAAY;IACZ,SAAS;IACT,UAAU;IACV,aAAa;IACb,WAAW;IACX,aAAa;IACb,QAAQ;IACR,WAAW;IACX,OAAO;IACP,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,UAAU;IACV,OAAO;IACP,QAAQ;IACR,cAAc;IACd,SAAS;CACV,CAAC,CAAC;AAEH,SAAS,YAAY,CAAC,MAAwB,EAAE,GAA2B;IACzE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,QAAQ,EAAE,8BAA8B,CAAC,CAAC;IACrF,CAAC;IAED,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAwB,EAAE,aAA0B;IACrF,MAAM,oBAAoB,GAAa,EAAE,CAAC;IAC1C,MAAM,kBAAkB,GAAG,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEtD,KAAK,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,aAAa,EAAE,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC7C,SAAS;QACX,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;YACjD,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACpD,IAAI,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAuC,CAAC;IAEhE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAwB;IACtD,OAAO;QACL,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9B,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;KAC/B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAwB,EAAE,QAAgB;IAC3E,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtE,OAAO,sBAAsB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -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
|
package/dist/git.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"description": "Simple CLI to create Shadcn components from project",
|
|
5
|
-
"
|
|
6
|
-
"
|
|
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
|
-
"ignore": "^
|
|
16
|
+
"commander": "^14.0.2",
|
|
17
|
+
"ignore": "^7.0.5"
|
|
13
18
|
},
|
|
14
19
|
"devDependencies": {
|
|
15
|
-
"
|
|
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
|
-
"
|
|
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",
|