@loaders.gl/netcdf 3.1.0-alpha.4 → 3.1.0-beta.3

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 (46) hide show
  1. package/dist/es5/index.js +2 -2
  2. package/dist/es5/iobuffer/iobuffer.js +259 -318
  3. package/dist/es5/iobuffer/iobuffer.js.map +1 -1
  4. package/dist/es5/netcdf-loader.js +11 -62
  5. package/dist/es5/netcdf-loader.js.map +1 -1
  6. package/dist/es5/netcdfjs/netcdf-reader.js +97 -155
  7. package/dist/es5/netcdfjs/netcdf-reader.js.map +1 -1
  8. package/dist/es5/netcdfjs/read-data.js +12 -12
  9. package/dist/es5/netcdfjs/read-data.js.map +1 -1
  10. package/dist/es5/netcdfjs/read-header.js +58 -58
  11. package/dist/es5/netcdfjs/read-header.js.map +1 -1
  12. package/dist/es5/netcdfjs/read-type.js +3 -3
  13. package/dist/es5/netcdfjs/read-type.js.map +1 -1
  14. package/dist/esm/netcdf-loader.js +1 -1
  15. package/dist/esm/netcdf-loader.js.map +1 -1
  16. package/dist/esm/netcdfjs/netcdf-reader.js +7 -7
  17. package/dist/esm/netcdfjs/netcdf-reader.js.map +1 -1
  18. package/dist/esm/netcdfjs/read-header.js +2 -2
  19. package/dist/esm/netcdfjs/read-header.js.map +1 -1
  20. package/dist/esm/netcdfjs/read-type.js +1 -1
  21. package/dist/esm/netcdfjs/read-type.js.map +1 -1
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +7 -0
  25. package/dist/iobuffer/iobuffer.d.ts +254 -0
  26. package/dist/iobuffer/iobuffer.d.ts.map +1 -0
  27. package/dist/iobuffer/iobuffer.js +427 -0
  28. package/dist/netcdf-loader.d.ts +52 -0
  29. package/dist/netcdf-loader.d.ts.map +1 -0
  30. package/dist/netcdf-loader.js +52 -0
  31. package/dist/netcdfjs/netcdf-reader.d.ts +68 -0
  32. package/dist/netcdfjs/netcdf-reader.d.ts.map +1 -0
  33. package/dist/netcdfjs/netcdf-reader.js +165 -0
  34. package/dist/netcdfjs/netcdf-types.d.ts +70 -0
  35. package/dist/netcdfjs/netcdf-types.d.ts.map +1 -0
  36. package/dist/netcdfjs/netcdf-types.js +2 -0
  37. package/dist/netcdfjs/read-data.d.ts +18 -0
  38. package/dist/netcdfjs/read-data.d.ts.map +1 -0
  39. package/dist/netcdfjs/read-data.js +49 -0
  40. package/dist/netcdfjs/read-header.d.ts +16 -0
  41. package/dist/netcdfjs/read-header.d.ts.map +1 -0
  42. package/dist/netcdfjs/read-header.js +230 -0
  43. package/dist/netcdfjs/read-type.d.ts +36 -0
  44. package/dist/netcdfjs/read-type.d.ts.map +1 -0
  45. package/dist/netcdfjs/read-type.js +140 -0
  46. package/package.json +7 -8
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/netcdfjs/read-data.ts"],"names":["readNonRecord","buffer","variable","type","size","data","Array","i","readRecord","recordDimension","width","length","step","recordStep","currentOffset","offset","seek"],"mappings":";;;;;;;;AAEA;;AAUO,SAASA,aAAT,CACLC,MADK,EAELC,QAFK,EAGwC;AAE7C,MAAMC,IAAI,GAAG,uBAAQD,QAAQ,CAACC,IAAjB,CAAb;AAGA,MAAMC,IAAI,GAAGF,QAAQ,CAACE,IAAT,GAAgB,yBAAUD,IAAV,CAA7B;AAGA,MAAME,IAAI,GAAG,IAAIC,KAAJ,CAAUF,IAAV,CAAb;;AACA,OAAK,IAAIG,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGH,IAApB,EAA0BG,CAAC,EAA3B,EAA+B;AAC7BF,IAAAA,IAAI,CAACE,CAAD,CAAJ,GAAU,wBAASN,MAAT,EAAiBE,IAAjB,EAAuB,CAAvB,CAAV;AACD;;AAED,SAAOE,IAAP;AACD;;AASM,SAASG,UAAT,CACLP,MADK,EAELC,QAFK,EAGLO,eAHK,EAIwC;AAE7C,MAAMN,IAAI,GAAG,uBAAQD,QAAQ,CAACC,IAAjB,CAAb;AACA,MAAMO,KAAK,GAAGR,QAAQ,CAACE,IAAT,GAAgBF,QAAQ,CAACE,IAAT,GAAgB,yBAAUD,IAAV,CAAhC,GAAkD,CAAhE;AAIA,MAAMC,IAAI,GAAGK,eAAe,CAACE,MAA7B;AAGA,MAAMN,IAAI,GAAG,IAAIC,KAAJ,CAAUF,IAAV,CAAb;AACA,MAAMQ,IAAI,GAAGH,eAAe,CAACI,UAA7B;;AAEA,OAAK,IAAIN,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGH,IAApB,EAA0BG,CAAC,EAA3B,EAA+B;AAC7B,QAAMO,aAAa,GAAGb,MAAM,CAACc,MAA7B;AACAV,IAAAA,IAAI,CAACE,CAAD,CAAJ,GAAU,wBAASN,MAAT,EAAiBE,IAAjB,EAAuBO,KAAvB,CAAV;AACAT,IAAAA,MAAM,CAACe,IAAP,CAAYF,aAAa,GAAGF,IAA5B;AACD;;AAED,SAAOP,IAAP;AACD","sourcesContent":["import type {IOBuffer} from '../iobuffer/iobuffer';\nimport type {NetCDFRecordDimension, NetCDFVariable} from './netcdf-types';\nimport {readType, str2num, num2bytes} from './read-type';\n\n// const STREAMING = 4294967295;\n\n/**\n * Read data for the given non-record variable\n * @param buffer - Buffer for the file data\n * @param variable - Variable metadata\n * @return Data of the element\n */\nexport function readNonRecord(\n buffer: IOBuffer,\n variable: NetCDFVariable\n): (string | number | number[] | Uint8Array)[] {\n // variable type\n const type = str2num(variable.type);\n\n // size of the data\n const size = variable.size / num2bytes(type);\n\n // iterates over the data\n const data = new Array(size);\n for (let i = 0; i < size; i++) {\n data[i] = readType(buffer, type, 1);\n }\n\n return data;\n}\n\n/**\n * Read data for the given record variable\n * @param buffer - Buffer for the file data\n * @param variable - Variable metadata\n * @param recordDimension - Record dimension metadata\n * @return - Data of the element\n */\nexport function readRecord(\n buffer: IOBuffer,\n variable: NetCDFVariable,\n recordDimension: NetCDFRecordDimension\n): (string | number | number[] | Uint8Array)[] {\n // variable type\n const type = str2num(variable.type);\n const width = variable.size ? variable.size / num2bytes(type) : 1;\n\n // size of the data\n // TODO streaming data\n const size = recordDimension.length;\n\n // iterates over the data\n const data = new Array(size);\n const step = recordDimension.recordStep;\n\n for (let i = 0; i < size; i++) {\n const currentOffset = buffer.offset;\n data[i] = readType(buffer, type, width);\n buffer.seek(currentOffset + step);\n }\n\n return data;\n}\n"],"file":"read-data.js"}
1
+ {"version":3,"sources":["../../../src/netcdfjs/read-data.ts"],"names":["readNonRecord","buffer","variable","type","size","data","Array","i","readRecord","recordDimension","width","length","step","recordStep","currentOffset","offset","seek"],"mappings":";;;;;;;;AAEA;;AAUO,SAASA,aAAT,CACLC,MADK,EAELC,QAFK,EAGwC;AAE7C,QAAMC,IAAI,GAAG,uBAAQD,QAAQ,CAACC,IAAjB,CAAb;AAGA,QAAMC,IAAI,GAAGF,QAAQ,CAACE,IAAT,GAAgB,yBAAUD,IAAV,CAA7B;AAGA,QAAME,IAAI,GAAG,IAAIC,KAAJ,CAAUF,IAAV,CAAb;;AACA,OAAK,IAAIG,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGH,IAApB,EAA0BG,CAAC,EAA3B,EAA+B;AAC7BF,IAAAA,IAAI,CAACE,CAAD,CAAJ,GAAU,wBAASN,MAAT,EAAiBE,IAAjB,EAAuB,CAAvB,CAAV;AACD;;AAED,SAAOE,IAAP;AACD;;AASM,SAASG,UAAT,CACLP,MADK,EAELC,QAFK,EAGLO,eAHK,EAIwC;AAE7C,QAAMN,IAAI,GAAG,uBAAQD,QAAQ,CAACC,IAAjB,CAAb;AACA,QAAMO,KAAK,GAAGR,QAAQ,CAACE,IAAT,GAAgBF,QAAQ,CAACE,IAAT,GAAgB,yBAAUD,IAAV,CAAhC,GAAkD,CAAhE;AAIA,QAAMC,IAAI,GAAGK,eAAe,CAACE,MAA7B;AAGA,QAAMN,IAAI,GAAG,IAAIC,KAAJ,CAAUF,IAAV,CAAb;AACA,QAAMQ,IAAI,GAAGH,eAAe,CAACI,UAA7B;;AAEA,OAAK,IAAIN,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGH,IAApB,EAA0BG,CAAC,EAA3B,EAA+B;AAC7B,UAAMO,aAAa,GAAGb,MAAM,CAACc,MAA7B;AACAV,IAAAA,IAAI,CAACE,CAAD,CAAJ,GAAU,wBAASN,MAAT,EAAiBE,IAAjB,EAAuBO,KAAvB,CAAV;AACAT,IAAAA,MAAM,CAACe,IAAP,CAAYF,aAAa,GAAGF,IAA5B;AACD;;AAED,SAAOP,IAAP;AACD","sourcesContent":["import type {IOBuffer} from '../iobuffer/iobuffer';\nimport type {NetCDFRecordDimension, NetCDFVariable} from './netcdf-types';\nimport {readType, str2num, num2bytes} from './read-type';\n\n// const STREAMING = 4294967295;\n\n/**\n * Read data for the given non-record variable\n * @param buffer - Buffer for the file data\n * @param variable - Variable metadata\n * @return Data of the element\n */\nexport function readNonRecord(\n buffer: IOBuffer,\n variable: NetCDFVariable\n): (string | number | number[] | Uint8Array)[] {\n // variable type\n const type = str2num(variable.type);\n\n // size of the data\n const size = variable.size / num2bytes(type);\n\n // iterates over the data\n const data = new Array(size);\n for (let i = 0; i < size; i++) {\n data[i] = readType(buffer, type, 1);\n }\n\n return data;\n}\n\n/**\n * Read data for the given record variable\n * @param buffer - Buffer for the file data\n * @param variable - Variable metadata\n * @param recordDimension - Record dimension metadata\n * @return - Data of the element\n */\nexport function readRecord(\n buffer: IOBuffer,\n variable: NetCDFVariable,\n recordDimension: NetCDFRecordDimension\n): (string | number | number[] | Uint8Array)[] {\n // variable type\n const type = str2num(variable.type);\n const width = variable.size ? variable.size / num2bytes(type) : 1;\n\n // size of the data\n // TODO streaming data\n const size = recordDimension.length;\n\n // iterates over the data\n const data = new Array(size);\n const step = recordDimension.recordStep;\n\n for (let i = 0; i < size; i++) {\n const currentOffset = buffer.offset;\n data[i] = readType(buffer, type, width);\n buffer.seek(currentOffset + step);\n }\n\n return data;\n}\n"],"file":"read-data.js"}
@@ -8,19 +8,19 @@ exports.readName = readName;
8
8
 
