shellfie 1.3.7 → 2.0.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 (117) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +221 -165
  3. package/dist/fonts/index.d.ts +21 -0
  4. package/dist/fonts/index.d.ts.map +1 -0
  5. package/dist/fonts/index.js +92 -0
  6. package/dist/fonts/index.js.map +1 -0
  7. package/dist/index.d.ts +14 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +124 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/parser/index.d.ts +6 -0
  12. package/dist/parser/index.d.ts.map +1 -0
  13. package/dist/parser/index.js +189 -0
  14. package/dist/parser/index.js.map +1 -0
  15. package/dist/parser/types.d.ts +17 -0
  16. package/dist/parser/types.d.ts.map +1 -0
  17. package/dist/parser/types.js +3 -0
  18. package/dist/parser/types.js.map +1 -0
  19. package/dist/renderer/colors.d.ts +9 -0
  20. package/dist/renderer/colors.d.ts.map +1 -0
  21. package/dist/renderer/colors.js +100 -0
  22. package/dist/renderer/colors.js.map +1 -0
  23. package/dist/renderer/customGlyphs.d.ts +17 -0
  24. package/dist/renderer/customGlyphs.d.ts.map +1 -0
  25. package/dist/renderer/customGlyphs.js +730 -0
  26. package/dist/renderer/customGlyphs.js.map +1 -0
  27. package/dist/renderer/index.d.ts +10 -0
  28. package/dist/renderer/index.d.ts.map +1 -0
  29. package/dist/renderer/index.js +231 -0
  30. package/dist/renderer/index.js.map +1 -0
  31. package/dist/renderer/text.d.ts +13 -0
  32. package/dist/renderer/text.d.ts.map +1 -0
  33. package/dist/renderer/text.js +128 -0
  34. package/dist/renderer/text.js.map +1 -0
  35. package/dist/templates/base.d.ts +5 -0
  36. package/dist/templates/base.d.ts.map +1 -0
  37. package/dist/templates/base.js +37 -0
  38. package/dist/templates/base.js.map +1 -0
  39. package/dist/templates/index.d.ts +13 -0
  40. package/dist/templates/index.d.ts.map +1 -0
  41. package/dist/templates/index.js +34 -0
  42. package/dist/templates/index.js.map +1 -0
  43. package/dist/templates/macos.d.ts +12 -0
  44. package/dist/templates/macos.d.ts.map +1 -0
  45. package/dist/templates/macos.js +34 -0
  46. package/dist/templates/macos.js.map +1 -0
  47. package/dist/templates/minimal.d.ts +13 -0
  48. package/dist/templates/minimal.d.ts.map +1 -0
  49. package/dist/templates/minimal.js +27 -0
  50. package/dist/templates/minimal.js.map +1 -0
  51. package/dist/templates/windows.d.ts +12 -0
  52. package/dist/templates/windows.d.ts.map +1 -0
  53. package/dist/templates/windows.js +34 -0
  54. package/dist/templates/windows.js.map +1 -0
  55. package/dist/themes/catppuccin-mocha.d.ts +3 -0
  56. package/dist/themes/catppuccin-mocha.d.ts.map +1 -0
  57. package/dist/themes/catppuccin-mocha.js +27 -0
  58. package/dist/themes/catppuccin-mocha.js.map +1 -0
  59. package/dist/themes/dracula.d.ts +3 -0
  60. package/dist/themes/dracula.d.ts.map +1 -0
  61. package/dist/themes/dracula.js +27 -0
  62. package/dist/themes/dracula.js.map +1 -0
  63. package/dist/themes/github-dark.d.ts +3 -0
  64. package/dist/themes/github-dark.d.ts.map +1 -0
  65. package/dist/themes/github-dark.js +27 -0
  66. package/dist/themes/github-dark.js.map +1 -0
  67. package/dist/themes/github-light.d.ts +3 -0
  68. package/dist/themes/github-light.d.ts.map +1 -0
  69. package/dist/themes/github-light.js +27 -0
  70. package/dist/themes/github-light.js.map +1 -0
  71. package/dist/themes/gruvbox-dark.d.ts +3 -0
  72. package/dist/themes/gruvbox-dark.d.ts.map +1 -0
  73. package/dist/themes/gruvbox-dark.js +27 -0
  74. package/dist/themes/gruvbox-dark.js.map +1 -0
  75. package/dist/themes/gruvbox-light.d.ts +3 -0
  76. package/dist/themes/gruvbox-light.d.ts.map +1 -0
  77. package/dist/themes/gruvbox-light.js +27 -0
  78. package/dist/themes/gruvbox-light.js.map +1 -0
  79. package/dist/themes/index.d.ts +27 -0
  80. package/dist/themes/index.d.ts.map +1 -0
  81. package/dist/themes/index.js +54 -0
  82. package/dist/themes/index.js.map +1 -0
  83. package/dist/themes/monokai.d.ts +3 -0
  84. package/dist/themes/monokai.d.ts.map +1 -0
  85. package/dist/themes/monokai.js +27 -0
  86. package/dist/themes/monokai.js.map +1 -0
  87. package/dist/themes/nord.d.ts +3 -0
  88. package/dist/themes/nord.d.ts.map +1 -0
  89. package/dist/themes/nord.js +27 -0
  90. package/dist/themes/nord.js.map +1 -0
  91. package/dist/themes/one-dark.d.ts +3 -0
  92. package/dist/themes/one-dark.d.ts.map +1 -0
  93. package/dist/themes/one-dark.js +27 -0
  94. package/dist/themes/one-dark.js.map +1 -0
  95. package/dist/themes/solarized-dark.d.ts +3 -0
  96. package/dist/themes/solarized-dark.d.ts.map +1 -0
  97. package/dist/themes/solarized-dark.js +27 -0
  98. package/dist/themes/solarized-dark.js.map +1 -0
  99. package/dist/themes/solarized-light.d.ts +3 -0
  100. package/dist/themes/solarized-light.d.ts.map +1 -0
  101. package/dist/themes/solarized-light.js +27 -0
  102. package/dist/themes/solarized-light.js.map +1 -0
  103. package/dist/themes/tokyo-night.d.ts +3 -0
  104. package/dist/themes/tokyo-night.d.ts.map +1 -0
  105. package/dist/themes/tokyo-night.js +27 -0
  106. package/dist/themes/tokyo-night.js.map +1 -0
  107. package/dist/types.d.ts +151 -0
  108. package/dist/types.d.ts.map +1 -0
  109. package/dist/types.js +3 -0
  110. package/dist/types.js.map +1 -0
  111. package/package.json +32 -21
  112. package/shellfie.d.ts +0 -29
  113. package/shellfie.js +0 -114
  114. package/template/template.css +0 -58
  115. package/template/template.html +0 -21
  116. package/utils/config.js +0 -41
  117. package/utils/styles.js +0 -32
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solarized-dark.d.ts","sourceRoot":"","sources":["../../src/themes/solarized-dark.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,eAAO,MAAM,aAAa,EAAE,KAsB3B,CAAC"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.solarizedDark = void 0;
4
+ exports.solarizedDark = {
5
+ name: 'solarized-dark',
6
+ background: '#002b36',
7
+ foreground: '#839496',
8
+ cursor: '#839496',
9
+ selection: '#073642',
10
+ black: '#073642',
11
+ red: '#dc322f',
12
+ green: '#859900',
13
+ yellow: '#b58900',
14
+ blue: '#268bd2',
15
+ magenta: '#d33682',
16
+ cyan: '#2aa198',
17
+ white: '#eee8d5',
18
+ brightBlack: '#002b36',
19
+ brightRed: '#cb4b16',
20
+ brightGreen: '#586e75',
21
+ brightYellow: '#657b83',
22
+ brightBlue: '#839496',
23
+ brightMagenta: '#6c71c4',
24
+ brightCyan: '#93a1a1',
25
+ brightWhite: '#fdf6e3',
26
+ };
27
+ //# sourceMappingURL=solarized-dark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solarized-dark.js","sourceRoot":"","sources":["../../src/themes/solarized-dark.ts"],"names":[],"mappings":";;;AAEa,QAAA,aAAa,GAAU;IAClC,IAAI,EAAE,gBAAgB;IACtB,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,SAAS;IACpB,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,WAAW,EAAE,SAAS;IACtB,SAAS,EAAE,SAAS;IACpB,WAAW,EAAE,SAAS;IACtB,YAAY,EAAE,SAAS;IACvB,UAAU,EAAE,SAAS;IACrB,aAAa,EAAE,SAAS;IACxB,UAAU,EAAE,SAAS;IACrB,WAAW,EAAE,SAAS;CACvB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Theme } from '../types';
2
+ export declare const solarizedLight: Theme;
3
+ //# sourceMappingURL=solarized-light.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solarized-light.d.ts","sourceRoot":"","sources":["../../src/themes/solarized-light.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,eAAO,MAAM,cAAc,EAAE,KAsB5B,CAAC"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.solarizedLight = void 0;
4
+ exports.solarizedLight = {
5
+ name: 'solarized-light',
6
+ background: '#fdf6e3',
7
+ foreground: '#657b83',
8
+ cursor: '#657b83',
9
+ selection: '#eee8d5',
10
+ black: '#073642',
11
+ red: '#dc322f',
12
+ green: '#859900',
13
+ yellow: '#b58900',
14
+ blue: '#268bd2',
15
+ magenta: '#d33682',
16
+ cyan: '#2aa198',
17
+ white: '#eee8d5',
18
+ brightBlack: '#002b36',
19
+ brightRed: '#cb4b16',
20
+ brightGreen: '#586e75',
21
+ brightYellow: '#657b83',
22
+ brightBlue: '#839496',
23
+ brightMagenta: '#6c71c4',
24
+ brightCyan: '#93a1a1',
25
+ brightWhite: '#fdf6e3',
26
+ };
27
+ //# sourceMappingURL=solarized-light.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solarized-light.js","sourceRoot":"","sources":["../../src/themes/solarized-light.ts"],"names":[],"mappings":";;;AAEa,QAAA,cAAc,GAAU;IACnC,IAAI,EAAE,iBAAiB;IACvB,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,SAAS;IACpB,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,WAAW,EAAE,SAAS;IACtB,SAAS,EAAE,SAAS;IACpB,WAAW,EAAE,SAAS;IACtB,YAAY,EAAE,SAAS;IACvB,UAAU,EAAE,SAAS;IACrB,aAAa,EAAE,SAAS;IACxB,UAAU,EAAE,SAAS;IACrB,WAAW,EAAE,SAAS;CACvB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Theme } from '../types';
2
+ export declare const tokyoNight: Theme;
3
+ //# sourceMappingURL=tokyo-night.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokyo-night.d.ts","sourceRoot":"","sources":["../../src/themes/tokyo-night.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,eAAO,MAAM,UAAU,EAAE,KAsBxB,CAAC"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tokyoNight = void 0;
4
+ exports.tokyoNight = {
5
+ name: 'tokyo-night',
6
+ background: '#1a1b26',
7
+ foreground: '#a9b1d6',
8
+ cursor: '#c0caf5',
9
+ selection: '#33467c',
10
+ black: '#15161e',
11
+ red: '#f7768e',
12
+ green: '#9ece6a',
13
+ yellow: '#e0af68',
14
+ blue: '#7aa2f7',
15
+ magenta: '#bb9af7',
16
+ cyan: '#7dcfff',
17
+ white: '#a9b1d6',
18
+ brightBlack: '#414868',
19
+ brightRed: '#f7768e',
20
+ brightGreen: '#9ece6a',
21
+ brightYellow: '#e0af68',
22
+ brightBlue: '#7aa2f7',
23
+ brightMagenta: '#bb9af7',
24
+ brightCyan: '#7dcfff',
25
+ brightWhite: '#c0caf5',
26
+ };
27
+ //# sourceMappingURL=tokyo-night.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokyo-night.js","sourceRoot":"","sources":["../../src/themes/tokyo-night.ts"],"names":[],"mappings":";;;AAEa,QAAA,UAAU,GAAU;IAC/B,IAAI,EAAE,aAAa;IACnB,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,SAAS;IACrB,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,SAAS;IACpB,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,WAAW,EAAE,SAAS;IACtB,SAAS,EAAE,SAAS;IACpB,WAAW,EAAE,SAAS;IACtB,YAAY,EAAE,SAAS;IACvB,UAAU,EAAE,SAAS;IACrB,aAAa,EAAE,SAAS;IACxB,UAAU,EAAE,SAAS;IACrB,WAAW,EAAE,SAAS;CACvB,CAAC"}
@@ -0,0 +1,151 @@
1
+ export interface RGB {
2
+ r: number;
3
+ g: number;
4
+ b: number;
5
+ }
6
+ export interface TextStyle {
7
+ foreground?: string | RGB;
8
+ background?: string | RGB;
9
+ bold?: boolean;
10
+ italic?: boolean;
11
+ underline?: boolean;
12
+ strikethrough?: boolean;
13
+ dim?: boolean;
14
+ inverse?: boolean;
15
+ }
16
+ export interface TextSpan {
17
+ text: string;
18
+ style: TextStyle;
19
+ }
20
+ export interface ParsedLine {
21
+ spans: TextSpan[];
22
+ }
23
+ export interface Theme {
24
+ name: string;
25
+ background: string;
26
+ foreground: string;
27
+ cursor: string;
28
+ selection: string;
29
+ headerBackground?: string;
30
+ footerBackground?: string;
31
+ black: string;
32
+ red: string;
33
+ green: string;
34
+ yellow: string;
35
+ blue: string;
36
+ magenta: string;
37
+ cyan: string;
38
+ white: string;
39
+ brightBlack: string;
40
+ brightRed: string;
41
+ brightGreen: string;
42
+ brightYellow: string;
43
+ brightBlue: string;
44
+ brightMagenta: string;
45
+ brightCyan: string;
46
+ brightWhite: string;
47
+ }
48
+ export interface ControlStyle {
49
+ close: string;
50
+ minimize: string;
51
+ maximize: string;
52
+ radius: number;
53
+ spacing: number;
54
+ size: number;
55
+ }
56
+ export interface ShellConfig {
57
+ titleBar: boolean;
58
+ titleBarHeight: number;
59
+ borderRadius: number;
60
+ controls: boolean;
61
+ controlsPosition: 'left' | 'right';
62
+ controlStyle: ControlStyle;
63
+ padding: number;
64
+ shadow: boolean;
65
+ border: boolean;
66
+ borderColor: string;
67
+ borderWidth: number;
68
+ }
69
+ export interface Template {
70
+ name: string;
71
+ shell: ShellConfig;
72
+ }
73
+ export type PaddingInput = number | [number, number] | [number, number, number, number];
74
+ export interface ResolvedPadding {
75
+ top: number;
76
+ right: number;
77
+ bottom: number;
78
+ left: number;
79
+ }
80
+ export interface FontConfig {
81
+ family: string;
82
+ size: number;
83
+ lineHeight: number;
84
+ charWidth: number;
85
+ embedData?: string;
86
+ embedFormat?: 'woff2' | 'woff' | 'ttf';
87
+ }
88
+ export interface HeaderConfig {
89
+ backgroundColor?: string;
90
+ height?: number;
91
+ border?: boolean;
92
+ borderColor?: string;
93
+ borderWidth?: number;
94
+ }
95
+ export interface FooterConfig {
96
+ backgroundColor?: string;
97
+ height?: number;
98
+ border?: boolean;
99
+ borderColor?: string;
100
+ borderWidth?: number;
101
+ }
102
+ export interface shellfieOptions {
103
+ template?: 'macos' | 'windows' | 'minimal' | Template;
104
+ title?: string;
105
+ theme?: Theme;
106
+ fontSize?: number;
107
+ lineHeight?: number;
108
+ padding?: PaddingInput;
109
+ width?: number;
110
+ watermark?: string;
111
+ watermarkPadding?: PaddingInput;
112
+ controls?: boolean;
113
+ fontFamily?: string;
114
+ embedFont?: boolean;
115
+ customFont?: {
116
+ data: string;
117
+ format: 'woff2' | 'woff' | 'ttf';
118
+ };
119
+ customGlyphs?: boolean;
120
+ header?: HeaderConfig;
121
+ footer?: FooterConfig;
122
+ }
123
+ export interface ResolvedHeaderConfig {
124
+ backgroundColor: string;
125
+ height: number;
126
+ border: boolean;
127
+ borderColor: string;
128
+ borderWidth: number;
129
+ }
130
+ export interface ResolvedFooterConfig {
131
+ backgroundColor: string;
132
+ height: number;
133
+ border: boolean;
134
+ borderColor: string;
135
+ borderWidth: number;
136
+ }
137
+ export interface RenderOptions {
138
+ template: Template;
139
+ title: string;
140
+ theme: Theme;
141
+ font: FontConfig;
142
+ padding: ResolvedPadding;
143
+ width: number | null;
144
+ watermark: string | null;
145
+ watermarkPadding: ResolvedPadding;
146
+ header: ResolvedHeaderConfig | null;
147
+ footer: ResolvedFooterConfig | null;
148
+ controls: boolean;
149
+ customGlyphs: boolean;
150
+ }
151
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,34 +1,45 @@
1
1
  {
2
2
  "name": "shellfie",
3
- "version": "1.3.7",
4
- "description": "create beautiful terminal screenshots programmatically",
5
- "main": "shellfie.js",
6
- "directories": {
7
- "test": "tests"
8
- },
9
- "scripts": {
10
- "test": "mocha --no-timeouts tests/"
3
+ "version": "2.0.0",
4
+ "description": "Convert terminal output to crystal-clear SVG images",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ }
11
14
  },
