@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.
Files changed (64) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE +201 -0
  3. package/README.md +4 -0
  4. package/dist/cjs/index.d.ts +7 -0
  5. package/dist/cjs/index.js +30 -0
  6. package/dist/cjs/svg-create-sprite.d.ts +4 -0
  7. package/dist/cjs/svg-create-sprite.js +41 -0
  8. package/dist/cjs/svg-fixer.d.ts +1 -0
  9. package/dist/cjs/svg-fixer.js +29 -0
  10. package/dist/cjs/svg-index-file.d.ts +6 -0
  11. package/dist/cjs/svg-index-file.js +62 -0
  12. package/dist/cjs/svg-size-validator.d.ts +1 -0
  13. package/dist/cjs/svg-size-validator.js +27 -0
  14. package/dist/cjs/svg-svgr.d.ts +5 -0
  15. package/dist/cjs/svg-svgr.js +26 -0
  16. package/dist/cjs/svg-uniq-validator.d.ts +1 -0
  17. package/dist/cjs/svg-uniq-validator.js +19 -0
  18. package/dist/cjs/utils/createPipeTransformer.d.ts +10 -0
  19. package/dist/cjs/utils/createPipeTransformer.js +35 -0
  20. package/dist/cjs/utils/index-template.d.ts +1 -0
  21. package/dist/cjs/utils/index-template.js +34 -0
  22. package/dist/cjs/utils/index.d.ts +3 -0
  23. package/dist/cjs/utils/index.js +22 -0
  24. package/dist/cjs/utils/name.d.ts +2 -0
  25. package/dist/cjs/utils/name.js +15 -0
  26. package/dist/cjs/utils/svgr-template.d.ts +7 -0
  27. package/dist/cjs/utils/svgr-template.js +51 -0
  28. package/dist/esm/index.d.ts +7 -0
  29. package/dist/esm/index.js +7 -0
  30. package/dist/esm/svg-create-sprite.d.ts +4 -0
  31. package/dist/esm/svg-create-sprite.js +35 -0
  32. package/dist/esm/svg-fixer.d.ts +1 -0
  33. package/dist/esm/svg-fixer.js +23 -0
  34. package/dist/esm/svg-index-file.d.ts +6 -0
  35. package/dist/esm/svg-index-file.js +56 -0
  36. package/dist/esm/svg-size-validator.d.ts +1 -0
  37. package/dist/esm/svg-size-validator.js +24 -0
  38. package/dist/esm/svg-svgr.d.ts +5 -0
  39. package/dist/esm/svg-svgr.js +23 -0
  40. package/dist/esm/svg-uniq-validator.d.ts +1 -0
  41. package/dist/esm/svg-uniq-validator.js +16 -0
  42. package/dist/esm/utils/createPipeTransformer.d.ts +10 -0
  43. package/dist/esm/utils/createPipeTransformer.js +32 -0
  44. package/dist/esm/utils/index-template.d.ts +1 -0
  45. package/dist/esm/utils/index-template.js +30 -0
  46. package/dist/esm/utils/index.d.ts +3 -0
  47. package/dist/esm/utils/index.js +3 -0
  48. package/dist/esm/utils/name.d.ts +2 -0
  49. package/dist/esm/utils/name.js +8 -0
  50. package/dist/esm/utils/svgr-template.d.ts +7 -0
  51. package/dist/esm/utils/svgr-template.js +47 -0
  52. package/package.json +50 -0
  53. package/src/index.ts +7 -0
  54. package/src/svg-create-sprite.ts +33 -0
  55. package/src/svg-fixer.ts +19 -0
  56. package/src/svg-index-file.ts +63 -0
  57. package/src/svg-size-validator.ts +30 -0
  58. package/src/svg-svgr.ts +38 -0
  59. package/src/svg-uniq-validator.ts +21 -0
  60. package/src/utils/createPipeTransformer.ts +36 -0
  61. package/src/utils/index-template.ts +35 -0
  62. package/src/utils/index.ts +3 -0
  63. package/src/utils/name.ts +10 -0
  64. package/src/utils/svgr-template.ts +58 -0
@@ -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,3 @@
1
+ export { getTemplate } from './svgr-template';
2
+ export { getComponent } from './index-template';
3
+ export * from './name';
@@ -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
+ };