Skip to content

Commit 05caf60

Browse files
authored
fix(all): fix json import (#675)
* fix(io) created a list of deserializers for export * fix(io) created a list of deserializers for export * fix(cli) corrected generateOutputData to use the list of deserializers * fix(core): changed registerAllExtensions to use the list of deserializers from io module * fix(core): changed transformSource to use the list of serializers from io module * tests(core): corrected require statements in webRequire test suite
1 parent 2b89a3a commit 05caf60

File tree

6 files changed

+73
-176
lines changed

6 files changed

+73
-176
lines changed

packages/cli/src/generateOutputData.js

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const fs = require('fs')
22
const { isAbsolute, resolve } = require('path')
33

4-
const { solidsAsBlob } = require('@jscad/io')
4+
const { deserializers, solidsAsBlob } = require('@jscad/io')
55

66
const rebuildSolids = require('@jscad/core/code-evaluation/rebuildGeometryCli')
77
const { registerAllExtensions } = require('@jscad/core/io/registerExtensions')
@@ -34,23 +34,14 @@ const generateOutputData = (source, params, options) => {
3434
return new Promise((resolve, reject) => {
3535
// FIXME this table should come from core
3636
const conversionTable = {
37-
amf: data => require('@jscad/io').amfDeSerializer.deserialize(data.options, data.source),
38-
obj: data => require('@jscad/io').objDeSerializer.deserialize(data.options, data.source),
39-
stl: data => require('@jscad/io').stlDeSerializer.deserialize(data.options, data.source),
40-
svg: data => require('@jscad/io').svgDeSerializer.deserialize(data.options, data.source),
41-
dxf: data => require('@jscad/io').dxfDeSerializer.deserialize(data.options, data.source),
42-
json: data => require('@jscad/io').jsonDeSerializer.deserialize(data.options, data.source),
37+
amf: data => deserializers.amf(data.options, data.source),
38+
obj: data => deserializers.obj(data.options, data.source),
39+
stl: data => deserializers.stl(data.options, data.source),
40+
svg: data => deserializers.svg(data.options, data.source),
41+
dxf: data => deserializers.dxf(data.options, data.source),
42+
json: data => deserializers.json(data.options, data.source),
4343
jscad: data => data.source,
4444
js: data => data.source,
45-
/*
46-
scad: data => {
47-
const source = !data.source.match(/^\/\/!OpenSCAD/i) ? '//!OpenSCAD\n' + data.source : data.source
48-
const parsed = require('@jscad/openscad-openjscad-translator').parse(source)
49-
return `//producer: OpenJSCAD ${version}
50-
// source: ${outputFile}
51-
${parsed}`
52-
},
53-
*/
5445
undefined: data => reject(new Error(`unsuported input format ${inputFormat}`))
5546
}
5647

packages/core/code-loading/transformSources.js

Lines changed: 25 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
const { deserializers } = require('@jscad/io')
2+
13
const isCommonJsModule = require('./isCommonJsModule')
24
const modulifySource = require('./modulifySource')
35

46
const passThroughTransform = (options, entry) => entry
57

68
/* function to turn old style jscad code with implicit imports
79
into code with explicit exports/imports */
10+
// FIXME wouldn't a javascript error be better then 'hacking' the users code?
811
const modulifyTransform = (options, entry) => {
912
const { apiMainPath } = options
1013
const isFileCommonJs = isCommonJsModule(entry.source)
@@ -23,62 +26,34 @@ const createJscadEntry = (entry, source) => {
2326
return Object.assign({}, entry, { ext, name, fullPath, source })
2427
}
2528

26-
const transformAmfToJscad = (options, entry) => {
27-
// console.log('***** transformAmfToJscad',options,entry)
28-
const deserialize = require('@jscad/io').amfDeSerializer.deserialize
29-
const source = deserialize(options, entry.source)
30-
return createJscadEntry(entry, source)
31-
}
32-
33-
const transformDxfToJscad = (options, entry) => {
34-
// console.log('***** transformDxfToJscad',options,entry)
35-
const deserialize = require('@jscad/io').dxfDeSerializer.deserialize
36-
const source = deserialize(options, entry.source)
37-
return createJscadEntry(entry, source)
38-
}
39-
40-
const transformObjToJscad = (options, entry) => {
41-
// console.log('***** transformObjToJscad',options,entry)
42-
const deserialize = require('@jscad/io').objDeSerializer.deserialize
43-
const source = deserialize(options, entry.source)
44-
return createJscadEntry(entry, source)
45-
}
46-
47-
const transformStlToJscad = (options, entry) => {
48-
// console.log('***** transformStlToJscad',options,entry)
49-
const deserialize = require('@jscad/io').stlDeSerializer.deserialize
50-
const source = deserialize(options, entry.source)
51-
return createJscadEntry(entry, source)
52-
}
53-
54-
const transformSvgToJscad = (options, entry) => {
55-
// console.log('***** transformSvgToJscad',options,entry)
56-
const deserialize = require('@jscad/io').svgDeSerializer.deserialize
57-
const source = deserialize(options, entry.source)
58-
return createJscadEntry(entry, source)
59-
}
60-
29+
/*
30+
* Transform the given files and folders if necessary.
31+
* Transforms are only applied to single files as current deserializers create source with a main() function. Only one.
32+
* Transforms are NOT applied to projects.
33+
*/
6134
const transformSources = (options, filesAndFolders) => {
6235
// console.log('***** transformSources', options, filesAndFolders)
63-
// FIXME this table should come from IO
64-
const transformsPerFormat = {
36+
37+
if (filesAndFolders && filesAndFolders.length > 1) return filesAndFolders // skip projects
38+
39+
const codeTransforms = {
6540
js: [modulifyTransform],
66-
jscad: [modulifyTransform],
67-
// formats that require translation
68-
amf: [transformAmfToJscad, modulifyTransform],
69-
dxf: [transformDxfToJscad, modulifyTransform],
70-
obj: [transformObjToJscad, modulifyTransform],
71-
stl: [transformStlToJscad, modulifyTransform],
72-
svg: [transformSvgToJscad, modulifyTransform]
41+
jscad: [modulifyTransform]
7342
}
7443

7544
const updateEntry = (entry) => {
76-
if (entry.source) {
77-
const transformOptions = Object.assign({}, options, { filename: entry.name })
78-
const transforms = transformsPerFormat[entry.ext] ? transformsPerFormat[entry.ext] : [passThroughTransform]
79-
const transformedEntry = transforms.reduce((entry, transform) => transform(transformOptions, entry), entry)
80-
81-
return transformedEntry
45+
if (entry.source && entry.ext) {
46+
const transformOptions = Object.assign({}, options, { filename: entry.name, output: 'script' })
47+
if (entry.ext in deserializers) {
48+
const deserializer = deserializers[entry.ext]
49+
const source = deserializer(transformOptions, entry.source)
50+
return createJscadEntry(entry, source)
51+
}
52+
if (entry.ext in codeTransforms) {
53+
const transforms = codeTransforms[entry.ext]
54+
const transformedEntry = transforms.reduce((entry, transform) => transform(transformOptions, entry), entry)
55+
return transformedEntry
56+
}
8257
}
8358
return entry
8459
}

packages/core/code-loading/webRequire.test.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,11 @@ test('webRequire: should allow using require.extensions like the native node req
106106

107107
test('webRequire: should allow using require.extensions like the native node require (parser)', (t) => {
108108
const registerStlExtension = (fs, _require) => {
109-
const deserializer = require('@jscad/io').stlDeSerializer
109+
const { deserializers } = require('@jscad/io')
110+
const deserializer = deserializers.stl
110111
_require.extensions['.stl'] = (module, filename) => {
111112
const content = fs.readFileSync(filename, 'utf8')
112-
const parsed = deserializer.deserialize({ filename, output: 'geometry' }, content)
113+
const parsed = deserializer({ filename, output: 'geometry' }, content)
113114
module.exports = parsed
114115
}
115116
}
Lines changed: 16 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
const { deserializers } = require('@jscad/io')
2+
13
// FIXME: the unregistering does not work, look into it
24
const registerJscadExtension = (fs, _require) => {
35
const stripBom = require('strip-bom')
@@ -10,95 +12,37 @@ const unRegisterJscadExtension = (fs, _require) => {
1012
delete _require.extensions['.jscad']
1113
}
1214

13-
const registerStlExtension = (fs, _require) => {
14-
const deserializer = require('@jscad/io').stlDeSerializer
15-
_require.extensions['.stl'] = (module, filename) => {
16-
const content = fs.readFileSync(filename, 'utf8')
17-
const parsed = deserializer.deserialize({ filename, output: 'geometry' }, content)
18-
module.exports = parsed
19-
}
20-
}
21-
const unRegisterStlExtension = (fs, _require) => {
22-
delete _require.extensions['.stl']
23-
}
24-
25-
const registerAmfExtension = (fs, _require) => {
26-
const deserializer = require('@jscad/io').amfDeSerializer
27-
_require.extensions['.amf'] = (module, filename) => {
15+
const registerDeserializer = (extension, fs, _require) => {
16+
const deserializer = deserializers[extension]
17+
const fileExtension = '.' + extension
18+
_require.extensions[fileExtension] = (module, filename) => {
2819
const content = fs.readFileSync(filename, 'utf8')
29-
const parsed = deserializer.deserialize({ filename, output: 'geometry' }, content)
20+
const parsed = deserializer({ filename, output: 'geometry' }, content)
3021
module.exports = parsed
3122
}
3223
}
33-
const unRegisterAmfExtension = (fs, _require) => {
34-
delete _require.extensions['.amf']
35-
}
36-
37-
const registerDxfExtension = (fs, _require) => {
38-
const deserializer = require('@jscad/io').dxfDeSerializer
39-
_require.extensions['.dxf'] = (module, filename) => {
40-
const content = fs.readFileSync(filename, 'utf8')
41-
const parsed = deserializer.deserialize({ filename, output: 'geometry' }, content)
42-
module.exports = parsed
43-
}
44-
}
45-
const unRegisterDxfExtension = (fs, _require) => {
46-
delete _require.extensions['.dxf']
47-
}
48-
49-
const registerObjExtension = (fs, _require) => {
50-
const deserializer = require('@jscad/io').objDeSerializer
51-
_require.extensions['.obj'] = (module, filename) => {
52-
const content = fs.readFileSync(filename, 'utf8')
53-
const parsed = deserializer.deserialize({ filename, output: 'geometry' }, content)
54-
module.exports = parsed
55-
}
56-
}
57-
const unRegisterObjExtension = (fs, _require) => {
58-
delete _require.extensions['.obj']
59-
}
60-
61-
const registerSvgExtension = (fs, _require) => {
62-
const deserializer = require('@jscad/io').svgDeSerializer
63-
_require.extensions['.svg'] = (module, filename) => {
64-
const content = fs.readFileSync(filename, 'utf8')
65-
const parsed = deserializer.deserialize({ filename, output: 'geometry' }, content)
66-
module.exports = parsed
67-
}
68-
}
69-
const unRegisterSvgExtension = (fs, _require) => {
70-
delete _require.extensions['.svg']
24+
const unregisterDeserializer = (extension, fs, _require) => {
25+
const fileExtension = '.' + extension
26+
delete _require.extensions[fileExtension]
7127
}
7228

7329
const registerAllExtensions = (fs, _require) => {
7430
registerJscadExtension(fs, _require)
7531

76-
registerAmfExtension(fs, _require)
77-
registerDxfExtension(fs, _require)
78-
registerObjExtension(fs, _require)
79-
registerStlExtension(fs, _require)
80-
registerSvgExtension(fs, _require)
32+
for (const extension of Object.keys(deserializers)) {
33+
registerDeserializer(extension, fs, _require)
34+
}
8135
}
8236

8337
const unRegisterAllExtensions = (fs, _require) => {
8438
unRegisterJscadExtension(fs, _require)
8539

86-
unRegisterAmfExtension(fs, _require)
87-
unRegisterDxfExtension(fs, _require)
88-
unRegisterObjExtension(fs, _require)
89-
unRegisterStlExtension(fs, _require)
90-
unRegisterSvgExtension(fs, _require)
40+
for (const extension of Object.keys(deserializers)) {
41+
unregisterDeserializer(extension, fs, _require)
42+
}
9143
}
9244

9345
module.exports = {
94-
registerJscadExtension,
95-
96-
registerAmfExtension,
97-
registerDxfExtension,
98-
registerObjExtension,
99-
registerStlExtension,
100-
registerSvgExtension,
101-
10246
registerAllExtensions,
10347
unRegisterAllExtensions
10448
}

packages/io/io/deserializers.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
const amfDeSerializer = require('@jscad/amf-deserializer')
2+
const dxfDeSerializer = require('@jscad/dxf-deserializer')
3+
const jsonDeSerializer = require('@jscad/json-deserializer')
4+
const objDeSerializer = require('@jscad/obj-deserializer')
5+
// const scadDeSerializer = require('@jscad/scad-deserializer') //FIXME: upgrade, fix before re-enabling
6+
const stlDeSerializer = require('@jscad/stl-deserializer')
7+
const svgDeSerializer = require('@jscad/svg-deserializer')
8+
9+
const deserializers = {}
10+
deserializers[amfDeSerializer.extension] = amfDeSerializer.deserialize
11+
deserializers[dxfDeSerializer.extension] = dxfDeSerializer.deserialize
12+
deserializers[jsonDeSerializer.extension] = jsonDeSerializer.deserialize
13+
deserializers[objDeSerializer.extension] = objDeSerializer.deserialize
14+
deserializers[stlDeSerializer.extension] = stlDeSerializer.deserialize
15+
deserializers[svgDeSerializer.extension] = svgDeSerializer.deserialize
16+
17+
module.exports = deserializers

packages/io/io/index.js

Lines changed: 5 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
const { makeBlob, convertToBlob } = require('@jscad/io-utils')
2-
const prepareOutput = require('./prepareOutput')
32

43
const amfSerializer = require('@jscad/amf-serializer')
54
const dxfSerializer = require('@jscad/dxf-serializer')
@@ -8,51 +7,21 @@ const stlSerializer = require('@jscad/stl-serializer')
87
const svgSerializer = require('@jscad/svg-serializer')
98
const x3dSerializer = require('@jscad/x3d-serializer')
109

11-
const amfDeSerializer = require('@jscad/amf-deserializer')
12-
const dxfDeSerializer = require('@jscad/dxf-deserializer')
13-
const jsonDeSerializer = require('@jscad/json-deserializer')
14-
const objDeSerializer = require('@jscad/obj-deserializer')
15-
// const scadDeSerializer = require('@jscad/scad-deserializer') //FIXME: upgrade, fix before re-enabling
16-
const stlDeSerializer = require('@jscad/stl-deserializer')
17-
const svgDeSerializer = require('@jscad/svg-deserializer')
10+
const prepareOutput = require('./prepareOutput')
11+
const deserializers = require('./deserializers')
1812

1913
const solidsAsBlob = (solids, params) => convertToBlob(prepareOutput(solids, params))
2014

2115
module.exports = {
2216
makeBlob,
17+
solidsAsBlob,
18+
2319
amfSerializer,
2420
dxfSerializer,
2521
jsonSerializer,
2622
stlSerializer,
2723
svgSerializer,
2824
x3dSerializer,
2925

30-
amfDeSerializer,
31-
dxfDeSerializer,
32-
jsonDeSerializer,
33-
objDeSerializer,
34-
// scadDeSerializer, //FIXME: upgrade, fix before re-enabling
35-
stlDeSerializer,
36-
svgDeSerializer,
37-
38-
solidsAsBlob
26+
deserializers
3927
}
40-
/* export {makeBlob} from './utils/Blob'
41-
42-
import * as CAGToDxf from './serializers/CAGToDxf'
43-
import * as CAGToJson from './serializers/CAGToJson'
44-
import * as CAGToSvg from './serializers/CAGToSvg'
45-
import * as CSGToAMF from './serializers/CSGToAMF'
46-
import * as CSGToJson from './serializers/CSGToJson'
47-
import * as CSGToStla from './serializers/CSGToStla'
48-
import * as CSGToStlb from './serializers/CSGToStlb'
49-
import * as CSGToX3D from './serializers/CSGToX3D'
50-
51-
export {CAGToDxf, CAGToJson, CAGToSvg, CSGToAMF, CSGToJson, CSGToStla, CSGToStlb, CSGToX3D}
52-
53-
export {parseAMF} from './deserializers/parseAMF'
54-
export {parseGCode} from './deserializers/parseGCode'
55-
export {parseJSON} from './deserializers/parseJSON'
56-
export {parseOBJ} from './deserializers/parseOBJ'
57-
export {parseSTL} from './deserializers/parseSTL'
58-
export {parseSVG} from './deserializers/parseSVG' */

0 commit comments

Comments
 (0)