@jscad/web 2.5.9 → 2.5.10
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/CHANGELOG.md +13 -0
- package/css/demo.css +5 -1
- package/dist/jscad-web.min.js +281 -279
- package/examples/CHANGELOG.md +8 -0
- package/examples/core/extrusions/nutsAndBolts.js +94 -0
- package/examples/examples.json +1 -1
- package/examples/package.json +1 -1
- package/package.json +7 -7
- package/src/sideEffects/worker/index.js +9 -5
- package/src/ui/flow/design.js +13 -0
- package/src/ui/views/parameterControls.js +3 -3
- package/src/ui/views/status.js +21 -14
package/examples/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [2.3.4](https://github.com/jscad/OpenJSCAD.org/compare/@jscad/examples@2.3.3...@jscad/examples@2.3.4) (2022-04-24)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @jscad/examples
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
6
14
|
## [2.3.3](https://github.com/jscad/OpenJSCAD.org/compare/@jscad/examples@2.3.2...@jscad/examples@2.3.3) (2022-04-03)
|
|
7
15
|
|
|
8
16
|
**Note:** Version bump only for package @jscad/examples
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nuts and Bolts
|
|
3
|
+
* @category Creating Shapes
|
|
4
|
+
* @skillLevel 8
|
|
5
|
+
* @description Demonstrating the advanced extrusion using slices to generate screw threads.
|
|
6
|
+
* @tags extrude, slice, slices, extrudefromslices, callback
|
|
7
|
+
* @authors platypii
|
|
8
|
+
* @licence MIT License
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const jscad = require('@jscad/modeling')
|
|
12
|
+
const { cylinder } = jscad.primitives
|
|
13
|
+
const { subtract, union } = jscad.booleans
|
|
14
|
+
const { colorize } = jscad.colors
|
|
15
|
+
const { extrudeFromSlices, slice } = jscad.extrusions
|
|
16
|
+
const { translate } = jscad.transforms
|
|
17
|
+
|
|
18
|
+
const options = {
|
|
19
|
+
hexWidth: 10,
|
|
20
|
+
hexHeight: 8,
|
|
21
|
+
threadLength: 32,
|
|
22
|
+
threadSize: 4,
|
|
23
|
+
innerRadius: 4,
|
|
24
|
+
outerRadius: 5.6,
|
|
25
|
+
slicesPerRevolution: 12,
|
|
26
|
+
segments: 32
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const main = () => {
|
|
30
|
+
return [
|
|
31
|
+
colorize([0.9, 0.6, 0.2], bolt(options)),
|
|
32
|
+
colorize([0.4, 0.4, 0.4], translate([30, 0, 0], nut(options)))
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// generate bolt by attaching threads to a hex head
|
|
37
|
+
const bolt = (options) => {
|
|
38
|
+
return union(
|
|
39
|
+
translate([0, 0, options.threadLength], hex(options)),
|
|
40
|
+
threads(options)
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// generate nut by subtracting threads from a hex block
|
|
45
|
+
const nut = (options) => {
|
|
46
|
+
return subtract(
|
|
47
|
+
hex(options),
|
|
48
|
+
threads({ ...options, threadLength: options.hexHeight })
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// generate hexagonal block
|
|
53
|
+
const hex = (options) => {
|
|
54
|
+
const radius = options.hexWidth * 1.1547005 // hexagon outer radius
|
|
55
|
+
const height = options.hexHeight
|
|
56
|
+
return cylinder({ center: [0, 0, height / 2], height, radius, segments: 6 })
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// generate a threaded shaft using extrudeFromSlices
|
|
60
|
+
const threads = (options) => {
|
|
61
|
+
const { innerRadius, outerRadius, segments, threadLength } = options
|
|
62
|
+
const revolutions = threadLength / options.threadSize
|
|
63
|
+
const numberOfSlices = options.slicesPerRevolution * revolutions
|
|
64
|
+
return extrudeFromSlices({
|
|
65
|
+
numberOfSlices,
|
|
66
|
+
callback: (progress, index, base) => {
|
|
67
|
+
// generate each slice manually
|
|
68
|
+
const points = []
|
|
69
|
+
for (let i = 0; i < segments; i++) {
|
|
70
|
+
const pointAngle = Math.PI * 2 * i / segments
|
|
71
|
+
const threadAngle = (2 * Math.PI * revolutions * progress) % (Math.PI * 2)
|
|
72
|
+
|
|
73
|
+
// define the shape of the threads
|
|
74
|
+
const phase = angleDiff(threadAngle, pointAngle) / Math.PI
|
|
75
|
+
const radius = lerp(innerRadius, outerRadius, 1.4 * phase - 0.2)
|
|
76
|
+
|
|
77
|
+
const x = radius * Math.cos(pointAngle)
|
|
78
|
+
const y = radius * Math.sin(pointAngle)
|
|
79
|
+
points.push([x, y, threadLength * progress])
|
|
80
|
+
}
|
|
81
|
+
return slice.fromPoints(points)
|
|
82
|
+
}
|
|
83
|
+
}, {})
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// linear interpolation with bounding
|
|
87
|
+
const lerp = (a, b, t) => Math.max(a, Math.min(b, a + (b - a) * t))
|
|
88
|
+
|
|
89
|
+
const angleDiff = (angle1, angle2) => {
|
|
90
|
+
const diff = Math.abs((angle1 - angle2) % (Math.PI * 2))
|
|
91
|
+
return diff > Math.PI ? Math.PI * 2 - diff : diff
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
module.exports = { main }
|
package/examples/examples.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"Creating Shapes":[{"title":"2D Primitives Demonstration","filePath":"examples/core/primitives/primitives2D.js","sort":1,"description":"Demonstrating the basics of a variety of 2D primitives"},{"title":"3D Primitives Demonstration","filePath":"examples/core/primitives/primitives3D.js","sort":1,"description":"Demonstrating the basics of a variety of 3D primitives"},{"title":"Rounded Cuboid","filePath":"examples/core/primitives/roundedCuboid.js","sort":1,"description":"Demonstrating the roundedCuboid() functiom"},{"title":"Spheres of all sorts","filePath":"examples/core/primitives/sphere.js","sort":1,"description":"Demonstrating the sphere() and geodesicSphere() functions"},{"title":"Building a Dodecahedron","filePath":"examples/core/primitives/dodecahedron.js","sort":2,"description":"building dodecahedron() from cuboids"},{"title":"Torus Variety","filePath":"examples/core/primitives/torus.js","sort":2,"description":"Demonstrating the capabilities and variations of the torus() primitive"},{"title":"Building a Polyhedron from scratch","filePath":"examples/core/primitives/polyhedron.js","sort":4,"description":"Demonstrating the polyhedron() function"},{"title":"Basic Extrude Functions","filePath":"examples/core/extrusions/basicExtrusions.js","sort":5,"description":"Demonstrating the basic types of extrusions, and the variety of objects they can create."},{"title":"Extrude Along a Bezier Path","filePath":"examples/core/curves/bezier/extrudeAlongPath.js","sort":5,"description":"Using a 3D bezier path to create a solid tube"},{"title":"Extrude From Slices","filePath":"examples/core/extrusions/extrudeFromSlices.js","sort":5,"description":"Demonstrating the advanced extrusion using slices with varying numbers of points."},{"title":"Simple Bezier Extrude","filePath":"examples/core/curves/bezier/simpleExtrude.js","sort":5,"description":"Using a 1D bezier function to create a non-uniform extrusion"},{"title":"Hull and HullChain 2D example","filePath":"examples/core/hulls/hull2D.js","sort":8,"description":"Demonstrating the basics of Hulls in two dimensions"},{"title":"Hull and HullChain 3D example","filePath":"examples/core/hulls/hull3D.js","sort":8,"description":"Demonstrating the basics of Hulls in three dimensions"},{"title":"Basic Text Creation","filePath":"examples/core/text/text.js","sort":10,"description":"Demonstrating methods of building 3D text"}],"Manipulating Shapes":[{"title":"Basic Booleans Demonstration","filePath":"examples/core/booleans/basicBooleans.js","sort":2,"description":"Demonstrating the basics of boolean shape combinations"},{"title":"Align function demonstration","filePath":"examples/core/transforms/align.js","sort":3,"description":"Demonstrating aligning shapes using the align function"},{"title":"Expanding 2D and 3D Shapes","filePath":"examples/core/expansions/expand.js","sort":5,"description":"Exploring the expand() function on 2D and 3D geometries"},{"title":"Offsetting 2D Shapes","filePath":"examples/core/expansions/offset.js","sort":5,"description":"Demonstrating the offset() function. Moves all points in a 2d path or 2D geometry perpendicular to the line's tangent."},{"title":"Center function demonstration","filePath":"examples/core/transforms/center.js","sort":10,"description":"Using center() to translate objects"},{"title":"Measure Aggregate Bounding Box","filePath":"examples/core/measurements/measureAggregateBounds.js","sort":10,"description":"Examples of measureAggregateBoundingBox function"},{"title":"Measure Area and Volume","filePath":"examples/core/measurements/measureAreaAndVolume.js","sort":10,"description":"Examples of measureArea() and measureVolume() function"},{"title":"Measure Bounding Box","filePath":"examples/core/measurements/measureBounds.js","sort":10,"description":"Examples of measureBoundingBox function"}],"Colors":[{"title":"Basic Colors","filePath":"examples/core/colors/basicColors.js","sort":1,"description":"showing various color functions"},{"title":"Color Cube","filePath":"examples/core/colors/colorCube.js","sort":2,"description":"looking at the different ways to specify a color"},{"title":"Transparency","filePath":"examples/core/colors/transparency.js","sort":2,"description":"showing transparent objects"}],"Parameters":[{"title":"All Parameter Types Demo","filePath":"examples/parameters/allParamTypes.js","sort":1,"description":"Example of interactive parameters"},{"title":"Birthday Balloons","filePath":"examples/parameters/balloons.js","sort":1,"description":"Example of building models from interactive parameters"},{"title":"Parametric Involute Gear","filePath":"examples/parameters/gear.js","sort":1,"description":"Build a proper involute gear, demonstrating parameters, and how they can be used in complex math."}],"Other":[{"title":"Coordinate system and Rotation demonstration","filePath":"examples/core/other/orientation.js","sort":1,"description":"Demonstrating rotation about the three axes."}]}
|
|
1
|
+
{"Creating Shapes":[{"title":"2D Primitives Demonstration","filePath":"examples/core/primitives/primitives2D.js","sort":1,"description":"Demonstrating the basics of a variety of 2D primitives"},{"title":"3D Primitives Demonstration","filePath":"examples/core/primitives/primitives3D.js","sort":1,"description":"Demonstrating the basics of a variety of 3D primitives"},{"title":"Rounded Cuboid","filePath":"examples/core/primitives/roundedCuboid.js","sort":1,"description":"Demonstrating the roundedCuboid() functiom"},{"title":"Spheres of all sorts","filePath":"examples/core/primitives/sphere.js","sort":1,"description":"Demonstrating the sphere() and geodesicSphere() functions"},{"title":"Building a Dodecahedron","filePath":"examples/core/primitives/dodecahedron.js","sort":2,"description":"building dodecahedron() from cuboids"},{"title":"Torus Variety","filePath":"examples/core/primitives/torus.js","sort":2,"description":"Demonstrating the capabilities and variations of the torus() primitive"},{"title":"Building a Polyhedron from scratch","filePath":"examples/core/primitives/polyhedron.js","sort":4,"description":"Demonstrating the polyhedron() function"},{"title":"Basic Extrude Functions","filePath":"examples/core/extrusions/basicExtrusions.js","sort":5,"description":"Demonstrating the basic types of extrusions, and the variety of objects they can create."},{"title":"Extrude Along a Bezier Path","filePath":"examples/core/curves/bezier/extrudeAlongPath.js","sort":5,"description":"Using a 3D bezier path to create a solid tube"},{"title":"Extrude From Slices","filePath":"examples/core/extrusions/extrudeFromSlices.js","sort":5,"description":"Demonstrating the advanced extrusion using slices with varying numbers of points."},{"title":"Simple Bezier Extrude","filePath":"examples/core/curves/bezier/simpleExtrude.js","sort":5,"description":"Using a 1D bezier function to create a non-uniform extrusion"},{"title":"Hull and HullChain 2D example","filePath":"examples/core/hulls/hull2D.js","sort":8,"description":"Demonstrating the basics of Hulls in two dimensions"},{"title":"Hull and HullChain 3D example","filePath":"examples/core/hulls/hull3D.js","sort":8,"description":"Demonstrating the basics of Hulls in three dimensions"},{"title":"Nuts and Bolts","filePath":"examples/core/extrusions/nutsAndBolts.js","sort":8,"description":"Demonstrating the advanced extrusion using slices to generate screw threads."},{"title":"Basic Text Creation","filePath":"examples/core/text/text.js","sort":10,"description":"Demonstrating methods of building 3D text"}],"Manipulating Shapes":[{"title":"Basic Booleans Demonstration","filePath":"examples/core/booleans/basicBooleans.js","sort":2,"description":"Demonstrating the basics of boolean shape combinations"},{"title":"Align function demonstration","filePath":"examples/core/transforms/align.js","sort":3,"description":"Demonstrating aligning shapes using the align function"},{"title":"Expanding 2D and 3D Shapes","filePath":"examples/core/expansions/expand.js","sort":5,"description":"Exploring the expand() function on 2D and 3D geometries"},{"title":"Offsetting 2D Shapes","filePath":"examples/core/expansions/offset.js","sort":5,"description":"Demonstrating the offset() function. Moves all points in a 2d path or 2D geometry perpendicular to the line's tangent."},{"title":"Center function demonstration","filePath":"examples/core/transforms/center.js","sort":10,"description":"Using center() to translate objects"},{"title":"Measure Aggregate Bounding Box","filePath":"examples/core/measurements/measureAggregateBounds.js","sort":10,"description":"Examples of measureAggregateBoundingBox function"},{"title":"Measure Area and Volume","filePath":"examples/core/measurements/measureAreaAndVolume.js","sort":10,"description":"Examples of measureArea() and measureVolume() function"},{"title":"Measure Bounding Box","filePath":"examples/core/measurements/measureBounds.js","sort":10,"description":"Examples of measureBoundingBox function"}],"Colors":[{"title":"Basic Colors","filePath":"examples/core/colors/basicColors.js","sort":1,"description":"showing various color functions"},{"title":"Color Cube","filePath":"examples/core/colors/colorCube.js","sort":2,"description":"looking at the different ways to specify a color"},{"title":"Transparency","filePath":"examples/core/colors/transparency.js","sort":2,"description":"showing transparent objects"}],"Parameters":[{"title":"All Parameter Types Demo","filePath":"examples/parameters/allParamTypes.js","sort":1,"description":"Example of interactive parameters"},{"title":"Birthday Balloons","filePath":"examples/parameters/balloons.js","sort":1,"description":"Example of building models from interactive parameters"},{"title":"Parametric Involute Gear","filePath":"examples/parameters/gear.js","sort":1,"description":"Build a proper involute gear, demonstrating parameters, and how they can be used in complex math."}],"Other":[{"title":"Coordinate system and Rotation demonstration","filePath":"examples/core/other/orientation.js","sort":1,"description":"Demonstrating rotation about the three axes."}]}
|
package/examples/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jscad/web",
|
|
3
|
-
"version": "2.5.
|
|
3
|
+
"version": "2.5.10",
|
|
4
4
|
"description": "Web Application for JSCAD",
|
|
5
5
|
"homepage": "https://openjscad.xyz/",
|
|
6
6
|
"repository": "https://github.com/jscad/OpenJSCAD.org",
|
|
@@ -36,11 +36,11 @@
|
|
|
36
36
|
"license": "MIT",
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@jscad/array-utils": "2.1.4",
|
|
39
|
-
"@jscad/core": "2.
|
|
40
|
-
"@jscad/examples": "2.
|
|
41
|
-
"@jscad/io": "2.3.
|
|
42
|
-
"@jscad/modeling": "2.9.
|
|
43
|
-
"@jscad/regl-renderer": "2.
|
|
39
|
+
"@jscad/core": "2.6.0",
|
|
40
|
+
"@jscad/examples": "2.4.0",
|
|
41
|
+
"@jscad/io": "2.3.3",
|
|
42
|
+
"@jscad/modeling": "2.9.4",
|
|
43
|
+
"@jscad/regl-renderer": "2.6.0",
|
|
44
44
|
"@most/create": "2.0.1",
|
|
45
45
|
"brace": "0.11.1",
|
|
46
46
|
"codemirror": "5.65.2",
|
|
@@ -67,5 +67,5 @@
|
|
|
67
67
|
"url": "https://opencollective.com/openjscad",
|
|
68
68
|
"logo": "https://opencollective.com/openjscad/logo.txt"
|
|
69
69
|
},
|
|
70
|
-
"gitHead": "
|
|
70
|
+
"gitHead": "662965f40a1ce628aa97f30b814586e72a3acb36"
|
|
71
71
|
}
|
|
@@ -3,24 +3,28 @@ const WebWorkify = require('webworkify')
|
|
|
3
3
|
const callBackToStream = require('../../most-utils/callbackToObservable')
|
|
4
4
|
|
|
5
5
|
const makeWorkerEffect = (workerPath) => {
|
|
6
|
+
const workerEventsCb = callBackToStream()
|
|
7
|
+
|
|
6
8
|
let _worker = WebWorkify(workerPath)
|
|
7
9
|
_worker.onerror = (error) => workerEventsCb.callback({ error })
|
|
8
10
|
_worker.onmessage = (message) => workerEventsCb.callback(message)
|
|
9
|
-
const workerEventsCb = callBackToStream()
|
|
10
11
|
|
|
11
12
|
const workerSink = (outToWorker$) => {
|
|
12
13
|
// cancel whatever is going on in the worker by terminating it
|
|
13
14
|
outToWorker$.filter(({ cmd }) => cmd === 'cancel')
|
|
14
15
|
.forEach((_) => _worker.terminate())
|
|
16
|
+
|
|
15
17
|
// send other messages to the worker
|
|
16
18
|
outToWorker$
|
|
17
19
|
.filter(({ cmd }) => cmd !== 'cancel')
|
|
18
|
-
.forEach((
|
|
19
|
-
|
|
20
|
-
_worker
|
|
20
|
+
.forEach((task) => {
|
|
21
|
+
// FIXME: sub optimal ! worker recreation is SLOW and should not be systematic
|
|
22
|
+
_worker.terminate()
|
|
23
|
+
_worker = WebWorkify(workerPath)
|
|
21
24
|
_worker.onerror = (error) => workerEventsCb.callback({ error })
|
|
22
25
|
_worker.onmessage = (message) => workerEventsCb.callback(message)
|
|
23
|
-
|
|
26
|
+
// do the task
|
|
27
|
+
_worker.postMessage(task)
|
|
24
28
|
})
|
|
25
29
|
}
|
|
26
30
|
|
package/src/ui/flow/design.js
CHANGED
|
@@ -575,6 +575,17 @@ const actions = ({ sources }) => {
|
|
|
575
575
|
.multicast()
|
|
576
576
|
.delay(10) // needed , why ?
|
|
577
577
|
|
|
578
|
+
// errors retrieved from worker
|
|
579
|
+
const errorsFromWorker$ = sources.solidWorker
|
|
580
|
+
.filter((event) => event.data instanceof Object && event.data.type === 'errors')
|
|
581
|
+
.map(({ data }) => ({ error: data, origin: 'worker' }))
|
|
582
|
+
|
|
583
|
+
const reportErrorsFromWorker$ = most.mergeArray([
|
|
584
|
+
errorsFromWorker$
|
|
585
|
+
])
|
|
586
|
+
.skipRepeatsWith(jsonCompare)
|
|
587
|
+
.tap((x) => console.log('errors', x))
|
|
588
|
+
|
|
578
589
|
// ui/toggles
|
|
579
590
|
const toggleAutoReload$ = most.mergeArray([
|
|
580
591
|
sources.dom.select('#toggleAutoReload').events('click')
|
|
@@ -615,6 +626,8 @@ const actions = ({ sources }) => {
|
|
|
615
626
|
setDesignParameterDefinitions$,
|
|
616
627
|
setDesignParameterValues$,
|
|
617
628
|
|
|
629
|
+
reportErrorsFromWorker$,
|
|
630
|
+
|
|
618
631
|
requestGeometryRecompute$,
|
|
619
632
|
timeoutGeometryRecompute$,
|
|
620
633
|
cancelGeometryRecompute$,
|
|
@@ -263,19 +263,19 @@ const createInputControl = (definition, prevValue) => {
|
|
|
263
263
|
|
|
264
264
|
// check for required parameters
|
|
265
265
|
if (!('type' in definition)) {
|
|
266
|
-
throw new Error(
|
|
266
|
+
throw new Error(`Parameter definition (${definition.name}) must include a 'type' parameter`)
|
|
267
267
|
}
|
|
268
268
|
let typeData = controlList.filter((x) => definition.type === x.type)
|
|
269
269
|
typeData = (typeData && typeData.length > 0) ? typeData[0] : undefined
|
|
270
270
|
if (!typeData) {
|
|
271
|
-
throw new Error(
|
|
271
|
+
throw new Error(`Parameter definition (${definition.name}), invalid type "${definition.type}"`)
|
|
272
272
|
}
|
|
273
273
|
|
|
274
274
|
// validate fields
|
|
275
275
|
const definitionFields = Object.keys(definition)
|
|
276
276
|
typeData.required.forEach((requiredField) => {
|
|
277
277
|
if (!definitionFields.includes(requiredField)) {
|
|
278
|
-
throw new Error(`Parameter definition
|
|
278
|
+
throw new Error(`Parameter definition of type "${definition.type}" must include a "${requiredField}" parameter`)
|
|
279
279
|
}
|
|
280
280
|
})
|
|
281
281
|
|
package/src/ui/views/status.js
CHANGED
|
@@ -3,29 +3,36 @@ const html = require('nanohtml')
|
|
|
3
3
|
// status display
|
|
4
4
|
const status = (state, paramsCallbacktoStream) => {
|
|
5
5
|
const status = state.status
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
let errorWhere = ''
|
|
7
|
+
let errorMessage = ''
|
|
8
|
+
let errorStack = ''
|
|
9
|
+
if (status.error) {
|
|
10
|
+
if (status.error.fileName && !status.error.fileName.startsWith('blob')) {
|
|
11
|
+
// syntax errors provide file name, line, and column number
|
|
12
|
+
errorWhere = `${status.error.fileName}:${status.error.lineNumber}:${status.error.columnNumber}`
|
|
13
|
+
}
|
|
14
|
+
errorMessage = `${status.error.name}: ${status.error.message}`
|
|
15
|
+
if (status.error.stack) {
|
|
16
|
+
errorStack = status.error.stack.trim().split('\n').map((s) => html`<ul>${s}</ul>`)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
9
19
|
|
|
10
20
|
const statusMessage = status.error !== undefined
|
|
11
21
|
? html`<span>
|
|
12
|
-
<div>
|
|
13
|
-
|
|
22
|
+
<div id='errormessage'>
|
|
23
|
+
<p>
|
|
24
|
+
${errorWhere}
|
|
25
|
+
</p>
|
|
26
|
+
<p>
|
|
27
|
+
${errorMessage}
|
|
28
|
+
</p>
|
|
14
29
|
</div>
|
|
15
|
-
<div>
|
|
16
|
-
${errorMessage}
|
|
17
|
-
</div>
|
|
18
|
-
<div>
|
|
19
|
-
${errorLine}
|
|
20
|
-
</div>
|
|
21
|
-
<div>
|
|
30
|
+
<div id='stacktrace'>
|
|
22
31
|
${errorStack}
|
|
23
32
|
</div>
|
|
24
33
|
</span>`
|
|
25
34
|
: ''
|
|
26
35
|
|
|
27
|
-
// ? `Error: ${status.error.message} line: ${status.error.lineno}, filename:${status.error.filename} stack: ${status.error.stack}` : ''
|
|
28
|
-
// ${statusMessage}
|
|
29
36
|
const busy = status.busy
|
|
30
37
|
return html`
|
|
31
38
|
<span id='status'>
|