@graphysdk/data-import-utils 1.7.1 → 1.7.2
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/file.cjs +1 -1
- package/dist/file.mjs +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/json.cjs +1 -0
- package/dist/json.d.ts +39 -0
- package/dist/json.mjs +1 -0
- package/dist/text.cjs +1 -1
- package/dist/text.d.ts +1 -1
- package/dist/text.mjs +1 -1
- package/dist/url.cjs +1 -1
- package/dist/url.mjs +1 -1
- package/package.json +11 -3
package/dist/file.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("tslib"),
|
|
1
|
+
"use strict";var e=require("tslib"),r=require("node:fs/promises"),t=require("node:path"),o=require("papaparse"),n=require("@graphysdk/core/node"),s=require("exceljs");const i=new Set(["csv","tsv","json"]),l={".csv":"csv",".tsv":"tsv",".tab":"tsv",".json":"json",".xlsx":"xlsx",".xls":"xls",".ods":"ods"},u=(e,r)=>{var t;const o=[];for(let s=0;s<r;s++){const r=null===(t=null==e?void 0:e[s])||void 0===t?void 0:t.trim(),i={key:n.columnIndexToPropertyKey(s)};r&&(i.label=r),o.push(i)}return o},a=/[^\p{ASCII}]/u,c=/[\u2012\u2013\u2014\u2212](?=\d)/g,f=/\u00A0/g,d=/^-?(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d+)?$/,p=/^-?(?:\d{1,3}(?:\.\d{3})*|\d+)(?:,\d+)?$/,w=new Set(["PT_PT","AR"]),m=(e,r="EN_US")=>{let t;if(t=a.test(e)?e.replace(c,"-").replace(f," ").trim():e.trim(),""===t)return null;if(t.length>100)return t;if(w.has(r)){if(p.test(t)){const e=t.replace(/\./g,"").replace(",","."),r=Number(e);if(Number.isFinite(r))return r}}else if(d.test(t)){const e=t.replace(/,/g,""),r=Number(e);if(Number.isFinite(r))return r}return t},h=(e,r,t)=>e.map(e=>{const o={};for(let n=0;n<r.length;n++){const s=r[n];if(!s)continue;const i=e[n];o[s.key]=null==i||""===i?null:"number"==typeof i?i:m(String(i),t)}return o}),v=(e,r,t)=>{var n,s,i,l,a;const c=1024*(null!==(n=null==t?void 0:t.maxFileSize)&&void 0!==n?n:5)*1024;if(e.length>c)throw new Error(`Input size (${e.length} bytes) exceeds the maximum allowed size of ${c} bytes (${null!==(s=null==t?void 0:t.maxFileSize)&&void 0!==s?s:5} MB).`);const f=!1!==(null==t?void 0:t.hasHeader),d=null!==(i=null==t?void 0:t.locale)&&void 0!==i?i:"EN_US",p=o.parse(e,{header:!1,delimiter:r,skipEmptyLines:!0}),w=p.errors.filter(e=>"Quotes"===e.type);if(w.length>0){const e=w[0];throw new Error(`Parse error at row ${null!==(l=null==e?void 0:e.row)&&void 0!==l?l:"?"}: ${null!==(a=null==e?void 0:e.message)&&void 0!==a?a:"Unknown error"}`)}const m=p.data;if(0===m.length)return{columns:[],rows:[]};const v=f?m[0]:void 0,y=f?m.slice(1):m,b=m.reduce((e,r)=>Math.max(e,r.length),0),g=u(v,b);return{columns:g,rows:h(y,g,d)}},y=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),b=e=>null==e?null:"number"==typeof e?Number.isFinite(e)?e:null:"string"==typeof e?e:"boolean"==typeof e?String(e):JSON.stringify(e),g=(e,r)=>{const t="string"==typeof e?((e,r)=>{var t;const o=null!==(t=null==r?void 0:r.maxFileSize)&&void 0!==t?t:5,n=1024*o*1024,s=(new TextEncoder).encode(e).byteLength;if(s>n)throw new Error(`Input size (${s} bytes) exceeds the maximum allowed size of ${n} bytes (${o} MB).`);try{return JSON.parse(e)}catch(e){throw new Error(`Invalid JSON: ${e instanceof Error?e.message:"could not parse"}`)}})(e,r):e;if(Array.isArray(t))return(e=>{const r=[],t=new Set;for(const o of e){if(!y(o))throw new Error("Each JSON row must be an object mapping column names to values.");for(const e of Object.keys(o))t.has(e)||(t.add(e),r.push(e))}return{columns:r.map(e=>({key:e})),rows:e.map(e=>{const t={};for(const o of r)t[o]=b(e[o]);return t})}})(t);if((e=>y(e)&&Array.isArray(e.columns)&&Array.isArray(e.rows))(t))return(e=>{const r=e.columns.map(e=>{if(!y(e)||"string"!=typeof e.key||0===e.key.length)throw new Error('Each JSON column must be an object with a non-empty string "key".');return void 0!==e.label?{key:e.key,label:String(e.label)}:{key:e.key}}),t=e.rows.map(e=>{if(!y(e))throw new Error("Each JSON row must be an object mapping column keys to values.");const t={};for(const o of r)t[o.key]=b(e[o.key]);return t});return{columns:r,rows:t}})(t);throw new Error("Unsupported JSON dataset: expected an array of row objects or a { columns, rows } object.")},x=e=>{const{value:r}=e;if(null==r)return null;if("number"==typeof r)return r;if("string"==typeof r)return""===r?null:r;if("boolean"==typeof r)return r?1:0;if(r instanceof Date)return r.toISOString();if((e=>"object"==typeof e&&null!==e&&"formula"in e)(r)){if("number"==typeof r.result)return r.result;if("string"==typeof r.result)return""===r.result?null:r.result;if("boolean"==typeof r.result)return r.result?1:0;if(r.result instanceof Date)return r.result.toISOString()}const t=e.text;return""===t?null:t},S=["dataValidations","conditionalFormatting","sheetProtection"];const $=(r,t)=>e.__awaiter(void 0,void 0,void 0,function*(){var o,n,i,l,a;const c=1024*(null!==(o=null==t?void 0:t.maxFileSize)&&void 0!==o?o:5)*1024;if(r.byteLength>c)throw new Error(`Input size (${r.byteLength} bytes) exceeds the maximum allowed size of ${c} bytes (${null!==(n=null==t?void 0:t.maxFileSize)&&void 0!==n?n:5} MB).`);const f=null!==(i=null==t?void 0:t.locale)&&void 0!==i?i:"EN_US",d=yield function(r){return e.__awaiter(this,void 0,void 0,function*(){const e=new s.Workbook;return yield e.xlsx.load(r,{ignoreNodes:S}),e})}(r),p=((e,r)=>{if(void 0===r)return e.worksheets[0];if("number"==typeof r){const t=e.worksheets[r];if(!t)throw new Error(`Sheet index ${r} is out of range. Workbook has ${e.worksheets.length} sheet(s).`);return t}const t=e.getWorksheet(r);if(!t){const t=e.worksheets.map(e=>`"${e.name}"`).join(", ");throw new Error(`Sheet "${r}" not found. Available sheets: ${t}`)}return t})(d,null==t?void 0:t.sheet);if(!p||0===p.rowCount)return{columns:[],rows:[]};const w=p.columnCount;if(0===w)return{columns:[],rows:[]};const m=p.getRow(1),v=[];for(let e=1;e<=w;e++){const r=m.getCell(e).value;v.push(String(null!=r?r:""))}const y=u(v,w),b=null!==(l=null==t?void 0:t.maxRows)&&void 0!==l?l:1e5,g=null!==(a=null==t?void 0:t.maxCells)&&void 0!==a?a:5e6,$=[];let E=0,k=0;for(let e=2;e<=p.rowCount;e++){if(E++,E>b)throw new Error(`Row limit exceeded: processed ${E} rows (maximum: ${b}). Use the maxRows option to increase the limit.`);if(k+=w,k>g)throw new Error(`Cell limit exceeded: processed ${k} cells (maximum: ${g}). Use the maxCells option to increase the limit.`);const r=p.getRow(e),t=[];for(let e=1;e<=w;e++)t.push(x(r.getCell(e)));$.push(t)}return{columns:y,rows:h($,y,f)}}),E=(e,r,t)=>{switch(r){case"csv":return((e,r)=>v(e,void 0,r))(e,t);case"tsv":return((e,r)=>v(e,"\t",r))(e,t);case"json":return g(e,t);default:throw new Error(`Unsupported text format "${r}". Supported: csv, tsv, json`)}},k=(r,t,o)=>e.__awaiter(void 0,void 0,void 0,function*(){switch(t){case"xlsx":case"xls":case"ods":return((e,r)=>$(e,r))(r,o);default:throw new Error(`Unsupported binary format "${t}". Supported: xlsx, xls, ods`)}});exports.fromFile=(o,n)=>e.__awaiter(void 0,void 0,void 0,function*(){if("undefined"!=typeof window&&"undefined"==typeof process)throw new Error("fromFile is only available in Node.js environments. In the browser, read the file using the File API and pass the result to fromCSV (for text) or fromXLSX (for binary formats).");const s=t.extname(o).toLowerCase(),u=(e=>l[e.toLowerCase()])(s);if(!u){const e=Object.keys(l).join(", ");throw new Error(`Unsupported file extension "${s||"(none)"}". Supported: ${e}`)}const a=yield r.readFile(o);return((r,t,o)=>e.__awaiter(void 0,void 0,void 0,function*(){switch(t){case"csv":case"tsv":case"json":if("string"!=typeof r)throw new TypeError(`${t.toUpperCase()} parsing requires a string input, but received an ArrayBuffer.`);return E(r,t,o);case"xlsx":case"xls":case"ods":if("string"==typeof r)throw new TypeError(`${t.toUpperCase()} parsing requires an ArrayBuffer input, but received a string.`);return k(r,t,o);default:throw new Error(`Unsupported format "${t}". Supported formats: csv, tsv, json, xlsx, xls, ods`)}}))(i.has(u)?"string"==typeof a?a:a.toString("utf-8"):a instanceof Buffer?a.buffer.slice(a.byteOffset,a.byteOffset+a.byteLength):a,u,n)});
|
package/dist/file.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__awaiter as e}from"tslib";import{readFile as
|
|
1
|
+
import{__awaiter as e}from"tslib";import{readFile as r}from"node:fs/promises";import t from"node:path";import o from"papaparse";import{columnIndexToPropertyKey as n}from"@graphysdk/core/node";import s from"exceljs";const i=new Set(["csv","tsv","json"]),l={".csv":"csv",".tsv":"tsv",".tab":"tsv",".json":"json",".xlsx":"xlsx",".xls":"xls",".ods":"ods"},u=(e,r)=>{var t;const o=[];for(let s=0;s<r;s++){const r=null===(t=null==e?void 0:e[s])||void 0===t?void 0:t.trim(),i={key:n(s)};r&&(i.label=r),o.push(i)}return o},a=/[^\p{ASCII}]/u,c=/[\u2012\u2013\u2014\u2212](?=\d)/g,f=/\u00A0/g,d=/^-?(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d+)?$/,m=/^-?(?:\d{1,3}(?:\.\d{3})*|\d+)(?:,\d+)?$/,p=new Set(["PT_PT","AR"]),w=(e,r="EN_US")=>{let t;if(t=a.test(e)?e.replace(c,"-").replace(f," ").trim():e.trim(),""===t)return null;if(t.length>100)return t;if(p.has(r)){if(m.test(t)){const e=t.replace(/\./g,"").replace(",","."),r=Number(e);if(Number.isFinite(r))return r}}else if(d.test(t)){const e=t.replace(/,/g,""),r=Number(e);if(Number.isFinite(r))return r}return t},h=(e,r,t)=>e.map(e=>{const o={};for(let n=0;n<r.length;n++){const s=r[n];if(!s)continue;const i=e[n];o[s.key]=null==i||""===i?null:"number"==typeof i?i:w(String(i),t)}return o}),v=(e,r,t)=>{var n,s,i,l,a;const c=1024*(null!==(n=null==t?void 0:t.maxFileSize)&&void 0!==n?n:5)*1024;if(e.length>c)throw new Error(`Input size (${e.length} bytes) exceeds the maximum allowed size of ${c} bytes (${null!==(s=null==t?void 0:t.maxFileSize)&&void 0!==s?s:5} MB).`);const f=!1!==(null==t?void 0:t.hasHeader),d=null!==(i=null==t?void 0:t.locale)&&void 0!==i?i:"EN_US",m=o.parse(e,{header:!1,delimiter:r,skipEmptyLines:!0}),p=m.errors.filter(e=>"Quotes"===e.type);if(p.length>0){const e=p[0];throw new Error(`Parse error at row ${null!==(l=null==e?void 0:e.row)&&void 0!==l?l:"?"}: ${null!==(a=null==e?void 0:e.message)&&void 0!==a?a:"Unknown error"}`)}const w=m.data;if(0===w.length)return{columns:[],rows:[]};const v=f?w[0]:void 0,y=f?w.slice(1):w,b=w.reduce((e,r)=>Math.max(e,r.length),0),g=u(v,b);return{columns:g,rows:h(y,g,d)}},y=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),b=e=>null==e?null:"number"==typeof e?Number.isFinite(e)?e:null:"string"==typeof e?e:"boolean"==typeof e?String(e):JSON.stringify(e),g=(e,r)=>{const t="string"==typeof e?((e,r)=>{var t;const o=null!==(t=null==r?void 0:r.maxFileSize)&&void 0!==t?t:5,n=1024*o*1024,s=(new TextEncoder).encode(e).byteLength;if(s>n)throw new Error(`Input size (${s} bytes) exceeds the maximum allowed size of ${n} bytes (${o} MB).`);try{return JSON.parse(e)}catch(e){throw new Error(`Invalid JSON: ${e instanceof Error?e.message:"could not parse"}`)}})(e,r):e;if(Array.isArray(t))return(e=>{const r=[],t=new Set;for(const o of e){if(!y(o))throw new Error("Each JSON row must be an object mapping column names to values.");for(const e of Object.keys(o))t.has(e)||(t.add(e),r.push(e))}return{columns:r.map(e=>({key:e})),rows:e.map(e=>{const t={};for(const o of r)t[o]=b(e[o]);return t})}})(t);if((e=>y(e)&&Array.isArray(e.columns)&&Array.isArray(e.rows))(t))return(e=>{const r=e.columns.map(e=>{if(!y(e)||"string"!=typeof e.key||0===e.key.length)throw new Error('Each JSON column must be an object with a non-empty string "key".');return void 0!==e.label?{key:e.key,label:String(e.label)}:{key:e.key}}),t=e.rows.map(e=>{if(!y(e))throw new Error("Each JSON row must be an object mapping column keys to values.");const t={};for(const o of r)t[o.key]=b(e[o.key]);return t});return{columns:r,rows:t}})(t);throw new Error("Unsupported JSON dataset: expected an array of row objects or a { columns, rows } object.")},x=e=>{const{value:r}=e;if(null==r)return null;if("number"==typeof r)return r;if("string"==typeof r)return""===r?null:r;if("boolean"==typeof r)return r?1:0;if(r instanceof Date)return r.toISOString();if((e=>"object"==typeof e&&null!==e&&"formula"in e)(r)){if("number"==typeof r.result)return r.result;if("string"==typeof r.result)return""===r.result?null:r.result;if("boolean"==typeof r.result)return r.result?1:0;if(r.result instanceof Date)return r.result.toISOString()}const t=e.text;return""===t?null:t},S=["dataValidations","conditionalFormatting","sheetProtection"];const $=(r,t)=>e(void 0,void 0,void 0,function*(){var o,n,i,l,a;const c=1024*(null!==(o=null==t?void 0:t.maxFileSize)&&void 0!==o?o:5)*1024;if(r.byteLength>c)throw new Error(`Input size (${r.byteLength} bytes) exceeds the maximum allowed size of ${c} bytes (${null!==(n=null==t?void 0:t.maxFileSize)&&void 0!==n?n:5} MB).`);const f=null!==(i=null==t?void 0:t.locale)&&void 0!==i?i:"EN_US",d=yield function(r){return e(this,void 0,void 0,function*(){const e=new s.Workbook;return yield e.xlsx.load(r,{ignoreNodes:S}),e})}(r),m=((e,r)=>{if(void 0===r)return e.worksheets[0];if("number"==typeof r){const t=e.worksheets[r];if(!t)throw new Error(`Sheet index ${r} is out of range. Workbook has ${e.worksheets.length} sheet(s).`);return t}const t=e.getWorksheet(r);if(!t){const t=e.worksheets.map(e=>`"${e.name}"`).join(", ");throw new Error(`Sheet "${r}" not found. Available sheets: ${t}`)}return t})(d,null==t?void 0:t.sheet);if(!m||0===m.rowCount)return{columns:[],rows:[]};const p=m.columnCount;if(0===p)return{columns:[],rows:[]};const w=m.getRow(1),v=[];for(let e=1;e<=p;e++){const r=w.getCell(e).value;v.push(String(null!=r?r:""))}const y=u(v,p),b=null!==(l=null==t?void 0:t.maxRows)&&void 0!==l?l:1e5,g=null!==(a=null==t?void 0:t.maxCells)&&void 0!==a?a:5e6,$=[];let E=0,k=0;for(let e=2;e<=m.rowCount;e++){if(E++,E>b)throw new Error(`Row limit exceeded: processed ${E} rows (maximum: ${b}). Use the maxRows option to increase the limit.`);if(k+=p,k>g)throw new Error(`Cell limit exceeded: processed ${k} cells (maximum: ${g}). Use the maxCells option to increase the limit.`);const r=m.getRow(e),t=[];for(let e=1;e<=p;e++)t.push(x(r.getCell(e)));$.push(t)}return{columns:y,rows:h($,y,f)}}),E=(e,r,t)=>{switch(r){case"csv":return((e,r)=>v(e,void 0,r))(e,t);case"tsv":return((e,r)=>v(e,"\t",r))(e,t);case"json":return g(e,t);default:throw new Error(`Unsupported text format "${r}". Supported: csv, tsv, json`)}},k=(r,t,o)=>e(void 0,void 0,void 0,function*(){switch(t){case"xlsx":case"xls":case"ods":return((e,r)=>$(e,r))(r,o);default:throw new Error(`Unsupported binary format "${t}". Supported: xlsx, xls, ods`)}}),j=(o,n)=>e(void 0,void 0,void 0,function*(){if("undefined"!=typeof window&&"undefined"==typeof process)throw new Error("fromFile is only available in Node.js environments. In the browser, read the file using the File API and pass the result to fromCSV (for text) or fromXLSX (for binary formats).");const s=t.extname(o).toLowerCase(),u=(e=>l[e.toLowerCase()])(s);if(!u){const e=Object.keys(l).join(", ");throw new Error(`Unsupported file extension "${s||"(none)"}". Supported: ${e}`)}const a=yield r(o);return((r,t,o)=>e(void 0,void 0,void 0,function*(){switch(t){case"csv":case"tsv":case"json":if("string"!=typeof r)throw new TypeError(`${t.toUpperCase()} parsing requires a string input, but received an ArrayBuffer.`);return E(r,t,o);case"xlsx":case"xls":case"ods":if("string"==typeof r)throw new TypeError(`${t.toUpperCase()} parsing requires an ArrayBuffer input, but received a string.`);return k(r,t,o);default:throw new Error(`Unsupported format "${t}". Supported formats: csv, tsv, json, xlsx, xls, ods`)}}))(i.has(u)?"string"==typeof a?a:a.toString("utf-8"):a instanceof Buffer?a.buffer.slice(a.byteOffset,a.byteOffset+a.byteLength):a,u,n)});export{j as fromFile};
|
package/dist/index.d.ts
CHANGED
|
@@ -3,9 +3,9 @@ import { VizLocale, GraphConfig } from '@graphysdk/core/node';
|
|
|
3
3
|
/** The `data` shape returned by all parsers — same as `GraphConfig['data']`. */
|
|
4
4
|
type Data = GraphConfig['data'];
|
|
5
5
|
/** Supported file formats. */
|
|
6
|
-
type FileFormat = 'csv' | 'tsv' | 'xlsx' | 'xls' | 'ods';
|
|
6
|
+
type FileFormat = 'csv' | 'tsv' | 'json' | 'xlsx' | 'xls' | 'ods';
|
|
7
7
|
/** Text-based formats that accept string input. */
|
|
8
|
-
type TextFileFormat = 'csv' | 'tsv';
|
|
8
|
+
type TextFileFormat = 'csv' | 'tsv' | 'json';
|
|
9
9
|
/** Binary formats that accept ArrayBuffer input. */
|
|
10
10
|
type BinaryFileFormat = 'xlsx' | 'xls' | 'ods';
|
|
11
11
|
/** Shared base options for all parsers. */
|
package/dist/json.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const r=r=>"object"==typeof r&&null!==r&&!Array.isArray(r),e=r=>null==r?null:"number"==typeof r?Number.isFinite(r)?r:null:"string"==typeof r?r:"boolean"==typeof r?String(r):JSON.stringify(r);exports.fromJSON=(o,t)=>{const n="string"==typeof o?((r,e)=>{var o;const t=null!==(o=null==e?void 0:e.maxFileSize)&&void 0!==o?o:5,n=1024*t*1024,s=(new TextEncoder).encode(r).byteLength;if(s>n)throw new Error(`Input size (${s} bytes) exceeds the maximum allowed size of ${n} bytes (${t} MB).`);try{return JSON.parse(r)}catch(r){throw new Error(`Invalid JSON: ${r instanceof Error?r.message:"could not parse"}`)}})(o,t):o;if(Array.isArray(n))return(o=>{const t=[],n=new Set;for(const e of o){if(!r(e))throw new Error("Each JSON row must be an object mapping column names to values.");for(const r of Object.keys(e))n.has(r)||(n.add(r),t.push(r))}return{columns:t.map(r=>({key:r})),rows:o.map(r=>{const o={};for(const n of t)o[n]=e(r[n]);return o})}})(n);if((e=>r(e)&&Array.isArray(e.columns)&&Array.isArray(e.rows))(n))return(o=>{const t=o.columns.map(e=>{if(!r(e)||"string"!=typeof e.key||0===e.key.length)throw new Error('Each JSON column must be an object with a non-empty string "key".');return void 0!==e.label?{key:e.key,label:String(e.label)}:{key:e.key}}),n=o.rows.map(o=>{if(!r(o))throw new Error("Each JSON row must be an object mapping column keys to values.");const n={};for(const r of t)n[r.key]=e(o[r.key]);return n});return{columns:t,rows:n}})(n);throw new Error("Unsupported JSON dataset: expected an array of row objects or a { columns, rows } object.")};
|
package/dist/json.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { VizLocale, GraphConfig } from '@graphysdk/core/node';
|
|
2
|
+
|
|
3
|
+
/** The `data` shape returned by all parsers — same as `GraphConfig['data']`. */
|
|
4
|
+
type Data = GraphConfig['data'];
|
|
5
|
+
/** Shared base options for all parsers. */
|
|
6
|
+
interface BaseParseOptions {
|
|
7
|
+
/** Locale for number parsing. Determines thousand/decimal separator conventions. @default 'EN_US' */
|
|
8
|
+
locale?: VizLocale;
|
|
9
|
+
/** Maximum allowed input size in megabytes. @default 5 */
|
|
10
|
+
maxFileSize?: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** A JSON dataset given explicitly as `{ columns, rows }`; the declared column keys drive which fields each row contributes. */
|
|
14
|
+
interface JsonTable {
|
|
15
|
+
columns: ReadonlyArray<{
|
|
16
|
+
key: string;
|
|
17
|
+
label?: string;
|
|
18
|
+
}>;
|
|
19
|
+
rows: ReadonlyArray<Record<string, unknown>>;
|
|
20
|
+
}
|
|
21
|
+
/** Accepted JSON dataset inputs: a raw JSON string, an array of row objects, or a `{ columns, rows }` table. */
|
|
22
|
+
type JsonInput = string | ReadonlyArray<Record<string, unknown>> | JsonTable;
|
|
23
|
+
/**
|
|
24
|
+
* Parses a JSON dataset into the `Data` shape expected by `generateGraph()`. Accepts a raw JSON string, an
|
|
25
|
+
* array of row objects (columns are inferred as the union of keys, in first-seen order), or an explicit
|
|
26
|
+
* `{ columns, rows }` table. Unlike the delimited parsers, JSON object keys are preserved verbatim as column
|
|
27
|
+
* keys (no `c1`/`c2` synthesis), since JSON already names its fields.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* const data = fromJSON('[{"category":"Q1","revenue":120}]');
|
|
32
|
+
* const data = fromJSON([{ category: 'Q1', revenue: 120 }]);
|
|
33
|
+
* const data = fromJSON({ columns: [{ key: 'category' }], rows: [{ category: 'Q1' }] });
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
declare const fromJSON: (input: JsonInput, options?: BaseParseOptions) => Data;
|
|
37
|
+
|
|
38
|
+
export { fromJSON };
|
|
39
|
+
export type { BaseParseOptions, JsonInput, JsonTable };
|
package/dist/json.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const r=r=>"object"==typeof r&&null!==r&&!Array.isArray(r),e=r=>null==r?null:"number"==typeof r?Number.isFinite(r)?r:null:"string"==typeof r?r:"boolean"==typeof r?String(r):JSON.stringify(r),o=(o,t)=>{const n="string"==typeof o?((r,e)=>{var o;const t=null!==(o=null==e?void 0:e.maxFileSize)&&void 0!==o?o:5,n=1024*t*1024,s=(new TextEncoder).encode(r).byteLength;if(s>n)throw new Error(`Input size (${s} bytes) exceeds the maximum allowed size of ${n} bytes (${t} MB).`);try{return JSON.parse(r)}catch(r){throw new Error(`Invalid JSON: ${r instanceof Error?r.message:"could not parse"}`)}})(o,t):o;if(Array.isArray(n))return(o=>{const t=[],n=new Set;for(const e of o){if(!r(e))throw new Error("Each JSON row must be an object mapping column names to values.");for(const r of Object.keys(e))n.has(r)||(n.add(r),t.push(r))}return{columns:t.map(r=>({key:r})),rows:o.map(r=>{const o={};for(const n of t)o[n]=e(r[n]);return o})}})(n);if((e=>r(e)&&Array.isArray(e.columns)&&Array.isArray(e.rows))(n))return(o=>{const t=o.columns.map(e=>{if(!r(e)||"string"!=typeof e.key||0===e.key.length)throw new Error('Each JSON column must be an object with a non-empty string "key".');return void 0!==e.label?{key:e.key,label:String(e.label)}:{key:e.key}}),n=o.rows.map(o=>{if(!r(o))throw new Error("Each JSON row must be an object mapping column keys to values.");const n={};for(const r of t)n[r.key]=e(o[r.key]);return n});return{columns:t,rows:n}})(n);throw new Error("Unsupported JSON dataset: expected an array of row objects or a { columns, rows } object.")};export{o as fromJSON};
|
package/dist/text.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";require("tslib");var e=require("papaparse"),r=require("@graphysdk/core/node");require("exceljs");const t=/[^\p{ASCII}]/u,
|
|
1
|
+
"use strict";require("tslib");var e=require("papaparse"),r=require("@graphysdk/core/node");require("exceljs");const t=/[^\p{ASCII}]/u,o=/[\u2012\u2013\u2014\u2212](?=\d)/g,n=/\u00A0/g,s=/^-?(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d+)?$/,l=/^-?(?:\d{1,3}(?:\.\d{3})*|\d+)(?:,\d+)?$/,i=new Set(["PT_PT","AR"]),u=(e,r="EN_US")=>{let u;if(u=t.test(e)?e.replace(o,"-").replace(n," ").trim():e.trim(),""===u)return null;if(u.length>100)return u;if(i.has(r)){if(l.test(u)){const e=u.replace(/\./g,"").replace(",","."),r=Number(e);if(Number.isFinite(r))return r}}else if(s.test(u)){const e=u.replace(/,/g,""),r=Number(e);if(Number.isFinite(r))return r}return u},a=(t,o,n)=>{var s,l,i,a,c;const d=1024*(null!==(s=null==n?void 0:n.maxFileSize)&&void 0!==s?s:5)*1024;if(t.length>d)throw new Error(`Input size (${t.length} bytes) exceeds the maximum allowed size of ${d} bytes (${null!==(l=null==n?void 0:n.maxFileSize)&&void 0!==l?l:5} MB).`);const m=!1!==(null==n?void 0:n.hasHeader),p=null!==(i=null==n?void 0:n.locale)&&void 0!==i?i:"EN_US",f=e.parse(t,{header:!1,delimiter:o,skipEmptyLines:!0}),y=f.errors.filter(e=>"Quotes"===e.type);if(y.length>0){const e=y[0];throw new Error(`Parse error at row ${null!==(a=null==e?void 0:e.row)&&void 0!==a?a:"?"}: ${null!==(c=null==e?void 0:e.message)&&void 0!==c?c:"Unknown error"}`)}const w=f.data;if(0===w.length)return{columns:[],rows:[]};const h=m?w[0]:void 0,v=m?w.slice(1):w,b=((e,t)=>{var o;const n=[];for(let s=0;s<t;s++){const t=null===(o=null==e?void 0:e[s])||void 0===o?void 0:o.trim(),l={key:r.columnIndexToPropertyKey(s)};t&&(l.label=t),n.push(l)}return n})(h,w.reduce((e,r)=>Math.max(e,r.length),0)),g=((e,r,t)=>e.map(e=>{const o={};for(let n=0;n<r.length;n++){const s=r[n];if(!s)continue;const l=e[n];o[s.key]=null==l||""===l?null:"number"==typeof l?l:u(String(l),t)}return o}))(v,b,p);return{columns:b,rows:g}},c=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),d=e=>null==e?null:"number"==typeof e?Number.isFinite(e)?e:null:"string"==typeof e?e:"boolean"==typeof e?String(e):JSON.stringify(e),m=(e,r)=>{const t="string"==typeof e?((e,r)=>{var t;const o=null!==(t=null==r?void 0:r.maxFileSize)&&void 0!==t?t:5,n=1024*o*1024,s=(new TextEncoder).encode(e).byteLength;if(s>n)throw new Error(`Input size (${s} bytes) exceeds the maximum allowed size of ${n} bytes (${o} MB).`);try{return JSON.parse(e)}catch(e){throw new Error(`Invalid JSON: ${e instanceof Error?e.message:"could not parse"}`)}})(e,r):e;if(Array.isArray(t))return(e=>{const r=[],t=new Set;for(const o of e){if(!c(o))throw new Error("Each JSON row must be an object mapping column names to values.");for(const e of Object.keys(o))t.has(e)||(t.add(e),r.push(e))}return{columns:r.map(e=>({key:e})),rows:e.map(e=>{const t={};for(const o of r)t[o]=d(e[o]);return t})}})(t);if((e=>c(e)&&Array.isArray(e.columns)&&Array.isArray(e.rows))(t))return(e=>{const r=e.columns.map(e=>{if(!c(e)||"string"!=typeof e.key||0===e.key.length)throw new Error('Each JSON column must be an object with a non-empty string "key".');return void 0!==e.label?{key:e.key,label:String(e.label)}:{key:e.key}}),t=e.rows.map(e=>{if(!c(e))throw new Error("Each JSON row must be an object mapping column keys to values.");const t={};for(const o of r)t[o.key]=d(e[o.key]);return t});return{columns:r,rows:t}})(t);throw new Error("Unsupported JSON dataset: expected an array of row objects or a { columns, rows } object.")};exports.fromText=(e,r,t)=>{switch(r){case"csv":return((e,r)=>a(e,void 0,r))(e,t);case"tsv":return((e,r)=>a(e,"\t",r))(e,t);case"json":return m(e,t);default:throw new Error(`Unsupported text format "${r}". Supported: csv, tsv, json`)}};
|
package/dist/text.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { VizLocale, GraphConfig } from '@graphysdk/core/node';
|
|
|
3
3
|
/** The `data` shape returned by all parsers — same as `GraphConfig['data']`. */
|
|
4
4
|
type Data = GraphConfig['data'];
|
|
5
5
|
/** Text-based formats that accept string input. */
|
|
6
|
-
type TextFileFormat = 'csv' | 'tsv';
|
|
6
|
+
type TextFileFormat = 'csv' | 'tsv' | 'json';
|
|
7
7
|
/** Shared base options for all parsers. */
|
|
8
8
|
interface BaseParseOptions {
|
|
9
9
|
/** Locale for number parsing. Determines thousand/decimal separator conventions. @default 'EN_US' */
|
package/dist/text.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"tslib";import e from"papaparse";import{columnIndexToPropertyKey as r}from"@graphysdk/core/node";import"exceljs";const t=/[^\p{ASCII}]/u,
|
|
1
|
+
import"tslib";import e from"papaparse";import{columnIndexToPropertyKey as r}from"@graphysdk/core/node";import"exceljs";const t=/[^\p{ASCII}]/u,o=/[\u2012\u2013\u2014\u2212](?=\d)/g,n=/\u00A0/g,s=/^-?(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d+)?$/,l=/^-?(?:\d{1,3}(?:\.\d{3})*|\d+)(?:,\d+)?$/,i=new Set(["PT_PT","AR"]),u=(e,r="EN_US")=>{let u;if(u=t.test(e)?e.replace(o,"-").replace(n," ").trim():e.trim(),""===u)return null;if(u.length>100)return u;if(i.has(r)){if(l.test(u)){const e=u.replace(/\./g,"").replace(",","."),r=Number(e);if(Number.isFinite(r))return r}}else if(s.test(u)){const e=u.replace(/,/g,""),r=Number(e);if(Number.isFinite(r))return r}return u},a=(t,o,n)=>{var s,l,i,a,c;const m=1024*(null!==(s=null==n?void 0:n.maxFileSize)&&void 0!==s?s:5)*1024;if(t.length>m)throw new Error(`Input size (${t.length} bytes) exceeds the maximum allowed size of ${m} bytes (${null!==(l=null==n?void 0:n.maxFileSize)&&void 0!==l?l:5} MB).`);const d=!1!==(null==n?void 0:n.hasHeader),p=null!==(i=null==n?void 0:n.locale)&&void 0!==i?i:"EN_US",f=e.parse(t,{header:!1,delimiter:o,skipEmptyLines:!0}),y=f.errors.filter(e=>"Quotes"===e.type);if(y.length>0){const e=y[0];throw new Error(`Parse error at row ${null!==(a=null==e?void 0:e.row)&&void 0!==a?a:"?"}: ${null!==(c=null==e?void 0:e.message)&&void 0!==c?c:"Unknown error"}`)}const w=f.data;if(0===w.length)return{columns:[],rows:[]};const h=d?w[0]:void 0,v=d?w.slice(1):w,b=((e,t)=>{var o;const n=[];for(let s=0;s<t;s++){const t=null===(o=null==e?void 0:e[s])||void 0===o?void 0:o.trim(),l={key:r(s)};t&&(l.label=t),n.push(l)}return n})(h,w.reduce((e,r)=>Math.max(e,r.length),0)),g=((e,r,t)=>e.map(e=>{const o={};for(let n=0;n<r.length;n++){const s=r[n];if(!s)continue;const l=e[n];o[s.key]=null==l||""===l?null:"number"==typeof l?l:u(String(l),t)}return o}))(v,b,p);return{columns:b,rows:g}},c=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),m=e=>null==e?null:"number"==typeof e?Number.isFinite(e)?e:null:"string"==typeof e?e:"boolean"==typeof e?String(e):JSON.stringify(e),d=(e,r)=>{const t="string"==typeof e?((e,r)=>{var t;const o=null!==(t=null==r?void 0:r.maxFileSize)&&void 0!==t?t:5,n=1024*o*1024,s=(new TextEncoder).encode(e).byteLength;if(s>n)throw new Error(`Input size (${s} bytes) exceeds the maximum allowed size of ${n} bytes (${o} MB).`);try{return JSON.parse(e)}catch(e){throw new Error(`Invalid JSON: ${e instanceof Error?e.message:"could not parse"}`)}})(e,r):e;if(Array.isArray(t))return(e=>{const r=[],t=new Set;for(const o of e){if(!c(o))throw new Error("Each JSON row must be an object mapping column names to values.");for(const e of Object.keys(o))t.has(e)||(t.add(e),r.push(e))}return{columns:r.map(e=>({key:e})),rows:e.map(e=>{const t={};for(const o of r)t[o]=m(e[o]);return t})}})(t);if((e=>c(e)&&Array.isArray(e.columns)&&Array.isArray(e.rows))(t))return(e=>{const r=e.columns.map(e=>{if(!c(e)||"string"!=typeof e.key||0===e.key.length)throw new Error('Each JSON column must be an object with a non-empty string "key".');return void 0!==e.label?{key:e.key,label:String(e.label)}:{key:e.key}}),t=e.rows.map(e=>{if(!c(e))throw new Error("Each JSON row must be an object mapping column keys to values.");const t={};for(const o of r)t[o.key]=m(e[o.key]);return t});return{columns:r,rows:t}})(t);throw new Error("Unsupported JSON dataset: expected an array of row objects or a { columns, rows } object.")},p=(e,r,t)=>{switch(r){case"csv":return((e,r)=>a(e,void 0,r))(e,t);case"tsv":return((e,r)=>a(e,"\t",r))(e,t);case"json":return d(e,t);default:throw new Error(`Unsupported text format "${r}". Supported: csv, tsv, json`)}};export{p as fromText};
|
package/dist/url.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("tslib"),t=require("papaparse"),o=require("@graphysdk/core/node"),r=require("exceljs");const n=new Set(["csv","tsv"]),s={".csv":"csv",".tsv":"tsv",".tab":"tsv",".xlsx":"xlsx",".xls":"xls",".ods":"ods"},i=new Set(["http:","https:"]),l=[/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^0\.0\.0\.0$/],a=[/^::1$/,/^fc00:/i,/^fe80:/i],u=e=>{(e=>{if(!i.has(e.protocol))throw new Error(`Unsupported URL scheme: ${e.protocol}. Only http: and https: are supported.`)})(e),(e=>{const t=e.toLowerCase();if("localhost"===t)throw new Error(`Access to private network address is not allowed: ${e}`);const o=t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1):t,r=l.some(e=>e.test(o)),n=a.some(e=>e.test(o));if(r||n)throw new Error(`Access to private network address is not allowed: ${e}`)})(e.hostname)},
|
|
1
|
+
"use strict";var e=require("tslib"),t=require("papaparse"),o=require("@graphysdk/core/node"),r=require("exceljs");const n=new Set(["csv","tsv","json"]),s={".csv":"csv",".tsv":"tsv",".tab":"tsv",".json":"json",".xlsx":"xlsx",".xls":"xls",".ods":"ods"},i=new Set(["http:","https:"]),l=[/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^0\.0\.0\.0$/],a=[/^::1$/,/^fc00:/i,/^fe80:/i],u=e=>{(e=>{if(!i.has(e.protocol))throw new Error(`Unsupported URL scheme: ${e.protocol}. Only http: and https: are supported.`)})(e),(e=>{const t=e.toLowerCase();if("localhost"===t)throw new Error(`Access to private network address is not allowed: ${e}`);const o=t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1):t,r=l.some(e=>e.test(o)),n=a.some(e=>e.test(o));if(r||n)throw new Error(`Access to private network address is not allowed: ${e}`)})(e.hostname)},c=(e,t)=>{var r;const n=[];for(let s=0;s<t;s++){const t=null===(r=null==e?void 0:e[s])||void 0===r?void 0:r.trim(),i={key:o.columnIndexToPropertyKey(s)};t&&(i.label=t),n.push(i)}return n},d=/[^\p{ASCII}]/u,f=/[\u2012\u2013\u2014\u2212](?=\d)/g,w=/\u00A0/g,m=/^-?(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d+)?$/,p=/^-?(?:\d{1,3}(?:\.\d{3})*|\d+)(?:,\d+)?$/,h=new Set(["PT_PT","AR"]),v=(e,t="EN_US")=>{let o;if(o=d.test(e)?e.replace(f,"-").replace(w," ").trim():e.trim(),""===o)return null;if(o.length>100)return o;if(h.has(t)){if(p.test(o)){const e=o.replace(/\./g,"").replace(",","."),t=Number(e);if(Number.isFinite(t))return t}}else if(m.test(o)){const e=o.replace(/,/g,""),t=Number(e);if(Number.isFinite(t))return t}return o},y=(e,t,o)=>e.map(e=>{const r={};for(let n=0;n<t.length;n++){const s=t[n];if(!s)continue;const i=e[n];r[s.key]=null==i||""===i?null:"number"==typeof i?i:v(String(i),o)}return r}),x=(e,o,r)=>{var n,s,i,l,a;const u=1024*(null!==(n=null==r?void 0:r.maxFileSize)&&void 0!==n?n:5)*1024;if(e.length>u)throw new Error(`Input size (${e.length} bytes) exceeds the maximum allowed size of ${u} bytes (${null!==(s=null==r?void 0:r.maxFileSize)&&void 0!==s?s:5} MB).`);const d=!1!==(null==r?void 0:r.hasHeader),f=null!==(i=null==r?void 0:r.locale)&&void 0!==i?i:"EN_US",w=t.parse(e,{header:!1,delimiter:o,skipEmptyLines:!0}),m=w.errors.filter(e=>"Quotes"===e.type);if(m.length>0){const e=m[0];throw new Error(`Parse error at row ${null!==(l=null==e?void 0:e.row)&&void 0!==l?l:"?"}: ${null!==(a=null==e?void 0:e.message)&&void 0!==a?a:"Unknown error"}`)}const p=w.data;if(0===p.length)return{columns:[],rows:[]};const h=d?p[0]:void 0,v=d?p.slice(1):p,x=p.reduce((e,t)=>Math.max(e,t.length),0),b=c(h,x);return{columns:b,rows:y(v,b,f)}},b=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),g=e=>null==e?null:"number"==typeof e?Number.isFinite(e)?e:null:"string"==typeof e?e:"boolean"==typeof e?String(e):JSON.stringify(e),$=(e,t)=>{const o="string"==typeof e?((e,t)=>{var o;const r=null!==(o=null==t?void 0:t.maxFileSize)&&void 0!==o?o:5,n=1024*r*1024,s=(new TextEncoder).encode(e).byteLength;if(s>n)throw new Error(`Input size (${s} bytes) exceeds the maximum allowed size of ${n} bytes (${r} MB).`);try{return JSON.parse(e)}catch(e){throw new Error(`Invalid JSON: ${e instanceof Error?e.message:"could not parse"}`)}})(e,t):e;if(Array.isArray(o))return(e=>{const t=[],o=new Set;for(const r of e){if(!b(r))throw new Error("Each JSON row must be an object mapping column names to values.");for(const e of Object.keys(r))o.has(e)||(o.add(e),t.push(e))}return{columns:t.map(e=>({key:e})),rows:e.map(e=>{const o={};for(const r of t)o[r]=g(e[r]);return o})}})(o);if((e=>b(e)&&Array.isArray(e.columns)&&Array.isArray(e.rows))(o))return(e=>{const t=e.columns.map(e=>{if(!b(e)||"string"!=typeof e.key||0===e.key.length)throw new Error('Each JSON column must be an object with a non-empty string "key".');return void 0!==e.label?{key:e.key,label:String(e.label)}:{key:e.key}}),o=e.rows.map(e=>{if(!b(e))throw new Error("Each JSON row must be an object mapping column keys to values.");const o={};for(const r of t)o[r.key]=g(e[r.key]);return o});return{columns:t,rows:o}})(o);throw new Error("Unsupported JSON dataset: expected an array of row objects or a { columns, rows } object.")},E=e=>{const{value:t}=e;if(null==t)return null;if("number"==typeof t)return t;if("string"==typeof t)return""===t?null:t;if("boolean"==typeof t)return t?1:0;if(t instanceof Date)return t.toISOString();if((e=>"object"==typeof e&&null!==e&&"formula"in e)(t)){if("number"==typeof t.result)return t.result;if("string"==typeof t.result)return""===t.result?null:t.result;if("boolean"==typeof t.result)return t.result?1:0;if(t.result instanceof Date)return t.result.toISOString()}const o=e.text;return""===o?null:o},S=["dataValidations","conditionalFormatting","sheetProtection"];const k=(t,o)=>e.__awaiter(void 0,void 0,void 0,function*(){var n,s,i,l,a;const u=1024*(null!==(n=null==o?void 0:o.maxFileSize)&&void 0!==n?n:5)*1024;if(t.byteLength>u)throw new Error(`Input size (${t.byteLength} bytes) exceeds the maximum allowed size of ${u} bytes (${null!==(s=null==o?void 0:o.maxFileSize)&&void 0!==s?s:5} MB).`);const d=null!==(i=null==o?void 0:o.locale)&&void 0!==i?i:"EN_US",f=yield function(t){return e.__awaiter(this,void 0,void 0,function*(){const e=new r.Workbook;return yield e.xlsx.load(t,{ignoreNodes:S}),e})}(t),w=((e,t)=>{if(void 0===t)return e.worksheets[0];if("number"==typeof t){const o=e.worksheets[t];if(!o)throw new Error(`Sheet index ${t} is out of range. Workbook has ${e.worksheets.length} sheet(s).`);return o}const o=e.getWorksheet(t);if(!o){const o=e.worksheets.map(e=>`"${e.name}"`).join(", ");throw new Error(`Sheet "${t}" not found. Available sheets: ${o}`)}return o})(f,null==o?void 0:o.sheet);if(!w||0===w.rowCount)return{columns:[],rows:[]};const m=w.columnCount;if(0===m)return{columns:[],rows:[]};const p=w.getRow(1),h=[];for(let e=1;e<=m;e++){const t=p.getCell(e).value;h.push(String(null!=t?t:""))}const v=c(h,m),x=null!==(l=null==o?void 0:o.maxRows)&&void 0!==l?l:1e5,b=null!==(a=null==o?void 0:o.maxCells)&&void 0!==a?a:5e6,g=[];let $=0,k=0;for(let e=2;e<=w.rowCount;e++){if($++,$>x)throw new Error(`Row limit exceeded: processed ${$} rows (maximum: ${x}). Use the maxRows option to increase the limit.`);if(k+=m,k>b)throw new Error(`Cell limit exceeded: processed ${k} cells (maximum: ${b}). Use the maxCells option to increase the limit.`);const t=w.getRow(e),o=[];for(let e=1;e<=m;e++)o.push(E(t.getCell(e)));g.push(o)}return{columns:v,rows:y(g,v,d)}}),z=(e,t,o)=>{switch(t){case"csv":return((e,t)=>x(e,void 0,t))(e,o);case"tsv":return((e,t)=>x(e,"\t",t))(e,o);case"json":return $(e,o);default:throw new Error(`Unsupported text format "${t}". Supported: csv, tsv, json`)}},j=(t,o,r)=>e.__awaiter(void 0,void 0,void 0,function*(){switch(o){case"xlsx":case"xls":case"ods":return((e,t)=>k(e,t))(t,r);default:throw new Error(`Unsupported binary format "${o}". Supported: xlsx, xls, ods`)}}),A={"text/csv":"csv","text/tab-separated-values":"tsv","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","application/vnd.ms-excel":"xls","application/vnd.oasis.opendocument.spreadsheet":"ods"};exports.fromURL=(t,o)=>e.__awaiter(void 0,void 0,void 0,function*(){var r,i,l;const a=new URL(t);u(a);const{pathname:c}=a,d=c.lastIndexOf("."),f=(e=>s[e.toLowerCase()])(-1===d?"":c.slice(d)),w=AbortSignal.timeout(null!==(r=null==o?void 0:o.timeout)&&void 0!==r?r:3e4),m={signal:(null==o?void 0:o.signal)?AbortSignal.any([w,o.signal]):w};(null==o?void 0:o.headers)&&(m.headers=o.headers);const p=yield fetch(t,m);if(!p.ok)throw new Error(`Failed to fetch "${t}": ${p.status} ${p.statusText}`);const h=null!=f?f:(e=>{var t;if(!e)return;const o=null===(t=e.split(";")[0])||void 0===t?void 0:t.trim().toLowerCase();return o?A[o]:void 0})(p.headers.get("content-type"));if(!h){const e=Object.keys(s).join(", ");throw new Error(`Could not detect format for "${t}". No recognized file extension or Content-Type. Supported extensions: ${e}`)}const v=1024*(null!==(i=null==o?void 0:o.maxFileSize)&&void 0!==i?i:5)*1024,y=p.headers.get("content-length");if(y&&Number(y)>v)throw new Error(`Response size (${y} bytes) exceeds the maximum allowed size of ${v} bytes (${null!==(l=null==o?void 0:o.maxFileSize)&&void 0!==l?l:5} MB).`);const x=n.has(h),b=yield((t,o,r)=>e.__awaiter(void 0,void 0,void 0,function*(){const e=t.body;if(!e){if(r){const e=yield t.text(),r=(new TextEncoder).encode(e).byteLength;if(r>o)throw new Error(`Response body size (${r} bytes) exceeds the maximum allowed size of ${o} bytes.`);return e}const e=yield t.arrayBuffer();if(e.byteLength>o)throw new Error(`Response body size (${e.byteLength} bytes) exceeds the maximum allowed size of ${o} bytes.`);return e}const n=e.getReader(),s=[];let i=0;try{for(;;){const{done:e,value:t}=yield n.read();if(e)break;if(i+=t.byteLength,i>o)throw yield n.cancel(),new Error(`Response body size exceeds the maximum allowed size of ${o} bytes. Download aborted.`);s.push(t)}}catch(e){if(e instanceof Error&&e.message.includes("maximum allowed size"))throw e;throw yield n.cancel().catch(()=>{}),e}if(r){const e=new TextDecoder;return s.map(t=>e.decode(t,{stream:!0})).join("")+e.decode()}const l=new Uint8Array(i);let a=0;for(const e of s)l.set(e,a),a+=e.byteLength;return l.buffer}))(p,v,x);return((t,o,r)=>e.__awaiter(void 0,void 0,void 0,function*(){switch(o){case"csv":case"tsv":case"json":if("string"!=typeof t)throw new TypeError(`${o.toUpperCase()} parsing requires a string input, but received an ArrayBuffer.`);return z(t,o,r);case"xlsx":case"xls":case"ods":if("string"==typeof t)throw new TypeError(`${o.toUpperCase()} parsing requires an ArrayBuffer input, but received a string.`);return j(t,o,r);default:throw new Error(`Unsupported format "${o}". Supported formats: csv, tsv, json, xlsx, xls, ods`)}}))(b,h,o)});
|
package/dist/url.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__awaiter as e}from"tslib";import t from"papaparse";import{columnIndexToPropertyKey as o}from"@graphysdk/core/node";import r from"exceljs";const n=new Set(["csv","tsv"]),s={".csv":"csv",".tsv":"tsv",".tab":"tsv",".xlsx":"xlsx",".xls":"xls",".ods":"ods"},i=new Set(["http:","https:"]),l=[/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^0\.0\.0\.0$/],
|
|
1
|
+
import{__awaiter as e}from"tslib";import t from"papaparse";import{columnIndexToPropertyKey as o}from"@graphysdk/core/node";import r from"exceljs";const n=new Set(["csv","tsv","json"]),s={".csv":"csv",".tsv":"tsv",".tab":"tsv",".json":"json",".xlsx":"xlsx",".xls":"xls",".ods":"ods"},i=new Set(["http:","https:"]),l=[/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^0\.0\.0\.0$/],a=[/^::1$/,/^fc00:/i,/^fe80:/i],u=e=>{(e=>{if(!i.has(e.protocol))throw new Error(`Unsupported URL scheme: ${e.protocol}. Only http: and https: are supported.`)})(e),(e=>{const t=e.toLowerCase();if("localhost"===t)throw new Error(`Access to private network address is not allowed: ${e}`);const o=t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1):t,r=l.some(e=>e.test(o)),n=a.some(e=>e.test(o));if(r||n)throw new Error(`Access to private network address is not allowed: ${e}`)})(e.hostname)},c=(e,t)=>{var r;const n=[];for(let s=0;s<t;s++){const t=null===(r=null==e?void 0:e[s])||void 0===r?void 0:r.trim(),i={key:o(s)};t&&(i.label=t),n.push(i)}return n},d=/[^\p{ASCII}]/u,f=/[\u2012\u2013\u2014\u2212](?=\d)/g,m=/\u00A0/g,p=/^-?(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d+)?$/,h=/^-?(?:\d{1,3}(?:\.\d{3})*|\d+)(?:,\d+)?$/,w=new Set(["PT_PT","AR"]),v=(e,t="EN_US")=>{let o;if(o=d.test(e)?e.replace(f,"-").replace(m," ").trim():e.trim(),""===o)return null;if(o.length>100)return o;if(w.has(t)){if(h.test(o)){const e=o.replace(/\./g,"").replace(",","."),t=Number(e);if(Number.isFinite(t))return t}}else if(p.test(o)){const e=o.replace(/,/g,""),t=Number(e);if(Number.isFinite(t))return t}return o},y=(e,t,o)=>e.map(e=>{const r={};for(let n=0;n<t.length;n++){const s=t[n];if(!s)continue;const i=e[n];r[s.key]=null==i||""===i?null:"number"==typeof i?i:v(String(i),o)}return r}),x=(e,o,r)=>{var n,s,i,l,a;const u=1024*(null!==(n=null==r?void 0:r.maxFileSize)&&void 0!==n?n:5)*1024;if(e.length>u)throw new Error(`Input size (${e.length} bytes) exceeds the maximum allowed size of ${u} bytes (${null!==(s=null==r?void 0:r.maxFileSize)&&void 0!==s?s:5} MB).`);const d=!1!==(null==r?void 0:r.hasHeader),f=null!==(i=null==r?void 0:r.locale)&&void 0!==i?i:"EN_US",m=t.parse(e,{header:!1,delimiter:o,skipEmptyLines:!0}),p=m.errors.filter(e=>"Quotes"===e.type);if(p.length>0){const e=p[0];throw new Error(`Parse error at row ${null!==(l=null==e?void 0:e.row)&&void 0!==l?l:"?"}: ${null!==(a=null==e?void 0:e.message)&&void 0!==a?a:"Unknown error"}`)}const h=m.data;if(0===h.length)return{columns:[],rows:[]};const w=d?h[0]:void 0,v=d?h.slice(1):h,x=h.reduce((e,t)=>Math.max(e,t.length),0),b=c(w,x);return{columns:b,rows:y(v,b,f)}},b=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),g=e=>null==e?null:"number"==typeof e?Number.isFinite(e)?e:null:"string"==typeof e?e:"boolean"==typeof e?String(e):JSON.stringify(e),$=(e,t)=>{const o="string"==typeof e?((e,t)=>{var o;const r=null!==(o=null==t?void 0:t.maxFileSize)&&void 0!==o?o:5,n=1024*r*1024,s=(new TextEncoder).encode(e).byteLength;if(s>n)throw new Error(`Input size (${s} bytes) exceeds the maximum allowed size of ${n} bytes (${r} MB).`);try{return JSON.parse(e)}catch(e){throw new Error(`Invalid JSON: ${e instanceof Error?e.message:"could not parse"}`)}})(e,t):e;if(Array.isArray(o))return(e=>{const t=[],o=new Set;for(const r of e){if(!b(r))throw new Error("Each JSON row must be an object mapping column names to values.");for(const e of Object.keys(r))o.has(e)||(o.add(e),t.push(e))}return{columns:t.map(e=>({key:e})),rows:e.map(e=>{const o={};for(const r of t)o[r]=g(e[r]);return o})}})(o);if((e=>b(e)&&Array.isArray(e.columns)&&Array.isArray(e.rows))(o))return(e=>{const t=e.columns.map(e=>{if(!b(e)||"string"!=typeof e.key||0===e.key.length)throw new Error('Each JSON column must be an object with a non-empty string "key".');return void 0!==e.label?{key:e.key,label:String(e.label)}:{key:e.key}}),o=e.rows.map(e=>{if(!b(e))throw new Error("Each JSON row must be an object mapping column keys to values.");const o={};for(const r of t)o[r.key]=g(e[r.key]);return o});return{columns:t,rows:o}})(o);throw new Error("Unsupported JSON dataset: expected an array of row objects or a { columns, rows } object.")},E=e=>{const{value:t}=e;if(null==t)return null;if("number"==typeof t)return t;if("string"==typeof t)return""===t?null:t;if("boolean"==typeof t)return t?1:0;if(t instanceof Date)return t.toISOString();if((e=>"object"==typeof e&&null!==e&&"formula"in e)(t)){if("number"==typeof t.result)return t.result;if("string"==typeof t.result)return""===t.result?null:t.result;if("boolean"==typeof t.result)return t.result?1:0;if(t.result instanceof Date)return t.result.toISOString()}const o=e.text;return""===o?null:o},S=["dataValidations","conditionalFormatting","sheetProtection"];const k=(t,o)=>e(void 0,void 0,void 0,function*(){var n,s,i,l,a;const u=1024*(null!==(n=null==o?void 0:o.maxFileSize)&&void 0!==n?n:5)*1024;if(t.byteLength>u)throw new Error(`Input size (${t.byteLength} bytes) exceeds the maximum allowed size of ${u} bytes (${null!==(s=null==o?void 0:o.maxFileSize)&&void 0!==s?s:5} MB).`);const d=null!==(i=null==o?void 0:o.locale)&&void 0!==i?i:"EN_US",f=yield function(t){return e(this,void 0,void 0,function*(){const e=new r.Workbook;return yield e.xlsx.load(t,{ignoreNodes:S}),e})}(t),m=((e,t)=>{if(void 0===t)return e.worksheets[0];if("number"==typeof t){const o=e.worksheets[t];if(!o)throw new Error(`Sheet index ${t} is out of range. Workbook has ${e.worksheets.length} sheet(s).`);return o}const o=e.getWorksheet(t);if(!o){const o=e.worksheets.map(e=>`"${e.name}"`).join(", ");throw new Error(`Sheet "${t}" not found. Available sheets: ${o}`)}return o})(f,null==o?void 0:o.sheet);if(!m||0===m.rowCount)return{columns:[],rows:[]};const p=m.columnCount;if(0===p)return{columns:[],rows:[]};const h=m.getRow(1),w=[];for(let e=1;e<=p;e++){const t=h.getCell(e).value;w.push(String(null!=t?t:""))}const v=c(w,p),x=null!==(l=null==o?void 0:o.maxRows)&&void 0!==l?l:1e5,b=null!==(a=null==o?void 0:o.maxCells)&&void 0!==a?a:5e6,g=[];let $=0,k=0;for(let e=2;e<=m.rowCount;e++){if($++,$>x)throw new Error(`Row limit exceeded: processed ${$} rows (maximum: ${x}). Use the maxRows option to increase the limit.`);if(k+=p,k>b)throw new Error(`Cell limit exceeded: processed ${k} cells (maximum: ${b}). Use the maxCells option to increase the limit.`);const t=m.getRow(e),o=[];for(let e=1;e<=p;e++)o.push(E(t.getCell(e)));g.push(o)}return{columns:v,rows:y(g,v,d)}}),z=(e,t,o)=>{switch(t){case"csv":return((e,t)=>x(e,void 0,t))(e,o);case"tsv":return((e,t)=>x(e,"\t",t))(e,o);case"json":return $(e,o);default:throw new Error(`Unsupported text format "${t}". Supported: csv, tsv, json`)}},j=(t,o,r)=>e(void 0,void 0,void 0,function*(){switch(o){case"xlsx":case"xls":case"ods":return((e,t)=>k(e,t))(t,r);default:throw new Error(`Unsupported binary format "${o}". Supported: xlsx, xls, ods`)}}),A={"text/csv":"csv","text/tab-separated-values":"tsv","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","application/vnd.ms-excel":"xls","application/vnd.oasis.opendocument.spreadsheet":"ods"},N=(t,o)=>e(void 0,void 0,void 0,function*(){var r,i,l;const a=new URL(t);u(a);const{pathname:c}=a,d=c.lastIndexOf("."),f=(e=>s[e.toLowerCase()])(-1===d?"":c.slice(d)),m=AbortSignal.timeout(null!==(r=null==o?void 0:o.timeout)&&void 0!==r?r:3e4),p={signal:(null==o?void 0:o.signal)?AbortSignal.any([m,o.signal]):m};(null==o?void 0:o.headers)&&(p.headers=o.headers);const h=yield fetch(t,p);if(!h.ok)throw new Error(`Failed to fetch "${t}": ${h.status} ${h.statusText}`);const w=null!=f?f:(e=>{var t;if(!e)return;const o=null===(t=e.split(";")[0])||void 0===t?void 0:t.trim().toLowerCase();return o?A[o]:void 0})(h.headers.get("content-type"));if(!w){const e=Object.keys(s).join(", ");throw new Error(`Could not detect format for "${t}". No recognized file extension or Content-Type. Supported extensions: ${e}`)}const v=1024*(null!==(i=null==o?void 0:o.maxFileSize)&&void 0!==i?i:5)*1024,y=h.headers.get("content-length");if(y&&Number(y)>v)throw new Error(`Response size (${y} bytes) exceeds the maximum allowed size of ${v} bytes (${null!==(l=null==o?void 0:o.maxFileSize)&&void 0!==l?l:5} MB).`);const x=n.has(w),b=yield((t,o,r)=>e(void 0,void 0,void 0,function*(){const e=t.body;if(!e){if(r){const e=yield t.text(),r=(new TextEncoder).encode(e).byteLength;if(r>o)throw new Error(`Response body size (${r} bytes) exceeds the maximum allowed size of ${o} bytes.`);return e}const e=yield t.arrayBuffer();if(e.byteLength>o)throw new Error(`Response body size (${e.byteLength} bytes) exceeds the maximum allowed size of ${o} bytes.`);return e}const n=e.getReader(),s=[];let i=0;try{for(;;){const{done:e,value:t}=yield n.read();if(e)break;if(i+=t.byteLength,i>o)throw yield n.cancel(),new Error(`Response body size exceeds the maximum allowed size of ${o} bytes. Download aborted.`);s.push(t)}}catch(e){if(e instanceof Error&&e.message.includes("maximum allowed size"))throw e;throw yield n.cancel().catch(()=>{}),e}if(r){const e=new TextDecoder;return s.map(t=>e.decode(t,{stream:!0})).join("")+e.decode()}const l=new Uint8Array(i);let a=0;for(const e of s)l.set(e,a),a+=e.byteLength;return l.buffer}))(h,v,x);return((t,o,r)=>e(void 0,void 0,void 0,function*(){switch(o){case"csv":case"tsv":case"json":if("string"!=typeof t)throw new TypeError(`${o.toUpperCase()} parsing requires a string input, but received an ArrayBuffer.`);return z(t,o,r);case"xlsx":case"xls":case"ods":if("string"==typeof t)throw new TypeError(`${o.toUpperCase()} parsing requires an ArrayBuffer input, but received a string.`);return j(t,o,r);default:throw new Error(`Unsupported format "${o}". Supported formats: csv, tsv, json, xlsx, xls, ods`)}}))(b,w,o)});export{N as fromURL};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@graphysdk/data-import-utils",
|
|
3
3
|
"author": "Graphy",
|
|
4
|
-
"version": "1.7.
|
|
4
|
+
"version": "1.7.2",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -21,6 +21,11 @@
|
|
|
21
21
|
"import": "./dist/tsv.mjs",
|
|
22
22
|
"require": "./dist/tsv.cjs"
|
|
23
23
|
},
|
|
24
|
+
"./json": {
|
|
25
|
+
"types": "./dist/json.d.ts",
|
|
26
|
+
"import": "./dist/json.mjs",
|
|
27
|
+
"require": "./dist/json.cjs"
|
|
28
|
+
},
|
|
24
29
|
"./xlsx": {
|
|
25
30
|
"types": "./dist/xlsx.d.ts",
|
|
26
31
|
"import": "./dist/xlsx.mjs",
|
|
@@ -65,6 +70,9 @@
|
|
|
65
70
|
"tsv": [
|
|
66
71
|
"dist/tsv.d.ts"
|
|
67
72
|
],
|
|
73
|
+
"json": [
|
|
74
|
+
"dist/json.d.ts"
|
|
75
|
+
],
|
|
68
76
|
"xlsx": [
|
|
69
77
|
"dist/xlsx.d.ts"
|
|
70
78
|
],
|
|
@@ -91,7 +99,7 @@
|
|
|
91
99
|
"dependencies": {
|
|
92
100
|
"exceljs": "^4.4.0",
|
|
93
101
|
"papaparse": "^5.5.2",
|
|
94
|
-
"@graphysdk/core": "1.7.
|
|
102
|
+
"@graphysdk/core": "1.7.2"
|
|
95
103
|
},
|
|
96
104
|
"devDependencies": {
|
|
97
105
|
"@rollup/plugin-commonjs": "^28.0.6",
|
|
@@ -106,7 +114,7 @@
|
|
|
106
114
|
"rollup-plugin-node-externals": "^8.1.1",
|
|
107
115
|
"tslib": "^2.8.1",
|
|
108
116
|
"vitest": "^4.1.0",
|
|
109
|
-
"@graphysdk/core": "1.7.
|
|
117
|
+
"@graphysdk/core": "1.7.2",
|
|
110
118
|
"@graphytools/eslint-config": "0.0.1",
|
|
111
119
|
"@graphytools/typescript-config": "0.0.1",
|
|
112
120
|
"@graphytools/vitest-config": "1.0.0"
|