@cloud-ru/ft-gulp-icon-builder 1.0.1-preview-df9ff74.0
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/CHANGELOG.md +5 -0
- package/LICENSE +201 -0
- package/README.md +4 -0
- package/dist/cjs/index.d.ts +7 -0
- package/dist/cjs/index.js +30 -0
- package/dist/cjs/svg-create-sprite.d.ts +4 -0
- package/dist/cjs/svg-create-sprite.js +41 -0
- package/dist/cjs/svg-fixer.d.ts +1 -0
- package/dist/cjs/svg-fixer.js +29 -0
- package/dist/cjs/svg-index-file.d.ts +6 -0
- package/dist/cjs/svg-index-file.js +62 -0
- package/dist/cjs/svg-size-validator.d.ts +1 -0
- package/dist/cjs/svg-size-validator.js +27 -0
- package/dist/cjs/svg-svgr.d.ts +5 -0
- package/dist/cjs/svg-svgr.js +26 -0
- package/dist/cjs/svg-uniq-validator.d.ts +1 -0
- package/dist/cjs/svg-uniq-validator.js +19 -0
- package/dist/cjs/utils/createPipeTransformer.d.ts +10 -0
- package/dist/cjs/utils/createPipeTransformer.js +35 -0
- package/dist/cjs/utils/index-template.d.ts +1 -0
- package/dist/cjs/utils/index-template.js +34 -0
- package/dist/cjs/utils/index.d.ts +3 -0
- package/dist/cjs/utils/index.js +22 -0
- package/dist/cjs/utils/name.d.ts +2 -0
- package/dist/cjs/utils/name.js +15 -0
- package/dist/cjs/utils/svgr-template.d.ts +7 -0
- package/dist/cjs/utils/svgr-template.js +51 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/svg-create-sprite.d.ts +4 -0
- package/dist/esm/svg-create-sprite.js +35 -0
- package/dist/esm/svg-fixer.d.ts +1 -0
- package/dist/esm/svg-fixer.js +23 -0
- package/dist/esm/svg-index-file.d.ts +6 -0
- package/dist/esm/svg-index-file.js +56 -0
- package/dist/esm/svg-size-validator.d.ts +1 -0
- package/dist/esm/svg-size-validator.js +24 -0
- package/dist/esm/svg-svgr.d.ts +5 -0
- package/dist/esm/svg-svgr.js +23 -0
- package/dist/esm/svg-uniq-validator.d.ts +1 -0
- package/dist/esm/svg-uniq-validator.js +16 -0
- package/dist/esm/utils/createPipeTransformer.d.ts +10 -0
- package/dist/esm/utils/createPipeTransformer.js +32 -0
- package/dist/esm/utils/index-template.d.ts +1 -0
- package/dist/esm/utils/index-template.js +30 -0
- package/dist/esm/utils/index.d.ts +3 -0
- package/dist/esm/utils/index.js +3 -0
- package/dist/esm/utils/name.d.ts +2 -0
- package/dist/esm/utils/name.js +8 -0
- package/dist/esm/utils/svgr-template.d.ts +7 -0
- package/dist/esm/utils/svgr-template.js +47 -0
- package/package.json +50 -0
- package/src/index.ts +7 -0
- package/src/svg-create-sprite.ts +33 -0
- package/src/svg-fixer.ts +19 -0
- package/src/svg-index-file.ts +63 -0
- package/src/svg-size-validator.ts +30 -0
- package/src/svg-svgr.ts +38 -0
- package/src/svg-uniq-validator.ts +21 -0
- package/src/utils/createPipeTransformer.ts +36 -0
- package/src/utils/index-template.ts +35 -0
- package/src/utils/index.ts +3 -0
- package/src/utils/name.ts +10 -0
- package/src/utils/svgr-template.ts +58 -0
package/src/svg-svgr.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Template } from '@svgr/babel-plugin-transform-svg-component';
|
|
2
|
+
import { transform } from '@svgr/core';
|
|
3
|
+
|
|
4
|
+
import { getComponentName } from './utils';
|
|
5
|
+
import { createPipeTransformer } from './utils/createPipeTransformer';
|
|
6
|
+
|
|
7
|
+
export type GulpSvgrParams = {
|
|
8
|
+
template: Template;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export function gulpSvgr({ template }: GulpSvgrParams) {
|
|
12
|
+
return createPipeTransformer({
|
|
13
|
+
transformer: (file, _encoding, callback) => {
|
|
14
|
+
const content = file.contents.toString();
|
|
15
|
+
|
|
16
|
+
const componentName = getComponentName(file.basename);
|
|
17
|
+
|
|
18
|
+
const result = transform.sync(
|
|
19
|
+
content,
|
|
20
|
+
{
|
|
21
|
+
icon: true,
|
|
22
|
+
template,
|
|
23
|
+
typescript: true,
|
|
24
|
+
expandProps: 'end',
|
|
25
|
+
jsxRuntime: 'classic',
|
|
26
|
+
exportType: 'default',
|
|
27
|
+
plugins: ['@svgr/plugin-jsx'],
|
|
28
|
+
},
|
|
29
|
+
{ componentName, caller: { name: 'gulp-svgr' }, filePath: file.path },
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
file.contents = Buffer.from(result);
|
|
33
|
+
file.extname = '.tsx';
|
|
34
|
+
|
|
35
|
+
callback(null, file);
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createPipeTransformer } from './utils/createPipeTransformer';
|
|
2
|
+
|
|
3
|
+
export function gulpSvgUniqValidator() {
|
|
4
|
+
const storage = new Map();
|
|
5
|
+
|
|
6
|
+
return createPipeTransformer({
|
|
7
|
+
transformer: (file, _encoding, callback) => {
|
|
8
|
+
const content = file.contents.toString();
|
|
9
|
+
const alreadyHaveIcon = storage.get(content);
|
|
10
|
+
const iconPath = file.path;
|
|
11
|
+
|
|
12
|
+
if (alreadyHaveIcon) {
|
|
13
|
+
return callback(new Error(`There are duplicating icons:\n\t${alreadyHaveIcon} \n\t${iconPath}\n`));
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
storage.set(content, iconPath);
|
|
17
|
+
|
|
18
|
+
callback(null, file);
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Transform } from 'node:stream';
|
|
2
|
+
import type File from 'vinyl';
|
|
3
|
+
|
|
4
|
+
type TransformCallback = (err?: Error | null, data?: File) => void;
|
|
5
|
+
|
|
6
|
+
type Transformer = (file: File.BufferFile, _encoding: BufferEncoding, callback: TransformCallback) => void;
|
|
7
|
+
|
|
8
|
+
export type PipeTransformerParams = {
|
|
9
|
+
transformer: Transformer;
|
|
10
|
+
onEnd?: () => void;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export function createPipeTransformer({ transformer, onEnd }: PipeTransformerParams) {
|
|
14
|
+
const stream = new Transform({
|
|
15
|
+
objectMode: true,
|
|
16
|
+
async transform(file: File, _encoding: BufferEncoding, callback: TransformCallback) {
|
|
17
|
+
if (file.isNull()) {
|
|
18
|
+
return callback(null, file);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (file.isStream()) {
|
|
22
|
+
return callback(new Error('Streaming not supported'));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (file.isBuffer()) {
|
|
26
|
+
return transformer(file, _encoding, callback);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return callback(null, file);
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
if (onEnd) stream.on('end', onEnd);
|
|
34
|
+
|
|
35
|
+
return stream;
|
|
36
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const ICON_PROPS = `
|
|
2
|
+
export interface ISvgIconProps extends SVGProps<SVGSVGElement> {
|
|
3
|
+
className?: string;
|
|
4
|
+
size?: number;
|
|
5
|
+
style?: React.CSSProperties;
|
|
6
|
+
}
|
|
7
|
+
`;
|
|
8
|
+
const REACT_IMPORT = "import { SVGProps, forwardRef, Ref } from 'react';";
|
|
9
|
+
const DEFAULT_SIZE = 24;
|
|
10
|
+
|
|
11
|
+
const getExportName = (fileName: string) => (fileName.endsWith('xs.tsx') ? 'XsSVG' : 'SSVG');
|
|
12
|
+
|
|
13
|
+
const withoutExtension = (fileName: string) => fileName.split('.')[0];
|
|
14
|
+
|
|
15
|
+
export const getComponent = (iconFiles: string[], componentName: string) => {
|
|
16
|
+
const iconImports = iconFiles
|
|
17
|
+
.map(file => `import { default as ${getExportName(file)} } from './${withoutExtension(file)}';`)
|
|
18
|
+
.join('\n');
|
|
19
|
+
|
|
20
|
+
const finalComponentName = `${componentName}SVG`;
|
|
21
|
+
|
|
22
|
+
return `
|
|
23
|
+
${REACT_IMPORT}
|
|
24
|
+
${iconImports}
|
|
25
|
+
|
|
26
|
+
${ICON_PROPS}
|
|
27
|
+
|
|
28
|
+
const ${finalComponentName} = forwardRef(({ size = ${DEFAULT_SIZE}, ...props }: ISvgIconProps, ref: Ref<SVGSVGElement>) => {
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
30
|
+
// @ts-ignore
|
|
31
|
+
return Number(size) >= 20 ? <SSVG ref={ref} size={size} {...props} /> : <XsSVG ref={ref} size={size} {...props} />;
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
export default ${finalComponentName};`;
|
|
35
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import camelcase from 'camelcase';
|
|
2
|
+
import kebabCase from 'kebab-case';
|
|
3
|
+
|
|
4
|
+
export function getTestId(componentName: string) {
|
|
5
|
+
return kebabCase(componentName.replace('Svg', ''), false);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function getComponentName(fileName: string) {
|
|
9
|
+
return camelcase(fileName);
|
|
10
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Template } from '@svgr/babel-plugin-transform-svg-component';
|
|
2
|
+
|
|
3
|
+
const size = 24;
|
|
4
|
+
|
|
5
|
+
type getTemplateParams = {
|
|
6
|
+
idPrefix: string;
|
|
7
|
+
generateDataTestId: (fileName: string) => string;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export const getTemplate =
|
|
11
|
+
({ idPrefix, generateDataTestId }: getTemplateParams): Template =>
|
|
12
|
+
({ imports, interfaces, componentName, exports }, { tpl }) => {
|
|
13
|
+
const testId = generateDataTestId(componentName);
|
|
14
|
+
const componentProp = size ? `{ size = ${size}, ...props }: ISvgIconProps` : `{ size, ...props }: ISvgIconProps`;
|
|
15
|
+
|
|
16
|
+
return tpl`
|
|
17
|
+
// DO NOT EDIT IT MANUALLY
|
|
18
|
+
${imports}
|
|
19
|
+
${interfaces}
|
|
20
|
+
|
|
21
|
+
export interface ISvgIconProps extends SVGProps<SVGSVGElement> {
|
|
22
|
+
className?: string;
|
|
23
|
+
size?: number;
|
|
24
|
+
style?: React.CSSProperties;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const ${componentName} = React.forwardRef((${componentProp}, ref: React.Ref<SVGSVGElement>) => {
|
|
28
|
+
props.width = undefined;
|
|
29
|
+
props.height = undefined;
|
|
30
|
+
|
|
31
|
+
const testId = ${JSON.stringify(testId)};
|
|
32
|
+
const isCustomSize = typeof size === 'number';
|
|
33
|
+
|
|
34
|
+
if(isCustomSize) {
|
|
35
|
+
if(!props.style) props.style = {};
|
|
36
|
+
props.style.width = size+"px";
|
|
37
|
+
props.style.height = size+"px";
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<svg
|
|
42
|
+
ref={ref}
|
|
43
|
+
xmlns='http://www.w3.org/2000/svg'
|
|
44
|
+
width={24}
|
|
45
|
+
height={24}
|
|
46
|
+
fill='currentColor'
|
|
47
|
+
viewBox='0 0 24 24'
|
|
48
|
+
data-test-id={'icon-' + testId}
|
|
49
|
+
{...props}
|
|
50
|
+
>
|
|
51
|
+
<use href={'#' + ${JSON.stringify(idPrefix)} + '-' + testId} />
|
|
52
|
+
</svg>
|
|
53
|
+
);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
${exports}
|
|
57
|
+
`;
|
|
58
|
+
};
|