@kaspernj/api-maker 1.0.2171 → 1.0.2173

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.
Files changed (37) hide show
  1. package/build/commands-pool.d.ts +139 -0
  2. package/build/commands-pool.d.ts.map +1 -1
  3. package/build/commands-pool.js +88 -19
  4. package/build/config.d.ts +21 -0
  5. package/build/config.d.ts.map +1 -1
  6. package/build/config.js +24 -1
  7. package/build/session-expired-error.d.ts +14 -0
  8. package/build/session-expired-error.d.ts.map +1 -0
  9. package/build/session-expired-error.js +19 -0
  10. package/build/session-status-updater.d.ts +16 -0
  11. package/build/session-status-updater.d.ts.map +1 -1
  12. package/build/session-status-updater.js +34 -1
  13. package/build/table/export/cell-value.d.ts +3 -0
  14. package/build/table/export/cell-value.d.ts.map +1 -0
  15. package/build/table/export/cell-value.js +47 -0
  16. package/build/table/export/file-sinks/web-file-sink.d.ts +53 -0
  17. package/build/table/export/file-sinks/web-file-sink.d.ts.map +1 -0
  18. package/build/table/export/file-sinks/web-file-sink.js +75 -0
  19. package/build/table/export/format-writers/csv-writer.d.ts +30 -0
  20. package/build/table/export/format-writers/csv-writer.d.ts.map +1 -0
  21. package/build/table/export/format-writers/csv-writer.js +47 -0
  22. package/build/table/export/format-writers/html-writer.d.ts +20 -0
  23. package/build/table/export/format-writers/html-writer.d.ts.map +1 -0
  24. package/build/table/export/format-writers/html-writer.js +30 -0
  25. package/build/table/export/format-writers/xlsx-writer.d.ts +23 -0
  26. package/build/table/export/format-writers/xlsx-writer.d.ts.map +1 -0
  27. package/build/table/export/format-writers/xlsx-writer.js +41 -0
  28. package/build/table/export/open-export-file-sink.d.ts +19 -0
  29. package/build/table/export/open-export-file-sink.d.ts.map +1 -0
  30. package/build/table/export/open-export-file-sink.js +26 -0
  31. package/build/table/export/table-exporter.d.ts +80 -0
  32. package/build/table/export/table-exporter.d.ts.map +1 -0
  33. package/build/table/export/table-exporter.js +141 -0
  34. package/build/table/settings/download-action.d.ts +8 -1
  35. package/build/table/settings/download-action.d.ts.map +1 -1
  36. package/build/table/settings/download-action.js +51 -24
  37. package/package.json +4 -3
@@ -0,0 +1,19 @@
1
+ // @ts-check
2
+ /**
3
+ * Raised by the commands pool when a request could not run because the session
4
+ * had expired (the frontend's believed user diverged from the backend's actual
5
+ * user) and could not be renewed. Callers can treat this as a benign "please
6
+ * sign in again" signal — the sign-in form is shown centrally via the Devise
7
+ * sign-out event — rather than a real command failure.
8
+ */
9
+ export default class ApiMakerSessionExpiredError extends Error {
10
+ static apiMakerType = "SessionExpiredError";
11
+ apiMakerType = "SessionExpiredError";
12
+ /** @param {string} [message] */
13
+ constructor(message = "The session has expired") {
14
+ super(message);
15
+ if (Error.captureStackTrace)
16
+ Error.captureStackTrace(this, ApiMakerSessionExpiredError);
17
+ }
18
+ }
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi1leHBpcmVkLWVycm9yLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJzZXNzaW9uLWV4cGlyZWQtZXJyb3IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sMkJBQTRCLFNBQVEsS0FBSztJQUM1RCxNQUFNLENBQUMsWUFBWSxHQUFHLHFCQUFxQixDQUFBO0lBQzNDLFlBQVksR0FBRyxxQkFBcUIsQ0FBQTtJQUVwQyxnQ0FBZ0M7SUFDaEMsWUFBWSxPQUFPLEdBQUcseUJBQXlCO1FBQzdDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUVkLElBQUksS0FBSyxDQUFDLGlCQUFpQjtZQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsMkJBQTJCLENBQUMsQ0FBQTtJQUN6RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogUmFpc2VkIGJ5IHRoZSBjb21tYW5kcyBwb29sIHdoZW4gYSByZXF1ZXN0IGNvdWxkIG5vdCBydW4gYmVjYXVzZSB0aGUgc2Vzc2lvblxuICogaGFkIGV4cGlyZWQgKHRoZSBmcm9udGVuZCdzIGJlbGlldmVkIHVzZXIgZGl2ZXJnZWQgZnJvbSB0aGUgYmFja2VuZCdzIGFjdHVhbFxuICogdXNlcikgYW5kIGNvdWxkIG5vdCBiZSByZW5ld2VkLiBDYWxsZXJzIGNhbiB0cmVhdCB0aGlzIGFzIGEgYmVuaWduIFwicGxlYXNlXG4gKiBzaWduIGluIGFnYWluXCIgc2lnbmFsIOKAlCB0aGUgc2lnbi1pbiBmb3JtIGlzIHNob3duIGNlbnRyYWxseSB2aWEgdGhlIERldmlzZVxuICogc2lnbi1vdXQgZXZlbnQg4oCUIHJhdGhlciB0aGFuIGEgcmVhbCBjb21tYW5kIGZhaWx1cmUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwaU1ha2VyU2Vzc2lvbkV4cGlyZWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgc3RhdGljIGFwaU1ha2VyVHlwZSA9IFwiU2Vzc2lvbkV4cGlyZWRFcnJvclwiXG4gIGFwaU1ha2VyVHlwZSA9IFwiU2Vzc2lvbkV4cGlyZWRFcnJvclwiXG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gKi9cbiAgY29uc3RydWN0b3IobWVzc2FnZSA9IFwiVGhlIHNlc3Npb24gaGFzIGV4cGlyZWRcIikge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG5cbiAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEFwaU1ha2VyU2Vzc2lvbkV4cGlyZWRFcnJvcilcbiAgfVxufVxuIl19
@@ -6,6 +6,7 @@
6
6
  * @typedef {object} SessionStatusResult
7
7
  * @property {string} [csrf_token]
8
8
  * @property {Record<string, SessionStatusScope>} scopes
9
+ * @property {string} [shadow_session_token]
9
10
  */
10
11
  /**
11
12
  * @typedef {object} SessionStatusUpdaterArgs
@@ -32,6 +33,20 @@ export default class ApiMakerSessionStatusUpdater {
32
33
  connectOnlineEvent(): void;
33
34
  /** Re-checks session state when the device wakes from sleep. */
34
35
  connectWakeEvent(): void;
36
+ /**
37
+ * Re-checks session state when the user returns to a backgrounded tab/app.
38
+ * The `wake-event` package only fires on multi-second device-sleep drift, so
39
+ * it misses iOS Safari tab suspension; visibilitychange/focus/pageshow cover
40
+ * that, surfacing an expired session the moment the user returns.
41
+ */
42
+ connectVisibilityEvents(): void;
43
+ /**
44
+ * Schedules a debounced session-status refresh when the page becomes visible
45
+ * again. visibilitychange, focus and pageshow can fire together on return, so
46
+ * the refresh is collapsed into a single request.
47
+ */
48
+ refreshOnReturnToForeground: () => void;
49
+ returnRefreshTimeout: any;
35
50
  getCsrfToken(): Promise<string>;
36
51
  csrfToken: string;
37
52
  /**
@@ -79,6 +94,7 @@ export type SessionStatusScope = {
79
94
  export type SessionStatusResult = {
80
95
  csrf_token?: string;
81
96
  scopes: Record<string, SessionStatusScope>;
97
+ shadow_session_token?: string;
82
98
  };
83
99
  export type SessionStatusUpdaterArgs = {
84
100
  timeout?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"session-status-updater.d.ts","sourceRoot":"/src/","sources":["session-status-updater.js"],"names":[],"mappings":"AAYA;;;GAGG;AAEH;;;;GAIG;AAEH;;;;GAIG;AAEH,+CAA+C;AAC/C;IACE;;;;OAIG;IACH,sBAHW,wBAAwB,GACtB,4BAA4B,CAQxC;IAED;;;OAGG;IACH,mBAFW,wBAAwB,EAmBlC;IAhBC,WAAgB;IAChB,gBAAqC;IAGnC,wBAAyC;IAc7C,kEAAkE;IAClE,2BAEC;IAED,gEAAgE;IAChE,yBAEC;IAED,gCA+BC;IAlBK,kBAAyD;IAoB/D;;;OAGG;IACH,iBAFa,OAAO,CAAC,mBAAmB,CAAC,CAmBxC;IAED;;;OAGG;IACH,sCAGC;IAED,6DAA6D;IAC7D,qBAaC;IAPC,8BAMC;IAGH,gEAAgE;IAChE,oBAGC;IAED,gEAAgE;IAChE,yCAMC;IAED;;;OAGG;IACH,oBAHW,mBAAmB,GACjB,IAAI,CAOhB;IAED;;;OAGG;IACH,qCAFW,mBAAmB,QAqB7B;IAED;;;OAGG;IACH,qCAFW,mBAAmB,QAM7B;IAED;;;;OAIG;IACH,4CAHW,MAAM,SACN,kBAAkB,QAkB5B;CACF;;eAnOa,OAAO;;;iBAKP,MAAM;YACN,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC;;;cAKlC,MAAM;qBACN,OAAO"}
1
+ {"version":3,"file":"session-status-updater.d.ts","sourceRoot":"/src/","sources":["session-status-updater.js"],"names":[],"mappings":"AAYA;;;GAGG;AAEH;;;;;GAKG;AAEH;;;;GAIG;AAEH,+CAA+C;AAC/C;IACE;;;;OAIG;IACH,sBAHW,wBAAwB,GACtB,4BAA4B,CAQxC;IAED;;;OAGG;IACH,mBAFW,wBAAwB,EAuBlC;IApBC,WAAgB;IAChB,gBAAqC;IAGnC,wBAAyC;IAkB7C,kEAAkE;IAClE,2BAEC;IAED,gEAAgE;IAChE,yBAEC;IAED;;;;;OAKG;IACH,gCAOC;IAED;;;;OAIG;IACH,wCAWC;IAJC,0BAGM;IAGR,gCA+BC;IAlBK,kBAAyD;IAoB/D;;;OAGG;IACH,iBAFa,OAAO,CAAC,mBAAmB,CAAC,CAmBxC;IAED;;;OAGG;IACH,sCAGC;IAED,6DAA6D;IAC7D,qBAaC;IAPC,8BAMC;IAGH,gEAAgE;IAChE,oBAGC;IAED,gEAAgE;IAChE,yCAMC;IAED;;;OAGG;IACH,oBAHW,mBAAmB,GACjB,IAAI,CAOhB;IAED;;;OAGG;IACH,qCAFW,mBAAmB,QAqB7B;IAED;;;OAGG;IACH,qCAFW,mBAAmB,QAM7B;IAED;;;;OAIG;IACH,4CAHW,MAAM,SACN,kBAAkB,QAkB5B;CACF;;eAzQa,OAAO;;;iBAKP,MAAM;YACN,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC;2BAClC,MAAM;;;cAKN,MAAM;qBACN,OAAO"}
@@ -15,6 +15,7 @@ const shared = {};
15
15
  * @typedef {object} SessionStatusResult
16
16
  * @property {string} [csrf_token]
17
17
  * @property {Record<string, SessionStatusScope>} scopes
18
+ * @property {string} [shadow_session_token]
18
19
  */
