@jxsuite/parser 0.27.0 → 0.28.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.
- package/dist/content.js +53 -1
- package/dist/csv.js +189 -0
- package/dist/markdown.js +44815 -0
- package/dist/serialize.js +30786 -0
- package/package.json +14 -7
- package/src/Csv.class.json +171 -0
- package/src/Markdown.class.json +272 -0
- package/src/content.ts +17 -4
- package/src/csv.ts +209 -0
- package/src/markdown.ts +112 -0
- package/src/md.ts +6 -49
- package/src/serialize.ts +1482 -0
- package/src/MarkdownFile.class.json +0 -94
package/dist/content.js
CHANGED
|
@@ -1,3 +1,51 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
function __accessProp(key) {
|
|
8
|
+
return this[key];
|
|
9
|
+
}
|
|
10
|
+
var __toESMCache_node;
|
|
11
|
+
var __toESMCache_esm;
|
|
12
|
+
var __toESM = (mod, isNodeMode, target) => {
|
|
13
|
+
var canCache = mod != null && typeof mod === "object";
|
|
14
|
+
if (canCache) {
|
|
15
|
+
var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
|
|
16
|
+
var cached = cache.get(mod);
|
|
17
|
+
if (cached)
|
|
18
|
+
return cached;
|
|
19
|
+
}
|
|
20
|
+
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
21
|
+
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
22
|
+
for (let key of __getOwnPropNames(mod))
|
|
23
|
+
if (!__hasOwnProp.call(to, key))
|
|
24
|
+
__defProp(to, key, {
|
|
25
|
+
get: __accessProp.bind(mod, key),
|
|
26
|
+
enumerable: true
|
|
27
|
+
});
|
|
28
|
+
if (canCache)
|
|
29
|
+
cache.set(mod, to);
|
|
30
|
+
return to;
|
|
31
|
+
};
|
|
32
|
+
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
33
|
+
var __returnValue = (v) => v;
|
|
34
|
+
function __exportSetter(name, newValue) {
|
|
35
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
36
|
+
}
|
|
37
|
+
var __export = (target, all) => {
|
|
38
|
+
for (var name in all)
|
|
39
|
+
__defProp(target, name, {
|
|
40
|
+
get: all[name],
|
|
41
|
+
enumerable: true,
|
|
42
|
+
configurable: true,
|
|
43
|
+
set: __exportSetter.bind(all, name)
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
47
|
+
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
48
|
+
|
|
1
49
|
// src/content.ts
|
|
2
50
|
function evaluateFilterRule(rule, entry) {
|
|
3
51
|
const actual = rule.field === "id" ? entry.id : entry.data[rule.field];
|
|
@@ -33,7 +81,11 @@ function queryContentType(entries, query = {}) {
|
|
|
33
81
|
if (Array.isArray(query.filter)) {
|
|
34
82
|
rules = query.filter;
|
|
35
83
|
} else if (typeof query.filter === "object") {
|
|
36
|
-
rules = Object.entries(query.filter).map(([field, value]) => ({
|
|
84
|
+
rules = Object.entries(query.filter).map(([field, value]) => ({
|
|
85
|
+
field,
|
|
86
|
+
op: "==",
|
|
87
|
+
value
|
|
88
|
+
}));
|
|
37
89
|
} else {
|
|
38
90
|
rules = [];
|
|
39
91
|
}
|
package/dist/csv.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
function __accessProp(key) {
|
|
8
|
+
return this[key];
|
|
9
|
+
}
|
|
10
|
+
var __toESMCache_node;
|
|
11
|
+
var __toESMCache_esm;
|
|
12
|
+
var __toESM = (mod, isNodeMode, target) => {
|
|
13
|
+
var canCache = mod != null && typeof mod === "object";
|
|
14
|
+
if (canCache) {
|
|
15
|
+
var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
|
|
16
|
+
var cached = cache.get(mod);
|
|
17
|
+
if (cached)
|
|
18
|
+
return cached;
|
|
19
|
+
}
|
|
20
|
+
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
21
|
+
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
22
|
+
for (let key of __getOwnPropNames(mod))
|
|
23
|
+
if (!__hasOwnProp.call(to, key))
|
|
24
|
+
__defProp(to, key, {
|
|
25
|
+
get: __accessProp.bind(mod, key),
|
|
26
|
+
enumerable: true
|
|
27
|
+
});
|
|
28
|
+
if (canCache)
|
|
29
|
+
cache.set(mod, to);
|
|
30
|
+
return to;
|
|
31
|
+
};
|
|
32
|
+
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
33
|
+
var __returnValue = (v) => v;
|
|
34
|
+
function __exportSetter(name, newValue) {
|
|
35
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
36
|
+
}
|
|
37
|
+
var __export = (target, all) => {
|
|
38
|
+
for (var name in all)
|
|
39
|
+
__defProp(target, name, {
|
|
40
|
+
get: all[name],
|
|
41
|
+
enumerable: true,
|
|
42
|
+
configurable: true,
|
|
43
|
+
set: __exportSetter.bind(all, name)
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
47
|
+
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
48
|
+
|
|
49
|
+
// src/csv.ts
|
|
50
|
+
function parseCSV(csv) {
|
|
51
|
+
const rows = [];
|
|
52
|
+
let current = "";
|
|
53
|
+
let inQuotes = false;
|
|
54
|
+
const lines = [];
|
|
55
|
+
for (let i = 0;i < csv.length; i++) {
|
|
56
|
+
const ch = csv[i];
|
|
57
|
+
if (ch === '"') {
|
|
58
|
+
current += ch;
|
|
59
|
+
if (inQuotes && csv[i + 1] === '"') {
|
|
60
|
+
current += csv[i + 1];
|
|
61
|
+
i++;
|
|
62
|
+
} else {
|
|
63
|
+
inQuotes = !inQuotes;
|
|
64
|
+
}
|
|
65
|
+
} else if ((ch === `
|
|
66
|
+
` || ch === "\r" && csv[i + 1] === `
|
|
67
|
+
`) && !inQuotes) {
|
|
68
|
+
lines.push(current);
|
|
69
|
+
current = "";
|
|
70
|
+
if (ch === "\r")
|
|
71
|
+
i++;
|
|
72
|
+
} else {
|
|
73
|
+
current += ch;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (current.trim())
|
|
77
|
+
lines.push(current);
|
|
78
|
+
if (lines.length === 0)
|
|
79
|
+
return [];
|
|
80
|
+
const parseRow = (line) => {
|
|
81
|
+
const fields = [];
|
|
82
|
+
let field = "";
|
|
83
|
+
let q = false;
|
|
84
|
+
for (let i = 0;i < line.length; i++) {
|
|
85
|
+
const ch = line[i];
|
|
86
|
+
if (ch === '"') {
|
|
87
|
+
if (q && line[i + 1] === '"') {
|
|
88
|
+
field += '"';
|
|
89
|
+
i++;
|
|
90
|
+
} else {
|
|
91
|
+
q = !q;
|
|
92
|
+
}
|
|
93
|
+
} else if (ch === "," && !q) {
|
|
94
|
+
fields.push(field);
|
|
95
|
+
field = "";
|
|
96
|
+
} else {
|
|
97
|
+
field += ch;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
fields.push(field);
|
|
101
|
+
return fields;
|
|
102
|
+
};
|
|
103
|
+
const headers = parseRow(lines[0]);
|
|
104
|
+
for (let i = 1;i < lines.length; i++) {
|
|
105
|
+
const fields = parseRow(lines[i]);
|
|
106
|
+
const obj = {};
|
|
107
|
+
for (let j = 0;j < headers.length; j++) {
|
|
108
|
+
obj[headers[j].trim()] = fields[j]?.trim() ?? "";
|
|
109
|
+
}
|
|
110
|
+
rows.push(obj);
|
|
111
|
+
}
|
|
112
|
+
return rows;
|
|
113
|
+
}
|
|
114
|
+
function coerceCSVRows(rows, schema, idField) {
|
|
115
|
+
return rows.map((row, i) => {
|
|
116
|
+
const data = { ...row };
|
|
117
|
+
if (schema?.properties) {
|
|
118
|
+
for (const [key, def] of Object.entries(schema.properties)) {
|
|
119
|
+
if (!(key in data))
|
|
120
|
+
continue;
|
|
121
|
+
if (def.type === "number") {
|
|
122
|
+
const raw = String(data[key] ?? "").trim();
|
|
123
|
+
if (raw === "") {
|
|
124
|
+
data[key] = null;
|
|
125
|
+
} else {
|
|
126
|
+
const cleaned = raw.replace(/[$€£¥,\s]/g, "");
|
|
127
|
+
const n = Number(cleaned);
|
|
128
|
+
data[key] = isNaN(n) ? null : n;
|
|
129
|
+
}
|
|
130
|
+
} else if (def.type === "boolean") {
|
|
131
|
+
data[key] = data[key] === "true";
|
|
132
|
+
} else if (def.type === "array") {
|
|
133
|
+
const raw = String(data[key] ?? "").trim();
|
|
134
|
+
data[key] = raw === "" ? [] : raw.split(",").map((s) => s.trim()).filter(Boolean);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const id = (idField ? data[idField] : undefined) ?? data.id ?? data.sku ?? data.slug ?? data.Slug ?? String(i);
|
|
139
|
+
return { id, data, body: null };
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
class Csv {
|
|
144
|
+
config;
|
|
145
|
+
constructor(config) {
|
|
146
|
+
this.config = config;
|
|
147
|
+
}
|
|
148
|
+
static parse(source, options = {}) {
|
|
149
|
+
return coerceCSVRows(parseCSV(source), options.schema, options.idField);
|
|
150
|
+
}
|
|
151
|
+
static async discover(source, options = {}) {
|
|
152
|
+
const { existsSync, readdirSync } = await import("node:fs");
|
|
153
|
+
const { resolve, extname } = await import("node:path");
|
|
154
|
+
const resolved = options.baseDir ? resolve(options.baseDir, source) : resolve(source);
|
|
155
|
+
if (extname(resolved)) {
|
|
156
|
+
return existsSync(resolved) ? [resolved] : [];
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
return readdirSync(resolved, { recursive: true }).filter((f) => String(f).endsWith(".csv")).map((f) => resolve(resolved, String(f)));
|
|
160
|
+
} catch {
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
static async load(path, options = {}) {
|
|
165
|
+
if (path.startsWith("http://") || path.startsWith("https://")) {
|
|
166
|
+
const response = await fetch(path);
|
|
167
|
+
if (!response.ok) {
|
|
168
|
+
throw new Error(`Failed to fetch CSV from ${path}: ${response.status} ${response.statusText}`);
|
|
169
|
+
}
|
|
170
|
+
return Csv.parse(await response.text(), options);
|
|
171
|
+
}
|
|
172
|
+
const { readFileSync } = await import("node:fs");
|
|
173
|
+
return Csv.parse(readFileSync(path, "utf-8"), options);
|
|
174
|
+
}
|
|
175
|
+
async resolve() {
|
|
176
|
+
const { src, basePath, ...options } = this.config;
|
|
177
|
+
if (src.startsWith("http://") || src.startsWith("https://")) {
|
|
178
|
+
return Csv.load(src, options);
|
|
179
|
+
}
|
|
180
|
+
const { resolve } = await import("node:path");
|
|
181
|
+
const filePath = basePath ? resolve(basePath, src) : resolve(src);
|
|
182
|
+
return Csv.load(filePath, options);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
export {
|
|
186
|
+
parseCSV,
|
|
187
|
+
coerceCSVRows,
|
|
188
|
+
Csv
|
|
189
|
+
};
|