Skip to content

Commit 60e6cde

Browse files
committed
refactor: move metadata to web-components package
1 parent 8120f42 commit 60e6cde

File tree

7 files changed

+51
-68
lines changed

7 files changed

+51
-68
lines changed

.gitignore

+4
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,7 @@ test-results/
7575
playwright-report/
7676
blob-report/
7777
playwright/.cache/
78+
79+
# Web components metadata
80+
packages/web-components/components-metadata.json
81+
packages/web-components/custom-elements.json

docs/components/[component].paths.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ export default {
1616

1717
const docsDir = path.resolve(dirname, "..");
1818
const workspaceDir = path.join(docsDir, "..");
19-
const distDir = path.join(workspaceDir, "dist");
20-
const metadataFile = path.join(distDir, "components-metadata.json");
19+
const metadataFile = path.join(workspaceDir, "packages/web-components/components-metadata.json");
2120

2221
const metadata = JSON.parse(
2322
fs.readFileSync(metadataFile).toString(),

docs/sidebar.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ import { type Metadata } from "../types/docs.ts";
77
const { dirname } = getFileMeta(import.meta.url);
88

99
const workspaceDir = path.join(dirname, "..");
10-
const distDir = path.join(workspaceDir, "dist");
11-
const metadataFile = path.join(distDir, "components-metadata.json");
10+
const metadataFile = path.join(workspaceDir, "packages/web-components/components-metadata.json");
1211

1312
const getSidebarItems = (): DefaultTheme.Sidebar => {
1413
return (

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
"docs:dev": "run-s gen:metadata docs:vitepress:dev",
4141
"docs:build": "run-s gen:metadata docs:vitepress:build",
4242
"docs:preview": "run-s docs:vitepress:preview",
43-
"gen:metadata": "tsx ./scripts/generate-metadata.ts"
43+
"gen:metadata": "pnpm --filter @tapsioss/web-components run gen:metadata"
4444
},
4545
"devDependencies": {
4646
"@custom-elements-manifest/analyzer": "^0.10.2",

packages/react-components/scripts/generate.ts

+2-7
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,13 @@ const LIT_REACT_NAMESPACE = "LitReact";
1919
const { dirname } = getFileMeta(import.meta.url);
2020

2121
const packageDir = path.resolve(dirname, "..");
22-
const workspaceDir = path.resolve(packageDir, "../../");
2322
const srcDir = path.join(packageDir, "src");
2423
const templatesDir = path.join(packageDir, "templates");
2524

2625
const barrelFilePath = path.join(srcDir, "index.ts");
27-
const metadataGeneratorPath = path.join(
28-
workspaceDir,
29-
"scripts/generate-metadata.ts",
30-
);
3126

3227
const componentTemplatePath = path.join(templatesDir, "component.txt");
33-
const metadataPath = path.join(workspaceDir, "dist/components-metadata.json");
28+
const metadataPath = path.resolve(packageDir, "../web-components/components-metadata.json");
3429

3530
const START_COMMENT = "/* START: AUTO-GENERATED [DO_NOT_REMOVE] */";
3631
const END_COMMENT = "/* END: AUTO-GENERATED [DO_NOT_REMOVE] */";
@@ -203,7 +198,7 @@ const transformToComponentModule = new Transform({
203198
void (async () => {
204199
console.time("generate");
205200
const { stdout, stderr } = await asyncExec(
206-
["tsx", metadataGeneratorPath].join(" "),
201+
"pnpm --filter @tapsioss/web-components run gen:metadata",
207202
);
208203

209204
if (stderr) console.error(stderr);

packages/web-components/package.json

+8-6
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
"version": "0.8.0",
44
"type": "module",
55
"files": [
6-
"./dist/**/*.js",
7-
"./dist/**/*.d.ts",
8-
"./dist/**/package.json"
6+
"./dist",
7+
"custom-elements.json"
98
],
109
"exports": {
1110
"./*": {
@@ -16,11 +15,13 @@
1615
"scripts": {
1716
"clear": "shx rm -rf dist",
1817
"prebuild": "pnpm run clear",
19-
"build": "tsc --project ./tsconfig.build.json",
18+
"build": "run-p gen:metadata bulld:compile",
19+
"bulld:compile": "tsc --project ./tsconfig.build.json",
2020
"predev": "pnpm run clear",
2121
"test": "playwright test",
2222
"dev": "tsc --watch --project ./tsconfig.dev.json",
23-
"release": "pnpm publish . --tag latest --access public"
23+
"release": "pnpm publish . --tag latest --access public",
24+
"gen:metadata": "tsx scripts/generate-metadata.ts"
2425
},
2526
"dependencies": {
2627
"@floating-ui/dom": "^1.6.11",
@@ -30,5 +31,6 @@
3031
},
3132
"devDependencies": {
3233
"@internals/test-helpers": "workspace:*"
33-
}
34+
},
35+
"customElements": "custom-elements.json"
3436
}

scripts/generate-metadata.ts packages/web-components/scripts/generate-metadata.ts

+34-50
Original file line numberDiff line numberDiff line change
@@ -7,73 +7,47 @@ import {
77
import { exec } from "node:child_process";
88
import * as fs from "node:fs";
99
import * as path from "node:path";
10-
import { cwd } from "node:process";
1110
import { promisify } from "node:util";
1211
import { type DefaultTheme } from "vitepress";
13-
import type { Component, ImportPaths } from "../types/docs.ts";
14-
import { getFileMeta } from "./utils.ts";
12+
import { getFileMeta } from "../../../scripts/utils.ts";
13+
import type { Component, ImportPaths, Metadata } from "../../../types/docs.ts";
1514

1615
const asyncExec = promisify(exec);
1716

1817
const { dirname } = getFileMeta(import.meta.url);
19-
const workspaceDir = path.resolve(dirname, "..");
20-
const webComponentsSrcDir = path.join(
21-
workspaceDir,
22-
"packages/web-components/src",
23-
);
18+
const packageDir = path.join(dirname, "..");
19+
const packageSrcDir = path.join(packageDir, "src");
2420

25-
const workspaceDistDir = path.join(workspaceDir, "dist");
26-
const metadataFile = path.join(workspaceDistDir, "components-metadata.json");
21+
const metadataFile = path.join(packageDir, "components-metadata.json");
2722

2823
const generateCem = async (): Promise<Package> => {
29-
const entrypoint = path.resolve(
30-
workspaceDir,
31-
"./packages/web-components/src",
32-
);
33-
34-
const distDir = path.relative(cwd(), path.join(workspaceDir, "dist"));
35-
3624
const globs: string[] = [
37-
`${entrypoint}/**/index.ts`,
38-
`${entrypoint}/**/*/index.ts`,
39-
`!${entrypoint}/utils/**`,
40-
`!${entrypoint}/internals/**`,
25+
`${packageSrcDir}/**/index.ts`,
26+
`${packageSrcDir}/**/*/index.ts`,
27+
`!${packageSrcDir}/utils/**`,
28+
`!${packageSrcDir}/internals/**`,
4129
];
4230

43-
await asyncExec(`shx rm -rf ${distDir}`);
4431
const { stderr: cemAnalyzeStderr, stdout: cemAnalyzeStdout } =
4532
await asyncExec(
4633
[
4734
"cem",
4835
"analyze",
4936
"--litelement",
50-
"--outdir",
51-
distDir,
37+
"--packagejson",
5238
globs.map(g => `--globs ${g}`).join(" "),
5339
].join(" "),
5440
);
5541

5642
if (cemAnalyzeStdout) console.log(cemAnalyzeStdout);
5743
if (cemAnalyzeStderr) console.error(cemAnalyzeStderr);
5844

59-
const cemFile = path.join(workspaceDistDir, "custom-elements.json");
45+
const cemFile = path.join(packageDir, "custom-elements.json");
6046

6147
return JSON.parse(fs.readFileSync(cemFile, "utf8")) as Package;
6248
};
6349

64-
const getKebabCaseComponentName = (component: Declaration) => {
65-
if (!("tagName" in component) || !component.tagName) return null;
66-
67-
const tagName = component.tagName;
68-
69-
return tagName.replace("tapsi-", "");
70-
};
71-
72-
void (async () => {
73-
console.log("🧩 generating metadata...");
74-
75-
const cem = await generateCem();
76-
50+
const generateMetadataFromCem = async (cem: Package): Promise<Metadata> => {
7751
const sidebarItemsMap: Record<string, DefaultTheme.SidebarItem> = {};
7852
const components: Component[] = [];
7953

@@ -89,7 +63,7 @@ void (async () => {
8963
filteredModules.forEach(module => {
9064
const moduleSrc = module.path;
9165
const moduleDir = path.dirname(moduleSrc);
92-
const relativePath = path.relative(webComponentsSrcDir, moduleDir);
66+
const relativePath = path.relative(packageSrcDir, moduleDir);
9367

9468
if (!relativePath) return;
9569

@@ -199,17 +173,27 @@ void (async () => {
199173

200174
const sidebarItems = [iconsSidebarItem, componentSidebarItems];
201175

202-
fs.writeFileSync(
203-
metadataFile,
204-
JSON.stringify(
205-
{
206-
components,
207-
sidebarItems,
208-
},
209-
null,
210-
2,
211-
),
212-
);
176+
return {
177+
sidebarItems,
178+
components,
179+
};
180+
};
181+
182+
const getKebabCaseComponentName = (component: Declaration) => {
183+
if (!("tagName" in component) || !component.tagName) return null;
184+
185+
const tagName = component.tagName;
186+
187+
return tagName.replace("tapsi-", "");
188+
};
189+
190+
void (async () => {
191+
console.log("🧩 generating metadata...");
192+
193+
const cem = await generateCem();
194+
const metadata = await generateMetadataFromCem(cem);
195+
196+
fs.writeFileSync(metadataFile, JSON.stringify(metadata, null, 2));
213197

214198
console.log("✅ docs metadata generated.");
215199
})();

0 commit comments

Comments
 (0)