mr-md 2.1.1-beta → 2.1.2-beta
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/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +3 -3
- package/dist/cli/dev.js +3 -3
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +3 -1
- package/dist/renderer/utils.js +1 -1
- package/package.json +1 -1
- package/src/builder.ts +3 -4
- package/src/cli/dev.ts +3 -3
- package/src/cli/init.ts +3 -1
- package/src/renderer/utils.ts +1 -1
package/dist/builder.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEX,gBAAgB,EAEhB,YAAY,EACZ,YAAY,EACZ,OAAO,EAGP,UAAU,EAEV,cAAc,EAId,YAAY,EACZ,MAAM,EACN,UAAU,EAGV,YAAY,EACZ,SAAS,EAIT,iBAAiB,EAEjB,cAAc,EACd,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"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"}
|
package/dist/builder.js
CHANGED
|
@@ -16,9 +16,9 @@ function getCallerDir() {
|
|
|
16
16
|
if (match) {
|
|
17
17
|
let p = match[1];
|
|
18
18
|
if (p.startsWith("file://")) {
|
|
19
|
-
p = p
|
|
19
|
+
p = fileURLToPath(p);
|
|
20
20
|
}
|
|
21
|
-
if (p.startsWith("/") && p[2] === ":") {
|
|
21
|
+
else if (p.startsWith("/") && p[2] === ":") {
|
|
22
22
|
p = p.substring(1);
|
|
23
23
|
}
|
|
24
24
|
if (!builderFilePath) {
|
|
@@ -307,7 +307,7 @@ export class LessonBuilder {
|
|
|
307
307
|
const base = this.options.contentBase ?? process.cwd();
|
|
308
308
|
const resolved = path.resolve(base, src);
|
|
309
309
|
const ext = path.extname(resolved);
|
|
310
|
-
const configPath = `${resolved.slice(0, -ext.length)}.config.json`;
|
|
310
|
+
const configPath = `${ext.length > 0 ? resolved.slice(0, -ext.length) : resolved}.config.json`;
|
|
311
311
|
if (fs.existsSync(configPath)) {
|
|
312
312
|
return JSON.parse(fs.readFileSync(configPath, "utf-8"));
|
|
313
313
|
}
|
package/dist/cli/dev.js
CHANGED
|
@@ -29,7 +29,7 @@ export async function runDev(args) {
|
|
|
29
29
|
if (fs.existsSync(dir)) {
|
|
30
30
|
let timeout;
|
|
31
31
|
fs.watch(dir, { recursive: true }, (eventType, filename) => {
|
|
32
|
-
if (!filename || filename.includes("out/") || filename.includes(".git/"))
|
|
32
|
+
if (!filename || filename.includes("out/") || filename.includes("out\\") || filename.includes(".git/") || filename.includes(".git\\"))
|
|
33
33
|
return;
|
|
34
34
|
clearTimeout(timeout);
|
|
35
35
|
timeout = setTimeout(() => {
|
|
@@ -47,7 +47,7 @@ export async function runDev(args) {
|
|
|
47
47
|
const url = new URL(req.url);
|
|
48
48
|
const decodedPath = decodeURIComponent(url.pathname);
|
|
49
49
|
let filePath = path.resolve(outDir, "." + decodedPath);
|
|
50
|
-
if (
|
|
50
|
+
if (decodedPath.endsWith("/")) {
|
|
51
51
|
const files = fs.existsSync(outDir) ? fs.readdirSync(outDir) : [];
|
|
52
52
|
const htmlFiles = files.filter(f => f.endsWith(".html"));
|
|
53
53
|
if (htmlFiles.includes("index.html")) {
|
|
@@ -76,7 +76,7 @@ export async function runDev(args) {
|
|
|
76
76
|
const lastBodyIndex = text.lastIndexOf("</body>");
|
|
77
77
|
if (lastBodyIndex !== -1) {
|
|
78
78
|
text = text.slice(0, lastBodyIndex) + `<script>
|
|
79
|
-
const ws = new WebSocket(
|
|
79
|
+
const ws = new WebSocket(\`ws://\${location.host}/\`);
|
|
80
80
|
ws.onmessage = (e) => { if (e.data === "reload") location.reload(); };
|
|
81
81
|
</script></body>` + text.slice(lastBodyIndex + 7);
|
|
82
82
|
}
|
package/dist/cli/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAIA,wBAAsB,OAAO,kBA8F5B"}
|
package/dist/cli/init.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as fs from "fs";
|
|
2
2
|
import * as path from "path";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
3
4
|
export async function runInit() {
|
|
4
5
|
console.log("Initializing md project structure...");
|
|
5
6
|
const dirs = [
|
|
@@ -71,7 +72,8 @@ export const firstLesson = lesson("First Lesson", { contentBase: import.meta.dir
|
|
|
71
72
|
let mrMdVersion = "latest";
|
|
72
73
|
try {
|
|
73
74
|
// Find mr-md's own package.json to get its version
|
|
74
|
-
const
|
|
75
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
76
|
+
const __dirname = path.dirname(__filename);
|
|
75
77
|
const ownPkgPath = path.resolve(__dirname, "../../package.json");
|
|
76
78
|
const ownPkg = JSON.parse(fs.readFileSync(ownPkgPath, "utf-8"));
|
|
77
79
|
mrMdVersion = ownPkg.version;
|
package/dist/renderer/utils.js
CHANGED
|
@@ -28,7 +28,7 @@ function resolveContent(src, options, expectedType = "text") {
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
const baseDir = path.resolve(options.contentBase ?? ".");
|
|
31
|
-
if (!filePath.startsWith(baseDir) && options.strict !== false) {
|
|
31
|
+
if (!filePath.startsWith(baseDir + path.sep) && filePath !== baseDir && options.strict !== false) {
|
|
32
32
|
throw new Error(`Security Error: Path traversal attempt outside contentBase: ${filePath}`);
|
|
33
33
|
}
|
|
34
34
|
if (fs.existsSync(filePath)) {
|
package/package.json
CHANGED
package/src/builder.ts
CHANGED
|
@@ -48,9 +48,8 @@ function getCallerDir(): string | undefined {
|
|
|
48
48
|
if (match) {
|
|
49
49
|
let p = match[1];
|
|
50
50
|
if (p.startsWith("file://")) {
|
|
51
|
-
p = p
|
|
52
|
-
}
|
|
53
|
-
if (p.startsWith("/") && p[2] === ":") {
|
|
51
|
+
p = fileURLToPath(p);
|
|
52
|
+
} else if (p.startsWith("/") && p[2] === ":") {
|
|
54
53
|
p = p.substring(1);
|
|
55
54
|
}
|
|
56
55
|
if (!builderFilePath) {
|
|
@@ -405,7 +404,7 @@ export class LessonBuilder {
|
|
|
405
404
|
const base = this.options.contentBase ?? process.cwd();
|
|
406
405
|
const resolved = path.resolve(base, src);
|
|
407
406
|
const ext = path.extname(resolved);
|
|
408
|
-
const configPath = `${resolved.slice(0, -ext.length)}.config.json`;
|
|
407
|
+
const configPath = `${ext.length > 0 ? resolved.slice(0, -ext.length) : resolved}.config.json`;
|
|
409
408
|
if (fs.existsSync(configPath)) {
|
|
410
409
|
return JSON.parse(fs.readFileSync(configPath, "utf-8"));
|
|
411
410
|
}
|
package/src/cli/dev.ts
CHANGED
|
@@ -36,7 +36,7 @@ export async function runDev(args: string[]) {
|
|
|
36
36
|
if (fs.existsSync(dir)) {
|
|
37
37
|
let timeout: NodeJS.Timeout;
|
|
38
38
|
fs.watch(dir, { recursive: true }, (eventType, filename) => {
|
|
39
|
-
if (!filename || filename.includes("out/") || filename.includes(".git/")) return;
|
|
39
|
+
if (!filename || filename.includes("out/") || filename.includes("out\\") || filename.includes(".git/") || filename.includes(".git\\")) return;
|
|
40
40
|
|
|
41
41
|
clearTimeout(timeout);
|
|
42
42
|
timeout = setTimeout(() => {
|
|
@@ -56,7 +56,7 @@ export async function runDev(args: string[]) {
|
|
|
56
56
|
const decodedPath = decodeURIComponent(url.pathname);
|
|
57
57
|
let filePath = path.resolve(outDir, "." + decodedPath);
|
|
58
58
|
|
|
59
|
-
if (
|
|
59
|
+
if (decodedPath.endsWith("/")) {
|
|
60
60
|
const files = fs.existsSync(outDir) ? fs.readdirSync(outDir) : [];
|
|
61
61
|
const htmlFiles = files.filter(f => f.endsWith(".html"));
|
|
62
62
|
if (htmlFiles.includes("index.html")) {
|
|
@@ -84,7 +84,7 @@ export async function runDev(args: string[]) {
|
|
|
84
84
|
const lastBodyIndex = text.lastIndexOf("</body>");
|
|
85
85
|
if (lastBodyIndex !== -1) {
|
|
86
86
|
text = text.slice(0, lastBodyIndex) + `<script>
|
|
87
|
-
const ws = new WebSocket(
|
|
87
|
+
const ws = new WebSocket(\`ws://\${location.host}/\`);
|
|
88
88
|
ws.onmessage = (e) => { if (e.data === "reload") location.reload(); };
|
|
89
89
|
</script></body>` + text.slice(lastBodyIndex + 7);
|
|
90
90
|
}
|
package/src/cli/init.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as fs from "fs";
|
|
2
2
|
import * as path from "path";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
3
4
|
|
|
4
5
|
export async function runInit() {
|
|
5
6
|
console.log("Initializing md project structure...");
|
|
@@ -77,7 +78,8 @@ export const firstLesson = lesson("First Lesson", { contentBase: import.meta.dir
|
|
|
77
78
|
let mrMdVersion = "latest";
|
|
78
79
|
try {
|
|
79
80
|
// Find mr-md's own package.json to get its version
|
|
80
|
-
const
|
|
81
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
82
|
+
const __dirname = path.dirname(__filename);
|
|
81
83
|
const ownPkgPath = path.resolve(__dirname, "../../package.json");
|
|
82
84
|
const ownPkg = JSON.parse(fs.readFileSync(ownPkgPath, "utf-8"));
|
|
83
85
|
mrMdVersion = ownPkg.version;
|
package/src/renderer/utils.ts
CHANGED
|
@@ -46,7 +46,7 @@ function resolveContent(
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
const baseDir = path.resolve(options.contentBase ?? ".");
|
|
49
|
-
if (!filePath.startsWith(baseDir) && options.strict !== false) {
|
|
49
|
+
if (!filePath.startsWith(baseDir + path.sep) && filePath !== baseDir && options.strict !== false) {
|
|
50
50
|
throw new Error(`Security Error: Path traversal attempt outside contentBase: ${filePath}`);
|
|
51
51
|
}
|
|
52
52
|
|