-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcli.js
executable file
·141 lines (114 loc) · 3.37 KB
/
cli.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#!/usr/bin/env node
const { existsSync, mkdirSync, writeFileSync } = require('fs');
const globby = require('globby');
const importCwd = require('import-cwd');
const { dirname } = require('path');
const allStoriesPaths = globby.sync(['src/**/*.stories.(j|t)sx']);
const CONF_FILE = '.ginterdevrc.js';
let showcaseDir = '_next-showcase';
if (existsSync(CONF_FILE)) {
try {
const ginterdevrc = importCwd(`./${CONF_FILE}`);
if (ginterdevrc['next-showcase']) {
showcaseDir = ginterdevrc['next-showcase'].entryDir || showcaseDir;
}
} catch {
// Couldn't read config file
}
}
function getGroupNameFromPath(storiesPath) {
if (/\/atoms\//i.test(storiesPath)) {
return 'Components (Atoms)';
}
if (/\/molecules\//i.test(storiesPath)) {
return 'Components (Molecules)';
}
if (/\/organisms\//i.test(storiesPath)) {
return 'Components (Organisms)';
}
if (/\/templates\//i.test(storiesPath)) {
return 'Components (Templates)';
}
if (/\/forms\//i.test(storiesPath)) {
return 'Forms';
}
if (/\/pages\//i.test(storiesPath)) {
return 'Pages';
}
if (/\/views\//i.test(storiesPath)) {
return 'Views';
}
if (/\/components\//i.test(storiesPath)) {
return 'Components';
}
if (/\/icons\//i.test(storiesPath)) {
return 'Icons';
}
if (/\/assets\//i.test(storiesPath)) {
return 'Assets';
}
return 'Other';
}
const modules = allStoriesPaths.map((storiesPath) => {
// slice the 'src/' part
// src/components/Button/Button.stories.ts
// -> components/Button/Button.stories.ts
const pathNoSource = storiesPath.replace(/^src\//, '');
const lastChunk = pathNoSource.split('/').pop();
const modName = lastChunk.replace(/\.stories\.[jt]sx/, '');
// Try to obtain group based on path, very opinionated.
const group = getGroupNameFromPath(storiesPath);
// Replace slashed with double underscore.
// Example: components/Button -> components__Button.
const importName = modName.replace(/\//g, '__');
return {
// Modules group.
group,
// This will be used for calculating name and group displayed in
// showcase sidebar/nav.
name: importName,
// Prepare import path for 'import' (just cut the extension,
// so TypeScript won't complain).
source: `${storiesPath.replace(/\.[jt]sx?$/, '')}`,
};
});
// Switch import source for local testing.
const importPath = process.env.NO_NPM
? '../../src'
: '@ginterdev/next-showcase';
const file = `
// THIS FILE IS AUTOGENERATED.
// IT SHOULD NEITHER BE MODIFIED MANUALLY NOR COMMITTED TO ANY VERSION
// CONTROL SYSTEM.
/* prettier-ignore-start */
/* eslint-disable */
import Showcase from '${importPath}';
export default function ShowcasePage({ SidebarHeader }) {
const storiesModules = {
${modules
.map(
(mod) => ` '${mod.source}': {
name: '${mod.name}',
group: '${mod.group}',
source: '${mod.source}',
loader: () => import('../../${mod.source}'),
},`,
)
.join('\n')}
};
return (
<Showcase
renderId={${Date.now()}}
SidebarHeader={SidebarHeader}
storiesModules={storiesModules}
/>
);
}
ShowcasePage.IS_SHOWCASE_COMPONENT = true;
/* eslint-enable */
/* prettier-ignore-end */
`;
// written in process.cwd() context
const targetFile = `pages/${showcaseDir}/index.tsx`;
mkdirSync(dirname(targetFile), { recursive: true });
writeFileSync(targetFile, file.trim(), 'utf-8');