@open-charging-cloud/chargy-core 0.6.2 → 0.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/chargy.d.ts CHANGED
@@ -50,24 +50,25 @@ export declare class Chargy {
50
50
  currentCTR: chargeTransparencyRecord.IChargeTransparencyRecord;
51
51
  internalCTR: chargeTransparencyRecord.IChargeTransparencyRecord;
52
52
  constructor(i18n: chargyInterfaces.I18NDictionary, UILanguages: chargyInterfaces.LanguageStrings, elliptic: EllipticModule, moment: MomentModule, asn1: Asn1Module, base32Decode: Base32Decode, ShowPKIDetails: chargyInterfaces.ShowPKIDetailsFunction, validationRules?: chargyInterfaces.IValidationRules);
53
- SetUILanguages(UILanguages: chargyInterfaces.LanguageStrings): void;
54
- private NormalizeUILanguages;
55
- private FindBestMultilanguageText;
56
- private CompleteMultilanguageText;
53
+ private fileNameWithoutExtension;
54
+ private tryExtractChargeTransparencyTextFromURL;
55
+ private tryExtractSignedDataTextFromXML;
57
56
  private PublicKeyIdFromFileName;
58
57
  private TryToParseDERPublicKey;
59
58
  private IsHexEncodedPublicKeyFile;
60
59
  private TryToGetDERPublicKeyHEX;
61
60
  private isSupportedQRCodeImageFile;
62
- private fileNameWithoutExtension;
63
- private textFileNameForQRCodeContent;
64
- private tryExtractChargeTransparencyTextFromURL;
65
- private tryExtractSignedDataTextFromXML;
66
61
  private expandQRCodeImageFiles;
62
+ private textFileNameForQRCodeContent;
63
+ SetUILanguages(UILanguages: chargyInterfaces.LanguageStrings): void;
64
+ private NormalizeUILanguages;
65
+ private FindBestMultilanguageText;
66
+ private CompleteMultilanguageText;
67
67
  GetLocalizedMessage(Text: string): string;
68
68
  GetMultilanguageText(Text: string): chargyInterfaces.IMultilanguageText;
69
69
  GetLocalizedMessageWithParameter(Text: string, Parameter: string | number): string;
70
70
  GetMultilanguageTextWithParameter(Text: string, Parameter: string | number): chargyInterfaces.IMultilanguageText;
71
+ getLocalizedText(data: chargyInterfaces.IMultilanguageText | undefined): string | undefined;
71
72
  GetChargingPool: chargyInterfaces.GetChargingPoolFunc;
72
73
  GetChargingStation: chargyInterfaces.GetChargingStationFunc;
73
74
  GetEVSE: chargyInterfaces.GetEVSEFunc;
@@ -1 +1 @@
1
- {"version":3,"file":"chargy.d.ts","sourceRoot":"","sources":["../src/chargy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chargy.d.ts","sourceRoot":"","sources":["../src/chargy.ts"],"names":[],"mappings":"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"}
@@ -16224,39 +16224,53 @@ var Chargy = class {
16224
16224
  this.showPKIDetails = ShowPKIDetails;
16225
16225
  this.validationRules = validationRules;
16226
16226
  }
16227
- SetUILanguages(UILanguages) {
16228
- this.uiLanguages = this.NormalizeUILanguages(UILanguages);
16227
+ fileNameWithoutExtension(fileName) {
16228
+ const lastSeparator = Math.max(fileName.lastIndexOf("/"), fileName.lastIndexOf("\\"));
16229
+ const lastDot = fileName.lastIndexOf(".");
16230
+ if (lastDot > lastSeparator)
16231
+ return fileName.substring(0, lastDot);
16232
+ return fileName;
16229
16233
  }
16230
- NormalizeUILanguages(UILanguages) {
16231
- const languages = new Array();
16232
- for (const language of UILanguages) {
16233
- const normalized = language.trim();
16234
- if (normalized.length > 0 && !languages.includes(normalized)) {
16235
- languages.push(normalized);
16234
+ tryExtractChargeTransparencyTextFromURL(qrText) {
16235
+ if (!qrText.startsWith("http://") && !qrText.startsWith("https://"))
16236
+ return qrText;
16237
+ try {
16238
+ const url = new URL(qrText);
16239
+ const candidates = [
16240
+ url.hash.startsWith("#") ? url.hash.substring(1) : url.hash,
16241
+ url.searchParams.get("data"),
16242
+ url.searchParams.get("content"),
16243
+ url.searchParams.get("ctr"),
16244
+ url.searchParams.get("record"),
16245
+ url.searchParams.get("payload"),
16246
+ url.searchParams.get("q")
16247
+ ];
16248
+ for (const candidate of candidates) {
16249
+ const decodedCandidate = candidate != null ? decodeURIComponent(candidate).trim() : "";
16250
+ if (decodedCandidate.startsWith("<?xml") || decodedCandidate.startsWith("<values") || decodedCandidate.startsWith("{") || decodedCandidate.startsWith("[") || decodedCandidate.startsWith("OCMF") || decodedCandidate.startsWith("AP;")) {
16251
+ return decodedCandidate;
16252
+ }
16236
16253
  }
16254
+ } catch {
16255
+ console.log("Invalid URL in QR code: " + qrText);
16237
16256
  }
16238
- return languages.length > 0 ? languages : ["en"];
16257
+ return qrText;
16239
16258
  }
16240
- FindBestMultilanguageText(Text) {
16241
- for (const language of this.uiLanguages) {
16242
- const localLanguage = Text[language];
16243
- if (localLanguage !== void 0)
16244
- return localLanguage;
16259
+ tryExtractSignedDataTextFromXML(qrText) {
16260
+ const trimmedQRCodeText = qrText.trim();
16261
+ if (!trimmedQRCodeText.startsWith("<?xml") && !trimmedQRCodeText.startsWith("<"))
16262
+ return qrText;
16263
+ try {
16264
+ const xmlDocument = new DOMParser().parseFromString(trimmedQRCodeText, "text/xml");
16265
+ const signedDataValues = getElementsByLocalName(xmlDocument, "signedData").filter((signedData) => (signedData.getAttribute("format") ?? "").trim().toLowerCase() === "alfen").map((signedData) => signedData.textContent.trim()).filter((signedData) => signedData.startsWith("AP;"));
16266
+ if (signedDataValues.length > 0)
16267
+ return signedDataValues.join("\n");
16268
+ } catch {
16269
+ console.log("Error parsing XML content from QR code: " + qrText);
16245
16270
  }
16246
- const english = Text["en"];
16247
- if (english !== void 0)
16248
- return english;
16249
- return Object.values(Text).find((value) => value !== void 0);
16250
- }
16251
- CompleteMultilanguageText(Text, fallbackText) {
16252
- const result = {
16253
- ...Text ?? {}
16254
- };
16255
- const fallback = this.FindBestMultilanguageText(result) ?? fallbackText;
16256
- for (const language of this.uiLanguages)
16257
- result[language] ??= fallback;
16258
- return result;
16271
+ return qrText;
16259
16272
  }
16273
+ //#region Public key methods...
16260
16274
  PublicKeyIdFromFileName(fileName) {
16261
16275
  return (fileName.includes(".") ? fileName.substring(0, fileName.indexOf(".")) : fileName).replace(/[-_]?public[-_]?key/i, "");
16262
16276
  }
@@ -16339,66 +16353,13 @@ var Chargy = class {
16339
16353
  return textContent.replace(/\s+/g, "");
16340
16354
  return void 0;
16341
16355
  }
16356
+ //#endregion
16357
+ //#region QR code image files...
16342
16358
  isSupportedQRCodeImageFile(fileInfo, mimeType) {
16343
16359
  const mimeTypeToCheck = (mimeType ?? fileInfo.type ?? "").toLowerCase();
16344
16360
  const fileName = fileInfo.name.toLowerCase();
16345
16361
  return mimeTypeToCheck === "image/png" || mimeTypeToCheck === "image/jpeg" || mimeTypeToCheck === "image/jpg" || mimeTypeToCheck === "image/gif" || mimeTypeToCheck === "image/webp" || mimeTypeToCheck === "image/bmp" || mimeTypeToCheck === "image/svg+xml" || fileName.endsWith(".png") || fileName.endsWith(".jpg") || fileName.endsWith(".jpeg") || fileName.endsWith(".gif") || fileName.endsWith(".webp") || fileName.endsWith(".bmp") || fileName.endsWith(".svg");
16346
16362
  }
16347
- fileNameWithoutExtension(fileName) {
16348
- const lastSeparator = Math.max(fileName.lastIndexOf("/"), fileName.lastIndexOf("\\"));
16349
- const lastDot = fileName.lastIndexOf(".");
16350
- if (lastDot > lastSeparator)
16351
- return fileName.substring(0, lastDot);
16352
- return fileName;
16353
- }
16354
- textFileNameForQRCodeContent(fileName, qrText) {
16355
- const trimmedQRCodeText = qrText.trimStart();
16356
- const baseFileName = this.fileNameWithoutExtension(fileName);
16357
- if (trimmedQRCodeText.startsWith("<?xml") || trimmedQRCodeText.startsWith("<"))
16358
- return baseFileName + ".xml";
16359
- if (trimmedQRCodeText.startsWith("{") || trimmedQRCodeText.startsWith("["))
16360
- return baseFileName + ".json";
16361
- return baseFileName + ".txt";
16362
- }
16363
- tryExtractChargeTransparencyTextFromURL(qrText) {
16364
- if (!qrText.startsWith("http://") && !qrText.startsWith("https://"))
16365
- return qrText;
16366
- try {
16367
- const url = new URL(qrText);
16368
- const candidates = [
16369
- url.hash.startsWith("#") ? url.hash.substring(1) : url.hash,
16370
- url.searchParams.get("data"),
16371
- url.searchParams.get("content"),
16372
- url.searchParams.get("ctr"),
16373
- url.searchParams.get("record"),
16374
- url.searchParams.get("payload"),
16375
- url.searchParams.get("q")
16376
- ];
16377
- for (const candidate of candidates) {
16378
- const decodedCandidate = candidate != null ? decodeURIComponent(candidate).trim() : "";
16379
- if (decodedCandidate.startsWith("<?xml") || decodedCandidate.startsWith("<values") || decodedCandidate.startsWith("{") || decodedCandidate.startsWith("[") || decodedCandidate.startsWith("OCMF") || decodedCandidate.startsWith("AP;")) {
16380
- return decodedCandidate;
16381
- }
16382
- }
16383
- } catch {
16384
- console.log("Invalid URL in QR code: " + qrText);
16385
- }
16386
- return qrText;
16387
- }
16388
- tryExtractSignedDataTextFromXML(qrText) {
16389
- const trimmedQRCodeText = qrText.trim();
16390
- if (!trimmedQRCodeText.startsWith("<?xml") && !trimmedQRCodeText.startsWith("<"))
16391
- return qrText;
16392
- try {
16393
- const xmlDocument = new DOMParser().parseFromString(trimmedQRCodeText, "text/xml");
16394
- const signedDataValues = getElementsByLocalName(xmlDocument, "signedData").filter((signedData) => (signedData.getAttribute("format") ?? "").trim().toLowerCase() === "alfen").map((signedData) => signedData.textContent.trim()).filter((signedData) => signedData.startsWith("AP;"));
16395
- if (signedDataValues.length > 0)
16396
- return signedDataValues.join("\n");
16397
- } catch {
16398
- console.log("Error parsing XML content from QR code: " + qrText);
16399
- }
16400
- return qrText;
16401
- }
16402
16363
  async expandQRCodeImageFiles(FileInfos) {
16403
16364
  const expandedFileInfos = new Array();
16404
16365
  for (const fileInfo of FileInfos) {
@@ -16430,7 +16391,50 @@ var Chargy = class {
16430
16391
  }
16431
16392
  return expandedFileInfos;
16432
16393
  }
16433
- //#region GetLocalizedMessages...
16394
+ textFileNameForQRCodeContent(fileName, qrText) {
16395
+ const trimmedQRCodeText = qrText.trimStart();
16396
+ const baseFileName = this.fileNameWithoutExtension(fileName);
16397
+ if (trimmedQRCodeText.startsWith("<?xml") || trimmedQRCodeText.startsWith("<"))
16398
+ return baseFileName + ".xml";
16399
+ if (trimmedQRCodeText.startsWith("{") || trimmedQRCodeText.startsWith("["))
16400
+ return baseFileName + ".json";
16401
+ return baseFileName + ".txt";
16402
+ }
16403
+ //#endregion
16404
+ //#region i18n...
16405
+ SetUILanguages(UILanguages) {
16406
+ this.uiLanguages = this.NormalizeUILanguages(UILanguages);
16407
+ }
16408
+ NormalizeUILanguages(UILanguages) {
16409
+ const languages = new Array();
16410
+ for (const language of UILanguages) {
16411
+ const normalized = language.trim();
16412
+ if (normalized.length > 0 && !languages.includes(normalized)) {
16413
+ languages.push(normalized);
16414
+ }
16415
+ }
16416
+ return languages.length > 0 ? languages : ["en"];
16417
+ }
16418
+ FindBestMultilanguageText(Text) {
16419
+ for (const language of this.uiLanguages) {
16420
+ const localLanguage = Text[language];
16421
+ if (localLanguage !== void 0)
16422
+ return localLanguage;
16423
+ }
16424
+ const english = Text["en"];
16425
+ if (english !== void 0)
16426
+ return english;
16427
+ return Object.values(Text).find((value) => value !== void 0);
16428
+ }
16429
+ CompleteMultilanguageText(Text, fallbackText) {
16430
+ const result = {
16431
+ ...Text ?? {}
16432
+ };
16433
+ const fallback = this.FindBestMultilanguageText(result) ?? fallbackText;
16434
+ for (const language of this.uiLanguages)
16435
+ result[language] ??= fallback;
16436
+ return result;
16437
+ }
16434
16438
  GetLocalizedMessage(Text) {
16435
16439
  const multiLanguage = this.i18n[Text];
16436
16440
  if (multiLanguage !== void 0) {
@@ -16464,6 +16468,14 @@ var Chargy = class {
16464
16468
  }
16465
16469
  return this.CompleteMultilanguageText(parameterizedText, Text.replace("%p", String(Parameter)));
16466
16470
  }
16471
+ getLocalizedText(data) {
16472
+ if (data == null)
16473
+ return void 0;
16474
+ const bestLanguage = this.FindBestMultilanguageText(data);
16475
+ if (bestLanguage == null)
16476
+ return void 0;
16477
+ return data[bestLanguage];
16478
+ }
16467
16479
  //#endregion
16468
16480
  //#region GetDevices...
16469
16481
  GetChargingPool = (Id) => {
@@ -16695,7 +16707,6 @@ var Chargy = class {
16695
16707
  } while (archiveFound);
16696
16708
  return expandedFileInfos;
16697
16709
  }
16698
- //#endregion
16699
16710
  async extractArchive(fileName, data, mimeType) {
16700
16711
  const archiveData = this.toUint8Array(data);
16701
16712
  if (mimeType === "application/zip")
@@ -16834,6 +16845,7 @@ var Chargy = class {
16834
16845
  const value = this.readTarString(data, offset, length).replace(/\0/g, "").trim();
16835
16846
  return value.length > 0 ? parseInt(value, 8) : 0;
16836
16847
  }
16848
+ //#endregion
16837
16849
  //#region DetectAndConvertContentFormat(FileInfos)
16838
16850
  async DetectAndConvertContentFormat(FileInfos) {
16839
16851
  if (FileInfos.length == 0) return {