12
15
  "files": [
13
- "shellfie.js",
14
- "shellfie.d.ts",
15
- "template",
16
- "utils"
16
+ "dist"
17
17
  ],
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "test": "vitest run",
21
+ "test:watch": "vitest",
22
+ "example": "npx tsx example.ts"
23
+ },
18
24
  "keywords": [
19
25
  "terminal",
20
- "xterm",
26
+ "svg",
21
27
  "screenshot",
22
- "ansi"
28
+ "ansi",
29
+ "tty",
30
+ "cli"
23
31
  ],
24
- "author": "Tal Hayut",
32
+ "author": "tool3",
25
33
  "license": "MIT",
26
- "dependencies": {
27
- "puppeteer": "latest",
28
- "xterm": "^4.14.1",
29
- "xterm-addon-fit": "^0.5.0"
30
- },
31
34
  "devDependencies": {
32
- "mocha": "^8.2.1"
35
+ "@types/node": "^20.10.0",
36
+ "chartscii": "^3.2.0",
37
+ "gradient-string": "^3.0.0",
38
+ "tsx": "^4.7.0",
39
+ "typescript": "^5.3.0",
40
+ "vitest": "^4.0.18"
41
+ },
42
+ "engines": {
43
+ "node": ">=18.0.0"
33
44
  }
