@budiauktioner/buildi-primitives 0.2.1 → 0.3.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.
Files changed (56) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/PARITY.md +7 -7
  3. package/README.md +18 -1
  4. package/dist/cjs/contact/phone-number-test-data.js +1 -1
  5. package/dist/cjs/contact/phone-number-test-data.js.map +1 -1
  6. package/dist/cjs/contact/phone-number.js +36 -14
  7. package/dist/cjs/contact/phone-number.js.map +2 -2
  8. package/dist/cjs/organization/swedish-organization-number.js.map +2 -2
  9. package/dist/cjs/register-default-text-scanners.js +2 -0
  10. package/dist/cjs/register-default-text-scanners.js.map +2 -2
  11. package/dist/cjs/sample-data/index.js +18 -1
  12. package/dist/cjs/sample-data/index.js.map +2 -2
  13. package/dist/cjs/text-scanning/text-scan-result.js +3 -0
  14. package/dist/cjs/text-scanning/text-scan-result.js.map +2 -2
  15. package/dist/cjs/validation/validation-error-reason.js +6 -1
  16. package/dist/cjs/validation/validation-error-reason.js.map +2 -2
  17. package/dist/cjs/vehicle/index.js +4 -0
  18. package/dist/cjs/vehicle/index.js.map +2 -2
  19. package/dist/cjs/vehicle/watercraft-identification-number.js +332 -0
  20. package/dist/cjs/vehicle/watercraft-identification-number.js.map +7 -0
  21. package/dist/esm/contact/phone-number-test-data.js +1 -1
  22. package/dist/esm/contact/phone-number-test-data.js.map +1 -1
  23. package/dist/esm/contact/phone-number.js +36 -14
  24. package/dist/esm/contact/phone-number.js.map +2 -2
  25. package/dist/esm/organization/swedish-organization-number.js.map +2 -2
  26. package/dist/esm/register-default-text-scanners.js +2 -0
  27. package/dist/esm/register-default-text-scanners.js.map +2 -2
  28. package/dist/esm/sample-data/index.js +18 -1
  29. package/dist/esm/sample-data/index.js.map +2 -2
  30. package/dist/esm/text-scanning/text-scan-result.js +3 -0
  31. package/dist/esm/text-scanning/text-scan-result.js.map +2 -2
  32. package/dist/esm/validation/validation-error-reason.js +6 -1
  33. package/dist/esm/validation/validation-error-reason.js.map +2 -2
  34. package/dist/esm/vehicle/index.js +8 -0
  35. package/dist/esm/vehicle/index.js.map +2 -2
  36. package/dist/esm/vehicle/watercraft-identification-number.js +315 -0
  37. package/dist/esm/vehicle/watercraft-identification-number.js.map +7 -0
  38. package/dist/types/banking/index.d.cts +2 -2
  39. package/dist/types/banking/index.d.ts +2 -2
  40. package/dist/types/contact/index.d.cts +1 -1
  41. package/dist/types/contact/index.d.ts +1 -1
  42. package/dist/types/index.d.cts +2 -1
  43. package/dist/types/index.d.ts +2 -1
  44. package/dist/types/sample-data/index.d.cts +10 -2
  45. package/dist/types/sample-data/index.d.ts +10 -2
  46. package/dist/types/text-scanning/index.d.cts +3 -1
  47. package/dist/types/text-scanning/index.d.ts +3 -1
  48. package/dist/types/validation/index.d.cts +4 -0
  49. package/dist/types/validation/index.d.ts +4 -0
  50. package/dist/types/vehicle/index.d.cts +2 -0
  51. package/dist/types/vehicle/index.d.ts +2 -0
  52. package/dist/types/watercraft-identification-number-Db1I2LQM.d.cts +123 -0
  53. package/dist/types/watercraft-identification-number-o8B3C6Nx.d.ts +123 -0
  54. package/package.json +18 -13
  55. package/dist/types/{swedish-swish-number-CL6Gx_h3.d.cts → swedish-swish-number-Bh-UbVoN.d.cts} +136 -136
  56. package/dist/types/{swedish-swish-number-DDG3mNDg.d.ts → swedish-swish-number-C2Wccuyr.d.ts} +136 -136
package/CHANGELOG.md CHANGED
@@ -4,6 +4,50 @@ All notable changes to the TypeScript port of `Buildi.Primitives` will be
4
4
  documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
