@kaspernj/api-maker 1.0.2171 → 1.0.2172
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/build/config.d.ts +21 -0
- package/build/config.d.ts.map +1 -1
- package/build/config.js +24 -1
- package/build/table/export/cell-value.d.ts +3 -0
- package/build/table/export/cell-value.d.ts.map +1 -0
- package/build/table/export/cell-value.js +47 -0
- package/build/table/export/file-sinks/web-file-sink.d.ts +53 -0
- package/build/table/export/file-sinks/web-file-sink.d.ts.map +1 -0
- package/build/table/export/file-sinks/web-file-sink.js +75 -0
- package/build/table/export/format-writers/csv-writer.d.ts +30 -0
- package/build/table/export/format-writers/csv-writer.d.ts.map +1 -0
- package/build/table/export/format-writers/csv-writer.js +47 -0
- package/build/table/export/format-writers/html-writer.d.ts +20 -0
- package/build/table/export/format-writers/html-writer.d.ts.map +1 -0
- package/build/table/export/format-writers/html-writer.js +30 -0
- package/build/table/export/format-writers/xlsx-writer.d.ts +23 -0
- package/build/table/export/format-writers/xlsx-writer.d.ts.map +1 -0
- package/build/table/export/format-writers/xlsx-writer.js +41 -0
- package/build/table/export/open-export-file-sink.d.ts +19 -0
- package/build/table/export/open-export-file-sink.d.ts.map +1 -0
- package/build/table/export/open-export-file-sink.js +26 -0
- package/build/table/export/table-exporter.d.ts +80 -0
- package/build/table/export/table-exporter.d.ts.map +1 -0
- package/build/table/export/table-exporter.js +141 -0
- package/build/table/settings/download-action.d.ts +8 -1
- package/build/table/settings/download-action.d.ts.map +1 -1
- package/build/table/settings/download-action.js +51 -24
- package/package.json +1 -1
package/build/config.d.ts
CHANGED
|
@@ -62,5 +62,26 @@ declare class ApiMakerConfig {
|
|
|
62
62
|
* @param {boolean} _newValue
|
|
63
63
|
*/
|
|
64
64
|
setUseHtmlForm(_newValue: boolean): void;
|
|
65
|
+
/**
|
|
66
|
+
* Opens a streaming file sink for table exports on platforms without a web default (e.g. React
|
|
67
|
+
* Native/Expo). Receives `{fileName, mimeType, format}` and returns a sink
|
|
68
|
+
* `{write(chunk), close(), abort()}`.
|
|
69
|
+
* @returns {((args: object) => Promise<object>) | undefined}
|
|
70
|
+
*/
|
|
71
|
+
getExportFileSinkOpener(): ((args: object) => Promise<object>) | undefined;
|
|
72
|
+
/**
|
|
73
|
+
* @param {((args: object) => Promise<object>) | undefined} opener
|
|
74
|
+
*/
|
|
75
|
+
setExportFileSinkOpener(opener: ((args: object) => Promise<object>) | undefined): void;
|
|
76
|
+
/**
|
|
77
|
+
* Serializes an array-of-arrays (header + rows) into xlsx bytes, enabling the optional Excel export format
|
|
78
|
+
* without api_maker depending on a spreadsheet library. Returns a `Uint8Array` (or a promise of one).
|
|
79
|
+
* @returns {((rows: Array<Array<unknown>>) => Uint8Array | Promise<Uint8Array>) | undefined}
|
|
80
|
+
*/
|
|
81
|
+
getExportXlsxSerializer(): ((rows: Array<Array<unknown>>) => Uint8Array | Promise<Uint8Array>) | undefined;
|
|
82
|
+
/**
|
|
83
|
+
* @param {((rows: Array<Array<unknown>>) => Uint8Array | Promise<Uint8Array>) | undefined} serializer
|
|
84
|
+
*/
|
|
85
|
+
setExportXlsxSerializer(serializer: ((rows: Array<Array<unknown>>) => Uint8Array | Promise<Uint8Array>) | undefined): void;
|
|
65
86
|
}
|
|
66
87
|
//# sourceMappingURL=config.d.ts.map
|
package/build/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"/src/","sources":["config.js"],"names":[],"mappings":";mCAIc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC;6BAChC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;uBAC7B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;+BACtB;IAAC,MAAM,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,CAAC,CAAA;CAAC;2BAE9C;IAAC,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;QAAC,QAAQ,EAAE,WAAW,CAAC;QAAC,QAAQ,EAAE,WAAW,CAAA;KAAC,KAAK,IAAI,CAAA;CAAC;0BAG5F,oBAAoB,EAAE,GAAG,cAAc,EAAE,GAAG,QAAQ,GAAG,gBAAgB,GAAG,YAAY,GAClG,OAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"/src/","sources":["config.js"],"names":[],"mappings":";mCAIc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC;6BAChC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;uBAC7B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;+BACtB;IAAC,MAAM,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,CAAC,CAAA;CAAC;2BAE9C;IAAC,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE;QAAC,QAAQ,EAAE,WAAW,CAAC;QAAC,QAAQ,EAAE,WAAW,CAAA;KAAC,KAAK,IAAI,CAAA;CAAC;0BAG5F,oBAAoB,EAAE,GAAG,cAAc,EAAE,GAAG,QAAQ,GAAG,gBAAgB,GAAG,YAAY,GAClG,OAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS;AAqLnD,6CAA2C;6BAjMhB,eAAe;AAkD1C,uFAAuF;AACvF;IAKI,YAA6C;IAC7C,2CAAgC;IAGlC;;;OAGG;IACH,aAFa,YAAY,CAES;IAElC,kDAAkD;IAClD,cADc,OAAO,SAAS,EAAE,cAAc,CAG7C;IAED,wBAAwB;IACxB,WADc,MAAM,CAGnB;IAED,oCAAoC;IACpC,eADc,MAAM,GAAG,SAAS,CAG/B;IAED,wBAAwB;IACxB,iCADc,MAAM,CAGnB;IAED;;OAEG;IACH,yCAFW,MAAM,QAEyF;IAE1G;;OAEG;IACH,uBAFW,MAAM,GAAG,SAAS,QAEyC;IAEtE,qCAAqC;IACrC,wBADc,OAAO,GAAG,SAAS,CAGhC;IAED;;OAEG;IACH,gCAFW,OAAO,GAAG,SAAS,QAE0D;IAExF,uCAAuC;IACvC,2BADc,KAAK,CAAC,cAAc,CAAC,CAGlC;IAED,wBAAwB;IACxB,YADc,MAAM,CAGnB;IAED,kCAAkC;IAClC,uBADc,gBAAgB,CAG7B;IAED,0BAA0B;IAC1B,aADc,QAAQ,CAGrB;IAED,yBAAyB;IACzB,kBADc,OAAO,CAGpB;IAED;;OAEG;IACH,0BAFW,OAAO,QAE0D;IAK5E;;;;;OAKG;IACH,2BAFa,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAES;IAErE;;OAEG;IACH,gCAFW,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,QAEmB;IAE7E;;;;OAIG;IACH,2BAFa,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,SAAS,CAEvB;IAErE;;OAEG;IACH,oCAFW,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,SAAS,QAEL;CACtF"}
|
package/build/config.js
CHANGED
|
@@ -115,6 +115,29 @@ class ApiMakerConfig {
|
|
|
115
115
|
* @param {boolean} _newValue
|
|
116
116
|
*/
|
|
117
117
|
setUseHtmlForm(_newValue) { apiMakerConfigNotImplemented("setUseHtmlForm"); }
|
|
118
|
+
// Table export hooks. These hold functions that should be returned as-is (not invoked), so they use
|
|
119
|
+
// explicit accessors instead of the generic accessor loop below (which would call function values).
|
|
120
|
+
/**
|
|
121
|
+
* Opens a streaming file sink for table exports on platforms without a web default (e.g. React
|
|
122
|
+
* Native/Expo). Receives `{fileName, mimeType, format}` and returns a sink
|
|
123
|
+
* `{write(chunk), close(), abort()}`.
|
|
124
|
+
* @returns {((args: object) => Promise<object>) | undefined}
|
|
125
|
+
*/
|
|
126
|
+
getExportFileSinkOpener() { return this.global.exportFileSinkOpener; }
|
|
127
|
+
/**
|
|
128
|
+
* @param {((args: object) => Promise<object>) | undefined} opener
|
|
129
|
+
*/
|
|
130
|
+
setExportFileSinkOpener(opener) { this.global.exportFileSinkOpener = opener; }
|
|
131
|
+
/**
|
|
132
|
+
* Serializes an array-of-arrays (header + rows) into xlsx bytes, enabling the optional Excel export format
|
|
133
|
+
* without api_maker depending on a spreadsheet library. Returns a `Uint8Array` (or a promise of one).
|
|
134
|
+
* @returns {((rows: Array<Array<unknown>>) => Uint8Array | Promise<Uint8Array>) | undefined}
|
|
135
|
+
*/
|
|
136
|
+
getExportXlsxSerializer() { return this.global.exportXlsxSerializer; }
|
|
137
|
+
/**
|
|
138
|
+
* @param {((rows: Array<Array<unknown>>) => Uint8Array | Promise<Uint8Array>) | undefined} serializer
|
|
139
|
+
*/
|
|
140
|
+
setExportXlsxSerializer(serializer) { this.global.exportXlsxSerializer = serializer; }
|
|
118
141
|
}
|
|
119
142
|
for (const accessorName in accessors) {
|
|
120
143
|
const accessorData = accessors[accessorName];
|
|
@@ -141,4 +164,4 @@ for (const accessorName in accessors) {
|
|
|
141
164
|
}
|
|
142
165
|
const apiMakerConfig = new ApiMakerConfig();
|
|
143
166
|
export default apiMakerConfig;
|
|
144
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJjb25maWcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUNaLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUE7QUFDMUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUEsQ0FBQyxtQ0FBbUM7QUFFNUUsdUVBQXVFO0FBQ3ZFLDhEQUE4RDtBQUM5RCxpREFBaUQ7QUFDakQsZ0ZBQWdGO0FBQ2hGOztHQUVHO0FBQ0g7OztHQUdHO0FBRUgsTUFBTSxTQUFTLEdBQUc7SUFDaEIsV0FBVyxFQUFFO1FBQ1gsT0FBTyxFQUFFO1lBQ1AsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO1lBQ2IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO1lBQ1osQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1lBQ1gsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1lBQ1gsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1lBQ1gsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ1Y7UUFDRCxRQUFRLEVBQUUsSUFBSTtLQUNmO0lBQ0QsUUFBUSxFQUFFLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQztJQUMxQixvQkFBb0IsRUFBRSxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUM7SUFDdEMsMEJBQTBCLEVBQUUsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7SUFDNUQsT0FBTyxFQUFFLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQztJQUN6QixJQUFJLEVBQUUsRUFBQyxRQUFRLEVBQUUsS0FBSyxFQUFDO0lBQ3ZCLElBQUksRUFBRSxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUM7SUFDdkIsTUFBTSxFQUFFLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQztJQUN4QixLQUFLLEVBQUUsRUFBQyxRQUFRLEVBQUUsS0FBSyxFQUFDO0lBQ3hCLFVBQVUsRUFB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b3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gXCJldmVudGVtaXR0ZXIzXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHNvcnQtaW1wb3J0c1xuXG4vKiogQHR5cGVkZWYge1tuYW1lOiBzdHJpbmcsIG1pbldpZHRoOiBudW1iZXJdfSBCcmVha3BvaW50RGVmaW5pdGlvbiAqL1xuLyoqIEB0eXBlZGVmIHtbbGFiZWw6IHN0cmluZywgY29kZTogc3RyaW5nXX0gQ3VycmVuY3lPcHRpb24gKi9cbi8qKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgb2JqZWN0Pn0gUm91dGVNYXAgKi9cbi8qKiBAdHlwZWRlZiB7e3JvdXRlczogQXJyYXk8e25hbWU6IHN0cmluZywgcGF0aDogc3RyaW5nfT59fSBSb3V0ZURlZmluaXRpb25zICovXG4vKipcbiAqIEB0eXBlZGVmIHt7ZW1pdDogKGV2ZW50TmFtZTogc3RyaW5nLCBwYXlsb2FkOiB7b2xkVmFsdWU6IENvbmZpZ1ZhbHVlLCBuZXdWYWx1ZTogQ29uZmlnVmFsdWV9KSA9PiB2b2lkfX0gQ29uZmlnRXZlbnRzXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge0JyZWFrcG9pbnREZWZpbml0aW9uW10gfCBDdXJyZW5jeU9wdGlvbltdIHwgUm91dGVNYXAgfCBSb3V0ZURlZmluaXRpb25zIHwgRXZlbnRFbWl0dGVyIHxcbiAqICAgYm9vbGVhbiB8IG51bWJlciB8IG9iamVjdCB8IHN0cmluZyB8IHVuZGVmaW5lZH0gQ29uZmlnVmFsdWVcbiAqL1xuXG5jb25zdCBhY2Nlc3NvcnMgPSB7XG4gIGJyZWFrcG9pbnRzOiB7XG4gICAgZGVmYXVsdDogW1xuICAgICAgW1wieHhsXCIsIDE0MDBdLFxuICAgICAgW1wieGxcIiwgMTIwMF0sXG4gICAgICBbXCJsZ1wiLCA5OTJdLFxuICAgICAgW1wibWRcIiwgNzY4XSxcbiAgICAgIFtcInNtXCIsIDU3Nl0sXG4gICAgICBbXCJ4c1wiLCAwXVxuICAgIF0sXG4gICAgcmVxdWlyZWQ6IHRydWVcbiAgfSxcbiAgY2FibGVVcmw6IHtyZXF1aXJlOiBmYWxzZX0sXG4gIGN1cnJlbmNpZXNDb2xsZWN0aW9uOiB7cmVxdWlyZWQ6IHRydWV9LFxuICBkYW5nZXJvdXNSb3dDb3VudFRocmVzaG9sZDoge2RlZmF1bHQ6IDEwMDAsIHJlcXVpcmVkOiBmYWxzZX0sXG4gIGhpc3Rvcnk6IHtyZXF1aXJlZDogdHJ1ZX0sXG4gIGhvc3Q6IHtyZXF1aXJlZDogZmFsc2V9LFxuICBpMThuOiB7cmVxdWlyZWQ6IGZhbHNlfSxcbiAgbGlua1RvOiB7cmVxdWlyZWQ6IHRydWV9LFxuICBtb2RhbDoge3JlcXVpcmVkOiBmYWxzZX0sXG4gIG5hdmlnYXRpb246IHtyZXF1aXJlZDogdHJ1ZX0sXG4gIHJvdXRlczoge3JlcXVpcmVkOiBmYWxzZX0sXG4gIHJvdXRlRGVmaW5pdGlvbnM6IHtyZXF1aXJlZDogZmFsc2V9LFxuICB1c2VIdG1sRm9ybToge2RlZmF1bHQ6IGZhbHNlLCByZXF1aXJlZDogZmFsc2V9LFxuICB3ZWJzb2NrZXRSZXF1ZXN0czoge3JlcXVpcmVkOiBmYWxzZX1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICogQHJldHVybnMge25ldmVyfVxuICovXG5jb25zdCBhcGlNYWtlckNvbmZpZ05vdEltcGxlbWVudGVkID0gKG1ldGhvZE5hbWUpID0+IHtcbiAgdGhyb3cgbmV3IEVycm9yKGAnJHttZXRob2ROYW1lfScgbm90IGltcGxlbWVudGVkYClcbn1cblxuLyoqIFN0b3JlcyBnbG9iYWxseSBjb25maWd1cmVkIEFwaSBNYWtlciBpbnRlZ3JhdGlvbiBob29rcyBhbmQgcnVudGltZSBkZXBlbmRlbmNpZXMuICovXG5jbGFzcyBBcGlNYWtlckNvbmZpZyB7XG4gIC8qKiBJbml0aWFsaXplcyB0aGUgc2hhcmVkIGNvbmZpZyBzdGF0ZSBhbmQgY2hhbmdlIGVtaXR0ZXIuICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICghZ2xvYmFsVGhpcy5hcGlNYWtlckNvbmZpZ0dsb2JhbCkgZ2xvYmFsVGhpcy5hcGlNYWtlckNvbmZpZ0dsb2JhbCA9IHt9XG5cbiAgICB0aGlzLmdsb2JhbCA9IGdsb2JhbFRoaXMuYXBpTWFrZXJDb25maWdHbG9iYWxcbiAgICB0aGlzLmV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGV2ZW50IGVtaXR0ZXIgdXNlZCBmb3IgY29uZmlnIGNoYW5nZSBub3RpZmljYXRpb25zLlxuICAgKiBAcmV0dXJucyB7Q29uZmlnRXZlbnRzfVxuICAgKi9cbiAgZ2V0RXZlbnRzKCkgeyByZXR1cm4gdGhpcy5ldmVudHMgfVxuXG4gIC8qKiBAcmV0dXJucyB7aW1wb3J0KFwiaGlzdG9yeVwiKS5Ccm93c2VySGlzdG9yeX0gKi9cbiAgZ2V0SGlzdG9yeSgpIHtcbiAgICByZXR1cm4gYXBpTWFrZXJDb25maWdOb3RJbXBsZW1lbnRlZChcImdldEhpc3RvcnlcIilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBnZXRIb3N0KCkge1xuICAgIHJldHVybiBhcGlNYWtlckNvbmZpZ05vdEltcGxlbWVudGVkKFwiZ2V0SG9zdFwiKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGdldENhYmxlVXJsKCkge1xuICAgIHJldHVybiBhcGlNYWtlckNvbmZpZ05vdEltcGxlbWVudGVkKFwiZ2V0Q2FibGVVcmxcIilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyfSAqL1xuICBnZXREYW5nZXJvdXNSb3dDb3VudFRocmVzaG9sZCgpIHtcbiAgICByZXR1cm4gYXBpTWFrZXJDb25maWdOb3RJbXBsZW1lbnRlZChcImdldERhbmdlcm91c1Jvd0NvdW50VGhyZXNob2xkXCIpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IF9uZXdWYWx1ZVxuICAgKi9cbiAgc2V0RGFuZ2Vyb3VzUm93Q291bnRUaHJlc2hvbGQoX25ld1ZhbHVlKSB7IGFwaU1ha2VyQ29uZmlnTm90SW1wbGVtZW50ZWQoXCJzZXREYW5nZXJvdXNSb3dDb3VudFRocmVzaG9sZFwiKSB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBfbmV3VmFsdWVcbiAgICovXG4gIHNldENhYmxlVXJsKF9uZXdWYWx1ZSkgeyBhcGlNYWtlckNvbmZpZ05vdEltcGxlbWVudGVkKFwic2V0Q2FibGVVcmxcIikgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbiB8IHVuZGVmaW5lZH0gKi9cbiAgZ2V0V2Vic29ja2V0UmVxdWVzdHMoKSB7XG4gICAgcmV0dXJuIGFwaU1ha2VyQ29uZmlnTm90SW1wbGVtZW50ZWQoXCJnZXRXZWJzb2NrZXRSZXF1ZXN0c1wiKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbiB8IHVuZGVmaW5lZH0gX25ld1ZhbHVlXG4gICAqL1xuICBzZXRXZWJzb2NrZXRSZXF1ZXN0cyhfbmV3VmFsdWUpIHsgYXBpTWFrZXJDb25maWdOb3RJbXBsZW1lbnRlZChcInNldFdlYnNvY2tldFJlcXVlc3RzXCIpIH1cblxuICAvKiogQHJldHVybnMge0FycmF5PEN1cnJlbmN5T3B0aW9uPn0gKi9cbiAgZ2V0Q3VycmVuY2llc0NvbGxlY3Rpb24oKSB7XG4gICAgcmV0dXJuIGFwaU1ha2VyQ29uZmlnTm90SW1wbGVtZW50ZWQoXCJnZXRDdXJyZW5jaWVzQ29sbGVjdGlvblwiKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtvYmplY3R9ICovXG4gIGdldE1vZGFsKCkge1xuICAgIHJldHVybiBhcGlNYWtlckNvbmZpZ05vdEltcGxlbWVudGVkKFwiZ2V0TW9kYWxcIilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Um91dGVEZWZpbml0aW9uc30gKi9cbiAgZ2V0Um91dGVEZWZpbml0aW9ucygpIHtcbiAgICByZXR1cm4gYXBpTWFrZXJDb25maWdOb3RJbXBsZW1lbnRlZChcImdldFJvdXRlRGVmaW5pdGlvbnNcIilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Um91dGVNYXB9ICovXG4gIGdldFJvdXRlcygpIHtcbiAgICByZXR1cm4gYXBpTWFrZXJDb25maWdOb3RJbXBsZW1lbnRlZChcImdldFJvdXRlc1wiKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFufSAqL1xuICBnZXRVc2VIdG1sRm9ybSgpIHtcbiAgICByZXR1cm4gYXBpTWFrZXJDb25maWdOb3RJbXBsZW1lbnRlZChcImdldFVzZUh0bWxGb3JtXCIpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtib29sZWFufSBfbmV3VmFsdWVcbiAgICovXG4gIHNldFVzZUh0bWxGb3JtKF9uZXdWYWx1ZSkgeyBhcGlNYWtlckNvbmZpZ05vdEltcGxlbWVudGVkKFwic2V0VXNlSHRtbEZvcm1cIikgfVxufVxuXG5mb3IgKGNvbnN0IGFjY2Vzc29yTmFtZSBpbiBhY2Nlc3NvcnMpIHtcbiAgY29uc3QgYWNjZXNzb3JEYXRhID0gYWNjZXNzb3JzW2FjY2Vzc29yTmFtZV1cbiAgY29uc3QgY2FtZWxpemVkQWNjZXNzb3IgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGFjY2Vzc29yTmFtZSlcblxuICBBcGlNYWtlckNvbmZpZy5wcm90b3R5cGVbYHNldCR7Y2FtZWxpemVkQWNjZXNzb3J9YF0gPSBmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuZ2xvYmFsW2FjY2Vzc29yTmFtZV1cblxuICAgIHRoaXMuZ2xvYmFsW2FjY2Vzc29yTmFtZV0gPSBuZXdWYWx1ZVxuXG4gICAgaWYgKG9sZFZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgdGhpcy5ldmVudHMuZW1pdChgb24ke2NhbWVsaXplZEFjY2Vzc29yfUNoYW5nZWAsIHtvbGRWYWx1ZSwgbmV3VmFsdWV9KVxuICAgIH1cbiAgfVxuXG4gIEFwaU1ha2VyQ29uZmlnLnByb3RvdHlwZVtgZ2V0JHtjYW1lbGl6ZWRBY2Nlc3Nvcn1gXSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgaWYgKHRoaXMuZ2xvYmFsW2FjY2Vzc29yTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGFjY2Vzc29yRGF0YS5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHJldHVybiBhY2Nlc3NvckRhdGEuZGVmYXVsdFxuICAgICAgaWYgKGFjY2Vzc29yRGF0YS5yZXF1aXJlZCkgdGhyb3cgbmV3IEVycm9yKGAke2FjY2Vzc29yTmFtZX0gaGFzbid0IGJlZW4gc2V0YClcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2xvYmFsW2FjY2Vzc29yTmFtZV1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdmFsdWUoLi4uYXJncylcblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG59XG5cbmNvbnN0IGFwaU1ha2VyQ29uZmlnID0gbmV3IEFwaU1ha2VyQ29uZmlnKClcblxuZXhwb3J0IGRlZmF1bHQgYXBpTWFrZXJDb25maWdcbiJdfQ==
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJjb25maWcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUNaLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUE7QUFDMUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUEsQ0FBQyxtQ0FBbUM7QUFFNUUsdUVBQXVFO0FBQ3ZFLDhEQUE4RDtBQUM5RCxpREFBaUQ7QUFDakQsZ0ZBQWdGO0FBQ2hGOztHQUVHO0FBQ0g7OztHQUdHO0FBRUgsTUFBTSxTQUFTLEdBQUc7SUFDaEIsV0FBVyxFQUFFO1FBQ1gsT0FBTyxFQUFFO1lBQ1AsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO1lBQ2IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO1lBQ1osQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1lBQ1gsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1lBQ1gsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1lBQ1gsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ1Y7UUFDRCxRQUFRLEVBQUUsSUFBSTtLQUNmO0lBQ0QsUUFBUSxFQUFFLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQztJQUMxQixvQkFBb0IsRUFBRSxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUM7SUFDdEMsMEJBQTBCLEVBQUUsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7SUFDNUQsT0FBTyxFQUFFLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQztJQUN6QixJQUFJLEVBQUUsRUFBQyxRQUFRLEVBQUUsS0FBSyxFQUFDO0lBQ3ZCLElBQUksRUFBRSxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUM7SUFDdkIsTUFBTSxFQUFFLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQztJQUN4QixLQUFLLEVBQUUsRUFBQyxRQUFRLEVBQUUsS0FBSyxFQUFDO0lBQ3hCLFVBQVUsRUFBRSxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUM7SUFDNUIsTUFBTSxFQUFFLEVBQUMsUUFBUSxFQUFFLEtBQUssRUFBQztJQUN6QixnQkFBZ0IsRUFBRSxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUM7SUFDbkMsV0FBVyxFQUFFLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFDO0lBQzlDLGlCQUFpQixFQUFFLEVBQUMsUUFBUSxFQUFFLEtBQUssRUFBQztDQUNyQyxDQUFBO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSw0QkFBNEIsR0FBRyxDQUFDLFVBQVUsRUFBRSxFQUFFO0lBQ2xELE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxVQUFVLG1CQUFtQixDQUFDLENBQUE7QUFDcEQsQ0FBQyxDQUFBO0FBRUQsdUZBQXVGO0FBQ3ZGLE1BQU0sY0FBYztJQUNsQiw4REFBOEQ7SUFDOUQ7UUFDRSxJQUFJLENBQUMsVUFBVSxDQUFDLG9CQUFvQjtZQUFFLFVBQVUsQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUE7UUFFMUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsb0JBQW9CLENBQUE7UUFDN0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFBO0lBQ2xDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLEtBQUssT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFBLENBQUMsQ0FBQztJQUVsQyxrREFBa0Q7SUFDbEQsVUFBVTtRQUNSLE9BQU8sNEJBQTRCLENBQUMsWUFBWSxDQUFDLENBQUE7SUFDbkQsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixPQUFPO1FBQ0wsT0FBTyw0QkFBNEIsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNoRCxDQUFDO0lBRUQsb0NBQW9DO0lBQ3BDLFdBQVc7UUFDVCxPQUFPLDRCQUE0QixDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ3BELENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsNkJBQTZCO1FBQzNCLE9BQU8sNEJBQTRCLENBQUMsK0JBQStCLENBQUMsQ0FBQTtJQUN0RSxDQUFDO0lBRUQ7O09BRUc7SUFDSCw2QkFBNkIsQ0FBQyxTQUFTLElBQUksNEJBQTRCLENBQUMsK0JBQStCLENBQUMsQ0FBQSxDQUFDLENBQUM7SUFFMUc7O09BRUc7SUFDSCxXQUFXLENBQUMsU0FBUyxJQUFJLDRCQUE0QixDQUFDLGFBQWEsQ0FBQyxDQUFBLENBQUMsQ0FBQztJQUV0RSxxQ0FBcUM7SUFDckMsb0JBQW9CO1FBQ2xCLE9BQU8sNEJBQTRCLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtJQUM3RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxvQkFBb0IsQ0FBQyxTQUFTLElBQUksNEJBQTRCLENBQUMsc0JBQXNCLENBQUMsQ0FBQSxDQUFDLENBQUM7SUFFeEYsdUNBQXVDO0lBQ3ZDLHVCQUF1QjtRQUNyQixPQUFPLDRCQUE0QixDQUFDLHlCQUF5QixDQUFDLENBQUE7SUFDaEUsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixRQUFRO1FBQ04sT0FBTyw0QkFBNEIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNqRCxDQUFDO0lBRUQsa0NBQWtDO0lBQ2xDLG1CQUFtQjtRQUNqQixPQUFPLDRCQUE0QixDQUFDLHFCQUFxQixDQUFDLENBQUE7SUFDNUQsQ0FBQztJQUVELDBCQUEwQjtJQUMxQixTQUFTO1FBQ1AsT0FBTyw0QkFBNEIsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUNsRCxDQUFDO0lBRUQseUJBQXlCO0lBQ3pCLGNBQWM7UUFDWixPQUFPLDRCQUE0QixDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFDdkQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYyxDQUFDLFNBQVMsSUFBSSw0QkFBNEIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBLENBQUMsQ0FBQztJQUU1RSxvR0FBb0c7SUFDcEcsb0dBQW9HO0lBRXBHOzs7OztPQUtHO0lBQ0gsdUJBQXVCLEtBQUssT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFBLENBQUMsQ0FBQztJQUVyRTs7T0FFRztJQUNILHVCQUF1QixDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQSxDQUFDLENBQUM7SUFFN0U7Ozs7T0FJRztJQUNILHVCQUF1QixLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQSxDQUFDLENBQUM7SUFFckU7O09BRUc7SUFDSCx1QkFBdUIsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsR0FBRyxVQUFVLENBQUEsQ0FBQyxDQUFDO0NBQ3RGO0FBRUQsS0FBSyxNQUFNLFlBQVksSUFBSSxTQUFTLEVBQUUsQ0FBQztJQUNyQyxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUE7SUFDNUMsTUFBTSxpQkFBaUIsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBRTNELGNBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsVUFBVSxRQUFRO1FBQ3RFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxRQUFRLENBQUE7UUFFcEMsSUFBSSxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxpQkFBaUIsUUFBUSxFQUFFLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7UUFDeEUsQ0FBQztJQUNILENBQUMsQ0FBQTtJQUVELGNBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsVUFBVSxHQUFHLElBQUk7UUFDckUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVDLElBQUksWUFBWSxDQUFDLE9BQU8sS0FBSyxTQUFTO2dCQUFFLE9BQU8sWUFBWSxDQUFDLE9BQU8sQ0FBQTtZQUNuRSxJQUFJLFlBQVksQ0FBQyxRQUFRO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxZQUFZLGtCQUFrQixDQUFDLENBQUE7UUFDL0UsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFdkMsSUFBSSxPQUFPLEtBQUssSUFBSSxVQUFVO1lBQUUsT0FBTyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTtRQUVyRCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUMsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFBO0FBRTNDLGVBQWUsY0FBYyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSBcImV2ZW50ZW1pdHRlcjNcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgc29ydC1pbXBvcnRzXG5cbi8qKiBAdHlwZWRlZiB7W25hbWU6IHN0cmluZywgbWluV2lkdGg6IG51bWJlcl19IEJyZWFrcG9pbnREZWZpbml0aW9uICovXG4vKiogQHR5cGVkZWYge1tsYWJlbDogc3RyaW5nLCBjb2RlOiBzdHJpbmddfSBDdXJyZW5jeU9wdGlvbiAqL1xuLyoqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+fSBSb3V0ZU1hcCAqL1xuLyoqIEB0eXBlZGVmIHt7cm91dGVzOiBBcnJheTx7bmFtZTogc3RyaW5nLCBwYXRoOiBzdHJpbmd9Pn19IFJvdXRlRGVmaW5pdGlvbnMgKi9cbi8qKlxuICogQHR5cGVkZWYge3tlbWl0OiAoZXZlbnROYW1lOiBzdHJpbmcsIHBheWxvYWQ6IHtvbGRWYWx1ZTogQ29uZmlnVmFsdWUsIG5ld1ZhbHVlOiBDb25maWdWYWx1ZX0pID0+IHZvaWR9fSBDb25maWdFdmVudHNcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7QnJlYWtwb2ludERlZmluaXRpb25bXSB8IEN1cnJlbmN5T3B0aW9uW10gfCBSb3V0ZU1hcCB8IFJvdXRlRGVmaW5pdGlvbnMgfCBFdmVudEVtaXR0ZXIgfFxuICogICBib29sZWFuIHwgbnVtYmVyIHwgb2JqZWN0IHwgc3RyaW5nIHwgdW5kZWZpbmVkfSBDb25maWdWYWx1ZVxuICovXG5cbmNvbnN0IGFjY2Vzc29ycyA9IHtcbiAgYnJlYWtwb2ludHM6IHtcbiAgICBkZWZhdWx0OiBbXG4gICAgICBbXCJ4eGxcIiwgMTQwMF0sXG4gICAgICBbXCJ4bFwiLCAxMjAwXSxcbiAgICAgIFtcImxnXCIsIDk5Ml0sXG4gICAgICBbXCJtZFwiLCA3NjhdLFxuICAgICAgW1wic21cIiwgNTc2XSxcbiAgICAgIFtcInhzXCIsIDBdXG4gICAgXSxcbiAgICByZXF1aXJlZDogdHJ1ZVxuICB9LFxuICBjYWJsZVVybDoge3JlcXVpcmU6IGZhbHNlfSxcbiAgY3VycmVuY2llc0NvbGxlY3Rpb246IHtyZXF1aXJlZDogdHJ1ZX0sXG4gIGRhbmdlcm91c1Jvd0NvdW50VGhyZXNob2xkOiB7ZGVmYXVsdDogMTAwMCwgcmVxdWlyZWQ6IGZhbHNlfSxcbiAgaGlzdG9yeToge3JlcXVpcmVkOiB0cnVlfSxcbiAgaG9zdDoge3JlcXVpcmVkOiBmYWxzZX0sXG4gIGkxOG46IHtyZXF1aXJlZDogZmFsc2V9LFxuICBsaW5rVG86IHtyZXF1aXJlZDogdHJ1ZX0sXG4gIG1vZGFsOiB7cmVxdWlyZWQ6IGZhbHNlfSxcbiAgbmF2aWdhdGlvbjoge3JlcXVpcmVkOiB0cnVlfSxcbiAgcm91dGVzOiB7cmVxdWlyZWQ6IGZhbHNlfSxcbiAgcm91dGVEZWZpbml0aW9uczoge3JlcXVpcmVkOiBmYWxzZX0sXG4gIHVzZUh0bWxGb3JtOiB7ZGVmYXVsdDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZX0sXG4gIHdlYnNvY2tldFJlcXVlc3RzOiB7cmVxdWlyZWQ6IGZhbHNlfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lXG4gKiBAcmV0dXJucyB7bmV2ZXJ9XG4gKi9cbmNvbnN0IGFwaU1ha2VyQ29uZmlnTm90SW1wbGVtZW50ZWQgPSAobWV0aG9kTmFtZSkgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoYCcke21ldGhvZE5hbWV9JyBub3QgaW1wbGVtZW50ZWRgKVxufVxuXG4vKiogU3RvcmVzIGdsb2JhbGx5IGNvbmZpZ3VyZWQgQXBpIE1ha2VyIGludGVncmF0aW9uIGhvb2tzIGFuZCBydW50aW1lIGRlcGVuZGVuY2llcy4gKi9cbmNsYXNzIEFwaU1ha2VyQ29uZmlnIHtcbiAgLyoqIEluaXRpYWxpemVzIHRoZSBzaGFyZWQgY29uZmlnIHN0YXRlIGFuZCBjaGFuZ2UgZW1pdHRlci4gKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKCFnbG9iYWxUaGlzLmFwaU1ha2VyQ29uZmlnR2xvYmFsKSBnbG9iYWxUaGlzLmFwaU1ha2VyQ29uZmlnR2xvYmFsID0ge31cblxuICAgIHRoaXMuZ2xvYmFsID0gZ2xvYmFsVGhpcy5hcGlNYWtlckNvbmZpZ0dsb2JhbFxuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50RW1pdHRlcigpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXZlbnQgZW1pdHRlciB1c2VkIGZvciBjb25maWcgY2hhbmdlIG5vdGlmaWNhdGlvbnMuXG4gICAqIEByZXR1cm5zIHtDb25maWdFdmVudHN9XG4gICAqL1xuICBnZXRFdmVudHMoKSB7IHJldHVybiB0aGlzLmV2ZW50cyB9XG5cbiAgLyoqIEByZXR1cm5zIHtpbXBvcnQoXCJoaXN0b3J5XCIpLkJyb3dzZXJIaXN0b3J5fSAqL1xuICBnZXRIaXN0b3J5KCkge1xuICAgIHJldHVybiBhcGlNYWtlckNvbmZpZ05vdEltcGxlbWVudGVkKFwiZ2V0SGlzdG9yeVwiKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIGdldEhvc3QoKSB7XG4gICAgcmV0dXJuIGFwaU1ha2VyQ29uZmlnTm90SW1wbGVtZW50ZWQoXCJnZXRIb3N0XCIpXG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gKi9cbiAgZ2V0Q2FibGVVcmwoKSB7XG4gICAgcmV0dXJuIGFwaU1ha2VyQ29uZmlnTm90SW1wbGVtZW50ZWQoXCJnZXRDYWJsZVVybFwiKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXG4gIGdldERhbmdlcm91c1Jvd0NvdW50VGhyZXNob2xkKCkge1xuICAgIHJldHVybiBhcGlNYWtlckNvbmZpZ05vdEltcGxlbWVudGVkKFwiZ2V0RGFuZ2Vyb3VzUm93Q291bnRUaHJlc2hvbGRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gX25ld1ZhbHVlXG4gICAqL1xuICBzZXREYW5nZXJvdXNSb3dDb3VudFRocmVzaG9sZChfbmV3VmFsdWUpIHsgYXBpTWFrZXJDb25maWdOb3RJbXBsZW1lbnRlZChcInNldERhbmdlcm91c1Jvd0NvdW50VGhyZXNob2xkXCIpIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IF9uZXdWYWx1ZVxuICAgKi9cbiAgc2V0Q2FibGVVcmwoX25ld1ZhbHVlKSB7IGFwaU1ha2VyQ29uZmlnTm90SW1wbGVtZW50ZWQoXCJzZXRDYWJsZVVybFwiKSB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFuIHwgdW5kZWZpbmVkfSAqL1xuICBnZXRXZWJzb2NrZXRSZXF1ZXN0cygpIHtcbiAgICByZXR1cm4gYXBpTWFrZXJDb25maWdOb3RJbXBsZW1lbnRlZChcImdldFdlYnNvY2tldFJlcXVlc3RzXCIpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtib29sZWFuIHwgdW5kZWZpbmVkfSBfbmV3VmFsdWVcbiAgICovXG4gIHNldFdlYnNvY2tldFJlcXVlc3RzKF9uZXdWYWx1ZSkgeyBhcGlNYWtlckNvbmZpZ05vdEltcGxlbWVudGVkKFwic2V0V2Vic29ja2V0UmVxdWVzdHNcIikgfVxuXG4gIC8qKiBAcmV0dXJucyB7QXJyYXk8Q3VycmVuY3lPcHRpb24+fSAqL1xuICBnZXRDdXJyZW5jaWVzQ29sbGVjdGlvbigpIHtcbiAgICByZXR1cm4gYXBpTWFrZXJDb25maWdOb3RJbXBsZW1lbnRlZChcImdldEN1cnJlbmNpZXNDb2xsZWN0aW9uXCIpXG4gIH1cblxuICAvKiogQHJldHVybnMge29iamVjdH0gKi9cbiAgZ2V0TW9kYWwoKSB7XG4gICAgcmV0dXJuIGFwaU1ha2VyQ29uZmlnTm90SW1wbGVtZW50ZWQoXCJnZXRNb2RhbFwiKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtSb3V0ZURlZmluaXRpb25zfSAqL1xuICBnZXRSb3V0ZURlZmluaXRpb25zKCkge1xuICAgIHJldHVybiBhcGlNYWtlckNvbmZpZ05vdEltcGxlbWVudGVkKFwiZ2V0Um91dGVEZWZpbml0aW9uc1wiKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtSb3V0ZU1hcH0gKi9cbiAgZ2V0Um91dGVzKCkge1xuICAgIHJldHVybiBhcGlNYWtlckNvbmZpZ05vdEltcGxlbWVudGVkKFwiZ2V0Um91dGVzXCIpXG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59ICovXG4gIGdldFVzZUh0bWxGb3JtKCkge1xuICAgIHJldHVybiBhcGlNYWtlckNvbmZpZ05vdEltcGxlbWVudGVkKFwiZ2V0VXNlSHRtbEZvcm1cIilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IF9uZXdWYWx1ZVxuICAgKi9cbiAgc2V0VXNlSHRtbEZvcm0oX25ld1ZhbHVlKSB7IGFwaU1ha2VyQ29uZmlnTm90SW1wbGVtZW50ZWQoXCJzZXRVc2VIdG1sRm9ybVwiKSB9XG5cbiAgLy8gVGFibGUgZXhwb3J0IGhvb2tzLiBUaGVzZSBob2xkIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCBhcy1pcyAobm90IGludm9rZWQpLCBzbyB0aGV5IHVzZVxuICAvLyBleHBsaWNpdCBhY2Nlc3NvcnMgaW5zdGVhZCBvZiB0aGUgZ2VuZXJpYyBhY2Nlc3NvciBsb29wIGJlbG93ICh3aGljaCB3b3VsZCBjYWxsIGZ1bmN0aW9uIHZhbHVlcykuXG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgc3RyZWFtaW5nIGZpbGUgc2luayBmb3IgdGFibGUgZXhwb3J0cyBvbiBwbGF0Zm9ybXMgd2l0aG91dCBhIHdlYiBkZWZhdWx0IChlLmcuIFJlYWN0XG4gICAqIE5hdGl2ZS9FeHBvKS4gUmVjZWl2ZXMgYHtmaWxlTmFtZSwgbWltZVR5cGUsIGZvcm1hdH1gIGFuZCByZXR1cm5zIGEgc2lua1xuICAgKiBge3dyaXRlKGNodW5rKSwgY2xvc2UoKSwgYWJvcnQoKX1gLlxuICAgKiBAcmV0dXJucyB7KChhcmdzOiBvYmplY3QpID0+IFByb21pc2U8b2JqZWN0PikgfCB1bmRlZmluZWR9XG4gICAqL1xuICBnZXRFeHBvcnRGaWxlU2lua09wZW5lcigpIHsgcmV0dXJuIHRoaXMuZ2xvYmFsLmV4cG9ydEZpbGVTaW5rT3BlbmVyIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsoKGFyZ3M6IG9iamVjdCkgPT4gUHJvbWlzZTxvYmplY3Q+KSB8IHVuZGVmaW5lZH0gb3BlbmVyXG4gICAqL1xuICBzZXRFeHBvcnRGaWxlU2lua09wZW5lcihvcGVuZXIpIHsgdGhpcy5nbG9iYWwuZXhwb3J0RmlsZVNpbmtPcGVuZXIgPSBvcGVuZXIgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGFuIGFycmF5LW9mLWFycmF5cyAoaGVhZGVyICsgcm93cykgaW50byB4bHN4IGJ5dGVzLCBlbmFibGluZyB0aGUgb3B0aW9uYWwgRXhjZWwgZXhwb3J0IGZvcm1hdFxuICAgKiB3aXRob3V0IGFwaV9tYWtlciBkZXBlbmRpbmcgb24gYSBzcHJlYWRzaGVldCBsaWJyYXJ5LiBSZXR1cm5zIGEgYFVpbnQ4QXJyYXlgIChvciBhIHByb21pc2Ugb2Ygb25lKS5cbiAgICogQHJldHVybnMgeygocm93czogQXJyYXk8QXJyYXk8dW5rbm93bj4+KSA9PiBVaW50OEFycmF5IHwgUHJvbWlzZTxVaW50OEFycmF5PikgfCB1bmRlZmluZWR9XG4gICAqL1xuICBnZXRFeHBvcnRYbHN4U2VyaWFsaXplcigpIHsgcmV0dXJuIHRoaXMuZ2xvYmFsLmV4cG9ydFhsc3hTZXJpYWxpemVyIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsoKHJvd3M6IEFycmF5PEFycmF5PHVua25vd24+PikgPT4gVWludDhBcnJheSB8IFByb21pc2U8VWludDhBcnJheT4pIHwgdW5kZWZpbmVkfSBzZXJpYWxpemVyXG4gICAqL1xuICBzZXRFeHBvcnRYbHN4U2VyaWFsaXplcihzZXJpYWxpemVyKSB7IHRoaXMuZ2xvYmFsLmV4cG9ydFhsc3hTZXJpYWxpemVyID0gc2VyaWFsaXplciB9XG59XG5cbmZvciAoY29uc3QgYWNjZXNzb3JOYW1lIGluIGFjY2Vzc29ycykge1xuICBjb25zdCBhY2Nlc3NvckRhdGEgPSBhY2Nlc3NvcnNbYWNjZXNzb3JOYW1lXVxuICBjb25zdCBjYW1lbGl6ZWRBY2Nlc3NvciA9IGluZmxlY3Rpb24uY2FtZWxpemUoYWNjZXNzb3JOYW1lKVxuXG4gIEFwaU1ha2VyQ29uZmlnLnByb3RvdHlwZVtgc2V0JHtjYW1lbGl6ZWRBY2Nlc3Nvcn1gXSA9IGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5nbG9iYWxbYWNjZXNzb3JOYW1lXVxuXG4gICAgdGhpcy5nbG9iYWxbYWNjZXNzb3JOYW1lXSA9IG5ld1ZhbHVlXG5cbiAgICBpZiAob2xkVmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICB0aGlzLmV2ZW50cy5lbWl0KGBvbiR7Y2FtZWxpemVkQWNjZXNzb3J9Q2hhbmdlYCwge29sZFZhbHVlLCBuZXdWYWx1ZX0pXG4gICAgfVxuICB9XG5cbiAgQXBpTWFrZXJDb25maWcucHJvdG90eXBlW2BnZXQke2NhbWVsaXplZEFjY2Vzc29yfWBdID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICBpZiAodGhpcy5nbG9iYWxbYWNjZXNzb3JOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoYWNjZXNzb3JEYXRhLmRlZmF1bHQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGFjY2Vzc29yRGF0YS5kZWZhdWx0XG4gICAgICBpZiAoYWNjZXNzb3JEYXRhLnJlcXVpcmVkKSB0aHJvdyBuZXcgRXJyb3IoYCR7YWNjZXNzb3JOYW1lfSBoYXNuJ3QgYmVlbiBzZXRgKVxuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nbG9iYWxbYWNjZXNzb3JOYW1lXVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB2YWx1ZSguLi5hcmdzKVxuXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cblxuY29uc3QgYXBpTWFrZXJDb25maWcgPSBuZXcgQXBpTWFrZXJDb25maWcoKVxuXG5leHBvcnQgZGVmYXVsdCBhcGlNYWtlckNvbmZpZ1xuIl19
|
|
@@ -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, "&")
|
|
33
|
+
.replace(/</g, "<")
|
|
34
|
+
.replace(/>/g, ">");
|
|
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
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** @typedef {import("./file-sinks/web-file-sink.js").ExportFileSink} ExportFileSink */
|
|
2
|
+
/**
|
|
3
|
+
* Opens a file sink for an export, abstracting over platforms. A host-configured opener (e.g. an
|
|
4
|
+
* expo-file-system/expo-sharing implementation on React Native) takes precedence; otherwise the built-in web
|
|
5
|
+
* sink is used. On native without a configured opener this throws with guidance.
|
|
6
|
+
*
|
|
7
|
+
* @param {object} args
|
|
8
|
+
* @param {string} args.fileName
|
|
9
|
+
* @param {string} args.mimeType
|
|
10
|
+
* @param {string} args.format
|
|
11
|
+
* @returns {Promise<ExportFileSink>}
|
|
12
|
+
*/
|
|
13
|
+
export default function openExportFileSink(args: {
|
|
14
|
+
fileName: string;
|
|
15
|
+
mimeType: string;
|
|
16
|
+
format: string;
|
|
17
|
+
}): Promise<ExportFileSink>;
|
|
18
|
+
export type ExportFileSink = import("./file-sinks/web-file-sink.js").ExportFileSink;
|
|
19
|
+
//# sourceMappingURL=open-export-file-sink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-export-file-sink.d.ts","sourceRoot":"/src/","sources":["table/export/open-export-file-sink.js"],"names":[],"mappings":"AAKA,uFAAuF;AAEvF;;;;;;;;;;GAUG;AACH,iDALG;IAAqB,QAAQ,EAArB,MAAM;IACO,QAAQ,EAArB,MAAM;IACO,MAAM,EAAnB,MAAM;CACd,GAAU,OAAO,CAAC,cAAc,CAAC,CAYnC;6BAvBa,OAAO,+BAA+B,EAAE,cAAc"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { Platform } from "react-native";
|
|
3
|
+
import apiMakerConfig from "../../config.js";
|
|
4
|
+
import openWebFileSink from "./file-sinks/web-file-sink.js";
|
|
5
|
+
/** @typedef {import("./file-sinks/web-file-sink.js").ExportFileSink} ExportFileSink */
|
|
6
|
+
/**
|
|
7
|
+
* Opens a file sink for an export, abstracting over platforms. A host-configured opener (e.g. an
|
|
8
|
+
* expo-file-system/expo-sharing implementation on React Native) takes precedence; otherwise the built-in web
|
|
9
|
+
* sink is used. On native without a configured opener this throws with guidance.
|
|
10
|
+
*
|
|
11
|
+
* @param {object} args
|
|
12
|
+
* @param {string} args.fileName
|
|
13
|
+
* @param {string} args.mimeType
|
|
14
|
+
* @param {string} args.format
|
|
15
|
+
* @returns {Promise<ExportFileSink>}
|
|
16
|
+
*/
|
|
17
|
+
export default async function openExportFileSink(args) {
|
|
18
|
+
const configuredOpener = apiMakerConfig.getExportFileSinkOpener();
|
|
19
|
+
if (configuredOpener)
|
|
20
|
+
return await configuredOpener(args);
|
|
21
|
+
if (Platform.OS === "web")
|
|
22
|
+
return await openWebFileSink(args);
|
|
23
|
+
throw new Error("No export file sink configured for this platform. On React Native/Expo, call " +
|
|
24
|
+
"apiMakerConfig.setExportFileSinkOpener(...) (e.g. using expo-file-system + expo-sharing).");
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Blbi1leHBvcnQtZmlsZS1zaW5rLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJ0YWJsZS9leHBvcnQvb3Blbi1leHBvcnQtZmlsZS1zaW5rLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFDWixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sY0FBYyxDQUFBO0FBQ3JDLE9BQU8sY0FBYyxNQUFNLGlCQUFpQixDQUFBO0FBQzVDLE9BQU8sZUFBZSxNQUFNLCtCQUErQixDQUFBO0FBRTNELHVGQUF1RjtBQUV2Rjs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFVBQVUsa0JBQWtCLENBQUMsSUFBSTtJQUNuRCxNQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO0lBRWpFLElBQUksZ0JBQWdCO1FBQUUsT0FBTyxNQUFNLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3pELElBQUksUUFBUSxDQUFDLEVBQUUsS0FBSyxLQUFLO1FBQUUsT0FBTyxNQUFNLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUU3RCxNQUFNLElBQUksS0FBSyxDQUNiLCtFQUErRTtRQUMvRSwyRkFBMkYsQ0FDNUYsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcbmltcG9ydCB7UGxhdGZvcm19IGZyb20gXCJyZWFjdC1uYXRpdmVcIlxuaW1wb3J0IGFwaU1ha2VyQ29uZmlnIGZyb20gXCIuLi8uLi9jb25maWcuanNcIlxuaW1wb3J0IG9wZW5XZWJGaWxlU2luayBmcm9tIFwiLi9maWxlLXNpbmtzL3dlYi1maWxlLXNpbmsuanNcIlxuXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vZmlsZS1zaW5rcy93ZWItZmlsZS1zaW5rLmpzXCIpLkV4cG9ydEZpbGVTaW5rfSBFeHBvcnRGaWxlU2luayAqL1xuXG4vKipcbiAqIE9wZW5zIGEgZmlsZSBzaW5rIGZvciBhbiBleHBvcnQsIGFic3RyYWN0aW5nIG92ZXIgcGxhdGZvcm1zLiBBIGhvc3QtY29uZmlndXJlZCBvcGVuZXIgKGUuZy4gYW5cbiAqIGV4cG8tZmlsZS1zeXN0ZW0vZXhwby1zaGFyaW5nIGltcGxlbWVudGF0aW9uIG9uIFJlYWN0IE5hdGl2ZSkgdGFrZXMgcHJlY2VkZW5jZTsgb3RoZXJ3aXNlIHRoZSBidWlsdC1pbiB3ZWJcbiAqIHNpbmsgaXMgdXNlZC4gT24gbmF0aXZlIHdpdGhvdXQgYSBjb25maWd1cmVkIG9wZW5lciB0aGlzIHRocm93cyB3aXRoIGd1aWRhbmNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5maWxlTmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubWltZVR5cGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmZvcm1hdFxuICogQHJldHVybnMge1Byb21pc2U8RXhwb3J0RmlsZVNpbms+fVxuICovXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBvcGVuRXhwb3J0RmlsZVNpbmsoYXJncykge1xuICBjb25zdCBjb25maWd1cmVkT3BlbmVyID0gYXBpTWFrZXJDb25maWcuZ2V0RXhwb3J0RmlsZVNpbmtPcGVuZXIoKVxuXG4gIGlmIChjb25maWd1cmVkT3BlbmVyKSByZXR1cm4gYXdhaXQgY29uZmlndXJlZE9wZW5lcihhcmdzKVxuICBpZiAoUGxhdGZvcm0uT1MgPT09IFwid2ViXCIpIHJldHVybiBhd2FpdCBvcGVuV2ViRmlsZVNpbmsoYXJncylcblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgXCJObyBleHBvcnQgZmlsZSBzaW5rIGNvbmZpZ3VyZWQgZm9yIHRoaXMgcGxhdGZvcm0uIE9uIFJlYWN0IE5hdGl2ZS9FeHBvLCBjYWxsIFwiICtcbiAgICBcImFwaU1ha2VyQ29uZmlnLnNldEV4cG9ydEZpbGVTaW5rT3BlbmVyKC4uLikgKGUuZy4gdXNpbmcgZXhwby1maWxlLXN5c3RlbSArIGV4cG8tc2hhcmluZykuXCJcbiAgKVxufVxuIl19
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/** Thrown when the user cancels an in-progress export. */
|
|
2
|
+
export class ApiMakerTableExportAbortedError extends Error {
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Streams a table's whole result set to a file, fetching it page-by-page and writing each page straight to a
|
|
6
|
+
* file sink, so only one page (plus the format writer's own buffering) is ever held in memory.
|
|
7
|
+
*
|
|
8
|
+
* @typedef {object} ExporterArgs
|
|
9
|
+
* @property {number} [batchSize]
|
|
10
|
+
* @property {"csv" | "html" | "xlsx"} format
|
|
11
|
+
* @property {(format: string, value: Date) => string} l
|
|
12
|
+
* @property {(progress: {page: number, totalPages: number, written: number}) => void} [onProgress]
|
|
13
|
+
* @property {object} table
|
|
14
|
+
*/
|
|
15
|
+
export default class ApiMakerTableExporter {
|
|
16
|
+
/** @param {ExporterArgs} args */
|
|
17
|
+
constructor({ batchSize, format, l, onProgress, table }: ExporterArgs);
|
|
18
|
+
batchSize: number;
|
|
19
|
+
format: "html" | "csv" | "xlsx";
|
|
20
|
+
l: (format: string, value: Date) => string;
|
|
21
|
+
onProgress: (progress: {
|
|
22
|
+
page: number;
|
|
23
|
+
totalPages: number;
|
|
24
|
+
written: number;
|
|
25
|
+
}) => void;
|
|
26
|
+
table: any;
|
|
27
|
+
aborted: boolean;
|
|
28
|
+
abort(): void;
|
|
29
|
+
/** @returns {Promise<{written: number}>} */
|
|
30
|
+
run(): Promise<{
|
|
31
|
+
written: number;
|
|
32
|
+
}>;
|
|
33
|
+
/** @returns {Array<{column: object, tableSettingColumn: object}>} */
|
|
34
|
+
visibleColumns(): Array<{
|
|
35
|
+
column: object;
|
|
36
|
+
tableSettingColumn: object;
|
|
37
|
+
}>;
|
|
38
|
+
/**
|
|
39
|
+
* @param {{column: object}} preparedColumn
|
|
40
|
+
* @param {object} model
|
|
41
|
+
* @returns {unknown}
|
|
42
|
+
*/
|
|
43
|
+
cellValue(preparedColumn: {
|
|
44
|
+
column: object;
|
|
45
|
+
}, model: object): unknown;
|
|
46
|
+
/** @returns {string} */
|
|
47
|
+
modelName(): string;
|
|
48
|
+
baseQuery(): any;
|
|
49
|
+
/**
|
|
50
|
+
* @param {{write: (chunk: string | Uint8Array) => Promise<void>}} sink
|
|
51
|
+
* @param {string | Uint8Array | null | undefined} chunk
|
|
52
|
+
* @returns {Promise<void>}
|
|
53
|
+
*/
|
|
54
|
+
writeChunk(sink: {
|
|
55
|
+
write: (chunk: string | Uint8Array) => Promise<void>;
|
|
56
|
+
}, chunk: string | Uint8Array | null | undefined): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* @param {{abort: () => Promise<void>}} sink
|
|
59
|
+
* @returns {Promise<void>}
|
|
60
|
+
*/
|
|
61
|
+
abortSink(sink: {
|
|
62
|
+
abort: () => Promise<void>;
|
|
63
|
+
}): Promise<void>;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Streams a table's whole result set to a file, fetching it page-by-page and writing each page straight to a
|
|
67
|
+
* file sink, so only one page (plus the format writer's own buffering) is ever held in memory.
|
|
68
|
+
*/
|
|
69
|
+
export type ExporterArgs = {
|
|
70
|
+
batchSize?: number;
|
|
71
|
+
format: "csv" | "html" | "xlsx";
|
|
72
|
+
l: (format: string, value: Date) => string;
|
|
73
|
+
onProgress?: (progress: {
|
|
74
|
+
page: number;
|
|
75
|
+
totalPages: number;
|
|
76
|
+
written: number;
|
|
77
|
+
}) => void;
|
|
78
|
+
table: object;
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=table-exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-exporter.d.ts","sourceRoot":"/src/","sources":["table/export/table-exporter.js"],"names":[],"mappings":"AAkBA,0DAA0D;AAC1D;CAA6D;AAE7D;;;;;;;;;;GAUG;AACH;IACE,iCAAiC;IACjC,yDADY,YAAY,EAQvB;IANC,kBAA0B;IAC1B,gCAAoB;IACpB,YATmB,MAAM,SAAS,IAAI,KAAK,MAAM,CASvC;IACV,uBATqB;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,KAAK,IAAI,CASrD;IAC5B,WAAkB;IAClB,iBAAoB;IAGtB,cAEC;IAED,4CAA4C;IAC5C,OADc,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,CAAC,CA4DvC;IAED,qEAAqE;IACrE,kBADc,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,MAAM,CAAA;KAAC,CAAC,CAKhE;IAED;;;;OAIG;IACH,0BAJW;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,SAChB,MAAM,GACJ,OAAO,CAInB;IAED,wBAAwB;IACxB,aADc,MAAM,CAGnB;IAED,iBAEC;IAED;;;;OAIG;IACH,iBAJW;QAAC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KAAC,SACtD,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,SAAS,GACpC,OAAO,CAAC,IAAI,CAAC,CAOzB;IAED;;;OAGG;IACH,gBAHW;QAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;KAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CAQzB;CACF;;;;;;gBAnIa,MAAM;YACN,KAAK,GAAG,MAAM,GAAG,MAAM;OACvB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,KAAK,MAAM;iBACvC,CAAC,QAAQ,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,KAAK,IAAI;WACvE,MAAM"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
// The export is intentionally sequential: each page is fetched and written before the next so only one page
|
|
3
|
+
// is ever in memory. That requires awaiting inside the paging loop.
|
|
4
|
+
/* eslint-disable no-await-in-loop, sort-imports */
|
|
5
|
+
import { digg } from "diggerize";
|
|
6
|
+
import columnVisible from "../column-visible.js";
|
|
7
|
+
import ColumnContent from "../column-content";
|
|
8
|
+
import CsvWriter from "./format-writers/csv-writer.js";
|
|
9
|
+
import HtmlWriter from "./format-writers/html-writer.js";
|
|
10
|
+
import openExportFileSink from "./open-export-file-sink.js";
|
|
11
|
+
import XlsxWriter from "./format-writers/xlsx-writer.js";
|
|
12
|
+
const FORMATS = {
|
|
13
|
+
csv: { extension: "csv", mimeType: "text/csv;charset=utf-8", Writer: CsvWriter },
|
|
14
|
+
html: { extension: "html", mimeType: "text/html;charset=utf-8", Writer: HtmlWriter },
|
|
15
|
+
xlsx: { extension: "xlsx", mimeType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", Writer: XlsxWriter }
|
|
16
|
+
};
|
|
17
|
+
/** Thrown when the user cancels an in-progress export. */
|
|
18
|
+
export class ApiMakerTableExportAbortedError extends Error {
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Streams a table's whole result set to a file, fetching it page-by-page and writing each page straight to a
|
|
22
|
+
* file sink, so only one page (plus the format writer's own buffering) is ever held in memory.
|
|
23
|
+
*
|
|
24
|
+
* @typedef {object} ExporterArgs
|
|
25
|
+
* @property {number} [batchSize]
|
|
26
|
+
* @property {"csv" | "html" | "xlsx"} format
|
|
27
|
+
* @property {(format: string, value: Date) => string} l
|
|
28
|
+
* @property {(progress: {page: number, totalPages: number, written: number}) => void} [onProgress]
|
|
29
|
+
* @property {object} table
|
|
30
|
+
*/
|
|
31
|
+
export default class ApiMakerTableExporter {
|
|
32
|
+
/** @param {ExporterArgs} args */
|
|
33
|
+
constructor({ batchSize = 1000, format, l, onProgress, table }) {
|
|
34
|
+
this.batchSize = batchSize;
|
|
35
|
+
this.format = format;
|
|
36
|
+
this.l = l;
|
|
37
|
+
this.onProgress = onProgress;
|
|
38
|
+
this.table = table;
|
|
39
|
+
this.aborted = false;
|
|
40
|
+
}
|
|
41
|
+
abort() {
|
|
42
|
+
this.aborted = true;
|
|
43
|
+
}
|
|
44
|
+
/** @returns {Promise<{written: number}>} */
|
|
45
|
+
async run() {
|
|
46
|
+
const formatConfig = FORMATS[this.format];
|
|
47
|
+
if (!formatConfig)
|
|
48
|
+
throw new Error(`Unknown export format: ${this.format}`);
|
|
49
|
+
const writer = new formatConfig.Writer();
|
|
50
|
+
const columns = this.visibleColumns();
|
|
51
|
+
const labels = columns.map((preparedColumn) => this.table.headerLabelForColumn(preparedColumn.column));
|
|
52
|
+
const fileName = `${this.modelName()}.${formatConfig.extension}`;
|
|
53
|
+
const sink = await openExportFileSink({ fileName, format: this.format, mimeType: formatConfig.mimeType });
|
|
54
|
+
let written = 0;
|
|
55
|
+
try {
|
|
56
|
+
await this.writeChunk(sink, writer.header(labels));
|
|
57
|
+
let page = 1;
|
|
58
|
+
let totalPages = 1;
|
|
59
|
+
do {
|
|
60
|
+
const result = await this.baseQuery()
|
|
61
|
+
.clone()
|
|
62
|
+
.page(page)
|
|
63
|
+
.per(this.batchSize)
|
|
64
|
+
.result();
|
|
65
|
+
if (page === 1)
|
|
66
|
+
totalPages = result.totalPages();
|
|
67
|
+
let buffer = "";
|
|
68
|
+
for (const model of result.models()) {
|
|
69
|
+
if (this.aborted)
|
|
70
|
+
throw new ApiMakerTableExportAbortedError("Export aborted");
|
|
71
|
+
const values = columns.map((preparedColumn) => this.cellValue(preparedColumn, model));
|
|
72
|
+
const chunk = writer.row(values);
|
|
73
|
+
if (typeof chunk === "string") {
|
|
74
|
+
buffer += chunk;
|
|
75
|
+
}
|
|
76
|
+
else if (chunk !== null && chunk !== undefined) {
|
|
77
|
+
await this.writeChunk(sink, chunk);
|
|
78
|
+
}
|
|
79
|
+
written += 1;
|
|
80
|
+
}
|
|
81
|
+
if (buffer.length > 0)
|
|
82
|
+
await sink.write(buffer);
|
|
83
|
+
if (this.onProgress)
|
|
84
|
+
this.onProgress({ page, totalPages, written });
|
|
85
|
+
page += 1;
|
|
86
|
+
} while (page <= totalPages);
|
|
87
|
+
await this.writeChunk(sink, await writer.footer());
|
|
88
|
+
await sink.close();
|
|
89
|
+
return { written };
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
await this.abortSink(sink);
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/** @returns {Array<{column: object, tableSettingColumn: object}>} */
|
|
97
|
+
visibleColumns() {
|
|
98
|
+
const preparedColumns = this.table.s.preparedColumns || [];
|
|
99
|
+
return preparedColumns.filter(({ column, tableSettingColumn }) => columnVisible(column, tableSettingColumn));
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* @param {{column: object}} preparedColumn
|
|
103
|
+
* @param {object} model
|
|
104
|
+
* @returns {unknown}
|
|
105
|
+
*/
|
|
106
|
+
cellValue(preparedColumn, model) {
|
|
107
|
+
return new ColumnContent({ column: preparedColumn.column, l: this.l, mode: "html", model, table: this.table }).content();
|
|
108
|
+
}
|
|
109
|
+
/** @returns {string} */
|
|
110
|
+
modelName() {
|
|
111
|
+
return this.table.p.modelClass.modelName().human({ count: 2 });
|
|
112
|
+
}
|
|
113
|
+
baseQuery() {
|
|
114
|
+
return digg(this.table.tt.collection, "query");
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* @param {{write: (chunk: string | Uint8Array) => Promise<void>}} sink
|
|
118
|
+
* @param {string | Uint8Array | null | undefined} chunk
|
|
119
|
+
* @returns {Promise<void>}
|
|
120
|
+
*/
|
|
121
|
+
async writeChunk(sink, chunk) {
|
|
122
|
+
if (chunk === null || chunk === undefined)
|
|
123
|
+
return;
|
|
124
|
+
if (typeof chunk === "string" && chunk.length === 0)
|
|
125
|
+
return;
|
|
126
|
+
await sink.write(chunk);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* @param {{abort: () => Promise<void>}} sink
|
|
130
|
+
* @returns {Promise<void>}
|
|
131
|
+
*/
|
|
132
|
+
async abortSink(sink) {
|
|
133
|
+
try {
|
|
134
|
+
await sink.abort();
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// Ignore secondary errors while cleaning up after a failed/aborted export.
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZXhwb3J0ZXIuanMiLCJzb3VyY2VSb290IjoiL3NyYy8iLCJzb3VyY2VzIjpbInRhYmxlL2V4cG9ydC90YWJsZS1leHBvcnRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBQ1osNEdBQTRHO0FBQzVHLG9FQUFvRTtBQUNwRSxtREFBbUQ7QUFDbkQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQTtBQUM5QixPQUFPLGFBQWEsTUFBTSxzQkFBc0IsQ0FBQTtBQUNoRCxPQUFPLGFBQWEsTUFBTSxtQkFBbUIsQ0FBQTtBQUM3QyxPQUFPLFNBQVMsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUN0RCxPQUFPLFVBQVUsTUFBTSxpQ0FBaUMsQ0FBQTtBQUN4RCxPQUFPLGtCQUFrQixNQUFNLDRCQUE0QixDQUFBO0FBQzNELE9BQU8sVUFBVSxNQUFNLGlDQUFpQyxDQUFBO0FBRXhELE1BQU0sT0FBTyxHQUFHO0lBQ2QsR0FBRyxFQUFFLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQztJQUM5RSxJQUFJLEVBQUUsRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFDO0lBQ2xGLElBQUksRUFBRSxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLG1FQUFtRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUM7Q0FDN0gsQ0FBQTtBQUVELDBEQUEwRDtBQUMxRCxNQUFNLE9BQU8sK0JBQWdDLFNBQVEsS0FBSztDQUFHO0FBRTdEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLHFCQUFxQjtJQUN4QyxpQ0FBaUM7SUFDakMsWUFBWSxFQUFDLFNBQVMsR0FBRyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFDO1FBQzFELElBQUks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RUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUN4SCxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUNoRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUs7UUFDMUIsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTTtRQUNqRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFNO1FBRTNELE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN6QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJO1FBQ2xCLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3BCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCwyRUFBMkU7UUFDN0UsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuLy8gVGhlIGV4cG9ydCBpcyBpbnRlbnRpb25hbGx5IHNlcXVlbnRpYWw6IGVhY2ggcGFnZSBpcyBmZXRjaGVkIGFuZCB3cml0dGVuIGJlZm9yZSB0aGUgbmV4dCBzbyBvbmx5IG9uZSBwYWdlXG4vLyBpcyBldmVyIGluIG1lbW9yeS4gVGhhdCByZXF1aXJlcyBhd2FpdGluZyBpbnNpZGUgdGhlIHBhZ2luZyBsb29wLlxuLyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCwgc29ydC1pbXBvcnRzICovXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0IGNvbHVtblZpc2libGUgZnJvbSBcIi4uL2NvbHVtbi12aXNpYmxlLmpzXCJcbmltcG9ydCBDb2x1bW5Db250ZW50IGZyb20gXCIuLi9jb2x1bW4tY29udGVudFwiXG5pbXBvcnQgQ3N2V3JpdGVyIGZyb20gXCIuL2Zvcm1hdC13cml0ZXJzL2Nzdi13cml0ZXIuanNcIlxuaW1wb3J0IEh0bWxXcml0ZXIgZnJvbSBcIi4vZm9ybWF0LXdyaXRlcnMvaHRtbC13cml0ZXIuanNcIlxuaW1wb3J0IG9wZW5FeHBvcnRGaWxlU2luayBmcm9tIFwiLi9vcGVuLWV4cG9ydC1maWxlLXNpbmsuanNcIlxuaW1wb3J0IFhsc3hXcml0ZXIgZnJvbSBcIi4vZm9ybWF0LXdyaXRlcnMveGxzeC13cml0ZXIuanNcIlxuXG5jb25zdCBGT1JNQVRTID0ge1xuICBjc3Y6IHtleHRlbnNpb246IFwiY3N2XCIsIG1pbWVUeXBlOiBcInRleHQvY3N2O2NoYXJzZXQ9dXRmLThcIiwgV3JpdGVyOiBDc3ZXcml0ZXJ9LFxuICBodG1sOiB7ZXh0ZW5zaW9uOiBcImh0bWxcIiwgbWltZVR5cGU6IFwidGV4dC9odG1sO2NoYXJzZXQ9dXRmLThcIiwgV3JpdGVyOiBIdG1sV3JpdGVyfSxcbiAgeGxzeDoge2V4dGVuc2lvbjogXCJ4bHN4XCIsIG1pbWVUeXBlOiBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0XCIsIFdyaXRlcjogWGxzeFdyaXRlcn1cbn1cblxuLyoqIFRocm93biB3aGVuIHRoZSB1c2VyIGNhbmNlbHMgYW4gaW4tcHJvZ3Jlc3MgZXhwb3J0LiAqL1xuZXhwb3J0IGNsYXNzIEFwaU1ha2VyVGFibGVFeHBvcnRBYm9ydGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7fVxuXG4vKipcbiAqIFN0cmVhbXMgYSB0YWJsZSdzIHdob2xlIHJlc3VsdCBzZXQgdG8gYSBmaWxlLCBmZXRjaGluZyBpdCBwYWdlLWJ5LXBhZ2UgYW5kIHdyaXRpbmcgZWFjaCBwYWdlIHN0cmFpZ2h0IHRvIGFcbiAqIGZpbGUgc2luaywgc28gb25seSBvbmUgcGFnZSAocGx1cyB0aGUgZm9ybWF0IHdyaXRlcidzIG93biBidWZmZXJpbmcpIGlzIGV2ZXIgaGVsZCBpbiBtZW1vcnkuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gRXhwb3J0ZXJBcmdzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2JhdGNoU2l6ZV1cbiAqIEBwcm9wZXJ0eSB7XCJjc3ZcIiB8IFwiaHRtbFwiIHwgXCJ4bHN4XCJ9IGZvcm1hdFxuICogQHByb3BlcnR5IHsoZm9ybWF0OiBzdHJpbmcsIHZhbHVlOiBEYXRlKSA9PiBzdHJpbmd9IGxcbiAqIEBwcm9wZXJ0eSB7KHByb2dyZXNzOiB7cGFnZTogbnVtYmVyLCB0b3RhbFBhZ2VzOiBudW1iZXIsIHdyaXR0ZW46IG51bWJlcn0pID0+IHZvaWR9IFtvblByb2dyZXNzXVxuICogQHByb3BlcnR5IHtvYmplY3R9IHRhYmxlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwaU1ha2VyVGFibGVFeHBvcnRlciB7XG4gIC8qKiBAcGFyYW0ge0V4cG9ydGVyQXJnc30gYXJncyAqL1xuICBjb25zdHJ1Y3Rvcih7YmF0Y2hTaXplID0gMTAwMCwgZm9ybWF0LCBsLCBvblByb2dyZXNzLCB0YWJsZX0pIHtcbiAgICB0aGlzLmJhdGNoU2l6ZSA9IGJhdGNoU2l6ZVxuICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0XG4gICAgdGhpcy5sID0gbFxuICAgIHRoaXMub25Qcm9ncmVzcyA9IG9uUHJvZ3Jlc3NcbiAgICB0aGlzLnRhYmxlID0gdGFibGVcbiAgICB0aGlzLmFib3J0ZWQgPSBmYWxzZVxuICB9XG5cbiAgYWJvcnQoKSB7XG4gICAgdGhpcy5hYm9ydGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHt3cml0dGVuOiBudW1iZXJ9Pn0gKi9cbiAgYXN5bmMgcnVuKCkge1xuICAgIGNvbnN0IGZvcm1hdENvbmZpZyA9IEZPUk1BVFNbdGhpcy5mb3JtYXRdXG5cbiAgICBpZiAoIWZvcm1hdENvbmZpZykgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGV4cG9ydCBmb3JtYXQ6ICR7dGhpcy5mb3JtYXR9YClcblxuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBmb3JtYXRDb25maWcuV3JpdGVyKClcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucygpXG4gICAgY29uc3QgbGFiZWxzID0gY29sdW1ucy5tYXAoKHByZXBhcmVkQ29sdW1uKSA9PiB0aGlzLnRhYmxlLmhlYWRlckxhYmVsRm9yQ29sdW1uKHByZXBhcmVkQ29sdW1uLmNvbHVtbikpXG4gICAgY29uc3QgZmlsZU5hbWUgPSBgJHt0aGlzLm1vZGVsTmFtZSgpfS4ke2Zvcm1hdENvbmZpZy5leHRlbnNpb259YFxuICAgIGNvbnN0IHNpbmsgPSBhd2FpdCBvcGVuRXhwb3J0RmlsZVNpbmsoe2ZpbGVOYW1lLCBmb3JtYXQ6IHRoaXMuZm9ybWF0LCBtaW1lVHlwZTogZm9ybWF0Q29uZmlnLm1pbWVUeXBlfSlcbiAgICBsZXQgd3JpdHRlbiA9IDBcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLndyaXRlQ2h1bmsoc2luaywgd3JpdGVyLmhlYWRlcihsYWJlbHMpKVxuXG4gICAgICBsZXQgcGFnZSA9IDFcbiAgICAgIGxldCB0b3RhbFBhZ2VzID0gMVxuXG4gICAgICBkbyB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYmFzZVF1ZXJ5KClcbiAgICAgICAgICAuY2xvbmUoKVxuICAgICAgICAgIC5wYWdlKHBhZ2UpXG4gICAgICAgICAgLnBlcih0aGlzLmJhdGNoU2l6ZSlcbiAgICAgICAgICAucmVzdWx0KClcblxuICAgICAgICBpZiAocGFnZSA9PT0gMSkgdG90YWxQYWdlcyA9IHJlc3VsdC50b3RhbFBhZ2VzKClcblxuICAgICAgICBsZXQgYnVmZmVyID0gXCJcIlxuXG4gICAgICAgIGZvciAoY29uc3QgbW9kZWwgb2YgcmVzdWx0Lm1vZGVscygpKSB7XG4gICAgICAgICAgaWYgKHRoaXMuYWJvcnRlZCkgdGhyb3cgbmV3IEFwaU1ha2VyVGFibGVFeHBvcnRBYm9ydGVkRXJyb3IoXCJFeHBvcnQgYWJvcnRlZFwiKVxuXG4gICAgICAgICAgY29uc3QgdmFsdWVzID0gY29sdW1ucy5tYXAoKHByZXBhcmVkQ29sdW1uKSA9PiB0aGlzLmNlbGxWYWx1ZShwcmVwYXJlZENvbHVtbiwgbW9kZWwpKVxuICAgICAgICAgIGNvbnN0IGNodW5rID0gd3JpdGVyLnJvdyh2YWx1ZXMpXG5cbiAgICAgICAgICBpZiAodHlwZW9mIGNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBidWZmZXIgKz0gY2h1bmtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGVDaHVuayhzaW5rLCBjaHVuaylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB3cml0dGVuICs9IDFcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChidWZmZXIubGVuZ3RoID4gMCkgYXdhaXQgc2luay53cml0ZShidWZmZXIpXG4gICAgICAgIGlmICh0aGlzLm9uUHJvZ3Jlc3MpIHRoaXMub25Qcm9ncmVzcyh7cGFnZSwgdG90YWxQYWdlcywgd3JpdHRlbn0pXG5cbiAgICAgICAgcGFnZSArPSAxXG4gICAgICB9IHdoaWxlIChwYWdlIDw9IHRvdGFsUGFnZXMpXG5cbiAgICAgIGF3YWl0IHRoaXMud3JpdGVDaHVuayhzaW5rLCBhd2FpdCB3cml0ZXIuZm9vdGVyKCkpXG4gICAgICBhd2FpdCBzaW5rLmNsb3NlKClcblxuICAgICAgcmV0dXJuIHt3cml0dGVufVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLmFib3J0U2luayhzaW5rKVxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7QXJyYXk8e2NvbHVtbjogb2JqZWN0LCB0YWJsZVNldHRpbmdDb2x1bW46IG9iamVjdH0+fSAqL1xuICB2aXNpYmxlQ29sdW1ucygpIHtcbiAgICBjb25zdCBwcmVwYXJlZENvbHVtbnMgPSB0aGlzLnRhYmxlLnMucHJlcGFyZWRDb2x1bW5zIHx8IFtdXG5cbiAgICByZXR1cm4gcHJlcGFyZWRDb2x1bW5zLmZpbHRlcigoe2NvbHVtbiwgdGFibGVTZXR0aW5nQ29sdW1ufSkgPT4gY29sdW1uVmlzaWJsZShjb2x1bW4sIHRhYmxlU2V0dGluZ0NvbHVtbikpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7Y29sdW1uOiBvYmplY3R9fSBwcmVwYXJlZENvbHVtblxuICAgKiBAcGFyYW0ge29iamVjdH0gbW9kZWxcbiAgICogQHJldHVybnMge3Vua25vd259XG4gICAqL1xuICBjZWxsVmFsdWUocHJlcGFyZWRDb2x1bW4sIG1vZGVsKSB7XG4gICAgcmV0dXJuIG5ldyBDb2x1bW5Db250ZW50KHtjb2x1bW46IHByZXBhcmVkQ29sdW1uLmNvbHVtbiwgbDogdGhpcy5sLCBtb2RlOiBcImh0bWxcIiwgbW9kZWwsIHRhYmxlOiB0aGlzLnRhYmxlfSkuY29udGVudCgpXG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgbW9kZWxOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRhYmxlLnAubW9kZWxDbGFzcy5tb2RlbE5hbWUoKS5odW1hbih7Y291bnQ6IDJ9KVxuICB9XG5cbiAgYmFzZVF1ZXJ5KCkge1xuICAgIHJldHVybiBkaWdnKHRoaXMudGFibGUudHQuY29sbGVjdGlvbiwgXCJxdWVyeVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7e3dyaXRlOiAoY2h1bms6IHN0cmluZyB8IFVpbnQ4QXJyYXkpID0+IFByb21pc2U8dm9pZD59fSBzaW5rXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVWludDhBcnJheSB8IG51bGwgfCB1bmRlZmluZWR9IGNodW5rXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd3JpdGVDaHVuayhzaW5rLCBjaHVuaykge1xuICAgIGlmIChjaHVuayA9PT0gbnVsbCB8fCBjaHVuayA9PT0gdW5kZWZpbmVkKSByZXR1cm5cbiAgICBpZiAodHlwZW9mIGNodW5rID09PSBcInN0cmluZ1wiICYmIGNodW5rLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBhd2FpdCBzaW5rLndyaXRlKGNodW5rKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7e2Fib3J0OiAoKSA9PiBQcm9taXNlPHZvaWQ+fX0gc2lua1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGFib3J0U2luayhzaW5rKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNpbmsuYWJvcnQoKVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWdub3JlIHNlY29uZGFyeSBlcnJvcnMgd2hpbGUgY2xlYW5pbmcgdXAgYWZ0ZXIgYSBmYWlsZWQvYWJvcnRlZCBleHBvcnQuXG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
declare const _default: React.NamedExoticComponent<Record<string, any>>;
|
|
2
2
|
export default _default;
|
|
3
|
+
/**
|
|
4
|
+
* Streams the whole table result set to a file (CSV / HTML / Excel) instead of building one big string in
|
|
5
|
+
* memory. Excel is only offered when the host app has registered an xlsx serializer via
|
|
6
|
+
* apiMakerConfig.setExportXlsxSerializer.
|
|
7
|
+
*/
|
|
3
8
|
export type Props = {
|
|
4
9
|
l: Function;
|
|
5
10
|
table: object;
|
|
6
11
|
};
|
|
7
|
-
export type State =
|
|
12
|
+
export type State = {
|
|
13
|
+
exporting: boolean;
|
|
14
|
+
};
|
|
8
15
|
import React from "react";
|
|
9
16
|
//# sourceMappingURL=download-action.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download-action.d.ts","sourceRoot":"/src/","sources":["table/settings/download-action.jsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"download-action.d.ts","sourceRoot":"/src/","sources":["table/settings/download-action.jsx"],"names":[],"mappings":";;;;;;;;;WAsBc,MAAM;;oBAEN;IAAC,SAAS,EAAE,OAAO,CAAA;CAAC;kBAbhB,OAAO"}
|
|
@@ -1,46 +1,73 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// @ts-check
|
|
3
|
-
/* eslint-disable
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
3
|
+
/* eslint-disable sort-imports */
|
|
4
|
+
import { ShapeComponent, shapeComponent } from "set-state-compare/build/shape-component.js";
|
|
5
|
+
import { FlashNotifications } from "flash-notifications";
|
|
6
|
+
import { Pressable, View } from "react-native";
|
|
7
|
+
import apiMakerConfig from "../../config.js";
|
|
8
|
+
import ApiMakerTableExporter, { ApiMakerTableExportAbortedError } from "../export/table-exporter";
|
|
8
9
|
import Icon from "../../utils/icon";
|
|
9
10
|
import memo from "set-state-compare/build/memo.js";
|
|
10
11
|
import PropTypes from "prop-types";
|
|
11
12
|
import propTypesExact from "prop-types-exact";
|
|
12
13
|
import React from "react";
|
|
13
|
-
import { renderToString } from "react-dom/server"; // eslint-disable-line import/no-unresolved
|
|
14
|
-
import { ShapeComponent, shapeComponent } from "set-state-compare/build/shape-component.js";
|
|
15
|
-
import { Pressable } from "react-native";
|
|
16
14
|
import Text from "../../utils/text";
|
|
15
|
+
import useI18n from "i18n-on-steroids/build/src/use-i18n.js";
|
|
17
16
|
/**
|
|
17
|
+
* Streams the whole table result set to a file (CSV / HTML / Excel) instead of building one big string in
|
|
18
|
+
* memory. Excel is only offered when the host app has registered an xlsx serializer via
|
|
19
|
+
* apiMakerConfig.setExportXlsxSerializer.
|
|
20
|
+
*
|
|
18
21
|
* @typedef {object} Props
|
|
19
22
|
* @property {Function} l
|
|
20
23
|
* @property {object} table
|
|
21
24
|
*/
|
|
22
|
-
/** @typedef {
|
|
25
|
+
/** @typedef {{exporting: boolean}} State */
|
|
23
26
|
export default memo(shapeComponent(/** @augments {ShapeComponent<Props, State>} */ class ApiMakerTableSettingsDownloadAction extends ShapeComponent {
|
|
24
27
|
static propTypes = propTypesExact({
|
|
25
28
|
l: PropTypes.func.isRequired,
|
|
26
29
|
table: PropTypes.object.isRequired
|
|
27
30
|
});
|
|
31
|
+
state = {
|
|
32
|
+
exporting: false
|
|
33
|
+
};
|
|
34
|
+
setup() {
|
|
35
|
+
const { t } = useI18n({ namespace: "js.api_maker.table.download_action" });
|
|
36
|
+
this.t = t;
|
|
37
|
+
}
|
|
28
38
|
render() {
|
|
29
|
-
|
|
39
|
+
const excelAvailable = Boolean(apiMakerConfig.getExportXlsxSerializer());
|
|
40
|
+
return (_jsxs(View, { dataSet: this.cache("rootViewDataSet", { component: "api-maker/table/settings/download-action" }), children: [_jsx(Text, { style: this.cache("labelStyle", { fontWeight: "bold", marginBottom: 4 }), children: this.t(".download", { defaultValue: "Download" }) }), this.formatButton({ format: "csv", label: "CSV", onPress: this.tt.onDownloadCsv }), this.formatButton({ format: "html", label: "HTML", onPress: this.tt.onDownloadHtml }), excelAvailable && this.formatButton({ format: "xlsx", label: "Excel", onPress: this.tt.onDownloadXlsx })] }));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* @param {{format: "csv" | "html" | "xlsx", label: string, onPress: () => void}} args
|
|
44
|
+
* @returns {import("react").ReactNode}
|
|
45
|
+
*/
|
|
46
|
+
formatButton({ format, label, onPress }) {
|
|
47
|
+
return (_jsxs(Pressable, { dataSet: this.cache(`download${format}DataSet`, { component: `api-maker/table/settings/download-action/${format}` }), disabled: this.s.exporting, onPress: onPress, style: this.cache("formatButtonStyle", { flexDirection: "row", alignItems: "center", paddingVertical: 3 }), testID: `download-action-${format}`, children: [_jsx(Icon, { name: "download", size: 18 }), _jsx(Text, { style: this.cache("formatLabelStyle", { marginLeft: 5 }), children: label })] }));
|
|
30
48
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
49
|
+
onDownloadCsv = () => this.startExport("csv");
|
|
50
|
+
onDownloadHtml = () => this.startExport("html");
|
|
51
|
+
onDownloadXlsx = () => this.startExport("xlsx");
|
|
52
|
+
/** @param {"csv" | "html" | "xlsx"} format */
|
|
53
|
+
startExport = async (format) => {
|
|
54
|
+
if (this.s.exporting)
|
|
55
|
+
return;
|
|
56
|
+
this.s.exporting = true;
|
|
57
|
+
const exporter = new ApiMakerTableExporter({ format, l: this.p.l, table: this.p.table });
|
|
58
|
+
try {
|
|
59
|
+
await exporter.run();
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (error instanceof ApiMakerTableExportAbortedError)
|
|
63
|
+
return;
|
|
64
|
+
if (error && /** @type {Error} */ (error).name === "AbortError")
|
|
65
|
+
return;
|
|
66
|
+
FlashNotifications.errorResponse(error);
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
this.s.exporting = false;
|
|
70
|
+
}
|
|
44
71
|
};
|
|
45
72
|
}));
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxvYWQtYWN0aW9uLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJ0YWJsZS9zZXR0aW5ncy9kb3dubG9hZC1hY3Rpb24uanN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxZQUFZO0FBQ1osaUNBQWlDO0FBQ2pDLE9BQU8sRUFBQyxjQUFjLEVBQUUsY0FBYyxFQUFDLE1BQU0sNENBQTRDLENBQUE7QUFDekYsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0scUJBQXFCLENBQUE7QUFDdEQsT0FBTyxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDNUMsT0FBTyxjQUFjLE1BQU0saUJBQWlCLENBQUE7QUFDNUMsT0FBTyxxQkFBcUIsRUFBRSxFQUFDLCtCQUErQixFQUFDLE1BQU0sMEJBQTBCLENBQUE7QUFDL0YsT0FBTyxJQUFJLE1BQU0sa0JBQWtCLENBQUE7QUFDbkMsT0FBTyxJQUFJLE1BQU0saUNBQWlDLENBQUE7QUFDbEQsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFBO0FBQ2xDLE9BQU8sY0FBYyxNQUFNLGtCQUFrQixDQUFBO0FBQzdDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUN6QixPQUFPLElBQUksTUFBTSxrQkFBa0IsQ0FBQTtBQUNuQyxPQUFPLE9BQU8sTUFBTSx3Q0FBd0MsQ0FBQTtBQUU1RDs7Ozs7Ozs7R0FRRztBQUNILDRDQUE0QztBQUM1QyxlQUFlLElBQUksQ0FBQyxjQUFjLENBQUMsK0NBQStDLENBQUMsTUFBTSxtQ0FBb0MsU0FBUSxjQUFjO0lBQ2pKLE1BQU0sQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDO1FBQ2hDLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVU7UUFDNUIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVTtLQUNuQyxDQUFDLENBQUE7SUFFRixLQUFLLEdBQUc7UUFDTixTQUFTLEVBQUUsS0FBSztLQUNqQixDQUFBO0lBRUQsS0FBSztRQUNILE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxPQUFPLENBQUMsRUFBQyxTQUFTLEVBQUUsb0NBQW9DLEVBQUMsQ0FBQyxDQUFBO1FBRXRFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ1osQ0FBQztJQUVELE1BQU07UUFDSixNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLHVCQUF1QixFQUFFLENBQUMsQ0FBQTtRQUV4RSxPQUFPLENBQ0wsTUFBQyxJQUFJLElBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsRUFBQyxTQUFTLEVBQUUsMENBQTBDLEVBQUMsQ0FBQyxhQUNuRyxLQUFDLElBQUksSUFBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUMsQ0FBQyxZQUN6RSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQUMsQ0FBQyxHQUMzQyxFQUNOLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFDLENBQUMsRUFDaEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUMsQ0FBQyxFQUNuRixjQUFjLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUMsQ0FBQyxJQUNsRyxDQUNSLENBQUE7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFBWSxDQUFDLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUM7UUFDbkMsT0FBTyxDQUNMLE1BQUMsU0FBUyxJQUNSLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsTUFBTSxTQUFTLEVBQUUsRUFBQyxTQUFTLEVBQUUsNENBQTRDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFDbEgsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUMxQixPQUFPLEVBQUUsT0FBTyxFQUNoQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxFQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFDLENBQUMsRUFDeEcsTUFBTSxFQUFFLG1CQUFtQixNQUFNLEVBQUUsYUFFbkMsS0FBQyxJQUFJLElBQUMsSUFBSSxFQUFDLFVBQVUsRUFBQyxJQUFJLEVBQUUsRUFBRSxHQUFJLEVBQ2xDLEtBQUMsSUFBSSxJQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLEVBQUMsVUFBVSxFQUFFLENBQUMsRUFBQyxDQUFDLFlBQ3pELEtBQUssR0FDRCxJQUNHLENBQ2IsQ0FBQTtJQUNILENBQUM7SUFFRCxhQUFhLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM3QyxjQUFjLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUMvQyxjQUFjLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUUvQyw4Q0FBOEM7SUFDOUMsV0FBVyxHQUFHLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUM3QixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUztZQUFFLE9BQU07UUFFNUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFBO1FBRXZCLE1BQU0sUUFBUSxHQUFHLElBQUkscUJBQXFCLENBQUMsRUFBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDLENBQUE7UUFFdEYsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDdEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLEtBQUssWUFBWSwrQkFBK0I7Z0JBQUUsT0FBTTtZQUM1RCxJQUFJLEtBQUssSUFBSSxvQkFBb0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxZQUFZO2dCQUFFLE9BQU07WUFFdkUsa0JBQWtCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3pDLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQTtRQUMxQixDQUFDO0lBQ0gsQ0FBQyxDQUFBO0NBQ0YsQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcbi8qIGVzbGludC1kaXNhYmxlIHNvcnQtaW1wb3J0cyAqL1xuaW1wb3J0IHtTaGFwZUNvbXBvbmVudCwgc2hhcGVDb21wb25lbnR9IGZyb20gXCJzZXQtc3RhdGUtY29tcGFyZS9idWlsZC9zaGFwZS1jb21wb25lbnQuanNcIlxuaW1wb3J0IHtGbGFzaE5vdGlmaWNhdGlvbnN9IGZyb20gXCJmbGFzaC1ub3RpZmljYXRpb25zXCJcbmltcG9ydCB7UHJlc3NhYmxlLCBWaWV3fSBmcm9tIFwicmVhY3QtbmF0aXZlXCJcbmltcG9ydCBhcGlNYWtlckNvbmZpZyBmcm9tIFwiLi4vLi4vY29uZmlnLmpzXCJcbmltcG9ydCBBcGlNYWtlclRhYmxlRXhwb3J0ZXIsIHtBcGlNYWtlclRhYmxlRXhwb3J0QWJvcnRlZEVycm9yfSBmcm9tIFwiLi4vZXhwb3J0L3RhYmxlLWV4cG9ydGVyXCJcbmltcG9ydCBJY29uIGZyb20gXCIuLi8uLi91dGlscy9pY29uXCJcbmltcG9ydCBtZW1vIGZyb20gXCJzZXQtc3RhdGUtY29tcGFyZS9idWlsZC9tZW1vLmpzXCJcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIlxuaW1wb3J0IHByb3BUeXBlc0V4YWN0IGZyb20gXCJwcm9wLXR5cGVzLWV4YWN0XCJcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFRleHQgZnJvbSBcIi4uLy4uL3V0aWxzL3RleHRcIlxuaW1wb3J0IHVzZUkxOG4gZnJvbSBcImkxOG4tb24tc3Rlcm9pZHMvYnVpbGQvc3JjL3VzZS1pMThuLmpzXCJcblxuLyoqXG4gKiBTdHJlYW1zIHRoZSB3aG9sZSB0YWJsZSByZXN1bHQgc2V0IHRvIGEgZmlsZSAoQ1NWIC8gSFRNTCAvIEV4Y2VsKSBpbnN0ZWFkIG9mIGJ1aWxkaW5nIG9uZSBiaWcgc3RyaW5nIGluXG4gKiBtZW1vcnkuIEV4Y2VsIGlzIG9ubHkgb2ZmZXJlZCB3aGVuIHRoZSBob3N0IGFwcCBoYXMgcmVnaXN0ZXJlZCBhbiB4bHN4IHNlcmlhbGl6ZXIgdmlhXG4gKiBhcGlNYWtlckNvbmZpZy5zZXRFeHBvcnRYbHN4U2VyaWFsaXplci5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcm9wc1xuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gbFxuICogQHByb3BlcnR5IHtvYmplY3R9IHRhYmxlXG4gKi9cbi8qKiBAdHlwZWRlZiB7e2V4cG9ydGluZzogYm9vbGVhbn19IFN0YXRlICovXG5leHBvcnQgZGVmYXVsdCBtZW1vKHNoYXBlQ29tcG9uZW50KC8qKiBAYXVnbWVudHMge1NoYXBlQ29tcG9uZW50PFByb3BzLCBTdGF0ZT59ICovIGNsYXNzIEFwaU1ha2VyVGFibGVTZXR0aW5nc0Rvd25sb2FkQWN0aW9uIGV4dGVuZHMgU2hhcGVDb21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0gcHJvcFR5cGVzRXhhY3Qoe1xuICAgIGw6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgdGFibGU6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZFxuICB9KVxuXG4gIHN0YXRlID0ge1xuICAgIGV4cG9ydGluZzogZmFsc2VcbiAgfVxuXG4gIHNldHVwKCkge1xuICAgIGNvbnN0IHt0fSA9IHVzZUkxOG4oe25hbWVzcGFjZTogXCJqcy5hcGlfbWFrZXIudGFibGUuZG93bmxvYWRfYWN0aW9uXCJ9KVxuXG4gICAgdGhpcy50ID0gdFxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGV4Y2VsQXZhaWxhYmxlID0gQm9vbGVhbihhcGlNYWtlckNvbmZpZy5nZXRFeHBvcnRYbHN4U2VyaWFsaXplcigpKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxWaWV3IGRhdGFTZXQ9e3RoaXMuY2FjaGUoXCJyb290Vmlld0RhdGFTZXRcIiwge2NvbXBvbmVudDogXCJhcGktbWFrZXIvdGFibGUvc2V0dGluZ3MvZG93bmxvYWQtYWN0aW9uXCJ9KX0+XG4gICAgICAgIDxUZXh0IHN0eWxlPXt0aGlzLmNhY2hlKFwibGFiZWxTdHlsZVwiLCB7Zm9udFdlaWdodDogXCJib2xkXCIsIG1hcmdpbkJvdHRvbTogNH0pfT5cbiAgICAgICAgICB7dGhpcy50KFwiLmRvd25sb2FkXCIsIHtkZWZhdWx0VmFsdWU6IFwiRG93bmxvYWRcIn0pfVxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIHt0aGlzLmZvcm1hdEJ1dHRvbih7Zm9ybWF0OiBcImNzdlwiLCBsYWJlbDogXCJDU1ZcIiwgb25QcmVzczogdGhpcy50dC5vbkRvd25sb2FkQ3N2fSl9XG4gICAgICAgIHt0aGlzLmZvcm1hdEJ1dHRvbih7Zm9ybWF0OiBcImh0bWxcIiwgbGFiZWw6IFwiSFRNTFwiLCBvblByZXNzOiB0aGlzLnR0Lm9uRG93bmxvYWRIdG1sfSl9XG4gICAgICAgIHtleGNlbEF2YWlsYWJsZSAmJiB0aGlzLmZvcm1hdEJ1dHRvbih7Zm9ybWF0OiBcInhsc3hcIiwgbGFiZWw6IFwiRXhjZWxcIiwgb25QcmVzczogdGhpcy50dC5vbkRvd25sb2FkWGxzeH0pfVxuICAgICAgPC9WaWV3PlxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3tmb3JtYXQ6IFwiY3N2XCIgfCBcImh0bWxcIiB8IFwieGxzeFwiLCBsYWJlbDogc3RyaW5nLCBvblByZXNzOiAoKSA9PiB2b2lkfX0gYXJnc1xuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwicmVhY3RcIikuUmVhY3ROb2RlfVxuICAgKi9cbiAgZm9ybWF0QnV0dG9uKHtmb3JtYXQsIGxhYmVsLCBvblByZXNzfSkge1xuICAgIHJldHVybiAoXG4gICAgICA8UHJlc3NhYmxlXG4gICAgICAgIGRhdGFTZXQ9e3RoaXMuY2FjaGUoYGRvd25sb2FkJHtmb3JtYXR9RGF0YVNldGAsIHtjb21wb25lbnQ6IGBhcGktbWFrZXIvdGFibGUvc2V0dGluZ3MvZG93bmxvYWQtYWN0aW9uLyR7Zm9ybWF0fWB9KX1cbiAgICAgICAgZGlzYWJsZWQ9e3RoaXMucy5leHBvcnRpbmd9XG4gICAgICAgIG9uUHJlc3M9e29uUHJlc3N9XG4gICAgICAgIHN0eWxlPXt0aGlzLmNhY2hlKFwiZm9ybWF0QnV0dG9uU3R5bGVcIiwge2ZsZXhEaXJlY3Rpb246IFwicm93XCIsIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsIHBhZGRpbmdWZXJ0aWNhbDogM30pfVxuICAgICAgICB0ZXN0SUQ9e2Bkb3dubG9hZC1hY3Rpb24tJHtmb3JtYXR9YH1cbiAgICAgID5cbiAgICAgICAgPEljb24gbmFtZT1cImRvd25sb2FkXCIgc2l6ZT17MTh9IC8+XG4gICAgICAgIDxUZXh0IHN0eWxlPXt0aGlzLmNhY2hlKFwiZm9ybWF0TGFiZWxTdHlsZVwiLCB7bWFyZ2luTGVmdDogNX0pfT5cbiAgICAgICAgICB7bGFiZWx9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvUHJlc3NhYmxlPlxuICAgIClcbiAgfVxuXG4gIG9uRG93bmxvYWRDc3YgPSAoKSA9PiB0aGlzLnN0YXJ0RXhwb3J0KFwiY3N2XCIpXG4gIG9uRG93bmxvYWRIdG1sID0gKCkgPT4gdGhpcy5zdGFydEV4cG9ydChcImh0bWxcIilcbiAgb25Eb3dubG9hZFhsc3ggPSAoKSA9PiB0aGlzLnN0YXJ0RXhwb3J0KFwieGxzeFwiKVxuXG4gIC8qKiBAcGFyYW0ge1wiY3N2XCIgfCBcImh0bWxcIiB8IFwieGxzeFwifSBmb3JtYXQgKi9cbiAgc3RhcnRFeHBvcnQgPSBhc3luYyAoZm9ybWF0KSA9PiB7XG4gICAgaWYgKHRoaXMucy5leHBvcnRpbmcpIHJldHVyblxuXG4gICAgdGhpcy5zLmV4cG9ydGluZyA9IHRydWVcblxuICAgIGNvbnN0IGV4cG9ydGVyID0gbmV3IEFwaU1ha2VyVGFibGVFeHBvcnRlcih7Zm9ybWF0LCBsOiB0aGlzLnAubCwgdGFibGU6IHRoaXMucC50YWJsZX0pXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhwb3J0ZXIucnVuKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQXBpTWFrZXJUYWJsZUV4cG9ydEFib3J0ZWRFcnJvcikgcmV0dXJuXG4gICAgICBpZiAoZXJyb3IgJiYgLyoqIEB0eXBlIHtFcnJvcn0gKi8gKGVycm9yKS5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuXG5cbiAgICAgIEZsYXNoTm90aWZpY2F0aW9ucy5lcnJvclJlc3BvbnNlKGVycm9yKVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnMuZXhwb3J0aW5nID0gZmFsc2VcbiAgICB9XG4gIH1cbn0pKVxuIl19
|