Skip to content

Commit 12287a0

Browse files
add prepackaging script to auto export components to the index.ts entry point for the package importing for consumers of the package
1 parent 7e56358 commit 12287a0

File tree

3 files changed

+99
-2
lines changed

3 files changed

+99
-2
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
"dev": "vite dev",
1616
"build": "vite build && npm run package",
1717
"preview": "vite preview",
18-
"package": "svelte-kit sync && svelte-package && publint",
18+
"prepackage": "tsx scripts/generate-index.ts",
19+
"package": "npm run prepackage && svelte-kit sync && svelte-package && publint",
1920
"prepublishOnly": "npm run package",
2021
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
2122
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",

scripts/generate-index.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// scripts/generate-index.ts
2+
import { readdirSync, statSync, writeFileSync } from "node:fs";
3+
import { basename, join, relative } from "node:path";
4+
5+
const libDir = "src/lib";
6+
const componentsDir = join(libDir, "components"); // Target only the components directory
7+
const indexFile = join(libDir, "index.ts");
8+
9+
function findSvelteFiles(dir: string): string[] {
10+
let svelteFiles: string[] = [];
11+
const items = readdirSync(dir);
12+
13+
items.forEach((item) => {
14+
const fullPath = join(dir, item);
15+
const stat = statSync(fullPath);
16+
17+
// Ignore node_modules or dist if they somehow end up here
18+
if (item === "node_modules" || item === "dist") {
19+
return;
20+
}
21+
22+
if (stat.isDirectory()) {
23+
// Recursively search in subdirectories
24+
svelteFiles = svelteFiles.concat(findSvelteFiles(fullPath));
25+
} else if (item.endsWith(".svelte")) {
26+
// Path relative to componentsDir
27+
svelteFiles.push(relative(componentsDir, fullPath));
28+
}
29+
});
30+
31+
// Sort to ensure consistent order if duplicates exist
32+
return svelteFiles.sort();
33+
}
34+
35+
// Start the search from componentsDir
36+
const svelteFilesInComponents = findSvelteFiles(componentsDir);
37+
38+
const exportedNames = new Set<string>(); // Keep track of names already exported
39+
40+
const exports = svelteFilesInComponents
41+
.map((filePath) => {
42+
const name = basename(filePath, ".svelte");
43+
44+
// Only export if the name hasn't been used yet
45+
if (!exportedNames.has(name)) {
46+
exportedNames.add(name); // Mark name as used
47+
const importPath = join("components", filePath).replace(/\\\\/g, "/");
48+
return `export { default as ${name} } from './${importPath}';`;
49+
}
50+
return null; // Skip duplicate
51+
})
52+
.filter((line): line is string => line !== null); // Remove null entries
53+
54+
// Write the file only if there are no duplicates
55+
writeFileSync(
56+
indexFile,
57+
`// this file is auto-generated — do not edit by hand\n${exports.join("\n")}\n`,
58+
);
59+
60+
console.log(
61+
`Generated ${indexFile} with ${exports.length} unique exports from ./components. Duplicates were ignored.`,
62+
);

src/lib/index.ts

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,35 @@
1-
// Reexport your entry components here
1+
// this file is auto-generated — do not edit by hand
2+
export { default as InsetText } from './components/content/InsetText.svelte';
3+
export { default as WarningText } from './components/content/WarningText.svelte';
4+
export { default as Axis } from './components/data-vis/axis/Axis.svelte';
5+
export { default as Ticks } from './components/data-vis/axis/Ticks.svelte';
6+
export { default as CategoryLabel } from './components/data-vis/line-chart/CategoryLabel.svelte';
7+
export { default as Line } from './components/data-vis/line-chart/Line.svelte';
8+
export { default as Lines } from './components/data-vis/line-chart/Lines.svelte';
9+
export { default as ValueLabel } from './components/data-vis/line-chart/ValueLabel.svelte';
10+
export { default as Map } from './components/data-vis/map/Map.svelte';
11+
export { default as MapLegend } from './components/data-vis/map/MapLegend.svelte';
12+
export { default as Tooltip } from './components/data-vis/map/Tooltip.svelte';
13+
export { default as Breadcrumbs } from './components/layout/Breadcrumbs.svelte';
14+
export { default as Footer } from './components/layout/Footer.svelte';
15+
export { default as Header } from './components/layout/Header.svelte';
16+
export { default as PhaseBanner } from './components/layout/PhaseBanner.svelte';
17+
export { default as ServiceNavigation } from './components/layout/ServiceNavigation.svelte';
18+
export { default as SideNavigation } from './components/layout/SideNavigation.svelte';
19+
export { default as Accordion } from './components/ui/Accordion.svelte';
20+
export { default as Button } from './components/ui/Button.svelte';
21+
export { default as CheckBox } from './components/ui/CheckBox.svelte';
22+
export { default as ContentsList } from './components/ui/ContentsList.svelte';
23+
export { default as Details } from './components/ui/Details.svelte';
24+
export { default as HeaderNav } from './components/ui/HeaderNav.svelte';
25+
export { default as InternalHeader } from './components/ui/InternalHeader.svelte';
26+
export { default as MobileNav } from './components/ui/MobileNav.svelte';
27+
export { default as NavigationExample } from './components/ui/NavigationExample.svelte';
28+
export { default as NotificationBanner } from './components/ui/NotificationBanner.svelte';
29+
export { default as Radios } from './components/ui/Radios.svelte';
30+
export { default as RelatedContent } from './components/ui/RelatedContent.svelte';
31+
export { default as Search } from './components/ui/Search.svelte';
32+
export { default as SearchAutocomplete } from './components/ui/SearchAutocomplete.svelte';
33+
export { default as Select } from './components/ui/Select.svelte';
34+
export { default as SideNav } from './components/ui/SideNav.svelte';
35+
export { default as Tabs } from './components/ui/Tabs.svelte';

0 commit comments

Comments
 (0)