34
45
  }
package/shellfie.d.ts DELETED
@@ -1,29 +0,0 @@
1
- declare type ShellfieTheme = {
2
- background: string;
3
- foreground: string;
4
- };
5
-
6
- declare type ShellfieStyle = {
7
- fontFamily: string;
8
- fontWeight: string;
9
- fontSize: number;
10
- };
11
-
12
- declare type ShellfieViewport = {
13
- width: number;
14
- height: number;
15
- };
16
-
17
- declare type ShellfieOptions = {
18
- name?: string;
19
- location?: string;
20
- theme?: ShellfieTheme;
21
- style?: ShellfieStyle;
22
- viewport?: ShellfieViewport;
23
- mode?: string;
24
- puppeteerOptions?: Record<string, any>;
25
- };
26
-
27
- declare function shellfie(data: string | string[], options: ShellfieOptions): Promise<void>;
28
-
29
- export = shellfie;
package/shellfie.js DELETED
@@ -1,114 +0,0 @@
1
- const puppeteer = require('puppeteer');
2
- const getConfig = require('./utils/config');
3
- const path = require('path');
4
- const fs = require('fs').promises;
5
- const { getStyles } = require('./utils/styles');
6
-
7
- async function shellfie(data, config) {
8
- try {
9
- if (!data || data.length === 0) {
10
- throw new Error('no data provided.\nshelffie needs a string || string[] to produce an image.');
11
- }
12
- const localPath = process.env.INIT_CWD || process.cwd();
13
- const {
14
- name,
15
- location,
16
- style,
17
- theme,
18
- ext,
19
- puppeteerOptions,
20
- viewport,
21
- mode,
22
- rendererType
23
- } = getConfig(config,localPath);
24
- const browser = await puppeteer.launch(puppeteerOptions);
25
- const page = await browser.newPage();
26
-
27
- await page.setViewport({ ...viewport, deviceScaleFactor: 4 });
28
- // read html template
29
- const templatePath = __dirname + '/template/template.html';
30
- let html = await fs.readFile(templatePath, 'utf-8');
31
- const lines = Array.isArray(data) || mode === 'raw' ? data : data.split('\n');
32
-
33
- // inject js scripts
34
- await page.addScriptTag({ path: require.resolve('xterm/lib/xterm.js') });
35
- await page.addScriptTag({ path: require.resolve('xterm-addon-fit/lib/xterm-addon-fit.js') });
36
-
37
- // set page html
38
- await page.setContent(html);
39
- await page.waitForSelector('.main');
40
- page.on('console', (txt) => console.log(txt.text()));
41
-
42
- // setup terminal
43
- await page.evaluate(
44
- ({ options, lines, mode, viewport }) => {
45
- const fit = new FitAddon.FitAddon();
46
- const term = new Terminal({ ...options, convertEol: true });
47
- term.open(document.getElementById('terminal'));
48
- term.loadAddon(fit);
49
- term.writeln('');
50
-
51
- if (mode === 'default') {
52
- lines.forEach((line) => {
53
- line = line.replace(/\\x1.?\[/g, "\x1b[");
54
- line = `${line}\x1b[0m`;
55
- term.writeln(line);
56
- });
57
- } else {
58
- if (Array.isArray(lines)) {
59
- lines = lines.length > 1 ? lines : lines[0];
60
- }
61
- lines = lines.replace(/\n/g, '\r\n');
62
- term.write(lines.trim());
63
- }
64
- const height = viewport.height - 60;
65
- document.querySelector('.xterm-screen').style.width = `${viewport.width}px`;
66
- document.querySelector('.xterm-screen').style.height = `${height}px`;
67
- fit.fit();
68
- },
69
- { lines, mode, options: { theme, rendererType }, viewport }
70
- );
71
-
72
- await page.evaluate((theme) => (document.querySelector('.terminal').style.background = theme.background), theme);
73
- const templateStyle = __dirname + '/template/template.css';
74
-
75
- // inject user style
76
- if (style) {
77
- const styles = getStyles(style);
78
- const className = rendererType === 'dom' ? '.terminal.xterm' : 'canvas';
79
- const content = `${className} {${styles}}`;
80
- await page.addStyleTag({ content });
81
- }
82
-
83
- // inject styles
84
- await page.addStyleTag({ path: templateStyle });
85
- await page.addStyleTag({ path: `${localPath}/node_modules/xterm/css/xterm.css` });
86
-
87
- await page.evaluateHandle('document.fonts.ready');
88
-
89
- // crop image
90
- const clip = await (await page.$('.main')).boundingBox();
91
- clip.height = Math.min(clip.height, page.viewport().height);
92
- clip.width = Math.min(clip.width, page.viewport().width);
93
-
94
- await page.evaluate((height) => (document.querySelector('.main').style.height = height), clip.height);
95
-
96
- // create shellfies dir
97
- const pngsDir = path.resolve(location);
98
- const exists = await fs
99
- .access(pngsDir)
100
- .then(() => 1)
101
- .catch(() => 0);
102
- if (!exists) await fs.mkdir(pngsDir);
103
-
104
- // take screenshot
105
- await page.screenshot({ path: `${pngsDir}/${name}.${ext}`, clip, omitBackground: true, type: ext });
106
- await browser.close();
107
- } catch (err) {
108
- console.error(new Error(`\x1b[32mshellfie error: ${err.message}\x1b[0m`));
109
- console.error(err.stack);
110
- throw err;
111
- }
112
- }
113
-
114
- module.exports = shellfie;
@@ -1,58 +0,0 @@
1
- @import url('https://fonts.googleapis.com/css2?family=Fira+Code&family=Roboto&display=swap');
2
-
3
- body {
4
- margin: 0;
5
- padding: 0;
6
- }
7
-
8
- .main {
9
- height: auto;
10
- }
11
-
12
- .footer {
13
- height: 30px;
14
- background-color: #1e1e1e;
15
- border-radius: 0 0 10px 10px;
16
- }
17
-
18
- .header {
19
- height: 30px;
20
- display: flex;
21
- align-items: center;
22
- justify-content: flex-start;
23
- padding: 0 5px;
24
- background-color: #1e1e1e;
25
- border-radius: 10px 10px 0 0;
26
- }
27
-
28
- .header__icon {
29
- width: 10px;
30
- height: 10px;
31
- margin-left: 5px;
32
- border-radius: 50%;
33
- }
34
-
35
- .header__icon--red {
36
- background: #ff5f57;
37
- }
38
-
39
- .header__icon--yellow {
40
- background: #ffbc2e;
41
- }
42
-
43
- .header__icon--green {
44
- background: #27c840;
45
- }
46
-
47
-
48
- .xterm-rows {
49
- padding: 0 15px !important;
50
- }
51
-
52
- .xterm-cursor {
53
- display: none !important;
54
- }
55
-
56
- canvas {
57
- width: unset;
58
- }
@@ -1,21 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Shellfie 📸</title>
7
- </head>
8
-
9
- <body>
10
- <div class="main">
11
- <div class="header">
12
- <span class="header__icon header__icon--red"></span>
13
- <span class="header__icon header__icon--yellow"></span>
14
- <span class="header__icon header__icon--green"></span>
15
- </div>
16
- <div id="terminal"></div>
17
- <div class="footer"></div>
18
- </div>
19
- </body>
20
-
21
- </html>
package/utils/config.js DELETED
@@ -1,41 +0,0 @@
1
- function generateId() {
2
- const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
3
- const charactersLength = characters.length;
4
- let result = '';
5
-
6
- for (var i = 0; i < 7; i++) {
7
- result += characters.charAt(Math.floor(Math.random() * charactersLength));
8
- }
9
- return `shellfie_${result}`;
10
- }
11
-
12
- function getConfig(config, localPath) {
13
- const defaultViewport = { width: 700, height: 600 };
14
- const defaultTheme = { background: '#151515' };
15
-
16
- const options = {
17
- name: generateId(),
18
- location: `${localPath}/shellfies`,
19
- style: {},
20
- theme: defaultTheme,
21
- rendererType: 'dom',
22
- ext: 'png',
23
- puppeteerOptions: { args: ['--no-sandbox', '--disable-setuid-sandbox'] },
24
- viewport: defaultViewport,
25
- mode: 'default',
26
- };
27
-
28
- if (config) {
29
- const userConfig = Object.keys(config).reduce((acc, key) => {
30
- if (key in options) {
31
- acc[key] = typeof options[key] === 'object' ? Object.assign(options[key], config[key]) : config[key];
32
- }
33
- return acc;
34
- }, {});
35
- return Object.assign(options, userConfig);
36
- }
37
-
38
- return options;
39
- }
40
-
41
- module.exports = getConfig;
package/utils/styles.js DELETED
@@ -1,32 +0,0 @@
1
- function processLine(key, value) {
2
- const words = key.split(/(?=[A-Z])/);
3
- if (words.length > 1) {
4
- key = words.map(word => word.toLowerCase()).join('-')
5
- }
6
-
7
- return `${key}: ${value};`
8
- }
9
-
10
- function stringifyStyle(style) {
11
- return Object.keys(style)
12
- .map((rule) => processLine(rule, style[rule]))
13
- .join(' ');
14
- }
15
-
16
- function getStyle(className, style) {
17
- return `${className}{ ${stringifyStyle(style)} }`;
18
- }
19
-
20
- function getStyles(style) {
21
- return Object.keys(style)
22
- .map((key) => {
23
- if (typeof style[key] === "object") {
24
- return getStyle(key, style[key]);
25
- } else {
26
- return processLine(key, style[key]);
27
- }
28
- })
29
- .join('');
30
- }
31
-
32
- module.exports = { stringifyStyle, getStyles, getStyle };