19
20
  /**
20
21
  * @typedef {object} SessionStatusUpdaterArgs
@@ -53,6 +54,9 @@ export default class ApiMakerSessionStatusUpdater {
53
54
  if (typeof window != "undefined") {
54
55
  this.connectOnlineEvent();
55
56
  }
57
+ if (typeof document != "undefined") {
58
+ this.connectVisibilityEvents();
59
+ }
56
60
  this.connectWakeEvent();
57
61
  }
58
62
  /** Re-checks session state when the browser comes back online. */
@@ -63,6 +67,35 @@ export default class ApiMakerSessionStatusUpdater {
63
67
  connectWakeEvent() {
64
68
  wakeEvent(this.updateSessionStatus);
65
69
  }
70
+ /**
71
+ * Re-checks session state when the user returns to a backgrounded tab/app.
72
+ * The `wake-event` package only fires on multi-second device-sleep drift, so
73
+ * it misses iOS Safari tab suspension; visibilitychange/focus/pageshow cover
74
+ * that, surfacing an expired session the moment the user returns.
75
+ */
76
+ connectVisibilityEvents() {
77
+ document.addEventListener("visibilitychange", this.refreshOnReturnToForeground, false);
78
+ if (typeof window != "undefined") {
79
+ window.addEventListener("focus", this.refreshOnReturnToForeground, false);
80
+ window.addEventListener("pageshow", this.refreshOnReturnToForeground, false);
81
+ }
82
+ }
83
+ /**
84
+ * Schedules a debounced session-status refresh when the page becomes visible
85
+ * again. visibilitychange, focus and pageshow can fire together on return, so
86
+ * the refresh is collapsed into a single request.
87
+ */
88
+ refreshOnReturnToForeground = () => {
89
+ if (typeof document != "undefined" && document.visibilityState && document.visibilityState != "visible") {
90
+ return;
91
+ }
92
+ if (this.returnRefreshTimeout)
93
+ return;
94
+ this.returnRefreshTimeout = setTimeout(() => {
95
+ this.returnRefreshTimeout = undefined;
96
+ this.updateSessionStatus();
97
+ }, 50);
98
+ };
66
99
  async getCsrfToken() {
67
100
  if (this.csrfToken) {
68
101
  logger.debug(`Get CSRF token from set variable: ${this.csrfToken}`);
@@ -192,4 +225,4 @@ export default class ApiMakerSessionStatusUpdater {
192
225
  }
193
226
  }
194
227
  }
195
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi1zdGF0dXMtdXBkYXRlci5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsic2Vzc2lvbi1zdGF0dXMtdXBkYXRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBQ1osT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBQ2hDLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQTtBQUNoQyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFBO0FBRWxDLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLGlDQUFpQyxFQUFDLENBQUMsQ0FBQTtBQUNwRSxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUE7QUFFakIsd0JBQXdCO0FBRXhCOzs7R0FHRztBQUVIOzs7O0dBSUc7QUFFSDs7OztHQUlHO0FBRUgsK0NBQStDO0FBQy9DLE1BQU0sQ0FBQyxPQUFPLE9BQU8sNEJBQTRCO0lBQy9DOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUk7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzlFLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQTtJQUM1QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFBWSxJQUFJLEdBQUcsRUFBRTtRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQTtRQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFBO1FBRXJDLElBQUksZ0JBQWdCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJ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Q0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQTtRQUVoRixJQUFJLENBQUMsQ0FBQywwQkFBMEIsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLDBCQUEwQixFQUFFLENBQUMsQ0FBQTtRQUM1RSxDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFBO1FBQzlELE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQTtRQUV6QyxJQUFJLGlCQUFpQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1QyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsNENBQTRDLENBQUMsQ0FBQTtZQUVqRyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUE7WUFDdkMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBQyxDQUFDLENBQUE7UUFDN0MsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiXG5pbXBvcnQgRGV2aXNlIGZyb20gXCIuL2RldmlzZS5qc1wiXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuL2xvZ2dlci5qc1wiXG5pbXBvcnQgY29uZmlnIGZyb20gXCIuL2NvbmZpZy5qc1wiXG5pbXBvcnQgd2FrZUV2ZW50IGZyb20gXCJ3YWtlLWV2ZW50XCJcblxuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih7bmFtZTogXCJBcGlNYWtlciAvIFNlc3Npb25TdGF0dXNVcGRhdGVyXCJ9KVxuY29uc3Qgc2hhcmVkID0ge31cblxuLy8gbG9nZ2VyLnNldERlYnVnKHRydWUpXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2Vzc2lvblN0YXR1c1Njb3BlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHNpZ25lZF9pblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2Vzc2lvblN0YXR1c1Jlc3VsdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjc3JmX3Rva2VuXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBTZXNzaW9uU3RhdHVzU2NvcGU+fSBzY29wZXNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlc3Npb25TdGF0dXNVcGRhdGVyQXJnc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlTWV0YUVsZW1lbnRdXG4gKi9cblxuLyoqIFRyYWNrcyBzZXNzaW9uIGFuZCBDU1JGIHRva2VuIGZyZXNobmVzcy4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwaU1ha2VyU2Vzc2lvblN0YXR1c1VwZGF0ZXIge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2hhcmVkIHNlc3Npb24tc3RhdHVzIHVwZGF0ZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7U2Vzc2lvblN0YXR1c1VwZGF0ZXJBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge0FwaU1ha2VyU2Vzc2lvblN0YXR1c1VwZGF0ZXJ9XG4gICAqL1xuICBzdGF0aWMgY3VycmVudChhcmdzKSB7XG4gICAgaWYgKCFzaGFyZWQuYXBpTWFrZXJTZXNzaW9uU3RhdHVzVXBkYXRlcikge1xuICAgICAgc2hhcmVkLmFwaU1ha2VyU2Vzc2lvblN0YXR1c1VwZGF0ZXIgPSBuZXcgQXBpTWFrZXJTZXNzaW9uU3RhdHVzVXBkYXRlcihhcmdzKVxuICAgIH1cblxuICAgIHJldHVybiBzaGFyZWQuYXBpTWFrZXJTZXNzaW9uU3RhdHVzVXBkYXRlclxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgc2Vzc2lvbi1zdGF0dXMgcG9sbGluZyBhbmQgYnJvd3NlciB3YWtlL29ubGluZSBsaXN0ZW5lcnMuXG4gICAqIEBwYXJhbSB7U2Vzc2lvblN0YXR1c1VwZGF0ZXJBcmdzfSBbYXJnc11cbiAgICovXG4gIGNvbnN0cnVjdG9yKGFyZ3MgPSB7fSkge1xuICAgIHRoaXMuZXZlbnRzID0ge31cbiAgICB0aGlzLnRpbWVvdXQgPSBhcmdzLnRpbWVvdXQgfHwgNjAwMDAwXG5cbiAgICBpZiAoXCJ1c2VNZXRhRWxlbWVudFwiIGluIGFyZ3MpIHtcbiAgICAgIHRoaXMudXNlTWV0YUVsZW1lbnQgPSBhcmdzLnVzZU1ldGFFbGVtZW50XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMudXNlTWV0YUVsZW1lbnQgPSBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVzZU1ldGFFbGVtZW50ID0gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMuY29ubmVjdE9ubGluZUV2ZW50KClcbiAgICB9XG5cbiAgICB0aGlzLmNvbm5lY3RXYWtlRXZlbnQoKVxuICB9XG5cbiAgLyoqIFJlLWNoZWNrcyBzZXNzaW9uIHN0YXRlIHdoZW4gdGhlIGJyb3dzZXIgY29tZXMgYmFjayBvbmxpbmUuICovXG4gIGNvbm5lY3RPbmxpbmVFdmVudCgpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm9ubGluZVwiLCB0aGlzLnVwZGF0ZVNlc3Npb25TdGF0dXMsIGZhbHNlKVxuICB9XG5cbiAgLyoqIFJlLWNoZWNrcyBzZXNzaW9uIHN0YXRlIHdoZW4gdGhlIGRldmljZSB3YWtlcyBmcm9tIHNsZWVwLiAqL1xuICBjb25uZWN0V2FrZUV2ZW50KCkge1xuICAgIHdha2VFdmVudCh0aGlzLnVwZGF0ZVNlc3Npb25TdGF0dXMpXG4gIH1cblxuICBhc3luYyBnZXRDc3JmVG9rZW4oKSB7XG4gICAgaWYgKHRoaXMuY3NyZlRva2VuKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYEdldCBDU1JGIHRva2VuIGZyb20gc2V0IHZhcmlhYmxlOiAke3RoaXMuY3NyZlRva2VufWApXG5cbiAgICAgIHJldHVybiB0aGlzLmNzcmZUb2tlblxuICAgIH1cblxuICAgIGlmICh0aGlzLnVzZU1ldGFFbGVtZW50KSB7XG4gICAgICBjb25zdCBjc3JmVG9rZW5FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIm1ldGFbbmFtZT0nY3NyZi10b2tlbiddXCIpXG5cbiAgICAgIGlmIChjc3JmVG9rZW5FbGVtZW50KSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygoKSA9PiBgR2V0IENTUkYgdG9rZW4gZnJvbSBtZXRhIGVsZW1lbnQ6ICR7Y3NyZlRva2VuRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpfWApXG5cbiAgICAgICAgdGhpcy5jc3JmVG9rZW4gPSBjc3JmVG9rZW5FbGVtZW50LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIilcblxuICAgICAgICByZXR1cm4gdGhpcy5jc3JmVG9rZW5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoXCJVcGRhdGluZyBzZXNzaW9uIHN0YXR1cyBiZWNhdXNlIG5vIENTUkYgdG9rZW4gc2V0IHlldFwiKVxuICAgIGF3YWl0IHRoaXMudXBkYXRlU2Vzc2lvblN0YXR1cygpXG5cbiAgICBpZiAodGhpcy5jc3JmVG9rZW4pIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygoKSA9PiBgUmV0dXJuaW5nIENTUkYgdG9rZW4gYWZ0ZXIgdXBkYXRpbmcgc2Vzc2lvbiBzdGF0dXM6ICR7dGhpcy5jc3JmVG9rZW59YClcblxuICAgICAgcmV0dXJuIHRoaXMuY3NyZlRva2VuXG4gICAgfVxuXG4gICAgbG9nZ2VyLmRlYnVnKFwiTm8gQ1NSRiB0b2tlbiBhdmFpbGFibGUgYWZ0ZXIgdXBkYXRpbmcgc2Vzc2lvbiBzdGF0dXNcIilcblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyB0aGUgbGF0ZXN0IGJhY2tlbmQgc2Vzc2lvbi1zdGF0dXMgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2Vzc2lvblN0YXR1c1Jlc3VsdD59XG4gICAqL1xuICBzZXNzaW9uU3RhdHVzKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgaG9zdCA9IGNvbmZpZy5nZXRIb3N0KClcbiAgICAgIGxldCByZXF1ZXN0UGF0aCA9IFwiXCJcblxuICAgICAgaWYgKGhvc3QpIHJlcXVlc3RQYXRoICs9IGhvc3RcblxuICAgICAgcmVxdWVzdFBhdGggKz0gXCIvYXBpX21ha2VyL3Nlc3Npb25fc3RhdHVzZXNcIlxuXG4gICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgICAgeGhyLm9wZW4oXCJQT1NUXCIsIHJlcXVlc3RQYXRoLCB0cnVlKVxuICAgICAgeGhyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpXG4gICAgICAgIHJlc29sdmUocmVzcG9uc2UpXG4gICAgICB9XG4gICAgICB4aHIuc2VuZCgpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmb3IgZnJvbnRlbmQgc2lnbi1vdXQgZGV0ZWN0aW9uLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25TaWduZWRPdXQoY2FsbGJhY2spIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgdGhpcy5hZGRFdmVudChcIm9uU2lnbmVkT3V0XCIsIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqIFN0YXJ0cyBvciByZWZyZXNoZXMgdGhlIHBlcmlvZGljIHNlc3Npb24tc3RhdHVzIHRpbWVyLiAqL1xuICBzdGFydFRpbWVvdXQoKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwic3RhcnRUaW1lb3V0XCIpXG5cbiAgICBpZiAodGhpcy51cGRhdGVUaW1lb3V0KVxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudXBkYXRlVGltZW91dClcblxuICAgIHRoaXMudXBkYXRlVGltZW91dCA9IHNldFRpbWVvdXQoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuc3RhcnRUaW1lb3V0KClcbiAgICAgICAgdGhpcy51cGRhdGVTZXNzaW9uU3RhdHVzKClcbiAgICAgIH0sXG4gICAgICB0aGlzLnRpbWVvdXRcbiAgICApXG4gIH1cblxuICAvKiogU3RvcHMgdGhlIHBlcmlvZGljIHNlc3Npb24tc3RhdHVzIHRpbWVyIGlmIGl0IGlzIHJ1bm5pbmcuICovXG4gIHN0b3BUaW1lb3V0KCkge1xuICAgIGlmICh0aGlzLnVwZGF0ZVRpbWVvdXQpXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy51cGRhdGVUaW1lb3V0KVxuICB9XG5cbiAgLyoqIEZldGNoZXMgdGhlIGxhdGVzdCBzZXNzaW9uIHN0YXR1cyBhbmQgYXBwbGllcyBpdCBsb2NhbGx5LiAqL1xuICB1cGRhdGVTZXNzaW9uU3RhdHVzID0gYXN5bmMgKCkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInVwZGF0ZVNlc3Npb25TdGF0dXNcIilcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2Vzc2lvblN0YXR1cygpXG5cbiAgICB0aGlzLmFwcGx5UmVzdWx0KHJlc3VsdClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1Nlc3Npb25TdGF0dXNSZXN1bHR9IHJlc3VsdFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFwcGx5UmVzdWx0KHJlc3VsdCkge1xuICAgIGxvZ2dlci5kZWJ1ZygoKSA9PiBgUmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMil9YClcblxuICAgIHRoaXMudXBkYXRlTWV0YUVsZW1lbnRzRnJvbVJlc3VsdChyZXN1bHQpXG4gICAgdGhpcy51cGRhdGVVc2VyU2Vzc2lvbnNGcm9tUmVzdWx0KHJlc3VsdClcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjYWNoZWQgYW5kIERPTSBDU1JGIHRva2VuIGZyb20gb25lIHNlc3Npb24tc3RhdHVzIHJlc3BvbnNlLlxuICAgKiBAcGFyYW0ge1Nlc3Npb25TdGF0dXNSZXN1bHR9IHJlc3VsdFxuICAgKi9cbiAgdXBkYXRlTWV0YUVsZW1lbnRzRnJvbVJlc3VsdChyZXN1bHQpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJ1cGRhdGVNZXRhRWxlbWVudHNGcm9tUmVzdWx0XCIpXG5cbiAgICBpZiAoIXJlc3VsdC5jc3JmX3Rva2VuKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmNzcmZUb2tlbiA9IHJlc3VsdC5jc3JmX3Rva2VuXG5cbiAgICBpZiAodGhpcy51c2VNZXRhRWxlbWVudCkge1xuICAgICAgY29uc3QgY3NyZlRva2VuRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J2NzcmYtdG9rZW4nXVwiKVxuXG4gICAgICBpZiAoY3NyZlRva2VuRWxlbWVudCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoKCkgPT4gYENoYW5naW5nIHRva2VuIGZyb20gXCIke2NzcmZUb2tlbkVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKX1cIiB0byBcIiR7cmVzdWx0LmNzcmZfdG9rZW59XCJgKVxuICAgICAgICBjc3JmVG9rZW5FbGVtZW50LnNldEF0dHJpYnV0ZShcImNvbnRlbnRcIiwgcmVzdWx0LmNzcmZfdG9rZW4pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJjc3JmIHRva2VuIGVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmRcIilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBlYWNoIHJldHVybmVkIHNjb3BlIHN0YXR1cyB0byB0aGUgZnJvbnRlbmQgRGV2aXNlIGNhY2hlLlxuICAgKiBAcGFyYW0ge1Nlc3Npb25TdGF0dXNSZXN1bHR9IHJlc3VsdFxuICAgKi9cbiAgdXBkYXRlVXNlclNlc3Npb25zRnJvbVJlc3VsdChyZXN1bHQpIHtcbiAgICBmb3IgKGNvbnN0IHNjb3BlTmFtZSBpbiByZXN1bHQuc2NvcGVzKSB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJTZXNzaW9uU2NvcGVGcm9tUmVzdWx0KHNjb3BlTmFtZSwgcmVzdWx0LnNjb3Blc1tzY29wZU5hbWVdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIG9uZSBzY29wZSdzIHNpZ25lZC1pbiBzdGF0ZSB0byB0aGUgZnJvbnRlbmQgRGV2aXNlIGNhY2hlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NvcGVOYW1lXG4gICAqIEBwYXJhbSB7U2Vzc2lvblN0YXR1c1Njb3BlfSBzY29wZVxuICAgKi9cbiAgdXBkYXRlVXNlclNlc3Npb25TY29wZUZyb21SZXN1bHQoc2NvcGVOYW1lLCBzY29wZSkge1xuICAgIGNvbnN0IGRldmlzZUlzU2lnbmVkSW5NZXRob2ROYW1lID0gYGlzJHtpbmZsZWN0aW9uLmNhbWVsaXplKHNjb3BlTmFtZSl9U2lnbmVkSW5gXG5cbiAgICBpZiAoIShkZXZpc2VJc1NpZ25lZEluTWV0aG9kTmFtZSBpbiBEZXZpc2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggbWV0aG9kIGluIERldmlzZTogJHtkZXZpc2VJc1NpZ25lZEluTWV0aG9kTmFtZX1gKVxuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRseVNpZ25lZEluID0gRGV2aXNlW2RldmlzZUlzU2lnbmVkSW5NZXRob2ROYW1lXSgpXG4gICAgY29uc3Qgc2lnbmVkSW5PbkJhY2tlbmQgPSBzY29wZS5zaWduZWRfaW5cblxuICAgIGlmIChjdXJyZW50bHlTaWduZWRJbiAmJiAhc2lnbmVkSW5PbkJhY2tlbmQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygoKSA9PiBgJHtpbmZsZWN0aW9uLmNhbWVsaXplKHNjb3BlTmFtZSl9IHNpZ25lZCBpbiBvbiBmcm9udGVuZCBidXQgbm90IGluIGJhY2tlbmQhYClcblxuICAgICAgRGV2aXNlLnNldFNpZ25lZE91dCh7c2NvcGU6IHNjb3BlTmFtZX0pXG4gICAgICBEZXZpc2UuY2FsbFNpZ25PdXRFdmVudCh7c2NvcGU6IHNjb3BlTmFtZX0pXG4gICAgfVxuICB9XG59XG4iXX0=
228
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi1zdGF0dXMtdXBkYXRlci5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsic2Vzc2lvbi1zdGF0dXMtdXBkYXRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBQ1osT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBQ2hDLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQTtBQUNoQyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDaEMsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFBO0FBRWxDLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLGlDQUFpQyxFQUFDLENBQUMsQ0FBQTtBQUNwRSxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUE7QUFFakIsd0JBQXdCO0FBRXhCOzs7R0FHRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7R0FJRztBQUVILCtDQUErQztBQUMvQyxNQUFNLENBQUMsT0FBTyxPQUFPLDRCQUE0QjtJQUMvQzs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztZQUN6QyxNQUFNLENBQUMsNEJBQTRCLEdBQUcsSUFBSSw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM5RSxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUMsNEJBQTRCLENBQUE7SUFDNUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVksSUFBSSxHQUFHLEVBQUU7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUE7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQTtRQUVyQyxJQUFJLGdCQUFnQixJQUFJLElBQUksRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFB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NUUsQ0FBQztRQUVELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsQ0FBQTtRQUM5RCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUE7UUFFekMsSUFBSSxpQkFBaUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDNUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLDRDQUE0QyxDQUFDLENBQUE7WUFFakcsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFDLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFBO1lBQ3ZDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFDLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFBO1FBQzdDLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IERldmlzZSBmcm9tIFwiLi9kZXZpc2UuanNcIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi9sb2dnZXIuanNcIlxuaW1wb3J0IGNvbmZpZyBmcm9tIFwiLi9jb25maWcuanNcIlxuaW1wb3J0IHdha2VFdmVudCBmcm9tIFwid2FrZS1ldmVudFwiXG5cbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoe25hbWU6IFwiQXBpTWFrZXIgLyBTZXNzaW9uU3RhdHVzVXBkYXRlclwifSlcbmNvbnN0IHNoYXJlZCA9IHt9XG5cbi8vIGxvZ2dlci5zZXREZWJ1Zyh0cnVlKVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlc3Npb25TdGF0dXNTY29wZVxuICogQHByb3BlcnR5IHtib29sZWFufSBzaWduZWRfaW5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlc3Npb25TdGF0dXNSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY3NyZl90b2tlbl1cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgU2Vzc2lvblN0YXR1c1Njb3BlPn0gc2NvcGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NoYWRvd19zZXNzaW9uX3Rva2VuXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2Vzc2lvblN0YXR1c1VwZGF0ZXJBcmdzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VNZXRhRWxlbWVudF1cbiAqL1xuXG4vKiogVHJhY2tzIHNlc3Npb24gYW5kIENTUkYgdG9rZW4gZnJlc2huZXNzLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBpTWFrZXJTZXNzaW9uU3RhdHVzVXBkYXRlciB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgc2Vzc2lvbi1zdGF0dXMgdXBkYXRlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtTZXNzaW9uU3RhdHVzVXBkYXRlckFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7QXBpTWFrZXJTZXNzaW9uU3RhdHVzVXBkYXRlcn1cbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KGFyZ3MpIHtcbiAgICBpZiAoIXNoYXJlZC5hcGlNYWtlclNlc3Npb25TdGF0dXNVcGRhdGVyKSB7XG4gICAgICBzaGFyZWQuYXBpTWFrZXJTZXNzaW9uU3RhdHVzVXBkYXRlciA9IG5ldyBBcGlNYWtlclNlc3Npb25TdGF0dXNVcGRhdGVyKGFyZ3MpXG4gICAgfVxuXG4gICAgcmV0dXJuIHNoYXJlZC5hcGlNYWtlclNlc3Npb25TdGF0dXNVcGRhdGVyXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCBzZXNzaW9uLXN0YXR1cyBwb2xsaW5nIGFuZCBicm93c2VyIHdha2Uvb25saW5lIGxpc3RlbmVycy5cbiAgICogQHBhcmFtIHtTZXNzaW9uU3RhdHVzVXBkYXRlckFyZ3N9IFthcmdzXVxuICAgKi9cbiAgY29uc3RydWN0b3IoYXJncyA9IHt9KSB7XG4gICAgdGhpcy5ldmVudHMgPSB7fVxuICAgIHRoaXMudGltZW91dCA9IGFyZ3MudGltZW91dCB8fCA2MDAwMDBcblxuICAgIGlmIChcInVzZU1ldGFFbGVtZW50XCIgaW4gYXJncykge1xuICAgICAgdGhpcy51c2VNZXRhRWxlbWVudCA9IGFyZ3MudXNlTWV0YUVsZW1lbnRcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy51c2VNZXRhRWxlbWVudCA9IGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXNlTWV0YUVsZW1lbnQgPSB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5jb25uZWN0T25saW5lRXZlbnQoKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5jb25uZWN0VmlzaWJpbGl0eUV2ZW50cygpXG4gICAgfVxuXG4gICAgdGhpcy5jb25uZWN0V2FrZUV2ZW50KClcbiAgfVxuXG4gIC8qKiBSZS1jaGVja3Mgc2Vzc2lvbiBzdGF0ZSB3aGVuIHRoZSBicm93c2VyIGNvbWVzIGJhY2sgb25saW5lLiAqL1xuICBjb25uZWN0T25saW5lRXZlbnQoKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvbmxpbmVcIiwgdGhpcy51cGRhdGVTZXNzaW9uU3RhdHVzLCBmYWxzZSlcbiAgfVxuXG4gIC8qKiBSZS1jaGVja3Mgc2Vzc2lvbiBzdGF0ZSB3aGVuIHRoZSBkZXZpY2Ugd2FrZXMgZnJvbSBzbGVlcC4gKi9cbiAgY29ubmVjdFdha2VFdmVudCgpIHtcbiAgICB3YWtlRXZlbnQodGhpcy51cGRhdGVTZXNzaW9uU3RhdHVzKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlLWNoZWNrcyBzZXNzaW9uIHN0YXRlIHdoZW4gdGhlIHVzZXIgcmV0dXJucyB0byBhIGJhY2tncm91bmRlZCB0YWIvYXBwLlxuICAgKiBUaGUgYHdha2UtZXZlbnRgIHBhY2thZ2Ugb25seSBmaXJlcyBvbiBtdWx0aS1zZWNvbmQgZGV2aWNlLXNsZWVwIGRyaWZ0LCBzb1xuICAgKiBpdCBtaXNzZXMgaU9TIFNhZmFyaSB0YWIgc3VzcGVuc2lvbjsgdmlzaWJpbGl0eWNoYW5nZS9mb2N1cy9wYWdlc2hvdyBjb3ZlclxuICAgKiB0aGF0LCBzdXJmYWNpbmcgYW4gZXhwaXJlZCBzZXNzaW9uIHRoZSBtb21lbnQgdGhlIHVzZXIgcmV0dXJucy5cbiAgICovXG4gIGNvbm5lY3RWaXNpYmlsaXR5RXZlbnRzKCkge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ2aXNpYmlsaXR5Y2hhbmdlXCIsIHRoaXMucmVmcmVzaE9uUmV0dXJuVG9Gb3JlZ3JvdW5kLCBmYWxzZSlcblxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgdGhpcy5yZWZyZXNoT25SZXR1cm5Ub0ZvcmVncm91bmQsIGZhbHNlKVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlc2hvd1wiLCB0aGlzLnJlZnJlc2hPblJldHVyblRvRm9yZWdyb3VuZCwgZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlcyBhIGRlYm91bmNlZCBzZXNzaW9uLXN0YXR1cyByZWZyZXNoIHdoZW4gdGhlIHBhZ2UgYmVjb21lcyB2aXNpYmxlXG4gICAqIGFnYWluLiB2aXNpYmlsaXR5Y2hhbmdlLCBmb2N1cyBhbmQgcGFnZXNob3cgY2FuIGZpcmUgdG9nZXRoZXIgb24gcmV0dXJuLCBzb1xuICAgKiB0aGUgcmVmcmVzaCBpcyBjb2xsYXBzZWQgaW50byBhIHNpbmdsZSByZXF1ZXN0LlxuICAgKi9cbiAgcmVmcmVzaE9uUmV0dXJuVG9Gb3JlZ3JvdW5kID0gKCkgPT4ge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgJiYgZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlICE9IFwidmlzaWJsZVwiKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXR1cm5SZWZyZXNoVGltZW91dCkgcmV0dXJuXG5cbiAgICB0aGlzLnJldHVyblJlZnJlc2hUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJldHVyblJlZnJlc2hUaW1lb3V0ID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLnVwZGF0ZVNlc3Npb25TdGF0dXMoKVxuICAgIH0sIDUwKVxuICB9XG5cbiAgYXN5bmMgZ2V0Q3NyZlRva2VuKCkge1xuICAgIGlmICh0aGlzLmNzcmZUb2tlbikge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBHZXQgQ1NSRiB0b2tlbiBmcm9tIHNldCB2YXJpYWJsZTogJHt0aGlzLmNzcmZUb2tlbn1gKVxuXG4gICAgICByZXR1cm4gdGhpcy5jc3JmVG9rZW5cbiAgICB9XG5cbiAgICBpZiAodGhpcy51c2VNZXRhRWxlbWVudCkge1xuICAgICAgY29uc3QgY3NyZlRva2VuRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J2NzcmYtdG9rZW4nXVwiKVxuXG4gICAgICBpZiAoY3NyZlRva2VuRWxlbWVudCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoKCkgPT4gYEdldCBDU1JGIHRva2VuIGZyb20gbWV0YSBlbGVtZW50OiAke2NzcmZUb2tlbkVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKX1gKVxuXG4gICAgICAgIHRoaXMuY3NyZlRva2VuID0gY3NyZlRva2VuRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3NyZlRva2VuXG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nZ2VyLmRlYnVnKFwiVXBkYXRpbmcgc2Vzc2lvbiBzdGF0dXMgYmVjYXVzZSBubyBDU1JGIHRva2VuIHNldCB5ZXRcIilcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZVNlc3Npb25TdGF0dXMoKVxuXG4gICAgaWYgKHRoaXMuY3NyZlRva2VuKSB7XG4gICAgICBsb2dnZXIuZGVidWcoKCkgPT4gYFJldHVybmluZyBDU1JGIHRva2VuIGFmdGVyIHVwZGF0aW5nIHNlc3Npb24gc3RhdHVzOiAke3RoaXMuY3NyZlRva2VufWApXG5cbiAgICAgIHJldHVybiB0aGlzLmNzcmZUb2tlblxuICAgIH1cblxuICAgIGxvZ2dlci5kZWJ1ZyhcIk5vIENTUkYgdG9rZW4gYXZhaWxhYmxlIGFmdGVyIHVwZGF0aW5nIHNlc3Npb24gc3RhdHVzXCIpXG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdHMgdGhlIGxhdGVzdCBiYWNrZW5kIHNlc3Npb24tc3RhdHVzIHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNlc3Npb25TdGF0dXNSZXN1bHQ+fVxuICAgKi9cbiAgc2Vzc2lvblN0YXR1cygpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IGhvc3QgPSBjb25maWcuZ2V0SG9zdCgpXG4gICAgICBsZXQgcmVxdWVzdFBhdGggPSBcIlwiXG5cbiAgICAgIGlmIChob3N0KSByZXF1ZXN0UGF0aCArPSBob3N0XG5cbiAgICAgIHJlcXVlc3RQYXRoICs9IFwiL2FwaV9tYWtlci9zZXNzaW9uX3N0YXR1c2VzXCJcblxuICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICAgIHhoci5vcGVuKFwiUE9TVFwiLCByZXF1ZXN0UGF0aCwgdHJ1ZSlcbiAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KVxuICAgICAgICByZXNvbHZlKHJlc3BvbnNlKVxuICAgICAgfVxuICAgICAgeGhyLnNlbmQoKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZm9yIGZyb250ZW5kIHNpZ24tb3V0IGRldGVjdGlvbi5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uU2lnbmVkT3V0KGNhbGxiYWNrKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHRoaXMuYWRkRXZlbnQoXCJvblNpZ25lZE91dFwiLCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKiBTdGFydHMgb3IgcmVmcmVzaGVzIHRoZSBwZXJpb2RpYyBzZXNzaW9uLXN0YXR1cyB0aW1lci4gKi9cbiAgc3RhcnRUaW1lb3V0KCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInN0YXJ0VGltZW91dFwiKVxuXG4gICAgaWYgKHRoaXMudXBkYXRlVGltZW91dClcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnVwZGF0ZVRpbWVvdXQpXG5cbiAgICB0aGlzLnVwZGF0ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnN0YXJ0VGltZW91dCgpXG4gICAgICAgIHRoaXMudXBkYXRlU2Vzc2lvblN0YXR1cygpXG4gICAgICB9LFxuICAgICAgdGhpcy50aW1lb3V0XG4gICAgKVxuICB9XG5cbiAgLyoqIFN0b3BzIHRoZSBwZXJpb2RpYyBzZXNzaW9uLXN0YXR1cyB0aW1lciBpZiBpdCBpcyBydW5uaW5nLiAqL1xuICBzdG9wVGltZW91dCgpIHtcbiAgICBpZiAodGhpcy51cGRhdGVUaW1lb3V0KVxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudXBkYXRlVGltZW91dClcbiAgfVxuXG4gIC8qKiBGZXRjaGVzIHRoZSBsYXRlc3Qgc2Vzc2lvbiBzdGF0dXMgYW5kIGFwcGxpZXMgaXQgbG9jYWxseS4gKi9cbiAgdXBkYXRlU2Vzc2lvblN0YXR1cyA9IGFzeW5jICgpID0+IHtcbiAgICBsb2dnZXIuZGVidWcoXCJ1cGRhdGVTZXNzaW9uU3RhdHVzXCIpXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlc3Npb25TdGF0dXMoKVxuXG4gICAgdGhpcy5hcHBseVJlc3VsdChyZXN1bHQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtTZXNzaW9uU3RhdHVzUmVzdWx0fSByZXN1bHRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhcHBseVJlc3VsdChyZXN1bHQpIHtcbiAgICBsb2dnZXIuZGVidWcoKCkgPT4gYFJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpfWApXG5cbiAgICB0aGlzLnVwZGF0ZU1ldGFFbGVtZW50c0Zyb21SZXN1bHQocmVzdWx0KVxuICAgIHRoaXMudXBkYXRlVXNlclNlc3Npb25zRnJvbVJlc3VsdChyZXN1bHQpXG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY2FjaGVkIGFuZCBET00gQ1NSRiB0b2tlbiBmcm9tIG9uZSBzZXNzaW9uLXN0YXR1cyByZXNwb25zZS5cbiAgICogQHBhcmFtIHtTZXNzaW9uU3RhdHVzUmVzdWx0fSByZXN1bHRcbiAgICovXG4gIHVwZGF0ZU1ldGFFbGVtZW50c0Zyb21SZXN1bHQocmVzdWx0KSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwidXBkYXRlTWV0YUVsZW1lbnRzRnJvbVJlc3VsdFwiKVxuXG4gICAgaWYgKCFyZXN1bHQuY3NyZl90b2tlbikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5jc3JmVG9rZW4gPSByZXN1bHQuY3NyZl90b2tlblxuXG4gICAgaWYgKHRoaXMudXNlTWV0YUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGNzcmZUb2tlbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwibWV0YVtuYW1lPSdjc3JmLXRva2VuJ11cIilcblxuICAgICAgaWYgKGNzcmZUb2tlbkVsZW1lbnQpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCgpID0+IGBDaGFuZ2luZyB0b2tlbiBmcm9tIFwiJHtjc3JmVG9rZW5FbGVtZW50LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIil9XCIgdG8gXCIke3Jlc3VsdC5jc3JmX3Rva2VufVwiYClcbiAgICAgICAgY3NyZlRva2VuRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIsIHJlc3VsdC5jc3JmX3Rva2VuKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiY3NyZiB0b2tlbiBlbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kXCIpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgZWFjaCByZXR1cm5lZCBzY29wZSBzdGF0dXMgdG8gdGhlIGZyb250ZW5kIERldmlzZSBjYWNoZS5cbiAgICogQHBhcmFtIHtTZXNzaW9uU3RhdHVzUmVzdWx0fSByZXN1bHRcbiAgICovXG4gIHVwZGF0ZVVzZXJTZXNzaW9uc0Zyb21SZXN1bHQocmVzdWx0KSB7XG4gICAgZm9yIChjb25zdCBzY29wZU5hbWUgaW4gcmVzdWx0LnNjb3Blcykge1xuICAgICAgdGhpcy51cGRhdGVVc2VyU2Vzc2lvblNjb3BlRnJvbVJlc3VsdChzY29wZU5hbWUsIHJlc3VsdC5zY29wZXNbc2NvcGVOYW1lXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBvbmUgc2NvcGUncyBzaWduZWQtaW4gc3RhdGUgdG8gdGhlIGZyb250ZW5kIERldmlzZSBjYWNoZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjb3BlTmFtZVxuICAgKiBAcGFyYW0ge1Nlc3Npb25TdGF0dXNTY29wZX0gc2NvcGVcbiAgICovXG4gIHVwZGF0ZVVzZXJTZXNzaW9uU2NvcGVGcm9tUmVzdWx0KHNjb3BlTmFtZSwgc2NvcGUpIHtcbiAgICBjb25zdCBkZXZpc2VJc1NpZ25lZEluTWV0aG9kTmFtZSA9IGBpcyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShzY29wZU5hbWUpfVNpZ25lZEluYFxuXG4gICAgaWYgKCEoZGV2aXNlSXNTaWduZWRJbk1ldGhvZE5hbWUgaW4gRGV2aXNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIG1ldGhvZCBpbiBEZXZpc2U6ICR7ZGV2aXNlSXNTaWduZWRJbk1ldGhvZE5hbWV9YClcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50bHlTaWduZWRJbiA9IERldmlzZVtkZXZpc2VJc1NpZ25lZEluTWV0aG9kTmFtZV0oKVxuICAgIGNvbnN0IHNpZ25lZEluT25CYWNrZW5kID0gc2NvcGUuc2lnbmVkX2luXG5cbiAgICBpZiAoY3VycmVudGx5U2lnbmVkSW4gJiYgIXNpZ25lZEluT25CYWNrZW5kKSB7XG4gICAgICBsb2dnZXIuZGVidWcoKCkgPT4gYCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShzY29wZU5hbWUpfSBzaWduZWQgaW4gb24gZnJvbnRlbmQgYnV0IG5vdCBpbiBiYWNrZW5kIWApXG5cbiAgICAgIERldmlzZS5zZXRTaWduZWRPdXQoe3Njb3BlOiBzY29wZU5hbWV9KVxuICAgICAgRGV2aXNlLmNhbGxTaWduT3V0RXZlbnQoe3Njb3BlOiBzY29wZU5hbWV9KVxuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,3 @@
1
+ export function cellToText(value: unknown): string;
2
+ export function cellToHtml(value: unknown): string;
3
+ //# sourceMappingURL=cell-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell-value.d.ts","sourceRoot":"/src/","sources":["table/export/cell-value.js"],"names":[],"mappings":"AAwCO,kCAHI,OAAO,GACL,MAAM,CAEwF;AAOpG,kCAHI,OAAO,GACL,MAAM,CAE+C"}
@@ -0,0 +1,47 @@
1
+ // @ts-check
2
+ /* eslint-disable sort-imports */
3
+ import React from "react";
4
+ /**
5
+ * @param {unknown} value
6
+ * @returns {string}
7
+ */
8
+ const toText = (value) => (value === null || value === undefined ? "" : String(value));
9
+ /**
10
+ * Recursively extracts the text content of a React node without rendering it, so the export path stays
11
+ * lightweight and SSR-/test-safe (no react-dom/server). A column's custom `content` can return a React
12
+ * element even in "html" mode; this keeps such cells exporting their text instead of "[object Object]".
13
+ * @param {unknown} node
14
+ * @returns {string}
15
+ */
16
+ const reactNodeToText = (node) => {
17
+ if (node === null || node === undefined || typeof node === "boolean")
18
+ return "";
19
+ if (typeof node === "string" || typeof node === "number")
20
+ return String(node);
21
+ if (Array.isArray(node))
22
+ return node.map(reactNodeToText).join("");
23
+ if (React.isValidElement(node))
24
+ return reactNodeToText(/** @type {{props?: {children?: unknown}}} */ (node).props?.children);
25
+ return "";
26
+ };
27
+ /**
28
+ * @param {string} text
29
+ * @returns {string}
30
+ */
31
+ const escapeHtml = (text) => text
32
+ .replace(/&/g, "&amp;")
33
+ .replace(/</g, "&lt;")
34
+ .replace(/>/g, "&gt;");
35
+ /**
36
+ * Plain text value of a cell, for CSV/Excel.
37
+ * @param {unknown} value
38
+ * @returns {string}
39
+ */
40
+ export const cellToText = (value) => (React.isValidElement(value) ? reactNodeToText(value) : toText(value));
41
+ /**
42
+ * HTML-escaped text value of a cell, for the HTML export.
43
+ * @param {unknown} value
44
+ * @returns {string}
45
+ */
46
+ export const cellToHtml = (value) => escapeHtml(cellToText(value));
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC12YWx1ZS5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsidGFibGUvZXhwb3J0L2NlbGwtdmFsdWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUNaLGlDQUFpQztBQUNqQyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7QUFFekI7OztHQUdHO0FBQ0gsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0FBRXRGOzs7Ozs7R0FNRztBQUNILE1BQU0sZUFBZSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUU7SUFDL0IsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksT0FBTyxJQUFJLEtBQUssU0FBUztRQUFFLE9BQU8sRUFBRSxDQUFBO0lBQy9FLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUM3RSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNsRSxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxlQUFlLENBQUMsNkNBQTZDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFFNUgsT0FBTyxFQUFFLENBQUE7QUFDWCxDQUFDLENBQUE7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSTtLQUM5QixPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztLQUN0QixPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztLQUNyQixPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0FBRXhCOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtBQUUzRzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcbi8qIGVzbGludC1kaXNhYmxlIHNvcnQtaW1wb3J0cyAqL1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiXG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgdG9UZXh0ID0gKHZhbHVlKSA9PiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBTdHJpbmcodmFsdWUpKVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGV4dHJhY3RzIHRoZSB0ZXh0IGNvbnRlbnQgb2YgYSBSZWFjdCBub2RlIHdpdGhvdXQgcmVuZGVyaW5nIGl0LCBzbyB0aGUgZXhwb3J0IHBhdGggc3RheXNcbiAqIGxpZ2h0d2VpZ2h0IGFuZCBTU1ItL3Rlc3Qtc2FmZSAobm8gcmVhY3QtZG9tL3NlcnZlcikuIEEgY29sdW1uJ3MgY3VzdG9tIGBjb250ZW50YCBjYW4gcmV0dXJuIGEgUmVhY3RcbiAqIGVsZW1lbnQgZXZlbiBpbiBcImh0bWxcIiBtb2RlOyB0aGlzIGtlZXBzIHN1Y2ggY2VsbHMgZXhwb3J0aW5nIHRoZWlyIHRleHQgaW5zdGVhZCBvZiBcIltvYmplY3QgT2JqZWN0XVwiLlxuICogQHBhcmFtIHt1bmtub3dufSBub2RlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCByZWFjdE5vZGVUb1RleHQgPSAobm9kZSkgPT4ge1xuICBpZiAobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG5vZGUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gXCJcIlxuICBpZiAodHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIG5vZGUgPT09IFwibnVtYmVyXCIpIHJldHVybiBTdHJpbmcobm9kZSlcbiAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHJldHVybiBub2RlLm1hcChyZWFjdE5vZGVUb1RleHQpLmpvaW4oXCJcIilcbiAgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KG5vZGUpKSByZXR1cm4gcmVhY3ROb2RlVG9UZXh0KC8qKiBAdHlwZSB7e3Byb3BzPzoge2NoaWxkcmVuPzogdW5rbm93bn19fSAqLyAobm9kZSkucHJvcHM/LmNoaWxkcmVuKVxuXG4gIHJldHVybiBcIlwiXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVzY2FwZUh0bWwgPSAodGV4dCkgPT4gdGV4dFxuICAucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpXG4gIC5yZXBsYWNlKC88L2csIFwiJmx0O1wiKVxuICAucmVwbGFjZSgvPi9nLCBcIiZndDtcIilcblxuLyoqXG4gKiBQbGFpbiB0ZXh0IHZhbHVlIG9mIGEgY2VsbCwgZm9yIENTVi9FeGNlbC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBjZWxsVG9UZXh0ID0gKHZhbHVlKSA9PiAoUmVhY3QuaXNWYWxpZEVsZW1lbnQodmFsdWUpID8gcmVhY3ROb2RlVG9UZXh0KHZhbHVlKSA6IHRvVGV4dCh2YWx1ZSkpXG5cbi8qKlxuICogSFRNTC1lc2NhcGVkIHRleHQgdmFsdWUgb2YgYSBjZWxsLCBmb3IgdGhlIEhUTUwgZXhwb3J0LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IGNlbGxUb0h0bWwgPSAodmFsdWUpID0+IGVzY2FwZUh0bWwoY2VsbFRvVGV4dCh2YWx1ZSkpXG4iXX0=
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @typedef {object} ExportFileSink
3
+ * @property {(chunk: string | Uint8Array) => Promise<void>} write
4
+ * @property {() => Promise<void>} close
5
+ * @property {() => Promise<void>} abort
6
+ */
7
+ /**
8
+ * @typedef {object} FsWritableStream
9
+ * @property {(chunk: string | Uint8Array) => Promise<void>} write
10
+ * @property {() => Promise<void>} close
11
+ * @property {() => Promise<void>} abort
12
+ */
13
+ /**
14
+ * @typedef {object} FsFileHandle
15
+ * @property {() => Promise<FsWritableStream>} createWritable
16
+ */
17
+ /**
18
+ * @typedef {object} FsWindow
19
+ * @property {(options: object) => Promise<FsFileHandle>} [showSaveFilePicker]
20
+ */
21
+ /**
22
+ * Opens a streaming file sink in the browser. When the File System Access API is available (Chromium), the
23
+ * export is written straight to the user-chosen file so memory stays bounded. Otherwise it falls back to
24
+ * buffering the chunks and saving a Blob via file-saver (memory-bound, but works everywhere).
25
+ *
26
+ * Must be called from within a user-gesture handler so the save-file picker is allowed to open.
27
+ *
28
+ * @param {object} args
29
+ * @param {string} args.fileName
30
+ * @param {string} args.mimeType
31
+ * @returns {Promise<ExportFileSink>}
32
+ */
33
+ export default function openWebFileSink({ fileName, mimeType }: {
34
+ fileName: string;
35
+ mimeType: string;
36
+ }): Promise<ExportFileSink>;
37
+ export type ExportFileSink = {
38
+ write: (chunk: string | Uint8Array) => Promise<void>;
39
+ close: () => Promise<void>;
40
+ abort: () => Promise<void>;
41
+ };
42
+ export type FsWritableStream = {
43
+ write: (chunk: string | Uint8Array) => Promise<void>;
44
+ close: () => Promise<void>;
45
+ abort: () => Promise<void>;
46
+ };
47
+ export type FsFileHandle = {
48
+ createWritable: () => Promise<FsWritableStream>;
49
+ };
50
+ export type FsWindow = {
51
+ showSaveFilePicker?: (options: object) => Promise<FsFileHandle>;
52
+ };
53
+ //# sourceMappingURL=web-file-sink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-file-sink.d.ts","sourceRoot":"/src/","sources":["table/export/file-sinks/web-file-sink.js"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH;;;;;GAKG;AACH;;;GAGG;AACH;;;GAGG;AAEH;;;;;;;;;;;GAWG;AACH,gEAJG;IAAqB,QAAQ,EAArB,MAAM;IACO,QAAQ,EAArB,MAAM;CACd,GAAU,OAAO,CAAC,cAAc,CAAC,CAgDnC;;WA7Ea,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC;WAC7C,MAAM,OAAO,CAAC,IAAI,CAAC;WACnB,MAAM,OAAO,CAAC,IAAI,CAAC;;;WAInB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC;WAC7C,MAAM,OAAO,CAAC,IAAI,CAAC;WACnB,MAAM,OAAO,CAAC,IAAI,CAAC;;;oBAInB,MAAM,OAAO,CAAC,gBAAgB,CAAC;;;yBAI/B,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC"}
@@ -0,0 +1,75 @@
1
+ // @ts-check
2
+ import { saveAs } from "file-saver";
3
+ /**
4
+ * @typedef {object} ExportFileSink
5
+ * @property {(chunk: string | Uint8Array) => Promise<void>} write
6
+ * @property {() => Promise<void>} close
7
+ * @property {() => Promise<void>} abort
8
+ */
9
+ /**
10
+ * @typedef {object} FsWritableStream
11
+ * @property {(chunk: string | Uint8Array) => Promise<void>} write
12
+ * @property {() => Promise<void>} close
13
+ * @property {() => Promise<void>} abort
14
+ */
15
+ /**
16
+ * @typedef {object} FsFileHandle
17
+ * @property {() => Promise<FsWritableStream>} createWritable
18
+ */
19
+ /**
20
+ * @typedef {object} FsWindow
21
+ * @property {(options: object) => Promise<FsFileHandle>} [showSaveFilePicker]
22
+ */
23
+ /**
24
+ * Opens a streaming file sink in the browser. When the File System Access API is available (Chromium), the
25
+ * export is written straight to the user-chosen file so memory stays bounded. Otherwise it falls back to
26
+ * buffering the chunks and saving a Blob via file-saver (memory-bound, but works everywhere).
27
+ *
28
+ * Must be called from within a user-gesture handler so the save-file picker is allowed to open.
29
+ *
30
+ * @param {object} args
31
+ * @param {string} args.fileName
32
+ * @param {string} args.mimeType
33
+ * @returns {Promise<ExportFileSink>}
34
+ */
35
+ export default async function openWebFileSink({ fileName, mimeType }) {
36
+ const win = /** @type {FsWindow | undefined} */ (typeof window === "undefined" ? undefined : /** @type {unknown} */ (window));
37
+ if (win && typeof win.showSaveFilePicker === "function") {
38
+ const extension = fileName.includes(".") ? fileName.slice(fileName.lastIndexOf(".")) : "";
39
+ try {
40
+ const handle = await win.showSaveFilePicker({
41
+ suggestedName: fileName,
42
+ types: extension ? [{ accept: { [mimeType]: [extension] } }] : undefined
43
+ });
44
+ const writable = await handle.createWritable();
45
+ return {
46
+ write: (chunk) => writable.write(chunk),
47
+ close: () => writable.close(),
48
+ abort: () => writable.abort()
49
+ };
50
+ }
51
+ catch (error) {
52
+ // The user cancelled the picker - propagate so the export aborts quietly.
53
+ if (error && /** @type {Error} */ (error).name === "AbortError")
54
+ throw error;
55
+ // Any other problem (e.g. picker not usable in this context): fall back to the Blob path below.
56
+ }
57
+ }
58
+ /** @type {Array<string | Uint8Array>} */
59
+ const chunks = [];
60
+ return {
61
+ write: (chunk) => {
62
+ chunks.push(chunk);
63
+ return Promise.resolve();
64
+ },
65
+ close: () => {
66
+ saveAs(new Blob(chunks, { type: mimeType }), fileName);
67
+ return Promise.resolve();
68
+ },
69
+ abort: () => {
70
+ chunks.length = 0;
71
+ return Promise.resolve();
72
+ }
73
+ };
74
+ }
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZpbGUtc2luay5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsidGFibGUvZXhwb3J0L2ZpbGUtc2lua3Mvd2ViLWZpbGUtc2luay5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBQ1osT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUVqQzs7Ozs7R0FLRztBQUNIOzs7OztHQUtHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssVUFBVSxlQUFlLENBQUMsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFDO0lBQ2hFLE1BQU0sR0FBRyxHQUFHLG1DQUFtQyxDQUFDLENBQUMsT0FBTyxNQUFNLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtJQUU3SCxJQUFJLEdBQUcsSUFBSSxPQUFPLEdBQUcsQ0FBQyxrQkFBa0IsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUN4RCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBRXpGLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLGtCQUFrQixDQUFDO2dCQUMxQyxhQUFhLEVBQUUsUUFBUTtnQkFDdkIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUzthQUNyRSxDQUFDLENBQUE7WUFDRixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQTtZQUU5QyxPQUFPO2dCQUNMLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7Z0JBQ3ZDLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO2dCQUM3QixLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTthQUM5QixDQUFBO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZiwwRUFBMEU7WUFDMUUsSUFBSSxLQUFLLElBQUksb0JBQW9CLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssWUFBWTtnQkFBRSxNQUFNLEtBQUssQ0FBQTtZQUU1RSxnR0FBZ0c7UUFDbEcsQ0FBQztJQUNILENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFBO0lBRWpCLE9BQU87UUFDTCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7WUFFbEIsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDMUIsQ0FBQztRQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDVixNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUE7WUFFcEQsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDMUIsQ0FBQztRQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDVixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtZQUVqQixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUMxQixDQUFDO0tBQ0YsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcbmltcG9ydCB7c2F2ZUFzfSBmcm9tIFwiZmlsZS1zYXZlclwiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRXhwb3J0RmlsZVNpbmtcbiAqIEBwcm9wZXJ0eSB7KGNodW5rOiBzdHJpbmcgfCBVaW50OEFycmF5KSA9PiBQcm9taXNlPHZvaWQ+fSB3cml0ZVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBjbG9zZVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBhYm9ydFxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZzV3JpdGFibGVTdHJlYW1cbiAqIEBwcm9wZXJ0eSB7KGNodW5rOiBzdHJpbmcgfCBVaW50OEFycmF5KSA9PiBQcm9taXNlPHZvaWQ+fSB3cml0ZVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBjbG9zZVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBhYm9ydFxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZzRmlsZUhhbmRsZVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEZzV3JpdGFibGVTdHJlYW0+fSBjcmVhdGVXcml0YWJsZVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZzV2luZG93XG4gKiBAcHJvcGVydHkgeyhvcHRpb25zOiBvYmplY3QpID0+IFByb21pc2U8RnNGaWxlSGFuZGxlPn0gW3Nob3dTYXZlRmlsZVBpY2tlcl1cbiAqL1xuXG4vKipcbiAqIE9wZW5zIGEgc3RyZWFtaW5nIGZpbGUgc2luayBpbiB0aGUgYnJvd3Nlci4gV2hlbiB0aGUgRmlsZSBTeXN0ZW0gQWNjZXNzIEFQSSBpcyBhdmFpbGFibGUgKENocm9taXVtKSwgdGhlXG4gKiBleHBvcnQgaXMgd3JpdHRlbiBzdHJhaWdodCB0byB0aGUgdXNlci1jaG9zZW4gZmlsZSBzbyBtZW1vcnkgc3RheXMgYm91bmRlZC4gT3RoZXJ3aXNlIGl0IGZhbGxzIGJhY2sgdG9cbiAqIGJ1ZmZlcmluZyB0aGUgY2h1bmtzIGFuZCBzYXZpbmcgYSBCbG9iIHZpYSBmaWxlLXNhdmVyIChtZW1vcnktYm91bmQsIGJ1dCB3b3JrcyBldmVyeXdoZXJlKS5cbiAqXG4gKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhIHVzZXItZ2VzdHVyZSBoYW5kbGVyIHNvIHRoZSBzYXZlLWZpbGUgcGlja2VyIGlzIGFsbG93ZWQgdG8gb3Blbi5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZmlsZU5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1pbWVUeXBlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxFeHBvcnRGaWxlU2luaz59XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIG9wZW5XZWJGaWxlU2luayh7ZmlsZU5hbWUsIG1pbWVUeXBlfSkge1xuICBjb25zdCB3aW4gPSAvKiogQHR5cGUge0ZzV2luZG93IHwgdW5kZWZpbmVkfSAqLyAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiA/IHVuZGVmaW5lZCA6IC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHdpbmRvdykpXG5cbiAgaWYgKHdpbiAmJiB0eXBlb2Ygd2luLnNob3dTYXZlRmlsZVBpY2tlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gZmlsZU5hbWUuaW5jbHVkZXMoXCIuXCIpID8gZmlsZU5hbWUuc2xpY2UoZmlsZU5hbWUubGFzdEluZGV4T2YoXCIuXCIpKSA6IFwiXCJcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGUgPSBhd2FpdCB3aW4uc2hvd1NhdmVGaWxlUGlja2VyKHtcbiAgICAgICAgc3VnZ2VzdGVkTmFtZTogZmlsZU5hbWUsXG4gICAgICAgIHR5cGVzOiBleHRlbnNpb24gPyBbe2FjY2VwdDoge1ttaW1lVHlwZV06IFtleHRlbnNpb25dfX1dIDogdW5kZWZpbmVkXG4gICAgICB9KVxuICAgICAgY29uc3Qgd3JpdGFibGUgPSBhd2FpdCBoYW5kbGUuY3JlYXRlV3JpdGFibGUoKVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB3cml0ZTogKGNodW5rKSA9PiB3cml0YWJsZS53cml0ZShjaHVuayksXG4gICAgICAgIGNsb3NlOiAoKSA9PiB3cml0YWJsZS5jbG9zZSgpLFxuICAgICAgICBhYm9ydDogKCkgPT4gd3JpdGFibGUuYWJvcnQoKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBUaGUgdXNlciBjYW5jZWxsZWQgdGhlIHBpY2tlciAtIHByb3BhZ2F0ZSBzbyB0aGUgZXhwb3J0IGFib3J0cyBxdWlldGx5LlxuICAgICAgaWYgKGVycm9yICYmIC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHRocm93IGVycm9yXG5cbiAgICAgIC8vIEFueSBvdGhlciBwcm9ibGVtIChlLmcuIHBpY2tlciBub3QgdXNhYmxlIGluIHRoaXMgY29udGV4dCk6IGZhbGwgYmFjayB0byB0aGUgQmxvYiBwYXRoIGJlbG93LlxuICAgIH1cbiAgfVxuXG4gIC8qKiBAdHlwZSB7QXJyYXk8c3RyaW5nIHwgVWludDhBcnJheT59ICovXG4gIGNvbnN0IGNodW5rcyA9IFtdXG5cbiAgcmV0dXJuIHtcbiAgICB3cml0ZTogKGNodW5rKSA9PiB7XG4gICAgICBjaHVua3MucHVzaChjaHVuaylcblxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfSxcbiAgICBjbG9zZTogKCkgPT4ge1xuICAgICAgc2F2ZUFzKG5ldyBCbG9iKGNodW5rcywge3R5cGU6IG1pbWVUeXBlfSksIGZpbGVOYW1lKVxuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9LFxuICAgIGFib3J0OiAoKSA9PiB7XG4gICAgICBjaHVua3MubGVuZ3RoID0gMFxuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Streaming CSV writer. Emits one chunk per call so the export driver can write each page straight to the
3
+ * file sink without holding the whole document in memory. RFC-4180 quoting, CRLF line breaks, and a UTF-8 BOM
4
+ * so Excel opens it with the right encoding.
5
+ */
6
+ export default class ApiMakerTableExportCsvWriter {
7
+ /**
8
+ * @param {Array<string>} labels
9
+ * @returns {string}
10
+ */
11
+ header(labels: Array<string>): string;
12
+ /**
13
+ * @param {Array<unknown>} values
14
+ * @returns {string}
15
+ */
16
+ row(values: Array<unknown>): string;
17
+ /** @returns {string} */
18
+ footer(): string;
19
+ /**
20
+ * @param {Array<unknown>} values
21
+ * @returns {string}
22
+ */
23
+ line(values: Array<unknown>): string;
24
+ /**
25
+ * @param {unknown} value
26
+ * @returns {string}
27
+ */
28
+ escape(value: unknown): string;
29
+ }
30
+ //# sourceMappingURL=csv-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv-writer.d.ts","sourceRoot":"/src/","sources":["table/export/format-writers/csv-writer.js"],"names":[],"mappings":"AAKA;;;;GAIG;AACH;IACE;;;OAGG;IACH,eAHW,KAAK,CAAC,MAAM,CAAC,GACX,MAAM,CAIlB;IAED;;;OAGG;IACH,YAHW,KAAK,CAAC,OAAO,CAAC,GACZ,MAAM,CAIlB;IAED,wBAAwB;IACxB,UADc,MAAM,CAGnB;IAED;;;OAGG;IACH,aAHW,KAAK,CAAC,OAAO,CAAC,GACZ,MAAM,CAIlB;IAED;;;OAGG;IACH,cAHW,OAAO,GACL,MAAM,CAUlB;CACF"}
@@ -0,0 +1,47 @@
1
+ // @ts-check
2
+ import { cellToText } from "../cell-value.js";
3
+ const UTF8_BOM = "";
4
+ /**
5
+ * Streaming CSV writer. Emits one chunk per call so the export driver can write each page straight to the
6
+ * file sink without holding the whole document in memory. RFC-4180 quoting, CRLF line breaks, and a UTF-8 BOM
7
+ * so Excel opens it with the right encoding.
8
+ */
9
+ export default class ApiMakerTableExportCsvWriter {
10
+ /**
11
+ * @param {Array<string>} labels
12
+ * @returns {string}
13
+ */
14
+ header(labels) {
15
+ return UTF8_BOM + this.line(labels);
16
+ }
17
+ /**
18
+ * @param {Array<unknown>} values
19
+ * @returns {string}
20
+ */
21
+ row(values) {
22
+ return this.line(values);
23
+ }
24
+ /** @returns {string} */
25
+ footer() {
26
+ return "";
27
+ }
28
+ /**
29
+ * @param {Array<unknown>} values
30
+ * @returns {string}
31
+ */
32
+ line(values) {
33
+ return `${values.map((value) => this.escape(value)).join(",")}\r\n`;
34
+ }
35
+ /**
36
+ * @param {unknown} value
37
+ * @returns {string}
38
+ */
39
+ escape(value) {
40
+ const text = cellToText(value);
41
+ if ((/["\r\n,]/).test(text)) {
42
+ return `"${text.replace(/"/g, "\"\"")}"`;
43
+ }
44
+ return text;
45
+ }
46
+ }
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LXdyaXRlci5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsidGFibGUvZXhwb3J0L2Zvcm1hdC13cml0ZXJzL2Nzdi13cml0ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUNaLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUUzQyxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUE7QUFFcEI7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sNEJBQTRCO0lBQy9DOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxNQUFNO1FBQ1gsT0FBTyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNyQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRyxDQUFDLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDMUIsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixNQUFNO1FBQ0osT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxDQUFDLE1BQU07UUFDVCxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFBO0lBQ3JFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsS0FBSztRQUNWLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUU5QixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDNUIsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUE7UUFDMUMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5pbXBvcnQge2NlbGxUb1RleHR9IGZyb20gXCIuLi9jZWxsLXZhbHVlLmpzXCJcblxuY29uc3QgVVRGOF9CT00gPSBcIu+7v1wiXG5cbi8qKlxuICogU3RyZWFtaW5nIENTViB3cml0ZXIuIEVtaXRzIG9uZSBjaHVuayBwZXIgY2FsbCBzbyB0aGUgZXhwb3J0IGRyaXZlciBjYW4gd3JpdGUgZWFjaCBwYWdlIHN0cmFpZ2h0IHRvIHRoZVxuICogZmlsZSBzaW5rIHdpdGhvdXQgaG9sZGluZyB0aGUgd2hvbGUgZG9jdW1lbnQgaW4gbWVtb3J5LiBSRkMtNDE4MCBxdW90aW5nLCBDUkxGIGxpbmUgYnJlYWtzLCBhbmQgYSBVVEYtOCBCT01cbiAqIHNvIEV4Y2VsIG9wZW5zIGl0IHdpdGggdGhlIHJpZ2h0IGVuY29kaW5nLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcGlNYWtlclRhYmxlRXhwb3J0Q3N2V3JpdGVyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gbGFiZWxzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBoZWFkZXIobGFiZWxzKSB7XG4gICAgcmV0dXJuIFVURjhfQk9NICsgdGhpcy5saW5lKGxhYmVscylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0FycmF5PHVua25vd24+fSB2YWx1ZXNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHJvdyh2YWx1ZXMpIHtcbiAgICByZXR1cm4gdGhpcy5saW5lKHZhbHVlcylcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBmb290ZXIoKSB7XG4gICAgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0FycmF5PHVua25vd24+fSB2YWx1ZXNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGxpbmUodmFsdWVzKSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlcy5tYXAoKHZhbHVlKSA9PiB0aGlzLmVzY2FwZSh2YWx1ZSkpLmpvaW4oXCIsXCIpfVxcclxcbmBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3Vua25vd259IHZhbHVlXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBlc2NhcGUodmFsdWUpIHtcbiAgICBjb25zdCB0ZXh0ID0gY2VsbFRvVGV4dCh2YWx1ZSlcblxuICAgIGlmICgoL1tcIlxcclxcbixdLykudGVzdCh0ZXh0KSkge1xuICAgICAgcmV0dXJuIGBcIiR7dGV4dC5yZXBsYWNlKC9cIi9nLCBcIlxcXCJcXFwiXCIpfVwiYFxuICAgIH1cblxuICAgIHJldHVybiB0ZXh0XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Streaming HTML-table writer. Emits the table head, one `<tr>` per row, and the closing tags as separate
3
+ * chunks so the export driver can write each page to the file sink incrementally. Cells that are React
4
+ * elements (from a column's custom `content`) are rendered to markup; other values are escaped text.
5
+ */
6
+ export default class ApiMakerTableExportHtmlWriter {
7
+ /**
8
+ * @param {Array<string>} labels
9
+ * @returns {string}
10
+ */
11
+ header(labels: Array<string>): string;
12
+ /**
13
+ * @param {Array<unknown>} values
14
+ * @returns {string}
15
+ */
16
+ row(values: Array<unknown>): string;
17
+ /** @returns {string} */
18
+ footer(): string;
19
+ }
20
+ //# sourceMappingURL=html-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-writer.d.ts","sourceRoot":"/src/","sources":["table/export/format-writers/html-writer.js"],"names":[],"mappings":"AAGA;;;;GAIG;AACH;IACE;;;OAGG;IACH,eAHW,KAAK,CAAC,MAAM,CAAC,GACX,MAAM,CAMlB;IAED;;;OAGG;IACH,YAHW,KAAK,CAAC,OAAO,CAAC,GACZ,MAAM,CAMlB;IAED,wBAAwB;IACxB,UADc,MAAM,CAGnB;CACF"}
@@ -0,0 +1,30 @@
1
+ // @ts-check
2
+ import { cellToHtml } from "../cell-value.js";
3
+ /**
4
+ * Streaming HTML-table writer. Emits the table head, one `<tr>` per row, and the closing tags as separate
5
+ * chunks so the export driver can write each page to the file sink incrementally. Cells that are React
6
+ * elements (from a column's custom `content`) are rendered to markup; other values are escaped text.
7
+ */
8
+ export default class ApiMakerTableExportHtmlWriter {
9
+ /**
10
+ * @param {Array<string>} labels
11
+ * @returns {string}
12
+ */
13
+ header(labels) {
14
+ const cells = labels.map((label) => `<th>${cellToHtml(label)}</th>`).join("");
15
+ return `<table><thead><tr>${cells}</tr></thead><tbody>`;
16
+ }
17
+ /**
18
+ * @param {Array<unknown>} values
19
+ * @returns {string}
20
+ */
21
+ row(values) {
22
+ const cells = values.map((value) => `<td>${cellToHtml(value)}</td>`).join("");
23
+ return `<tr>${cells}</tr>`;
24
+ }
25
+ /** @returns {string} */
26
+ footer() {
27
+ return "</tbody></table>";
28
+ }
29
+ }
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC13cml0ZXIuanMiLCJzb3VyY2VSb290IjoiL3NyYy8iLCJzb3VyY2VzIjpbInRhYmxlL2V4cG9ydC9mb3JtYXQtd3JpdGVycy9odG1sLXdyaXRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBQ1osT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBRTNDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDZCQUE2QjtJQUNoRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsTUFBTTtRQUNYLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFN0UsT0FBTyxxQkFBcUIsS0FBSyxzQkFBc0IsQ0FBQTtJQUN6RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRyxDQUFDLE1BQU07UUFDUixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRTdFLE9BQU8sT0FBTyxLQUFLLE9BQU8sQ0FBQTtJQUM1QixDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLE1BQU07UUFDSixPQUFPLGtCQUFrQixDQUFBO0lBQzNCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuaW1wb3J0IHtjZWxsVG9IdG1sfSBmcm9tIFwiLi4vY2VsbC12YWx1ZS5qc1wiXG5cbi8qKlxuICogU3RyZWFtaW5nIEhUTUwtdGFibGUgd3JpdGVyLiBFbWl0cyB0aGUgdGFibGUgaGVhZCwgb25lIGA8dHI+YCBwZXIgcm93LCBhbmQgdGhlIGNsb3NpbmcgdGFncyBhcyBzZXBhcmF0ZVxuICogY2h1bmtzIHNvIHRoZSBleHBvcnQgZHJpdmVyIGNhbiB3cml0ZSBlYWNoIHBhZ2UgdG8gdGhlIGZpbGUgc2luayBpbmNyZW1lbnRhbGx5LiBDZWxscyB0aGF0IGFyZSBSZWFjdFxuICogZWxlbWVudHMgKGZyb20gYSBjb2x1bW4ncyBjdXN0b20gYGNvbnRlbnRgKSBhcmUgcmVuZGVyZWQgdG8gbWFya3VwOyBvdGhlciB2YWx1ZXMgYXJlIGVzY2FwZWQgdGV4dC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBpTWFrZXJUYWJsZUV4cG9ydEh0bWxXcml0ZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBsYWJlbHNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGhlYWRlcihsYWJlbHMpIHtcbiAgICBjb25zdCBjZWxscyA9IGxhYmVscy5tYXAoKGxhYmVsKSA9PiBgPHRoPiR7Y2VsbFRvSHRtbChsYWJlbCl9PC90aD5gKS5qb2luKFwiXCIpXG5cbiAgICByZXR1cm4gYDx0YWJsZT48dGhlYWQ+PHRyPiR7Y2VsbHN9PC90cj48L3RoZWFkPjx0Ym9keT5gXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtBcnJheTx1bmtub3duPn0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICByb3codmFsdWVzKSB7XG4gICAgY29uc3QgY2VsbHMgPSB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4gYDx0ZD4ke2NlbGxUb0h0bWwodmFsdWUpfTwvdGQ+YCkuam9pbihcIlwiKVxuXG4gICAgcmV0dXJuIGA8dHI+JHtjZWxsc308L3RyPmBcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBmb290ZXIoKSB7XG4gICAgcmV0dXJuIFwiPC90Ym9keT48L3RhYmxlPlwiXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Excel (.xlsx) writer. xlsx is a zipped binary that can't be appended chunk-by-chunk, so this buffers the
3
+ * rows and serializes the whole workbook in `footer()`. To keep api_maker free of a heavy spreadsheet
4
+ * dependency, the actual serialization is provided by the host app via
5
+ * `apiMakerConfig.setExportXlsxSerializer(rows => Uint8Array)`. Best for moderate row counts — use CSV for
6
+ * very large exports.
7
+ */
8
+ export default class ApiMakerTableExportXlsxWriter {
9
+ rows: unknown[][];
10
+ /**
11
+ * @param {Array<string>} labels
12
+ * @returns {null}
13
+ */
14
+ header(labels: Array<string>): null;
15
+ /**
16
+ * @param {Array<unknown>} values
17
+ * @returns {null}
18
+ */
19
+ row(values: Array<unknown>): null;
20
+ /** @returns {Promise<Uint8Array>} */
21
+ footer(): Promise<Uint8Array>;
22
+ }
23
+ //# sourceMappingURL=xlsx-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xlsx-writer.d.ts","sourceRoot":"/src/","sources":["table/export/format-writers/xlsx-writer.js"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH;IAEI,kBAAqD;IAGvD;;;OAGG;IACH,eAHW,KAAK,CAAC,MAAM,CAAC,GACX,IAAI,CAMhB;IAED;;;OAGG;IACH,YAHW,KAAK,CAAC,OAAO,CAAC,GACZ,IAAI,CAMhB;IAED,qCAAqC;IACrC,UADc,OAAO,CAAC,UAAU,CAAC,CAShC;CACF"}
@@ -0,0 +1,41 @@
1
+ // @ts-check
2
+ /* eslint-disable sort-imports */
3
+ import apiMakerConfig from "../../../config.js";
4
+ import { cellToText } from "../cell-value.js";
5
+ /**
6
+ * Excel (.xlsx) writer. xlsx is a zipped binary that can't be appended chunk-by-chunk, so this buffers the
7
+ * rows and serializes the whole workbook in `footer()`. To keep api_maker free of a heavy spreadsheet
8
+ * dependency, the actual serialization is provided by the host app via
9
+ * `apiMakerConfig.setExportXlsxSerializer(rows => Uint8Array)`. Best for moderate row counts — use CSV for
10
+ * very large exports.
11
+ */
12
+ export default class ApiMakerTableExportXlsxWriter {
13
+ constructor() {
14
+ this.rows = /** @type {Array<Array<unknown>>} */ ([]);
15
+ }
16
+ /**
17
+ * @param {Array<string>} labels
18
+ * @returns {null}
19
+ */
20
+ header(labels) {
21
+ this.rows.push(labels);
22
+ return null;
23
+ }
24
+ /**
25
+ * @param {Array<unknown>} values
26
+ * @returns {null}
27
+ */
28
+ row(values) {
29
+ this.rows.push(values.map((value) => cellToText(value)));
30
+ return null;
31
+ }
32
+ /** @returns {Promise<Uint8Array>} */
33
+ async footer() {
34
+ const serializer = apiMakerConfig.getExportXlsxSerializer();
35
+ if (!serializer) {
36
+ throw new Error("Excel export isn't configured. Call apiMakerConfig.setExportXlsxSerializer(...) to enable it.");
37
+ }
38
+ return await serializer(this.rows);
39
+ }
40
+ }
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieGxzeC13cml0ZXIuanMiLCJzb3VyY2VSb290IjoiL3NyYy8iLCJzb3VyY2VzIjpbInRhYmxlL2V4cG9ydC9mb3JtYXQtd3JpdGVycy94bHN4LXdyaXRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBQ1osaUNBQWlDO0FBQ2pDLE9BQU8sY0FBYyxNQUFNLG9CQUFvQixDQUFBO0FBQy9DLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDZCQUE2QjtJQUNoRDtRQUNFLElBQUksQ0FBQyxJQUFJLEdBQUcsb0NBQW9DLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUN2RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLE1BQU07UUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUV0QixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRDs7O09BR0c7SUFDSCxHQUFHLENBQUMsTUFBTTtRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFeEQsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQscUNBQXFDO0lBQ3JDLEtBQUssQ0FBQyxNQUFNO1FBQ1YsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLHVCQUF1QixFQUFFLENBQUE7UUFFM0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0ZBQStGLENBQUMsQ0FBQTtRQUNsSCxDQUFDO1FBRUQsT0FBTyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDcEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG4vKiBlc2xpbnQtZGlzYWJsZSBzb3J0LWltcG9ydHMgKi9cbmltcG9ydCBhcGlNYWtlckNvbmZpZyBmcm9tIFwiLi4vLi4vLi4vY29uZmlnLmpzXCJcbmltcG9ydCB7Y2VsbFRvVGV4dH0gZnJvbSBcIi4uL2NlbGwtdmFsdWUuanNcIlxuXG4vKipcbiAqIEV4Y2VsICgueGxzeCkgd3JpdGVyLiB4bHN4IGlzIGEgemlwcGVkIGJpbmFyeSB0aGF0IGNhbid0IGJlIGFwcGVuZGVkIGNodW5rLWJ5LWNodW5rLCBzbyB0aGlzIGJ1ZmZlcnMgdGhlXG4gKiByb3dzIGFuZCBzZXJpYWxpemVzIHRoZSB3aG9sZSB3b3JrYm9vayBpbiBgZm9vdGVyKClgLiBUbyBrZWVwIGFwaV9tYWtlciBmcmVlIG9mIGEgaGVhdnkgc3ByZWFkc2hlZXRcbiAqIGRlcGVuZGVuY3ksIHRoZSBhY3R1YWwgc2VyaWFsaXphdGlvbiBpcyBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHAgdmlhXG4gKiBgYXBpTWFrZXJDb25maWcuc2V0RXhwb3J0WGxzeFNlcmlhbGl6ZXIocm93cyA9PiBVaW50OEFycmF5KWAuIEJlc3QgZm9yIG1vZGVyYXRlIHJvdyBjb3VudHMg4oCUIHVzZSBDU1YgZm9yXG4gKiB2ZXJ5IGxhcmdlIGV4cG9ydHMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwaU1ha2VyVGFibGVFeHBvcnRYbHN4V3JpdGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yb3dzID0gLyoqIEB0eXBlIHtBcnJheTxBcnJheTx1bmtub3duPj59ICovIChbXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGxhYmVsc1xuICAgKiBAcmV0dXJucyB7bnVsbH1cbiAgICovXG4gIGhlYWRlcihsYWJlbHMpIHtcbiAgICB0aGlzLnJvd3MucHVzaChsYWJlbHMpXG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QXJyYXk8dW5rbm93bj59IHZhbHVlc1xuICAgKiBAcmV0dXJucyB7bnVsbH1cbiAgICovXG4gIHJvdyh2YWx1ZXMpIHtcbiAgICB0aGlzLnJvd3MucHVzaCh2YWx1ZXMubWFwKCh2YWx1ZSkgPT4gY2VsbFRvVGV4dCh2YWx1ZSkpKVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxVaW50OEFycmF5Pn0gKi9cbiAgYXN5bmMgZm9vdGVyKCkge1xuICAgIGNvbnN0IHNlcmlhbGl6ZXIgPSBhcGlNYWtlckNvbmZpZy5nZXRFeHBvcnRYbHN4U2VyaWFsaXplcigpXG5cbiAgICBpZiAoIXNlcmlhbGl6ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4Y2VsIGV4cG9ydCBpc24ndCBjb25maWd1cmVkLiBDYWxsIGFwaU1ha2VyQ29uZmlnLnNldEV4cG9ydFhsc3hTZXJpYWxpemVyKC4uLikgdG8gZW5hYmxlIGl0LlwiKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBzZXJpYWxpemVyKHRoaXMucm93cylcbiAgfVxufVxuIl19