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.
- package/LICENSE +1 -1
- package/README.md +221 -165
- package/dist/fonts/index.d.ts +21 -0
- package/dist/fonts/index.d.ts.map +1 -0
- package/dist/fonts/index.js +92 -0
- package/dist/fonts/index.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +124 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/index.d.ts +6 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +189 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/types.d.ts +17 -0
- package/dist/parser/types.d.ts.map +1 -0
- package/dist/parser/types.js +3 -0
- package/dist/parser/types.js.map +1 -0
- package/dist/renderer/colors.d.ts +9 -0
- package/dist/renderer/colors.d.ts.map +1 -0
- package/dist/renderer/colors.js +100 -0
- package/dist/renderer/colors.js.map +1 -0
- package/dist/renderer/customGlyphs.d.ts +17 -0
- package/dist/renderer/customGlyphs.d.ts.map +1 -0
- package/dist/renderer/customGlyphs.js +730 -0
- package/dist/renderer/customGlyphs.js.map +1 -0
- package/dist/renderer/index.d.ts +10 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +231 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/text.d.ts +13 -0
- package/dist/renderer/text.d.ts.map +1 -0
- package/dist/renderer/text.js +128 -0
- package/dist/renderer/text.js.map +1 -0
- package/dist/templates/base.d.ts +5 -0
- package/dist/templates/base.d.ts.map +1 -0
- package/dist/templates/base.js +37 -0
- package/dist/templates/base.js.map +1 -0
- package/dist/templates/index.d.ts +13 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +34 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/macos.d.ts +12 -0
- package/dist/templates/macos.d.ts.map +1 -0
- package/dist/templates/macos.js +34 -0
- package/dist/templates/macos.js.map +1 -0
- package/dist/templates/minimal.d.ts +13 -0
- package/dist/templates/minimal.d.ts.map +1 -0
- package/dist/templates/minimal.js +27 -0
- package/dist/templates/minimal.js.map +1 -0
- package/dist/templates/windows.d.ts +12 -0
- package/dist/templates/windows.d.ts.map +1 -0
- package/dist/templates/windows.js +34 -0
- package/dist/templates/windows.js.map +1 -0
- package/dist/themes/catppuccin-mocha.d.ts +3 -0
- package/dist/themes/catppuccin-mocha.d.ts.map +1 -0
- package/dist/themes/catppuccin-mocha.js +27 -0
- package/dist/themes/catppuccin-mocha.js.map +1 -0
- package/dist/themes/dracula.d.ts +3 -0
- package/dist/themes/dracula.d.ts.map +1 -0
- package/dist/themes/dracula.js +27 -0
- package/dist/themes/dracula.js.map +1 -0
- package/dist/themes/github-dark.d.ts +3 -0
- package/dist/themes/github-dark.d.ts.map +1 -0
- package/dist/themes/github-dark.js +27 -0
- package/dist/themes/github-dark.js.map +1 -0
- package/dist/themes/github-light.d.ts +3 -0
- package/dist/themes/github-light.d.ts.map +1 -0
- package/dist/themes/github-light.js +27 -0
- package/dist/themes/github-light.js.map +1 -0
- package/dist/themes/gruvbox-dark.d.ts +3 -0
- package/dist/themes/gruvbox-dark.d.ts.map +1 -0
- package/dist/themes/gruvbox-dark.js +27 -0
- package/dist/themes/gruvbox-dark.js.map +1 -0
- package/dist/themes/gruvbox-light.d.ts +3 -0
- package/dist/themes/gruvbox-light.d.ts.map +1 -0
- package/dist/themes/gruvbox-light.js +27 -0
- package/dist/themes/gruvbox-light.js.map +1 -0
- package/dist/themes/index.d.ts +27 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +54 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/themes/monokai.d.ts +3 -0
- package/dist/themes/monokai.d.ts.map +1 -0
- package/dist/themes/monokai.js +27 -0
- package/dist/themes/monokai.js.map +1 -0
- package/dist/themes/nord.d.ts +3 -0
- package/dist/themes/nord.d.ts.map +1 -0
- package/dist/themes/nord.js +27 -0
- package/dist/themes/nord.js.map +1 -0
- package/dist/themes/one-dark.d.ts +3 -0
- package/dist/themes/one-dark.d.ts.map +1 -0
- package/dist/themes/one-dark.js +27 -0
- package/dist/themes/one-dark.js.map +1 -0
- package/dist/themes/solarized-dark.d.ts +3 -0
- package/dist/themes/solarized-dark.d.ts.map +1 -0
- package/dist/themes/solarized-dark.js +27 -0
- package/dist/themes/solarized-dark.js.map +1 -0
- package/dist/themes/solarized-light.d.ts +3 -0
- package/dist/themes/solarized-light.d.ts.map +1 -0
- package/dist/themes/solarized-light.js +27 -0
- package/dist/themes/solarized-light.js.map +1 -0
- package/dist/themes/tokyo-night.d.ts +3 -0
- package/dist/themes/tokyo-night.d.ts.map +1 -0
- package/dist/themes/tokyo-night.js +27 -0
- package/dist/themes/tokyo-night.js.map +1 -0
- package/dist/types.d.ts +151 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +32 -21
- package/shellfie.d.ts +0 -29
- package/shellfie.js +0 -114
- package/template/template.css +0 -58
- package/template/template.html +0 -21
- package/utils/config.js +0 -41
- 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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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": "
|
|
4
|
-
"description": "
|
|
5
|
-
"main": "
|
|
6
|
-
"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
"
|
|
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
|
-
"
|
|
26
|
+
"svg",
|
|
21
27
|
"screenshot",
|
|
22
|
-
"ansi"
|
|
28
|
+
"ansi",
|
|
29
|
+
"tty",
|
|
30
|
+
"cli"
|
|
23
31
|
],
|
|
24
|
-
"author": "
|
|
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
|
-
"
|
|
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;
|
package/template/template.css
DELETED
|
@@ -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
|
-
}
|
package/template/template.html
DELETED
|
@@ -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 };
|