Skip to content

Commit 8391b5b

Browse files
authored
Feat: define filetypes (#20)
* feat: filename directives are uppercased * feat: filecount by extension * fix: readme
1 parent c0d9555 commit 8391b5b

File tree

8 files changed

+108
-43
lines changed

8 files changed

+108
-43
lines changed

README.md

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ The content of **generated file** (do not edit, just use)
107107
```c
108108
#define SVELTEESP32_COUNT 5
109109
#define SVELTEESP32_SIZE 145633
110-
#define SVELTEESP32_FILE_index_html
110+
#define SVELTEESP32_FILE_INDEX_HTML
111+
#define SVELTEESP32_HTML_FILES 1
111112
...
112113
113114
const uint8_t data0[12547] = {0x1f, 0x8b, 0x8, 0x0, ...
@@ -189,30 +190,42 @@ You can use the COUNT and SIZE constants:
189190
...
190191
```
191192

192-
You can include a warning if a named file accidentally missing from the build:
193+
You can include a blocker error if a named file accidentally missing from the build:
193194

194195
```c
195196
...
196197
#include "svelteesp32.h"
197198

198-
#ifndef SVELTEESP32_FILE_index_html
199+
#ifndef SVELTEESP32_FILE_INDEX_HTML
199200
#error Missing index file
200201
#endif
201202
...
202203
```
203204

205+
...or if there are too many of a file type:
206+
207+
```c
208+
...
209+
#include "svelteesp32.h"
210+
211+
#if SVELTEESP32_CSS_FILES > 1
212+
#error Too many CSS files
213+
#endif
214+
...
215+
```
216+
204217
### Command line options
205218

206-
| Option | Required | Description | default |
207-
| ------------- | :------: | ---------------------------------------------------------------- | ----------------------- |
208-
| `-e` | x | The engine for which the include file is created (psychic/async) | psychic |
209-
| `-s` | x | Source dist folder contains compiled web files | |
210-
| `-o` | x | Generated output file with path | `svelteesp32.h` |
211-
| `--etag` | | Use ETag header for cache | false |
212-
| `--no-gzip` | | Do not compress content with gzip | false -> gzip used |
213-
| `--espmethod` | x | Name of generated method | `initSvelteStaticFiles` |
214-
| `--define` | x | Prefix of c++ defines | `SVELTEESP32` |
215-
| `-h` | | Show help | |
219+
| Option | Description | default |
220+
| ------------- | --------------------------------------------------------- | ----------------------- | ------- |
221+
| `-s` | **Source dist folder contains compiled web files** | |
222+
| `-e` | The engine for which the include file is created [psychic | async] | psychic |
223+
| `-o` | Generated output file with path | `svelteesp32.h` |
224+
| `--etag` | Use ETag header for cache | false |
225+
| `--no-gzip` | Do not compress content with gzip | false -> gzip used |
226+
| `--espmethod` | Name of generated method | `initSvelteStaticFiles` |
227+
| `--define` | Prefix of c++ defines | `SVELTEESP32` |
228+
| `-h` | Show help | |
216229

217230
### Q&A
218231

demo/esp32/include/svelteesp32async.h

Lines changed: 13 additions & 6 deletions
Large diffs are not rendered by default.

demo/esp32/include/svelteesp32psychic.h

Lines changed: 13 additions & 6 deletions
Large diffs are not rendered by default.

demo/esp32/src/main.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@
88
#error Invalid file count
99
#endif
1010

11-
#ifndef SVELTEESP32_FILE_index_html
11+
#ifndef SVELTEESP32_FILE_INDEX_HTML
1212
#error Missing index file
1313
#endif
1414

15+
#if SVELTEESP32_CSS_FILES > 1
16+
#error Too many CSS files
17+
#endif
18+
1519
AsyncWebServer server(80);
1620
void setup()
1721
{
@@ -30,10 +34,14 @@ void loop() {}
3034
#error Invalid file count
3135
#endif
3236

33-
#ifndef SVELTEESP32_FILE_index_html
37+
#ifndef SVELTEESP32_FILE_INDEX_HTML
3438
#error Missing index file
3539
#endif
3640

41+
#if SVELTEESP32_CSS_FILES > 1
42+
#error Too many CSS files
43+
#endif
44+
3745
PsychicHttpServer server;
3846
void setup()
3947
{

package-lock.json

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
],
5757
"devDependencies": {
5858
"@types/mime-types": "^2.1.4",
59-
"@types/node": "^22.2.0",
59+
"@types/node": "^22.3.0",
6060
"@typescript-eslint/eslint-plugin": "^8.1.0",
6161
"@typescript-eslint/parser": "^8.1.0",
6262
"eslint": "^9.9.0",

src/cppCode.ts

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,22 @@ import { compile as handlebarsCompile } from 'handlebars';
22

33
import { cmdLine } from './commandLine';
44

5-
export type cppCodeSource = {
5+
export type CppCodeSource = {
66
filename: string;
77
dataname: string;
8+
datanameUpperCase: string;
89
mime: string;
910
content: Buffer;
1011
isGzip: boolean;
1112
md5: string;
1213
};
14+
export type CppCodeSources = CppCodeSource[];
15+
16+
export type ExtensionGroup = {
17+
extension: string;
18+
count: number;
19+
};
20+
export type ExtensionGroups = ExtensionGroup[];
1321

1422
const psychicTemplate = `
1523
//engine: PsychicHttpServer
@@ -24,8 +32,13 @@ const psychicTemplate = `
2432
2533
#define {{definePrefix}}_COUNT {{fileCount}}
2634
#define {{definePrefix}}_SIZE {{fileSize}}
35+
2736
{{#each sources}}
28-
#define {{../definePrefix}}_FILE_{{this.dataname}}
37+
#define {{../definePrefix}}_FILE_{{this.datanameUpperCase}}
38+
{{/each}}
39+
40+
{{#each filesByExtension}}
41+
#define {{../definePrefix}}_{{this.extension}}_FILES {{this.count}}
2942
{{/each}}
3043
3144
{{#each sources}}
@@ -72,8 +85,13 @@ const asyncTemplate = `
7285
7386
#define {{definePrefix}}_COUNT {{fileCount}}
7487
#define {{definePrefix}}_SIZE {{fileSize}}
88+
7589
{{#each sources}}
76-
#define {{../definePrefix}}_FILE_{{this.dataname}}
90+
#define {{../definePrefix}}_FILE_{{this.datanameUpperCase}}
91+
{{/each}}
92+
93+
{{#each filesByExtension}}
94+
#define {{../definePrefix}}_{{this.extension}}_FILES {{this.count}}
7795
{{/each}}
7896
7997
{{#each sources}}
@@ -109,7 +127,7 @@ void {{methodName}}(AsyncWebServer * server) {
109127
{{/each}}
110128
}`;
111129

112-
export const getCppCode = (sources: cppCodeSource[]): string =>
130+
export const getCppCode = (sources: CppCodeSources, filesByExtension: ExtensionGroups): string =>
113131
handlebarsCompile(cmdLine.engine === 'psychic' ? psychicTemplate : asyncTemplate)({
114132
commandLine: process.argv.slice(2).join(' '),
115133
now: `${new Date().toLocaleDateString()} ${new Date().toLocaleTimeString()}`,
@@ -121,6 +139,7 @@ export const getCppCode = (sources: cppCodeSource[]): string =>
121139
bytes: [...s.content].map((v) => `0x${v.toString(16)}`).join(', '),
122140
isDefault: s.filename.startsWith('index.htm')
123141
})),
142+
filesByExtension,
124143
isEtag: cmdLine.etag,
125144
methodName: cmdLine.espmethod,
126145
definePrefix: cmdLine.define

src/index.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { gzipSync } from 'node:zlib';
77
import { lookup } from 'mime-types';
88

99
import { cmdLine } from './commandLine';
10-
import { cppCodeSource, getCppCode } from './cppCode';
10+
import { CppCodeSources, ExtensionGroups, getCppCode } from './cppCode';
1111
import { getFiles } from './file';
1212

1313
const summary = {
@@ -16,7 +16,8 @@ const summary = {
1616
gzipsize: 0
1717
};
1818

19-
const sources: cppCodeSource[] = [];
19+
const sources: CppCodeSources = [];
20+
const filesByExtension: ExtensionGroups = [];
2021
const files = getFiles();
2122
if (files.length === 0) {
2223
console.error(`Directory ${cmdLine.sourcepath} is empty`);
@@ -30,6 +31,12 @@ for (const file of files) {
3031

3132
const filename = file.replace(/\\/g, '/');
3233
const dataname = filename.replace(/[./-]/g, '_');
34+
let extension = path.extname(filename).toUpperCase();
35+
if (extension.startsWith('.')) extension = extension.slice(1);
36+
37+
const group = filesByExtension.find((fe) => fe.extension === extension);
38+
if (group) group.count += 1;
39+
else filesByExtension.push({ extension, count: 1 });
3340

3441
const rawContent = readFileSync(path.join(cmdLine.sourcepath, file), { flag: 'r' });
3542
const md5 = createHash('md5').update(rawContent).digest('hex');
@@ -38,6 +45,7 @@ for (const file of files) {
3845
sources.push({
3946
filename: filename,
4047
dataname,
48+
datanameUpperCase: dataname.toUpperCase(),
4149
content: rawContent,
4250
isGzip: false,
4351
mime,
@@ -51,6 +59,7 @@ for (const file of files) {
5159
sources.push({
5260
filename: filename,
5361
dataname,
62+
datanameUpperCase: dataname.toUpperCase(),
5463
content: zipContent,
5564
isGzip: true,
5665
mime,
@@ -61,6 +70,7 @@ for (const file of files) {
6170
sources.push({
6271
filename: filename,
6372
dataname,
73+
datanameUpperCase: dataname.toUpperCase(),
6474
content: rawContent,
6575
isGzip: false,
6676
mime,
@@ -72,8 +82,9 @@ for (const file of files) {
7282

7383
console.log('');
7484
}
85+
filesByExtension.sort((left, right) => left.extension.localeCompare(right.extension));
7586

76-
const cppFile = getCppCode(sources);
87+
const cppFile = getCppCode(sources, filesByExtension);
7788
writeFileSync(cmdLine.outputfile, cppFile);
7889

7990
if (cmdLine['no-gzip']) {

0 commit comments

Comments
 (0)