hyperbook 0.93.0 → 0.94.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/dist/assets/directive-openscad/client.js +477 -270
- package/dist/assets/directive-openscad/style.css +12 -0
- package/dist/assets/directive-openscad/worker.js +322 -0
- package/dist/assets/directive-pyide/client.js +32 -23
- package/dist/index.js +5 -1
- package/dist/locales/de.json +2 -0
- package/dist/locales/en.json +2 -0
- package/package.json +4 -4
- package/dist/assets/directive-openscad/STLLoader.js +0 -411
|
@@ -253,6 +253,18 @@
|
|
|
253
253
|
cursor: pointer;
|
|
254
254
|
}
|
|
255
255
|
|
|
256
|
+
.directive-openscad .buttons select.download-format {
|
|
257
|
+
flex: 0 0 auto;
|
|
258
|
+
min-width: 72px;
|
|
259
|
+
padding: 8px 10px;
|
|
260
|
+
border: none;
|
|
261
|
+
border-right: 1px solid var(--color-spacer);
|
|
262
|
+
background-color: var(--color-background, var(--color--background, #fff));
|
|
263
|
+
color: var(--color-text);
|
|
264
|
+
font: inherit;
|
|
265
|
+
cursor: pointer;
|
|
266
|
+
}
|
|
267
|
+
|
|
256
268
|
.directive-openscad .buttons button:last-child {
|
|
257
269
|
border-right: none;
|
|
258
270
|
}
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
const scriptBase = new URL("./", self.location.href);
|
|
2
|
+
|
|
3
|
+
const FONTS_CONF = `<?xml version="1.0" encoding="UTF-8"?>
|
|
4
|
+
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
|
|
5
|
+
<fontconfig>
|
|
6
|
+
<dir>/fonts</dir>
|
|
7
|
+
</fontconfig>`;
|
|
8
|
+
|
|
9
|
+
const KNOWN_LIBRARIES = {
|
|
10
|
+
BOSL2: "https://ochafik.com/openscad2/libraries/BOSL2.zip",
|
|
11
|
+
BOSL: "https://ochafik.com/openscad2/libraries/BOSL.zip",
|
|
12
|
+
MCAD: "https://ochafik.com/openscad2/libraries/MCAD.zip",
|
|
13
|
+
NopSCADlib: "https://ochafik.com/openscad2/libraries/NopSCADlib.zip",
|
|
14
|
+
fonts: "https://ochafik.com/openscad2/libraries/fonts.zip",
|
|
15
|
+
};
|
|
16
|
+
const OPENSCAD_BACKEND_ARG = "--backend=manifold";
|
|
17
|
+
const OPENSCAD_FEATURE_ARGS = ["--enable=lazy-union"];
|
|
18
|
+
|
|
19
|
+
let openscadModulePromise = null;
|
|
20
|
+
let robotoFontData = null;
|
|
21
|
+
|
|
22
|
+
// Per-name cache of extracted file maps: Map<name, { [path]: Uint8Array }>
|
|
23
|
+
const libraryCache = new Map();
|
|
24
|
+
|
|
25
|
+
const invokeOpenScad = (instance, args) => {
|
|
26
|
+
try {
|
|
27
|
+
return instance.callMain(args);
|
|
28
|
+
} catch (e) {
|
|
29
|
+
if (typeof e === "number" && typeof instance.formatException === "function") {
|
|
30
|
+
throw new Error(`OpenSCAD invocation failed: ${instance.formatException(e)}`);
|
|
31
|
+
}
|
|
32
|
+
throw new Error(`OpenSCAD invocation failed: ${e}`);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const getOpenScad = async (mergedOutputs) => {
|
|
37
|
+
if (!openscadModulePromise) {
|
|
38
|
+
openscadModulePromise = import(/* @vite-ignore */ new URL("openscad.js", scriptBase).href);
|
|
39
|
+
}
|
|
40
|
+
const OpenSCAD = (await openscadModulePromise).default;
|
|
41
|
+
const instance = await OpenSCAD({
|
|
42
|
+
noInitialRun: true,
|
|
43
|
+
locateFile: (file) => new URL(file, scriptBase).href,
|
|
44
|
+
print: (text) => mergedOutputs.push({ stdout: text }),
|
|
45
|
+
printErr: (text) => mergedOutputs.push({ stderr: text }),
|
|
46
|
+
});
|
|
47
|
+
const fs = instance.FS;
|
|
48
|
+
try {
|
|
49
|
+
fs.mkdir("/tmp");
|
|
50
|
+
} catch (_) {}
|
|
51
|
+
try {
|
|
52
|
+
fs.mkdir("/fonts");
|
|
53
|
+
} catch (_) {}
|
|
54
|
+
// Fonts are resolved from $(cwd)/fonts — keep cwd at /
|
|
55
|
+
try {
|
|
56
|
+
instance.FS.chdir("/");
|
|
57
|
+
} catch (_) {}
|
|
58
|
+
try {
|
|
59
|
+
fs.writeFile("/fonts/fonts.conf", FONTS_CONF);
|
|
60
|
+
} catch (_) {}
|
|
61
|
+
// Write cached font data if already fetched.
|
|
62
|
+
if (robotoFontData) {
|
|
63
|
+
try {
|
|
64
|
+
fs.writeFile("/fonts/Roboto-Regular.ttf", robotoFontData);
|
|
65
|
+
} catch (_) {}
|
|
66
|
+
}
|
|
67
|
+
return instance;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
// Minimal ZIP extractor using the browser-native DecompressionStream API.
|
|
71
|
+
// Supports Stored (method 0) and Deflate (method 8) entries.
|
|
72
|
+
const extractZip = async (buffer) => {
|
|
73
|
+
const view = new DataView(buffer);
|
|
74
|
+
const bytes = new Uint8Array(buffer);
|
|
75
|
+
const files = {};
|
|
76
|
+
const dec = new TextDecoder();
|
|
77
|
+
|
|
78
|
+
// Locate End of Central Directory record.
|
|
79
|
+
let eocdPos = -1;
|
|
80
|
+
for (let i = buffer.byteLength - 22; i >= Math.max(0, buffer.byteLength - 65558); i--) {
|
|
81
|
+
if (view.getUint32(i, true) === 0x06054b50) {
|
|
82
|
+
eocdPos = i;
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (eocdPos < 0) throw new Error("Not a valid ZIP file");
|
|
87
|
+
|
|
88
|
+
const entryCount = view.getUint16(eocdPos + 10, true);
|
|
89
|
+
let cdOffset = view.getUint32(eocdPos + 16, true);
|
|
90
|
+
|
|
91
|
+
for (let i = 0; i < entryCount; i++) {
|
|
92
|
+
if (view.getUint32(cdOffset, true) !== 0x02014b50) break;
|
|
93
|
+
const compression = view.getUint16(cdOffset + 10, true);
|
|
94
|
+
const compressedSize = view.getUint32(cdOffset + 20, true);
|
|
95
|
+
const fnLen = view.getUint16(cdOffset + 28, true);
|
|
96
|
+
const extraLen = view.getUint16(cdOffset + 30, true);
|
|
97
|
+
const commentLen = view.getUint16(cdOffset + 32, true);
|
|
98
|
+
const localOffset = view.getUint32(cdOffset + 42, true);
|
|
99
|
+
const name = dec.decode(bytes.subarray(cdOffset + 46, cdOffset + 46 + fnLen));
|
|
100
|
+
cdOffset += 46 + fnLen + extraLen + commentLen;
|
|
101
|
+
|
|
102
|
+
if (name.endsWith("/")) continue;
|
|
103
|
+
|
|
104
|
+
const localFnLen = view.getUint16(localOffset + 26, true);
|
|
105
|
+
const localExtraLen = view.getUint16(localOffset + 28, true);
|
|
106
|
+
const dataStart = localOffset + 30 + localFnLen + localExtraLen;
|
|
107
|
+
const compressed = bytes.subarray(dataStart, dataStart + compressedSize);
|
|
108
|
+
|
|
109
|
+
if (compression === 0) {
|
|
110
|
+
files[name] = new Uint8Array(compressed);
|
|
111
|
+
} else if (compression === 8) {
|
|
112
|
+
const ds = new DecompressionStream("deflate-raw");
|
|
113
|
+
const writer = ds.writable.getWriter();
|
|
114
|
+
const reader = ds.readable.getReader();
|
|
115
|
+
writer.write(compressed);
|
|
116
|
+
writer.close();
|
|
117
|
+
const chunks = [];
|
|
118
|
+
let totalLen = 0;
|
|
119
|
+
while (true) {
|
|
120
|
+
const { done, value } = await reader.read();
|
|
121
|
+
if (done) break;
|
|
122
|
+
chunks.push(value);
|
|
123
|
+
totalLen += value.byteLength;
|
|
124
|
+
}
|
|
125
|
+
const out = new Uint8Array(totalLen);
|
|
126
|
+
let pos = 0;
|
|
127
|
+
for (const c of chunks) {
|
|
128
|
+
out.set(c, pos);
|
|
129
|
+
pos += c.byteLength;
|
|
130
|
+
}
|
|
131
|
+
files[name] = out;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return files;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const loadLibrary = async (name) => {
|
|
138
|
+
if (libraryCache.has(name)) return libraryCache.get(name);
|
|
139
|
+
const url = KNOWN_LIBRARIES[name];
|
|
140
|
+
if (!url) throw new Error(`Unknown OpenSCAD library: ${name}`);
|
|
141
|
+
const resp = await fetch(url);
|
|
142
|
+
if (!resp.ok) throw new Error(`Failed to fetch library ${name}: ${resp.status}`);
|
|
143
|
+
const files = await extractZip(await resp.arrayBuffer());
|
|
144
|
+
libraryCache.set(name, files);
|
|
145
|
+
return files;
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
// Mount a list of libraries into a WASM FS instance.
|
|
149
|
+
// Each library is written to /<name>/<file> so `use <BOSL2/std.scad>` resolves correctly.
|
|
150
|
+
const mountLibraries = async (instance, libraryNames) => {
|
|
151
|
+
for (const libName of libraryNames) {
|
|
152
|
+
const files = await loadLibrary(libName);
|
|
153
|
+
try {
|
|
154
|
+
instance.FS.mkdir(`/${libName}`);
|
|
155
|
+
} catch (_) {}
|
|
156
|
+
for (const [filePath, data] of Object.entries(files)) {
|
|
157
|
+
const parts = filePath.split("/");
|
|
158
|
+
let dir = `/${libName}`;
|
|
159
|
+
for (let j = 0; j < parts.length - 1; j++) {
|
|
160
|
+
dir += "/" + parts[j];
|
|
161
|
+
try {
|
|
162
|
+
instance.FS.mkdir(dir);
|
|
163
|
+
} catch (_) {}
|
|
164
|
+
}
|
|
165
|
+
try {
|
|
166
|
+
instance.FS.writeFile(`/${libName}/${filePath}`, data);
|
|
167
|
+
} catch (_) {}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
// Fetch the Roboto TTF once and cache it in memory so it can be written
|
|
173
|
+
// to each new WASM instance's FS to enable OpenSCAD text() rendering.
|
|
174
|
+
const loadFonts = async () => {
|
|
175
|
+
if (robotoFontData) return;
|
|
176
|
+
try {
|
|
177
|
+
const resp = await fetch("https://fonts.gstatic.com/s/roboto/v32/KFOmCnqEu92Fr1Me5Q.ttf");
|
|
178
|
+
if (resp.ok) {
|
|
179
|
+
robotoFontData = new Uint8Array(await resp.arrayBuffer());
|
|
180
|
+
}
|
|
181
|
+
} catch (e) {
|
|
182
|
+
console.warn("[openscad] Failed to load fonts:", e);
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
const toArrayBuffer = (content) => {
|
|
187
|
+
const typed = content instanceof Uint8Array ? content : new Uint8Array(content || []);
|
|
188
|
+
return typed.buffer.slice(typed.byteOffset, typed.byteOffset + typed.byteLength);
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
const serializeInvocationResults = (result) => {
|
|
192
|
+
const transfer = [];
|
|
193
|
+
const outputs = (result.outputs || []).map(([path, content]) => {
|
|
194
|
+
const buffer = toArrayBuffer(content);
|
|
195
|
+
transfer.push(buffer);
|
|
196
|
+
return [path, buffer];
|
|
197
|
+
});
|
|
198
|
+
return {
|
|
199
|
+
result: {
|
|
200
|
+
...result,
|
|
201
|
+
outputs,
|
|
202
|
+
},
|
|
203
|
+
transfer,
|
|
204
|
+
};
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
const runOpenScadInvocation = async ({
|
|
208
|
+
code,
|
|
209
|
+
sourcePath,
|
|
210
|
+
outputPaths = [],
|
|
211
|
+
args = [],
|
|
212
|
+
libraryNames = [],
|
|
213
|
+
}) => {
|
|
214
|
+
const mergedOutputs = [];
|
|
215
|
+
const start = performance.now();
|
|
216
|
+
|
|
217
|
+
try {
|
|
218
|
+
await loadFonts();
|
|
219
|
+
const instance = await getOpenScad(mergedOutputs);
|
|
220
|
+
|
|
221
|
+
if (libraryNames.length > 0) {
|
|
222
|
+
await mountLibraries(instance, libraryNames);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
try {
|
|
226
|
+
instance.FS.unlink(sourcePath);
|
|
227
|
+
} catch (_) {}
|
|
228
|
+
for (const outputPath of outputPaths) {
|
|
229
|
+
try {
|
|
230
|
+
instance.FS.unlink(outputPath);
|
|
231
|
+
} catch (_) {}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
instance.FS.writeFile(sourcePath, code || "");
|
|
235
|
+
const exitCode = invokeOpenScad(instance, args);
|
|
236
|
+
|
|
237
|
+
const outputs = [];
|
|
238
|
+
for (const outputPath of outputPaths) {
|
|
239
|
+
const content = instance.FS.readFile(outputPath, { encoding: "binary" });
|
|
240
|
+
outputs.push([outputPath, content]);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return {
|
|
244
|
+
exitCode,
|
|
245
|
+
outputs,
|
|
246
|
+
mergedOutputs,
|
|
247
|
+
elapsedMillis: performance.now() - start,
|
|
248
|
+
};
|
|
249
|
+
} catch (e) {
|
|
250
|
+
const error = `${e}`;
|
|
251
|
+
mergedOutputs.push({ error });
|
|
252
|
+
return {
|
|
253
|
+
exitCode: undefined,
|
|
254
|
+
error,
|
|
255
|
+
outputs: [],
|
|
256
|
+
mergedOutputs,
|
|
257
|
+
elapsedMillis: performance.now() - start,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
self.addEventListener("message", async (event) => {
|
|
263
|
+
const { requestId, type, payload } = event.data || {};
|
|
264
|
+
if (!requestId || typeof type !== "string") return;
|
|
265
|
+
|
|
266
|
+
try {
|
|
267
|
+
let result;
|
|
268
|
+
if (type === "extractParams") {
|
|
269
|
+
const sourcePath = "/tmp/params_model.scad";
|
|
270
|
+
const outPath = "/tmp/params_out.json";
|
|
271
|
+
result = await runOpenScadInvocation({
|
|
272
|
+
code: `$preview=true;\n${payload?.code || ""}`,
|
|
273
|
+
sourcePath,
|
|
274
|
+
outputPaths: [outPath],
|
|
275
|
+
libraryNames: payload?.libraryNames || [],
|
|
276
|
+
args: [
|
|
277
|
+
sourcePath,
|
|
278
|
+
"-o",
|
|
279
|
+
outPath,
|
|
280
|
+
"--export-format=param",
|
|
281
|
+
],
|
|
282
|
+
});
|
|
283
|
+
const serialized = serializeInvocationResults(result);
|
|
284
|
+
self.postMessage({ requestId, ok: true, result: serialized.result }, serialized.transfer);
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
if (type === "render") {
|
|
288
|
+
const format = payload?.format || "stl";
|
|
289
|
+
const sourcePath = "/tmp/model.scad";
|
|
290
|
+
const outPath = `/tmp/output.${format}`;
|
|
291
|
+
const exportFormat = format === "stl" ? "binstl" : format;
|
|
292
|
+
result = await runOpenScadInvocation({
|
|
293
|
+
code: payload?.isPreview ? `$preview=true;\n${payload?.code || ""}` : (payload?.code || ""),
|
|
294
|
+
sourcePath,
|
|
295
|
+
outputPaths: [outPath],
|
|
296
|
+
libraryNames: payload?.libraryNames || [],
|
|
297
|
+
args: [
|
|
298
|
+
sourcePath,
|
|
299
|
+
"-o",
|
|
300
|
+
outPath,
|
|
301
|
+
OPENSCAD_BACKEND_ARG,
|
|
302
|
+
`--export-format=${exportFormat}`,
|
|
303
|
+
...(payload?.paramDefinitions || []),
|
|
304
|
+
...OPENSCAD_FEATURE_ARGS,
|
|
305
|
+
],
|
|
306
|
+
});
|
|
307
|
+
const serialized = serializeInvocationResults(result);
|
|
308
|
+
self.postMessage({ requestId, ok: true, result: serialized.result }, serialized.transfer);
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
throw new Error(`Unknown OpenSCAD worker request: ${type}`);
|
|
312
|
+
} catch (error) {
|
|
313
|
+
self.postMessage({
|
|
314
|
+
requestId,
|
|
315
|
+
ok: false,
|
|
316
|
+
error: {
|
|
317
|
+
message: error?.message || String(error),
|
|
318
|
+
stderr: Array.isArray(error?.stderr) ? error.stderr : [],
|
|
319
|
+
},
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
});
|
|
@@ -381,6 +381,22 @@ hyperbook.python = (function () {
|
|
|
381
381
|
const numeric = Number(value);
|
|
382
382
|
return Number.isFinite(numeric) ? numeric : fallback;
|
|
383
383
|
};
|
|
384
|
+
const toPlainBoolean = (value, fallback = false) => {
|
|
385
|
+
if (value === null || value === undefined) return fallback;
|
|
386
|
+
if (typeof value === "boolean") return value;
|
|
387
|
+
if (typeof value === "number") return value !== 0;
|
|
388
|
+
if (typeof value === "bigint") return value !== 0n;
|
|
389
|
+
if (typeof value === "string") {
|
|
390
|
+
const normalized = value.trim().toLowerCase();
|
|
391
|
+
if (!normalized) return fallback;
|
|
392
|
+
if (["false", "0", "no", "off"].includes(normalized)) return false;
|
|
393
|
+
if (["true", "1", "yes", "on"].includes(normalized)) return true;
|
|
394
|
+
}
|
|
395
|
+
if (typeof value.toJs === "function") {
|
|
396
|
+
return toPlainBoolean(value.toJs({ pyproxies: [] }), fallback);
|
|
397
|
+
}
|
|
398
|
+
return Boolean(value);
|
|
399
|
+
};
|
|
384
400
|
const fontSizeToCanvasUnits = (value) => {
|
|
385
401
|
const numeric = toPlainNumber(value, Number.NaN);
|
|
386
402
|
if (!Number.isFinite(numeric) || numeric === 0) {
|
|
@@ -1026,28 +1042,21 @@ hyperbook.python = (function () {
|
|
|
1026
1042
|
let writeMove = move;
|
|
1027
1043
|
let writeAlign = align;
|
|
1028
1044
|
let writeFont = font;
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
const kwargs = toPlainObject(
|
|
1032
|
-
if (kwargs)
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
else if (hasOwn(kwargs, "text")) writeText = kwargs.text;
|
|
1045
|
-
if (hasOwn(kwargs, "move")) writeMove = kwargs.move;
|
|
1046
|
-
if (hasOwn(kwargs, "align")) writeAlign = kwargs.align;
|
|
1047
|
-
if (hasOwn(kwargs, "font")) writeFont = kwargs.font;
|
|
1048
|
-
}
|
|
1049
|
-
writeFont = null;
|
|
1050
|
-
}
|
|
1045
|
+
const applyWriteKwargs = (candidate) => {
|
|
1046
|
+
if (!isWriteKwargsObject(candidate)) return;
|
|
1047
|
+
const kwargs = toPlainObject(candidate);
|
|
1048
|
+
if (!kwargs) return;
|
|
1049
|
+
if (hasOwn(kwargs, "arg")) writeText = kwargs.arg;
|
|
1050
|
+
else if (hasOwn(kwargs, "text")) writeText = kwargs.text;
|
|
1051
|
+
if (hasOwn(kwargs, "move")) writeMove = kwargs.move;
|
|
1052
|
+
if (hasOwn(kwargs, "align")) writeAlign = kwargs.align;
|
|
1053
|
+
if (hasOwn(kwargs, "font")) writeFont = kwargs.font;
|
|
1054
|
+
};
|
|
1055
|
+
applyWriteKwargs(writeText);
|
|
1056
|
+
applyWriteKwargs(writeMove);
|
|
1057
|
+
applyWriteKwargs(writeAlign);
|
|
1058
|
+
applyWriteKwargs(writeFont);
|
|
1059
|
+
if (isWriteKwargsObject(writeFont)) writeFont = null;
|
|
1051
1060
|
|
|
1052
1061
|
let family = currentFontFamily;
|
|
1053
1062
|
let size = fontSize;
|
|
@@ -1080,7 +1089,7 @@ hyperbook.python = (function () {
|
|
|
1080
1089
|
},
|
|
1081
1090
|
],
|
|
1082
1091
|
});
|
|
1083
|
-
if (
|
|
1092
|
+
if (toPlainBoolean(writeMove, false)) {
|
|
1084
1093
|
const metrics = measureTurtleText(String(writeText), family, size, style);
|
|
1085
1094
|
const left = metrics.left || 0;
|
|
1086
1095
|
const right = metrics.right || metrics.width || 0;
|
package/dist/index.js
CHANGED
|
@@ -174983,6 +174983,8 @@ var en_default = {
|
|
|
174983
174983
|
"openscad-render": "Render",
|
|
174984
174984
|
"openscad-copy": "Copy",
|
|
174985
174985
|
"openscad-copy-done": "Code copied",
|
|
174986
|
+
"openscad-download": "Download",
|
|
174987
|
+
"openscad-download-format": "Download format",
|
|
174986
174988
|
"openscad-download-stl": "Download STL",
|
|
174987
174989
|
"openscad-download-ready": "Download ready",
|
|
174988
174990
|
"openscad-reset": "Reset",
|
|
@@ -175118,6 +175120,8 @@ var de_default = {
|
|
|
175118
175120
|
"openscad-render": "Rendern",
|
|
175119
175121
|
"openscad-copy": "Kopieren",
|
|
175120
175122
|
"openscad-copy-done": "Code kopiert",
|
|
175123
|
+
"openscad-download": "Herunterladen",
|
|
175124
|
+
"openscad-download-format": "Download-Format",
|
|
175121
175125
|
"openscad-download-stl": "STL herunterladen",
|
|
175122
175126
|
"openscad-download-ready": "Download bereit",
|
|
175123
175127
|
"openscad-reset": "Zur\xFCcksetzen",
|
|
@@ -202149,7 +202153,7 @@ module.exports = /*#__PURE__*/JSON.parse('{"application/1d-interleaved-parityfec
|
|
|
202149
202153
|
/***/ ((module) => {
|
|
202150
202154
|
|
|
202151
202155
|
"use strict";
|
|
202152
|
-
module.exports = /*#__PURE__*/JSON.parse('{"name":"hyperbook","version":"0.
|
|
202156
|
+
module.exports = /*#__PURE__*/JSON.parse('{"name":"hyperbook","version":"0.94.0","author":"Mike Barkmin","homepage":"https://github.com/openpatch/hyperbook#readme","license":"MIT","bin":{"hyperbook":"./dist/index.js"},"files":["dist"],"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/openpatch/hyperbook.git","directory":"packages/hyperbook"},"bugs":{"url":"https://github.com/openpatch/hyperbook/issues"},"engines":{"node":">=18"},"scripts":{"version":"pnpm build","lint":"tsc --noEmit","dev":"ncc build ./index.ts -w -o dist/","build":"rimraf dist && ncc build ./index.ts -o ./dist/ --no-cache --no-source-map-register --external favicons --external sharp && node postbuild.mjs"},"dependencies":{"favicons":"^7.2.0"},"devDependencies":{"create-hyperbook":"workspace:*","@hyperbook/fs":"workspace:*","@hyperbook/markdown":"workspace:*","@hyperbook/types":"workspace:*","@pnpm/exportable-manifest":"1000.0.6","@types/archiver":"6.0.3","@types/async-retry":"1.4.9","@types/cross-spawn":"6.0.6","@types/lunr":"^2.3.7","@types/prompts":"2.4.9","@types/tar":"6.1.13","@types/ws":"^8.5.14","@vercel/ncc":"0.38.3","archiver":"7.0.1","async-retry":"1.3.3","chalk":"5.4.1","chokidar":"4.0.3","commander":"12.1.0","cpy":"11.1.0","cross-spawn":"7.0.6","domutils":"^3.2.2","extract-zip":"^2.0.1","got":"12.6.0","htmlparser2":"^10.0.0","lunr":"^2.3.9","lunr-languages":"^1.14.0","mime":"^4.0.6","prompts":"2.4.2","rimraf":"6.0.1","tar":"7.4.3","update-check":"1.5.4","ws":"^8.18.0"}}');
|
|
202153
202157
|
|
|
202154
202158
|
/***/ })
|
|
202155
202159
|
|
package/dist/locales/de.json
CHANGED
|
@@ -92,6 +92,8 @@
|
|
|
92
92
|
"openscad-render": "Rendern",
|
|
93
93
|
"openscad-copy": "Kopieren",
|
|
94
94
|
"openscad-copy-done": "Code kopiert",
|
|
95
|
+
"openscad-download": "Herunterladen",
|
|
96
|
+
"openscad-download-format": "Download-Format",
|
|
95
97
|
"openscad-download-stl": "STL herunterladen",
|
|
96
98
|
"openscad-download-ready": "Download bereit",
|
|
97
99
|
"openscad-reset": "Zurücksetzen",
|
package/dist/locales/en.json
CHANGED
|
@@ -92,6 +92,8 @@
|
|
|
92
92
|
"openscad-render": "Render",
|
|
93
93
|
"openscad-copy": "Copy",
|
|
94
94
|
"openscad-copy-done": "Code copied",
|
|
95
|
+
"openscad-download": "Download",
|
|
96
|
+
"openscad-download-format": "Download format",
|
|
95
97
|
"openscad-download-stl": "Download STL",
|
|
96
98
|
"openscad-download-ready": "Download ready",
|
|
97
99
|
"openscad-reset": "Reset",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hyperbook",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.94.0",
|
|
4
4
|
"author": "Mike Barkmin",
|
|
5
5
|
"homepage": "https://github.com/openpatch/hyperbook#readme",
|
|
6
6
|
"license": "MIT",
|
|
@@ -57,9 +57,9 @@
|
|
|
57
57
|
"update-check": "1.5.4",
|
|
58
58
|
"ws": "^8.18.0",
|
|
59
59
|
"create-hyperbook": "0.3.6",
|
|
60
|
-
"@hyperbook/
|
|
61
|
-
"@hyperbook/
|
|
62
|
-
"@hyperbook/
|
|
60
|
+
"@hyperbook/markdown": "0.65.0",
|
|
61
|
+
"@hyperbook/types": "0.23.0",
|
|
62
|
+
"@hyperbook/fs": "0.25.0"
|
|
63
63
|
},
|
|
64
64
|
"scripts": {
|
|
65
65
|
"version": "pnpm build",
|