qvdjs 1.0.0 → 1.0.1
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/README.md +14 -14
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -37,7 +37,7 @@ files, and validate output in your own Qlik environment** before relying on it.
|
|
|
37
37
|
Qlik file and writing it back reproduces its symbol table byte for byte, whichever way it was read; a
|
|
38
38
|
value you change is written as Qlik stores that kind of value. Where that boundary lies is the first
|
|
39
39
|
thing worth reading:
|
|
40
|
-
[What a round trip preserves](https://qvdjs.ptarmiganlabs.com/
|
|
40
|
+
[What a round trip preserves](https://qvdjs.ptarmiganlabs.com/v1.0/overview/what-a-round-trip-preserves/).
|
|
41
41
|
|
|
42
42
|
## Four ways to open a file
|
|
43
43
|
|
|
@@ -79,7 +79,7 @@ Reaching for `fromQvd` when you wanted one of the other three is the common mist
|
|
|
79
79
|
`fromQvd(path, {maxRows: 0})` is **not** a substitute for `readMetadata`: it loads no rows but still
|
|
80
80
|
parses the whole symbol table, which grows with the data.
|
|
81
81
|
|
|
82
|
-
→ [Choosing an entry point](https://qvdjs.ptarmiganlabs.com/
|
|
82
|
+
→ [Choosing an entry point](https://qvdjs.ptarmiganlabs.com/v1.0/getting-started/)
|
|
83
83
|
|
|
84
84
|
## What a cell holds
|
|
85
85
|
|
|
@@ -125,7 +125,7 @@ NULL. A dual value - a `QvdDual`, or an object with exactly the keys `number` an
|
|
|
125
125
|
as a dual, which is how a number gets the text Qlik displays. As in Qlik, a field holds one text per
|
|
126
126
|
number, the first written. Anything else is refused with a `QvdValidationError`.
|
|
127
127
|
|
|
128
|
-
→ [Writing a QVD](https://qvdjs.ptarmiganlabs.com/
|
|
128
|
+
→ [Writing a QVD](https://qvdjs.ptarmiganlabs.com/v1.0/guides/)
|
|
129
129
|
|
|
130
130
|
## Reading part of a file
|
|
131
131
|
|
|
@@ -165,7 +165,7 @@ try {
|
|
|
165
165
|
When it is `iterate()` that overflowed, the context carries `recommendedChunkSize` as well, so a
|
|
166
166
|
caller cannot mistake one recommendation for the other.
|
|
167
167
|
|
|
168
|
-
→ [Memory and file size limits](https://qvdjs.ptarmiganlabs.com/
|
|
168
|
+
→ [Memory and file size limits](https://qvdjs.ptarmiganlabs.com/v1.0/overview/memory-and-file-size-limits/)
|
|
169
169
|
|
|
170
170
|
## Metadata
|
|
171
171
|
|
|
@@ -182,7 +182,7 @@ df.setFileMetadata({tableName: 'UpdatedProducts'});
|
|
|
182
182
|
await df.toQvd('products-v2.qvd');
|
|
183
183
|
```
|
|
184
184
|
|
|
185
|
-
→ [Metadata reference](https://qvdjs.ptarmiganlabs.com/
|
|
185
|
+
→ [Metadata reference](https://qvdjs.ptarmiganlabs.com/v1.0/reference/)
|
|
186
186
|
|
|
187
187
|
## File paths are sandboxed
|
|
188
188
|
|
|
@@ -197,7 +197,7 @@ await QvdDataFrame.fromQvd(anyPath, {allowedDir: '/'}); // deliberately unrestri
|
|
|
197
197
|
Containment is decided by the filesystem — both paths are resolved through symlinks and compared by
|
|
198
198
|
device and inode — so a link inside the allowed directory pointing out of it is refused.
|
|
199
199
|
|
|
200
|
-
→ [Path security](https://qvdjs.ptarmiganlabs.com/
|
|
200
|
+
→ [Path security](https://qvdjs.ptarmiganlabs.com/v1.0/overview/path-security/)
|
|
201
201
|
|
|
202
202
|
## Errors
|
|
203
203
|
|
|
@@ -210,7 +210,7 @@ underlying Node error.
|
|
|
210
210
|
`error.name` is always the class name, in the CommonJS and ES module builds alike, so it works across
|
|
211
211
|
a module boundary where `instanceof` may not.
|
|
212
212
|
|
|
213
|
-
→ [Troubleshooting](https://qvdjs.ptarmiganlabs.com/
|
|
213
|
+
→ [Troubleshooting](https://qvdjs.ptarmiganlabs.com/v1.0/troubleshooting/)
|
|
214
214
|
|
|
215
215
|
## Known limitations
|
|
216
216
|
|
|
@@ -223,7 +223,7 @@ Honest boundaries rather than an issue list — these are the ones that change w
|
|
|
223
223
|
| **Writes are not atomic** | `toQvd()` writes in place. A failure part-way through leaves the previous file damaged. Write to a temporary path and rename if that matters. |
|
|
224
224
|
| **The writer takes numbers, strings, dual values and `null`** | Anything else - a `Date`, a boolean, an array, a `QvdSymbol` - is refused with a `QvdValidationError` naming the field and the row. Convert first: a `Date` to `new QvdDual(dateToQlikSerial(date), text)`, the serial and the text Qlik shows, which is how Qlik stores a date; a boolean to `-1` and `0`, as a Qlik comparison stores it. |
|
|
225
225
|
|
|
226
|
-
→ [What a round trip preserves](https://qvdjs.ptarmiganlabs.com/
|
|
226
|
+
→ [What a round trip preserves](https://qvdjs.ptarmiganlabs.com/v1.0/overview/what-a-round-trip-preserves/)
|
|
227
227
|
|
|
228
228
|
## Documentation
|
|
229
229
|
|
|
@@ -232,12 +232,12 @@ where everything above is covered properly:
|
|
|
232
232
|
|
|
233
233
|
| | |
|
|
234
234
|
| ------------------------------------------------------------------------- | ----------------------------------------------------------------- |
|
|
235
|
-
| [Getting started](https://qvdjs.ptarmiganlabs.com/
|
|
236
|
-
| [Guides](https://qvdjs.ptarmiganlabs.com/
|
|
237
|
-
| [Concepts](https://qvdjs.ptarmiganlabs.com/
|
|
238
|
-
| [Reference](https://qvdjs.ptarmiganlabs.com/
|
|
239
|
-
| [Performance](https://qvdjs.ptarmiganlabs.com/
|
|
240
|
-
| [Troubleshooting](https://qvdjs.ptarmiganlabs.com/
|
|
235
|
+
| [Getting started](https://qvdjs.ptarmiganlabs.com/v1.0/getting-started/) | Install, choose an entry point, first read and write |
|
|
236
|
+
| [Guides](https://qvdjs.ptarmiganlabs.com/v1.0/guides/) | One page per task, runnable sample code |
|
|
237
|
+
| [Concepts](https://qvdjs.ptarmiganlabs.com/v1.0/concepts/) | The QVD format, symbols and duals, bit stuffing, the memory model |
|
|
238
|
+
| [Reference](https://qvdjs.ptarmiganlabs.com/v1.0/reference/) | Every class, method, option and error |
|
|
239
|
+
| [Performance](https://qvdjs.ptarmiganlabs.com/v1.0/performance/) | Measured baselines, and how to read them |
|
|
240
|
+
| [Troubleshooting](https://qvdjs.ptarmiganlabs.com/v1.0/troubleshooting/) | What each failure means, and what to do about it |
|
|
241
241
|
|
|
242
242
|
Benchmarks run weekly and publish to
|
|
243
243
|
[ptarmiganlabs.github.io/qvdjs](https://ptarmiganlabs.github.io/qvdjs/).
|
package/dist/index.cjs
CHANGED
|
@@ -748,7 +748,7 @@ function resolveDeepestExisting(target) {
|
|
|
748
748
|
function isWithinDirectoryOnDisk(resolvedBaseDir, resolvedPath) {
|
|
749
749
|
let baseStat;
|
|
750
750
|
try {
|
|
751
|
-
baseStat = fs__default.default.statSync(fs__default.default.realpathSync(resolvedBaseDir));
|
|
751
|
+
baseStat = fs__default.default.statSync(fs__default.default.realpathSync(resolvedBaseDir), { bigint: true });
|
|
752
752
|
} catch {
|
|
753
753
|
return null;
|
|
754
754
|
}
|
|
@@ -759,7 +759,7 @@ function isWithinDirectoryOnDisk(resolvedBaseDir, resolvedPath) {
|
|
|
759
759
|
for (; ; ) {
|
|
760
760
|
let stat;
|
|
761
761
|
try {
|
|
762
|
-
stat = fs__default.default.statSync(current);
|
|
762
|
+
stat = fs__default.default.statSync(current, { bigint: true });
|
|
763
763
|
} catch {
|
|
764
764
|
return null;
|
|
765
765
|
}
|