9
9
  var _readType = require("./read-type");
10
10
 
11
- var ZERO = 0;
12
- var NC_DIMENSION = 10;
13
- var NC_VARIABLE = 11;
14
- var NC_ATTRIBUTE = 12;
15
- var NC_UNLIMITED = 0;
11
+ const ZERO = 0;
12
+ const NC_DIMENSION = 10;
13
+ const NC_VARIABLE = 11;
14
+ const NC_ATTRIBUTE = 12;
15
+ const NC_UNLIMITED = 0;
16
16
 
17
17
  function readNetCDFHeader(buffer, version) {
18
- var recordDimensionLength = buffer.readUint32();
19
- var dimList = readDimensionsList(buffer);
20
- var attributes = readAttributesList(buffer);
21
- var variableList = readVariablesList(buffer, dimList.recordId, version);
22
- var header = {
23
- version: version,
18
+ const recordDimensionLength = buffer.readUint32();
19
+ const dimList = readDimensionsList(buffer);
20
+ const attributes = readAttributesList(buffer);
21
+ const variableList = readVariablesList(buffer, dimList.recordId, version);
22
+ const header = {
23
+ version,
24
24
  recordDimension: {
25
25
  length: recordDimensionLength,
26
26
  id: dimList.recordId,
@@ -29,13 +29,13 @@ function readNetCDFHeader(buffer, version) {
29
29
  },
30
30
  dimensions: dimList.dimensions,
31
31
  variables: variableList.variables,
32
- attributes: attributes
32
+ attributes
33
33
  };
34
34
  return header;
35
35
  }
36
36
 
37
37
  function readDimensionsList(buffer) {
38
- var dimList = buffer.readUint32();
38
+ const dimList = buffer.readUint32();
39
39
 
40
40
  if (dimList === ZERO) {
41
41
  if (buffer.readUint32() !== ZERO) {
@@ -53,14 +53,14 @@ function readDimensionsList(buffer) {
53
53
  throw new Error('NetCDF: wrong tag for list of dimensions');
54
54
  }
55
55
 
56
- var dimensionSize = buffer.readUint32();
57
- var dimensions = new Array(dimensionSize);
58
- var recordId;
59
- var recordName;
56
+ const dimensionSize = buffer.readUint32();
57
+ const dimensions = new Array(dimensionSize);
58
+ let recordId;
59
+ let recordName;
60
60
 
61
- for (var dim = 0; dim < dimensionSize; dim++) {
62
- var name = readName(buffer);
63
- var size = buffer.readUint32();
61
+ for (let dim = 0; dim < dimensionSize; dim++) {
62
+ const name = readName(buffer);
63
+ const size = buffer.readUint32();
64
64
 
65
65
  if (size === NC_UNLIMITED) {
66
66
  recordId = dim;
@@ -68,20 +68,20 @@ function readDimensionsList(buffer) {
68
68
  }
69
69
 
70
70
  dimensions[dim] = {
71
- name: name,
72
- size: size
71
+ name,
72
+ size
73
73
  };
74
74
  }
75
75
 
76
76
  return {
77
- dimensions: dimensions,
78
- recordId: recordId,
79
- recordName: recordName
77
+ dimensions,
78
+ recordId,
79
+ recordName
80
80
  };
81
81
  }
82
82
 
83
83
  function readAttributesList(buffer) {
84
- var gAttList = buffer.readUint32();
84
+ const gAttList = buffer.readUint32();
85
85
 
86
86
  if (gAttList === ZERO) {
87
87
  if (buffer.readUint32() !== ZERO) {
@@ -95,24 +95,24 @@ function readAttributesList(buffer) {
95
95
  throw new Error('NetCDF: wrong tag for list of attributes');
96
96
  }
97
97
 
98
- var attributeSize = buffer.readUint32();
99
- var attributes = new Array(attributeSize);
98
+ const attributeSize = buffer.readUint32();
99
+ const attributes = new Array(attributeSize);
100
100
 
101
- for (var gAtt = 0; gAtt < attributeSize; gAtt++) {
102
- var name = readName(buffer);
103
- var type = buffer.readUint32();
101
+ for (let gAtt = 0; gAtt < attributeSize; gAtt++) {
102
+ const name = readName(buffer);
103
+ const type = buffer.readUint32();
104
104
 
105
105
  if (type < 1 || type > 6) {
106
106
  throw new Error("NetCDF: non valid type ".concat(type));
107
107
  }
108
108
 
109
- var size = buffer.readUint32();
110
- var value = (0, _readType.readType)(buffer, type, size);
109
+ const size = buffer.readUint32();
110
+ const value = (0, _readType.readType)(buffer, type, size);
111
111
  padding(buffer);
112
112
  attributes[gAtt] = {
113
- name: name,
113
+ name,
114
114
  type: (0, _readType.num2str)(type),
115
- value: value
115
+ value
116
116
  };
117
117
  }
118
118
 
@@ -120,8 +120,8 @@ function readAttributesList(buffer) {
120
120
  }
121
121
 
122
122
  function readVariablesList(buffer, recordId, version) {
123
- var varList = buffer.readUint32();
124
- var recordStep = 0;
123
+ const varList = buffer.readUint32();
124
+ let recordStep = 0;
125
125
 
126
126
  if (varList === ZERO) {
127
127
  if (buffer.readUint32() !== ZERO) {
@@ -129,7 +129,7 @@ function readVariablesList(buffer, recordId, version) {
129
129
  }
130
130
 
131
131
  return {
132
- recordStep: recordStep,
132
+ recordStep,
133
133
  variables: []
134
134
  };
135
135
  }
@@ -138,27 +138,27 @@ function readVariablesList(buffer, recordId, version) {
138
138
  throw new Error('NetCDF: wrong tag for list of variables');
139
139
  }
140
140
 
141
- var variableSize = buffer.readUint32();
142
- var variables = new Array(variableSize);
141
+ const variableSize = buffer.readUint32();
142
+ const variables = new Array(variableSize);
143
143
 
144
- for (var v = 0; v < variableSize; v++) {
145
- var name = readName(buffer);
146
- var dimensionality = buffer.readUint32();
147
- var dimensionsIds = new Array(dimensionality);
144
+ for (let v = 0; v < variableSize; v++) {
145
+ const name = readName(buffer);
146
+ const dimensionality = buffer.readUint32();
147
+ const dimensionsIds = new Array(dimensionality);
148
148
 
149
- for (var dim = 0; dim < dimensionality; dim++) {
149
+ for (let dim = 0; dim < dimensionality; dim++) {
150
150
  dimensionsIds[dim] = buffer.readUint32();
151
151
  }
152
152
 
153
- var attributes = readAttributesList(buffer);
154
- var type = buffer.readUint32();
153
+ const attributes = readAttributesList(buffer);
154
+ const type = buffer.readUint32();
155
155
 
156
156
  if (type < 1 && type > 6) {
157
157
  throw new Error("NetCDF: non valid type ".concat(type));
158
158
  }
159
159
 
160
- var varSize = buffer.readUint32();
161
- var offset = buffer.readUint32();
160
+ const varSize = buffer.readUint32();
161
+ let offset = buffer.readUint32();
162
162
 
163
163
  if (version === 2) {
164
164
  if (offset > 0) {
@@ -168,7 +168,7 @@ function readVariablesList(buffer, recordId, version) {
168
168
  offset = buffer.readUint32();
169
169
  }
170
170
 
171
- var record = false;
171
+ let record = false;
172
172
 
173
173
  if (typeof recordId !== 'undefined' && dimensionsIds[0] === recordId) {
174
174
  recordStep += varSize;
@@ -176,25 +176,25 @@ function readVariablesList(buffer, recordId, version) {
176
176
  }
177
177
 
178
178
  variables[v] = {
179
- name: name,
179
+ name,
180
180
  dimensions: dimensionsIds,
181
- attributes: attributes,
181
+ attributes,
182
182
  type: (0, _readType.num2str)(type),
183
183
  size: varSize,
184
- offset: offset,
185
- record: record
184
+ offset,
185
+ record
186
186
  };
187
187
  }
188
188
 
189
189
  return {
190
- variables: variables,
191
- recordStep: recordStep
190
+ variables,
191
+ recordStep
192
192
  };
193
193
  }
194
194
 
195
195
  function readName(buffer) {
196
- var nameLength = buffer.readUint32();
197
- var name = buffer.readChars(nameLength);
196
+ const nameLength = buffer.readUint32();
197
+ const name = buffer.readChars(nameLength);
198
198
  padding(buffer);
199
199
  return name;
200
200
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/netcdfjs/read-header.ts"],"names":["ZERO","NC_DIMENSION","NC_VARIABLE","NC_ATTRIBUTE","NC_UNLIMITED","readNetCDFHeader","buffer","version","recordDimensionLength","readUint32","dimList","readDimensionsList","attributes","readAttributesList","variableList","readVariablesList","recordId","header","recordDimension","length","id","name","recordName","recordStep","dimensions","variables","Error","dimensionSize","Array","dim","readName","size","gAttList","attributeSize","gAtt","type","value","padding","varList","variableSize","v","dimensionality","dimensionsIds","varSize","offset","record","nameLength","readChars","skip"],"mappings":"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","sourcesContent":["import type {IOBuffer} from '../iobuffer/iobuffer';\nimport type {NetCDFHeader, NetCDFDimension, NetCDFVariable, NetCDFAttribute} from './netcdf-types';\nimport {readType, num2str} from './read-type';\n\n// Grammar constants\nconst ZERO = 0;\nconst NC_DIMENSION = 10;\nconst NC_VARIABLE = 11;\nconst NC_ATTRIBUTE = 12;\n\nconst NC_UNLIMITED = 0;\n\n/**\n * Read the header of the file\n * @param buffer - Buffer for the file data\n * @param version - Version of the file\n * @return - Header\n */\nexport function readNetCDFHeader(buffer: IOBuffer, version: number): NetCDFHeader {\n // Length of record dimension\n // sum of the varSize's of all the record variables.\n const recordDimensionLength = buffer.readUint32();\n\n // List of dimensions\n const dimList = readDimensionsList(buffer);\n\n // List of global attributes\n const attributes = readAttributesList(buffer);\n\n // List of variables\n const variableList = readVariablesList(buffer, dimList.recordId, version);\n\n const header: NetCDFHeader = {\n version,\n recordDimension: {\n length: recordDimensionLength,\n id: dimList.recordId, // id of the unlimited dimension\n name: dimList.recordName, // name of the unlimited dimension\n recordStep: variableList.recordStep\n },\n dimensions: dimList.dimensions,\n variables: variableList.variables,\n attributes\n };\n\n return header;\n}\n\n/**\n * Read list of dimensions\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n */\nfunction readDimensionsList(buffer: IOBuffer): {\n recordId: number;\n recordName: string;\n dimensions: NetCDFDimension[];\n} {\n const dimList = buffer.readUint32();\n if (dimList === ZERO) {\n if (buffer.readUint32() !== ZERO) {\n throw new Error('NetCDF: wrong empty tag for list of dimensions');\n }\n // TODO - is this empty dimension list supported / recoverable?\n return {\n recordId: 0,\n recordName: '',\n dimensions: []\n };\n }\n\n if (dimList !== NC_DIMENSION) {\n throw new Error('NetCDF: wrong tag for list of dimensions');\n }\n\n // Length of dimensions\n const dimensionSize = buffer.readUint32();\n const dimensions = new Array(dimensionSize);\n let recordId;\n let recordName;\n for (let dim = 0; dim < dimensionSize; dim++) {\n // Read name\n const name = readName(buffer);\n\n // Read dimension size\n const size = buffer.readUint32();\n if (size === NC_UNLIMITED) {\n // in netcdf 3 one field can be of size unlimmited\n recordId = dim;\n recordName = name;\n }\n\n dimensions[dim] = {\n name,\n size\n };\n }\n\n return {\n dimensions,\n recordId,\n recordName\n };\n}\n\n/**\n * List of attributes\n * @ignore\n * @param buffer - Buffer for the file data\n * @return List of attributes with:\n */\nfunction readAttributesList(buffer: IOBuffer): NetCDFAttribute[] {\n const gAttList = buffer.readUint32();\n if (gAttList === ZERO) {\n if (buffer.readUint32() !== ZERO) {\n throw new Error('NetCDF: wrong empty tag for list of attributes');\n }\n return [];\n }\n\n if (gAttList !== NC_ATTRIBUTE) {\n throw new Error('NetCDF: wrong tag for list of attributes');\n }\n\n // Length of attributes\n const attributeSize = buffer.readUint32();\n const attributes = new Array(attributeSize);\n for (let gAtt = 0; gAtt < attributeSize; gAtt++) {\n // Read name\n const name = readName(buffer);\n\n // Read type\n const type = buffer.readUint32();\n if (type < 1 || type > 6) {\n throw new Error(`NetCDF: non valid type ${type}`);\n }\n\n // Read attribute\n const size = buffer.readUint32();\n const value = readType(buffer, type, size);\n\n // Apply padding\n padding(buffer);\n\n attributes[gAtt] = {\n name,\n type: num2str(type),\n value\n };\n }\n return attributes;\n}\n\n/**\n * List of variables\n * @param buffer - Buffer for the file data\n * @param recordId - Id of the unlimited dimension (also called record dimension)\n * This value may be undefined if there is no unlimited dimension\n * @param {number} version - Version of the file\n */\n// eslint-disable-next-line max-statements, complexity\nfunction readVariablesList(\n buffer: IOBuffer,\n recordId: number,\n version: number\n): {\n recordStep: number;\n variables: NetCDFVariable[];\n} {\n const varList = buffer.readUint32();\n let recordStep = 0;\n if (varList === ZERO) {\n if (buffer.readUint32() !== ZERO) {\n throw new Error('NetCDF: wrong empty tag for list of variables');\n }\n return {\n recordStep,\n variables: []\n };\n }\n\n if (varList !== NC_VARIABLE) {\n throw new Error('NetCDF: wrong tag for list of variables');\n }\n\n // Length of variables\n const variableSize = buffer.readUint32();\n const variables = new Array(variableSize);\n for (let v = 0; v < variableSize; v++) {\n // Read name\n const name = readName(buffer);\n\n // Read dimensionality of the variable\n const dimensionality = buffer.readUint32();\n\n // Index into the list of dimensions\n const dimensionsIds = new Array(dimensionality);\n for (let dim = 0; dim < dimensionality; dim++) {\n dimensionsIds[dim] = buffer.readUint32();\n }\n\n // Read variables size\n const attributes = readAttributesList(buffer);\n\n // Read type\n const type = buffer.readUint32();\n if (type < 1 && type > 6) {\n throw new Error(`NetCDF: non valid type ${type}`);\n }\n\n // Read variable size\n // The 32-bit varSize field is not large enough to contain the size of variables that require\n // more than 2^32 - 4 bytes, so 2^32 - 1 is used in the varSize field for such variables.\n const varSize = buffer.readUint32();\n\n // Read offset\n let offset = buffer.readUint32();\n if (version === 2) {\n if (offset > 0) {\n throw new Error('NetCDF: offsets larger than 4GB not supported');\n }\n offset = buffer.readUint32();\n }\n\n let record = false;\n // Count amount of record variables\n if (typeof recordId !== 'undefined' && dimensionsIds[0] === recordId) {\n recordStep += varSize;\n record = true;\n }\n variables[v] = {\n name,\n dimensions: dimensionsIds,\n attributes,\n type: num2str(type),\n size: varSize,\n offset,\n record\n };\n }\n\n return {\n variables,\n recordStep\n };\n}\n\n// HELPERS\n\n/**\n * Reads the name\n * @param buffer - Buffer for the file data\n * @return Name\n */\nexport function readName(buffer: IOBuffer): string {\n // Read name\n const nameLength = buffer.readUint32();\n const name = buffer.readChars(nameLength);\n\n // validate name\n // TODO\n\n // Apply padding\n padding(buffer);\n return name;\n}\n\n/**\n * Moves 1, 2, or 3 bytes to next 4-byte boundary\n */\nfunction padding(buffer: IOBuffer) {\n if (buffer.offset % 4 !== 0) {\n buffer.skip(4 - (buffer.offset % 4));\n }\n}\n"],"file":"read-header.js"}
1
+ {"version":3,"sources":["../../../src/netcdfjs/read-header.ts"],"names":["ZERO","NC_DIMENSION","NC_VARIABLE","NC_ATTRIBUTE","NC_UNLIMITED","readNetCDFHeader","buffer","version","recordDimensionLength","readUint32","dimList","readDimensionsList","attributes","readAttributesList","variableList","readVariablesList","recordId","header","recordDimension","length","id","name","recordName","recordStep","dimensions","variables","Error","dimensionSize","Array","dim","readName","size","gAttList","attributeSize","gAtt","type","value","padding","varList","variableSize","v","dimensionality","dimensionsIds","varSize","offset","record","nameLength","readChars","skip"],"mappings":"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","sourcesContent":["import type {IOBuffer} from '../iobuffer/iobuffer';\nimport type {NetCDFHeader, NetCDFDimension, NetCDFVariable, NetCDFAttribute} from './netcdf-types';\nimport {readType, num2str} from './read-type';\n\n// Grammar constants\nconst ZERO = 0;\nconst NC_DIMENSION = 10;\nconst NC_VARIABLE = 11;\nconst NC_ATTRIBUTE = 12;\n\nconst NC_UNLIMITED = 0;\n\n/**\n * Read the header of the file\n * @param buffer - Buffer for the file data\n * @param version - Version of the file\n * @return - Header\n */\nexport function readNetCDFHeader(buffer: IOBuffer, version: number): NetCDFHeader {\n // Length of record dimension\n // sum of the varSize's of all the record variables.\n const recordDimensionLength = buffer.readUint32();\n\n // List of dimensions\n const dimList = readDimensionsList(buffer);\n\n // List of global attributes\n const attributes = readAttributesList(buffer);\n\n // List of variables\n const variableList = readVariablesList(buffer, dimList.recordId, version);\n\n const header: NetCDFHeader = {\n version,\n recordDimension: {\n length: recordDimensionLength,\n id: dimList.recordId, // id of the unlimited dimension\n name: dimList.recordName, // name of the unlimited dimension\n recordStep: variableList.recordStep\n },\n dimensions: dimList.dimensions,\n variables: variableList.variables,\n attributes\n };\n\n return header;\n}\n\n/**\n * Read list of dimensions\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n */\nfunction readDimensionsList(buffer: IOBuffer): {\n recordId: number;\n recordName: string;\n dimensions: NetCDFDimension[];\n} {\n const dimList = buffer.readUint32();\n if (dimList === ZERO) {\n if (buffer.readUint32() !== ZERO) {\n throw new Error('NetCDF: wrong empty tag for list of dimensions');\n }\n // TODO - is this empty dimension list supported / recoverable?\n return {\n recordId: 0,\n recordName: '',\n dimensions: []\n };\n }\n\n if (dimList !== NC_DIMENSION) {\n throw new Error('NetCDF: wrong tag for list of dimensions');\n }\n\n // Length of dimensions\n const dimensionSize = buffer.readUint32();\n const dimensions = new Array(dimensionSize);\n let recordId;\n let recordName;\n for (let dim = 0; dim < dimensionSize; dim++) {\n // Read name\n const name = readName(buffer);\n\n // Read dimension size\n const size = buffer.readUint32();\n if (size === NC_UNLIMITED) {\n // in netcdf 3 one field can be of size unlimmited\n recordId = dim;\n recordName = name;\n }\n\n dimensions[dim] = {\n name,\n size\n };\n }\n\n return {\n dimensions,\n recordId,\n recordName\n };\n}\n\n/**\n * List of attributes\n * @ignore\n * @param buffer - Buffer for the file data\n * @return List of attributes with:\n */\nfunction readAttributesList(buffer: IOBuffer): NetCDFAttribute[] {\n const gAttList = buffer.readUint32();\n if (gAttList === ZERO) {\n if (buffer.readUint32() !== ZERO) {\n throw new Error('NetCDF: wrong empty tag for list of attributes');\n }\n return [];\n }\n\n if (gAttList !== NC_ATTRIBUTE) {\n throw new Error('NetCDF: wrong tag for list of attributes');\n }\n\n // Length of attributes\n const attributeSize = buffer.readUint32();\n const attributes = new Array(attributeSize);\n for (let gAtt = 0; gAtt < attributeSize; gAtt++) {\n // Read name\n const name = readName(buffer);\n\n // Read type\n const type = buffer.readUint32();\n if (type < 1 || type > 6) {\n throw new Error(`NetCDF: non valid type ${type}`);\n }\n\n // Read attribute\n const size = buffer.readUint32();\n const value = readType(buffer, type, size);\n\n // Apply padding\n padding(buffer);\n\n attributes[gAtt] = {\n name,\n type: num2str(type),\n value\n };\n }\n return attributes;\n}\n\n/**\n * List of variables\n * @param buffer - Buffer for the file data\n * @param recordId - Id of the unlimited dimension (also called record dimension)\n * This value may be undefined if there is no unlimited dimension\n * @param {number} version - Version of the file\n */\n// eslint-disable-next-line max-statements, complexity\nfunction readVariablesList(\n buffer: IOBuffer,\n recordId: number,\n version: number\n): {\n recordStep: number;\n variables: NetCDFVariable[];\n} {\n const varList = buffer.readUint32();\n let recordStep = 0;\n if (varList === ZERO) {\n if (buffer.readUint32() !== ZERO) {\n throw new Error('NetCDF: wrong empty tag for list of variables');\n }\n return {\n recordStep,\n variables: []\n };\n }\n\n if (varList !== NC_VARIABLE) {\n throw new Error('NetCDF: wrong tag for list of variables');\n }\n\n // Length of variables\n const variableSize = buffer.readUint32();\n const variables = new Array(variableSize);\n for (let v = 0; v < variableSize; v++) {\n // Read name\n const name = readName(buffer);\n\n // Read dimensionality of the variable\n const dimensionality = buffer.readUint32();\n\n // Index into the list of dimensions\n const dimensionsIds = new Array(dimensionality);\n for (let dim = 0; dim < dimensionality; dim++) {\n dimensionsIds[dim] = buffer.readUint32();\n }\n\n // Read variables size\n const attributes = readAttributesList(buffer);\n\n // Read type\n const type = buffer.readUint32();\n if (type < 1 && type > 6) {\n throw new Error(`NetCDF: non valid type ${type}`);\n }\n\n // Read variable size\n // The 32-bit varSize field is not large enough to contain the size of variables that require\n // more than 2^32 - 4 bytes, so 2^32 - 1 is used in the varSize field for such variables.\n const varSize = buffer.readUint32();\n\n // Read offset\n let offset = buffer.readUint32();\n if (version === 2) {\n if (offset > 0) {\n throw new Error('NetCDF: offsets larger than 4GB not supported');\n }\n offset = buffer.readUint32();\n }\n\n let record = false;\n // Count amount of record variables\n if (typeof recordId !== 'undefined' && dimensionsIds[0] === recordId) {\n recordStep += varSize;\n record = true;\n }\n variables[v] = {\n name,\n dimensions: dimensionsIds,\n attributes,\n type: num2str(type),\n size: varSize,\n offset,\n record\n };\n }\n\n return {\n variables,\n recordStep\n };\n}\n\n// HELPERS\n\n/**\n * Reads the name\n * @param buffer - Buffer for the file data\n * @return Name\n */\nexport function readName(buffer: IOBuffer): string {\n // Read name\n const nameLength = buffer.readUint32();\n const name = buffer.readChars(nameLength);\n\n // validate name\n // TODO\n\n // Apply padding\n padding(buffer);\n return name;\n}\n\n/**\n * Moves 1, 2, or 3 bytes to next 4-byte boundary\n */\nfunction padding(buffer: IOBuffer) {\n if (buffer.offset % 4 !== 0) {\n buffer.skip(4 - (buffer.offset % 4));\n }\n}\n"],"file":"read-header.js"}
@@ -8,7 +8,7 @@ exports.num2str = num2str;
8
8
  exports.num2bytes = num2bytes;
9
9
  exports.str2num = str2num;
10
10
  exports.TYPES = void 0;
11
- var TYPES = {
11
+ const TYPES = {
12
12
  BYTE: 1,
13
13
  CHAR: 2,
14
14
  SHORT: 3,
@@ -120,9 +120,9 @@ function str2num(type) {
120
120
 
121
121
  function readNumber(size, bufferReader) {
122
122
  if (size !== 1) {
123
- var numbers = new Array(size);
123
+ const numbers = new Array(size);
124
124
 
125
- for (var i = 0; i < size; i++) {
125
+ for (let i = 0; i < size; i++) {
126
126
  numbers[i] = bufferReader();
127
127
  }
128
128
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/netcdfjs/read-type.ts"],"names":["TYPES","BYTE","CHAR","SHORT","INT","FLOAT","DOUBLE","readType","buffer","type","size","readBytes","trimNull","readChars","readNumber","readInt16","bind","readInt32","readFloat32","readFloat64","Error","num2str","Number","num2bytes","str2num","String","bufferReader","numbers","Array","i","value","charCodeAt","length","substring"],"mappings":"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","sourcesContent":["import {IOBuffer} from '../iobuffer/iobuffer';\n\nexport const TYPES = {\n BYTE: 1,\n CHAR: 2,\n SHORT: 3,\n INT: 4,\n FLOAT: 5,\n DOUBLE: 6\n};\n\n/**\n * Given a type and a size reads the next element\n * @param buffer - Buffer for the file data\n * @param type - Type of the data to read\n * @param size - Size of the element to read\n * @return\n */\nexport function readType(\n buffer: IOBuffer,\n type: number,\n size: number\n): string | number | number[] | Uint8Array {\n switch (type) {\n case TYPES.BYTE:\n return buffer.readBytes(size);\n case TYPES.CHAR:\n return trimNull(buffer.readChars(size));\n case TYPES.SHORT:\n return readNumber(size, buffer.readInt16.bind(buffer));\n case TYPES.INT:\n return readNumber(size, buffer.readInt32.bind(buffer));\n case TYPES.FLOAT:\n return readNumber(size, buffer.readFloat32.bind(buffer));\n case TYPES.DOUBLE:\n return readNumber(size, buffer.readFloat64.bind(buffer));\n /* istanbul ignore next */\n default:\n throw new Error(`NetCDF: non valid type ${type}`);\n }\n}\n\n/**\n * Parse a number into their respective type\n * @param type - integer that represents the type\n * @return parsed value of the type\n */\nexport function num2str(type: number): string {\n switch (Number(type)) {\n case TYPES.BYTE:\n return 'byte';\n case TYPES.CHAR:\n return 'char';\n case TYPES.SHORT:\n return 'short';\n case TYPES.INT:\n return 'int';\n case TYPES.FLOAT:\n return 'float';\n case TYPES.DOUBLE:\n return 'double';\n /* istanbul ignore next */\n default:\n return 'undefined';\n }\n}\n\n/**\n * Parse a number type identifier to his size in bytes\n * @param type - integer that represents the type\n * @return size of the type\n */\nexport function num2bytes(type: number): number {\n switch (Number(type)) {\n case TYPES.BYTE:\n return 1;\n case TYPES.CHAR:\n return 1;\n case TYPES.SHORT:\n return 2;\n case TYPES.INT:\n return 4;\n case TYPES.FLOAT:\n return 4;\n case TYPES.DOUBLE:\n return 8;\n /* istanbul ignore next */\n default:\n return -1;\n }\n}\n\n/**\n * Reverse search of num2str\n * @param type string that represents the type\n * @return parsed value of the type\n */\nexport function str2num(type: string): number {\n switch (String(type)) {\n case 'byte':\n return TYPES.BYTE;\n case 'char':\n return TYPES.CHAR;\n case 'short':\n return TYPES.SHORT;\n case 'int':\n return TYPES.INT;\n case 'float':\n return TYPES.FLOAT;\n case 'double':\n return TYPES.DOUBLE;\n /* istanbul ignore next */\n default:\n return -1;\n }\n}\n\n/**\n * Auxiliary function to read numeric data\n * @param size - Size of the element to read\n * @param bufferReader - Function to read next value\n * @return\n */\nfunction readNumber(size: number, bufferReader: () => number): number | number[] {\n if (size !== 1) {\n const numbers = new Array(size);\n for (let i = 0; i < size; i++) {\n numbers[i] = bufferReader();\n }\n return numbers;\n }\n return bufferReader();\n}\n\n/**\n * Removes null terminate value\n * @param value - String to trim\n * @return - Trimmed string\n */\nfunction trimNull(value: string): string {\n if (value.charCodeAt(value.length - 1) === 0) {\n return value.substring(0, value.length - 1);\n }\n return value;\n}\n"],"file":"read-type.js"}
1
+ {"version":3,"sources":["../../../src/netcdfjs/read-type.ts"],"names":["TYPES","BYTE","CHAR","SHORT","INT","FLOAT","DOUBLE","readType","buffer","type","size","readBytes","trimNull","readChars","readNumber","readInt16","bind","readInt32","readFloat32","readFloat64","Error","num2str","Number","num2bytes","str2num","String","bufferReader","numbers","Array","i","value","charCodeAt","length","substring"],"mappings":"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","sourcesContent":["import {IOBuffer} from '../iobuffer/iobuffer';\n\nexport const TYPES = {\n BYTE: 1,\n CHAR: 2,\n SHORT: 3,\n INT: 4,\n FLOAT: 5,\n DOUBLE: 6\n};\n\n/**\n * Given a type and a size reads the next element\n * @param buffer - Buffer for the file data\n * @param type - Type of the data to read\n * @param size - Size of the element to read\n * @return\n */\nexport function readType(\n buffer: IOBuffer,\n type: number,\n size: number\n): string | number | number[] | Uint8Array {\n switch (type) {\n case TYPES.BYTE:\n return buffer.readBytes(size);\n case TYPES.CHAR:\n return trimNull(buffer.readChars(size));\n case TYPES.SHORT:\n return readNumber(size, buffer.readInt16.bind(buffer));\n case TYPES.INT:\n return readNumber(size, buffer.readInt32.bind(buffer));\n case TYPES.FLOAT:\n return readNumber(size, buffer.readFloat32.bind(buffer));\n case TYPES.DOUBLE:\n return readNumber(size, buffer.readFloat64.bind(buffer));\n /* istanbul ignore next */\n default:\n throw new Error(`NetCDF: non valid type ${type}`);\n }\n}\n\n/**\n * Parse a number into their respective type\n * @param type - integer that represents the type\n * @return parsed value of the type\n */\nexport function num2str(type: number): string {\n switch (Number(type)) {\n case TYPES.BYTE:\n return 'byte';\n case TYPES.CHAR:\n return 'char';\n case TYPES.SHORT:\n return 'short';\n case TYPES.INT:\n return 'int';\n case TYPES.FLOAT:\n return 'float';\n case TYPES.DOUBLE:\n return 'double';\n /* istanbul ignore next */\n default:\n return 'undefined';\n }\n}\n\n/**\n * Parse a number type identifier to his size in bytes\n * @param type - integer that represents the type\n * @return size of the type\n */\nexport function num2bytes(type: number): number {\n switch (Number(type)) {\n case TYPES.BYTE:\n return 1;\n case TYPES.CHAR:\n return 1;\n case TYPES.SHORT:\n return 2;\n case TYPES.INT:\n return 4;\n case TYPES.FLOAT:\n return 4;\n case TYPES.DOUBLE:\n return 8;\n /* istanbul ignore next */\n default:\n return -1;\n }\n}\n\n/**\n * Reverse search of num2str\n * @param type string that represents the type\n * @return parsed value of the type\n */\nexport function str2num(type: string): number {\n switch (String(type)) {\n case 'byte':\n return TYPES.BYTE;\n case 'char':\n return TYPES.CHAR;\n case 'short':\n return TYPES.SHORT;\n case 'int':\n return TYPES.INT;\n case 'float':\n return TYPES.FLOAT;\n case 'double':\n return TYPES.DOUBLE;\n /* istanbul ignore next */\n default:\n return -1;\n }\n}\n\n/**\n * Auxiliary function to read numeric data\n * @param size - Size of the element to read\n * @param bufferReader - Function to read next value\n * @return\n */\nfunction readNumber(size: number, bufferReader: () => number): number | number[] {\n if (size !== 1) {\n const numbers = new Array(size);\n for (let i = 0; i < size; i++) {\n numbers[i] = bufferReader();\n }\n return numbers;\n }\n return bufferReader();\n}\n\n/**\n * Removes null terminate value\n * @param value - String to trim\n * @return - Trimmed string\n */\nfunction trimNull(value: string): string {\n if (value.charCodeAt(value.length - 1) === 0) {\n return value.substring(0, value.length - 1);\n }\n return value;\n}\n"],"file":"read-type.js"}
@@ -1,5 +1,5 @@
1
1
  import { NetCDFReader } from './netcdfjs/netcdf-reader';
2
- const VERSION = typeof "3.1.0-alpha.4" !== 'undefined' ? "3.1.0-alpha.4" : 'latest';
2
+ const VERSION = typeof "3.1.0-beta.3" !== 'undefined' ? "3.1.0-beta.3" : 'latest';
3
3
  export const NetCDFWorkerLoader = {
4
4
  name: 'NetCDF',
5
5
  id: 'mvt',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/netcdf-loader.ts"],"names":["NetCDFReader","VERSION","NetCDFWorkerLoader","name","id","module","version","extensions","mimeTypes","category","options","netcdf","loadVariables","NetCDFLoader","parse","arrayBuffer","parseNetCDF","binary","reader","variables","loadData","variable","getDataVariable","loaderData","header","data","_typecheckNetCDFWorkerLoader","_typecheckNetCDFLoader"],"mappings":"AAEA,SAAQA,YAAR,QAA2B,0BAA3B;AAIA,MAAMC,OAAO,GAAG,2BAAuB,WAAvB,qBAAmD,QAAnE;AAgBA,OAAO,MAAMC,kBAAkB,GAAG;AAChCC,EAAAA,IAAI,EAAE,QAD0B;AAEhCC,EAAAA,EAAE,EAAE,KAF4B;AAGhCC,EAAAA,MAAM,EAAE,KAHwB;AAIhCC,EAAAA,OAAO,EAAEL,OAJuB;AAKhCM,EAAAA,UAAU,EAAE,CAAC,KAAD,EAAQ,IAAR,CALoB;AAMhCC,EAAAA,SAAS,EAAE,CACT,oBADS,EAET,sBAFS,CANqB;AAWhCC,EAAAA,QAAQ,EAAE,OAXsB;AAYhCC,EAAAA,OAAO,EAAE;AACPC,IAAAA,MAAM,EAAE;AACNC,MAAAA,aAAa,EAAE;AADT;AADD;AAZuB,CAA3B;AAsBP,OAAO,MAAMC,YAAY,GAAG,EAC1B,GAAGX,kBADuB;AAE1BY,EAAAA,KAAK,EAAE,OAAOC,WAAP,EAAoBL,OAApB,KAAgCM,WAAW,CAACD,WAAD,EAAcL,OAAd,CAFxB;AAG1BO,EAAAA,MAAM,EAAE;AAHkB,CAArB;;AAMP,SAASD,WAAT,CAAqBD,WAArB,EAA+CL,OAA/C,EAAsF;AAAA;;AACpF,QAAMQ,MAAM,GAAG,IAAIlB,YAAJ,CAAiBe,WAAjB,CAAf;AACA,QAAMI,SAA4C,GAAG,EAArD;;AACA,MAAIT,OAAJ,aAAIA,OAAJ,kCAAIA,OAAO,CAAEC,MAAb,4CAAI,gBAAiBS,QAArB,EAA+B;AAC7B,SAAK,MAAMC,QAAX,IAAuBH,MAAM,CAACC,SAA9B,EAAyC;AACvCA,MAAAA,SAAS,CAACE,QAAQ,CAAClB,IAAV,CAAT,GAA2Be,MAAM,CAACI,eAAP,CAAuBD,QAAvB,CAA3B;AACD;AACF;;AACD,SAAO;AACLE,IAAAA,UAAU,EAAEL,MAAM,CAACM,MADd;AAELC,IAAAA,IAAI,EAAEN;AAFD,GAAP;AAID;;AAGD,OAAO,MAAMO,4BAAoC,GAAGxB,kBAA7C;AACP,OAAO,MAAMyB,sBAAwC,GAAGd,YAAjD","sourcesContent":["import type {Loader, LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport type {NetCDFHeader} from './netcdfjs/netcdf-types';\nimport {NetCDFReader} from './netcdfjs/netcdf-reader';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport type NetCDF = {\n loaderData: NetCDFHeader;\n data: {[variableName: string]: any[][]};\n};\n\nexport type NetCDFLoaderOptions = LoaderOptions & {\n netcdf?: {\n loadData?: boolean;\n };\n};\n\n/**\n * Worker loader for NETCDF\n */\nexport const NetCDFWorkerLoader = {\n name: 'NetCDF',\n id: 'mvt',\n module: 'mvt',\n version: VERSION,\n extensions: ['cdf', 'nc'],\n mimeTypes: [\n 'application/netcdf',\n 'application/x-netcdf'\n // 'application/octet-stream'\n ],\n category: 'image',\n options: {\n netcdf: {\n loadVariables: false\n }\n }\n};\n\n/**\n * Loader for the NetCDF format\n */\nexport const NetCDFLoader = {\n ...NetCDFWorkerLoader,\n parse: async (arrayBuffer, options) => parseNetCDF(arrayBuffer, options),\n binary: true\n};\n\nfunction parseNetCDF(arrayBuffer: ArrayBuffer, options?: NetCDFLoaderOptions): NetCDF {\n const reader = new NetCDFReader(arrayBuffer);\n const variables: {[variableName: string]: any[][]} = {};\n if (options?.netcdf?.loadData) {\n for (const variable of reader.variables) {\n variables[variable.name] = reader.getDataVariable(variable);\n }\n }\n return {\n loaderData: reader.header,\n data: variables\n };\n}\n\n// Type tests\nexport const _typecheckNetCDFWorkerLoader: Loader = NetCDFWorkerLoader;\nexport const _typecheckNetCDFLoader: LoaderWithParser = NetCDFLoader;\n"],"file":"netcdf-loader.js"}
1
+ {"version":3,"sources":["../../src/netcdf-loader.ts"],"names":["NetCDFReader","VERSION","NetCDFWorkerLoader","name","id","module","version","extensions","mimeTypes","category","options","netcdf","loadVariables","NetCDFLoader","parse","arrayBuffer","parseNetCDF","binary","reader","variables","loadData","variable","getDataVariable","loaderData","header","data","_typecheckNetCDFWorkerLoader","_typecheckNetCDFLoader"],"mappings":"AAEA,SAAQA,YAAR,QAA2B,0BAA3B;AAIA,MAAMC,OAAO,GAAG,0BAAuB,WAAvB,oBAAmD,QAAnE;AAgBA,OAAO,MAAMC,kBAAkB,GAAG;AAChCC,EAAAA,IAAI,EAAE,QAD0B;AAEhCC,EAAAA,EAAE,EAAE,KAF4B;AAGhCC,EAAAA,MAAM,EAAE,KAHwB;AAIhCC,EAAAA,OAAO,EAAEL,OAJuB;AAKhCM,EAAAA,UAAU,EAAE,CAAC,KAAD,EAAQ,IAAR,CALoB;AAMhCC,EAAAA,SAAS,EAAE,CACT,oBADS,EAET,sBAFS,CANqB;AAWhCC,EAAAA,QAAQ,EAAE,OAXsB;AAYhCC,EAAAA,OAAO,EAAE;AACPC,IAAAA,MAAM,EAAE;AACNC,MAAAA,aAAa,EAAE;AADT;AADD;AAZuB,CAA3B;AAsBP,OAAO,MAAMC,YAAY,GAAG,EAC1B,GAAGX,kBADuB;AAE1BY,EAAAA,KAAK,EAAE,OAAOC,WAAP,EAAoBL,OAApB,KAAgCM,WAAW,CAACD,WAAD,EAAcL,OAAd,CAFxB;AAG1BO,EAAAA,MAAM,EAAE;AAHkB,CAArB;;AAMP,SAASD,WAAT,CAAqBD,WAArB,EAA+CL,OAA/C,EAAsF;AAAA;;AACpF,QAAMQ,MAAM,GAAG,IAAIlB,YAAJ,CAAiBe,WAAjB,CAAf;AACA,QAAMI,SAA4C,GAAG,EAArD;;AACA,MAAIT,OAAJ,aAAIA,OAAJ,kCAAIA,OAAO,CAAEC,MAAb,4CAAI,gBAAiBS,QAArB,EAA+B;AAC7B,SAAK,MAAMC,QAAX,IAAuBH,MAAM,CAACC,SAA9B,EAAyC;AACvCA,MAAAA,SAAS,CAACE,QAAQ,CAAClB,IAAV,CAAT,GAA2Be,MAAM,CAACI,eAAP,CAAuBD,QAAvB,CAA3B;AACD;AACF;;AACD,SAAO;AACLE,IAAAA,UAAU,EAAEL,MAAM,CAACM,MADd;AAELC,IAAAA,IAAI,EAAEN;AAFD,GAAP;AAID;;AAGD,OAAO,MAAMO,4BAAoC,GAAGxB,kBAA7C;AACP,OAAO,MAAMyB,sBAAwC,GAAGd,YAAjD","sourcesContent":["import type {Loader, LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport type {NetCDFHeader} from './netcdfjs/netcdf-types';\nimport {NetCDFReader} from './netcdfjs/netcdf-reader';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\nexport type NetCDF = {\n loaderData: NetCDFHeader;\n data: {[variableName: string]: any[][]};\n};\n\nexport type NetCDFLoaderOptions = LoaderOptions & {\n netcdf?: {\n loadData?: boolean;\n };\n};\n\n/**\n * Worker loader for NETCDF\n */\nexport const NetCDFWorkerLoader = {\n name: 'NetCDF',\n id: 'mvt',\n module: 'mvt',\n version: VERSION,\n extensions: ['cdf', 'nc'],\n mimeTypes: [\n 'application/netcdf',\n 'application/x-netcdf'\n // 'application/octet-stream'\n ],\n category: 'image',\n options: {\n netcdf: {\n loadVariables: false\n }\n }\n};\n\n/**\n * Loader for the NetCDF format\n */\nexport const NetCDFLoader = {\n ...NetCDFWorkerLoader,\n parse: async (arrayBuffer, options) => parseNetCDF(arrayBuffer, options),\n binary: true\n};\n\nfunction parseNetCDF(arrayBuffer: ArrayBuffer, options?: NetCDFLoaderOptions): NetCDF {\n const reader = new NetCDFReader(arrayBuffer);\n const variables: {[variableName: string]: any[][]} = {};\n if (options?.netcdf?.loadData) {\n for (const variable of reader.variables) {\n variables[variable.name] = reader.getDataVariable(variable);\n }\n }\n return {\n loaderData: reader.header,\n data: variables\n };\n}\n\n// Type tests\nexport const _typecheckNetCDFWorkerLoader: Loader = NetCDFWorkerLoader;\nexport const _typecheckNetCDFLoader: LoaderWithParser = NetCDFLoader;\n"],"file":"netcdf-loader.js"}
@@ -13,13 +13,13 @@ export class NetCDFReader {
13
13
  const magic = buffer.readChars(3);
14
14
 
15
15
  if (magic !== 'CDF') {
16
- throw new Error(`NetCDF: file should start with 'CDF', found ${magic}`);
16
+ throw new Error("NetCDF: file should start with 'CDF', found ".concat(magic));
17
17
  }
18
18
 
19
19
  const version = buffer.readByte();
20
20
 
21
21
  if (version > 2) {
22
- throw new Error(`NetCDF: unsupported version ${version}`);
22
+ throw new Error("NetCDF: unsupported version ".concat(version));
23
23
  }
24
24
 
25
25
  this.header = readNetCDFHeader(buffer, version);
@@ -86,7 +86,7 @@ export class NetCDFReader {
86
86
  }
87
87
 
88
88
  if (variable === undefined) {
89
- throw new Error(`NetCDF: variable not found: ${variableName}`);
89
+ throw new Error("NetCDF: variable not found: ".concat(variableName));
90
90
  }
91
91
 
92
92
  this.buffer.seek(variable.offset);
@@ -103,14 +103,14 @@ export class NetCDFReader {
103
103
  result.push('DIMENSIONS');
104
104
 
105
105
  for (const dimension of this.dimensions) {
106
- result.push(` ${dimension.name.padEnd(30)} = size: ${dimension.size}`);
106
+ result.push(" ".concat(dimension.name.padEnd(30), " = size: ").concat(dimension.size));
107
107
  }
108
108
 
109
109
  result.push('');
110
110
  result.push('GLOBAL ATTRIBUTES');
111
111
 
112
112
  for (const attribute of this.attributes) {
113
- result.push(` ${attribute.name.padEnd(30)} = ${attribute.value}`);
113
+ result.push(" ".concat(attribute.name.padEnd(30), " = ").concat(attribute.value));
114
114
  }
115
115
 
116
116
  const variables = JSON.parse(JSON.stringify(this.variables));
@@ -123,10 +123,10 @@ export class NetCDFReader {
123
123
  if (stringify.length > 50) stringify = stringify.substring(0, 50);
124
124
 
125
125
  if (!isNaN(variable.value.length)) {
126
- stringify += ` (length: ${variable.value.length})`;
126
+ stringify += " (length: ".concat(variable.value.length, ")");
127
127
  }
128
128
 
129
- result.push(` ${variable.name.padEnd(30)} = ${stringify}`);
129
+ result.push(" ".concat(variable.name.padEnd(30), " = ").concat(stringify));
130
130
  }
131
131
 
132
132
  return result.join('\n');
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/netcdfjs/netcdf-reader.ts"],"names":["IOBuffer","readNetCDFHeader","readRecord","readNonRecord","NetCDFReader","constructor","data","buffer","setBigEndian","magic","readChars","Error","version","readByte","header","recordDimension","dimensions","attributes","variables","attributeExists","attributeName","attribute","find","val","name","undefined","getAttribute","value","dataVariableExists","variableName","variable","getDataVariableAsString","getDataVariable","join","seek","offset","record","toString","result","push","dimension","padEnd","size","JSON","parse","stringify","length","substring","isNaN"],"mappings":"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","sourcesContent":["import {IOBuffer} from '../iobuffer/iobuffer';\nimport type {\n NetCDFHeader,\n NetCDFDimension,\n NetCDFRecordDimension,\n NetCDFAttribute,\n NetCDFVariable\n} from './netcdf-types';\nimport {readNetCDFHeader} from './read-header';\nimport {readRecord, readNonRecord} from './read-data';\n\n/**\n * Reads a NetCDF v3.x file\n * https://www.unidata.ucar.edu/software/netcdf/docs/file_format_specifications.html\n * @param {ArrayBuffer} data - ArrayBuffer or any Typed Array (including Node.js' Buffer from v4) with the data\n * @constructor\n */\nexport class NetCDFReader {\n public header: NetCDFHeader;\n public buffer: IOBuffer;\n\n constructor(data) {\n const buffer = new IOBuffer(data);\n buffer.setBigEndian();\n\n // Validate that it's a NetCDF file\n const magic = buffer.readChars(3);\n if (magic !== 'CDF') {\n throw new Error(`NetCDF: file should start with 'CDF', found ${magic}`);\n }\n\n // Check the NetCDF format\n const version = buffer.readByte();\n if (version > 2) {\n throw new Error(`NetCDF: unsupported version ${version}`);\n }\n\n // Read the header\n this.header = readNetCDFHeader(buffer, version);\n this.buffer = buffer;\n }\n\n /**\n * @return {string} - Version for the NetCDF format\n */\n get version() {\n if (this.header.version === 1) {\n return 'classic format';\n }\n return '64-bit offset format';\n }\n\n /**\n * Get metadata for the record dimension\n */\n get recordDimension(): NetCDFRecordDimension {\n return this.header.recordDimension;\n }\n\n /**\n * Get list of dimensions (each with `name` and `size`)\n */\n get dimensions(): NetCDFDimension[] {\n return this.header.dimensions;\n }\n\n /**\n * Get list of global attributes with:\n * * `name`: String with the name of the attribute\n * * `type`: String with the type of the attribute\n * * `value`: A number or string with the value of the attribute\n */\n get attributes(): NetCDFAttribute[] {\n return this.header.attributes;\n }\n\n /**\n * Get list of variables\n */\n get variables(): NetCDFVariable[] {\n return this.header.variables;\n }\n\n /**\n * Check if an attribute exists\n * @param attributeName - Name of the attribute to find\n * @return\n */\n attributeExists(attributeName: string): boolean {\n const attribute = this.attributes.find((val) => val.name === attributeName);\n return attribute !== undefined;\n }\n\n /**\n * Returns the value of an attribute\n * @param attributeName\n * @return Value of the attributeName or null\n */\n getAttribute(attributeName: string): string | null {\n const attribute = this.attributes.find((val) => val.name === attributeName);\n if (attribute) return attribute.value;\n return null;\n }\n\n /**\n * Check if a dataVariable exists\n * @param variableName - Name of the variable to find\n * @return\n */\n dataVariableExists(variableName: string): boolean {\n const variable = this.header.variables.find(function (val) {\n return val.name === variableName;\n });\n return variable !== undefined;\n }\n\n /**\n * Returns the value of a variable as a string\n * @param variableName\n * @return Value of the variable as a string or null\n */\n getDataVariableAsString(variableName: string): string | null {\n const variable = this.getDataVariable(variableName);\n if (variable) return variable.join('');\n return null;\n }\n\n /**\n * Retrieves the data for a given variable\n * @param variableName - Name of the variable to search or variable object\n * @return List with the variable values\n */\n getDataVariable(variableName: string | object): any[] {\n let variable;\n if (typeof variableName === 'string') {\n // search the variable\n variable = this.header.variables.find(function (val) {\n return val.name === variableName;\n });\n } else {\n variable = variableName;\n }\n\n // throws if variable not found\n if (variable === undefined) {\n throw new Error(`NetCDF: variable not found: ${variableName}`);\n }\n\n // go to the offset position\n this.buffer.seek(variable.offset);\n\n if (variable.record) {\n // record variable case\n return readRecord(this.buffer, variable, this.header.recordDimension);\n }\n // non-record variable case\n return readNonRecord(this.buffer, variable);\n }\n\n toString(): string {\n const result: string[] = [];\n\n result.push('DIMENSIONS');\n for (const dimension of this.dimensions) {\n result.push(` ${dimension.name.padEnd(30)} = size: ${dimension.size}`);\n }\n\n result.push('');\n result.push('GLOBAL ATTRIBUTES');\n for (const attribute of this.attributes) {\n result.push(` ${attribute.name.padEnd(30)} = ${attribute.value}`);\n }\n\n const variables = JSON.parse(JSON.stringify(this.variables));\n result.push('');\n result.push('VARIABLES:');\n for (const variable of variables) {\n variable.value = this.getDataVariable(variable);\n let stringify = JSON.stringify(variable.value);\n if (stringify.length > 50) stringify = stringify.substring(0, 50);\n if (!isNaN(variable.value.length)) {\n stringify += ` (length: ${variable.value.length})`;\n }\n result.push(` ${variable.name.padEnd(30)} = ${stringify}`);\n }\n return result.join('\\n');\n }\n}\n"],"file":"netcdf-reader.js"}
1
+ {"version":3,"sources":["../../../src/netcdfjs/netcdf-reader.ts"],"names":["IOBuffer","readNetCDFHeader","readRecord","readNonRecord","NetCDFReader","constructor","data","buffer","setBigEndian","magic","readChars","Error","version","readByte","header","recordDimension","dimensions","attributes","variables","attributeExists","attributeName","attribute","find","val","name","undefined","getAttribute","value","dataVariableExists","variableName","variable","getDataVariableAsString","getDataVariable","join","seek","offset","record","toString","result","push","dimension","padEnd","size","JSON","parse","stringify","length","substring","isNaN"],"mappings":"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","sourcesContent":["import {IOBuffer} from '../iobuffer/iobuffer';\nimport type {\n NetCDFHeader,\n NetCDFDimension,\n NetCDFRecordDimension,\n NetCDFAttribute,\n NetCDFVariable\n} from './netcdf-types';\nimport {readNetCDFHeader} from './read-header';\nimport {readRecord, readNonRecord} from './read-data';\n\n/**\n * Reads a NetCDF v3.x file\n * https://www.unidata.ucar.edu/software/netcdf/docs/file_format_specifications.html\n * @param {ArrayBuffer} data - ArrayBuffer or any Typed Array (including Node.js' Buffer from v4) with the data\n * @constructor\n */\nexport class NetCDFReader {\n public header: NetCDFHeader;\n public buffer: IOBuffer;\n\n constructor(data) {\n const buffer = new IOBuffer(data);\n buffer.setBigEndian();\n\n // Validate that it's a NetCDF file\n const magic = buffer.readChars(3);\n if (magic !== 'CDF') {\n throw new Error(`NetCDF: file should start with 'CDF', found ${magic}`);\n }\n\n // Check the NetCDF format\n const version = buffer.readByte();\n if (version > 2) {\n throw new Error(`NetCDF: unsupported version ${version}`);\n }\n\n // Read the header\n this.header = readNetCDFHeader(buffer, version);\n this.buffer = buffer;\n }\n\n /**\n * @return {string} - Version for the NetCDF format\n */\n get version() {\n if (this.header.version === 1) {\n return 'classic format';\n }\n return '64-bit offset format';\n }\n\n /**\n * Get metadata for the record dimension\n */\n get recordDimension(): NetCDFRecordDimension {\n return this.header.recordDimension;\n }\n\n /**\n * Get list of dimensions (each with `name` and `size`)\n */\n get dimensions(): NetCDFDimension[] {\n return this.header.dimensions;\n }\n\n /**\n * Get list of global attributes with:\n * * `name`: String with the name of the attribute\n * * `type`: String with the type of the attribute\n * * `value`: A number or string with the value of the attribute\n */\n get attributes(): NetCDFAttribute[] {\n return this.header.attributes;\n }\n\n /**\n * Get list of variables\n */\n get variables(): NetCDFVariable[] {\n return this.header.variables;\n }\n\n /**\n * Check if an attribute exists\n * @param attributeName - Name of the attribute to find\n * @return\n */\n attributeExists(attributeName: string): boolean {\n const attribute = this.attributes.find((val) => val.name === attributeName);\n return attribute !== undefined;\n }\n\n /**\n * Returns the value of an attribute\n * @param attributeName\n * @return Value of the attributeName or null\n */\n getAttribute(attributeName: string): string | null {\n const attribute = this.attributes.find((val) => val.name === attributeName);\n if (attribute) return attribute.value;\n return null;\n }\n\n /**\n * Check if a dataVariable exists\n * @param variableName - Name of the variable to find\n * @return\n */\n dataVariableExists(variableName: string): boolean {\n const variable = this.header.variables.find(function (val) {\n return val.name === variableName;\n });\n return variable !== undefined;\n }\n\n /**\n * Returns the value of a variable as a string\n * @param variableName\n * @return Value of the variable as a string or null\n */\n getDataVariableAsString(variableName: string): string | null {\n const variable = this.getDataVariable(variableName);\n if (variable) return variable.join('');\n return null;\n }\n\n /**\n * Retrieves the data for a given variable\n * @param variableName - Name of the variable to search or variable object\n * @return List with the variable values\n */\n getDataVariable(variableName: string | object): any[] {\n let variable;\n if (typeof variableName === 'string') {\n // search the variable\n variable = this.header.variables.find(function (val) {\n return val.name === variableName;\n });\n } else {\n variable = variableName;\n }\n\n // throws if variable not found\n if (variable === undefined) {\n throw new Error(`NetCDF: variable not found: ${variableName}`);\n }\n\n // go to the offset position\n this.buffer.seek(variable.offset);\n\n if (variable.record) {\n // record variable case\n return readRecord(this.buffer, variable, this.header.recordDimension);\n }\n // non-record variable case\n return readNonRecord(this.buffer, variable);\n }\n\n toString(): string {\n const result: string[] = [];\n\n result.push('DIMENSIONS');\n for (const dimension of this.dimensions) {\n result.push(` ${dimension.name.padEnd(30)} = size: ${dimension.size}`);\n }\n\n result.push('');\n result.push('GLOBAL ATTRIBUTES');\n for (const attribute of this.attributes) {\n result.push(` ${attribute.name.padEnd(30)} = ${attribute.value}`);\n }\n\n const variables = JSON.parse(JSON.stringify(this.variables));\n result.push('');\n result.push('VARIABLES:');\n for (const variable of variables) {\n variable.value = this.getDataVariable(variable);\n let stringify = JSON.stringify(variable.value);\n if (stringify.length > 50) stringify = stringify.substring(0, 50);\n if (!isNaN(variable.value.length)) {\n stringify += ` (length: ${variable.value.length})`;\n }\n result.push(` ${variable.name.padEnd(30)} = ${stringify}`);\n }\n return result.join('\\n');\n }\n}\n"],"file":"netcdf-reader.js"}
@@ -93,7 +93,7 @@ function readAttributesList(buffer) {
93
93
  const type = buffer.readUint32();
94
94
 
95
95
  if (type < 1 || type > 6) {
96
- throw new Error(`NetCDF: non valid type ${type}`);
96
+ throw new Error("NetCDF: non valid type ".concat(type));
97
97
  }
98
98
 
99
99
  const size = buffer.readUint32();
@@ -144,7 +144,7 @@ function readVariablesList(buffer, recordId, version) {
144
144
  const type = buffer.readUint32();
145
145
 
146
146
  if (type < 1 && type > 6) {
147
- throw new Error(`NetCDF: non valid type ${type}`);
147
+ throw new Error("NetCDF: non valid type ".concat(type));
148
148
  }
149
149
 
150
150
  const varSize = buffer.readUint32();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/netcdfjs/read-header.ts"],"names":["readType","num2str","ZERO","NC_DIMENSION","NC_VARIABLE","NC_ATTRIBUTE","NC_UNLIMITED","readNetCDFHeader","buffer","version","recordDimensionLength","readUint32","dimList","readDimensionsList","attributes","readAttributesList","variableList","readVariablesList","recordId","header","recordDimension","length","id","name","recordName","recordStep","dimensions","variables","Error","dimensionSize","Array","dim","readName","size","gAttList","attributeSize","gAtt","type","value","padding","varList","variableSize","v","dimensionality","dimensionsIds","varSize","offset","record","nameLength","readChars","skip"],"mappings":"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","sourcesContent":["import type {IOBuffer} from '../iobuffer/iobuffer';\nimport type {NetCDFHeader, NetCDFDimension, NetCDFVariable, NetCDFAttribute} from './netcdf-types';\nimport {readType, num2str} from './read-type';\n\n// Grammar constants\nconst ZERO = 0;\nconst NC_DIMENSION = 10;\nconst NC_VARIABLE = 11;\nconst NC_ATTRIBUTE = 12;\n\nconst NC_UNLIMITED = 0;\n\n/**\n * Read the header of the file\n * @param buffer - Buffer for the file data\n * @param version - Version of the file\n * @return - Header\n */\nexport function readNetCDFHeader(buffer: IOBuffer, version: number): NetCDFHeader {\n // Length of record dimension\n // sum of the varSize's of all the record variables.\n const recordDimensionLength = buffer.readUint32();\n\n // List of dimensions\n const dimList = readDimensionsList(buffer);\n\n // List of global attributes\n const attributes = readAttributesList(buffer);\n\n // List of variables\n const variableList = readVariablesList(buffer, dimList.recordId, version);\n\n const header: NetCDFHeader = {\n version,\n recordDimension: {\n length: recordDimensionLength,\n id: dimList.recordId, // id of the unlimited dimension\n name: dimList.recordName, // name of the unlimited dimension\n recordStep: variableList.recordStep\n },\n dimensions: dimList.dimensions,\n variables: variableList.variables,\n attributes\n };\n\n return header;\n}\n\n/**\n * Read list of dimensions\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n */\nfunction readDimensionsList(buffer: IOBuffer): {\n recordId: number;\n recordName: string;\n dimensions: NetCDFDimension[];\n} {\n const dimList = buffer.readUint32();\n if (dimList === ZERO) {\n if (buffer.readUint32() !== ZERO) {\n throw new Error('NetCDF: wrong empty tag for list of dimensions');\n }\n // TODO - is this empty dimension list supported / recoverable?\n return {\n recordId: 0,\n recordName: '',\n dimensions: []\n };\n }\n\n if (dimList !== NC_DIMENSION) {\n throw new Error('NetCDF: wrong tag for list of dimensions');\n }\n\n // Length of dimensions\n const dimensionSize = buffer.readUint32();\n const dimensions = new Array(dimensionSize);\n let recordId;\n let recordName;\n for (let dim = 0; dim < dimensionSize; dim++) {\n // Read name\n const name = readName(buffer);\n\n // Read dimension size\n const size = buffer.readUint32();\n if (size === NC_UNLIMITED) {\n // in netcdf 3 one field can be of size unlimmited\n recordId = dim;\n recordName = name;\n }\n\n dimensions[dim] = {\n name,\n size\n };\n }\n\n return {\n dimensions,\n recordId,\n recordName\n };\n}\n\n/**\n * List of attributes\n * @ignore\n * @param buffer - Buffer for the file data\n * @return List of attributes with:\n */\nfunction readAttributesList(buffer: IOBuffer): NetCDFAttribute[] {\n const gAttList = buffer.readUint32();\n if (gAttList === ZERO) {\n if (buffer.readUint32() !== ZERO) {\n throw new Error('NetCDF: wrong empty tag for list of attributes');\n }\n return [];\n }\n\n if (gAttList !== NC_ATTRIBUTE) {\n throw new Error('NetCDF: wrong tag for list of attributes');\n }\n\n // Length of attributes\n const attributeSize = buffer.readUint32();\n const attributes = new Array(attributeSize);\n for (let gAtt = 0; gAtt < attributeSize; gAtt++) {\n // Read name\n const name = readName(buffer);\n\n // Read type\n const type = buffer.readUint32();\n if (type < 1 || type > 6) {\n throw new Error(`NetCDF: non valid type ${type}`);\n }\n\n // Read attribute\n const size = buffer.readUint32();\n const value = readType(buffer, type, size);\n\n // Apply padding\n padding(buffer);\n\n attributes[gAtt] = {\n name,\n type: num2str(type),\n value\n };\n }\n return attributes;\n}\n\n/**\n * List of variables\n * @param buffer - Buffer for the file data\n * @param recordId - Id of the unlimited dimension (also called record dimension)\n * This value may be undefined if there is no unlimited dimension\n * @param {number} version - Version of the file\n */\n// eslint-disable-next-line max-statements, complexity\nfunction readVariablesList(\n buffer: IOBuffer,\n recordId: number,\n version: number\n): {\n recordStep: number;\n variables: NetCDFVariable[];\n} {\n const varList = buffer.readUint32();\n let recordStep = 0;\n if (varList === ZERO) {\n if (buffer.readUint32() !== ZERO) {\n throw new Error('NetCDF: wrong empty tag for list of variables');\n }\n return {\n recordStep,\n variables: []\n };\n }\n\n if (varList !== NC_VARIABLE) {\n throw new Error('NetCDF: wrong tag for list of variables');\n }\n\n // Length of variables\n const variableSize = buffer.readUint32();\n const variables = new Array(variableSize);\n for (let v = 0; v < variableSize; v++) {\n // Read name\n const name = readName(buffer);\n\n // Read dimensionality of the variable\n const dimensionality = buffer.readUint32();\n\n // Index into the list of dimensions\n const dimensionsIds = new Array(dimensionality);\n for (let dim = 0; dim < dimensionality; dim++) {\n dimensionsIds[dim] = buffer.readUint32();\n }\n\n // Read variables size\n const attributes = readAttributesList(buffer);\n\n // Read type\n const type = buffer.readUint32();\n if (type < 1 && type > 6) {\n throw new Error(`NetCDF: non valid type ${type}`);\n }\n\n // Read variable size\n // The 32-bit varSize field is not large enough to contain the size of variables that require\n // more than 2^32 - 4 bytes, so 2^32 - 1 is used in the varSize field for such variables.\n const varSize = buffer.readUint32();\n\n // Read offset\n let offset = buffer.readUint32();\n if (version === 2) {\n if (offset > 0) {\n throw new Error('NetCDF: offsets larger than 4GB not supported');\n }\n offset = buffer.readUint32();\n }\n\n let record = false;\n // Count amount of record variables\n if (typeof recordId !== 'undefined' && dimensionsIds[0] === recordId) {\n recordStep += varSize;\n record = true;\n }\n variables[v] = {\n name,\n dimensions: dimensionsIds,\n attributes,\n type: num2str(type),\n size: varSize,\n offset,\n record\n };\n }\n\n return {\n variables,\n recordStep\n };\n}\n\n// HELPERS\n\n/**\n * Reads the name\n * @param buffer - Buffer for the file data\n * @return Name\n */\nexport function readName(buffer: IOBuffer): string {\n // Read name\n const nameLength = buffer.readUint32();\n const name = buffer.readChars(nameLength);\n\n // validate name\n // TODO\n\n // Apply padding\n padding(buffer);\n return name;\n}\n\n/**\n * Moves 1, 2, or 3 bytes to next 4-byte boundary\n */\nfunction padding(buffer: IOBuffer) {\n if (buffer.offset % 4 !== 0) {\n buffer.skip(4 - (buffer.offset % 4));\n }\n}\n"],"file":"read-header.js"}
1
+ {"version":3,"sources":["../../../src/netcdfjs/read-header.ts"],"names":["readType","num2str","ZERO","NC_DIMENSION","NC_VARIABLE","NC_ATTRIBUTE","NC_UNLIMITED","readNetCDFHeader","buffer","version","recordDimensionLength","readUint32","dimList","readDimensionsList","attributes","readAttributesList","variableList","readVariablesList","recordId","header","recordDimension","length","id","name","recordName","recordStep","dimensions","variables","Error","dimensionSize","Array","dim","readName","size","gAttList","attributeSize","gAtt","type","value","padding","varList","variableSize","v","dimensionality","dimensionsIds","varSize","offset","record","nameLength","readChars","skip"],"mappings":"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","sourcesContent":["import type {IOBuffer} from '../iobuffer/iobuffer';\nimport type {NetCDFHeader, NetCDFDimension, NetCDFVariable, NetCDFAttribute} from './netcdf-types';\nimport {readType, num2str} from './read-type';\n\n// Grammar constants\nconst ZERO = 0;\nconst NC_DIMENSION = 10;\nconst NC_VARIABLE = 11;\nconst NC_ATTRIBUTE = 12;\n\nconst NC_UNLIMITED = 0;\n\n/**\n * Read the header of the file\n * @param buffer - Buffer for the file data\n * @param version - Version of the file\n * @return - Header\n */\nexport function readNetCDFHeader(buffer: IOBuffer, version: number): NetCDFHeader {\n // Length of record dimension\n // sum of the varSize's of all the record variables.\n const recordDimensionLength = buffer.readUint32();\n\n // List of dimensions\n const dimList = readDimensionsList(buffer);\n\n // List of global attributes\n const attributes = readAttributesList(buffer);\n\n // List of variables\n const variableList = readVariablesList(buffer, dimList.recordId, version);\n\n const header: NetCDFHeader = {\n version,\n recordDimension: {\n length: recordDimensionLength,\n id: dimList.recordId, // id of the unlimited dimension\n name: dimList.recordName, // name of the unlimited dimension\n recordStep: variableList.recordStep\n },\n dimensions: dimList.dimensions,\n variables: variableList.variables,\n attributes\n };\n\n return header;\n}\n\n/**\n * Read list of dimensions\n * @ignore\n * @param {IOBuffer} buffer - Buffer for the file data\n */\nfunction readDimensionsList(buffer: IOBuffer): {\n recordId: number;\n recordName: string;\n dimensions: NetCDFDimension[];\n} {\n const dimList = buffer.readUint32();\n if (dimList === ZERO) {\n if (buffer.readUint32() !== ZERO) {\n throw new Error('NetCDF: wrong empty tag for list of dimensions');\n }\n // TODO - is this empty dimension list supported / recoverable?\n return {\n recordId: 0,\n recordName: '',\n dimensions: []\n };\n }\n\n if (dimList !== NC_DIMENSION) {\n throw new Error('NetCDF: wrong tag for list of dimensions');\n }\n\n // Length of dimensions\n const dimensionSize = buffer.readUint32();\n const dimensions = new Array(dimensionSize);\n let recordId;\n let recordName;\n for (let dim = 0; dim < dimensionSize; dim++) {\n // Read name\n const name = readName(buffer);\n\n // Read dimension size\n const size = buffer.readUint32();\n if (size === NC_UNLIMITED) {\n // in netcdf 3 one field can be of size unlimmited\n recordId = dim;\n recordName = name;\n }\n\n dimensions[dim] = {\n name,\n size\n };\n }\n\n return {\n dimensions,\n recordId,\n recordName\n };\n}\n\n/**\n * List of attributes\n * @ignore\n * @param buffer - Buffer for the file data\n * @return List of attributes with:\n */\nfunction readAttributesList(buffer: IOBuffer): NetCDFAttribute[] {\n const gAttList = buffer.readUint32();\n if (gAttList === ZERO) {\n if (buffer.readUint32() !== ZERO) {\n throw new Error('NetCDF: wrong empty tag for list of attributes');\n }\n return [];\n }\n\n if (gAttList !== NC_ATTRIBUTE) {\n throw new Error('NetCDF: wrong tag for list of attributes');\n }\n\n // Length of attributes\n const attributeSize = buffer.readUint32();\n const attributes = new Array(attributeSize);\n for (let gAtt = 0; gAtt < attributeSize; gAtt++) {\n // Read name\n const name = readName(buffer);\n\n // Read type\n const type = buffer.readUint32();\n if (type < 1 || type > 6) {\n throw new Error(`NetCDF: non valid type ${type}`);\n }\n\n // Read attribute\n const size = buffer.readUint32();\n const value = readType(buffer, type, size);\n\n // Apply padding\n padding(buffer);\n\n attributes[gAtt] = {\n name,\n type: num2str(type),\n value\n };\n }\n return attributes;\n}\n\n/**\n * List of variables\n * @param buffer - Buffer for the file data\n * @param recordId - Id of the unlimited dimension (also called record dimension)\n * This value may be undefined if there is no unlimited dimension\n * @param {number} version - Version of the file\n */\n// eslint-disable-next-line max-statements, complexity\nfunction readVariablesList(\n buffer: IOBuffer,\n recordId: number,\n version: number\n): {\n recordStep: number;\n variables: NetCDFVariable[];\n} {\n const varList = buffer.readUint32();\n let recordStep = 0;\n if (varList === ZERO) {\n if (buffer.readUint32() !== ZERO) {\n throw new Error('NetCDF: wrong empty tag for list of variables');\n }\n return {\n recordStep,\n variables: []\n };\n }\n\n if (varList !== NC_VARIABLE) {\n throw new Error('NetCDF: wrong tag for list of variables');\n }\n\n // Length of variables\n const variableSize = buffer.readUint32();\n const variables = new Array(variableSize);\n for (let v = 0; v < variableSize; v++) {\n // Read name\n const name = readName(buffer);\n\n // Read dimensionality of the variable\n const dimensionality = buffer.readUint32();\n\n // Index into the list of dimensions\n const dimensionsIds = new Array(dimensionality);\n for (let dim = 0; dim < dimensionality; dim++) {\n dimensionsIds[dim] = buffer.readUint32();\n }\n\n // Read variables size\n const attributes = readAttributesList(buffer);\n\n // Read type\n const type = buffer.readUint32();\n if (type < 1 && type > 6) {\n throw new Error(`NetCDF: non valid type ${type}`);\n }\n\n // Read variable size\n // The 32-bit varSize field is not large enough to contain the size of variables that require\n // more than 2^32 - 4 bytes, so 2^32 - 1 is used in the varSize field for such variables.\n const varSize = buffer.readUint32();\n\n // Read offset\n let offset = buffer.readUint32();\n if (version === 2) {\n if (offset > 0) {\n throw new Error('NetCDF: offsets larger than 4GB not supported');\n }\n offset = buffer.readUint32();\n }\n\n let record = false;\n // Count amount of record variables\n if (typeof recordId !== 'undefined' && dimensionsIds[0] === recordId) {\n recordStep += varSize;\n record = true;\n }\n variables[v] = {\n name,\n dimensions: dimensionsIds,\n attributes,\n type: num2str(type),\n size: varSize,\n offset,\n record\n };\n }\n\n return {\n variables,\n recordStep\n };\n}\n\n// HELPERS\n\n/**\n * Reads the name\n * @param buffer - Buffer for the file data\n * @return Name\n */\nexport function readName(buffer: IOBuffer): string {\n // Read name\n const nameLength = buffer.readUint32();\n const name = buffer.readChars(nameLength);\n\n // validate name\n // TODO\n\n // Apply padding\n padding(buffer);\n return name;\n}\n\n/**\n * Moves 1, 2, or 3 bytes to next 4-byte boundary\n */\nfunction padding(buffer: IOBuffer) {\n if (buffer.offset % 4 !== 0) {\n buffer.skip(4 - (buffer.offset % 4));\n }\n}\n"],"file":"read-header.js"}
@@ -27,7 +27,7 @@ export function readType(buffer, type, size) {
27
27
  return readNumber(size, buffer.readFloat64.bind(buffer));
28
28
 
29
29
  default:
30
- throw new Error(`NetCDF: non valid type ${type}`);
30
+ throw new Error("NetCDF: non valid type ".concat(type));
31
31
  }
32
32
  }
33
33
  export function num2str(type) {