@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.
Files changed (28) hide show
  1. package/build/config.d.ts +21 -0
  2. package/build/config.d.ts.map +1 -1
  3. package/build/config.js +24 -1
  4. package/build/table/export/cell-value.d.ts +3 -0
  5. package/build/table/export/cell-value.d.ts.map +1 -0
  6. package/build/table/export/cell-value.js +47 -0
  7. package/build/table/export/file-sinks/web-file-sink.d.ts +53 -0
  8. package/build/table/export/file-sinks/web-file-sink.d.ts.map +1 -0
  9. package/build/table/export/file-sinks/web-file-sink.js +75 -0
  10. package/build/table/export/format-writers/csv-writer.d.ts +30 -0
  11. package/build/table/export/format-writers/csv-writer.d.ts.map +1 -0
  12. package/build/table/export/format-writers/csv-writer.js +47 -0
  13. package/build/table/export/format-writers/html-writer.d.ts +20 -0
  14. package/build/table/export/format-writers/html-writer.d.ts.map +1 -0
  15. package/build/table/export/format-writers/html-writer.js +30 -0
  16. package/build/table/export/format-writers/xlsx-writer.d.ts +23 -0
  17. package/build/table/export/format-writers/xlsx-writer.d.ts.map +1 -0
  18. package/build/table/export/format-writers/xlsx-writer.js +41 -0
  19. package/build/table/export/open-export-file-sink.d.ts +19 -0
  20. package/build/table/export/open-export-file-sink.d.ts.map +1 -0
  21. package/build/table/export/open-export-file-sink.js +26 -0
  22. package/build/table/export/table-exporter.d.ts +80 -0
  23. package/build/table/export/table-exporter.d.ts.map +1 -0
  24. package/build/table/export/table-exporter.js +141 -0
  25. package/build/table/settings/download-action.d.ts +8 -1
  26. package/build/table/settings/download-action.d.ts.map +1 -1
  27. package/build/table/settings/download-action.js +51 -24
  28. 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
