n3 2.10.6 → 2.11.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.
@@ -427,18 +427,24 @@ function literal(value, languageOrDataType) {
427
427
  return new Literal(`"${value}"@${languageOrDataType.language.toLowerCase()}${languageOrDataType.direction ? `--${languageOrDataType.direction.toLowerCase()}` : ''}`);
428
428
  }
429
429
 
430
- // Automatically determine datatype for booleans, numbers, and dates
430
+ // Automatically determine datatype for booleans, numbers, BigInts, and dates
431
431
  let datatype = languageOrDataType ? languageOrDataType.value : '';
432
432
  if (datatype === '') {
433
433
  // Convert a boolean
434
434
  if (typeof value === 'boolean') datatype = xsd.boolean;
435
435
  // Convert an integer or double
436
436
  else if (typeof value === 'number') {
437
- if (Number.isFinite(value)) datatype = Number.isInteger(value) ? xsd.integer : xsd.double;else {
437
+ if (Number.isFinite(value))
438
+ // From 1e21 upward, a number's string form turns exponential ("1e+21"),
439
+ // which is not a valid xsd:integer lexical, so type it as xsd:double
440
+ // (the same cut-off as JSON-LD 1.1's Object to RDF Conversion)
441
+ datatype = Number.isInteger(value) && Math.abs(value) < 1e21 ? xsd.integer : xsd.double;else {
438
442
  datatype = xsd.double;
439
443
  if (!Number.isNaN(value)) value = value > 0 ? 'INF' : '-INF';
440
444
  }
441
445
  }
446
+ // Convert a BigInt, whose decimal string is always a valid xsd:integer lexical
447
+ else if (typeof value === 'bigint') datatype = xsd.integer;
442
448
  // Convert a valid date
443
449
  else if (value instanceof Date && !Number.isNaN(value.getTime())) {
444
450
  datatype = xsd.dateTime;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n3",
3
- "version": "2.10.6",
3
+ "version": "2.11.0",
4
4
  "description": "Lightning fast, asynchronous, streaming Turtle / N3 / RDF library.",
5
5
  "author": "Ruben Verborgh <ruben.verborgh@gmail.com>",
6
6
  "keywords": [
@@ -439,7 +439,7 @@ function literal(value, languageOrDataType) {
439
439
  return new Literal(`"${value}"@${languageOrDataType.language.toLowerCase()}${languageOrDataType.direction ? `--${languageOrDataType.direction.toLowerCase()}` : ''}`);
440
440
  }
441
441
 
442
- // Automatically determine datatype for booleans, numbers, and dates
442
+ // Automatically determine datatype for booleans, numbers, BigInts, and dates
443
443
  let datatype = languageOrDataType ? languageOrDataType.value : '';
444
444
  if (datatype === '') {
445
445
  // Convert a boolean
@@ -448,13 +448,19 @@ function literal(value, languageOrDataType) {
448
448
  // Convert an integer or double
449
449
  else if (typeof value === 'number') {
450
450
  if (Number.isFinite(value))
451
- datatype = Number.isInteger(value) ? xsd.integer : xsd.double;
451
+ // From 1e21 upward, a number's string form turns exponential ("1e+21"),
452
+ // which is not a valid xsd:integer lexical, so type it as xsd:double
453
+ // (the same cut-off as JSON-LD 1.1's Object to RDF Conversion)
454
+ datatype = Number.isInteger(value) && Math.abs(value) < 1e21 ? xsd.integer : xsd.double;
452
455
  else {
453
456
  datatype = xsd.double;
454
457
  if (!Number.isNaN(value))
455
458
  value = value > 0 ? 'INF' : '-INF';
456
459
  }
457
460
  }
461
+ // Convert a BigInt, whose decimal string is always a valid xsd:integer lexical
462
+ else if (typeof value === 'bigint')
463
+ datatype = xsd.integer;
458
464
  // Convert a valid date
459
465
  else if (value instanceof Date && !Number.isNaN(value.getTime())) {
460
466
  datatype = xsd.dateTime;