The type registry for typeson
MIT License
The type registry for typeson.
See below for notes on these types and presets.
Note that some types will require polyfills in Node such as via
jsdom
.
See the testing environment of test/test.js
for some examples.
Note that for Node.js, to use the file
or blob
types (or the filelist
type or structuredCloning
and structuredCloningThrowing
presets which
include them), you will need a polyfill for Blob
or File
, respectively,
as well as FileReader
and URL.createObjectURL
(and a
polyfill for URL
if you are using Node < 10.0.0 or an older browser).
Note that our URL.createObjectURL
polyfill expects a global
XMLHttpRequest
and location.href
predefined before it as well (and one
which can handle data:
URLs). For Node, you can add it like this:
const url = require('url'); // This line only needed to support Node < 10.0.0
const {createObjectURL} = require('typeson-registry/polyfills/createObjectURL.umd.cjs');
const URL = url.Url; // This line only needed to support Node < 10.0.0
URL.createObjectURL = createObjectURL;
We have not added jsdom
as a dependency, but it is required if this
polyfill is used.
Besides the polyfills for file
or blob
, the structuredCloningThrowing
preset also needs a global DOMException
polyfill.
The filelist
type, in addition to the polyfills for file
, will need
a FileList
polyfill (including a FileList
string tag).
The imagebitmap
type requires a global createImageBitmap
polyfill (and
an ImageBitmap
polyfill (including an ImageBitmap
string tag).
The imagedata
type requires a global ImageData
polyfill (including an
ImageData
string tag).
You may wish to see our test-environment.js
file for how some
polyfilling may be done (largely using jsdom
).
If you have cloned the repo (and not the npm package), you must run
npm install
to get the devDependencies
and then run
npm run rollup
to get the individual browser scripts built locally
(into dist
) or to get index.js
to be rebuilt based on existing
presets and types).
import {Typeson, date, error, regexp, typedArrays} from 'typeson-registry';
const TSON = new Typeson().register([
date,
error,
regexp,
typedArrays
// ...
]);
const tson = TSON.stringify({
Hello: 'world',
date: new Date(),
error: new Error('test'),
inner: {
x: /foo/gui,
bin: new Uint8Array(64)
}
}, null, 2);
console.log(tson);
/* Output:
{
"Hello": "world",
"date": 1464049031538,
"error": {
"name": "Error",
"message": "test"
},
"inner": {
"x": {
"source": "foo",
"flags": "gi"
},
"bin": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
},
"$types": {
"date": "Date",
"error": "Error",
"inner.x": "RegExp",
"inner.bin": "Uint8Array"
}
}
*/
const parsedBack = TSON.parse(tson);
console.log(parsedBack.date instanceof Date);
console.log(parsedBack.inner.bin instanceof Uint8Array);
const {Typeson, builtin} = require('typeson-registry');
const tson = new Typeson().register([
builtin
]);
import
in supporting browsers without own Rollup)<script type="module">
import {Typeson, builtin} from './node_modules/typeson-registry/dist/index.js';
const TSON = new Typeson().register([
builtin
]);
</script>
All types and presets under dist/
are UMD modules so you could also
require them as AMD modules with requirejs if you prefer.
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/typeson/dist/typeson.umd.min.js"></script>
<script src="https://unpkg.com/typeson-registry/dist/presets/builtin.umd.cjs"></script>
<script>
const TSON = new Typeson().register(builtin);
const tson = TSON.stringify({
Hello: 'world',
date: new Date(),
error: new Error('err'),
inner: {
x: /foo/giu,
bin: new Uint8Array(64)
}
}, null, 2);
alert(tson);
/* Alerts:
{
"Hello": "world",
"date": 1464049031538,
"error": {
"name": "Error",
"message": "err"
},
"inner": {
"x": {
"source": "foo",
"flags": "gi"
},
"bin": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="
},
"$types": {
"date": "Date",
"error": "Error",
"inner.x": "RegExp",
"inner.bin": "Uint8Array"
}
}
*/
</script>
</head>
</html>
Note that the type name corresponds to the file name in the following manner:
negativeInfinity
and negativity-infinity.js
);arraybuffer
and arraybuffer.js
given ArrayBuffer
).date
and date.js
).undef
and undef.js
was necessary for undefined
)Intl
Intl.Collator
-> IntlCollator
)userObject
) except forerrors
, typed-arrays
,typed-arrays-socketio.js
); files with multiple exports whose extrafilelist
) do not need a plural.arraybuffer
bigintObject
bigint
blob
- Has sync and async encapsulation/replacements (though sync onlycloneable
- Looks for Symbol.for('cloneEncapsulate')
andSymbol.for('cloneRevive')
methods to allowcryptokey
dataview
date
domexception
dommatrix
dommatrixreadonly
dompoint
dompointreadonly
domquad
domrect
domrectreadonly
error.js
(Error
) and errors.js
(TypeError
, RangeError
, SyntaxError
, ReferenceError
, EvalError
, URIError
, InternalError
) - Thesefile
- Has sync and async encapsulation/replacements (though sync onlyfilelist
- HTML does not provide a means of creating a FileList
objectFile
imagebitmap
- Has sync and async revivers. If OffscreenCanvas
is notImageBitmap
ImageBitmap
.imagedata
infinity
- Preserves positive infinityintl-types.js
(Intl.Collator
, Intl.DateTimeFormat
, Intl.NumberFormat
) -map
nan
- Preserves NaN
(not a number)negativeInfinity
- Preserves negative infinitynegativeZero
- Preserves -0
(produces + or - Infinity when used as divisor)nonBuiltInIgnore
- For roughly detecting non-builtin objects and to avoidprimitive-objects.js
(StringObject
, BooleanObject
, NumberObject
)promise
regexp
resurrectable
- Resurrects any non-array object, function, or symbol; canset
symbol
typed-arrays-socketio.js
(Int8Array
, Uint8Array
, Uint8ClampedArray
,Int16Array
, Uint16Array
, Int32Array
, Uint32Array
, Float32Array
,Float64Array
) - Seepresets/socketio.js
typed-arrays.js
(Int8Array
, Uint8Array
, Uint8ClampedArray
,Int16Array
, Uint16Array
, Int32Array
, Uint32Array
,Float32Array
, Float64Array
) - Base64-encodesundef
(for undefined
) (See also presets/undefined.js
andpresets/sparse-undefined.js
)userObjects
- Allows for inherited objects but ensures the prototype chainObject
(or null
). Should be low priority if one isarray-nonindex-keys.js
builtin.js
- Types that are built into the JavaScript language itself.postmessage.js
- This preset is intended as a utility to expand on what isstrcutured-cloning.js
and supports Error objects.socketio.js
sparse-undefined.js
(sparseArrays
and sparseUndefined
) - Supportsundefined
). See types/undefined.js
for the explicit casepresets/undefined.js
for a utility combining both.special-numbers.js
(preserves NaN
, Infinity
, -Infinity
)structured-cloning.js
- For the Structured Cloning Algorithm used by thepostMessage
and indexedDB
. See also the cloneable
type.structured-cloning-throwing.js
- Same as structured-cloning.js
butcloneable
type.undef.js
- Supports reconstructing explicit and implicit (sparse)undefined
.universal.js
- Meant for de-facto universal types. Currently includesIf you are looking for a way to resurrect functions, you can use the following,
but please bear in mind that it uses eval
which is prohibited by some
Content Security Policies (CSP) (so we are not packaging it with our builds),
that it is unsafe, and also that the function might not behave
deterministically when revived (e.g., if the function were provided from
another context).
const functionType = {functionType: [
function (x) { return typeof x === 'function'; },
function (funcType) { return '(' + funcType.toString() + ')'; },
// eslint-disable-next-line no-eval -- Demonstrating
function (o) { return eval(o); }
]};
const typeson = new Typeson().register(functionType);
const tson = typeson.stringify(function () { return 'abc'; });
const back = typeson.parse(tson);
back(); // 'abc'
node-canvas is used to test
ImageData
.
Be sure to follow the installation steps.
On Windows, besides following the
Windows installation steps,
this
helped complete the installation. If you need to have it rebuilt, you can
run npm i
inside of the node_modules/canvas
directory.
These steps
were also necessary but you can run npm run windows
after install to get
these steps applied. These are the only steps which should need to be re-run
if you have deleted your local node-canvas
copy.