@@ -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;AAyJnD,6CAA2C;6BArKhB,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;CAC7E"}
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJjb25maWcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUNaLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUE7QUFDMUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUEsQ0FBQyxtQ0FBbUM7QUFFNUUsdUVBQXVFO0FBQ3ZFLDhEQUE4RDtBQUM5RCxpREFBaUQ7QUFDakQsZ0ZBQWdGO0FBQ2hGOztHQUVHO0FBQ0g7OztHQUdHO0FBRUgsTUFBTSxTQUFTLEdBQUc7SUFDaEIsV0FBVyxFQUFFO1FBQ1gsT0FBTyxFQUFFO1lBQ1AsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO1lBQ2IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO1lBQ1osQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1lBQ1gsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1lBQ1gsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1lBQ1gsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ1Y7UUFDRCxRQUFRLEVBQUUsSUFBSTtLQUNmO0lBQ0QsUUFBUSxFQUFFLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQztJQUMxQixvQkFBb0IsRUFBRSxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUM7SUFDdEMsMEJBQTBCLEVBQUUsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7SUFDNUQsT0FBTyxFQUFFLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQztJQUN6QixJQUFJLEVBQUUsRUFBQyxRQUFRLEVBQUUsS0FBSyxFQUFDO0lBQ3ZCLElBQUksRUFBRSxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUM7SUFDdkIsTUFBTSxFQUFFLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQztJQUN4QixLQUFLLEVBQUUsRUFBQyxRQUFRLEVBQUUsS0FBSyxFQUFDO0lBQ3hCLFVBQVUsRUFB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Q0FBQTtZQUNuRSxJQUFJLFlBQVksQ0FBQyxRQUFRO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxZQUFZLGtCQUFrQixDQUFDLENBQUE7UUFDL0UsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFdkMsSUFBSSxPQUFPLEtBQUssSUFBSSxVQUFVO1lBQUUsT0FBTyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTtRQUVyRCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUMsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFBO0FBRTNDLGVBQWUsY0FBYyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSBcImV2ZW50ZW1pdHRlcjNcIlxuaW1wb3J0ICogYXMgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgc29ydC1pbXBvcnRzXG5cbi8qKiBAdHlwZWRlZiB7W25hbWU6IHN0cmluZywgbWluV2lkdGg6IG51bWJlcl19IEJyZWFrcG9pbnREZWZpbml0aW9uICovXG4vKiogQHR5cGVkZWYge1tsYWJlbDogc3RyaW5nLCBjb2RlOiBzdHJpbmddfSBDdXJyZW5jeU9wdGlvbiAqL1xuLyoqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+fSBSb3V0ZU1hcCAqL1xuLyoqIEB0eXBlZGVmIHt7cm91dGVzOiBBcnJheTx7bmFtZTogc3RyaW5nLCBwYXRoOiBzdHJpbmd9Pn19IFJvdXRlRGVmaW5pdGlvbnMgKi9cbi8qKlxuICogQHR5cGVkZWYge3tlbWl0OiAoZXZlbnROYW1lOiBzdHJpbmcsIHBheWxvYWQ6IHtvbGRWYWx1ZTogQ29uZmlnVmFsdWUsIG5ld1ZhbHVlOiBDb25maWdWYWx1ZX0pID0+IHZvaWR9fSBDb25maWdFdmVudHNcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7QnJlYWtwb2ludERlZmluaXRpb25bXSB8IEN1cnJlbmN5T3B0aW9uW10gfCBSb3V0ZU1hcCB8IFJvdXRlRGVmaW5pdGlvbnMgfCBFdmVudEVtaXR0ZXIgfFxuICogICBib29sZWFuIHwgbnVtYmVyIHwgb2JqZWN0IHwgc3RyaW5nIHwgdW5kZWZpbmVkfSBDb25maWdWYWx1ZVxuICovXG5cbmNvbnN0IGFjY2Vzc29ycyA9IHtcbiAgYnJlYWtwb2ludHM6IHtcbiAgICBkZWZhdWx0OiBbXG4gICAgICBbXCJ4eGxcIiwgMTQwMF0sXG4gICAgICBbXCJ4bFwiLCAxMjAwXSxcbiAgICAgIFtcImxnXCIsIDk5Ml0sXG4gICAgICBbXCJtZFwiLCA3NjhdLFxuICAgICAgW1wic21cIiwgNTc2XSxcbiAgICAgIFtcInhzXCIsIDBdXG4gICAgXSxcbiAgICByZXF1aXJlZDogdHJ1ZVxuICB9LFxuICBjYWJsZVVybDoge3JlcXVpcmU6IGZhbHNlfSxcbiAgY3VycmVuY2llc0NvbGxlY3Rpb246IHtyZXF1aXJlZDogdHJ1ZX0sXG4gIGRhbmdlcm91c1Jvd0NvdW50VGhyZXNob2xkOiB7ZGVmYXVsdDogMTAwMCwgcmVxdWlyZWQ6IGZhbHNlfSxcbiAgaGlzdG9yeToge3JlcXVpcmVkOiB0cnVlfSxcbiAgaG9zdDoge3JlcXVpcmVkOiBmYWxzZX0sXG4gIGkxOG46IHtyZXF1aXJlZDogZmFsc2V9LFxuICBsaW5rVG86IHtyZXF1aXJlZDogdHJ1ZX0sXG4gIG1vZGFsOiB7cmVxdWlyZWQ6IGZhbHNlfSxcbiAgbmF2aWdhdGlvbjoge3JlcXVpcmVkOiB0cnVlfSxcbiAgcm91dGVzOiB7cmVxdWlyZWQ6IGZhbHNlfSxcbiAgcm91dGVEZWZpbml0aW9uczoge3JlcXVpcmVkOiBmYWxzZX0sXG4gIHVzZUh0bWxGb3JtOiB7ZGVmYXVsdDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZX0sXG4gIHdlYnNvY2tldFJlcXVlc3RzOiB7cmVxdWlyZWQ6IGZhbHNlfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lXG4gKiBAcmV0dXJucyB7bmV2ZXJ9XG4gKi9cbmNvbnN0IGFwaU1ha2VyQ29uZmlnTm90SW1wbGVtZW50ZWQgPSAobWV0aG9kTmFtZSkgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoYCcke21ldGhvZE5hbWV9JyBub3QgaW1wbGVtZW50ZWRgKVxufVxuXG4vKiogU3RvcmVzIGdsb2JhbGx5IGNvbmZpZ3VyZWQgQXBpIE1ha2VyIGludGVncmF0aW9uIGhvb2tzIGFuZCBydW50aW1lIGRlcGVuZGVuY2llcy4gKi9cbmNsYXNzIEFwaU1ha2VyQ29uZmlnIHtcbiAgLyoqIEluaXRpYWxpemVzIHRoZSBzaGFyZWQgY29uZmlnIHN0YXRlIGFuZCBjaGFuZ2UgZW1pdHRlci4gKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKCFnbG9iYWxUaGlzLmFwaU1ha2VyQ29uZmlnR2xvYmFsKSBnbG9iYWxUaGlzLmFwaU1ha2VyQ29uZmlnR2xvYmFsID0ge31cblxuICAgIHRoaXMuZ2xvYmFsID0gZ2xvYmFsVGhpcy5hcGlNYWtlckNvbmZpZ0dsb2JhbFxuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50RW1pdHRlcigpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXZlbnQgZW1pdHRlciB1c2VkIGZvciBjb25maWcgY2hhbmdlIG5vdGlmaWNhdGlvbnMuXG4gICAqIEByZXR1cm5zIHtDb25maWdFdmVudHN9XG4gICAqL1xuICBnZXRFdmVudHMoKSB7IHJldHVybiB0aGlzLmV2ZW50cyB9XG5cbiAgLyoqIEByZXR1cm5zIHtpbXBvcnQoXCJoaXN0b3J5XCIpLkJyb3dzZXJIaXN0b3J5fSAqL1xuICBnZXRIaXN0b3J5KCkge1xuICAgIHJldHVybiBhcGlNYWtlckNvbmZpZ05vdEltcGxlbWVudGVkKFwiZ2V0SGlzdG9yeVwiKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmd9ICovXG4gIGdldEhvc3QoKSB7XG4gICAgcmV0dXJuIGFwaU1ha2VyQ29uZmlnTm90SW1wbGVtZW50ZWQoXCJnZXRIb3N0XCIpXG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gKi9cbiAgZ2V0Q2FibGVVcmwoKSB7XG4gICAgcmV0dXJuIGFwaU1ha2VyQ29uZmlnTm90SW1wbGVtZW50ZWQoXCJnZXRDYWJsZVVybFwiKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXJ9ICovXG4gIGdldERhbmdlcm91c1Jvd0NvdW50VGhyZXNob2xkKCkge1xuICAgIHJldHVybiBhcGlNYWtlckNvbmZpZ05vdEltcGxlbWVudGVkKFwiZ2V0RGFuZ2Vyb3VzUm93Q291bnRUaHJlc2hvbGRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gX25ld1ZhbHVlXG4gICAqL1xuICBzZXREYW5nZXJvdXNSb3dDb3VudFRocmVzaG9sZChfbmV3VmFsdWUpIHsgYXBpTWFrZXJDb25maWdOb3RJbXBsZW1lbnRlZChcInNldERhbmdlcm91c1Jvd0NvdW50VGhyZXNob2xkXCIpIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IF9uZXdWYWx1ZVxuICAgKi9cbiAgc2V0Q2FibGVVcmwoX25ld1ZhbHVlKSB7IGFwaU1ha2VyQ29uZmlnTm90SW1wbGVtZW50ZWQoXCJzZXRDYWJsZVVybFwiKSB9XG5cbiAgLyoqIEByZXR1cm5zIHtib29sZWFuIHwgdW5kZWZpbmVkfSAqL1xuICBnZXRXZWJzb2NrZXRSZXF1ZXN0cygpIHtcbiAgICByZXR1cm4gYXBpTWFrZXJDb25maWdOb3RJbXBsZW1lbnRlZChcImdldFdlYnNvY2tldFJlcXVlc3RzXCIpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtib29sZWFuIHwgdW5kZWZpbmVkfSBfbmV3VmFsdWVcbiAgICovXG4gIHNldFdlYnNvY2tldFJlcXVlc3RzKF9uZXdWYWx1ZSkgeyBhcGlNYWtlckNvbmZpZ05vdEltcGxlbWVudGVkKFwic2V0V2Vic29ja2V0UmVxdWVzdHNcIikgfVxuXG4gIC8qKiBAcmV0dXJucyB7QXJyYXk8Q3VycmVuY3lPcHRpb24+fSAqL1xuICBnZXRDdXJyZW5jaWVzQ29sbGVjdGlvbigpIHtcbiAgICByZXR1cm4gYXBpTWFrZXJDb25maWdOb3RJbXBsZW1lbnRlZChcImdldEN1cnJlbmNpZXNDb2xsZWN0aW9uXCIpXG4gIH1cblxuICAvKiogQHJldHVybnMge29iamVjdH0gKi9cbiAgZ2V0TW9kYWwoKSB7XG4gICAgcmV0dXJuIGFwaU1ha2VyQ29uZmlnTm90SW1wbGVtZW50ZWQoXCJnZXRNb2RhbFwiKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtSb3V0ZURlZmluaXRpb25zfSAqL1xuICBnZXRSb3V0ZURlZmluaXRpb25zKCkge1xuICAgIHJldHVybiBhcGlNYWtlckNvbmZpZ05vdEltcGxlbWVudGVkKFwiZ2V0Um91dGVEZWZpbml0aW9uc1wiKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtSb3V0ZU1hcH0gKi9cbiAgZ2V0Um91dGVzKCkge1xuICAgIHJldHVybiBhcGlNYWtlckNvbmZpZ05vdEltcGxlbWVudGVkKFwiZ2V0Um91dGVzXCIpXG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59ICovXG4gIGdldFVzZUh0bWxGb3JtKCkge1xuICAgIHJldHVybiBhcGlNYWtlckNvbmZpZ05vdEltcGxlbWVudGVkKFwiZ2V0VXNlSHRtbEZvcm1cIilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IF9uZXdWYWx1ZVxuICAgKi9cbiAgc2V0VXNlSHRtbEZvcm0oX25ld1ZhbHVlKSB7IGFwaU1ha2VyQ29uZmlnTm90SW1wbGVtZW50ZWQoXCJzZXRVc2VIdG1sRm9ybVwiKSB9XG5cbiAgLy8gVGFibGUgZXhwb3J0IGhvb2tzLiBUaGVzZSBob2xkIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCBhcy1pcyAobm90IGludm9rZWQpLCBzbyB0aGV5IHVzZVxuICAvLyBleHBsaWNpdCBhY2Nlc3NvcnMgaW5zdGVhZCBvZiB0aGUgZ2VuZXJpYyBhY2Nlc3NvciBsb29wIGJlbG93ICh3aGljaCB3b3VsZCBjYWxsIGZ1bmN0aW9uIHZhbHVlcykuXG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgc3RyZWFtaW5nIGZpbGUgc2luayBmb3IgdGFibGUgZXhwb3J0cyBvbiBwbGF0Zm9ybXMgd2l0aG91dCBhIHdlYiBkZWZhdWx0IChlLmcuIFJlYWN0XG4gICAqIE5hdGl2ZS9FeHBvKS4gUmVjZWl2ZXMgYHtmaWxlTmFtZSwgbWltZVR5cGUsIGZvcm1hdH1gIGFuZCByZXR1cm5zIGEgc2lua1xuICAgKiBge3dyaXRlKGNodW5rKSwgY2xvc2UoKSwgYWJvcnQoKX1gLlxuICAgKiBAcmV0dXJucyB7KChhcmdzOiBvYmplY3QpID0+IFByb21pc2U8b2JqZWN0PikgfCB1bmRlZmluZWR9XG4gICAqL1xuICBnZXRFeHBvcnRGaWxlU2lua09wZW5lcigpIHsgcmV0dXJuIHRoaXMuZ2xvYmFsLmV4cG9ydEZpbGVTaW5rT3BlbmVyIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsoKGFyZ3M6IG9iamVjdCkgPT4gUHJvbWlzZTxvYmplY3Q+KSB8IHVuZGVmaW5lZH0gb3BlbmVyXG4gICAqL1xuICBzZXRFeHBvcnRGaWxlU2lua09wZW5lcihvcGVuZXIpIHsgdGhpcy5nbG9iYWwuZXhwb3J0RmlsZVNpbmtPcGVuZXIgPSBvcGVuZXIgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGFuIGFycmF5LW9mLWFycmF5cyAoaGVhZGVyICsgcm93cykgaW50byB4bHN4IGJ5dGVzLCBlbmFibGluZyB0aGUgb3B0aW9uYWwgRXhjZWwgZXhwb3J0IGZvcm1hdFxuICAgKiB3aXRob3V0IGFwaV9tYWtlciBkZXBlbmRpbmcgb24gYSBzcHJlYWRzaGVldCBsaWJyYXJ5LiBSZXR1cm5zIGEgYFVpbnQ4QXJyYXlgIChvciBhIHByb21pc2Ugb2Ygb25lKS5cbiAgICogQHJldHVybnMgeygocm93czogQXJyYXk8QXJyYXk8dW5rbm93bj4+KSA9PiBVaW50OEFycmF5IHwgUHJvbWlzZTxVaW50OEFycmF5PikgfCB1bmRlZmluZWR9XG4gICAqL1xuICBnZXRFeHBvcnRYbHN4U2VyaWFsaXplcigpIHsgcmV0dXJuIHRoaXMuZ2xvYmFsLmV4cG9ydFhsc3hTZXJpYWxpemVyIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsoKHJvd3M6IEFycmF5PEFycmF5PHVua25vd24+PikgPT4gVWludDhBcnJheSB8IFByb21pc2U8VWludDhBcnJheT4pIHwgdW5kZWZpbmVkfSBzZXJpYWxpemVyXG4gICAqL1xuICBzZXRFeHBvcnRYbHN4U2VyaWFsaXplcihzZXJpYWxpemVyKSB7IHRoaXMuZ2xvYmFsLmV4cG9ydFhsc3hTZXJpYWxpemVyID0gc2VyaWFsaXplciB9XG59XG5cbmZvciAoY29uc3QgYWNjZXNzb3JOYW1lIGluIGFjY2Vzc29ycykge1xuICBjb25zdCBhY2Nlc3NvckRhdGEgPSBhY2Nlc3NvcnNbYWNjZXNzb3JOYW1lXVxuICBjb25zdCBjYW1lbGl6ZWRBY2Nlc3NvciA9IGluZmxlY3Rpb24uY2FtZWxpemUoYWNjZXNzb3JOYW1lKVxuXG4gIEFwaU1ha2VyQ29uZmlnLnByb3RvdHlwZVtgc2V0JHtjYW1lbGl6ZWRBY2Nlc3Nvcn1gXSA9IGZ1bmN0aW9uIChuZXdWYWx1ZSkge1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5nbG9iYWxbYWNjZXNzb3JOYW1lXVxuXG4gICAgdGhpcy5nbG9iYWxbYWNjZXNzb3JOYW1lXSA9IG5ld1ZhbHVlXG5cbiAgICBpZiAob2xkVmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICB0aGlzLmV2ZW50cy5lbWl0KGBvbiR7Y2FtZWxpemVkQWNjZXNzb3J9Q2hhbmdlYCwge29sZFZhbHVlLCBuZXdWYWx1ZX0pXG4gICAgfVxuICB9XG5cbiAgQXBpTWFrZXJDb25maWcucHJvdG90eXBlW2BnZXQke2NhbWVsaXplZEFjY2Vzc29yfWBdID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICBpZiAodGhpcy5nbG9iYWxbYWNjZXNzb3JOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoYWNjZXNzb3JEYXRhLmRlZmF1bHQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGFjY2Vzc29yRGF0YS5kZWZhdWx0XG4gICAgICBpZiAoYWNjZXNzb3JEYXRhLnJlcXVpcmVkKSB0aHJvdyBuZXcgRXJyb3IoYCR7YWNjZXNzb3JOYW1lfSBoYXNuJ3QgYmVlbiBzZXRgKVxuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nbG9iYWxbYWNjZXNzb3JOYW1lXVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB2YWx1ZSguLi5hcmdzKVxuXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbn1cblxuY29uc3QgYXBpTWFrZXJDb25maWcgPSBuZXcgQXBpTWFrZXJDb25maWcoKVxuXG5leHBvcnQgZGVmYXVsdCBhcGlNYWtlckNvbmZpZ1xuIl19
@@ -0,0 +1,3 @@
1
+ export function cellToText(value: unknown): string;
2
+ export function cellToHtml(value: unknown): string;
3
+ //# sourceMappingURL=cell-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell-value.d.ts","sourceRoot":"/src/","sources":["table/export/cell-value.js"],"names":[],"mappings":"AAwCO,kCAHI,OAAO,GACL,MAAM,CAEwF;AAOpG,kCAHI,OAAO,GACL,MAAM,CAE+C"}
@@ -0,0 +1,47 @@
1
+ // @ts-check
2
+ /* eslint-disable sort-imports */
3
+ import React from "react";
4
+ /**
5
+ * @param {unknown} value
6
+ * @returns {string}
7
+ */
8
+ const toText = (value) => (value === null || value === undefined ? "" : String(value));
9
+ /**
10
+ * Recursively extracts the text content of a React node without rendering it, so the export path stays
11
+ * lightweight and SSR-/test-safe (no react-dom/server). A column's custom `content` can return a React
12
+ * element even in "html" mode; this keeps such cells exporting their text instead of "[object Object]".
13
+ * @param {unknown} node
14
+ * @returns {string}
15
+ */
16
+ const reactNodeToText = (node) => {
17
+ if (node === null || node === undefined || typeof node === "boolean")
18
+ return "";
19
+ if (typeof node === "string" || typeof node === "number")
20
+ return String(node);
21
+ if (Array.isArray(node))
22
+ return node.map(reactNodeToText).join("");
23
+ if (React.isValidElement(node))
24
+ return reactNodeToText(/** @type {{props?: {children?: unknown}}} */ (node).props?.children);
25
+ return "";
26
+ };
27
+ /**
28
+ * @param {string} text
29
+ * @returns {string}
30
+ */
31
+ const escapeHtml = (text) => text
32
+ .replace(/&/g, "&amp;")
33
+ .replace(/</g, "&lt;")
34
+ .replace(/>/g, "&gt;");
35
+ /**
36
+ * Plain text value of a cell, for CSV/Excel.
37
+ * @param {unknown} value
38
+ * @returns {string}
39
+ */
40
+ export const cellToText = (value) => (React.isValidElement(value) ? reactNodeToText(value) : toText(value));
41
+ /**
42
+ * HTML-escaped text value of a cell, for the HTML export.
43
+ * @param {unknown} value
44
+ * @returns {string}
45
+ */
46
+ export const cellToHtml = (value) => escapeHtml(cellToText(value));
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbC12YWx1ZS5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsidGFibGUvZXhwb3J0L2NlbGwtdmFsdWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUNaLGlDQUFpQztBQUNqQyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7QUFFekI7OztHQUdHO0FBQ0gsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0FBRXRGOzs7Ozs7R0FNRztBQUNILE1BQU0sZUFBZSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUU7SUFDL0IsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksT0FBTyxJQUFJLEtBQUssU0FBUztRQUFFLE9BQU8sRUFBRSxDQUFBO0lBQy9FLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUM3RSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNsRSxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxlQUFlLENBQUMsNkNBQTZDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFFNUgsT0FBTyxFQUFFLENBQUE7QUFDWCxDQUFDLENBQUE7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSTtLQUM5QixPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztLQUN0QixPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztLQUNyQixPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0FBRXhCOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtBQUUzRzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcbi8qIGVzbGludC1kaXNhYmxlIHNvcnQtaW1wb3J0cyAqL1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiXG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgdG9UZXh0ID0gKHZhbHVlKSA9PiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBTdHJpbmcodmFsdWUpKVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGV4dHJhY3RzIHRoZSB0ZXh0IGNvbnRlbnQgb2YgYSBSZWFjdCBub2RlIHdpdGhvdXQgcmVuZGVyaW5nIGl0LCBzbyB0aGUgZXhwb3J0IHBhdGggc3RheXNcbiAqIGxpZ2h0d2VpZ2h0IGFuZCBTU1ItL3Rlc3Qtc2FmZSAobm8gcmVhY3QtZG9tL3NlcnZlcikuIEEgY29sdW1uJ3MgY3VzdG9tIGBjb250ZW50YCBjYW4gcmV0dXJuIGEgUmVhY3RcbiAqIGVsZW1lbnQgZXZlbiBpbiBcImh0bWxcIiBtb2RlOyB0aGlzIGtlZXBzIHN1Y2ggY2VsbHMgZXhwb3J0aW5nIHRoZWlyIHRleHQgaW5zdGVhZCBvZiBcIltvYmplY3QgT2JqZWN0XVwiLlxuICogQHBhcmFtIHt1bmtub3dufSBub2RlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCByZWFjdE5vZGVUb1RleHQgPSAobm9kZSkgPT4ge1xuICBpZiAobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG5vZGUgPT09IFwiYm9vbGVhblwiKSByZXR1cm4gXCJcIlxuICBpZiAodHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIG5vZGUgPT09IFwibnVtYmVyXCIpIHJldHVybiBTdHJpbmcobm9kZSlcbiAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHJldHVybiBub2RlLm1hcChyZWFjdE5vZGVUb1RleHQpLmpvaW4oXCJcIilcbiAgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KG5vZGUpKSByZXR1cm4gcmVhY3ROb2RlVG9UZXh0KC8qKiBAdHlwZSB7e3Byb3BzPzoge2NoaWxkcmVuPzogdW5rbm93bn19fSAqLyAobm9kZSkucHJvcHM/LmNoaWxkcmVuKVxuXG4gIHJldHVybiBcIlwiXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVzY2FwZUh0bWwgPSAodGV4dCkgPT4gdGV4dFxuICAucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpXG4gIC5yZXBsYWNlKC88L2csIFwiJmx0O1wiKVxuICAucmVwbGFjZSgvPi9nLCBcIiZndDtcIilcblxuLyoqXG4gKiBQbGFpbiB0ZXh0IHZhbHVlIG9mIGEgY2VsbCwgZm9yIENTVi9FeGNlbC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBjZWxsVG9UZXh0ID0gKHZhbHVlKSA9PiAoUmVhY3QuaXNWYWxpZEVsZW1lbnQodmFsdWUpID8gcmVhY3ROb2RlVG9UZXh0KHZhbHVlKSA6IHRvVGV4dCh2YWx1ZSkpXG5cbi8qKlxuICogSFRNTC1lc2NhcGVkIHRleHQgdmFsdWUgb2YgYSBjZWxsLCBmb3IgdGhlIEhUTUwgZXhwb3J0LlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IGNlbGxUb0h0bWwgPSAodmFsdWUpID0+IGVzY2FwZUh0bWwoY2VsbFRvVGV4dCh2YWx1ZSkpXG4iXX0=
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @typedef {object} ExportFileSink
3
+ * @property {(chunk: string | Uint8Array) => Promise<void>} write
4
+ * @property {() => Promise<void>} close
5
+ * @property {() => Promise<void>} abort
6
+ */
7
+ /**
8
+ * @typedef {object} FsWritableStream
9
+ * @property {(chunk: string | Uint8Array) => Promise<void>} write
10
+ * @property {() => Promise<void>} close
11
+ * @property {() => Promise<void>} abort
12
+ */
13
+ /**
14
+ * @typedef {object} FsFileHandle
15
+ * @property {() => Promise<FsWritableStream>} createWritable
16
+ */
17
+ /**
18
+ * @typedef {object} FsWindow
19
+ * @property {(options: object) => Promise<FsFileHandle>} [showSaveFilePicker]
20
+ */
21
+ /**
22
+ * Opens a streaming file sink in the browser. When the File System Access API is available (Chromium), the
23
+ * export is written straight to the user-chosen file so memory stays bounded. Otherwise it falls back to
24
+ * buffering the chunks and saving a Blob via file-saver (memory-bound, but works everywhere).
25
+ *
26
+ * Must be called from within a user-gesture handler so the save-file picker is allowed to open.
27
+ *
28
+ * @param {object} args
29
+ * @param {string} args.fileName
30
+ * @param {string} args.mimeType
31
+ * @returns {Promise<ExportFileSink>}
32
+ */
33
+ export default function openWebFileSink({ fileName, mimeType }: {
34
+ fileName: string;
35
+ mimeType: string;
36
+ }): Promise<ExportFileSink>;
37
+ export type ExportFileSink = {
38
+ write: (chunk: string | Uint8Array) => Promise<void>;
39
+ close: () => Promise<void>;
40
+ abort: () => Promise<void>;
41
+ };
42
+ export type FsWritableStream = {
43
+ write: (chunk: string | Uint8Array) => Promise<void>;
44
+ close: () => Promise<void>;
45
+ abort: () => Promise<void>;
46
+ };
47
+ export type FsFileHandle = {
48
+ createWritable: () => Promise<FsWritableStream>;
49
+ };
50
+ export type FsWindow = {
51
+ showSaveFilePicker?: (options: object) => Promise<FsFileHandle>;
52
+ };
53
+ //# sourceMappingURL=web-file-sink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-file-sink.d.ts","sourceRoot":"/src/","sources":["table/export/file-sinks/web-file-sink.js"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH;;;;;GAKG;AACH;;;GAGG;AACH;;;GAGG;AAEH;;;;;;;;;;;GAWG;AACH,gEAJG;IAAqB,QAAQ,EAArB,MAAM;IACO,QAAQ,EAArB,MAAM;CACd,GAAU,OAAO,CAAC,cAAc,CAAC,CAgDnC;;WA7Ea,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC;WAC7C,MAAM,OAAO,CAAC,IAAI,CAAC;WACnB,MAAM,OAAO,CAAC,IAAI,CAAC;;;WAInB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC;WAC7C,MAAM,OAAO,CAAC,IAAI,CAAC;WACnB,MAAM,OAAO,CAAC,IAAI,CAAC;;;oBAInB,MAAM,OAAO,CAAC,gBAAgB,CAAC;;;yBAI/B,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC"}
@@ -0,0 +1,75 @@
1
+ // @ts-check
2
+ import { saveAs } from "file-saver";
3
+ /**
4
+ * @typedef {object} ExportFileSink
5
+ * @property {(chunk: string | Uint8Array) => Promise<void>} write
6
+ * @property {() => Promise<void>} close
7
+ * @property {() => Promise<void>} abort
8
+ */
9
+ /**
10
+ * @typedef {object} FsWritableStream
11
+ * @property {(chunk: string | Uint8Array) => Promise<void>} write
12
+ * @property {() => Promise<void>} close
13
+ * @property {() => Promise<void>} abort
14
+ */
15
+ /**
16
+ * @typedef {object} FsFileHandle
17
+ * @property {() => Promise<FsWritableStream>} createWritable
18
+ */
19
+ /**
20
+ * @typedef {object} FsWindow
21
+ * @property {(options: object) => Promise<FsFileHandle>} [showSaveFilePicker]
22
+ */
23
+ /**
24
+ * Opens a streaming file sink in the browser. When the File System Access API is available (Chromium), the
25
+ * export is written straight to the user-chosen file so memory stays bounded. Otherwise it falls back to
26
+ * buffering the chunks and saving a Blob via file-saver (memory-bound, but works everywhere).
27
+ *
28
+ * Must be called from within a user-gesture handler so the save-file picker is allowed to open.
29
+ *
30
+ * @param {object} args
31
+ * @param {string} args.fileName
32
+ * @param {string} args.mimeType
33
+ * @returns {Promise<ExportFileSink>}
34
+ */
35
+ export default async function openWebFileSink({ fileName, mimeType }) {
36
+ const win = /** @type {FsWindow | undefined} */ (typeof window === "undefined" ? undefined : /** @type {unknown} */ (window));
37
+ if (win && typeof win.showSaveFilePicker === "function") {
38
+ const extension = fileName.includes(".") ? fileName.slice(fileName.lastIndexOf(".")) : "";
39
+ try {
40
+ const handle = await win.showSaveFilePicker({
41
+ suggestedName: fileName,
42
+ types: extension ? [{ accept: { [mimeType]: [extension] } }] : undefined
43
+ });
44
+ const writable = await handle.createWritable();
45
+ return {
46
+ write: (chunk) => writable.write(chunk),
47
+ close: () => writable.close(),
48
+ abort: () => writable.abort()
49
+ };
50
+ }
51
+ catch (error) {
52
+ // The user cancelled the picker - propagate so the export aborts quietly.
53
+ if (error && /** @type {Error} */ (error).name === "AbortError")
54
+ throw error;
55
+ // Any other problem (e.g. picker not usable in this context): fall back to the Blob path below.
56
+ }
57
+ }
58
+ /** @type {Array<string | Uint8Array>} */
59
+ const chunks = [];
60
+ return {
61
+ write: (chunk) => {
62
+ chunks.push(chunk);
63
+ return Promise.resolve();
64
+ },
65
+ close: () => {
66
+ saveAs(new Blob(chunks, { type: mimeType }), fileName);
67
+ return Promise.resolve();
68
+ },
69
+ abort: () => {
70
+ chunks.length = 0;
71
+ return Promise.resolve();
72
+ }
73
+ };
74
+ }
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZpbGUtc2luay5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsidGFibGUvZXhwb3J0L2ZpbGUtc2lua3Mvd2ViLWZpbGUtc2luay5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBQ1osT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUVqQzs7Ozs7R0FLRztBQUNIOzs7OztHQUtHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssVUFBVSxlQUFlLENBQUMsRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFDO0lBQ2hFLE1BQU0sR0FBRyxHQUFHLG1DQUFtQyxDQUFDLENBQUMsT0FBTyxNQUFNLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQTtJQUU3SCxJQUFJLEdBQUcsSUFBSSxPQUFPLEdBQUcsQ0FBQyxrQkFBa0IsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUN4RCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBRXpGLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLGtCQUFrQixDQUFDO2dCQUMxQyxhQUFhLEVBQUUsUUFBUTtnQkFDdkIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUzthQUNyRSxDQUFDLENBQUE7WUFDRixNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQTtZQUU5QyxPQUFPO2dCQUNMLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7Z0JBQ3ZDLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO2dCQUM3QixLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTthQUM5QixDQUFBO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZiwwRUFBMEU7WUFDMUUsSUFBSSxLQUFLLElBQUksb0JBQW9CLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssWUFBWTtnQkFBRSxNQUFNLEtBQUssQ0FBQTtZQUU1RSxnR0FBZ0c7UUFDbEcsQ0FBQztJQUNILENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFBO0lBRWpCLE9BQU87UUFDTCxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7WUFFbEIsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDMUIsQ0FBQztRQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDVixNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUE7WUFFcEQsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDMUIsQ0FBQztRQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDVixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtZQUVqQixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUMxQixDQUFDO0tBQ0YsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcbmltcG9ydCB7c2F2ZUFzfSBmcm9tIFwiZmlsZS1zYXZlclwiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRXhwb3J0RmlsZVNpbmtcbiAqIEBwcm9wZXJ0eSB7KGNodW5rOiBzdHJpbmcgfCBVaW50OEFycmF5KSA9PiBQcm9taXNlPHZvaWQ+fSB3cml0ZVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBjbG9zZVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBhYm9ydFxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZzV3JpdGFibGVTdHJlYW1cbiAqIEBwcm9wZXJ0eSB7KGNodW5rOiBzdHJpbmcgfCBVaW50OEFycmF5KSA9PiBQcm9taXNlPHZvaWQ+fSB3cml0ZVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBjbG9zZVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBhYm9ydFxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZzRmlsZUhhbmRsZVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEZzV3JpdGFibGVTdHJlYW0+fSBjcmVhdGVXcml0YWJsZVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZzV2luZG93XG4gKiBAcHJvcGVydHkgeyhvcHRpb25zOiBvYmplY3QpID0+IFByb21pc2U8RnNGaWxlSGFuZGxlPn0gW3Nob3dTYXZlRmlsZVBpY2tlcl1cbiAqL1xuXG4vKipcbiAqIE9wZW5zIGEgc3RyZWFtaW5nIGZpbGUgc2luayBpbiB0aGUgYnJvd3Nlci4gV2hlbiB0aGUgRmlsZSBTeXN0ZW0gQWNjZXNzIEFQSSBpcyBhdmFpbGFibGUgKENocm9taXVtKSwgdGhlXG4gKiBleHBvcnQgaXMgd3JpdHRlbiBzdHJhaWdodCB0byB0aGUgdXNlci1jaG9zZW4gZmlsZSBzbyBtZW1vcnkgc3RheXMgYm91bmRlZC4gT3RoZXJ3aXNlIGl0IGZhbGxzIGJhY2sgdG9cbiAqIGJ1ZmZlcmluZyB0aGUgY2h1bmtzIGFuZCBzYXZpbmcgYSBCbG9iIHZpYSBmaWxlLXNhdmVyIChtZW1vcnktYm91bmQsIGJ1dCB3b3JrcyBldmVyeXdoZXJlKS5cbiAqXG4gKiBNdXN0IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhIHVzZXItZ2VzdHVyZSBoYW5kbGVyIHNvIHRoZSBzYXZlLWZpbGUgcGlja2VyIGlzIGFsbG93ZWQgdG8gb3Blbi5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZmlsZU5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm1pbWVUeXBlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxFeHBvcnRGaWxlU2luaz59XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIG9wZW5XZWJGaWxlU2luayh7ZmlsZU5hbWUsIG1pbWVUeXBlfSkge1xuICBjb25zdCB3aW4gPSAvKiogQHR5cGUge0ZzV2luZG93IHwgdW5kZWZpbmVkfSAqLyAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiA/IHVuZGVmaW5lZCA6IC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHdpbmRvdykpXG5cbiAgaWYgKHdpbiAmJiB0eXBlb2Ygd2luLnNob3dTYXZlRmlsZVBpY2tlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gZmlsZU5hbWUuaW5jbHVkZXMoXCIuXCIpID8gZmlsZU5hbWUuc2xpY2UoZmlsZU5hbWUubGFzdEluZGV4T2YoXCIuXCIpKSA6IFwiXCJcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBoYW5kbGUgPSBhd2FpdCB3aW4uc2hvd1NhdmVGaWxlUGlja2VyKHtcbiAgICAgICAgc3VnZ2VzdGVkTmFtZTogZmlsZU5hbWUsXG4gICAgICAgIHR5cGVzOiBleHRlbnNpb24gPyBbe2FjY2VwdDoge1ttaW1lVHlwZV06IFtleHRlbnNpb25dfX1dIDogdW5kZWZpbmVkXG4gICAgICB9KVxuICAgICAgY29uc3Qgd3JpdGFibGUgPSBhd2FpdCBoYW5kbGUuY3JlYXRlV3JpdGFibGUoKVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB3cml0ZTogKGNodW5rKSA9PiB3cml0YWJsZS53cml0ZShjaHVuayksXG4gICAgICAgIGNsb3NlOiAoKSA9PiB3cml0YWJsZS5jbG9zZSgpLFxuICAgICAgICBhYm9ydDogKCkgPT4gd3JpdGFibGUuYWJvcnQoKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBUaGUgdXNlciBjYW5jZWxsZWQgdGhlIHBpY2tlciAtIHByb3BhZ2F0ZSBzbyB0aGUgZXhwb3J0IGFib3J0cyBxdWlldGx5LlxuICAgICAgaWYgKGVycm9yICYmIC8qKiBAdHlwZSB7RXJyb3J9ICovIChlcnJvcikubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHRocm93IGVycm9yXG5cbiAgICAgIC8vIEFueSBvdGhlciBwcm9ibGVtIChlLmcuIHBpY2tlciBub3QgdXNhYmxlIGluIHRoaXMgY29udGV4dCk6IGZhbGwgYmFjayB0byB0aGUgQmxvYiBwYXRoIGJlbG93LlxuICAgIH1cbiAgfVxuXG4gIC8qKiBAdHlwZSB7QXJyYXk8c3RyaW5nIHwgVWludDhBcnJheT59ICovXG4gIGNvbnN0IGNodW5rcyA9IFtdXG5cbiAgcmV0dXJuIHtcbiAgICB3cml0ZTogKGNodW5rKSA9PiB7XG4gICAgICBjaHVua3MucHVzaChjaHVuaylcblxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfSxcbiAgICBjbG9zZTogKCkgPT4ge1xuICAgICAgc2F2ZUFzKG5ldyBCbG9iKGNodW5rcywge3R5cGU6IG1pbWVUeXBlfSksIGZpbGVOYW1lKVxuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9LFxuICAgIGFib3J0OiAoKSA9PiB7XG4gICAgICBjaHVua3MubGVuZ3RoID0gMFxuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Streaming CSV writer. Emits one chunk per call so the export driver can write each page straight to the
3
+ * file sink without holding the whole document in memory. RFC-4180 quoting, CRLF line breaks, and a UTF-8 BOM
4
+ * so Excel opens it with the right encoding.
5
+ */
6
+ export default class ApiMakerTableExportCsvWriter {
7
+ /**
8
+ * @param {Array<string>} labels
9
+ * @returns {string}
10
+ */
11
+ header(labels: Array<string>): string;
12
+ /**
13
+ * @param {Array<unknown>} values
14
+ * @returns {string}
15
+ */
16
+ row(values: Array<unknown>): string;
17
+ /** @returns {string} */
18
+ footer(): string;
19
+ /**
20
+ * @param {Array<unknown>} values
21
+ * @returns {string}
22
+ */
23
+ line(values: Array<unknown>): string;
24
+ /**
25
+ * @param {unknown} value
26
+ * @returns {string}
27
+ */
28
+ escape(value: unknown): string;
29
+ }
30
+ //# sourceMappingURL=csv-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv-writer.d.ts","sourceRoot":"/src/","sources":["table/export/format-writers/csv-writer.js"],"names":[],"mappings":"AAKA;;;;GAIG;AACH;IACE;;;OAGG;IACH,eAHW,KAAK,CAAC,MAAM,CAAC,GACX,MAAM,CAIlB;IAED;;;OAGG;IACH,YAHW,KAAK,CAAC,OAAO,CAAC,GACZ,MAAM,CAIlB;IAED,wBAAwB;IACxB,UADc,MAAM,CAGnB;IAED;;;OAGG;IACH,aAHW,KAAK,CAAC,OAAO,CAAC,GACZ,MAAM,CAIlB;IAED;;;OAGG;IACH,cAHW,OAAO,GACL,MAAM,CAUlB;CACF"}
@@ -0,0 +1,47 @@
1
+ // @ts-check
2
+ import { cellToText } from "../cell-value.js";
3
+ const UTF8_BOM = "";
4
+ /**
5
+ * Streaming CSV writer. Emits one chunk per call so the export driver can write each page straight to the
6
+ * file sink without holding the whole document in memory. RFC-4180 quoting, CRLF line breaks, and a UTF-8 BOM
7
+ * so Excel opens it with the right encoding.
8
+ */
9
+ export default class ApiMakerTableExportCsvWriter {
10
+ /**
11
+ * @param {Array<string>} labels
12
+ * @returns {string}
13
+ */
14
+ header(labels) {
15
+ return UTF8_BOM + this.line(labels);
16
+ }
17
+ /**
18
+ * @param {Array<unknown>} values
19
+ * @returns {string}
20
+ */
21
+ row(values) {
22
+ return this.line(values);
23
+ }
24
+ /** @returns {string} */
25
+ footer() {
26
+ return "";
27
+ }
28
+ /**
29
+ * @param {Array<unknown>} values
30
+ * @returns {string}
31
+ */
32
+ line(values) {
33
+ return `${values.map((value) => this.escape(value)).join(",")}\r\n`;
34
+ }
35
+ /**
36
+ * @param {unknown} value
37
+ * @returns {string}
38
+ */
39
+ escape(value) {
40
+ const text = cellToText(value);
41
+ if ((/["\r\n,]/).test(text)) {
42
+ return `"${text.replace(/"/g, "\"\"")}"`;
43
+ }
44
+ return text;
45
+ }
46
+ }
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2LXdyaXRlci5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsidGFibGUvZXhwb3J0L2Zvcm1hdC13cml0ZXJzL2Nzdi13cml0ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUNaLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUUzQyxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUE7QUFFcEI7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sNEJBQTRCO0lBQy9DOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxNQUFNO1FBQ1gsT0FBTyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNyQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRyxDQUFDLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDMUIsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixNQUFNO1FBQ0osT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxDQUFDLE1BQU07UUFDVCxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFBO0lBQ3JFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsS0FBSztRQUNWLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUU5QixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDNUIsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUE7UUFDMUMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5pbXBvcnQge2NlbGxUb1RleHR9IGZyb20gXCIuLi9jZWxsLXZhbHVlLmpzXCJcblxuY29uc3QgVVRGOF9CT00gPSBcIu+7v1wiXG5cbi8qKlxuICogU3RyZWFtaW5nIENTViB3cml0ZXIuIEVtaXRzIG9uZSBjaHVuayBwZXIgY2FsbCBzbyB0aGUgZXhwb3J0IGRyaXZlciBjYW4gd3JpdGUgZWFjaCBwYWdlIHN0cmFpZ2h0IHRvIHRoZVxuICogZmlsZSBzaW5rIHdpdGhvdXQgaG9sZGluZyB0aGUgd2hvbGUgZG9jdW1lbnQgaW4gbWVtb3J5LiBSRkMtNDE4MCBxdW90aW5nLCBDUkxGIGxpbmUgYnJlYWtzLCBhbmQgYSBVVEYtOCBCT01cbiAqIHNvIEV4Y2VsIG9wZW5zIGl0IHdpdGggdGhlIHJpZ2h0IGVuY29kaW5nLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcGlNYWtlclRhYmxlRXhwb3J0Q3N2V3JpdGVyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gbGFiZWxzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBoZWFkZXIobGFiZWxzKSB7XG4gICAgcmV0dXJuIFVURjhfQk9NICsgdGhpcy5saW5lKGxhYmVscylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0FycmF5PHVua25vd24+fSB2YWx1ZXNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHJvdyh2YWx1ZXMpIHtcbiAgICByZXR1cm4gdGhpcy5saW5lKHZhbHVlcylcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBmb290ZXIoKSB7XG4gICAgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0FycmF5PHVua25vd24+fSB2YWx1ZXNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGxpbmUodmFsdWVzKSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlcy5tYXAoKHZhbHVlKSA9PiB0aGlzLmVzY2FwZSh2YWx1ZSkpLmpvaW4oXCIsXCIpfVxcclxcbmBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3Vua25vd259IHZhbHVlXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBlc2NhcGUodmFsdWUpIHtcbiAgICBjb25zdCB0ZXh0ID0gY2VsbFRvVGV4dCh2YWx1ZSlcblxuICAgIGlmICgoL1tcIlxcclxcbixdLykudGVzdCh0ZXh0KSkge1xuICAgICAgcmV0dXJuIGBcIiR7dGV4dC5yZXBsYWNlKC9cIi9nLCBcIlxcXCJcXFwiXCIpfVwiYFxuICAgIH1cblxuICAgIHJldHVybiB0ZXh0XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Streaming HTML-table writer. Emits the table head, one `<tr>` per row, and the closing tags as separate
3
+ * chunks so the export driver can write each page to the file sink incrementally. Cells that are React
4
+ * elements (from a column's custom `content`) are rendered to markup; other values are escaped text.
5
+ */
6
+ export default class ApiMakerTableExportHtmlWriter {
7
+ /**
8
+ * @param {Array<string>} labels
9
+ * @returns {string}
10
+ */
11
+ header(labels: Array<string>): string;
12
+ /**
13
+ * @param {Array<unknown>} values
14
+ * @returns {string}
15
+ */
16
+ row(values: Array<unknown>): string;
17
+ /** @returns {string} */
18
+ footer(): string;
19
+ }
20
+ //# sourceMappingURL=html-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-writer.d.ts","sourceRoot":"/src/","sources":["table/export/format-writers/html-writer.js"],"names":[],"mappings":"AAGA;;;;GAIG;AACH;IACE;;;OAGG;IACH,eAHW,KAAK,CAAC,MAAM,CAAC,GACX,MAAM,CAMlB;IAED;;;OAGG;IACH,YAHW,KAAK,CAAC,OAAO,CAAC,GACZ,MAAM,CAMlB;IAED,wBAAwB;IACxB,UADc,MAAM,CAGnB;CACF"}
@@ -0,0 +1,30 @@
1
+ // @ts-check
2
+ import { cellToHtml } from "../cell-value.js";
3
+ /**
4
+ * Streaming HTML-table writer. Emits the table head, one `<tr>` per row, and the closing tags as separate
5
+ * chunks so the export driver can write each page to the file sink incrementally. Cells that are React
6
+ * elements (from a column's custom `content`) are rendered to markup; other values are escaped text.
7
+ */
8
+ export default class ApiMakerTableExportHtmlWriter {
9
+ /**
10
+ * @param {Array<string>} labels
11
+ * @returns {string}
12
+ */
13
+ header(labels) {
14
+ const cells = labels.map((label) => `<th>${cellToHtml(label)}</th>`).join("");
15
+ return `<table><thead><tr>${cells}</tr></thead><tbody>`;
16
+ }
17
+ /**
18
+ * @param {Array<unknown>} values
19
+ * @returns {string}
20
+ */
21
+ row(values) {
22
+ const cells = values.map((value) => `<td>${cellToHtml(value)}</td>`).join("");
23
+ return `<tr>${cells}</tr>`;
24
+ }
25
+ /** @returns {string} */
26
+ footer() {
27
+ return "</tbody></table>";
28
+ }
29
+ }
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC13cml0ZXIuanMiLCJzb3VyY2VSb290IjoiL3NyYy8iLCJzb3VyY2VzIjpbInRhYmxlL2V4cG9ydC9mb3JtYXQtd3JpdGVycy9odG1sLXdyaXRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBQ1osT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBRTNDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDZCQUE2QjtJQUNoRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsTUFBTTtRQUNYLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFN0UsT0FBTyxxQkFBcUIsS0FBSyxzQkFBc0IsQ0FBQTtJQUN6RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRyxDQUFDLE1BQU07UUFDUixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRTdFLE9BQU8sT0FBTyxLQUFLLE9BQU8sQ0FBQTtJQUM1QixDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLE1BQU07UUFDSixPQUFPLGtCQUFrQixDQUFBO0lBQzNCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuaW1wb3J0IHtjZWxsVG9IdG1sfSBmcm9tIFwiLi4vY2VsbC12YWx1ZS5qc1wiXG5cbi8qKlxuICogU3RyZWFtaW5nIEhUTUwtdGFibGUgd3JpdGVyLiBFbWl0cyB0aGUgdGFibGUgaGVhZCwgb25lIGA8dHI+YCBwZXIgcm93LCBhbmQgdGhlIGNsb3NpbmcgdGFncyBhcyBzZXBhcmF0ZVxuICogY2h1bmtzIHNvIHRoZSBleHBvcnQgZHJpdmVyIGNhbiB3cml0ZSBlYWNoIHBhZ2UgdG8gdGhlIGZpbGUgc2luayBpbmNyZW1lbnRhbGx5LiBDZWxscyB0aGF0IGFyZSBSZWFjdFxuICogZWxlbWVudHMgKGZyb20gYSBjb2x1bW4ncyBjdXN0b20gYGNvbnRlbnRgKSBhcmUgcmVuZGVyZWQgdG8gbWFya3VwOyBvdGhlciB2YWx1ZXMgYXJlIGVzY2FwZWQgdGV4dC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBpTWFrZXJUYWJsZUV4cG9ydEh0bWxXcml0ZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBsYWJlbHNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGhlYWRlcihsYWJlbHMpIHtcbiAgICBjb25zdCBjZWxscyA9IGxhYmVscy5tYXAoKGxhYmVsKSA9PiBgPHRoPiR7Y2VsbFRvSHRtbChsYWJlbCl9PC90aD5gKS5qb2luKFwiXCIpXG5cbiAgICByZXR1cm4gYDx0YWJsZT48dGhlYWQ+PHRyPiR7Y2VsbHN9PC90cj48L3RoZWFkPjx0Ym9keT5gXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtBcnJheTx1bmtub3duPn0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICByb3codmFsdWVzKSB7XG4gICAgY29uc3QgY2VsbHMgPSB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4gYDx0ZD4ke2NlbGxUb0h0bWwodmFsdWUpfTwvdGQ+YCkuam9pbihcIlwiKVxuXG4gICAgcmV0dXJuIGA8dHI+JHtjZWxsc308L3RyPmBcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBmb290ZXIoKSB7XG4gICAgcmV0dXJuIFwiPC90Ym9keT48L3RhYmxlPlwiXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Excel (.xlsx) writer. xlsx is a zipped binary that can't be appended chunk-by-chunk, so this buffers the
3
+ * rows and serializes the whole workbook in `footer()`. To keep api_maker free of a heavy spreadsheet
4
+ * dependency, the actual serialization is provided by the host app via
5
+ * `apiMakerConfig.setExportXlsxSerializer(rows => Uint8Array)`. Best for moderate row counts — use CSV for
6
+ * very large exports.
7
+ */
8
+ export default class ApiMakerTableExportXlsxWriter {
9
+ rows: unknown[][];
10
+ /**
11
+ * @param {Array<string>} labels
12
+ * @returns {null}
13
+ */
14
+ header(labels: Array<string>): null;
15
+ /**
16
+ * @param {Array<unknown>} values
17
+ * @returns {null}
18
+ */
19
+ row(values: Array<unknown>): null;
20
+ /** @returns {Promise<Uint8Array>} */
21
+ footer(): Promise<Uint8Array>;
22
+ }
23
+ //# sourceMappingURL=xlsx-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xlsx-writer.d.ts","sourceRoot":"/src/","sources":["table/export/format-writers/xlsx-writer.js"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH;IAEI,kBAAqD;IAGvD;;;OAGG;IACH,eAHW,KAAK,CAAC,MAAM,CAAC,GACX,IAAI,CAMhB;IAED;;;OAGG;IACH,YAHW,KAAK,CAAC,OAAO,CAAC,GACZ,IAAI,CAMhB;IAED,qCAAqC;IACrC,UADc,OAAO,CAAC,UAAU,CAAC,CAShC;CACF"}
@@ -0,0 +1,41 @@
1
+ // @ts-check
2
+ /* eslint-disable sort-imports */
3
+ import apiMakerConfig from "../../../config.js";
4
+ import { cellToText } from "../cell-value.js";
5
+ /**
6
+ * Excel (.xlsx) writer. xlsx is a zipped binary that can't be appended chunk-by-chunk, so this buffers the
7
+ * rows and serializes the whole workbook in `footer()`. To keep api_maker free of a heavy spreadsheet
8
+ * dependency, the actual serialization is provided by the host app via
9
+ * `apiMakerConfig.setExportXlsxSerializer(rows => Uint8Array)`. Best for moderate row counts — use CSV for
10
+ * very large exports.
11
+ */
12
+ export default class ApiMakerTableExportXlsxWriter {
13
+ constructor() {
14
+ this.rows = /** @type {Array<Array<unknown>>} */ ([]);
15
+ }
16
+ /**
17
+ * @param {Array<string>} labels
18
+ * @returns {null}
19
+ */
20
+ header(labels) {
21
+ this.rows.push(labels);
22
+ return null;
23
+ }
24
+ /**
25
+ * @param {Array<unknown>} values
26
+ * @returns {null}
27
+ */
28
+ row(values) {
29
+ this.rows.push(values.map((value) => cellToText(value)));
30
+ return null;
31
+ }
32
+ /** @returns {Promise<Uint8Array>} */
33
+ async footer() {
34
+ const serializer = apiMakerConfig.getExportXlsxSerializer();
35
+ if (!serializer) {
36
+ throw new Error("Excel export isn't configured. Call apiMakerConfig.setExportXlsxSerializer(...) to enable it.");
37
+ }
38
+ return await serializer(this.rows);
39
+ }
40
+ }
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieGxzeC13cml0ZXIuanMiLCJzb3VyY2VSb290IjoiL3NyYy8iLCJzb3VyY2VzIjpbInRhYmxlL2V4cG9ydC9mb3JtYXQtd3JpdGVycy94bHN4LXdyaXRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBQ1osaUNBQWlDO0FBQ2pDLE9BQU8sY0FBYyxNQUFNLG9CQUFvQixDQUFBO0FBQy9DLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUUzQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDZCQUE2QjtJQUNoRDtRQUNFLElBQUksQ0FBQyxJQUFJLEdBQUcsb0NBQW9DLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUN2RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLE1BQU07UUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUV0QixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRDs7O09BR0c7SUFDSCxHQUFHLENBQUMsTUFBTTtRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFeEQsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQscUNBQXFDO0lBQ3JDLEtBQUssQ0FBQyxNQUFNO1FBQ1YsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLHVCQUF1QixFQUFFLENBQUE7UUFFM0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0ZBQStGLENBQUMsQ0FBQTtRQUNsSCxDQUFDO1FBRUQsT0FBTyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDcEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG4vKiBlc2xpbnQtZGlzYWJsZSBzb3J0LWltcG9ydHMgKi9cbmltcG9ydCBhcGlNYWtlckNvbmZpZyBmcm9tIFwiLi4vLi4vLi4vY29uZmlnLmpzXCJcbmltcG9ydCB7Y2VsbFRvVGV4dH0gZnJvbSBcIi4uL2NlbGwtdmFsdWUuanNcIlxuXG4vKipcbiAqIEV4Y2VsICgueGxzeCkgd3JpdGVyLiB4bHN4IGlzIGEgemlwcGVkIGJpbmFyeSB0aGF0IGNhbid0IGJlIGFwcGVuZGVkIGNodW5rLWJ5LWNodW5rLCBzbyB0aGlzIGJ1ZmZlcnMgdGhlXG4gKiByb3dzIGFuZCBzZXJpYWxpemVzIHRoZSB3aG9sZSB3b3JrYm9vayBpbiBgZm9vdGVyKClgLiBUbyBrZWVwIGFwaV9tYWtlciBmcmVlIG9mIGEgaGVhdnkgc3ByZWFkc2hlZXRcbiAqIGRlcGVuZGVuY3ksIHRoZSBhY3R1YWwgc2VyaWFsaXphdGlvbiBpcyBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHAgdmlhXG4gKiBgYXBpTWFrZXJDb25maWcuc2V0RXhwb3J0WGxzeFNlcmlhbGl6ZXIocm93cyA9PiBVaW50OEFycmF5KWAuIEJlc3QgZm9yIG1vZGVyYXRlIHJvdyBjb3VudHMg4oCUIHVzZSBDU1YgZm9yXG4gKiB2ZXJ5IGxhcmdlIGV4cG9ydHMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwaU1ha2VyVGFibGVFeHBvcnRYbHN4V3JpdGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yb3dzID0gLyoqIEB0eXBlIHtBcnJheTxBcnJheTx1bmtub3duPj59ICovIChbXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGxhYmVsc1xuICAgKiBAcmV0dXJucyB7bnVsbH1cbiAgICovXG4gIGhlYWRlcihsYWJlbHMpIHtcbiAgICB0aGlzLnJvd3MucHVzaChsYWJlbHMpXG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QXJyYXk8dW5rbm93bj59IHZhbHVlc1xuICAgKiBAcmV0dXJucyB7bnVsbH1cbiAgICovXG4gIHJvdyh2YWx1ZXMpIHtcbiAgICB0aGlzLnJvd3MucHVzaCh2YWx1ZXMubWFwKCh2YWx1ZSkgPT4gY2VsbFRvVGV4dCh2YWx1ZSkpKVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxVaW50OEFycmF5Pn0gKi9cbiAgYXN5bmMgZm9vdGVyKCkge1xuICAgIGNvbnN0IHNlcmlhbGl6ZXIgPSBhcGlNYWtlckNvbmZpZy5nZXRFeHBvcnRYbHN4U2VyaWFsaXplcigpXG5cbiAgICBpZiAoIXNlcmlhbGl6ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4Y2VsIGV4cG9ydCBpc24ndCBjb25maWd1cmVkLiBDYWxsIGFwaU1ha2VyQ29uZmlnLnNldEV4cG9ydFhsc3hTZXJpYWxpemVyKC4uLikgdG8gZW5hYmxlIGl0LlwiKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBzZXJpYWxpemVyKHRoaXMucm93cylcbiAgfVxufVxuIl19
@@ -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 = Record<string, never>;
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":";;;;WAmBc,MAAM;;oBAEN,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;kBAXjB,OAAO"}
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 implicit-arrow-linebreak, react/jsx-no-literals, sort-imports */
4
- import ColumnContent from "../column-content";
5
- import columnIdentifier from "../column-identifier.js";
6
- import columnVisible from "../column-visible.js";
7
- import { saveAs } from "file-saver";
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 {Record<string, never>} State */
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
- return (_jsxs(Pressable, { dataSet: this.cache("pressableDataSet", { component: "api-maker/table/settings/download-action" }), onPress: this.tt.onDownloadPress, style: this.cache("pressableStyle", { flexDirection: "row", alignItems: "center" }), children: [_jsx(Icon, { name: "download", size: 20 }), _jsx(Text, { style: this.cache("textStyle", { marginLeft: 5 }), children: "Download" })] }));
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
- onDownloadPress = () => {
32
- const { l, table } = this.p;
33
- const { modelClass } = table.p;
34
- const { collection } = table.tt;
35
- const { models } = collection;
36
- const { preparedColumns } = table.s;
37
- const tableElement = (_jsxs("table", { children: [_jsx("thead", { children: _jsx("tr", { children: preparedColumns?.map(({ column, tableSettingColumn }) => columnVisible(column, tableSettingColumn) &&
38
- _jsx("th", { children: table.headerLabelForColumn(column) }, columnIdentifier(column))) }) }), _jsx("tbody", { children: models.map((model) => _jsx("tr", { children: preparedColumns?.map(({ column, tableSettingColumn }) => columnVisible(column, tableSettingColumn) &&
39
- _jsx("td", { children: new ColumnContent({ column, l, mode: "html", model, table }).content() }, columnIdentifier(column))) }, model.id())) })] }));
40
- const tableHTML = renderToString(tableElement);
41
- const blob = new Blob([tableHTML], { type: "text/html;charset=utf-8" });
42
- const fileName = `${modelClass.modelName().human({ count: 2 })}.html`;
43
- saveAs(blob, fileName);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxvYWQtYWN0aW9uLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJ0YWJsZS9zZXR0aW5ncy9kb3dubG9hZC1hY3Rpb24uanN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxZQUFZO0FBQ1osa0ZBQWtGO0FBQ2xGLE9BQU8sYUFBYSxNQUFNLG1CQUFtQixDQUFBO0FBQzdDLE9BQU8sZ0JBQWdCLE1BQU0seUJBQXlCLENBQUE7QUFDdEQsT0FBTyxhQUFhLE1BQU0sc0JBQXNCLENBQUE7QUFDaEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUNqQyxPQUFPLElBQUksTUFBTSxrQkFBa0IsQ0FBQTtBQUNuQyxPQUFPLElBQUksTUFBTSxpQ0FBaUMsQ0FBQTtBQUNsRCxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUE7QUFDbEMsT0FBTyxjQUFjLE1BQU0sa0JBQWtCLENBQUE7QUFDN0MsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFBO0FBQ3pCLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQSxDQUFDLDJDQUEyQztBQUMzRixPQUFPLEVBQUMsY0FBYyxFQUFFLGNBQWMsRUFBQyxNQUFNLDRDQUE0QyxDQUFBO0FBQ3pGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDdEMsT0FBTyxJQUFJLE1BQU0sa0JBQWtCLENBQUE7QUFFbkM7Ozs7R0FJRztBQUNILDZDQUE2QztBQUM3QyxlQUFlLElBQUksQ0FBQyxjQUFjLENBQUMsK0NBQStDLENBQUMsTUFBTSxtQ0FBb0MsU0FBUSxjQUFjO0lBQ2pKLE1BQU0sQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDO1FBQ2hDLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVU7UUFDNUIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVTtLQUNuQyxDQUFDLENBQUE7SUFFRixNQUFNO1FBQ0osT0FBTyxDQUNMLE1BQUMsU0FBUyxJQUNSLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLEVBQUMsU0FBUyxFQUFFLDBDQUEwQyxFQUFDLENBQUMsRUFDaEcsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxFQUNoQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxFQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxDQUFDLGFBRWpGLEtBQUMsSUFBSSxJQUFDLElBQUksRUFBQyxVQUFVLEVBQUMsSUFBSSxFQUFFLEVBQUUsR0FBSSxFQUNsQyxLQUFDLElBQUksSUFBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBQyxVQUFVLEVBQUUsQ0FBQyxFQUFDLENBQUMseUJBRTlDLElBQ0csQ0FDYixDQUFBO0lBQ0gsQ0FBQztJQUVELGVBQWUsR0FBRyxHQUFHLEVBQUU7UUFDckIsTUFBTSxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3pCLE1BQU0sRUFBQyxVQUFVLEVBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQzVCLE1BQU0sRUFBQyxVQUFVLEVBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFBO1FBQzdCLE1BQU0sRUFBQyxNQUFNLEVBQUMsR0FBRyxVQUFVLENBQUE7UUFDM0IsTUFBTSxFQUFDLGVBQWUsRUFBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDakMsTUFBTSxZQUFZLEdBQUcsQ0FDbkIsNEJBQ0UsMEJBQ0UsdUJBQ0csZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFDLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUM7NEJBQy9GLHVCQUNHLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsSUFENUIsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBRTVCLENBQ04sR0FDRSxHQUNDLEVBQ1IsMEJBQ0csTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3BCLHVCQUNHLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFDLE1BQU0sRUFBRSxrQkFBa0IsRUFBQyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDOzRCQUMvRix1QkFDRyxJQUFJLGFBQWEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFEOUQsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBRTVCLENBQ04sSUFMTSxLQUFLLENBQUMsRUFBRSxFQUFFLENBTWQsQ0FDTixHQUNLLElBQ0YsQ0FDVCxDQUFBO1FBQ0QsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUseUJBQXlCLEVBQUMsQ0FBQyxDQUFBO1FBQ3JFLE1BQU0sUUFBUSxHQUFHLEdBQUcsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUMsQ0FBQyxPQUFPLENBQUE7UUFFbkUsTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUN4QixDQUFDLENBQUE7Q0FDRixDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuLyogZXNsaW50LWRpc2FibGUgaW1wbGljaXQtYXJyb3ctbGluZWJyZWFrLCByZWFjdC9qc3gtbm8tbGl0ZXJhbHMsIHNvcnQtaW1wb3J0cyAqL1xuaW1wb3J0IENvbHVtbkNvbnRlbnQgZnJvbSBcIi4uL2NvbHVtbi1jb250ZW50XCJcbmltcG9ydCBjb2x1bW5JZGVudGlmaWVyIGZyb20gXCIuLi9jb2x1bW4taWRlbnRpZmllci5qc1wiXG5pbXBvcnQgY29sdW1uVmlzaWJsZSBmcm9tIFwiLi4vY29sdW1uLXZpc2libGUuanNcIlxuaW1wb3J0IHtzYXZlQXN9IGZyb20gXCJmaWxlLXNhdmVyXCJcbmltcG9ydCBJY29uIGZyb20gXCIuLi8uLi91dGlscy9pY29uXCJcbmltcG9ydCBtZW1vIGZyb20gXCJzZXQtc3RhdGUtY29tcGFyZS9idWlsZC9tZW1vLmpzXCJcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIlxuaW1wb3J0IHByb3BUeXBlc0V4YWN0IGZyb20gXCJwcm9wLXR5cGVzLWV4YWN0XCJcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHtyZW5kZXJUb1N0cmluZ30gZnJvbSBcInJlYWN0LWRvbS9zZXJ2ZXJcIiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGltcG9ydC9uby11bnJlc29sdmVkXG5pbXBvcnQge1NoYXBlQ29tcG9uZW50LCBzaGFwZUNvbXBvbmVudH0gZnJvbSBcInNldC1zdGF0ZS1jb21wYXJlL2J1aWxkL3NoYXBlLWNvbXBvbmVudC5qc1wiXG5pbXBvcnQge1ByZXNzYWJsZX0gZnJvbSBcInJlYWN0LW5hdGl2ZVwiXG5pbXBvcnQgVGV4dCBmcm9tIFwiLi4vLi4vdXRpbHMvdGV4dFwiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJvcHNcbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGxcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSB0YWJsZVxuICovXG4vKiogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIG5ldmVyPn0gU3RhdGUgKi9cbmV4cG9ydCBkZWZhdWx0IG1lbW8oc2hhcGVDb21wb25lbnQoLyoqIEBhdWdtZW50cyB7U2hhcGVDb21wb25lbnQ8UHJvcHMsIFN0YXRlPn0gKi8gY2xhc3MgQXBpTWFrZXJUYWJsZVNldHRpbmdzRG93bmxvYWRBY3Rpb24gZXh0ZW5kcyBTaGFwZUNvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSBwcm9wVHlwZXNFeGFjdCh7XG4gICAgbDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICB0YWJsZTogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkXG4gIH0pXG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8UHJlc3NhYmxlXG4gICAgICAgIGRhdGFTZXQ9e3RoaXMuY2FjaGUoXCJwcmVzc2FibGVEYXRhU2V0XCIsIHtjb21wb25lbnQ6IFwiYXBpLW1ha2VyL3RhYmxlL3NldHRpbmdzL2Rvd25sb2FkLWFjdGlvblwifSl9XG4gICAgICAgIG9uUHJlc3M9e3RoaXMudHQub25Eb3dubG9hZFByZXNzfVxuICAgICAgICBzdHlsZT17dGhpcy5jYWNoZShcInByZXNzYWJsZVN0eWxlXCIsIHtmbGV4RGlyZWN0aW9uOiBcInJvd1wiLCBhbGlnbkl0ZW1zOiBcImNlbnRlclwifSl9XG4gICAgICA+XG4gICAgICAgIDxJY29uIG5hbWU9XCJkb3dubG9hZFwiIHNpemU9ezIwfSAvPlxuICAgICAgICA8VGV4dCBzdHlsZT17dGhpcy5jYWNoZShcInRleHRTdHlsZVwiLCB7bWFyZ2luTGVmdDogNX0pfT5cbiAgICAgICAgICBEb3dubG9hZFxuICAgICAgICA8L1RleHQ+XG4gICAgICA8L1ByZXNzYWJsZT5cbiAgICApXG4gIH1cblxuICBvbkRvd25sb2FkUHJlc3MgPSAoKSA9PiB7XG4gICAgY29uc3Qge2wsIHRhYmxlfSA9IHRoaXMucFxuICAgIGNvbnN0IHttb2RlbENsYXNzfSA9IHRhYmxlLnBcbiAgICBjb25zdCB7Y29sbGVjdGlvbn0gPSB0YWJsZS50dFxuICAgIGNvbnN0IHttb2RlbHN9ID0gY29sbGVjdGlvblxuICAgIGNvbnN0IHtwcmVwYXJlZENvbHVtbnN9ID0gdGFibGUuc1xuICAgIGNvbnN0IHRhYmxlRWxlbWVudCA9IChcbiAgICAgIDx0YWJsZT5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIHtwcmVwYXJlZENvbHVtbnM/Lm1hcCgoe2NvbHVtbiwgdGFibGVTZXR0aW5nQ29sdW1ufSkgPT4gY29sdW1uVmlzaWJsZShjb2x1bW4sIHRhYmxlU2V0dGluZ0NvbHVtbikgJiZcbiAgICAgICAgICAgICAgPHRoIGtleT17Y29sdW1uSWRlbnRpZmllcihjb2x1bW4pfT5cbiAgICAgICAgICAgICAgICB7dGFibGUuaGVhZGVyTGFiZWxGb3JDb2x1bW4oY29sdW1uKX1cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgIHttb2RlbHMubWFwKChtb2RlbCkgPT5cbiAgICAgICAgICAgIDx0ciBrZXk9e21vZGVsLmlkKCl9PlxuICAgICAgICAgICAgICB7cHJlcGFyZWRDb2x1bW5zPy5tYXAoKHtjb2x1bW4sIHRhYmxlU2V0dGluZ0NvbHVtbn0pID0+IGNvbHVtblZpc2libGUoY29sdW1uLCB0YWJsZVNldHRpbmdDb2x1bW4pICYmXG4gICAgICAgICAgICAgICAgPHRkIGtleT17Y29sdW1uSWRlbnRpZmllcihjb2x1bW4pfT5cbiAgICAgICAgICAgICAgICAgIHtuZXcgQ29sdW1uQ29udGVudCh7Y29sdW1uLCBsLCBtb2RlOiBcImh0bWxcIiwgbW9kZWwsIHRhYmxlfSkuY29udGVudCgpfVxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgIClcbiAgICBjb25zdCB0YWJsZUhUTUwgPSByZW5kZXJUb1N0cmluZyh0YWJsZUVsZW1lbnQpXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFt0YWJsZUhUTUxdLCB7dHlwZTogXCJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOFwifSlcbiAgICBjb25zdCBmaWxlTmFtZSA9IGAke21vZGVsQ2xhc3MubW9kZWxOYW1lKCkuaHVtYW4oe2NvdW50OiAyfSl9Lmh0bWxgXG5cbiAgICBzYXZlQXMoYmxvYiwgZmlsZU5hbWUpXG4gIH1cbn0pKVxuIl19
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxvYWQtYWN0aW9uLmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJ0YWJsZS9zZXR0aW5ncy9kb3dubG9hZC1hY3Rpb24uanN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxZQUFZO0FBQ1osaUNBQWlDO0FBQ2pDLE9BQU8sRUFBQyxjQUFjLEVBQUUsY0FBYyxFQUFDLE1BQU0sNENBQTRDLENBQUE7QUFDekYsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0scUJBQXFCLENBQUE7QUFDdEQsT0FBTyxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDNUMsT0FBTyxjQUFjLE1BQU0saUJBQWlCLENBQUE7QUFDNUMsT0FBTyxxQkFBcUIsRUFBRSxFQUFDLCtCQUErQixFQUFDLE1BQU0sMEJBQTBCLENBQUE7QUFDL0YsT0FBTyxJQUFJLE1BQU0sa0JBQWtCLENBQUE7QUFDbkMsT0FBTyxJQUFJLE1BQU0saUNBQWlDLENBQUE7QUFDbEQsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFBO0FBQ2xDLE9BQU8sY0FBYyxNQUFNLGtCQUFrQixDQUFBO0FBQzdDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUN6QixPQUFPLElBQUksTUFBTSxrQkFBa0IsQ0FBQTtBQUNuQyxPQUFPLE9BQU8sTUFBTSx3Q0FBd0MsQ0FBQTtBQUU1RDs7Ozs7Ozs7R0FRRztBQUNILDRDQUE0QztBQUM1QyxlQUFlLElBQUksQ0FBQyxjQUFjLENBQUMsK0NBQStDLENBQUMsTUFBTSxtQ0FBb0MsU0FBUSxjQUFjO0lBQ2pKLE1BQU0sQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDO1FBQ2hDLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVU7UUFDNUIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVTtLQUNuQyxDQUFDLENBQUE7SUFFRixLQUFLLEdBQUc7UUFDTixTQUFTLEVBQUUsS0FBSztLQUNqQixDQUFBO0lB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SUFBSSxDQUFBO1FBRXZCLE1BQU0sUUFBUSxHQUFHLElBQUkscUJBQXFCLENBQUMsRUFBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDLENBQUE7UUFFdEYsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDdEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLEtBQUssWUFBWSwrQkFBK0I7Z0JBQUUsT0FBTTtZQUM1RCxJQUFJLEtBQUssSUFBSSxvQkFBb0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxZQUFZO2dCQUFFLE9BQU07WUFFdkUsa0JBQWtCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3pDLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQTtRQUMxQixDQUFDO0lBQ0gsQ0FBQyxDQUFBO0NBQ0YsQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcbi8qIGVzbGludC1kaXNhYmxlIHNvcnQtaW1wb3J0cyAqL1xuaW1wb3J0IHtTaGFwZUNvbXBvbmVudCwgc2hhcGVDb21wb25lbnR9IGZyb20gXCJzZXQtc3RhdGUtY29tcGFyZS9idWlsZC9zaGFwZS1jb21wb25lbnQuanNcIlxuaW1wb3J0IHtGbGFzaE5vdGlmaWNhdGlvbnN9IGZyb20gXCJmbGFzaC1ub3RpZmljYXRpb25zXCJcbmltcG9ydCB7UHJlc3NhYmxlLCBWaWV3fSBmcm9tIFwicmVhY3QtbmF0aXZlXCJcbmltcG9ydCBhcGlNYWtlckNvbmZpZyBmcm9tIFwiLi4vLi4vY29uZmlnLmpzXCJcbmltcG9ydCBBcGlNYWtlclRhYmxlRXhwb3J0ZXIsIHtBcGlNYWtlclRhYmxlRXhwb3J0QWJvcnRlZEVycm9yfSBmcm9tIFwiLi4vZXhwb3J0L3RhYmxlLWV4cG9ydGVyXCJcbmltcG9ydCBJY29uIGZyb20gXCIuLi8uLi91dGlscy9pY29uXCJcbmltcG9ydCBtZW1vIGZyb20gXCJzZXQtc3RhdGUtY29tcGFyZS9idWlsZC9tZW1vLmpzXCJcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIlxuaW1wb3J0IHByb3BUeXBlc0V4YWN0IGZyb20gXCJwcm9wLXR5cGVzLWV4YWN0XCJcbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFRleHQgZnJvbSBcIi4uLy4uL3V0aWxzL3RleHRcIlxuaW1wb3J0IHVzZUkxOG4gZnJvbSBcImkxOG4tb24tc3Rlcm9pZHMvYnVpbGQvc3JjL3VzZS1pMThuLmpzXCJcblxuLyoqXG4gKiBTdHJlYW1zIHRoZSB3aG9sZSB0YWJsZSByZXN1bHQgc2V0IHRvIGEgZmlsZSAoQ1NWIC8gSFRNTCAvIEV4Y2VsKSBpbnN0ZWFkIG9mIGJ1aWxkaW5nIG9uZSBiaWcgc3RyaW5nIGluXG4gKiBtZW1vcnkuIEV4Y2VsIGlzIG9ubHkgb2ZmZXJlZCB3aGVuIHRoZSBob3N0IGFwcCBoYXMgcmVnaXN0ZXJlZCBhbiB4bHN4IHNlcmlhbGl6ZXIgdmlhXG4gKiBhcGlNYWtlckNvbmZpZy5zZXRFeHBvcnRYbHN4U2VyaWFsaXplci5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcm9wc1xuICogQHByb3BlcnR5IHtGdW5jdGlvbn0gbFxuICogQHByb3BlcnR5IHtvYmplY3R9IHRhYmxlXG4gKi9cbi8qKiBAdHlwZWRlZiB7e2V4cG9ydGluZzogYm9vbGVhbn19IFN0YXRlICovXG5leHBvcnQgZGVmYXVsdCBtZW1vKHNoYXBlQ29tcG9uZW50KC8qKiBAYXVnbWVudHMge1NoYXBlQ29tcG9uZW50PFByb3BzLCBTdGF0ZT59ICovIGNsYXNzIEFwaU1ha2VyVGFibGVTZXR0aW5nc0Rvd25sb2FkQWN0aW9uIGV4dGVuZHMgU2hhcGVDb21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0gcHJvcFR5cGVzRXhhY3Qoe1xuICAgIGw6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgdGFibGU6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZFxuICB9KVxuXG4gIHN0YXRlID0ge1xuICAgIGV4cG9ydGluZzogZmFsc2VcbiAgfVxuXG4gIHNldHVwKCkge1xuICAgIGNvbnN0IHt0fSA9IHVzZUkxOG4oe25hbWVzcGFjZTogXCJqcy5hcGlfbWFrZXIudGFibGUuZG93bmxvYWRfYWN0aW9uXCJ9KVxuXG4gICAgdGhpcy50ID0gdFxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGV4Y2VsQXZhaWxhYmxlID0gQm9vbGVhbihhcGlNYWtlckNvbmZpZy5nZXRFeHBvcnRYbHN4U2VyaWFsaXplcigpKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxWaWV3IGRhdGFTZXQ9e3RoaXMuY2FjaGUoXCJyb290Vmlld0RhdGFTZXRcIiwge2NvbXBvbmVudDogXCJhcGktbWFrZXIvdGFibGUvc2V0dGluZ3MvZG93bmxvYWQtYWN0aW9uXCJ9KX0+XG4gICAgICAgIDxUZXh0IHN0eWxlPXt0aGlzLmNhY2hlKFwibGFiZWxTdHlsZVwiLCB7Zm9udFdlaWdodDogXCJib2xkXCIsIG1hcmdpbkJvdHRvbTogNH0pfT5cbiAgICAgICAgICB7dGhpcy50KFwiLmRvd25sb2FkXCIsIHtkZWZhdWx0VmFsdWU6IFwiRG93bmxvYWRcIn0pfVxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIHt0aGlzLmZvcm1hdEJ1dHRvbih7Zm9ybWF0OiBcImNzdlwiLCBsYWJlbDogXCJDU1ZcIiwgb25QcmVzczogdGhpcy50dC5vbkRvd25sb2FkQ3N2fSl9XG4gICAgICAgIHt0aGlzLmZvcm1hdEJ1dHRvbih7Zm9ybWF0OiBcImh0bWxcIiwgbGFiZWw6IFwiSFRNTFwiLCBvblByZXNzOiB0aGlzLnR0Lm9uRG93bmxvYWRIdG1sfSl9XG4gICAgICAgIHtleGNlbEF2YWlsYWJsZSAmJiB0aGlzLmZvcm1hdEJ1dHRvbih7Zm9ybWF0OiBcInhsc3hcIiwgbGFiZWw6IFwiRXhjZWxcIiwgb25QcmVzczogdGhpcy50dC5vbkRvd25sb2FkWGxzeH0pfVxuICAgICAgPC9WaWV3PlxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3tmb3JtYXQ6IFwiY3N2XCIgfCBcImh0bWxcIiB8IFwieGxzeFwiLCBsYWJlbDogc3RyaW5nLCBvblByZXNzOiAoKSA9PiB2b2lkfX0gYXJnc1xuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwicmVhY3RcIikuUmVhY3ROb2RlfVxuICAgKi9cbiAgZm9ybWF0QnV0dG9uKHtmb3JtYXQsIGxhYmVsLCBvblByZXNzfSkge1xuICAgIHJldHVybiAoXG4gICAgICA8UHJlc3NhYmxlXG4gICAgICAgIGRhdGFTZXQ9e3RoaXMuY2FjaGUoYGRvd25sb2FkJHtmb3JtYXR9RGF0YVNldGAsIHtjb21wb25lbnQ6IGBhcGktbWFrZXIvdGFibGUvc2V0dGluZ3MvZG93bmxvYWQtYWN0aW9uLyR7Zm9ybWF0fWB9KX1cbiAgICAgICAgZGlzYWJsZWQ9e3RoaXMucy5leHBvcnRpbmd9XG4gICAgICAgIG9uUHJlc3M9e29uUHJlc3N9XG4gICAgICAgIHN0eWxlPXt0aGlzLmNhY2hlKFwiZm9ybWF0QnV0dG9uU3R5bGVcIiwge2ZsZXhEaXJlY3Rpb246IFwicm93XCIsIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsIHBhZGRpbmdWZXJ0aWNhbDogM30pfVxuICAgICAgICB0ZXN0SUQ9e2Bkb3dubG9hZC1hY3Rpb24tJHtmb3JtYXR9YH1cbiAgICAgID5cbiAgICAgICAgPEljb24gbmFtZT1cImRvd25sb2FkXCIgc2l6ZT17MTh9IC8+XG4gICAgICAgIDxUZXh0IHN0eWxlPXt0aGlzLmNhY2hlKFwiZm9ybWF0TGFiZWxTdHlsZVwiLCB7bWFyZ2luTGVmdDogNX0pfT5cbiAgICAgICAgICB7bGFiZWx9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvUHJlc3NhYmxlPlxuICAgIClcbiAgfVxuXG4gIG9uRG93bmxvYWRDc3YgPSAoKSA9PiB0aGlzLnN0YXJ0RXhwb3J0KFwiY3N2XCIpXG4gIG9uRG93bmxvYWRIdG1sID0gKCkgPT4gdGhpcy5zdGFydEV4cG9ydChcImh0bWxcIilcbiAgb25Eb3dubG9hZFhsc3ggPSAoKSA9PiB0aGlzLnN0YXJ0RXhwb3J0KFwieGxzeFwiKVxuXG4gIC8qKiBAcGFyYW0ge1wiY3N2XCIgfCBcImh0bWxcIiB8IFwieGxzeFwifSBmb3JtYXQgKi9cbiAgc3RhcnRFeHBvcnQgPSBhc3luYyAoZm9ybWF0KSA9PiB7XG4gICAgaWYgKHRoaXMucy5leHBvcnRpbmcpIHJldHVyblxuXG4gICAgdGhpcy5zLmV4cG9ydGluZyA9IHRydWVcblxuICAgIGNvbnN0IGV4cG9ydGVyID0gbmV3IEFwaU1ha2VyVGFibGVFeHBvcnRlcih7Zm9ybWF0LCBsOiB0aGlzLnAubCwgdGFibGU6IHRoaXMucC50YWJsZX0pXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhwb3J0ZXIucnVuKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQXBpTWFrZXJUYWJsZUV4cG9ydEFib3J0ZWRFcnJvcikgcmV0dXJuXG4gICAgICBpZiAoZXJyb3IgJiYgLyoqIEB0eXBlIHtFcnJvcn0gKi8gKGVycm9yKS5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuXG5cbiAgICAgIEZsYXNoTm90aWZpY2F0aW9ucy5lcnJvclJlc3BvbnNlKGVycm9yKVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnMuZXhwb3J0aW5nID0gZmFsc2VcbiAgICB9XG4gIH1cbn0pKVxuIl19
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kaspernj/api-maker",
3
3
  "type": "module",
4
- "version": "1.0.2171",
4
+ "version": "1.0.2172",
5
5
  "description": "My new module",
6
6
  "files": [
7
7
  "build/**"