5
5
  and this package adheres to [Semantic Versioning](https://semver.org/).
6
6
 
7
+ ## [0.3.0] - 2026-10-28
8
+
9
+ Tracks `Buildi.Primitives` 0.22.0.
10
+
11
+ ### Added
12
+
13
+ - `WatercraftIdentificationNumber` in the `Vehicle` namespace: the hull
14
+ marking of a small craft (`skrovnummer`), in either the ISO 10087 format
15
+ (CIN/WIN, e.g. `NL-HXAB7A33G506`) or the twelve-character US hull
16
+ identification number (HIN, e.g. `ZZZ00001A020`). Input may be lower case,
17
+ contain whitespace, and omit the hyphen after the ISO country code; any other
18
+ hyphen or punctuation is rejected. `normalize()` returns the number without
19
+ separators, `format()` returns it as marked on the hull. The parsed value
20
+ exposes `scheme`, `countryCode`, `country`, `manufacturerCode`,
21
+ `serialNumber`, `productionMonthCode`, `productionMonth`,
22
+ `productionYearDigit` and `modelYearDigits`. Years stay as the encoded digits
23
+ because the number does not carry the century.
24
+ - `WatercraftIdentificationNumber.validate()` reports one issue per invalid
25
+ segment, using four new `ValidationErrorReason` values:
26
+ `InvalidManufacturerCode`, `InvalidSerialNumber`, `InvalidMonthCode` and
27
+ `InvalidYearDigits`.
28
+ - `maskWatercraftIdentificationNumber`, which keeps the country and
29
+ manufacturer codes visible, e.g. `NL-HXA*********`.
30
+ - `defaultTextScanner` finds watercraft identification numbers, exposed as
31
+ `TextScanResult.watercraftIdentificationNumbers`. A hyphenated ISO number is
32
+ reported with `Medium` confidence; an unseparated one and a US HIN with
33
+ `Low`.
34
+ - `VehicleSampleData.WatercraftIdentificationNumber` in `sample-data`, holding
35
+ the ISO 10087 worked example and a US HIN constructed for this library.
36
+
37
+ ### Fixed
38
+
39
+ - `PhoneNumber.formatted`, `toLocalString()` and `format()` put the hyphen
40
+ after the area code based on the number's length instead of the numbering
41
+ plan, so every mobile number and most landlines were split in the wrong
42
+ place (`0701-74 06 35` instead of `070-174 06 35`, `0846-50 04 56` instead
43
+ of `08-465 004 56`). The area code is now looked up in PTS's numbering plan
44
+ and the subscriber number is grouped by its own length, as Svenska
45
+ skrivregler recommends. Swedish numbers formatted internationally get the
46
+ same split, e.g. `+46 8 465 004 56`. `maskPhoneNumberDetailed` follows the
47
+ new area code, e.g. `070-*** ** 33`. The normalized form is unchanged.
48
+ - `ContactSampleData.PhoneNumber.swedishFixedTest` is now `+46846500400`, from the
49
+ PTS-reserved Stockholm range, instead of a number outside it.
50
+
7
51
  ## [0.2.1] - 2026-08-07
8
52
 
9
53
  ### Fixed
package/PARITY.md CHANGED
@@ -7,10 +7,10 @@ exactly how much of that surface is implemented here.
7
7
 
8
8
  | | |
9
9
  | ----------------- | -------------------------- |
10
- | .NET baseline | `Buildi.Primitives` 0.21.0 |
11
- | This package | `0.2.1` |
10
+ | .NET baseline | `Buildi.Primitives` 0.22.0 |
11
+ | This package | `0.3.0` |
12
12
  | Namespaces ported | 13 of 13 |
13
- | Types ported | 200 of 200 |
13
+ | Types ported | 201 of 201 |
14
14
 
15
15
  Type counts follow the catalog in the .NET README — the value-object types a
16
16
  consumer works with directly, excluding extension-method containers and internal
@@ -37,7 +37,7 @@ commit that changes the .NET baseline.
37
37
  | `Validation` | Complete | Shared `ValidationResult` infrastructure |
38
38
  | `TextScanning` | Complete | Scanner, candidates, overlap resolution, typed accessors |
39
39
  | `Measurement` | Full parity | 19 dimensions, 133 units, 5 standalone types, plus `TemperatureDelta` |
40
- | `Vehicle` | Full parity | 29 types, plus the `SwedishDrivingLicenseVehicleGroup` enum |
40
+ | `Vehicle` | Full parity | 30 types, plus the `SwedishDrivingLicenseVehicleGroup` enum |
41
41
  | `Product` | Full parity | 36 types, plus 6 nested enums |
42
42
 
43
43
  ## Cross-cutting features
@@ -46,9 +46,9 @@ commit that changes the .NET baseline.
46
46
  | -------------------------------------------------------------------------- | --------------------------------------------------- |
47
47
  | `tryParse` / `parse` / `isValid` / `format` / `normalize` / `isNormalized` | Complete for every value-object type |
48
48
  | `typeInfo` metadata (English + Swedish name, emoji, sources) | Complete |
49
- | `validate()` structured validation | Complete — all 14 types that have it in .NET |
50
- | `findCandidatesInText()` text scanning | Complete — all 70 types that have it in .NET |
51
- | `TextScanResult` typed accessors | Complete — all 67 .NET accessors, plus `luminances` |
49
+ | `validate()` structured validation | Complete — all 15 types that have it in .NET |
50
+ | `findCandidatesInText()` text scanning | Complete — all 71 types that have it in .NET |
51
+ | `TextScanResult` typed accessors | Complete — all 68 .NET accessors, plus `luminances` |
52
52
  | Masking (`toMaskedString` → `mask*` functions) | Complete |
53
53
  | Lookup and external-link helpers | Complete |
54
54
  | `PrimitivesDefaults` (culture, UI culture, country, calling code) | Complete |
package/README.md CHANGED
@@ -101,6 +101,22 @@ result.issues.map((i) => i.reason); // ["InvalidCheckDigit"]
101
101
  result.issues[0].description; // "Ogiltiga IBAN-kontrollsiffror."
102
102
  ```
103
103
 
104
+ Where a value is made of independent segments, every failing segment gets its
105
+ own issue:
106
+
107
+ ```ts
108
+ import { WatercraftIdentificationNumber } from "@budiauktioner/buildi-primitives/vehicle";
109
+
110
+ WatercraftIdentificationNumber.validate("NL-H0AB7A33M506").issues.map((i) => i.reason);
111
+ // ["InvalidManufacturerCode", "InvalidMonthCode"]
112
+
113
+ const win = WatercraftIdentificationNumber.parse("nlhxab7a33g506");
114
+ win.toString(); // "NL-HXAB7A33G506" — as marked on the hull
115
+ win.toNormalizedString(); // "NLHXAB7A33G506"
116
+ win.productionMonth; // 7
117
+ win.modelYearDigits; // "06" — the century is not encoded
118
+ ```
119
+
104
120
  `reason` is a stable `ValidationErrorReason` enum value safe to branch on.
105
121
  `description` is human-readable and follows the display language described
106
122
  under [Defaults and display language](#defaults-and-display-language); each
@@ -264,6 +280,7 @@ import {
264
280
  FuelType,
265
281
  TireDimension,
266
282
  VehicleIdentificationNumber,
283
+ WatercraftIdentificationNumber,
267
284
  } from "@budiauktioner/buildi-primitives/vehicle";
268
285
  import { Gtin13, ScreenSize, ClothingSize } from "@budiauktioner/buildi-primitives/product";
269
286
  import { ValidationErrorReason } from "@budiauktioner/buildi-primitives/validation";
@@ -274,7 +291,7 @@ particular a `defaultTextScanner` that already knows every scannable type.
274
291
 
275
292
  ## Runtime targets
276
293
 
277
- - Node.js 20.10 or newer (see [`.nvmrc`](.nvmrc)).
294
+ - Node.js 20.10 or newer.
278
295
  - Bun 1.1 or newer.
279
296
  - Modern browsers (current Chromium, Firefox, Safari).
280
297
  - No Node-only runtime APIs and no runtime dependencies; ES2022 plus standard
@@ -41,7 +41,7 @@ const PhoneNumberTestData = {
41
41
  get landlineMalmo() {
42
42
  return generateRange("04062804", 0, 99);
43
43
  },
44
- /** Landline Stockholm: 08-4650 04 00 through 08-4650 04 99 (100 numbers). */
44
+ /** Landline Stockholm: 08-465 004 00 through 08-465 004 99 (100 numbers). */
45
45
  get landlineStockholm() {
46
46
  return generateRange("08465004", 0, 99);
47
47
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/contact/phone-number-test-data.ts"],
4
- "sourcesContent": ["/**\n * PTS (Post- och telestyrelsen) reserves phone number ranges for use in fiction\n * and testing \u2014 these numbers are never assigned to real subscribers.\n *\n * {@link PhoneNumberTestData} enumerates every reserved number;\n * `PhoneNumber.isSwedishTestPhoneNumber` checks whether a parsed number falls in\n * a reserved range.\n *\n * Source: https://pts.se/internet-och-telefoni/telefonnummer-och-adressering/telefonnummer-till-bocker-och-filmer/\n */\nfunction generateRange(prefix: string, from: number, to: number): readonly string[] {\n const result: string[] = [];\n for (let i = from; i <= to; i++) {\n result.push(prefix + String(i).padStart(2, \"0\"));\n }\n return Object.freeze(result);\n}\n\nexport const PhoneNumberTestData = {\n /** Mobile: 070-174 06 05 through 070-174 06 99 (95 numbers). */\n get mobile(): readonly string[] {\n return generateRange(\"07017406\", 5, 99);\n },\n\n /** Landline Gothenburg: 031-390 06 00 through 031-390 06 99 (100 numbers). */\n get landlineGothenburg(): readonly string[] {\n return generateRange(\"03139006\", 0, 99);\n },\n\n /** Landline Malm\u00F6: 040-628 04 00 through 040-628 04 99 (100 numbers). */\n get landlineMalmo(): readonly string[] {\n return generateRange(\"04062804\", 0, 99);\n },\n\n /** Landline Stockholm: 08-4650 04 00 through 08-4650 04 99 (100 numbers). */\n get landlineStockholm(): readonly string[] {\n return generateRange(\"08465004\", 0, 99);\n },\n\n /** Landline Kiruna: 0980-31 92 00 through 0980-31 92 99 (100 numbers). */\n get landlineKiruna(): readonly string[] {\n return generateRange(\"09803192\", 0, 99);\n },\n\n /** All reserved test phone numbers across all ranges (495 numbers). */\n get all(): readonly string[] {\n return Object.freeze([\n ...PhoneNumberTestData.mobile,\n ...PhoneNumberTestData.landlineGothenburg,\n ...PhoneNumberTestData.landlineMalmo,\n ...PhoneNumberTestData.landlineStockholm,\n ...PhoneNumberTestData.landlineKiruna,\n ]);\n },\n};\n"],
4
+ "sourcesContent": ["/**\n * PTS (Post- och telestyrelsen) reserves phone number ranges for use in fiction\n * and testing \u2014 these numbers are never assigned to real subscribers.\n *\n * {@link PhoneNumberTestData} enumerates every reserved number;\n * `PhoneNumber.isSwedishTestPhoneNumber` checks whether a parsed number falls in\n * a reserved range.\n *\n * Source: https://pts.se/internet-och-telefoni/telefonnummer-och-adressering/telefonnummer-till-bocker-och-filmer/\n */\nfunction generateRange(prefix: string, from: number, to: number): readonly string[] {\n const result: string[] = [];\n for (let i = from; i <= to; i++) {\n result.push(prefix + String(i).padStart(2, \"0\"));\n }\n return Object.freeze(result);\n}\n\nexport const PhoneNumberTestData = {\n /** Mobile: 070-174 06 05 through 070-174 06 99 (95 numbers). */\n get mobile(): readonly string[] {\n return generateRange(\"07017406\", 5, 99);\n },\n\n /** Landline Gothenburg: 031-390 06 00 through 031-390 06 99 (100 numbers). */\n get landlineGothenburg(): readonly string[] {\n return generateRange(\"03139006\", 0, 99);\n },\n\n /** Landline Malm\u00F6: 040-628 04 00 through 040-628 04 99 (100 numbers). */\n get landlineMalmo(): readonly string[] {\n return generateRange(\"04062804\", 0, 99);\n },\n\n /** Landline Stockholm: 08-465 004 00 through 08-465 004 99 (100 numbers). */\n get landlineStockholm(): readonly string[] {\n return generateRange(\"08465004\", 0, 99);\n },\n\n /** Landline Kiruna: 0980-31 92 00 through 0980-31 92 99 (100 numbers). */\n get landlineKiruna(): readonly string[] {\n return generateRange(\"09803192\", 0, 99);\n },\n\n /** All reserved test phone numbers across all ranges (495 numbers). */\n get all(): readonly string[] {\n return Object.freeze([\n ...PhoneNumberTestData.mobile,\n ...PhoneNumberTestData.landlineGothenburg,\n ...PhoneNumberTestData.landlineMalmo,\n ...PhoneNumberTestData.landlineStockholm,\n ...PhoneNumberTestData.landlineKiruna,\n ]);\n },\n};\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA,SAAS,cAAc,QAAgB,MAAc,IAA+B;AAClF,QAAM,SAAmB,CAAC;AAC1B,WAAS,IAAI,MAAM,KAAK,IAAI,KAAK;AAC/B,WAAO,KAAK,SAAS,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,EACjD;AACA,SAAO,OAAO,OAAO,MAAM;AAC7B;AAEO,MAAM,sBAAsB;AAAA;AAAA,EAEjC,IAAI,SAA4B;AAC9B,WAAO,cAAc,YAAY,GAAG,EAAE;AAAA,EACxC;AAAA;AAAA,EAGA,IAAI,qBAAwC;AAC1C,WAAO,cAAc,YAAY,GAAG,EAAE;AAAA,EACxC;AAAA;AAAA,EAGA,IAAI,gBAAmC;AACrC,WAAO,cAAc,YAAY,GAAG,EAAE;AAAA,EACxC;AAAA;AAAA,EAGA,IAAI,oBAAuC;AACzC,WAAO,cAAc,YAAY,GAAG,EAAE;AAAA,EACxC;AAAA;AAAA,EAGA,IAAI,iBAAoC;AACtC,WAAO,cAAc,YAAY,GAAG,EAAE;AAAA,EACxC;AAAA;AAAA,EAGA,IAAI,MAAyB;AAC3B,WAAO,OAAO,OAAO;AAAA,MACnB,GAAG,oBAAoB;AAAA,MACvB,GAAG,oBAAoB;AAAA,MACvB,GAAG,oBAAoB;AAAA,MACvB,GAAG,oBAAoB;AAAA,MACvB,GAAG,oBAAoB;AAAA,IACzB,CAAC;AAAA,EACH;AACF;",
6
6
  "names": []
7
7
  }
@@ -221,7 +221,7 @@ class PhoneNumber {
221
221
  return this.countryCallingCode.value === dcc ? this.toLocalString() : this.toDisplayInternationalString();
222
222
  }
223
223
  const subscriber = this.digits.slice(2 + this.countryCallingCode.value.length);
224
- if (this.isSwedish) return formatSwedishLocal("0" + subscriber);
224
+ if (this.isSwedish) return formatSwedishLocal(subscriber);
225
225
  return "0" + subscriber;
226
226
  }
227
227
  toE164String() {
@@ -232,6 +232,7 @@ class PhoneNumber {
232
232
  }
233
233
  toDisplayInternationalString() {
234
234
  const subscriber = this.digits.slice(2 + this.countryCallingCode.value.length);
235
+ if (this.isSwedish) return formatSwedishInternational(subscriber);
235
236
  return "+" + this.countryCallingCode.value + " " + formatInternationalSubscriberDigits(this.countryCallingCode.value, subscriber);
236
237
  }
237
238
  toString() {
@@ -305,21 +306,42 @@ function formatInternationalSubscriberDigits(callingCode, digits) {
305
306
  return digits;
306
307
  }
307
308
  }
308
- function formatSwedishLocal(number) {
309
- const digits = number.replace(/^0+/, "");
310
- if (digits.length === 9) {
311
- return `0${digits.slice(0, 3)}-${digits.slice(3, 5)} ${digits.slice(5, 7)} ${digits.slice(7, 9)}`;
309
+ const SWEDISH_TWO_DIGIT_DESTINATION_CODES = /* @__PURE__ */ new Set([
310
+ ..."11 13 16 18 19 21 23 26 31 33 35 36 40 42 44 46 54 60 63 90".split(" "),
311
+ ..."10 20 70 71 72 73 74 75 76 77 79 99".split(" ")
312
+ ]);
313
+ const SWEDISH_THREE_DIGIT_DESTINATION_CODES_OVERRIDING_TWO_DIGIT = /* @__PURE__ */ new Set(["900"]);
314
+ function swedishDestinationCodeLength(nationalSignificantNumber) {
315
+ if (nationalSignificantNumber.startsWith("8")) return 1;
316
+ if (SWEDISH_THREE_DIGIT_DESTINATION_CODES_OVERRIDING_TWO_DIGIT.has(
317
+ nationalSignificantNumber.slice(0, 3)
318
+ )) {
319
+ return 3;
312
320
  }
313
- if (digits.length === 7) {
314
- const area = digits.slice(0, 1);
315
- const rest = digits.slice(1);
316
- return `0${area}-${rest.slice(0, 2)} ${rest.slice(2, 4)} ${rest.slice(4, 6)}`;
321
+ if (SWEDISH_TWO_DIGIT_DESTINATION_CODES.has(nationalSignificantNumber.slice(0, 2))) return 2;
322
+ return 3;
323
+ }
324
+ function groupSwedishSubscriberNumber(subscriber) {
325
+ if (subscriber.length === 8) {
326
+ return `${subscriber.slice(0, 3)} ${subscriber.slice(3, 6)} ${subscriber.slice(6)}`;
317
327
  }
318
- if (digits.length === 8) {
319
- const area = digits.slice(0, 1);
320
- const rest = digits.slice(1);
321
- return `0${area}-${rest.slice(0, 2)} ${rest.slice(2, 4)} ${rest.slice(4, 7)}`;
328
+ const firstGroupLength = subscriber.length % 2 === 1 ? 3 : 2;
329
+ const groups = [subscriber.slice(0, firstGroupLength)];
330
+ for (let i = firstGroupLength; i < subscriber.length; i += 2) {
331
+ groups.push(subscriber.slice(i, i + 2));
322
332
  }
323
- return number;
333
+ return groups.join(" ");
334
+ }
335
+ function splitSwedishNationalNumber(nationalSignificantNumber) {
336
+ const length = swedishDestinationCodeLength(nationalSignificantNumber);
337
+ return [nationalSignificantNumber.slice(0, length), nationalSignificantNumber.slice(length)];
338
+ }
339
+ function formatSwedishLocal(nationalSignificantNumber) {
340
+ const [destinationCode, subscriber] = splitSwedishNationalNumber(nationalSignificantNumber);
341
+ return `0${destinationCode}-${groupSwedishSubscriberNumber(subscriber)}`;
342
+ }
343
+ function formatSwedishInternational(nationalSignificantNumber) {
344
+ const [destinationCode, subscriber] = splitSwedishNationalNumber(nationalSignificantNumber);
345
+ return `+46 ${destinationCode} ${groupSwedishSubscriberNumber(subscriber)}`;
324
346
  }
325
347
  //# sourceMappingURL=phone-number.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/contact/phone-number.ts"],
4
- "sourcesContent": ["import { PrimitiveTypeInfo } from \"../primitive-type-info.js\";\nimport { PrimitivesDefaults } from \"../primitives-defaults.js\";\nimport { sanitizeInput } from \"../internal/input-sanitization.js\";\nimport { TextCandidateCategory } from \"../text-scanning/text-candidate-category.js\";\nimport { TextCandidate } from \"../text-scanning/text-candidate.js\";\nimport { TextMatchConfidence } from \"../text-scanning/text-match-confidence.js\";\nimport { Country } from \"../geography/index.js\";\nimport { PhoneCallingCode } from \"./phone-calling-code.js\";\n\nconst MAX_INPUT_LENGTH = 50;\nconst URI_PREFIXES = [\"callto:\", \"tel:\", \"sms:\", \"call:\"];\n\nconst TWO_DIGIT_CODES = new Set([\n \"20\",\n \"27\",\n \"30\",\n \"31\",\n \"32\",\n \"33\",\n \"34\",\n \"36\",\n \"39\",\n \"40\",\n \"41\",\n \"43\",\n \"44\",\n \"45\",\n \"46\",\n \"47\",\n \"48\",\n \"49\",\n \"51\",\n \"52\",\n \"53\",\n \"54\",\n \"55\",\n \"56\",\n \"57\",\n \"58\",\n \"60\",\n \"61\",\n \"62\",\n \"63\",\n \"64\",\n \"65\",\n \"66\",\n \"81\",\n \"82\",\n \"84\",\n \"86\",\n \"90\",\n \"91\",\n \"92\",\n \"93\",\n \"94\",\n \"95\",\n \"98\",\n]);\n\nconst LEADING_ZERO_SIGNIFICANT = new Set([\"39\"]);\n\nconst SCAN =\n /(?:(?:\\+|00)\\d{1,3}[\\s-]\\(?\\d{1,4}\\)?[\\s-]?\\d[\\d\\s-]{5,12}\\d)|(?:(?:\\+|00)\\d{7,15})|(?:0\\d{1,3}[\\s-]?\\d[\\d\\s-]{5,10}\\d)/g;\n\n/**\n * A phone number (`telefonnummer`). Stored normalized as `00` + country code +\n * subscriber digits (e.g. `0046701740633`). Use {@link toE164String} for the\n * `+`-prefixed E.164 form.\n */\nexport class PhoneNumber {\n static readonly typeInfo: PrimitiveTypeInfo = Object.freeze({\n englishName: \"Phone Number\",\n localizedName: \"Telefonnummer\",\n emoji: \"\\u{1F4DE}\",\n sources: Object.freeze([\n \"https://pts.se/\",\n \"https://www.itu.int/rec/T-REC-E.164/\",\n \"https://en.wikipedia.org/wiki/E.164\",\n ]),\n });\n\n readonly digits: string;\n readonly countryCallingCode: PhoneCallingCode;\n readonly country: Country | null;\n readonly isSwedish: boolean;\n readonly isMobile: boolean;\n\n private constructor(digits: string, isSwedish: boolean, isMobile: boolean) {\n this.digits = digits;\n this.isSwedish = isSwedish;\n this.isMobile = isMobile;\n this.countryCallingCode = PhoneCallingCode.fromResolvedDigits(resolveCallingCode(digits));\n this.country = Country.tryFindByCallingCode(this.countryCallingCode.value);\n }\n\n get isSwedishTestPhoneNumber(): boolean {\n if (!this.isSwedish) return false;\n const local = this.digits.slice(4);\n return (\n isInPtsRange(local, \"7017406\", 5, 99) ||\n isInPtsRange(local, \"3139006\", 0, 99) ||\n isInPtsRange(local, \"4062804\", 0, 99) ||\n isInPtsRange(local, \"8465004\", 0, 99) ||\n isInPtsRange(local, \"9803192\", 0, 99)\n );\n }\n\n get formatted(): string {\n return this.isSwedish ? this.toLocalString() : this.toDisplayInternationalString();\n }\n\n static tryParse(\n input: string | null | undefined,\n defaultCallingCode?: string | PhoneCallingCode | Country | null,\n ): PhoneNumber | null {\n if (input == null || input.trim() === \"\") return null;\n const dcc = resolveDefaultCallingCode(defaultCallingCode);\n if (!dcc) return null;\n\n let cleaned = sanitizeInput(input).trim();\n if (cleaned.length > MAX_INPUT_LENGTH) return null;\n\n for (const prefix of URI_PREFIXES) {\n if (cleaned.toLowerCase().startsWith(prefix)) {\n cleaned = cleaned.slice(prefix.length).trimStart();\n break;\n }\n }\n\n const hasPlus = cleaned.startsWith(\"+\");\n const withOAs0 = cleaned.replace(/O/g, \"0\");\n const digitsOnly = withOAs0.replace(/[^\\d]/g, \"\");\n if (digitsOnly === \"\") return null;\n\n let e164: string;\n if (hasPlus) {\n if (digitsOnly.length < 7 || digitsOnly.length > 15) return null;\n e164 = stripTrunkZeroAfterCallingCode(digitsOnly);\n } else if (digitsOnly.startsWith(\"00\")) {\n const cn = digitsOnly.slice(2);\n if (cn.length < 7 || cn.length > 15) return null;\n e164 = stripTrunkZeroAfterCallingCode(cn);\n } else if (digitsOnly.startsWith(dcc) && digitsOnly.length >= dcc.length + 7) {\n const subscriber = digitsOnly.slice(dcc.length);\n e164 = dcc + stripSingleTrunkZero(dcc, subscriber);\n } else if (digitsOnly.startsWith(\"0\")) {\n const subscriber = stripSingleTrunkZero(dcc, digitsOnly);\n const total = dcc.length + subscriber.length;\n if (total < 7 || total > 15) return null;\n e164 = dcc + subscriber;\n } else if (dcc === \"46\" && digitsOnly.length === 9 && digitsOnly.startsWith(\"7\")) {\n e164 = \"46\" + digitsOnly;\n } else {\n return null;\n }\n\n if (e164.length < 7 || e164.length > 15) return null;\n const isSwedish = e164.startsWith(\"46\");\n if (isSwedish) {\n const local = e164.slice(2);\n if (local.length < 7 || local.length > 9) return null;\n }\n const isMobile = isSwedish && e164.slice(2).startsWith(\"7\");\n return new PhoneNumber(\"00\" + e164, isSwedish, isMobile);\n }\n\n static parse(\n input: string,\n defaultCallingCode?: string | PhoneCallingCode | Country | null,\n ): PhoneNumber {\n const r = PhoneNumber.tryParse(input, defaultCallingCode);\n if (r === null) throw new Error(\"Invalid phone number.\");\n return r;\n }\n\n static isValid(\n input: string | null | undefined,\n defaultCallingCode?: string | PhoneCallingCode | Country | null,\n ): boolean {\n return PhoneNumber.tryParse(input, defaultCallingCode) !== null;\n }\n\n static format(\n input: string | null | undefined,\n options?: {\n defaultCallingCode?: string | PhoneCallingCode | Country | null;\n fallbackToTrimmedInputWhenInvalid?: boolean;\n },\n ): string | null {\n const dcc =\n resolveDefaultCallingCode(options?.defaultCallingCode) ??\n PrimitivesDefaults.defaultCallingCode;\n const r = PhoneNumber.tryParse(input, dcc);\n if (r) {\n return r.countryCallingCode.value === dcc\n ? r.toLocalString()\n : r.toDisplayInternationalString();\n }\n if (options?.fallbackToTrimmedInputWhenInvalid && input != null && input.trim() !== \"\") {\n return input.trim();\n }\n return null;\n }\n\n static normalize(\n input: string | null | undefined,\n options?: {\n defaultCallingCode?: string | PhoneCallingCode | Country | null;\n fallbackToTrimmedInputWhenInvalid?: boolean;\n },\n ): string | null {\n const r = PhoneNumber.tryParse(input, options?.defaultCallingCode);\n if (r) return r.digits;\n if (options?.fallbackToTrimmedInputWhenInvalid && input != null) {\n const t = input.trim();\n return t.length > 0 ? t : null;\n }\n return null;\n }\n\n static isNormalized(input: string | null | undefined): boolean {\n return input != null && PhoneNumber.normalize(input) === input;\n }\n\n static findCandidatesInText(text: string): readonly TextCandidate<PhoneNumber>[] {\n if (!text) return [];\n const out: TextCandidate<PhoneNumber>[] = [];\n SCAN.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = SCAN.exec(text)) !== null) {\n const phone = PhoneNumber.tryParse(m[0]);\n if (!phone) continue;\n out.push(\n new TextCandidate<PhoneNumber>({\n startIndex: m.index,\n length: m[0].length,\n originalText: m[0],\n typeName: \"PhoneNumber\",\n category: TextCandidateCategory.Contact,\n normalizedForm: phone.toNormalizedString(),\n formattedForm: phone.toString(),\n maskedForm: maskPhoneNumber(phone),\n confidence: TextMatchConfidence.Medium,\n value: phone,\n }),\n );\n }\n return out;\n }\n\n toNormalizedString(): string {\n return this.digits;\n }\n\n toLocalString(defaultCallingCode?: PhoneCallingCode | Country): string {\n if (defaultCallingCode) {\n const dcc =\n defaultCallingCode instanceof PhoneCallingCode\n ? defaultCallingCode.value\n : defaultCallingCode.callingCode;\n return this.countryCallingCode.value === dcc\n ? this.toLocalString()\n : this.toDisplayInternationalString();\n }\n const subscriber = this.digits.slice(2 + this.countryCallingCode.value.length);\n if (this.isSwedish) return formatSwedishLocal(\"0\" + subscriber);\n return \"0\" + subscriber;\n }\n\n toE164String(): string {\n return \"+\" + this.digits.slice(2);\n }\n toInternationalString(): string {\n return this.toE164String();\n }\n\n toDisplayInternationalString(): string {\n const subscriber = this.digits.slice(2 + this.countryCallingCode.value.length);\n return (\n \"+\" +\n this.countryCallingCode.value +\n \" \" +\n formatInternationalSubscriberDigits(this.countryCallingCode.value, subscriber)\n );\n }\n\n toString(): string {\n return this.formatted;\n }\n\n equals(other: PhoneNumber | null | undefined): boolean {\n return other != null && this.digits === other.digits;\n }\n compareTo(other: PhoneNumber | null | undefined): number {\n if (other == null) return 1;\n return this.digits < other.digits ? -1 : this.digits > other.digits ? 1 : 0;\n }\n}\n\n/** Mask a phone number, keeping country code and last 4 digits visible. */\nexport function maskPhoneNumber(p: PhoneNumber): string {\n const f = p.toE164String();\n if (f.length <= 5) return f.replace(/\\d/g, \"*\");\n const cc = \"+\" + p.countryCallingCode.value;\n const subscriber = f.slice(cc.length);\n if (subscriber.length <= 4) return cc + \"*\".repeat(subscriber.length);\n return cc + \"*\".repeat(subscriber.length - 4) + subscriber.slice(-4);\n}\n\nfunction resolveDefaultCallingCode(\n d: string | PhoneCallingCode | Country | null | undefined,\n): string | null {\n if (d == null) return PrimitivesDefaults.defaultCallingCode;\n if (typeof d === \"string\") return d;\n if (d instanceof PhoneCallingCode) return d.value;\n return d.callingCode;\n}\n\nfunction resolveCallingCode(digits: string): string {\n return resolveCallingCodeFromE164(digits.slice(2));\n}\n\nfunction resolveCallingCodeFromE164(e164: string): string {\n if (e164.length === 0) return \"\";\n if (e164[0] === \"1\" || e164[0] === \"7\") return e164.slice(0, 1);\n if (e164.length >= 2 && TWO_DIGIT_CODES.has(e164.slice(0, 2))) return e164.slice(0, 2);\n return e164.length >= 3 ? e164.slice(0, 3) : e164;\n}\n\nfunction stripTrunkZeroAfterCallingCode(e164: string): string {\n const cc = resolveCallingCodeFromE164(e164);\n if (cc.length === 0 || cc.length >= e164.length) return e164;\n const subscriber = e164.slice(cc.length);\n return cc + stripSingleTrunkZero(cc, subscriber);\n}\n\nfunction stripSingleTrunkZero(callingCode: string, subscriber: string): string {\n if (subscriber.length === 0 || subscriber[0] !== \"0\") return subscriber;\n if (LEADING_ZERO_SIGNIFICANT.has(callingCode)) return subscriber;\n return subscriber.slice(1);\n}\n\nfunction isInPtsRange(local: string, prefix: string, from: number, to: number): boolean {\n if (!local.startsWith(prefix)) return false;\n const suffix = local.slice(prefix.length);\n if (suffix.length !== 2) return false;\n const n = parseInt(suffix, 10);\n return Number.isFinite(n) && n >= from && n <= to;\n}\n\nfunction formatInternationalSubscriberDigits(callingCode: string, digits: string): string {\n if (callingCode === \"1\" && digits.length === 10) {\n return `${digits.slice(0, 3)} ${digits.slice(3, 6)} ${digits.slice(6, 10)}`;\n }\n switch (digits.length) {\n case 7:\n return `${digits.slice(0, 3)} ${digits.slice(3, 5)} ${digits.slice(5, 7)}`;\n case 8:\n return `${digits.slice(0, 2)} ${digits.slice(2, 4)} ${digits.slice(4, 6)} ${digits.slice(6, 8)}`;\n case 9:\n return `${digits.slice(0, 2)} ${digits.slice(2, 5)} ${digits.slice(5, 7)} ${digits.slice(7, 9)}`;\n case 10:\n return `${digits.slice(0, 2)} ${digits.slice(2, 6)} ${digits.slice(6, 10)}`;\n case 11:\n return `${digits.slice(0, 3)} ${digits.slice(3, 7)} ${digits.slice(7, 11)}`;\n default:\n return digits;\n }\n}\n\nfunction formatSwedishLocal(number: string): string {\n const digits = number.replace(/^0+/, \"\");\n if (digits.length === 9) {\n return `0${digits.slice(0, 3)}-${digits.slice(3, 5)} ${digits.slice(5, 7)} ${digits.slice(7, 9)}`;\n }\n if (digits.length === 7) {\n const area = digits.slice(0, 1);\n const rest = digits.slice(1);\n return `0${area}-${rest.slice(0, 2)} ${rest.slice(2, 4)} ${rest.slice(4, 6)}`;\n }\n if (digits.length === 8) {\n const area = digits.slice(0, 1);\n const rest = digits.slice(1);\n return `0${area}-${rest.slice(0, 2)} ${rest.slice(2, 4)} ${rest.slice(4, 7)}`;\n }\n return number;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { PrimitiveTypeInfo } from \"../primitive-type-info.js\";\nimport { PrimitivesDefaults } from \"../primitives-defaults.js\";\nimport { sanitizeInput } from \"../internal/input-sanitization.js\";\nimport { TextCandidateCategory } from \"../text-scanning/text-candidate-category.js\";\nimport { TextCandidate } from \"../text-scanning/text-candidate.js\";\nimport { TextMatchConfidence } from \"../text-scanning/text-match-confidence.js\";\nimport { Country } from \"../geography/index.js\";\nimport { PhoneCallingCode } from \"./phone-calling-code.js\";\n\nconst MAX_INPUT_LENGTH = 50;\nconst URI_PREFIXES = [\"callto:\", \"tel:\", \"sms:\", \"call:\"];\n\nconst TWO_DIGIT_CODES = new Set([\n \"20\",\n \"27\",\n \"30\",\n \"31\",\n \"32\",\n \"33\",\n \"34\",\n \"36\",\n \"39\",\n \"40\",\n \"41\",\n \"43\",\n \"44\",\n \"45\",\n \"46\",\n \"47\",\n \"48\",\n \"49\",\n \"51\",\n \"52\",\n \"53\",\n \"54\",\n \"55\",\n \"56\",\n \"57\",\n \"58\",\n \"60\",\n \"61\",\n \"62\",\n \"63\",\n \"64\",\n \"65\",\n \"66\",\n \"81\",\n \"82\",\n \"84\",\n \"86\",\n \"90\",\n \"91\",\n \"92\",\n \"93\",\n \"94\",\n \"95\",\n \"98\",\n]);\n\nconst LEADING_ZERO_SIGNIFICANT = new Set([\"39\"]);\n\nconst SCAN =\n /(?:(?:\\+|00)\\d{1,3}[\\s-]\\(?\\d{1,4}\\)?[\\s-]?\\d[\\d\\s-]{5,12}\\d)|(?:(?:\\+|00)\\d{7,15})|(?:0\\d{1,3}[\\s-]?\\d[\\d\\s-]{5,10}\\d)/g;\n\n/**\n * A phone number (`telefonnummer`). Stored normalized as `00` + country code +\n * subscriber digits (e.g. `0046701740633`). Use {@link toE164String} for the\n * `+`-prefixed E.164 form.\n */\nexport class PhoneNumber {\n static readonly typeInfo: PrimitiveTypeInfo = Object.freeze({\n englishName: \"Phone Number\",\n localizedName: \"Telefonnummer\",\n emoji: \"\\u{1F4DE}\",\n sources: Object.freeze([\n \"https://pts.se/\",\n \"https://www.itu.int/rec/T-REC-E.164/\",\n \"https://en.wikipedia.org/wiki/E.164\",\n ]),\n });\n\n readonly digits: string;\n readonly countryCallingCode: PhoneCallingCode;\n readonly country: Country | null;\n readonly isSwedish: boolean;\n readonly isMobile: boolean;\n\n private constructor(digits: string, isSwedish: boolean, isMobile: boolean) {\n this.digits = digits;\n this.isSwedish = isSwedish;\n this.isMobile = isMobile;\n this.countryCallingCode = PhoneCallingCode.fromResolvedDigits(resolveCallingCode(digits));\n this.country = Country.tryFindByCallingCode(this.countryCallingCode.value);\n }\n\n get isSwedishTestPhoneNumber(): boolean {\n if (!this.isSwedish) return false;\n const local = this.digits.slice(4);\n return (\n isInPtsRange(local, \"7017406\", 5, 99) ||\n isInPtsRange(local, \"3139006\", 0, 99) ||\n isInPtsRange(local, \"4062804\", 0, 99) ||\n isInPtsRange(local, \"8465004\", 0, 99) ||\n isInPtsRange(local, \"9803192\", 0, 99)\n );\n }\n\n get formatted(): string {\n return this.isSwedish ? this.toLocalString() : this.toDisplayInternationalString();\n }\n\n static tryParse(\n input: string | null | undefined,\n defaultCallingCode?: string | PhoneCallingCode | Country | null,\n ): PhoneNumber | null {\n if (input == null || input.trim() === \"\") return null;\n const dcc = resolveDefaultCallingCode(defaultCallingCode);\n if (!dcc) return null;\n\n let cleaned = sanitizeInput(input).trim();\n if (cleaned.length > MAX_INPUT_LENGTH) return null;\n\n for (const prefix of URI_PREFIXES) {\n if (cleaned.toLowerCase().startsWith(prefix)) {\n cleaned = cleaned.slice(prefix.length).trimStart();\n break;\n }\n }\n\n const hasPlus = cleaned.startsWith(\"+\");\n const withOAs0 = cleaned.replace(/O/g, \"0\");\n const digitsOnly = withOAs0.replace(/[^\\d]/g, \"\");\n if (digitsOnly === \"\") return null;\n\n let e164: string;\n if (hasPlus) {\n if (digitsOnly.length < 7 || digitsOnly.length > 15) return null;\n e164 = stripTrunkZeroAfterCallingCode(digitsOnly);\n } else if (digitsOnly.startsWith(\"00\")) {\n const cn = digitsOnly.slice(2);\n if (cn.length < 7 || cn.length > 15) return null;\n e164 = stripTrunkZeroAfterCallingCode(cn);\n } else if (digitsOnly.startsWith(dcc) && digitsOnly.length >= dcc.length + 7) {\n const subscriber = digitsOnly.slice(dcc.length);\n e164 = dcc + stripSingleTrunkZero(dcc, subscriber);\n } else if (digitsOnly.startsWith(\"0\")) {\n const subscriber = stripSingleTrunkZero(dcc, digitsOnly);\n const total = dcc.length + subscriber.length;\n if (total < 7 || total > 15) return null;\n e164 = dcc + subscriber;\n } else if (dcc === \"46\" && digitsOnly.length === 9 && digitsOnly.startsWith(\"7\")) {\n e164 = \"46\" + digitsOnly;\n } else {\n return null;\n }\n\n if (e164.length < 7 || e164.length > 15) return null;\n const isSwedish = e164.startsWith(\"46\");\n if (isSwedish) {\n const local = e164.slice(2);\n if (local.length < 7 || local.length > 9) return null;\n }\n const isMobile = isSwedish && e164.slice(2).startsWith(\"7\");\n return new PhoneNumber(\"00\" + e164, isSwedish, isMobile);\n }\n\n static parse(\n input: string,\n defaultCallingCode?: string | PhoneCallingCode | Country | null,\n ): PhoneNumber {\n const r = PhoneNumber.tryParse(input, defaultCallingCode);\n if (r === null) throw new Error(\"Invalid phone number.\");\n return r;\n }\n\n static isValid(\n input: string | null | undefined,\n defaultCallingCode?: string | PhoneCallingCode | Country | null,\n ): boolean {\n return PhoneNumber.tryParse(input, defaultCallingCode) !== null;\n }\n\n static format(\n input: string | null | undefined,\n options?: {\n defaultCallingCode?: string | PhoneCallingCode | Country | null;\n fallbackToTrimmedInputWhenInvalid?: boolean;\n },\n ): string | null {\n const dcc =\n resolveDefaultCallingCode(options?.defaultCallingCode) ??\n PrimitivesDefaults.defaultCallingCode;\n const r = PhoneNumber.tryParse(input, dcc);\n if (r) {\n return r.countryCallingCode.value === dcc\n ? r.toLocalString()\n : r.toDisplayInternationalString();\n }\n if (options?.fallbackToTrimmedInputWhenInvalid && input != null && input.trim() !== \"\") {\n return input.trim();\n }\n return null;\n }\n\n static normalize(\n input: string | null | undefined,\n options?: {\n defaultCallingCode?: string | PhoneCallingCode | Country | null;\n fallbackToTrimmedInputWhenInvalid?: boolean;\n },\n ): string | null {\n const r = PhoneNumber.tryParse(input, options?.defaultCallingCode);\n if (r) return r.digits;\n if (options?.fallbackToTrimmedInputWhenInvalid && input != null) {\n const t = input.trim();\n return t.length > 0 ? t : null;\n }\n return null;\n }\n\n static isNormalized(input: string | null | undefined): boolean {\n return input != null && PhoneNumber.normalize(input) === input;\n }\n\n static findCandidatesInText(text: string): readonly TextCandidate<PhoneNumber>[] {\n if (!text) return [];\n const out: TextCandidate<PhoneNumber>[] = [];\n SCAN.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = SCAN.exec(text)) !== null) {\n const phone = PhoneNumber.tryParse(m[0]);\n if (!phone) continue;\n out.push(\n new TextCandidate<PhoneNumber>({\n startIndex: m.index,\n length: m[0].length,\n originalText: m[0],\n typeName: \"PhoneNumber\",\n category: TextCandidateCategory.Contact,\n normalizedForm: phone.toNormalizedString(),\n formattedForm: phone.toString(),\n maskedForm: maskPhoneNumber(phone),\n confidence: TextMatchConfidence.Medium,\n value: phone,\n }),\n );\n }\n return out;\n }\n\n toNormalizedString(): string {\n return this.digits;\n }\n\n toLocalString(defaultCallingCode?: PhoneCallingCode | Country): string {\n if (defaultCallingCode) {\n const dcc =\n defaultCallingCode instanceof PhoneCallingCode\n ? defaultCallingCode.value\n : defaultCallingCode.callingCode;\n return this.countryCallingCode.value === dcc\n ? this.toLocalString()\n : this.toDisplayInternationalString();\n }\n const subscriber = this.digits.slice(2 + this.countryCallingCode.value.length);\n if (this.isSwedish) return formatSwedishLocal(subscriber);\n return \"0\" + subscriber;\n }\n\n toE164String(): string {\n return \"+\" + this.digits.slice(2);\n }\n toInternationalString(): string {\n return this.toE164String();\n }\n\n toDisplayInternationalString(): string {\n const subscriber = this.digits.slice(2 + this.countryCallingCode.value.length);\n if (this.isSwedish) return formatSwedishInternational(subscriber);\n return (\n \"+\" +\n this.countryCallingCode.value +\n \" \" +\n formatInternationalSubscriberDigits(this.countryCallingCode.value, subscriber)\n );\n }\n\n toString(): string {\n return this.formatted;\n }\n\n equals(other: PhoneNumber | null | undefined): boolean {\n return other != null && this.digits === other.digits;\n }\n compareTo(other: PhoneNumber | null | undefined): number {\n if (other == null) return 1;\n return this.digits < other.digits ? -1 : this.digits > other.digits ? 1 : 0;\n }\n}\n\n/** Mask a phone number, keeping country code and last 4 digits visible. */\nexport function maskPhoneNumber(p: PhoneNumber): string {\n const f = p.toE164String();\n if (f.length <= 5) return f.replace(/\\d/g, \"*\");\n const cc = \"+\" + p.countryCallingCode.value;\n const subscriber = f.slice(cc.length);\n if (subscriber.length <= 4) return cc + \"*\".repeat(subscriber.length);\n return cc + \"*\".repeat(subscriber.length - 4) + subscriber.slice(-4);\n}\n\nfunction resolveDefaultCallingCode(\n d: string | PhoneCallingCode | Country | null | undefined,\n): string | null {\n if (d == null) return PrimitivesDefaults.defaultCallingCode;\n if (typeof d === \"string\") return d;\n if (d instanceof PhoneCallingCode) return d.value;\n return d.callingCode;\n}\n\nfunction resolveCallingCode(digits: string): string {\n return resolveCallingCodeFromE164(digits.slice(2));\n}\n\nfunction resolveCallingCodeFromE164(e164: string): string {\n if (e164.length === 0) return \"\";\n if (e164[0] === \"1\" || e164[0] === \"7\") return e164.slice(0, 1);\n if (e164.length >= 2 && TWO_DIGIT_CODES.has(e164.slice(0, 2))) return e164.slice(0, 2);\n return e164.length >= 3 ? e164.slice(0, 3) : e164;\n}\n\nfunction stripTrunkZeroAfterCallingCode(e164: string): string {\n const cc = resolveCallingCodeFromE164(e164);\n if (cc.length === 0 || cc.length >= e164.length) return e164;\n const subscriber = e164.slice(cc.length);\n return cc + stripSingleTrunkZero(cc, subscriber);\n}\n\nfunction stripSingleTrunkZero(callingCode: string, subscriber: string): string {\n if (subscriber.length === 0 || subscriber[0] !== \"0\") return subscriber;\n if (LEADING_ZERO_SIGNIFICANT.has(callingCode)) return subscriber;\n return subscriber.slice(1);\n}\n\nfunction isInPtsRange(local: string, prefix: string, from: number, to: number): boolean {\n if (!local.startsWith(prefix)) return false;\n const suffix = local.slice(prefix.length);\n if (suffix.length !== 2) return false;\n const n = parseInt(suffix, 10);\n return Number.isFinite(n) && n >= from && n <= to;\n}\n\nfunction formatInternationalSubscriberDigits(callingCode: string, digits: string): string {\n if (callingCode === \"1\" && digits.length === 10) {\n return `${digits.slice(0, 3)} ${digits.slice(3, 6)} ${digits.slice(6, 10)}`;\n }\n switch (digits.length) {\n case 7:\n return `${digits.slice(0, 3)} ${digits.slice(3, 5)} ${digits.slice(5, 7)}`;\n case 8:\n return `${digits.slice(0, 2)} ${digits.slice(2, 4)} ${digits.slice(4, 6)} ${digits.slice(6, 8)}`;\n case 9:\n return `${digits.slice(0, 2)} ${digits.slice(2, 5)} ${digits.slice(5, 7)} ${digits.slice(7, 9)}`;\n case 10:\n return `${digits.slice(0, 2)} ${digits.slice(2, 6)} ${digits.slice(6, 10)}`;\n case 11:\n return `${digits.slice(0, 3)} ${digits.slice(3, 7)} ${digits.slice(7, 11)}`;\n default:\n return digits;\n }\n}\n\n// Two-digit national destination codes (NDCs) from PTS's numbering plan. 8 (Stockholm) is the\n// only one-digit NDC; every NDC not listed here is three digits.\nconst SWEDISH_TWO_DIGIT_DESTINATION_CODES = new Set([\n ...\"11 13 16 18 19 21 23 26 31 33 35 36 40 42 44 46 54 60 63 90\".split(\" \"),\n ...\"10 20 70 71 72 73 74 75 76 77 79 99\".split(\" \"),\n]);\n\n// 900 (premium rate) is the only three-digit NDC that starts with a two-digit NDC (90, Ume\u00E5).\nconst SWEDISH_THREE_DIGIT_DESTINATION_CODES_OVERRIDING_TWO_DIGIT = new Set([\"900\"]);\n\nfunction swedishDestinationCodeLength(nationalSignificantNumber: string): number {\n if (nationalSignificantNumber.startsWith(\"8\")) return 1;\n if (\n SWEDISH_THREE_DIGIT_DESTINATION_CODES_OVERRIDING_TWO_DIGIT.has(\n nationalSignificantNumber.slice(0, 3),\n )\n ) {\n return 3;\n }\n if (SWEDISH_TWO_DIGIT_DESTINATION_CODES.has(nationalSignificantNumber.slice(0, 2))) return 2;\n return 3;\n}\n\n/**\n * Groups a Swedish subscriber number as recommended by Svenska skrivregler:\n * `NN NN`, `NNN NN`, `NN NN NN`, `NNN NN NN` and `NNN NNN NN`.\n */\nfunction groupSwedishSubscriberNumber(subscriber: string): string {\n if (subscriber.length === 8) {\n return `${subscriber.slice(0, 3)} ${subscriber.slice(3, 6)} ${subscriber.slice(6)}`;\n }\n const firstGroupLength = subscriber.length % 2 === 1 ? 3 : 2;\n const groups = [subscriber.slice(0, firstGroupLength)];\n for (let i = firstGroupLength; i < subscriber.length; i += 2) {\n groups.push(subscriber.slice(i, i + 2));\n }\n return groups.join(\" \");\n}\n\nfunction splitSwedishNationalNumber(nationalSignificantNumber: string): [string, string] {\n const length = swedishDestinationCodeLength(nationalSignificantNumber);\n return [nationalSignificantNumber.slice(0, length), nationalSignificantNumber.slice(length)];\n}\n\nfunction formatSwedishLocal(nationalSignificantNumber: string): string {\n const [destinationCode, subscriber] = splitSwedishNationalNumber(nationalSignificantNumber);\n return `0${destinationCode}-${groupSwedishSubscriberNumber(subscriber)}`;\n}\n\nfunction formatSwedishInternational(nationalSignificantNumber: string): string {\n const [destinationCode, subscriber] = splitSwedishNationalNumber(nationalSignificantNumber);\n return `+46 ${destinationCode} ${groupSwedishSubscriberNumber(subscriber)}`;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/organization/swedish-organization-number.ts"],
4
- "sourcesContent": ["import { PrimitiveTypeInfo } from \"../primitive-type-info.js\";\nimport { keepDigits, sanitizeInput } from \"../internal/input-sanitization.js\";\nimport { luhnIsValid } from \"../internal/luhn.js\";\nimport { TextCandidateCategory } from \"../text-scanning/text-candidate-category.js\";\nimport { TextCandidate } from \"../text-scanning/text-candidate.js\";\nimport { TextMatchConfidence } from \"../text-scanning/text-match-confidence.js\";\nimport { ValidationErrorReason, ValidationResult } from \"../validation/index.js\";\nimport { invalidResult, validResult } from \"../validation/validation-result.js\";\nimport { SwedishPersonalIdentityNumber } from \"../person/swedish-personal-identity-number.js\";\nimport { SwedishCoordinationNumber } from \"../person/swedish-coordination-number.js\";\nimport { SwedishOrganizationName } from \"./swedish-organization-name.js\";\nimport { SwedishOrganizationType } from \"./swedish-organization-type.js\";\n\nconst MAX_INPUT_LENGTH = 30;\nconst LEGAL_ENTITY_PREFIX = \"16\";\n\nexport interface SwedishOrganizationTypeHintResult {\n readonly certain: SwedishOrganizationType;\n readonly bestGuess: SwedishOrganizationType;\n}\n\n/** A Swedish organization number (`organisationsnummer`). */\nexport class SwedishOrganizationNumber {\n static readonly typeInfo: PrimitiveTypeInfo = Object.freeze({\n englishName: \"Organization Number\",\n localizedName: \"Organisationsnummer\",\n emoji: \"\\u{1F3E2}\",\n sources: Object.freeze([\n \"https://bolagsverket.se\",\n \"https://skatteverket.se/foretag/drivaforetag/startaforetag/organisationsnummer.html\",\n \"https://sv.wikipedia.org/wiki/Organisationsnummer\",\n ]),\n });\n\n readonly _tenWithDash: string;\n readonly _twelveDigits: string;\n readonly _isPerson: boolean;\n\n get isPerson(): boolean {\n return this._isPerson;\n }\n\n private constructor(tenWithDash: string, twelveDigits: string, isPerson: boolean) {\n this._tenWithDash = tenWithDash;\n this._twelveDigits = twelveDigits;\n this._isPerson = isPerson;\n }\n\n static tryParse(input: string | null | undefined): SwedishOrganizationNumber | null {\n if (input == null || input.trim() === \"\") return null;\n const sanitized = sanitizeInput(input).trim();\n if (sanitized.length > MAX_INPUT_LENGTH) return null;\n\n const pin = SwedishPersonalIdentityNumber.tryParse(sanitized);\n if (pin) {\n return new SwedishOrganizationNumber(pin.formatted, pin.value, true);\n }\n const cn = SwedishCoordinationNumber.tryParse(sanitized);\n if (cn) {\n return new SwedishOrganizationNumber(cn.formatted, cn.value, true);\n }\n\n const digits = keepDigits(sanitized);\n if (digits.length === 0) return null;\n\n let tenDigits: string;\n if (digits.length === 10) tenDigits = digits;\n else if (digits.length === 12 && digits.startsWith(LEGAL_ENTITY_PREFIX))\n tenDigits = digits.slice(2);\n else return null;\n\n if (!isLegalEntityPattern(tenDigits)) return null;\n if (!luhnIsValid(tenDigits)) return null;\n\n const tenWithDash = `${tenDigits.slice(0, 6)}-${tenDigits.slice(6)}`;\n const twelve = LEGAL_ENTITY_PREFIX + tenDigits;\n return new SwedishOrganizationNumber(tenWithDash, twelve, false);\n }\n\n static parse(input: string): SwedishOrganizationNumber {\n const r = SwedishOrganizationNumber.tryParse(input);\n if (r === null) throw new Error(\"Invalid Swedish organization number.\");\n return r;\n }\n\n static isValid(input: string | null | undefined): boolean {\n return SwedishOrganizationNumber.tryParse(input) !== null;\n }\n\n static format(\n input: string | null | undefined,\n options?: { fallbackToTrimmedInputWhenInvalid?: boolean },\n ): string | null {\n const r = SwedishOrganizationNumber.tryParse(input);\n if (r) return r.to10DigitString();\n if (options?.fallbackToTrimmedInputWhenInvalid && input != null && input.trim() !== \"\") {\n return input.trim();\n }\n return null;\n }\n\n static normalize(\n input: string | null | undefined,\n options?: { fallbackToTrimmedInputWhenInvalid?: boolean },\n ): string | null {\n const r = SwedishOrganizationNumber.tryParse(input);\n if (r) return r.to12DigitString();\n if (options?.fallbackToTrimmedInputWhenInvalid && input != null) {\n const t = input.trim();\n return t.length > 0 ? t : null;\n }\n return null;\n }\n\n static isNormalized(input: string | null | undefined): boolean {\n return input != null && SwedishOrganizationNumber.normalize(input) === input;\n }\n\n to10DigitsOnly(): string {\n return this._tenWithDash.replace(/[-+]/g, \"\");\n }\n to10DigitString(): string {\n return this._tenWithDash;\n }\n to12DigitString(): string {\n return this._twelveDigits;\n }\n toNormalizedString(): string {\n return this.to12DigitString();\n }\n toString(): string {\n return this.to10DigitString();\n }\n\n getSwedishOrganizationTypeHint(\n name?: string | null,\n isPrivatePerson?: boolean | null,\n ): SwedishOrganizationTypeHintResult {\n let certain: SwedishOrganizationType;\n let bestGuess: SwedishOrganizationType;\n\n if (this._isPerson) {\n certain = SwedishOrganizationType.EnskildFirmaEllerPrivatperson;\n if (isPrivatePerson === true) bestGuess = SwedishOrganizationType.Privatperson;\n else if (isPrivatePerson === false) bestGuess = SwedishOrganizationType.EnskildFirma;\n else {\n const nameType = SwedishOrganizationName.inferSwedishOrganizationType(name ?? null);\n bestGuess =\n nameType === SwedishOrganizationType.EnskildFirma ||\n nameType === SwedishOrganizationType.Privatperson\n ? nameType\n : certain;\n }\n return { certain, bestGuess };\n }\n\n const first = this.to10DigitsOnly()[0]!;\n const nameType = SwedishOrganizationName.inferSwedishOrganizationType(name ?? null);\n\n switch (first) {\n case \"1\":\n certain = SwedishOrganizationType.Dodsbo;\n bestGuess = certain;\n break;\n case \"2\":\n certain = SwedishOrganizationType.OffentligSektor;\n bestGuess =\n nameType === SwedishOrganizationType.Kommun ||\n nameType === SwedishOrganizationType.Region ||\n nameType === SwedishOrganizationType.Forsamling\n ? nameType\n : certain;\n break;\n case \"5\":\n certain = SwedishOrganizationType.Aktiebolag;\n bestGuess = nameType === SwedishOrganizationType.Kommanditbolag ? nameType : certain;\n break;\n case \"6\":\n certain = SwedishOrganizationType.HandelsbolagEllerKommanditbolag;\n bestGuess =\n nameType === SwedishOrganizationType.Kommanditbolag ||\n nameType === SwedishOrganizationType.Handelsbolag\n ? nameType\n : certain;\n break;\n case \"7\":\n certain = SwedishOrganizationType.EkonomiskForening;\n bestGuess =\n nameType === SwedishOrganizationType.Bostadsrattsforening ||\n nameType === SwedishOrganizationType.Samfallighetsforening\n ? nameType\n : certain;\n break;\n case \"8\":\n certain = SwedishOrganizationType.IdeellForening;\n bestGuess = nameType === SwedishOrganizationType.Stiftelse ? nameType : certain;\n break;\n case \"9\":\n certain = SwedishOrganizationType.HandelsbolagEllerKommanditbolag;\n bestGuess =\n nameType === SwedishOrganizationType.Kommanditbolag ||\n nameType === SwedishOrganizationType.Handelsbolag\n ? nameType\n : certain;\n break;\n default:\n certain = SwedishOrganizationType.Other;\n bestGuess =\n nameType === SwedishOrganizationType.EuropeiskEkonomiskIntressegruppering ||\n nameType === SwedishOrganizationType.Europabolag ||\n nameType === SwedishOrganizationType.SCEForening ||\n nameType === SwedishOrganizationType.Filial\n ? nameType\n : certain;\n break;\n }\n return { certain, bestGuess };\n }\n\n static validate(input: string | null | undefined): ValidationResult {\n if (input == null || input.trim() === \"\") {\n return invalidResult(\n input,\n ValidationErrorReason.InputIsEmpty,\n \"Input is empty or whitespace.\",\n \"V\u00E4rdet \u00E4r tomt.\",\n );\n }\n const sanitized = sanitizeInput(input).trim();\n if (sanitized.length > MAX_INPUT_LENGTH) {\n return invalidResult(\n input,\n ValidationErrorReason.InputTooLong,\n \"Input contains too many characters.\",\n \"V\u00E4rdet inneh\u00E5ller f\u00F6r m\u00E5nga tecken.\",\n );\n }\n if (SwedishPersonalIdentityNumber.tryParse(sanitized)) return validResult(input);\n if (SwedishCoordinationNumber.tryParse(sanitized)) return validResult(input);\n\n const digits = keepDigits(sanitized);\n if (digits.length === 0) {\n return invalidResult(\n input,\n ValidationErrorReason.InvalidFormat,\n \"Input contains no digits.\",\n \"V\u00E4rdet inneh\u00E5ller inga siffror.\",\n );\n }\n if (\n !(digits.length === 10 || (digits.length === 12 && digits.startsWith(LEGAL_ENTITY_PREFIX)))\n ) {\n return invalidResult(\n input,\n ValidationErrorReason.InvalidLength,\n \"Organization number must be 10 or 12 digits (12-digit form must start with 16).\",\n \"Organisationsnummer m\u00E5ste vara 10 eller 12 siffror (12-siffrig form m\u00E5ste b\u00F6rja med 16).\",\n );\n }\n const tenDigits = digits.length === 12 ? digits.slice(2) : digits;\n if (!isLegalEntityPattern(tenDigits)) {\n return invalidResult(\n input,\n ValidationErrorReason.InvalidEntityPattern,\n \"Number does not match a valid organization type pattern.\",\n \"Numret matchar inte ett giltigt organisationstypsm\u00F6nster.\",\n );\n }\n if (!luhnIsValid(tenDigits)) {\n return invalidResult(\n input,\n ValidationErrorReason.InvalidCheckDigit,\n \"Invalid check digit.\",\n \"Ogiltig kontrollsiffra.\",\n );\n }\n return validResult(input);\n }\n\n static findCandidatesInText(text: string): readonly TextCandidate<SwedishOrganizationNumber>[] {\n if (!text) return [];\n const out: TextCandidate<SwedishOrganizationNumber>[] = [];\n const re = /(?<!\\d)(\\d{6})-?(\\d{4})(?!\\d)/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text)) !== null) {\n const r = SwedishOrganizationNumber.tryParse(m[0]);\n if (!r || r.isPerson) continue;\n out.push(\n new TextCandidate<SwedishOrganizationNumber>({\n startIndex: m.index,\n length: m[0].length,\n originalText: m[0],\n typeName: \"SwedishOrganizationNumber\",\n category: TextCandidateCategory.OrganizationIdentifier,\n normalizedForm: r.toNormalizedString(),\n formattedForm: r.toString(),\n maskedForm: maskSwedishOrganizationNumber(r),\n confidence: TextMatchConfidence.High,\n value: r,\n }),\n );\n }\n return out;\n }\n\n equals(other: SwedishOrganizationNumber | null | undefined): boolean {\n return other != null && this._twelveDigits === other._twelveDigits;\n }\n compareTo(other: SwedishOrganizationNumber | null | undefined): number {\n if (other == null) return 1;\n return this._twelveDigits < other._twelveDigits\n ? -1\n : this._twelveDigits > other._twelveDigits\n ? 1\n : 0;\n }\n}\n\nfunction isLegalEntityPattern(tenDigits: string): boolean {\n if (tenDigits.length !== 10) return false;\n if (tenDigits[0] === \"1\") return true;\n const first = tenDigits[0]!;\n if (\n first !== \"2\" &&\n first !== \"3\" &&\n first !== \"5\" &&\n first !== \"6\" &&\n first !== \"7\" &&\n first !== \"8\" &&\n first !== \"9\"\n )\n return false;\n const m1 = tenDigits.charCodeAt(2) - 0x30;\n const m2 = tenDigits.charCodeAt(3) - 0x30;\n const mm = m1 * 10 + m2;\n return mm >= 20;\n}\n\n/**\n * Masks person-based Swedish organization identifiers by default.\n * Public legal-entity organization numbers are returned unmasked unless\n * `maskOrganizationNumbers` is set.\n */\nexport function maskSwedishOrganizationNumber(\n o: SwedishOrganizationNumber,\n options?: { maskOrganizationNumbers?: boolean; maskBirthDate?: boolean },\n): string {\n const s = o.to10DigitString();\n if (o.isPerson) {\n const sep = s[6]!;\n if (options?.maskBirthDate) return \"******\" + sep + \"****\";\n return s.slice(0, 6) + sep + \"****\";\n }\n if (options?.maskOrganizationNumbers) return s.slice(0, 7) + \"****\";\n return s;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { PrimitiveTypeInfo } from \"../primitive-type-info.js\";\nimport { keepDigits, sanitizeInput } from \"../internal/input-sanitization.js\";\nimport { luhnIsValid } from \"../internal/luhn.js\";\nimport { TextCandidateCategory } from \"../text-scanning/text-candidate-category.js\";\nimport { TextCandidate } from \"../text-scanning/text-candidate.js\";\nimport { TextMatchConfidence } from \"../text-scanning/text-match-confidence.js\";\nimport { ValidationErrorReason, ValidationResult } from \"../validation/index.js\";\nimport { invalidResult, validResult } from \"../validation/validation-result.js\";\nimport { SwedishPersonalIdentityNumber } from \"../person/swedish-personal-identity-number.js\";\nimport { SwedishCoordinationNumber } from \"../person/swedish-coordination-number.js\";\nimport { SwedishOrganizationName } from \"./swedish-organization-name.js\";\nimport { SwedishOrganizationType } from \"./swedish-organization-type.js\";\n\nconst MAX_INPUT_LENGTH = 30;\nconst LEGAL_ENTITY_PREFIX = \"16\";\n\nexport interface SwedishOrganizationTypeHintResult {\n readonly certain: SwedishOrganizationType;\n readonly bestGuess: SwedishOrganizationType;\n}\n\n/** A Swedish organization number (`organisationsnummer`). */\nexport class SwedishOrganizationNumber {\n static readonly typeInfo: PrimitiveTypeInfo = Object.freeze({\n englishName: \"Organization Number\",\n localizedName: \"Organisationsnummer\",\n emoji: \"\\u{1F3E2}\",\n sources: Object.freeze([\n \"https://bolagsverket.se\",\n \"https://skatteverket.se/foretag/drivaforetag/startaforetag/organisationsnummer.html\",\n \"https://sv.wikipedia.org/wiki/Organisationsnummer\",\n ]),\n });\n\n readonly _tenWithDash: string;\n readonly _twelveDigits: string;\n readonly _isPerson: boolean;\n\n get isPerson(): boolean {\n return this._isPerson;\n }\n\n private constructor(tenWithDash: string, twelveDigits: string, isPerson: boolean) {\n this._tenWithDash = tenWithDash;\n this._twelveDigits = twelveDigits;\n this._isPerson = isPerson;\n }\n\n static tryParse(input: string | null | undefined): SwedishOrganizationNumber | null {\n if (input == null || input.trim() === \"\") return null;\n const sanitized = sanitizeInput(input).trim();\n if (sanitized.length > MAX_INPUT_LENGTH) return null;\n\n const pin = SwedishPersonalIdentityNumber.tryParse(sanitized);\n if (pin) {\n return new SwedishOrganizationNumber(pin.formatted, pin.value, true);\n }\n const cn = SwedishCoordinationNumber.tryParse(sanitized);\n if (cn) {\n return new SwedishOrganizationNumber(cn.formatted, cn.value, true);\n }\n\n const digits = keepDigits(sanitized);\n if (digits.length === 0) return null;\n\n let tenDigits: string;\n if (digits.length === 10) tenDigits = digits;\n else if (digits.length === 12 && digits.startsWith(LEGAL_ENTITY_PREFIX))\n tenDigits = digits.slice(2);\n else return null;\n\n if (!isLegalEntityPattern(tenDigits)) return null;\n if (!luhnIsValid(tenDigits)) return null;\n\n const tenWithDash = `${tenDigits.slice(0, 6)}-${tenDigits.slice(6)}`;\n const twelve = LEGAL_ENTITY_PREFIX + tenDigits;\n return new SwedishOrganizationNumber(tenWithDash, twelve, false);\n }\n\n static parse(input: string): SwedishOrganizationNumber {\n const r = SwedishOrganizationNumber.tryParse(input);\n if (r === null) throw new Error(\"Invalid Swedish organization number.\");\n return r;\n }\n\n static isValid(input: string | null | undefined): boolean {\n return SwedishOrganizationNumber.tryParse(input) !== null;\n }\n\n static format(\n input: string | null | undefined,\n options?: { fallbackToTrimmedInputWhenInvalid?: boolean },\n ): string | null {\n const r = SwedishOrganizationNumber.tryParse(input);\n if (r) return r.to10DigitString();\n if (options?.fallbackToTrimmedInputWhenInvalid && input != null && input.trim() !== \"\") {\n return input.trim();\n }\n return null;\n }\n\n static normalize(\n input: string | null | undefined,\n options?: { fallbackToTrimmedInputWhenInvalid?: boolean },\n ): string | null {\n const r = SwedishOrganizationNumber.tryParse(input);\n if (r) return r.to12DigitString();\n if (options?.fallbackToTrimmedInputWhenInvalid && input != null) {\n const t = input.trim();\n return t.length > 0 ? t : null;\n }\n return null;\n }\n\n static isNormalized(input: string | null | undefined): boolean {\n return input != null && SwedishOrganizationNumber.normalize(input) === input;\n }\n\n to10DigitsOnly(): string {\n return this._tenWithDash.replace(/[-+]/g, \"\");\n }\n to10DigitString(): string {\n return this._tenWithDash;\n }\n to12DigitString(): string {\n return this._twelveDigits;\n }\n toNormalizedString(): string {\n return this.to12DigitString();\n }\n toString(): string {\n return this.to10DigitString();\n }\n\n getSwedishOrganizationTypeHint(\n name?: string | null,\n isPrivatePerson?: boolean | null,\n ): SwedishOrganizationTypeHintResult {\n let certain: SwedishOrganizationType;\n let bestGuess: SwedishOrganizationType;\n\n if (this._isPerson) {\n certain = SwedishOrganizationType.EnskildFirmaEllerPrivatperson;\n if (isPrivatePerson === true) bestGuess = SwedishOrganizationType.Privatperson;\n else if (isPrivatePerson === false) bestGuess = SwedishOrganizationType.EnskildFirma;\n else {\n const nameType = SwedishOrganizationName.inferSwedishOrganizationType(name ?? null);\n bestGuess =\n nameType === SwedishOrganizationType.EnskildFirma ||\n nameType === SwedishOrganizationType.Privatperson\n ? nameType\n : certain;\n }\n return { certain, bestGuess };\n }\n\n const first = this.to10DigitsOnly()[0]!;\n const nameType = SwedishOrganizationName.inferSwedishOrganizationType(name ?? null);\n\n switch (first) {\n case \"1\":\n certain = SwedishOrganizationType.Dodsbo;\n bestGuess = certain;\n break;\n case \"2\":\n certain = SwedishOrganizationType.OffentligSektor;\n bestGuess =\n nameType === SwedishOrganizationType.Kommun ||\n nameType === SwedishOrganizationType.Region ||\n nameType === SwedishOrganizationType.Forsamling\n ? nameType\n : certain;\n break;\n case \"5\":\n certain = SwedishOrganizationType.Aktiebolag;\n bestGuess = nameType === SwedishOrganizationType.Kommanditbolag ? nameType : certain;\n break;\n case \"6\":\n certain = SwedishOrganizationType.HandelsbolagEllerKommanditbolag;\n bestGuess =\n nameType === SwedishOrganizationType.Kommanditbolag ||\n nameType === SwedishOrganizationType.Handelsbolag\n ? nameType\n : certain;\n break;\n case \"7\":\n certain = SwedishOrganizationType.EkonomiskForening;\n bestGuess =\n nameType === SwedishOrganizationType.Bostadsrattsforening ||\n nameType === SwedishOrganizationType.Samfallighetsforening\n ? nameType\n : certain;\n break;\n case \"8\":\n certain = SwedishOrganizationType.IdeellForening;\n bestGuess = nameType === SwedishOrganizationType.Stiftelse ? nameType : certain;\n break;\n case \"9\":\n certain = SwedishOrganizationType.HandelsbolagEllerKommanditbolag;\n bestGuess =\n nameType === SwedishOrganizationType.Kommanditbolag ||\n nameType === SwedishOrganizationType.Handelsbolag\n ? nameType\n : certain;\n break;\n default:\n certain = SwedishOrganizationType.Other;\n bestGuess =\n nameType === SwedishOrganizationType.EuropeiskEkonomiskIntressegruppering ||\n nameType === SwedishOrganizationType.Europabolag ||\n nameType === SwedishOrganizationType.SCEForening ||\n nameType === SwedishOrganizationType.Filial\n ? nameType\n : certain;\n break;\n }\n return { certain, bestGuess };\n }\n\n static validate(input: string | null | undefined): ValidationResult {\n if (input == null || input.trim() === \"\") {\n return invalidResult(\n input,\n ValidationErrorReason.InputIsEmpty,\n \"Input is empty or whitespace.\",\n \"V\u00E4rdet \u00E4r tomt.\",\n );\n }\n const sanitized = sanitizeInput(input).trim();\n if (sanitized.length > MAX_INPUT_LENGTH) {\n return invalidResult(\n input,\n ValidationErrorReason.InputTooLong,\n \"Input contains too many characters.\",\n \"V\u00E4rdet inneh\u00E5ller f\u00F6r m\u00E5nga tecken.\",\n );\n }\n if (SwedishPersonalIdentityNumber.tryParse(sanitized)) return validResult(input);\n if (SwedishCoordinationNumber.tryParse(sanitized)) return validResult(input);\n\n const digits = keepDigits(sanitized);\n if (digits.length === 0) {\n return invalidResult(\n input,\n ValidationErrorReason.InvalidFormat,\n \"Input contains no digits.\",\n \"V\u00E4rdet inneh\u00E5ller inga siffror.\",\n );\n }\n if (!(\n digits.length === 10 ||\n (digits.length === 12 && digits.startsWith(LEGAL_ENTITY_PREFIX))\n )) {\n return invalidResult(\n input,\n ValidationErrorReason.InvalidLength,\n \"Organization number must be 10 or 12 digits (12-digit form must start with 16).\",\n \"Organisationsnummer m\u00E5ste vara 10 eller 12 siffror (12-siffrig form m\u00E5ste b\u00F6rja med 16).\",\n );\n }\n const tenDigits = digits.length === 12 ? digits.slice(2) : digits;\n if (!isLegalEntityPattern(tenDigits)) {\n return invalidResult(\n input,\n ValidationErrorReason.InvalidEntityPattern,\n \"Number does not match a valid organization type pattern.\",\n \"Numret matchar inte ett giltigt organisationstypsm\u00F6nster.\",\n );\n }\n if (!luhnIsValid(tenDigits)) {\n return invalidResult(\n input,\n ValidationErrorReason.InvalidCheckDigit,\n \"Invalid check digit.\",\n \"Ogiltig kontrollsiffra.\",\n );\n }\n return validResult(input);\n }\n\n static findCandidatesInText(text: string): readonly TextCandidate<SwedishOrganizationNumber>[] {\n if (!text) return [];\n const out: TextCandidate<SwedishOrganizationNumber>[] = [];\n const re = /(?<!\\d)(\\d{6})-?(\\d{4})(?!\\d)/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text)) !== null) {\n const r = SwedishOrganizationNumber.tryParse(m[0]);\n if (!r || r.isPerson) continue;\n out.push(\n new TextCandidate<SwedishOrganizationNumber>({\n startIndex: m.index,\n length: m[0].length,\n originalText: m[0],\n typeName: \"SwedishOrganizationNumber\",\n category: TextCandidateCategory.OrganizationIdentifier,\n normalizedForm: r.toNormalizedString(),\n formattedForm: r.toString(),\n maskedForm: maskSwedishOrganizationNumber(r),\n confidence: TextMatchConfidence.High,\n value: r,\n }),\n );\n }\n return out;\n }\n\n equals(other: SwedishOrganizationNumber | null | undefined): boolean {\n return other != null && this._twelveDigits === other._twelveDigits;\n }\n compareTo(other: SwedishOrganizationNumber | null | undefined): number {\n if (other == null) return 1;\n return this._twelveDigits < other._twelveDigits\n ? -1\n : this._twelveDigits > other._twelveDigits\n ? 1\n : 0;\n }\n}\n\nfunction isLegalEntityPattern(tenDigits: string): boolean {\n if (tenDigits.length !== 10) return false;\n if (tenDigits[0] === \"1\") return true;\n const first = tenDigits[0]!;\n if (\n first !== \"2\" &&\n first !== \"3\" &&\n first !== \"5\" &&\n first !== \"6\" &&\n first !== \"7\" &&\n first !== \"8\" &&\n first !== \"9\"\n )\n return false;\n const m1 = tenDigits.charCodeAt(2) - 0x30;\n const m2 = tenDigits.charCodeAt(3) - 0x30;\n const mm = m1 * 10 + m2;\n return mm >= 20;\n}\n\n/**\n * Masks person-based Swedish organization identifiers by default.\n * Public legal-entity organization numbers are returned unmasked unless\n * `maskOrganizationNumbers` is set.\n */\nexport function maskSwedishOrganizationNumber(\n o: SwedishOrganizationNumber,\n options?: { maskOrganizationNumbers?: boolean; maskBirthDate?: boolean },\n): string {\n const s = o.to10DigitString();\n if (o.isPerson) {\n const sep = s[6]!;\n if (options?.maskBirthDate) return \"******\" + sep + \"****\";\n return s.slice(0, 6) + sep + \"****\";\n }\n if (options?.maskOrganizationNumbers) return s.slice(0, 7) + \"****\";\n return s;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["nameType"]
7
7
  }
@@ -90,6 +90,7 @@ var import_swedish_eco_vehicle_classification = require("./vehicle/swedish-eco-v
90
90
  var import_swedish_vehicle_registration_number = require("./vehicle/swedish-vehicle-registration-number.js");
91
91
  var import_tire_dimension = require("./vehicle/tire-dimension.js");
92
92
  var import_vehicle_identification_number = require("./vehicle/vehicle-identification-number.js");
93
+ var import_watercraft_identification_number = require("./vehicle/watercraft-identification-number.js");
93
94
  var import_wheel_rim_dimension = require("./vehicle/wheel-rim-dimension.js");
94
95
  let registered = false;
95
96
  function registerDefaultTextScanners() {
@@ -258,6 +259,7 @@ function registerDefaultTextScanners() {
258
259
  ["SwedishVehicleRegistrationNumber", import_swedish_vehicle_registration_number.SwedishVehicleRegistrationNumber],
259
260
  ["TireDimension", import_tire_dimension.TireDimension],
260
261
  ["VehicleIdentificationNumber", import_vehicle_identification_number.VehicleIdentificationNumber],
262
+ ["WatercraftIdentificationNumber", import_watercraft_identification_number.WatercraftIdentificationNumber],
261
263
  ["WheelRimDimension", import_wheel_rim_dimension.WheelRimDimension]
262
264
  ];
263
265
  for (const [typeName, vehicle] of vehicles) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/register-default-text-scanners.ts"],
4
- "sourcesContent": ["import { Address } from \"./contact/address.js\";\nimport { AddressZipCode } from \"./contact/address-zip-code.js\";\nimport { PhoneNumber } from \"./contact/phone-number.js\";\nimport { SwedishAddress } from \"./contact/swedish-address.js\";\nimport { Country } from \"./geography/country.js\";\nimport { SwedishCounty } from \"./geography/swedish-county.js\";\nimport { SwedishMunicipality } from \"./geography/swedish-municipality.js\";\nimport { DunsNumber } from \"./organization/duns-number.js\";\nimport { EuVatNumber } from \"./organization/eu-vat-number.js\";\nimport { LeiCode } from \"./organization/lei-code.js\";\nimport { SwedishOrganizationNumber } from \"./organization/swedish-organization-number.js\";\nimport { SwedishCoordinationNumber } from \"./person/swedish-coordination-number.js\";\nimport { SwedishPersonalIdentityNumber } from \"./person/swedish-personal-identity-number.js\";\nimport { TextCandidateCategory } from \"./text-scanning/text-candidate-category.js\";\nimport type { TextScanFunction } from \"./text-scanning/text-scanner.js\";\nimport { defaultTextScanner } from \"./text-scanning/text-scanner.js\";\nimport { EmailAddress } from \"./web/email-address.js\";\nimport { Url } from \"./web/url.js\";\nimport { Isin } from \"./finance/isin.js\";\nimport { SwedishPropertyDesignation } from \"./property/swedish-property-designation.js\";\nimport { Iban } from \"./banking/iban.js\";\nimport { Bic } from \"./banking/bic.js\";\nimport { SwedishBankgiroNumber } from \"./banking/swedish-bankgiro-number.js\";\nimport { SwedishPostgiroNumber } from \"./banking/swedish-postgiro-number.js\";\nimport { SwedishOcrReferenceNumber } from \"./banking/swedish-ocr-reference-number.js\";\nimport { SwedishBankAccount } from \"./banking/swedish-bank-account.js\";\nimport { SwedishSwishNumber } from \"./banking/swedish-swish-number.js\";\nimport { Area } from \"./measurement/area.js\";\nimport { DataSize } from \"./measurement/data-size.js\";\nimport { ElectricCharge } from \"./measurement/electric-charge.js\";\nimport { ElectricCurrent } from \"./measurement/electric-current.js\";\nimport { Energy } from \"./measurement/energy.js\";\nimport { FlowRate } from \"./measurement/flow-rate.js\";\nimport { Frequency } from \"./measurement/frequency.js\";\nimport { Length } from \"./measurement/length.js\";\nimport { Luminance } from \"./measurement/luminance.js\";\nimport { LuminousFlux } from \"./measurement/luminous-flux.js\";\nimport { Percentage } from \"./measurement/percentage.js\";\nimport { Power } from \"./measurement/power.js\";\nimport { Pressure } from \"./measurement/pressure.js\";\nimport { RotationalSpeed } from \"./measurement/rotational-speed.js\";\nimport { SoundLevel } from \"./measurement/sound-level.js\";\nimport { Speed } from \"./measurement/speed.js\";\nimport { Temperature } from \"./measurement/temperature.js\";\nimport { Torque } from \"./measurement/torque.js\";\nimport { Voltage } from \"./measurement/voltage.js\";\nimport { Volume } from \"./measurement/volume.js\";\nimport { Weight } from \"./measurement/weight.js\";\nimport { Color } from \"./product/color.js\";\nimport { ElectricalPhase } from \"./product/electrical-phase.js\";\nimport { Gtin8 } from \"./product/gtin8.js\";\nimport { Gtin12 } from \"./product/gtin12.js\";\nimport { Gtin13 } from \"./product/gtin13.js\";\nimport { Gtin14 } from \"./product/gtin14.js\";\nimport { IpRating } from \"./product/ip-rating.js\";\nimport { Refrigerant } from \"./product/refrigerant.js\";\nimport { ScreenResolution } from \"./product/screen-resolution.js\";\nimport { ScreenSize } from \"./product/screen-size.js\";\nimport { BoltPattern } from \"./vehicle/bolt-pattern.js\";\nimport { EmissionRate } from \"./vehicle/emission-rate.js\";\nimport { EnginePower } from \"./vehicle/engine-power.js\";\nimport { EuTypeApprovalNumber } from \"./vehicle/eu-type-approval-number.js\";\nimport { EuroEmissionClass } from \"./vehicle/euro-emission-class.js\";\nimport { FuelConsumption } from \"./vehicle/fuel-consumption.js\";\nimport { OperatingHours } from \"./vehicle/operating-hours.js\";\nimport { SwedishDrivingLicenseCategory } from \"./vehicle/swedish-driving-license-category.js\";\nimport { SwedishEcoVehicleClassification } from \"./vehicle/swedish-eco-vehicle-classification.js\";\nimport { SwedishVehicleRegistrationNumber } from \"./vehicle/swedish-vehicle-registration-number.js\";\nimport { TireDimension } from \"./vehicle/tire-dimension.js\";\nimport { VehicleIdentificationNumber } from \"./vehicle/vehicle-identification-number.js\";\nimport { WheelRimDimension } from \"./vehicle/wheel-rim-dimension.js\";\n\nlet registered = false;\n\n/** Registers every built-in `findCandidatesInText` implementation on the shared scanner. */\nexport function registerDefaultTextScanners(): void {\n if (registered) return;\n registered = true;\n\n defaultTextScanner.register({\n typeName: \"Address\",\n category: TextCandidateCategory.Contact,\n scan: Address.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"AddressZipCode\",\n category: TextCandidateCategory.Contact,\n scan: AddressZipCode.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"PhoneNumber\",\n category: TextCandidateCategory.Contact,\n scan: PhoneNumber.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"SwedishAddress\",\n category: TextCandidateCategory.Contact,\n scan: SwedishAddress.findCandidatesInText,\n });\n\n defaultTextScanner.register({\n typeName: \"Country\",\n category: TextCandidateCategory.Geography,\n scan: Country.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"SwedishCounty\",\n category: TextCandidateCategory.Geography,\n scan: SwedishCounty.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"SwedishMunicipality\",\n category: TextCandidateCategory.Geography,\n scan: SwedishMunicipality.findCandidatesInText,\n });\n\n defaultTextScanner.register({\n typeName: \"SwedishPersonalIdentityNumber\",\n category: TextCandidateCategory.PersonalIdentifier,\n scan: SwedishPersonalIdentityNumber.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"SwedishCoordinationNumber\",\n category: TextCandidateCategory.PersonalIdentifier,\n scan: SwedishCoordinationNumber.findCandidatesInText,\n });\n\n defaultTextScanner.register({\n typeName: \"SwedishOrganizationNumber\",\n category: TextCandidateCategory.OrganizationIdentifier,\n scan: SwedishOrganizationNumber.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"EuVatNumber\",\n category: TextCandidateCategory.OrganizationIdentifier,\n scan: EuVatNumber.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"DunsNumber\",\n category: TextCandidateCategory.OrganizationIdentifier,\n scan: DunsNumber.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"LeiCode\",\n category: TextCandidateCategory.OrganizationIdentifier,\n scan: LeiCode.findCandidatesInText,\n });\n\n defaultTextScanner.register({\n typeName: \"EmailAddress\",\n category: TextCandidateCategory.Contact,\n scan: EmailAddress.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"Url\",\n category: TextCandidateCategory.Contact,\n scan: Url.findCandidatesInText,\n });\n\n defaultTextScanner.register({\n typeName: \"Isin\",\n category: TextCandidateCategory.Financial,\n scan: Isin.findCandidatesInText,\n });\n\n defaultTextScanner.register({\n typeName: \"SwedishPropertyDesignation\",\n category: TextCandidateCategory.Property,\n scan: SwedishPropertyDesignation.findCandidatesInText,\n });\n\n defaultTextScanner.register({\n typeName: \"Iban\",\n category: TextCandidateCategory.Financial,\n scan: Iban.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"Bic\",\n category: TextCandidateCategory.Financial,\n scan: Bic.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"SwedishBankgiroNumber\",\n category: TextCandidateCategory.Financial,\n scan: SwedishBankgiroNumber.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"SwedishPostgiroNumber\",\n category: TextCandidateCategory.Financial,\n scan: SwedishPostgiroNumber.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"SwedishOcrReferenceNumber\",\n category: TextCandidateCategory.Financial,\n scan: SwedishOcrReferenceNumber.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"SwedishBankAccount\",\n category: TextCandidateCategory.Financial,\n scan: SwedishBankAccount.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"SwedishSwishNumber\",\n category: TextCandidateCategory.Financial,\n scan: SwedishSwishNumber.findCandidatesInText,\n });\n\n // Names are spelled out rather than read from `Class.name`, which a\n // consumer's minifier is free to mangle.\n const quantities: readonly (readonly [string, { findCandidatesInText: TextScanFunction }])[] = [\n [\"Area\", Area],\n [\"DataSize\", DataSize],\n [\"ElectricCharge\", ElectricCharge],\n [\"ElectricCurrent\", ElectricCurrent],\n [\"Energy\", Energy],\n [\"FlowRate\", FlowRate],\n [\"Frequency\", Frequency],\n [\"Length\", Length],\n [\"Luminance\", Luminance],\n [\"LuminousFlux\", LuminousFlux],\n [\"Percentage\", Percentage],\n [\"Power\", Power],\n [\"Pressure\", Pressure],\n [\"RotationalSpeed\", RotationalSpeed],\n [\"SoundLevel\", SoundLevel],\n [\"Speed\", Speed],\n [\"Temperature\", Temperature],\n [\"Torque\", Torque],\n [\"Voltage\", Voltage],\n [\"Volume\", Volume],\n [\"Weight\", Weight],\n ];\n\n for (const [typeName, quantity] of quantities) {\n defaultTextScanner.register({\n typeName,\n category: TextCandidateCategory.Measurement,\n scan: quantity.findCandidatesInText,\n });\n }\n\n // The same set the .NET `TextScanner` runs. `EnergyConsumption` can scan on its\n // own but is deliberately left out here to match .NET.\n const vehicles: readonly (readonly [string, { findCandidatesInText: TextScanFunction }])[] = [\n [\"BoltPattern\", BoltPattern],\n [\"EmissionRate\", EmissionRate],\n [\"EnginePower\", EnginePower],\n [\"EuTypeApprovalNumber\", EuTypeApprovalNumber],\n [\"EuroEmissionClass\", EuroEmissionClass],\n [\"FuelConsumption\", FuelConsumption],\n [\"OperatingHours\", OperatingHours],\n [\"SwedishDrivingLicenseCategory\", SwedishDrivingLicenseCategory],\n [\"SwedishEcoVehicleClassification\", SwedishEcoVehicleClassification],\n [\"SwedishVehicleRegistrationNumber\", SwedishVehicleRegistrationNumber],\n [\"TireDimension\", TireDimension],\n [\"VehicleIdentificationNumber\", VehicleIdentificationNumber],\n [\"WheelRimDimension\", WheelRimDimension],\n ];\n\n for (const [typeName, vehicle] of vehicles) {\n defaultTextScanner.register({\n typeName,\n category: TextCandidateCategory.Vehicle,\n scan: vehicle.findCandidatesInText,\n });\n }\n\n // The same set the .NET `TextScanner` runs. `CameraResolution` can scan on its own but is\n // deliberately left out here to match .NET.\n const products: readonly (readonly [string, { findCandidatesInText: TextScanFunction }])[] = [\n [\"Gtin13\", Gtin13],\n [\"Gtin8\", Gtin8],\n [\"Gtin12\", Gtin12],\n [\"Gtin14\", Gtin14],\n [\"IpRating\", IpRating],\n [\"ElectricalPhase\", ElectricalPhase],\n [\"Refrigerant\", Refrigerant],\n [\"Color\", Color],\n [\"ScreenResolution\", ScreenResolution],\n [\"ScreenSize\", ScreenSize],\n ];\n\n for (const [typeName, product] of products) {\n defaultTextScanner.register({\n typeName,\n category: TextCandidateCategory.Product,\n scan: product.findCandidatesInText,\n });\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Address } from \"./contact/address.js\";\nimport { AddressZipCode } from \"./contact/address-zip-code.js\";\nimport { PhoneNumber } from \"./contact/phone-number.js\";\nimport { SwedishAddress } from \"./contact/swedish-address.js\";\nimport { Country } from \"./geography/country.js\";\nimport { SwedishCounty } from \"./geography/swedish-county.js\";\nimport { SwedishMunicipality } from \"./geography/swedish-municipality.js\";\nimport { DunsNumber } from \"./organization/duns-number.js\";\nimport { EuVatNumber } from \"./organization/eu-vat-number.js\";\nimport { LeiCode } from \"./organization/lei-code.js\";\nimport { SwedishOrganizationNumber } from \"./organization/swedish-organization-number.js\";\nimport { SwedishCoordinationNumber } from \"./person/swedish-coordination-number.js\";\nimport { SwedishPersonalIdentityNumber } from \"./person/swedish-personal-identity-number.js\";\nimport { TextCandidateCategory } from \"./text-scanning/text-candidate-category.js\";\nimport type { TextScanFunction } from \"./text-scanning/text-scanner.js\";\nimport { defaultTextScanner } from \"./text-scanning/text-scanner.js\";\nimport { EmailAddress } from \"./web/email-address.js\";\nimport { Url } from \"./web/url.js\";\nimport { Isin } from \"./finance/isin.js\";\nimport { SwedishPropertyDesignation } from \"./property/swedish-property-designation.js\";\nimport { Iban } from \"./banking/iban.js\";\nimport { Bic } from \"./banking/bic.js\";\nimport { SwedishBankgiroNumber } from \"./banking/swedish-bankgiro-number.js\";\nimport { SwedishPostgiroNumber } from \"./banking/swedish-postgiro-number.js\";\nimport { SwedishOcrReferenceNumber } from \"./banking/swedish-ocr-reference-number.js\";\nimport { SwedishBankAccount } from \"./banking/swedish-bank-account.js\";\nimport { SwedishSwishNumber } from \"./banking/swedish-swish-number.js\";\nimport { Area } from \"./measurement/area.js\";\nimport { DataSize } from \"./measurement/data-size.js\";\nimport { ElectricCharge } from \"./measurement/electric-charge.js\";\nimport { ElectricCurrent } from \"./measurement/electric-current.js\";\nimport { Energy } from \"./measurement/energy.js\";\nimport { FlowRate } from \"./measurement/flow-rate.js\";\nimport { Frequency } from \"./measurement/frequency.js\";\nimport { Length } from \"./measurement/length.js\";\nimport { Luminance } from \"./measurement/luminance.js\";\nimport { LuminousFlux } from \"./measurement/luminous-flux.js\";\nimport { Percentage } from \"./measurement/percentage.js\";\nimport { Power } from \"./measurement/power.js\";\nimport { Pressure } from \"./measurement/pressure.js\";\nimport { RotationalSpeed } from \"./measurement/rotational-speed.js\";\nimport { SoundLevel } from \"./measurement/sound-level.js\";\nimport { Speed } from \"./measurement/speed.js\";\nimport { Temperature } from \"./measurement/temperature.js\";\nimport { Torque } from \"./measurement/torque.js\";\nimport { Voltage } from \"./measurement/voltage.js\";\nimport { Volume } from \"./measurement/volume.js\";\nimport { Weight } from \"./measurement/weight.js\";\nimport { Color } from \"./product/color.js\";\nimport { ElectricalPhase } from \"./product/electrical-phase.js\";\nimport { Gtin8 } from \"./product/gtin8.js\";\nimport { Gtin12 } from \"./product/gtin12.js\";\nimport { Gtin13 } from \"./product/gtin13.js\";\nimport { Gtin14 } from \"./product/gtin14.js\";\nimport { IpRating } from \"./product/ip-rating.js\";\nimport { Refrigerant } from \"./product/refrigerant.js\";\nimport { ScreenResolution } from \"./product/screen-resolution.js\";\nimport { ScreenSize } from \"./product/screen-size.js\";\nimport { BoltPattern } from \"./vehicle/bolt-pattern.js\";\nimport { EmissionRate } from \"./vehicle/emission-rate.js\";\nimport { EnginePower } from \"./vehicle/engine-power.js\";\nimport { EuTypeApprovalNumber } from \"./vehicle/eu-type-approval-number.js\";\nimport { EuroEmissionClass } from \"./vehicle/euro-emission-class.js\";\nimport { FuelConsumption } from \"./vehicle/fuel-consumption.js\";\nimport { OperatingHours } from \"./vehicle/operating-hours.js\";\nimport { SwedishDrivingLicenseCategory } from \"./vehicle/swedish-driving-license-category.js\";\nimport { SwedishEcoVehicleClassification } from \"./vehicle/swedish-eco-vehicle-classification.js\";\nimport { SwedishVehicleRegistrationNumber } from \"./vehicle/swedish-vehicle-registration-number.js\";\nimport { TireDimension } from \"./vehicle/tire-dimension.js\";\nimport { VehicleIdentificationNumber } from \"./vehicle/vehicle-identification-number.js\";\nimport { WatercraftIdentificationNumber } from \"./vehicle/watercraft-identification-number.js\";\nimport { WheelRimDimension } from \"./vehicle/wheel-rim-dimension.js\";\n\nlet registered = false;\n\n/** Registers every built-in `findCandidatesInText` implementation on the shared scanner. */\nexport function registerDefaultTextScanners(): void {\n if (registered) return;\n registered = true;\n\n defaultTextScanner.register({\n typeName: \"Address\",\n category: TextCandidateCategory.Contact,\n scan: Address.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"AddressZipCode\",\n category: TextCandidateCategory.Contact,\n scan: AddressZipCode.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"PhoneNumber\",\n category: TextCandidateCategory.Contact,\n scan: PhoneNumber.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"SwedishAddress\",\n category: TextCandidateCategory.Contact,\n scan: SwedishAddress.findCandidatesInText,\n });\n\n defaultTextScanner.register({\n typeName: \"Country\",\n category: TextCandidateCategory.Geography,\n scan: Country.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"SwedishCounty\",\n category: TextCandidateCategory.Geography,\n scan: SwedishCounty.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"SwedishMunicipality\",\n category: TextCandidateCategory.Geography,\n scan: SwedishMunicipality.findCandidatesInText,\n });\n\n defaultTextScanner.register({\n typeName: \"SwedishPersonalIdentityNumber\",\n category: TextCandidateCategory.PersonalIdentifier,\n scan: SwedishPersonalIdentityNumber.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"SwedishCoordinationNumber\",\n category: TextCandidateCategory.PersonalIdentifier,\n scan: SwedishCoordinationNumber.findCandidatesInText,\n });\n\n defaultTextScanner.register({\n typeName: \"SwedishOrganizationNumber\",\n category: TextCandidateCategory.OrganizationIdentifier,\n scan: SwedishOrganizationNumber.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"EuVatNumber\",\n category: TextCandidateCategory.OrganizationIdentifier,\n scan: EuVatNumber.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"DunsNumber\",\n category: TextCandidateCategory.OrganizationIdentifier,\n scan: DunsNumber.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"LeiCode\",\n category: TextCandidateCategory.OrganizationIdentifier,\n scan: LeiCode.findCandidatesInText,\n });\n\n defaultTextScanner.register({\n typeName: \"EmailAddress\",\n category: TextCandidateCategory.Contact,\n scan: EmailAddress.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"Url\",\n category: TextCandidateCategory.Contact,\n scan: Url.findCandidatesInText,\n });\n\n defaultTextScanner.register({\n typeName: \"Isin\",\n category: TextCandidateCategory.Financial,\n scan: Isin.findCandidatesInText,\n });\n\n defaultTextScanner.register({\n typeName: \"SwedishPropertyDesignation\",\n category: TextCandidateCategory.Property,\n scan: SwedishPropertyDesignation.findCandidatesInText,\n });\n\n defaultTextScanner.register({\n typeName: \"Iban\",\n category: TextCandidateCategory.Financial,\n scan: Iban.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"Bic\",\n category: TextCandidateCategory.Financial,\n scan: Bic.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"SwedishBankgiroNumber\",\n category: TextCandidateCategory.Financial,\n scan: SwedishBankgiroNumber.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"SwedishPostgiroNumber\",\n category: TextCandidateCategory.Financial,\n scan: SwedishPostgiroNumber.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"SwedishOcrReferenceNumber\",\n category: TextCandidateCategory.Financial,\n scan: SwedishOcrReferenceNumber.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"SwedishBankAccount\",\n category: TextCandidateCategory.Financial,\n scan: SwedishBankAccount.findCandidatesInText,\n });\n defaultTextScanner.register({\n typeName: \"SwedishSwishNumber\",\n category: TextCandidateCategory.Financial,\n scan: SwedishSwishNumber.findCandidatesInText,\n });\n\n // Names are spelled out rather than read from `Class.name`, which a\n // consumer's minifier is free to mangle.\n const quantities: readonly (readonly [string, { findCandidatesInText: TextScanFunction }])[] = [\n [\"Area\", Area],\n [\"DataSize\", DataSize],\n [\"ElectricCharge\", ElectricCharge],\n [\"ElectricCurrent\", ElectricCurrent],\n [\"Energy\", Energy],\n [\"FlowRate\", FlowRate],\n [\"Frequency\", Frequency],\n [\"Length\", Length],\n [\"Luminance\", Luminance],\n [\"LuminousFlux\", LuminousFlux],\n [\"Percentage\", Percentage],\n [\"Power\", Power],\n [\"Pressure\", Pressure],\n [\"RotationalSpeed\", RotationalSpeed],\n [\"SoundLevel\", SoundLevel],\n [\"Speed\", Speed],\n [\"Temperature\", Temperature],\n [\"Torque\", Torque],\n [\"Voltage\", Voltage],\n [\"Volume\", Volume],\n [\"Weight\", Weight],\n ];\n\n for (const [typeName, quantity] of quantities) {\n defaultTextScanner.register({\n typeName,\n category: TextCandidateCategory.Measurement,\n scan: quantity.findCandidatesInText,\n });\n }\n\n // The same set the .NET `TextScanner` runs. `EnergyConsumption` can scan on its\n // own but is deliberately left out here to match .NET.\n const vehicles: readonly (readonly [string, { findCandidatesInText: TextScanFunction }])[] = [\n [\"BoltPattern\", BoltPattern],\n [\"EmissionRate\", EmissionRate],\n [\"EnginePower\", EnginePower],\n [\"EuTypeApprovalNumber\", EuTypeApprovalNumber],\n [\"EuroEmissionClass\", EuroEmissionClass],\n [\"FuelConsumption\", FuelConsumption],\n [\"OperatingHours\", OperatingHours],\n [\"SwedishDrivingLicenseCategory\", SwedishDrivingLicenseCategory],\n [\"SwedishEcoVehicleClassification\", SwedishEcoVehicleClassification],\n [\"SwedishVehicleRegistrationNumber\", SwedishVehicleRegistrationNumber],\n [\"TireDimension\", TireDimension],\n [\"VehicleIdentificationNumber\", VehicleIdentificationNumber],\n [\"WatercraftIdentificationNumber\", WatercraftIdentificationNumber],\n [\"WheelRimDimension\", WheelRimDimension],\n ];\n\n for (const [typeName, vehicle] of vehicles) {\n defaultTextScanner.register({\n typeName,\n category: TextCandidateCategory.Vehicle,\n scan: vehicle.findCandidatesInText,\n });\n }\n\n // The same set the .NET `TextScanner` runs. `CameraResolution` can scan on its own but is\n // deliberately left out here to match .NET.\n const products: readonly (readonly [string, { findCandidatesInText: TextScanFunction }])[] = [\n [\"Gtin13\", Gtin13],\n [\"Gtin8\", Gtin8],\n [\"Gtin12\", Gtin12],\n [\"Gtin14\", Gtin14],\n [\"IpRating\", IpRating],\n [\"ElectricalPhase\", ElectricalPhase],\n [\"Refrigerant\", Refrigerant],\n [\"Color\", Color],\n [\"ScreenResolution\", ScreenResolution],\n [\"ScreenSize\", ScreenSize],\n ];\n\n for (const [typeName, product] of products) {\n defaultTextScanner.register({\n typeName,\n category: TextCandidateCategory.Product,\n scan: product.findCandidatesInText,\n });\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }