@toolpath/tool-scraper 2.3.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -8
- package/dist/families/emuge.d.ts +51 -3
- package/dist/families/emuge.js +105 -15
- package/dist/families/kennametal.d.ts +291 -2
- package/dist/families/kennametal.js +221 -22
- package/dist/families/maritool.d.ts +31 -0
- package/dist/families/maritool.js +31 -0
- package/dist/family.d.ts +28 -2
- package/dist/holding.d.ts +61 -3
- package/dist/holding.js +42 -1
- package/dist/identity.d.ts +1 -1
- package/dist/identity.js +3 -6
- package/dist/node/cli.js +46 -1
- package/dist/records.d.ts +29 -2
- package/dist/records.js +13 -1
- package/dist/vendors/emuge/records.d.ts +10 -0
- package/dist/vendors/emuge/records.js +12 -0
- package/dist/vendors/kennametal/catalog.d.ts +168 -0
- package/dist/vendors/kennametal/catalog.js +247 -0
- package/dist/vendors/kennametal/holding.js +50 -4
- package/dist/vendors/kennametal/index.d.ts +1 -0
- package/dist/vendors/kennametal/index.js +1 -0
- package/dist/vendors/kennametal/records.js +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -17,14 +17,14 @@ pnpm add @toolpath/tool-scraper
|
|
|
17
17
|
|
|
18
18
|
## Vendors
|
|
19
19
|
|
|
20
|
-
| Vendor | Transport | What it publishes
|
|
21
|
-
| ------------------ | ------------------------------------------------------- |
|
|
22
|
-
| Kennametal / WIDIA | AEM variant-table GET, parsed with `htmlparser2` | tools and toolholding
|
|
23
|
-
| REGO-FIX | Elasticsearch proxy POST + per-part DIN 4000 XML | toolholding
|
|
24
|
-
| Destiny Tool | Firestore REST, paginated | solid end mills
|
|
25
|
-
| Harvey Tool | inline JS literal on a product page, plus its `<thead>` | miniature end mills, keyseat cutters
|
|
26
|
-
| MariTool | osCommerce category listings, then one page per part | toolholding
|
|
27
|
-
| EMUGE-FRANKEN | SAP Commerce JSON API: grouped, variant, batched detail | end mills, twist drills, taps
|
|
20
|
+
| Vendor | Transport | What it publishes |
|
|
21
|
+
| ------------------ | ------------------------------------------------------- | ------------------------------------------------- |
|
|
22
|
+
| Kennametal / WIDIA | AEM variant-table GET, parsed with `htmlparser2` | tools and toolholding |
|
|
23
|
+
| REGO-FIX | Elasticsearch proxy POST + per-part DIN 4000 XML | toolholding |
|
|
24
|
+
| Destiny Tool | Firestore REST, paginated | solid end mills |
|
|
25
|
+
| Harvey Tool | inline JS literal on a product page, plus its `<thead>` | miniature end mills, keyseat cutters |
|
|
26
|
+
| MariTool | osCommerce category listings, then one page per part | toolholding |
|
|
27
|
+
| EMUGE-FRANKEN | SAP Commerce JSON API: grouped, variant, batched detail | end mills, twist drills, taps cutting and forming |
|
|
28
28
|
|
|
29
29
|
## Two entry points
|
|
30
30
|
|
|
@@ -69,6 +69,7 @@ version.
|
|
|
69
69
|
export TOOLPATH_SCRAPE_ROOT=~/toolpath-scrapes # default: ./scrape-out, gitignored
|
|
70
70
|
|
|
71
71
|
toolpath-scrape kennametal 100003658 "$TOOLPATH_SCRAPE_ROOT/kennametal/csv/godrill_3xd_metric.csv"
|
|
72
|
+
toolpath-scrape kennametal --collets # every ER collet family, and which CSV claims it
|
|
72
73
|
toolpath-scrape materials godrill_3xd_metric.csv
|
|
73
74
|
toolpath-scrape regofix holders "$TOOLPATH_SCRAPE_ROOT/regofix/csv/regofix_bt30_pg_holders.csv"
|
|
74
75
|
toolpath-scrape destinytool "$TOOLPATH_SCRAPE_ROOT/destinytool/csv/destinytool_end_mills_inch.csv"
|
|
@@ -77,6 +78,7 @@ toolpath-scrape harvey --catalog # what the four category trees
|
|
|
77
78
|
toolpath-scrape maritool maritool_cat40_holders.csv # its leaf categories come from its config
|
|
78
79
|
toolpath-scrape maritool --catalog # what the five taper trees hold today
|
|
79
80
|
toolpath-scrape emuge emuge_drills.csv # its category and unit come from its config
|
|
81
|
+
toolpath-scrape emuge emuge_form_taps.csv # FG02, the cold-forming taps
|
|
80
82
|
```
|
|
81
83
|
|
|
82
84
|
`toolpath-scrape --help` lists the rest.
|
|
@@ -99,6 +101,15 @@ here. Every Harvey record is `unspecified`: Harvey's material index is published
|
|
|
99
101
|
than in a variant table, and a scrape cannot reach it — see
|
|
100
102
|
[`docs/HARVEY_PRODUCT_TABLE.md`](docs/HARVEY_PRODUCT_TABLE.md) §1.5.1.
|
|
101
103
|
|
|
104
|
+
`threadMethod` is `cutting` or `forming` on a tap and `null` on everything else,
|
|
105
|
+
because the question does not apply to a drill. It is the one field that
|
|
106
|
+
separates a thread former from a cut tap: the two are the same `DC`, `TP`,
|
|
107
|
+
`SFDM`, `OAL` and `LCF`, often the same substrate and coating, and a shop drills
|
|
108
|
+
a larger hole before one than before the other. Neither vendor publishes it in a
|
|
109
|
+
variant table — Kennametal states it in a `newTapType` facet and EMUGE in the
|
|
110
|
+
split between its `FG01` and `FG02` categories — so it is a per-family fact, and
|
|
111
|
+
each family cites the index it was read off.
|
|
112
|
+
|
|
102
113
|
Every per-family constant no vendor table states carries its provenance — whether it was
|
|
103
114
|
vendor-stated, derived or assumed, and by whom on what date. The types enforce it: an assumed fact
|
|
104
115
|
without a note, a date and initials does not compile.
|
package/dist/families/emuge.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* EMUGE-FRANKEN's families.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Five, one per catalog category crossed with the unit system the category is
|
|
5
5
|
* published in. That is coarser than the vendor's own marketing, which splits
|
|
6
6
|
* end mills fifteen ways by product line — TOP-Cut, Hard-Cut, Alu-Cut — and it
|
|
7
7
|
* is deliberate: EMUGE states the product line, the cutting material, the
|
|
@@ -12,8 +12,22 @@
|
|
|
12
12
|
* `PRODUCT_LINE_COLUMNS` reads one per part onto `ToolRecord.productLine`, from
|
|
13
13
|
* a column every scrape already writes.
|
|
14
14
|
*
|
|
15
|
-
* So the only fact
|
|
16
|
-
* two a drill record cannot be built without
|
|
15
|
+
* So the only fact the two milling families state is `unit`; the drill family
|
|
16
|
+
* adds the two a drill record cannot be built without, and each tap family adds
|
|
17
|
+
* how its taps make a thread — see `MACHINE_TAP` and `COLD_FORMING_TAP`.
|
|
18
|
+
*
|
|
19
|
+
* ## The tapping split, which is not a unit split
|
|
20
|
+
*
|
|
21
|
+
* Tapping is the one category EMUGE publishes as **two**: `FG01`, which it
|
|
22
|
+
* titles `Machine taps`, and `FG02`, `Cold forming tap`. They are the same
|
|
23
|
+
* three calls against the same column labels and differ only in what the tools
|
|
24
|
+
* do — one cuts the thread away, the other displaces material into it — so
|
|
25
|
+
* they are two families and not two adapters, and the category is what each
|
|
26
|
+
* one's `threadMethod` fact cites.
|
|
27
|
+
*
|
|
28
|
+
* `FG02` went unscraped until 2026-09-07, which meant `emuge_taps.csv` was the
|
|
29
|
+
* whole of this package's tapping corpus and every row in it was a cutting tap
|
|
30
|
+
* with nothing recording that it was.
|
|
17
31
|
*
|
|
18
32
|
* ## `rows`
|
|
19
33
|
*
|
|
@@ -78,6 +92,9 @@ export declare const SCRAPE_TARGETS: {
|
|
|
78
92
|
readonly 'emuge_taps.csv': {
|
|
79
93
|
readonly category: "FG01";
|
|
80
94
|
};
|
|
95
|
+
readonly 'emuge_form_taps.csv': {
|
|
96
|
+
readonly category: "FG02";
|
|
97
|
+
};
|
|
81
98
|
};
|
|
82
99
|
export declare const FAMILIES: {
|
|
83
100
|
readonly 'emuge_end_mills_inch.csv': {
|
|
@@ -180,6 +197,37 @@ export declare const FAMILIES: {
|
|
|
180
197
|
readonly source: "vendor-stated";
|
|
181
198
|
readonly cite: "every tap dimension is published in millimetres whatever the thread standard — a `#4-40 UNC` tap states `nominal diameter d₁ [mm]` as `2.845 mm`, `pitch [mm]` as `0.635 mm`, and its shank and lengths in `mm` — with `thread symbol`, `nominal size` and `threads per inch` carrying the inch designation beside them";
|
|
182
199
|
};
|
|
200
|
+
readonly threadMethod: {
|
|
201
|
+
readonly value: "cutting";
|
|
202
|
+
readonly source: "vendor-stated";
|
|
203
|
+
readonly cite: "the vendor's own category `FG01`, which it titles `Machine taps`; and independently every one of its 414 grouped products states a `chamfer form` and none states a `lead taper form` (JG 2026-09-07)";
|
|
204
|
+
};
|
|
205
|
+
};
|
|
206
|
+
};
|
|
207
|
+
readonly 'emuge_form_taps.csv': {
|
|
208
|
+
readonly id: "form-taps";
|
|
209
|
+
readonly brand: "emuge";
|
|
210
|
+
readonly kind: "tap";
|
|
211
|
+
readonly familyCode: "FG02";
|
|
212
|
+
readonly columns: {
|
|
213
|
+
readonly DC: "nominal diameter d₁";
|
|
214
|
+
readonly SFDM: "Shank diameter d₂";
|
|
215
|
+
readonly OAL: "Overall length l₁";
|
|
216
|
+
readonly LCF: "length of cutting edge l₂";
|
|
217
|
+
readonly TP: "pitch";
|
|
218
|
+
};
|
|
219
|
+
readonly rows: 1432;
|
|
220
|
+
readonly facts: {
|
|
221
|
+
readonly unit: {
|
|
222
|
+
readonly value: "millimeters";
|
|
223
|
+
readonly source: "vendor-stated";
|
|
224
|
+
readonly cite: "every tap dimension is published in millimetres whatever the thread standard — a `#4-40 UNC` tap states `nominal diameter d₁ [mm]` as `2.845 mm`, `pitch [mm]` as `0.635 mm`, and its shank and lengths in `mm` — with `thread symbol`, `nominal size` and `threads per inch` carrying the inch designation beside them";
|
|
225
|
+
};
|
|
226
|
+
readonly threadMethod: {
|
|
227
|
+
readonly value: "forming";
|
|
228
|
+
readonly source: "vendor-stated";
|
|
229
|
+
readonly cite: "the vendor's own category `FG02`, which it titles `Cold forming tap`; and independently every one of its 137 grouped products states a `lead taper form` and none states a `chamfer form` (JG 2026-09-07)";
|
|
230
|
+
};
|
|
183
231
|
};
|
|
184
232
|
};
|
|
185
233
|
};
|
package/dist/families/emuge.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* EMUGE-FRANKEN's families.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Five, one per catalog category crossed with the unit system the category is
|
|
5
5
|
* published in. That is coarser than the vendor's own marketing, which splits
|
|
6
6
|
* end mills fifteen ways by product line — TOP-Cut, Hard-Cut, Alu-Cut — and it
|
|
7
7
|
* is deliberate: EMUGE states the product line, the cutting material, the
|
|
@@ -12,8 +12,22 @@
|
|
|
12
12
|
* `PRODUCT_LINE_COLUMNS` reads one per part onto `ToolRecord.productLine`, from
|
|
13
13
|
* a column every scrape already writes.
|
|
14
14
|
*
|
|
15
|
-
* So the only fact
|
|
16
|
-
* two a drill record cannot be built without
|
|
15
|
+
* So the only fact the two milling families state is `unit`; the drill family
|
|
16
|
+
* adds the two a drill record cannot be built without, and each tap family adds
|
|
17
|
+
* how its taps make a thread — see `MACHINE_TAP` and `COLD_FORMING_TAP`.
|
|
18
|
+
*
|
|
19
|
+
* ## The tapping split, which is not a unit split
|
|
20
|
+
*
|
|
21
|
+
* Tapping is the one category EMUGE publishes as **two**: `FG01`, which it
|
|
22
|
+
* titles `Machine taps`, and `FG02`, `Cold forming tap`. They are the same
|
|
23
|
+
* three calls against the same column labels and differ only in what the tools
|
|
24
|
+
* do — one cuts the thread away, the other displaces material into it — so
|
|
25
|
+
* they are two families and not two adapters, and the category is what each
|
|
26
|
+
* one's `threadMethod` fact cites.
|
|
27
|
+
*
|
|
28
|
+
* `FG02` went unscraped until 2026-09-07, which meant `emuge_taps.csv` was the
|
|
29
|
+
* whole of this package's tapping corpus and every row in it was a cutting tap
|
|
30
|
+
* with nothing recording that it was.
|
|
17
31
|
*
|
|
18
32
|
* ## `rows`
|
|
19
33
|
*
|
|
@@ -53,6 +67,74 @@ export const SCRAPE_TARGETS = {
|
|
|
53
67
|
},
|
|
54
68
|
'emuge_drills.csv': { category: 'FB01' },
|
|
55
69
|
'emuge_taps.csv': { category: 'FG01' },
|
|
70
|
+
'emuge_form_taps.csv': { category: 'FG02' },
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Tapping geometry, identical either side of the cutting/forming split.
|
|
74
|
+
*
|
|
75
|
+
* **EMUGE labels a cold-forming tap's lead `length of cutting edge l₂` too**,
|
|
76
|
+
* and it reaches the CSV under that label, because a scraped column keeps the
|
|
77
|
+
* vendor's own name — `conventions.ts` opens on the reason. A former has no
|
|
78
|
+
* cutting edge and the label is wrong about it; renaming it here would swap one
|
|
79
|
+
* vendor's inaccuracy for this package's invention, and the record's `LCF` is
|
|
80
|
+
* the canonical name either way.
|
|
81
|
+
*/
|
|
82
|
+
const TAP_COLUMNS = {
|
|
83
|
+
DC: 'nominal diameter d₁',
|
|
84
|
+
SFDM: 'Shank diameter d₂',
|
|
85
|
+
OAL: 'Overall length l₁',
|
|
86
|
+
LCF: 'length of cutting edge l₂',
|
|
87
|
+
TP: 'pitch',
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Which of EMUGE's two tap categories a family scrapes, and how it is known.
|
|
91
|
+
*
|
|
92
|
+
* The vendor splits its taps into two categories and scraping either one is
|
|
93
|
+
* already the answer — but the *parts* say so as well, independently, which is
|
|
94
|
+
* what makes these `vendor-stated` rather than a claim about a URL. Every
|
|
95
|
+
* grouped product carries a flat `technicalDetails` list, and:
|
|
96
|
+
*
|
|
97
|
+
* - all 414 `FG01` groups state `chamfer form` and none states `lead taper
|
|
98
|
+
* form`;
|
|
99
|
+
* - all 137 `FG02` groups state `lead taper form` and none states `chamfer
|
|
100
|
+
* form`.
|
|
101
|
+
*
|
|
102
|
+
* Mutually exclusive, both directions, at full coverage (JG 2026-09-07). A
|
|
103
|
+
* chamfer is ground onto a tap that cuts and a lead taper is rolled onto one
|
|
104
|
+
* that forms, so the vendor is naming the same distinction twice.
|
|
105
|
+
* `tests/emuge-corpus.test.ts` re-checks that agreement against a real scrape,
|
|
106
|
+
* which is what keeps these two constants honest without either family reading
|
|
107
|
+
* a column.
|
|
108
|
+
*
|
|
109
|
+
* **Two things that look like this discriminator and are not**, recorded so
|
|
110
|
+
* nobody reaches for them: `Geometry` — the column `vendors/emuge/records.ts`
|
|
111
|
+
* reads as the product line — takes `AL`, `GAL`, `H`, `MULTI`, `SPEED`,
|
|
112
|
+
* `STEEL`, `VA` and `Z` in *both* categories; and the 189 `FG01` variants whose
|
|
113
|
+
* `flute characteristic` is `without` are six EMUGE *Robust* groups, reinforced
|
|
114
|
+
* cutting taps that still state a `chamfer form`.
|
|
115
|
+
*/
|
|
116
|
+
/**
|
|
117
|
+
* The unit both tap families are published in.
|
|
118
|
+
*
|
|
119
|
+
* Shared because the vendor's rule is about tapping and not about either
|
|
120
|
+
* category: a `#4-40 UNC` tap states millimetres whichever of the two it sits
|
|
121
|
+
* in, which is the same thing the module note says about there being no unit
|
|
122
|
+
* facet on tapping at all.
|
|
123
|
+
*/
|
|
124
|
+
const TAP_MILLIMETERS = {
|
|
125
|
+
value: 'millimeters',
|
|
126
|
+
source: 'vendor-stated',
|
|
127
|
+
cite: 'every tap dimension is published in millimetres whatever the thread standard — a `#4-40 UNC` tap states `nominal diameter d₁ [mm]` as `2.845 mm`, `pitch [mm]` as `0.635 mm`, and its shank and lengths in `mm` — with `thread symbol`, `nominal size` and `threads per inch` carrying the inch designation beside them',
|
|
128
|
+
};
|
|
129
|
+
const MACHINE_TAP = {
|
|
130
|
+
value: 'cutting',
|
|
131
|
+
source: 'vendor-stated',
|
|
132
|
+
cite: "the vendor's own category `FG01`, which it titles `Machine taps`; and independently every one of its 414 grouped products states a `chamfer form` and none states a `lead taper form` (JG 2026-09-07)",
|
|
133
|
+
};
|
|
134
|
+
const COLD_FORMING_TAP = {
|
|
135
|
+
value: 'forming',
|
|
136
|
+
source: 'vendor-stated',
|
|
137
|
+
cite: "the vendor's own category `FG02`, which it titles `Cold forming tap`; and independently every one of its 137 grouped products states a `lead taper form` and none states a `chamfer form` (JG 2026-09-07)",
|
|
56
138
|
};
|
|
57
139
|
/** Milling geometry, identical either side of the unit split. */
|
|
58
140
|
const MILLING_COLUMNS = {
|
|
@@ -144,20 +226,28 @@ export const FAMILIES = {
|
|
|
144
226
|
// `records.DIMENSIONAL_COLUMNS` excluding it means: the vendor publishes
|
|
145
227
|
// `pitch [mm]` and this family is millimetres, so the column is already in
|
|
146
228
|
// the record's native unit.
|
|
147
|
-
columns:
|
|
148
|
-
DC: 'nominal diameter d₁',
|
|
149
|
-
SFDM: 'Shank diameter d₂',
|
|
150
|
-
OAL: 'Overall length l₁',
|
|
151
|
-
LCF: 'length of cutting edge l₂',
|
|
152
|
-
TP: 'pitch',
|
|
153
|
-
},
|
|
229
|
+
columns: TAP_COLUMNS,
|
|
154
230
|
rows: 11566,
|
|
155
231
|
facts: {
|
|
156
|
-
unit:
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
232
|
+
unit: TAP_MILLIMETERS,
|
|
233
|
+
threadMethod: MACHINE_TAP,
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
// The second half of the vendor's own tapping catalog, and the only forming
|
|
237
|
+
// taps this package reaches. It scrapes the same three calls as `FG01`
|
|
238
|
+
// against the same column labels — see `TAP_COLUMNS` — so it is a family
|
|
239
|
+
// rather than an adapter: what differs is the category, and what the
|
|
240
|
+
// category settles.
|
|
241
|
+
'emuge_form_taps.csv': {
|
|
242
|
+
id: 'form-taps',
|
|
243
|
+
brand: 'emuge',
|
|
244
|
+
kind: 'tap',
|
|
245
|
+
familyCode: 'FG02',
|
|
246
|
+
columns: TAP_COLUMNS,
|
|
247
|
+
rows: 1432,
|
|
248
|
+
facts: {
|
|
249
|
+
unit: TAP_MILLIMETERS,
|
|
250
|
+
threadMethod: COLD_FORMING_TAP,
|
|
161
251
|
},
|
|
162
252
|
},
|
|
163
253
|
};
|
|
@@ -237,6 +237,11 @@ export declare const FAMILIES: {
|
|
|
237
237
|
readonly checked: "2026-08-29";
|
|
238
238
|
readonly by: "JG";
|
|
239
239
|
};
|
|
240
|
+
readonly threadMethod: {
|
|
241
|
+
readonly value: "cutting";
|
|
242
|
+
readonly source: "vendor-stated";
|
|
243
|
+
readonly cite: "the vendor's own `newTapType` facet on the variants endpoint: every row of this family answers `:relevance:obsoleteFacet:false:newTapType:11-Spiral Point Tap`, and `3-Forming Tap` — the one forming value of the six — returns the no-results notice (JG 2026-09-07)";
|
|
244
|
+
};
|
|
240
245
|
};
|
|
241
246
|
};
|
|
242
247
|
readonly 'khsst_hand_metric_plug.csv': {
|
|
@@ -265,6 +270,11 @@ export declare const FAMILIES: {
|
|
|
265
270
|
readonly checked: "2026-08-29";
|
|
266
271
|
readonly by: "JG";
|
|
267
272
|
};
|
|
273
|
+
readonly threadMethod: {
|
|
274
|
+
readonly value: "cutting";
|
|
275
|
+
readonly source: "vendor-stated";
|
|
276
|
+
readonly cite: "the same `newTapType` facet: every row of this family answers `2-Hand Tap`, and `3-Forming Tap`, `8-Spiral Flute Tap`, `10-Pipe Tap` and `11-Spiral Point Tap` each return the no-results notice (JG 2026-09-07)";
|
|
277
|
+
};
|
|
268
278
|
};
|
|
269
279
|
};
|
|
270
280
|
readonly 'spiral_point_metric_plug.csv': {
|
|
@@ -293,6 +303,11 @@ export declare const FAMILIES: {
|
|
|
293
303
|
readonly checked: "2026-08-29";
|
|
294
304
|
readonly by: "JG";
|
|
295
305
|
};
|
|
306
|
+
readonly threadMethod: {
|
|
307
|
+
readonly value: "cutting";
|
|
308
|
+
readonly source: "vendor-stated";
|
|
309
|
+
readonly cite: "the vendor's own `newTapType` facet on the variants endpoint: every row of this family answers `:relevance:obsoleteFacet:false:newTapType:11-Spiral Point Tap`, and `3-Forming Tap` — the one forming value of the six — returns the no-results notice (JG 2026-09-07)";
|
|
310
|
+
};
|
|
296
311
|
};
|
|
297
312
|
};
|
|
298
313
|
readonly 'gomill_pro_radiused_4fl_necked_metric.csv': {
|
|
@@ -742,15 +757,169 @@ export declare const HOLDER_FAMILIES: {
|
|
|
742
757
|
};
|
|
743
758
|
};
|
|
744
759
|
};
|
|
760
|
+
/**
|
|
761
|
+
* ER collets, one entry per vendor family.
|
|
762
|
+
*
|
|
763
|
+
* **One entry per vendor family and not one per style.** Kennametal codes the
|
|
764
|
+
* coolant-through line as twelve families — one per series per unit — and their
|
|
765
|
+
* column shapes genuinely differ: the inch half publishes `LF` and `L`, the
|
|
766
|
+
* metric half publishes `L9` instead, and only `109321468` publishes both.
|
|
767
|
+
* Merging them into two CSVs would also destroy `ToolholdingDefinition.rows`,
|
|
768
|
+
* which is a per-family restatement and the only independent check that a
|
|
769
|
+
* re-scrape did not lose parts.
|
|
770
|
+
*
|
|
771
|
+
* Every `familyCode` here came out of `kennametal --collets`, which is what
|
|
772
|
+
* `vendors/kennametal/catalog.ts` exists for. The row counts are that walk's
|
|
773
|
+
* own per-family totals, and each category's parts sum to them exactly —
|
|
774
|
+
* 117 + 107 = 224 standard, 75 + 74 = 149 coolant-through, 47 + 49 = 96 tap.
|
|
775
|
+
*
|
|
776
|
+
* ## The four kit families are deliberately absent
|
|
777
|
+
*
|
|
778
|
+
* `100000428`, `100000425`, `109433662` and `109433658` — 26 parts — publish
|
|
779
|
+
* `Kit Series`, `Number-Kit Items`, `Dimension Range-Kit Items` and
|
|
780
|
+
* `Incremental Division-Kit Items`, and no `D1`, no capacity and no length. A
|
|
781
|
+
* kit is a purchasing unit whose contents are already the per-part families
|
|
782
|
+
* below, and minting one into a `holding.ColletRecord` would mean deriving a
|
|
783
|
+
* capacity band from a range string — authoring tool data, which this package
|
|
784
|
+
* does not do. `kennametal --collets` lists them every run, so they stay
|
|
785
|
+
* visible rather than forgotten.
|
|
786
|
+
*
|
|
787
|
+
* ## ER8 fits nothing in this catalog
|
|
788
|
+
*
|
|
789
|
+
* Nine of the 110 standard metric collets are ER8, and no BT30 ER8 adapter is
|
|
790
|
+
* configured. They are scraped anyway: `holding.HolderRecord.colletSeries`
|
|
791
|
+
* states the direction — a collet nothing takes costs an option, and a collet
|
|
792
|
+
* offered for a holder it does not fit costs a machinist a purchase.
|
|
793
|
+
*/
|
|
745
794
|
export declare const COLLET_FAMILIES: {
|
|
746
795
|
readonly 'er_standard_collets_metric.csv': {
|
|
747
796
|
readonly catalogName: "Kennametal ER Standard Collets Metric";
|
|
748
797
|
readonly rows: 110;
|
|
798
|
+
readonly familyCode: "100000478";
|
|
799
|
+
readonly facts: {
|
|
800
|
+
readonly style: {
|
|
801
|
+
readonly value: "er-standard";
|
|
802
|
+
readonly source: "vendor-stated";
|
|
803
|
+
readonly cite: "the vendor's category is 'ER Collets / ER Standard Collets'; the family publishes a CCCN-CCCX capacity band and no square";
|
|
804
|
+
};
|
|
805
|
+
readonly unit: {
|
|
806
|
+
readonly value: "millimeters";
|
|
807
|
+
readonly source: "vendor-stated";
|
|
808
|
+
readonly cite: "the family is titled and catalogued in this system; both unit columns are usually published, so this decides which is displayed";
|
|
809
|
+
};
|
|
810
|
+
};
|
|
811
|
+
};
|
|
812
|
+
readonly 'er_standard_collets_inch.csv': {
|
|
813
|
+
readonly catalogName: "Kennametal ER Standard Collets Inch";
|
|
814
|
+
readonly rows: 98;
|
|
815
|
+
readonly familyCode: "100000479";
|
|
749
816
|
readonly facts: {
|
|
750
817
|
readonly style: {
|
|
751
818
|
readonly value: "er-standard";
|
|
752
819
|
readonly source: "vendor-stated";
|
|
753
|
-
readonly cite: "the
|
|
820
|
+
readonly cite: "the vendor's category is 'ER Collets / ER Standard Collets'; the family publishes a CCCN-CCCX capacity band and no square";
|
|
821
|
+
};
|
|
822
|
+
readonly unit: {
|
|
823
|
+
readonly value: "inches";
|
|
824
|
+
readonly source: "vendor-stated";
|
|
825
|
+
readonly cite: "the family is titled and catalogued in this system; both unit columns are usually published, so this decides which is displayed";
|
|
826
|
+
};
|
|
827
|
+
};
|
|
828
|
+
};
|
|
829
|
+
readonly 'er11_collets_coolant_through_metric.csv': {
|
|
830
|
+
readonly catalogName: "Kennametal ER11 Collets Coolant-Through Metric";
|
|
831
|
+
readonly rows: 5;
|
|
832
|
+
readonly familyCode: "109333979";
|
|
833
|
+
readonly facts: {
|
|
834
|
+
readonly style: {
|
|
835
|
+
readonly value: "er-sealed";
|
|
836
|
+
readonly source: "vendor-stated";
|
|
837
|
+
readonly cite: "the vendor's category is 'ER Collets / ER Coolant Through Collets'; CCCX == CCCN == D1 on all 139 rows of the twelve families, and Kennametal specs an H6 shank, so each clamps one exact size";
|
|
838
|
+
};
|
|
839
|
+
readonly unit: {
|
|
840
|
+
readonly value: "millimeters";
|
|
841
|
+
readonly source: "vendor-stated";
|
|
842
|
+
readonly cite: "the family is titled and catalogued in this system; both unit columns are usually published, so this decides which is displayed";
|
|
843
|
+
};
|
|
844
|
+
};
|
|
845
|
+
};
|
|
846
|
+
readonly 'er16_collets_coolant_through_metric.csv': {
|
|
847
|
+
readonly catalogName: "Kennametal ER16 Collets Coolant-Through Metric";
|
|
848
|
+
readonly rows: 8;
|
|
849
|
+
readonly familyCode: "109333976";
|
|
850
|
+
readonly facts: {
|
|
851
|
+
readonly style: {
|
|
852
|
+
readonly value: "er-sealed";
|
|
853
|
+
readonly source: "vendor-stated";
|
|
854
|
+
readonly cite: "the vendor's category is 'ER Collets / ER Coolant Through Collets'; CCCX == CCCN == D1 on all 139 rows of the twelve families, and Kennametal specs an H6 shank, so each clamps one exact size";
|
|
855
|
+
};
|
|
856
|
+
readonly unit: {
|
|
857
|
+
readonly value: "millimeters";
|
|
858
|
+
readonly source: "vendor-stated";
|
|
859
|
+
readonly cite: "the family is titled and catalogued in this system; both unit columns are usually published, so this decides which is displayed";
|
|
860
|
+
};
|
|
861
|
+
};
|
|
862
|
+
};
|
|
863
|
+
readonly 'er20_collets_coolant_through_metric.csv': {
|
|
864
|
+
readonly catalogName: "Kennametal ER20 Collets Coolant-Through Metric";
|
|
865
|
+
readonly rows: 11;
|
|
866
|
+
readonly familyCode: "109333973";
|
|
867
|
+
readonly facts: {
|
|
868
|
+
readonly style: {
|
|
869
|
+
readonly value: "er-sealed";
|
|
870
|
+
readonly source: "vendor-stated";
|
|
871
|
+
readonly cite: "the vendor's category is 'ER Collets / ER Coolant Through Collets'; CCCX == CCCN == D1 on all 139 rows of the twelve families, and Kennametal specs an H6 shank, so each clamps one exact size";
|
|
872
|
+
};
|
|
873
|
+
readonly unit: {
|
|
874
|
+
readonly value: "millimeters";
|
|
875
|
+
readonly source: "vendor-stated";
|
|
876
|
+
readonly cite: "the family is titled and catalogued in this system; both unit columns are usually published, so this decides which is displayed";
|
|
877
|
+
};
|
|
878
|
+
};
|
|
879
|
+
};
|
|
880
|
+
readonly 'er25_collets_coolant_through_metric.csv': {
|
|
881
|
+
readonly catalogName: "Kennametal ER25 Collets Coolant-Through Metric";
|
|
882
|
+
readonly rows: 11;
|
|
883
|
+
readonly familyCode: "109333627";
|
|
884
|
+
readonly facts: {
|
|
885
|
+
readonly style: {
|
|
886
|
+
readonly value: "er-sealed";
|
|
887
|
+
readonly source: "vendor-stated";
|
|
888
|
+
readonly cite: "the vendor's category is 'ER Collets / ER Coolant Through Collets'; CCCX == CCCN == D1 on all 139 rows of the twelve families, and Kennametal specs an H6 shank, so each clamps one exact size";
|
|
889
|
+
};
|
|
890
|
+
readonly unit: {
|
|
891
|
+
readonly value: "millimeters";
|
|
892
|
+
readonly source: "vendor-stated";
|
|
893
|
+
readonly cite: "the family is titled and catalogued in this system; both unit columns are usually published, so this decides which is displayed";
|
|
894
|
+
};
|
|
895
|
+
};
|
|
896
|
+
};
|
|
897
|
+
readonly 'er32_collets_coolant_through_metric.csv': {
|
|
898
|
+
readonly catalogName: "Kennametal ER32 Collets Coolant-Through Metric";
|
|
899
|
+
readonly rows: 15;
|
|
900
|
+
readonly familyCode: "109333626";
|
|
901
|
+
readonly facts: {
|
|
902
|
+
readonly style: {
|
|
903
|
+
readonly value: "er-sealed";
|
|
904
|
+
readonly source: "vendor-stated";
|
|
905
|
+
readonly cite: "the vendor's category is 'ER Collets / ER Coolant Through Collets'; CCCX == CCCN == D1 on all 139 rows of the twelve families, and Kennametal specs an H6 shank, so each clamps one exact size";
|
|
906
|
+
};
|
|
907
|
+
readonly unit: {
|
|
908
|
+
readonly value: "millimeters";
|
|
909
|
+
readonly source: "vendor-stated";
|
|
910
|
+
readonly cite: "the family is titled and catalogued in this system; both unit columns are usually published, so this decides which is displayed";
|
|
911
|
+
};
|
|
912
|
+
};
|
|
913
|
+
};
|
|
914
|
+
readonly 'er40_collets_coolant_through_metric.csv': {
|
|
915
|
+
readonly catalogName: "Kennametal ER40 Collets Coolant-Through Metric";
|
|
916
|
+
readonly rows: 19;
|
|
917
|
+
readonly familyCode: "109321468";
|
|
918
|
+
readonly facts: {
|
|
919
|
+
readonly style: {
|
|
920
|
+
readonly value: "er-sealed";
|
|
921
|
+
readonly source: "vendor-stated";
|
|
922
|
+
readonly cite: "the vendor's category is 'ER Collets / ER Coolant Through Collets'; CCCX == CCCN == D1 on all 139 rows of the twelve families, and Kennametal specs an H6 shank, so each clamps one exact size";
|
|
754
923
|
};
|
|
755
924
|
readonly unit: {
|
|
756
925
|
readonly value: "millimeters";
|
|
@@ -759,14 +928,117 @@ export declare const COLLET_FAMILIES: {
|
|
|
759
928
|
};
|
|
760
929
|
};
|
|
761
930
|
};
|
|
931
|
+
readonly 'er11_collets_coolant_through_inch.csv': {
|
|
932
|
+
readonly catalogName: "Kennametal ER11 Collets Coolant-Through Inch";
|
|
933
|
+
readonly rows: 4;
|
|
934
|
+
readonly familyCode: "109333978";
|
|
935
|
+
readonly facts: {
|
|
936
|
+
readonly style: {
|
|
937
|
+
readonly value: "er-sealed";
|
|
938
|
+
readonly source: "vendor-stated";
|
|
939
|
+
readonly cite: "the vendor's category is 'ER Collets / ER Coolant Through Collets'; CCCX == CCCN == D1 on all 139 rows of the twelve families, and Kennametal specs an H6 shank, so each clamps one exact size";
|
|
940
|
+
};
|
|
941
|
+
readonly unit: {
|
|
942
|
+
readonly value: "inches";
|
|
943
|
+
readonly source: "vendor-stated";
|
|
944
|
+
readonly cite: "the family is titled and catalogued in this system; both unit columns are usually published, so this decides which is displayed";
|
|
945
|
+
};
|
|
946
|
+
};
|
|
947
|
+
};
|
|
762
948
|
readonly 'er16_collets_coolant_through_inch.csv': {
|
|
763
949
|
readonly catalogName: "Kennametal ER16 Collets Coolant-Through Inch";
|
|
764
950
|
readonly rows: 10;
|
|
951
|
+
readonly familyCode: "109333975";
|
|
952
|
+
readonly facts: {
|
|
953
|
+
readonly style: {
|
|
954
|
+
readonly value: "er-sealed";
|
|
955
|
+
readonly source: "vendor-stated";
|
|
956
|
+
readonly cite: "the vendor's category is 'ER Collets / ER Coolant Through Collets'; CCCX == CCCN == D1 on all 139 rows of the twelve families, and Kennametal specs an H6 shank, so each clamps one exact size";
|
|
957
|
+
};
|
|
958
|
+
readonly unit: {
|
|
959
|
+
readonly value: "inches";
|
|
960
|
+
readonly source: "vendor-stated";
|
|
961
|
+
readonly cite: "the family is titled and catalogued in this system; both unit columns are usually published, so this decides which is displayed";
|
|
962
|
+
};
|
|
963
|
+
};
|
|
964
|
+
};
|
|
965
|
+
readonly 'er20_collets_coolant_through_inch.csv': {
|
|
966
|
+
readonly catalogName: "Kennametal ER20 Collets Coolant-Through Inch";
|
|
967
|
+
readonly rows: 13;
|
|
968
|
+
readonly familyCode: "109333974";
|
|
969
|
+
readonly facts: {
|
|
970
|
+
readonly style: {
|
|
971
|
+
readonly value: "er-sealed";
|
|
972
|
+
readonly source: "vendor-stated";
|
|
973
|
+
readonly cite: "the vendor's category is 'ER Collets / ER Coolant Through Collets'; CCCX == CCCN == D1 on all 139 rows of the twelve families, and Kennametal specs an H6 shank, so each clamps one exact size";
|
|
974
|
+
};
|
|
975
|
+
readonly unit: {
|
|
976
|
+
readonly value: "inches";
|
|
977
|
+
readonly source: "vendor-stated";
|
|
978
|
+
readonly cite: "the family is titled and catalogued in this system; both unit columns are usually published, so this decides which is displayed";
|
|
979
|
+
};
|
|
980
|
+
};
|
|
981
|
+
};
|
|
982
|
+
readonly 'er25_collets_coolant_through_inch.csv': {
|
|
983
|
+
readonly catalogName: "Kennametal ER25 Collets Coolant-Through Inch";
|
|
984
|
+
readonly rows: 14;
|
|
985
|
+
readonly familyCode: "109333628";
|
|
986
|
+
readonly facts: {
|
|
987
|
+
readonly style: {
|
|
988
|
+
readonly value: "er-sealed";
|
|
989
|
+
readonly source: "vendor-stated";
|
|
990
|
+
readonly cite: "the vendor's category is 'ER Collets / ER Coolant Through Collets'; CCCX == CCCN == D1 on all 139 rows of the twelve families, and Kennametal specs an H6 shank, so each clamps one exact size";
|
|
991
|
+
};
|
|
992
|
+
readonly unit: {
|
|
993
|
+
readonly value: "inches";
|
|
994
|
+
readonly source: "vendor-stated";
|
|
995
|
+
readonly cite: "the family is titled and catalogued in this system; both unit columns are usually published, so this decides which is displayed";
|
|
996
|
+
};
|
|
997
|
+
};
|
|
998
|
+
};
|
|
999
|
+
readonly 'er32_collets_coolant_through_inch.csv': {
|
|
1000
|
+
readonly catalogName: "Kennametal ER32 Collets Coolant-Through Inch";
|
|
1001
|
+
readonly rows: 17;
|
|
1002
|
+
readonly familyCode: "109333625";
|
|
1003
|
+
readonly facts: {
|
|
1004
|
+
readonly style: {
|
|
1005
|
+
readonly value: "er-sealed";
|
|
1006
|
+
readonly source: "vendor-stated";
|
|
1007
|
+
readonly cite: "the vendor's category is 'ER Collets / ER Coolant Through Collets'; CCCX == CCCN == D1 on all 139 rows of the twelve families, and Kennametal specs an H6 shank, so each clamps one exact size";
|
|
1008
|
+
};
|
|
1009
|
+
readonly unit: {
|
|
1010
|
+
readonly value: "inches";
|
|
1011
|
+
readonly source: "vendor-stated";
|
|
1012
|
+
readonly cite: "the family is titled and catalogued in this system; both unit columns are usually published, so this decides which is displayed";
|
|
1013
|
+
};
|
|
1014
|
+
};
|
|
1015
|
+
};
|
|
1016
|
+
readonly 'er40_collets_coolant_through_inch.csv': {
|
|
1017
|
+
readonly catalogName: "Kennametal ER40 Collets Coolant-Through Inch";
|
|
1018
|
+
readonly rows: 12;
|
|
1019
|
+
readonly familyCode: "109321469";
|
|
765
1020
|
readonly facts: {
|
|
766
1021
|
readonly style: {
|
|
767
1022
|
readonly value: "er-sealed";
|
|
768
1023
|
readonly source: "vendor-stated";
|
|
769
|
-
readonly cite: "CCCX == CCCN == D1 on
|
|
1024
|
+
readonly cite: "the vendor's category is 'ER Collets / ER Coolant Through Collets'; CCCX == CCCN == D1 on all 139 rows of the twelve families, and Kennametal specs an H6 shank, so each clamps one exact size";
|
|
1025
|
+
};
|
|
1026
|
+
readonly unit: {
|
|
1027
|
+
readonly value: "inches";
|
|
1028
|
+
readonly source: "vendor-stated";
|
|
1029
|
+
readonly cite: "the family is titled and catalogued in this system; both unit columns are usually published, so this decides which is displayed";
|
|
1030
|
+
};
|
|
1031
|
+
};
|
|
1032
|
+
};
|
|
1033
|
+
readonly 'er_tap_collets_ansi.csv': {
|
|
1034
|
+
readonly catalogName: "Kennametal ER Standard Tap Collets ANSI";
|
|
1035
|
+
readonly rows: 47;
|
|
1036
|
+
readonly familyCode: "100000434";
|
|
1037
|
+
readonly facts: {
|
|
1038
|
+
readonly style: {
|
|
1039
|
+
readonly value: "er-tap";
|
|
1040
|
+
readonly source: "vendor-stated";
|
|
1041
|
+
readonly cite: "the vendor's category is 'ER Collets / ER Tap Collets'; every row publishes an S10 square size and no capacity band";
|
|
770
1042
|
};
|
|
771
1043
|
readonly unit: {
|
|
772
1044
|
readonly value: "inches";
|
|
@@ -775,4 +1047,21 @@ export declare const COLLET_FAMILIES: {
|
|
|
775
1047
|
};
|
|
776
1048
|
};
|
|
777
1049
|
};
|
|
1050
|
+
readonly 'er_tap_collets_din_iso.csv': {
|
|
1051
|
+
readonly catalogName: "Kennametal ER Standard Tap Collets DIN and ISO";
|
|
1052
|
+
readonly rows: 49;
|
|
1053
|
+
readonly familyCode: "100000435";
|
|
1054
|
+
readonly facts: {
|
|
1055
|
+
readonly style: {
|
|
1056
|
+
readonly value: "er-tap";
|
|
1057
|
+
readonly source: "vendor-stated";
|
|
1058
|
+
readonly cite: "the vendor's category is 'ER Collets / ER Tap Collets'; every row publishes an S10 square size and no capacity band";
|
|
1059
|
+
};
|
|
1060
|
+
readonly unit: {
|
|
1061
|
+
readonly value: "millimeters";
|
|
1062
|
+
readonly source: "vendor-stated";
|
|
1063
|
+
readonly cite: "the family is titled and catalogued in this system; both unit columns are usually published, so this decides which is displayed";
|
|
1064
|
+
};
|
|
1065
|
+
};
|
|
1066
|
+
};
|
|
778
1067
|
};
|