Skip to content

Commit 38004de

Browse files
committed
Updated with example docs.
1 parent b9670fe commit 38004de

6 files changed

Lines changed: 655 additions & 15 deletions

File tree

package.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,14 @@
5555
"jest-canvas-mock": "2.4.0",
5656
"ts-jest":"29.0.3",
5757
"serve": "^14.1.2",
58-
"enzyme":"3.11.0",
59-
"enzyme-to-json": "3.6.2",
58+
"node-sass-package-importer": "^5.3.2",
6059
"@wojtekmaj/enzyme-adapter-react-17": "^0.6.7",
6160
"whatwg-fetch": "^3.6.2",
6261
"babel-polyfill": "6.26.0",
63-
"identity-obj-proxy": "^3.0.0"
62+
"identity-obj-proxy": "^3.0.0",
63+
"fs-extra": "^9.1.0",
64+
"glob": "^7.2.3",
65+
"sass": "^1.55.0",
66+
"chokidar": "^3.5.3"
6467
}
6568
}

packages/module/package.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,17 @@
55
"main": "dist/esm/index.js",
66
"module": "dist/esm/index.js",
77
"scripts": {
8-
"build": "tsc --build --verbose ./tsconfig.json",
8+
"build": "tsc --build --verbose ./tsconfig.json && yarn build:css && yarn transform:css",
9+
"build:css": "node ../../scripts/build-styles.js",
10+
"copy-files": "copyfiles -u 1 src/**/*.scss dist/esm",
911
"build:fed:packages": "node generate-fed-package-json.js",
1012
"clean": "rimraf dist",
1113
"docs:develop": "pf-docs-framework start",
1214
"docs:build": "pf-docs-framework build all --output public",
1315
"docs:serve": "pf-docs-framework serve public --port 5000",
1416
"docs:screenshots": "pf-docs-framework screenshots --urlPrefix http://localhost:5000",
1517
"test:a11y": "patternfly-a11y --config patternfly-a11y.config",
18+
"transform:css": "node ../../scripts/transform-scss.js",
1619
"serve:a11y": "yarn serve coverage"
1720
},
1821
"repository": "git+https://github.com/patternfly/extended-components.git",
@@ -40,7 +43,9 @@
4043
"@patternfly/patternfly": "^4.217.1",
4144
"@patternfly/react-table": "^4.111.4",
4245
"@patternfly/react-code-editor": "^4.82.26",
46+
"@redhat-cloud-services/frontend-components-utilities": "^3.2.25",
4347
"classnames": "^2.2.5",
48+
"copyfiles": "^2.4.1",
4449
"rimraf": "^2.6.2",
4550
"typescript": "^4.7.4",
4651
"react": "^17.0.0",

scripts/build-packages.js

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
const fse = require('fs-extra');
2+
const glob = require('glob');
3+
const path = require('path');
4+
5+
const root = process.cwd();
6+
7+
const foldersBlackList = ['__snapshots__', '__mocks__'];
8+
const sourceFiles = glob
9+
.sync(`${root}/src/*/`)
10+
.filter((item) => !foldersBlackList.some((name) => item.includes(name)))
11+
.map((name) => name.replace(/\/$/, ''));
12+
const indexTypings = glob.sync(`${root}/src/index.d.ts`);
13+
14+
async function copyTypings(files, dest) {
15+
const cmds = [];
16+
files.forEach((file) => {
17+
const fileName = file.split('/').pop();
18+
cmds.push(fse.copyFile(file, `${dest}/${fileName}`));
19+
});
20+
return Promise.all(cmds);
21+
}
22+
23+
async function createPackage(file, forceTypes) {
24+
const fileName = file.split('/').pop();
25+
const esmSource = glob.sync(`${root}/esm/${fileName}/**/index.js`)[0];
26+
/**
27+
* Prevent creating package.json for directories with no JS files (like CSS directories)
28+
*/
29+
if (!esmSource) {
30+
return;
31+
}
32+
33+
const destFile = `${path.resolve(root, file.split('/src/').pop())}/package.json`;
34+
35+
const esmRelative = path.relative(file.replace('/src', ''), esmSource);
36+
const content = {
37+
main: 'index.js',
38+
module: esmRelative,
39+
};
40+
const typings = glob.sync(`${root}/src/${fileName}/*.d.ts`);
41+
let cmds = [];
42+
if (forceTypes) {
43+
content.typings = 'index.d.ts';
44+
} else if (typings.length > 0) {
45+
const hasIndex = glob.sync(`${root}/src/${fileName}/index.d.ts`).length > 0;
46+
if (hasIndex) {
47+
content.typings = 'index.d.ts';
48+
}
49+
50+
cmds.push(copyTypings(typings, `${root}/${fileName}`));
51+
}
52+
53+
cmds.push(fse.writeJSON(destFile, content));
54+
55+
return Promise.all(cmds);
56+
}
57+
58+
async function generatePackages(files, forceTypes) {
59+
const cmds = files.map((file) => createPackage(file, forceTypes));
60+
return Promise.all(cmds);
61+
}
62+
63+
async function run(files, forceTypes) {
64+
try {
65+
await generatePackages(files, forceTypes);
66+
if (indexTypings.length === 1) {
67+
copyTypings(indexTypings, root);
68+
}
69+
} catch (error) {
70+
console.error(error);
71+
process.exit(1);
72+
}
73+
}
74+
75+
const forceTypes = !!process.argv.includes('--forceTypes');
76+
77+
run(sourceFiles, forceTypes);

scripts/build-styles.js

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
const fs = require('fs');
2+
const glob = require('glob');
3+
const path = require('path');
4+
const sass = require('sass');
5+
const chokidar = require('chokidar');
6+
const packageImporter = require('node-sass-package-importer');
7+
8+
/**
9+
* Root path of the current package
10+
*/
11+
const root = process.cwd();
12+
/**
13+
* get all scss files
14+
*/
15+
const files = glob.sync(`${root}/src/**/*.scss`);
16+
17+
async function buildStyle(file) {
18+
const outFiles = [
19+
path.resolve(file.replace('/src/', '/dist/esm/'), './').replace(/scss$/, 'css'),
20+
];
21+
const promises = outFiles.map((outFile) => {
22+
let targetDir = outFile.split('/');
23+
targetDir.pop();
24+
targetDir = targetDir.join('/').replace(root, '').replace(/^\//, '');
25+
26+
if (!fs.existsSync(path.resolve(root, targetDir))) {
27+
fs.mkdirSync(targetDir);
28+
}
29+
30+
const render = sass.render(
31+
{
32+
file,
33+
outFile,
34+
importer: packageImporter(),
35+
},
36+
function (err, result) {
37+
if (err) {
38+
console.error(file, outFile);
39+
throw err;
40+
}
41+
42+
return fs.writeFile(outFile, result.css, 'utf8', function (err) {
43+
if (err) {
44+
throw err;
45+
}
46+
});
47+
}
48+
);
49+
const copy = fs.copyFile(file, outFile.replace(/css$/, 'scss'), function (err) {
50+
if (err) {
51+
throw err;
52+
}
53+
});
54+
return Promise.all([render, copy]);
55+
});
56+
return Promise.all(promises);
57+
}
58+
59+
async function buildStyles(files) {
60+
const cmds = files.map(buildStyle);
61+
return Promise.all(cmds);
62+
}
63+
64+
async function run(files) {
65+
try {
66+
await buildStyles(files);
67+
} catch (error) {
68+
console.error(error);
69+
process.exit(1);
70+
}
71+
}
72+
73+
const args = process.argv.slice(2);
74+
75+
if (args.includes('-w') || args.includes('--watch')) {
76+
console.log(`Watching ${files.length} scss files in: ${root}`);
77+
const watcher = chokidar.watch(files);
78+
watcher
79+
.on('add', (path) => {
80+
console.log(`Compiling sass: ${path}`);
81+
buildStyles([path]);
82+
})
83+
.on('change', (path) => {
84+
console.log(`Compiling sass: ${path}`);
85+
buildStyles([path]);
86+
});
87+
} else {
88+
run(files);
89+
}

scripts/transform-scss.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
const fs = require('fs');
2+
const glob = require('glob');
3+
4+
const root = process.cwd();
5+
6+
async function transformFiles() {
7+
const esmRoot = `${root}/**/*.js`;
8+
const files = glob.sync(esmRoot).filter((path) => !path.includes('/src/'));
9+
const cmds = files.map((file) => {
10+
let content = fs.readFileSync(file, { encoding: 'utf-8' });
11+
const isEsm = file.includes('/dist/esm/');
12+
if (isEsm) {
13+
/**
14+
* For ESM module, tranform the CSS asset paht co CJS variant.
15+
* Referencing CSS in esm directories causes webpack to tree shake the assets leading to missing CSS rules in build output.
16+
*/
17+
const prefix = file.split('/dist/esm/').pop().split('/').shift();
18+
content = content.replaceAll(/(?<=^import )'\.\/(?=.*\.scss)/gm, `'../${prefix}/`);
19+
}
20+
content = content.replace(/\.scss(?=('))/, '.css');
21+
content = content.replace(/\.scss(?=("\)))/, '.css');
22+
return fs.writeFile(file, content, 'utf-8', function (err) {
23+
if (err) {
24+
throw err;
25+
}
26+
});
27+
});
28+
return Promise.all(cmds);
29+
}
30+
31+
async function run() {
32+
try {
33+
await transformFiles();
34+
} catch (error) {
35+
console.error(error);
36+
process.exit(1);
37+
}
38+
}
39+
40+
run();

0 commit comments

Comments
 (0)