adnbn 0.8.0 → 0.9.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 (112) hide show
  1. package/dist/cli/builders/locale/LocaleStructureValidator.js +7 -0
  2. package/dist/cli/builders/locale/LocaleStructureValidator.js.map +1 -1
  3. package/dist/cli/bundler/plugins/GenerateJsonPlugin.js +3 -7
  4. package/dist/cli/bundler/plugins/GenerateJsonPlugin.js.map +1 -1
  5. package/dist/cli/entrypoint/file/injectors/core.js +9 -1
  6. package/dist/cli/entrypoint/file/injectors/core.js.map +1 -1
  7. package/dist/cli/entrypoint/parser/ContentParser.d.ts +2 -2
  8. package/dist/cli/entrypoint/parser/ContentParser.js.map +1 -1
  9. package/dist/cli/entrypoint/parser/RelayParser.js +2 -1
  10. package/dist/cli/entrypoint/parser/RelayParser.js.map +1 -1
  11. package/dist/cli/index.js +2 -0
  12. package/dist/cli/index.js.map +1 -1
  13. package/dist/cli/plugins/content/ContentDriver.d.ts +21 -8
  14. package/dist/cli/plugins/content/ContentDriver.js +24 -2
  15. package/dist/cli/plugins/content/ContentDriver.js.map +1 -1
  16. package/dist/cli/plugins/content/ContentManager.d.ts +8 -3
  17. package/dist/cli/plugins/content/ContentManager.js +41 -6
  18. package/dist/cli/plugins/content/ContentManager.js.map +1 -1
  19. package/dist/cli/plugins/content/Relay.d.ts +6 -8
  20. package/dist/cli/plugins/content/Relay.js +2 -14
  21. package/dist/cli/plugins/content/Relay.js.map +1 -1
  22. package/dist/cli/plugins/content/RelayDeclaration.d.ts +0 -1
  23. package/dist/cli/plugins/content/RelayDeclaration.js +0 -3
  24. package/dist/cli/plugins/content/RelayDeclaration.js.map +1 -1
  25. package/dist/cli/plugins/content/RelayDriver.d.ts +10 -0
  26. package/dist/cli/plugins/content/RelayDriver.js +39 -0
  27. package/dist/cli/plugins/content/RelayDriver.js.map +1 -0
  28. package/dist/cli/plugins/content/index.js +1 -10
  29. package/dist/cli/plugins/content/index.js.map +1 -1
  30. package/dist/cli/plugins/content/types.d.ts +3 -0
  31. package/dist/cli/plugins/locale/Locale.js +5 -1
  32. package/dist/cli/plugins/locale/Locale.js.map +1 -1
  33. package/dist/cli/plugins/locale/declaration/LocaleDeclaration.js +2 -3
  34. package/dist/cli/plugins/locale/declaration/LocaleDeclaration.js.map +1 -1
  35. package/dist/cli/plugins/locale/declaration/locale.d.ts +3 -124
  36. package/dist/cli/virtual/index.js +2 -2
  37. package/dist/cli/virtual/virtual.d.ts +52 -147
  38. package/dist/entry/relay/index.d.ts +2 -1
  39. package/dist/entry/relay/index.js.map +1 -1
  40. package/dist/locale/adapters/react/LocaleProvider.js +2 -0
  41. package/dist/locale/adapters/react/LocaleProvider.js.map +1 -1
  42. package/dist/locale/adapters/react/context.d.ts +1 -0
  43. package/dist/locale/adapters/react/context.js +3 -2
  44. package/dist/locale/adapters/react/context.js.map +1 -1
  45. package/dist/locale/helpers.js.map +1 -1
  46. package/dist/locale/providers/AbstractLocale.d.ts +2 -0
  47. package/dist/locale/providers/AbstractLocale.js +5 -0
  48. package/dist/locale/providers/AbstractLocale.js.map +1 -1
  49. package/dist/locale/providers/NativeLocale.d.ts +3 -2
  50. package/dist/locale/providers/NativeLocale.js +1 -1
  51. package/dist/locale/providers/NativeLocale.js.map +1 -1
  52. package/dist/main/relay.d.ts +7 -6
  53. package/dist/main/relay.js +12 -5
  54. package/dist/main/relay.js.map +1 -1
  55. package/dist/message/error.d.ts +6 -0
  56. package/dist/message/error.js +21 -0
  57. package/dist/message/error.js.map +1 -1
  58. package/dist/message/index.d.ts +2 -1
  59. package/dist/message/index.js +2 -0
  60. package/dist/message/index.js.map +1 -1
  61. package/dist/message/providers/Message.d.ts +3 -0
  62. package/dist/message/providers/Message.js +36 -6
  63. package/dist/message/providers/Message.js.map +1 -1
  64. package/dist/offscreen/providers/ProxyOffscreen.d.ts +2 -2
  65. package/dist/offscreen/providers/ProxyOffscreen.js.map +1 -1
  66. package/dist/relay/RelayPermission.d.ts +6 -3
  67. package/dist/relay/RelayPermission.js +28 -12
  68. package/dist/relay/RelayPermission.js.map +1 -1
  69. package/dist/relay/adapters/RelayAdapter.d.ts +8 -0
  70. package/dist/relay/adapters/RelayAdapter.js +16 -0
  71. package/dist/relay/adapters/RelayAdapter.js.map +1 -0
  72. package/dist/relay/adapters/RelayMessagingAdapter.d.ts +11 -0
  73. package/dist/relay/adapters/RelayMessagingAdapter.js +91 -0
  74. package/dist/relay/adapters/RelayMessagingAdapter.js.map +1 -0
  75. package/dist/relay/adapters/RelayScriptingAdapter.d.ts +15 -0
  76. package/dist/relay/adapters/RelayScriptingAdapter.js +170 -0
  77. package/dist/relay/adapters/RelayScriptingAdapter.js.map +1 -0
  78. package/dist/relay/discovery/RelayDiscovery.d.ts +10 -0
  79. package/dist/relay/discovery/RelayDiscovery.js +62 -0
  80. package/dist/relay/discovery/RelayDiscovery.js.map +1 -0
  81. package/dist/relay/index.d.ts +1 -4
  82. package/dist/relay/index.js +1 -3
  83. package/dist/relay/index.js.map +1 -1
  84. package/dist/relay/providers/ProxyRelay.d.ts +20 -17
  85. package/dist/relay/providers/ProxyRelay.js +79 -52
  86. package/dist/relay/providers/ProxyRelay.js.map +1 -1
  87. package/dist/relay/providers/RegisterRelay.js +1 -2
  88. package/dist/relay/providers/RegisterRelay.js.map +1 -1
  89. package/dist/relay/result.d.ts +12 -0
  90. package/dist/relay/result.js +88 -0
  91. package/dist/relay/result.js.map +1 -0
  92. package/dist/sandbox/index.d.ts +2 -2
  93. package/dist/sandbox/index.js.map +1 -1
  94. package/dist/sandbox/providers/ProxySandbox.d.ts +2 -2
  95. package/dist/sandbox/providers/ProxySandbox.js.map +1 -1
  96. package/dist/service/providers/ProxyService.d.ts +2 -2
  97. package/dist/service/providers/ProxyService.js.map +1 -1
  98. package/dist/transport/ProxyTransport.d.ts +2 -2
  99. package/dist/transport/ProxyTransport.js.map +1 -1
  100. package/dist/transport/index.d.ts +3 -2
  101. package/dist/types/helpers.d.ts +0 -4
  102. package/dist/types/locale.d.ts +3 -0
  103. package/dist/types/locale.js +58 -0
  104. package/dist/types/locale.js.map +1 -1
  105. package/dist/types/relay.d.ts +130 -3
  106. package/dist/types/relay.js +16 -0
  107. package/dist/types/relay.js.map +1 -1
  108. package/dist/types/rpc.d.ts +4 -0
  109. package/dist/types/rpc.js +1 -0
  110. package/dist/types/rpc.js.map +1 -0
  111. package/dist/types/transport.d.ts +3 -2
  112. package/package.json +5 -4
@@ -1,76 +1,102 @@
1
- import injectScriptFactory from "@addon-core/inject-script";
2
1
  import ProxyTransport from "./../../transport/ProxyTransport.js";
2
+ import RelayMessagingAdapter from "../adapters/RelayMessagingAdapter.js";
3
+ import RelayScriptingAdapter from "../adapters/RelayScriptingAdapter.js";
3
4
  import RelayManager from "../RelayManager.js";
4
- import RelayMessage from "../RelayMessage.js";
5
- import RelayPermission from "../RelayPermission.js";
6
5
  import { isRelayContext } from "../utils.js";
7
- import { RelayGlobalKey, RelayMethod } from "./../../types/relay.js";
6
+ import { RelayAllFrames, RelayMethod } from "./../../types/relay.js";
8
7
  class ProxyRelay extends ProxyTransport {
9
- constructor(name, options, params) {
8
+ constructor(name, options, params, permission) {
10
9
  super(name);
11
10
  this.options = options;
12
11
  this.params = params;
13
- this.message = new RelayMessage(name);
14
- this.injectScript = injectScriptFactory({
15
- ...typeof params === "number" ? { tabId: params } : params,
16
- timeFallback: 4e3
17
- });
12
+ this.permission = permission;
18
13
  }
19
14
  options;
20
15
  params;
21
- injectScript;
22
- message;
16
+ permission;
17
+ static SelectorKeys = ["allFrames", "frameId", "frameIds", "documentId", "documentIds"];
18
+ _adapter;
19
+ _target;
20
+ get adapter() {
21
+ return this._adapter ?? (this._adapter = this.options.method === RelayMethod.Scripting ? new RelayScriptingAdapter(this.name, this.target) : new RelayMessagingAdapter(this.name, this.target));
22
+ }
23
+ get target() {
24
+ if (this._target) {
25
+ return this._target;
26
+ }
27
+ const target = typeof this.params === "number" ? { tabId: this.params } : { ...this.params };
28
+ this.validateTabId(target.tabId);
29
+ this.validateTimeout(target.timeoutMs);
30
+ const selected = ProxyRelay.SelectorKeys.filter((key) => target[key] !== void 0);
31
+ if (selected.length > 1) {
32
+ this.invalid(`selectors are mutually exclusive; received ${selected.map((key) => `"${key}"`).join(", ")}.`);
33
+ }
34
+ if (target.allFrames !== void 0 && target.allFrames !== false && target.allFrames !== true && target.allFrames !== RelayAllFrames.Any && target.allFrames !== RelayAllFrames.All) {
35
+ this.invalid('"allFrames" accepts only false, true, RelayAllFrames.Any or RelayAllFrames.All.');
36
+ }
37
+ if (target.frameId !== void 0) {
38
+ this.validateFrameId(target.frameId);
39
+ }
40
+ if (target.frameIds !== void 0) {
41
+ this.validateArray(target.frameIds, "frameIds", (item, property) => this.validateFrameId(item, property));
42
+ }
43
+ if (target.documentId !== void 0) {
44
+ this.validateDocumentId(target.documentId);
45
+ }
46
+ if (target.documentIds !== void 0) {
47
+ this.validateArray(
48
+ target.documentIds,
49
+ "documentIds",
50
+ (item, property) => this.validateDocumentId(item, property)
51
+ );
52
+ }
53
+ return this._target = target;
54
+ }
23
55
  manager() {
24
56
  return RelayManager.getInstance();
25
57
  }
26
- permission() {
27
- return RelayPermission.getInstance();
28
- }
29
58
  async apply(args, path) {
30
- if (!this.permission().allow(this.name)) {
31
- if (!await this.permission().request(this.name)) {
59
+ if (!this.permission.allow(this.name)) {
60
+ if (!await this.permission.request(this.name)) {
32
61
  throw new Error(
33
62
  `ProxyRelay: User denied required permissions for relay "${this.name}" at path "${path}". Cannot proceed with the operation.`
34
63
  );
35
64
  }
36
65
  }
37
- return this.options.method === RelayMethod.Scripting ? this.scriptingApply(args, path) : this.messagingApply(args, path);
66
+ return this.adapter.invoke(args, path);
38
67
  }
39
- async scriptingApply(args, path) {
40
- var _a;
41
- const func = async (name, path2, args2, key) => {
42
- try {
43
- const awaitManager = async (maxAttempts = 10, delay = 300) => {
44
- for (let count = 0; count < maxAttempts; count++) {
45
- const manager2 = globalThis[key];
46
- if (manager2) return manager2;
47
- await new Promise((resolve) => setTimeout(resolve, delay));
48
- }
49
- throw new Error(`Relay manager not found after ${maxAttempts} attempts.`);
50
- };
51
- const manager = await awaitManager();
52
- return await manager.property(name, { path: path2, args: args2 });
53
- } catch (e) {
54
- console.error(
55
- `ProxyRelay.scriptingApply(): failed to access relay "${name}" at path "${path2}" via injected script; manager with key "${key}" is unavailable or property not found. URL: ${document.location.href}`,
56
- e
57
- );
58
- throw e;
59
- }
60
- };
61
- const result = await this.injectScript.run(func, [this.name, path, args, RelayGlobalKey]);
62
- return (_a = result == null ? void 0 : result[0]) == null ? void 0 : _a.result;
68
+ validateTabId(tabId) {
69
+ if (!Number.isInteger(tabId) || tabId < 0) {
70
+ this.invalid('"tabId" must be a non-negative integer.');
71
+ }
72
+ }
73
+ validateFrameId(frameId, property = "frameId") {
74
+ if (!Number.isInteger(frameId) || frameId < 0) {
75
+ this.invalid(`"${property}" must contain only non-negative integers.`);
76
+ }
77
+ }
78
+ validateDocumentId(documentId, property = "documentId") {
79
+ if (typeof documentId !== "string" || documentId.trim() === "") {
80
+ this.invalid(`"${property}" must contain only non-empty strings.`);
81
+ }
82
+ }
83
+ validateTimeout(timeoutMs) {
84
+ if (timeoutMs !== void 0 && (!Number.isFinite(timeoutMs) || timeoutMs <= 0)) {
85
+ this.invalid('"timeoutMs" must be greater than zero.');
86
+ }
87
+ }
88
+ validateArray(value, property, validate) {
89
+ if (!Array.isArray(value) || value.length === 0) {
90
+ this.invalid(`"${property}" must be a non-empty array.`);
91
+ }
92
+ const items = value;
93
+ items.forEach((item) => validate(item, property));
94
+ if (new Set(items).size !== items.length) {
95
+ this.invalid(`"${property}" must not contain duplicate values.`);
96
+ }
63
97
  }
64
- async messagingApply(args, path) {
65
- const options = typeof this.params === "number" ? {
66
- tabId: this.params,
67
- frameId: 0
68
- } : {
69
- tabId: this.params.tabId,
70
- frameId: this.params.frameId || 0,
71
- documentId: this.params.documentId
72
- };
73
- return this.message.send({ path, args }, options);
98
+ invalid(message) {
99
+ throw new TypeError(`Invalid Relay target: ${message}`);
74
100
  }
75
101
  get() {
76
102
  if (isRelayContext()) {
@@ -78,6 +104,7 @@ class ProxyRelay extends ProxyTransport {
78
104
  `You are trying to get proxy relay "${this.name}" from script content. You can get original relay instead`
79
105
  );
80
106
  }
107
+ void this.target;
81
108
  return super.get();
82
109
  }
83
110
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/relay/providers/ProxyRelay.ts"],"sourcesContent":["import injectScriptFactory, {type InjectScriptContract, type InjectScriptOptions} from \"@addon-core/inject-script\";\n\nimport ProxyTransport from \"@transport/ProxyTransport\";\n\nimport RelayManager from \"../RelayManager\";\nimport RelayMessage from \"../RelayMessage\";\nimport RelayPermission from \"../RelayPermission\";\n\nimport {isRelayContext} from \"../utils\";\n\nimport {RelayGlobalKey, RelayMethod, RelayOptions} from \"@typing/relay\";\nimport {DeepAsyncProxy} from \"@typing/helpers\";\nimport {MessageSendOptions} from \"@typing/message\";\nimport {TransportDictionary, TransportManager, TransportMessage, TransportName} from \"@typing/transport\";\n\nexport type ProxyRelayParams =\n | number\n | (Omit<InjectScriptOptions, \"frameId\" | \"documentId\" | \"timeFallback\"> & {\n frameId?: number;\n documentId?: string;\n });\n\nexport default class ProxyRelay<\n N extends TransportName,\n T = DeepAsyncProxy<TransportDictionary[N]>,\n> extends ProxyTransport<N, T> {\n private injectScript: InjectScriptContract;\n private message: TransportMessage;\n\n constructor(\n name: N,\n protected options: RelayOptions,\n protected params: ProxyRelayParams\n ) {\n super(name);\n\n this.message = new RelayMessage(name);\n\n this.injectScript = injectScriptFactory({\n ...(typeof params === \"number\" ? {tabId: params} : params),\n timeFallback: 4000,\n });\n }\n\n protected manager(): TransportManager {\n return RelayManager.getInstance();\n }\n\n protected permission(): RelayPermission {\n return RelayPermission.getInstance();\n }\n\n protected async apply(args: any[], path?: string): Promise<any> {\n if (!this.permission().allow(this.name)) {\n if (!(await this.permission().request(this.name))) {\n throw new Error(\n `ProxyRelay: User denied required permissions for relay \"${this.name}\" at path \"${path}\". Cannot proceed with the operation.`\n );\n }\n }\n\n return this.options.method === RelayMethod.Scripting\n ? this.scriptingApply(args, path)\n : this.messagingApply(args, path);\n }\n\n private async scriptingApply(args: any[], path?: string): Promise<any> {\n const func = async (name: string, path: string, args: any[], key: string) => {\n try {\n const awaitManager = async (maxAttempts = 10, delay = 300): Promise<RelayManager> => {\n for (let count = 0; count < maxAttempts; count++) {\n const manager = globalThis[key];\n\n if (manager) return manager;\n\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n\n throw new Error(`Relay manager not found after ${maxAttempts} attempts.`);\n };\n\n const manager: RelayManager = await awaitManager();\n\n return await manager.property(name, {path, args});\n } catch (e) {\n console.error(\n `ProxyRelay.scriptingApply(): failed to access relay \"${name}\" at path \"${path}\" via injected script; manager with key \"${key}\" is unavailable or property not found. URL: ${document.location.href}`,\n e\n );\n\n throw e;\n }\n };\n\n const result = await this.injectScript.run(func, [this.name, path!, args, RelayGlobalKey]);\n\n return result?.[0]?.result;\n }\n\n private async messagingApply(args: any[], path?: string): Promise<any> {\n const options: MessageSendOptions =\n typeof this.params === \"number\"\n ? {\n tabId: this.params,\n frameId: 0,\n }\n : {\n tabId: this.params.tabId,\n frameId: this.params.frameId || 0,\n documentId: this.params.documentId,\n };\n\n return this.message.send({path, args}, options);\n }\n\n public get(): T {\n if (isRelayContext()) {\n throw new Error(\n `You are trying to get proxy relay \"${this.name}\" from script content. You can get original relay instead`\n );\n }\n\n return super.get();\n }\n}\n"],"mappings":"AAAA,OAAO,yBAAgF;AAEvF,OAAO,oBAAoB;AAE3B,OAAO,kBAAkB;AACzB,OAAO,kBAAkB;AACzB,OAAO,qBAAqB;AAE5B,SAAQ,sBAAqB;AAE7B,SAAQ,gBAAgB,mBAAgC;AAYxD,MAAO,mBAGG,eAAqB;AAAA,EAI3B,YACI,MACU,SACA,QACZ;AACE,UAAM,IAAI;AAHA;AACA;AAIV,SAAK,UAAU,IAAI,aAAa,IAAI;AAEpC,SAAK,eAAe,oBAAoB;AAAA,MACpC,GAAI,OAAO,WAAW,WAAW,EAAC,OAAO,OAAM,IAAI;AAAA,MACnD,cAAc;AAAA,IAClB,CAAC;AAAA,EACL;AAAA,EAXc;AAAA,EACA;AAAA,EANN;AAAA,EACA;AAAA,EAiBE,UAA4B;AAClC,WAAO,aAAa,YAAY;AAAA,EACpC;AAAA,EAEU,aAA8B;AACpC,WAAO,gBAAgB,YAAY;AAAA,EACvC;AAAA,EAEA,MAAgB,MAAM,MAAa,MAA6B;AAC5D,QAAI,CAAC,KAAK,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG;AACrC,UAAI,CAAE,MAAM,KAAK,WAAW,EAAE,QAAQ,KAAK,IAAI,GAAI;AAC/C,cAAM,IAAI;AAAA,UACN,2DAA2D,KAAK,IAAI,cAAc,IAAI;AAAA,QAC1F;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO,KAAK,QAAQ,WAAW,YAAY,YACrC,KAAK,eAAe,MAAM,IAAI,IAC9B,KAAK,eAAe,MAAM,IAAI;AAAA,EACxC;AAAA,EAEA,MAAc,eAAe,MAAa,MAA6B;AAlE3E;AAmEQ,UAAM,OAAO,OAAO,MAAcA,OAAcC,OAAa,QAAgB;AACzE,UAAI;AACA,cAAM,eAAe,OAAO,cAAc,IAAI,QAAQ,QAA+B;AACjF,mBAAS,QAAQ,GAAG,QAAQ,aAAa,SAAS;AAC9C,kBAAMC,WAAU,WAAW,GAAG;AAE9B,gBAAIA,SAAS,QAAOA;AAEpB,kBAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,KAAK,CAAC;AAAA,UAC3D;AAEA,gBAAM,IAAI,MAAM,iCAAiC,WAAW,YAAY;AAAA,QAC5E;AAEA,cAAM,UAAwB,MAAM,aAAa;AAEjD,eAAO,MAAM,QAAQ,SAAS,MAAM,EAAC,MAAAF,OAAM,MAAAC,MAAI,CAAC;AAAA,MACpD,SAAS,GAAG;AACR,gBAAQ;AAAA,UACJ,wDAAwD,IAAI,cAAcD,KAAI,4CAA4C,GAAG,gDAAgD,SAAS,SAAS,IAAI;AAAA,UACnM;AAAA,QACJ;AAEA,cAAM;AAAA,MACV;AAAA,IACJ;AAEA,UAAM,SAAS,MAAM,KAAK,aAAa,IAAI,MAAM,CAAC,KAAK,MAAM,MAAO,MAAM,cAAc,CAAC;AAEzF,YAAO,sCAAS,OAAT,mBAAa;AAAA,EACxB;AAAA,EAEA,MAAc,eAAe,MAAa,MAA6B;AACnE,UAAM,UACF,OAAO,KAAK,WAAW,WACjB;AAAA,MACI,OAAO,KAAK;AAAA,MACZ,SAAS;AAAA,IACb,IACA;AAAA,MACI,OAAO,KAAK,OAAO;AAAA,MACnB,SAAS,KAAK,OAAO,WAAW;AAAA,MAChC,YAAY,KAAK,OAAO;AAAA,IAC5B;AAEV,WAAO,KAAK,QAAQ,KAAK,EAAC,MAAM,KAAI,GAAG,OAAO;AAAA,EAClD;AAAA,EAEO,MAAS;AACZ,QAAI,eAAe,GAAG;AAClB,YAAM,IAAI;AAAA,QACN,sCAAsC,KAAK,IAAI;AAAA,MACnD;AAAA,IACJ;AAEA,WAAO,MAAM,IAAI;AAAA,EACrB;AACJ;","names":["path","args","manager"]}
1
+ {"version":3,"sources":["../../../src/relay/providers/ProxyRelay.ts"],"sourcesContent":["import ProxyTransport from \"@transport/ProxyTransport\";\n\nimport RelayAdapter from \"../adapters/RelayAdapter\";\nimport RelayMessagingAdapter from \"../adapters/RelayMessagingAdapter\";\nimport RelayScriptingAdapter from \"../adapters/RelayScriptingAdapter\";\nimport RelayManager from \"../RelayManager\";\nimport RelayPermission from \"../RelayPermission\";\nimport {isRelayContext} from \"../utils\";\n\nimport type {RpcAsyncProxy} from \"@typing/rpc\";\nimport {RelayAllFrames, RelayMethod, type RelayCallOptions, type RelayOptions} from \"@typing/relay\";\nimport type {TransportDictionary, TransportManager, TransportName} from \"@typing/transport\";\n\nexport type ProxyRelayParams = number | RelayCallOptions;\n\nexport default class ProxyRelay<\n N extends TransportName,\n T = RpcAsyncProxy<TransportDictionary[N]>,\n> extends ProxyTransport<N, T> {\n private static readonly SelectorKeys = [\"allFrames\", \"frameId\", \"frameIds\", \"documentId\", \"documentIds\"] as const;\n\n private _adapter?: RelayAdapter;\n private _target?: RelayCallOptions;\n\n constructor(\n name: N,\n protected readonly options: RelayOptions,\n private readonly params: ProxyRelayParams,\n private readonly permission: RelayPermission\n ) {\n super(name);\n }\n\n private get adapter(): RelayAdapter {\n return (this._adapter ??=\n this.options.method === RelayMethod.Scripting\n ? new RelayScriptingAdapter(this.name, this.target)\n : new RelayMessagingAdapter(this.name, this.target));\n }\n\n private get target(): RelayCallOptions {\n if (this._target) {\n return this._target;\n }\n\n const target: Record<string, unknown> =\n typeof this.params === \"number\" ? {tabId: this.params} : {...this.params};\n\n this.validateTabId(target.tabId);\n this.validateTimeout(target.timeoutMs);\n\n const selected = ProxyRelay.SelectorKeys.filter(key => target[key] !== undefined);\n\n if (selected.length > 1) {\n this.invalid(`selectors are mutually exclusive; received ${selected.map(key => `\"${key}\"`).join(\", \")}.`);\n }\n\n if (\n target.allFrames !== undefined &&\n target.allFrames !== false &&\n target.allFrames !== true &&\n target.allFrames !== RelayAllFrames.Any &&\n target.allFrames !== RelayAllFrames.All\n ) {\n this.invalid('\"allFrames\" accepts only false, true, RelayAllFrames.Any or RelayAllFrames.All.');\n }\n\n if (target.frameId !== undefined) {\n this.validateFrameId(target.frameId);\n }\n\n if (target.frameIds !== undefined) {\n this.validateArray(target.frameIds, \"frameIds\", (item, property) => this.validateFrameId(item, property));\n }\n\n if (target.documentId !== undefined) {\n this.validateDocumentId(target.documentId);\n }\n\n if (target.documentIds !== undefined) {\n this.validateArray(target.documentIds, \"documentIds\", (item, property) =>\n this.validateDocumentId(item, property)\n );\n }\n\n return (this._target = target as unknown as RelayCallOptions);\n }\n\n protected manager(): TransportManager {\n return RelayManager.getInstance();\n }\n\n protected async apply(args: any[], path?: string): Promise<any> {\n if (!this.permission.allow(this.name)) {\n if (!(await this.permission.request(this.name))) {\n throw new Error(\n `ProxyRelay: User denied required permissions for relay \"${this.name}\" at path \"${path}\". Cannot proceed with the operation.`\n );\n }\n }\n\n return this.adapter.invoke(args, path);\n }\n\n private validateTabId(tabId: unknown): void {\n if (!Number.isInteger(tabId) || (tabId as number) < 0) {\n this.invalid('\"tabId\" must be a non-negative integer.');\n }\n }\n\n private validateFrameId(frameId: unknown, property = \"frameId\"): void {\n if (!Number.isInteger(frameId) || (frameId as number) < 0) {\n this.invalid(`\"${property}\" must contain only non-negative integers.`);\n }\n }\n\n private validateDocumentId(documentId: unknown, property = \"documentId\"): void {\n if (typeof documentId !== \"string\" || documentId.trim() === \"\") {\n this.invalid(`\"${property}\" must contain only non-empty strings.`);\n }\n }\n\n private validateTimeout(timeoutMs: unknown): void {\n if (timeoutMs !== undefined && (!Number.isFinite(timeoutMs) || (timeoutMs as number) <= 0)) {\n this.invalid('\"timeoutMs\" must be greater than zero.');\n }\n }\n\n private validateArray(\n value: unknown,\n property: \"frameIds\" | \"documentIds\",\n validate: (item: unknown, property: string) => void\n ): void {\n if (!Array.isArray(value) || value.length === 0) {\n this.invalid(`\"${property}\" must be a non-empty array.`);\n }\n\n const items = value as unknown[];\n\n items.forEach(item => validate(item, property));\n\n if (new Set(items).size !== items.length) {\n this.invalid(`\"${property}\" must not contain duplicate values.`);\n }\n }\n\n private invalid(message: string): never {\n throw new TypeError(`Invalid Relay target: ${message}`);\n }\n\n public get(): T {\n if (isRelayContext()) {\n throw new Error(\n `You are trying to get proxy relay \"${this.name}\" from script content. You can get original relay instead`\n );\n }\n\n void this.target;\n\n return super.get();\n }\n}\n"],"mappings":"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","names":[]}
@@ -25,9 +25,8 @@ class RegisterRelay_default extends RegisterTransport {
25
25
  const relay = this.init(...args);
26
26
  this.manager().add(this.name, relay);
27
27
  return relay;
28
- } else {
29
- return super.register(...args);
30
28
  }
29
+ return super.register(...args);
31
30
  }
32
31
  get() {
33
32
  if (!isRelayContext()) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/relay/providers/RegisterRelay.ts"],"sourcesContent":["import RegisterTransport from \"@transport/RegisterTransport\";\n\nimport RelayMessage from \"../RelayMessage\";\nimport RelayManager from \"../RelayManager\";\nimport {isRelayContext} from \"../utils\";\n\nimport {TransportDictionary, TransportManager, TransportMessage, TransportName} from \"@typing/transport\";\nimport {RelayMethod} from \"@typing/relay\";\n\nexport default class<\n N extends TransportName,\n T extends object = TransportDictionary[N],\n A extends any[] = [],\n> extends RegisterTransport<N, T, A> {\n constructor(\n name: N,\n protected method: RelayMethod,\n protected readonly init: (...args: A) => T\n ) {\n super(name, init);\n }\n\n protected message(): TransportMessage {\n return new RelayMessage(this.name);\n }\n\n protected manager(): TransportManager {\n return RelayManager.getInstance();\n }\n\n public register(...args: A): T {\n if (this.method === RelayMethod.Scripting) {\n if (this.manager().has(this.name)) {\n throw new Error(`A relay with the name \"${this.name}\" already exists. The relay name must be unique.`);\n }\n\n const relay = this.init(...args);\n\n this.manager().add(this.name, relay);\n\n return relay;\n } else {\n return super.register(...args);\n }\n }\n\n public get(): T {\n if (!isRelayContext()) {\n throw new Error(`Relay \"${this.name}\" can be getting only from content script`);\n }\n\n return super.get();\n }\n}\n"],"mappings":"AAAA,OAAO,uBAAuB;AAE9B,OAAO,kBAAkB;AACzB,OAAO,kBAAkB;AACzB,SAAQ,sBAAqB;AAG7B,SAAQ,mBAAkB;AAE1B,MAAO,8BAIG,kBAA2B;AAAA,EACjC,YACI,MACU,QACS,MACrB;AACE,UAAM,MAAM,IAAI;AAHN;AACS;AAAA,EAGvB;AAAA,EAJc;AAAA,EACS;AAAA,EAKb,UAA4B;AAClC,WAAO,IAAI,aAAa,KAAK,IAAI;AAAA,EACrC;AAAA,EAEU,UAA4B;AAClC,WAAO,aAAa,YAAY;AAAA,EACpC;AAAA,EAEO,YAAY,MAAY;AAC3B,QAAI,KAAK,WAAW,YAAY,WAAW;AACvC,UAAI,KAAK,QAAQ,EAAE,IAAI,KAAK,IAAI,GAAG;AAC/B,cAAM,IAAI,MAAM,0BAA0B,KAAK,IAAI,kDAAkD;AAAA,MACzG;AAEA,YAAM,QAAQ,KAAK,KAAK,GAAG,IAAI;AAE/B,WAAK,QAAQ,EAAE,IAAI,KAAK,MAAM,KAAK;AAEnC,aAAO;AAAA,IACX,OAAO;AACH,aAAO,MAAM,SAAS,GAAG,IAAI;AAAA,IACjC;AAAA,EACJ;AAAA,EAEO,MAAS;AACZ,QAAI,CAAC,eAAe,GAAG;AACnB,YAAM,IAAI,MAAM,UAAU,KAAK,IAAI,2CAA2C;AAAA,IAClF;AAEA,WAAO,MAAM,IAAI;AAAA,EACrB;AACJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/relay/providers/RegisterRelay.ts"],"sourcesContent":["import RegisterTransport from \"@transport/RegisterTransport\";\n\nimport RelayMessage from \"../RelayMessage\";\nimport RelayManager from \"../RelayManager\";\nimport {isRelayContext} from \"../utils\";\n\nimport {TransportDictionary, TransportManager, TransportMessage, TransportName} from \"@typing/transport\";\nimport {RelayMethod} from \"@typing/relay\";\n\nexport default class<\n N extends TransportName,\n T extends object = TransportDictionary[N],\n A extends any[] = [],\n> extends RegisterTransport<N, T, A> {\n constructor(\n name: N,\n protected method: RelayMethod,\n protected readonly init: (...args: A) => T\n ) {\n super(name, init);\n }\n\n protected message(): TransportMessage {\n return new RelayMessage(this.name);\n }\n\n protected manager(): TransportManager {\n return RelayManager.getInstance();\n }\n\n public register(...args: A): T {\n if (this.method === RelayMethod.Scripting) {\n if (this.manager().has(this.name)) {\n throw new Error(`A relay with the name \"${this.name}\" already exists. The relay name must be unique.`);\n }\n\n const relay = this.init(...args);\n\n this.manager().add(this.name, relay);\n\n return relay;\n }\n\n return super.register(...args);\n }\n\n public get(): T {\n if (!isRelayContext()) {\n throw new Error(`Relay \"${this.name}\" can be getting only from content script`);\n }\n\n return super.get();\n }\n}\n"],"mappings":"AAAA,OAAO,uBAAuB;AAE9B,OAAO,kBAAkB;AACzB,OAAO,kBAAkB;AACzB,SAAQ,sBAAqB;AAG7B,SAAQ,mBAAkB;AAE1B,MAAO,8BAIG,kBAA2B;AAAA,EACjC,YACI,MACU,QACS,MACrB;AACE,UAAM,MAAM,IAAI;AAHN;AACS;AAAA,EAGvB;AAAA,EAJc;AAAA,EACS;AAAA,EAKb,UAA4B;AAClC,WAAO,IAAI,aAAa,KAAK,IAAI;AAAA,EACrC;AAAA,EAEU,UAA4B;AAClC,WAAO,aAAa,YAAY;AAAA,EACpC;AAAA,EAEO,YAAY,MAAY;AAC3B,QAAI,KAAK,WAAW,YAAY,WAAW;AACvC,UAAI,KAAK,QAAQ,EAAE,IAAI,KAAK,IAAI,GAAG;AAC/B,cAAM,IAAI,MAAM,0BAA0B,KAAK,IAAI,kDAAkD;AAAA,MACzG;AAEA,YAAM,QAAQ,KAAK,KAAK,GAAG,IAAI;AAE/B,WAAK,QAAQ,EAAE,IAAI,KAAK,MAAM,KAAK;AAEnC,aAAO;AAAA,IACX;AAEA,WAAO,MAAM,SAAS,GAAG,IAAI;AAAA,EACjC;AAAA,EAEO,MAAS;AACZ,QAAI,CAAC,eAAe,GAAG;AACnB,YAAM,IAAI,MAAM,UAAU,KAAK,IAAI,2CAA2C;AAAA,IAClF;AAEA,WAAO,MAAM,IAAI;AAAA,EACrB;AACJ;","names":[]}
@@ -0,0 +1,12 @@
1
+ import { InjectScriptTargetErrorKind } from "@addon-core/inject-script";
2
+ import { RelayFrameErrorKind, type RelayFrameResult, type RelayFramesResult, type RelayResultTarget } from "../types/relay.js";
3
+ export declare class RelayFrameTimeoutError extends Error {
4
+ readonly timeoutMs: number;
5
+ constructor(timeoutMs: number);
6
+ }
7
+ export declare const fulfilledRelayFrame: <T>(target: RelayResultTarget, result: T) => RelayFrameResult<T>;
8
+ export declare const rejectedRelayFrame: <T>(target: RelayResultTarget, error: unknown, kind: RelayFrameErrorKind) => RelayFrameResult<T>;
9
+ export declare const messageErrorKind: (error: unknown) => RelayFrameErrorKind;
10
+ export declare const injectScriptErrorKind: (kind: `${InjectScriptTargetErrorKind}`) => RelayFrameErrorKind;
11
+ export declare const withRelayTimeout: <T>(promise: Promise<T>, timeoutMs?: number) => Promise<T>;
12
+ export declare const sortRelayFrameResults: <T>(results: RelayFramesResult<T>) => RelayFramesResult<T>;
@@ -0,0 +1,88 @@
1
+ import { serializeError } from "./../message/error.js";
2
+ import { InjectScriptTargetErrorKind } from "@addon-core/inject-script";
3
+ import {
4
+ RelayFrameErrorKind
5
+ } from "./../types/relay.js";
6
+ class RelayFrameTimeoutError extends Error {
7
+ constructor(timeoutMs) {
8
+ super(`Relay frame did not respond within ${timeoutMs}ms.`);
9
+ this.timeoutMs = timeoutMs;
10
+ this.name = "RelayFrameTimeoutError";
11
+ }
12
+ timeoutMs;
13
+ }
14
+ const fulfilledRelayFrame = (target, result) => ({
15
+ target,
16
+ status: "fulfilled",
17
+ result
18
+ });
19
+ const rejectedRelayFrame = (target, error, kind) => ({
20
+ target,
21
+ status: "rejected",
22
+ error: {
23
+ kind,
24
+ ...serializeError(error)
25
+ }
26
+ });
27
+ const messageErrorKind = (error) => {
28
+ const message = error instanceof Error ? error.message : String(error);
29
+ if (/receiving end does not exist|no matching message handler|frame.*(?:removed|not found)|no frame with id|invalid frame id/i.test(
30
+ message
31
+ )) {
32
+ return RelayFrameErrorKind.TargetGone;
33
+ }
34
+ return RelayFrameErrorKind.Delivery;
35
+ };
36
+ const injectScriptErrorKind = (kind) => {
37
+ switch (kind) {
38
+ case InjectScriptTargetErrorKind.Execution:
39
+ return RelayFrameErrorKind.Execution;
40
+ case InjectScriptTargetErrorKind.Delivery:
41
+ return RelayFrameErrorKind.Delivery;
42
+ case InjectScriptTargetErrorKind.Timeout:
43
+ return RelayFrameErrorKind.Timeout;
44
+ case InjectScriptTargetErrorKind.TargetGone:
45
+ return RelayFrameErrorKind.TargetGone;
46
+ case InjectScriptTargetErrorKind.Unobservable:
47
+ return RelayFrameErrorKind.Unobservable;
48
+ default:
49
+ throw new TypeError(`Unsupported Inject Script target error kind: ${kind}`);
50
+ }
51
+ };
52
+ const withRelayTimeout = (promise, timeoutMs) => {
53
+ if (timeoutMs === void 0) {
54
+ return promise;
55
+ }
56
+ return new Promise((resolve, reject) => {
57
+ const timeout = setTimeout(() => reject(new RelayFrameTimeoutError(timeoutMs)), timeoutMs);
58
+ promise.then(
59
+ (result) => {
60
+ clearTimeout(timeout);
61
+ resolve(result);
62
+ },
63
+ (error) => {
64
+ clearTimeout(timeout);
65
+ reject(error);
66
+ }
67
+ );
68
+ });
69
+ };
70
+ const sortRelayFrameResults = (results) => {
71
+ return [...results].sort((a, b) => {
72
+ const frameDifference = (a.target.frameId ?? Number.MAX_SAFE_INTEGER) - (b.target.frameId ?? Number.MAX_SAFE_INTEGER);
73
+ if (frameDifference !== 0) {
74
+ return frameDifference;
75
+ }
76
+ return (a.target.documentId ?? "").localeCompare(b.target.documentId ?? "");
77
+ });
78
+ };
79
+ export {
80
+ RelayFrameTimeoutError,
81
+ fulfilledRelayFrame,
82
+ injectScriptErrorKind,
83
+ messageErrorKind,
84
+ rejectedRelayFrame,
85
+ sortRelayFrameResults,
86
+ withRelayTimeout
87
+ };
88
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/relay/result.ts"],"sourcesContent":["import {serializeError} from \"@message/error\";\n\nimport {InjectScriptTargetErrorKind} from \"@addon-core/inject-script\";\n\nimport {\n RelayFrameErrorKind,\n type RelayFrameResult,\n type RelayFramesResult,\n type RelayResultTarget,\n} from \"@typing/relay\";\n\nexport class RelayFrameTimeoutError extends Error {\n public constructor(public readonly timeoutMs: number) {\n super(`Relay frame did not respond within ${timeoutMs}ms.`);\n this.name = \"RelayFrameTimeoutError\";\n }\n}\n\nexport const fulfilledRelayFrame = <T>(target: RelayResultTarget, result: T): RelayFrameResult<T> => ({\n target,\n status: \"fulfilled\",\n result,\n});\n\nexport const rejectedRelayFrame = <T>(\n target: RelayResultTarget,\n error: unknown,\n kind: RelayFrameErrorKind\n): RelayFrameResult<T> => ({\n target,\n status: \"rejected\",\n error: {\n kind,\n ...serializeError(error),\n },\n});\n\nexport const messageErrorKind = (error: unknown): RelayFrameErrorKind => {\n const message = error instanceof Error ? error.message : String(error);\n\n if (\n /receiving end does not exist|no matching message handler|frame.*(?:removed|not found)|no frame with id|invalid frame id/i.test(\n message\n )\n ) {\n return RelayFrameErrorKind.TargetGone;\n }\n\n return RelayFrameErrorKind.Delivery;\n};\n\nexport const injectScriptErrorKind = (kind: `${InjectScriptTargetErrorKind}`): RelayFrameErrorKind => {\n switch (kind) {\n case InjectScriptTargetErrorKind.Execution:\n return RelayFrameErrorKind.Execution;\n case InjectScriptTargetErrorKind.Delivery:\n return RelayFrameErrorKind.Delivery;\n case InjectScriptTargetErrorKind.Timeout:\n return RelayFrameErrorKind.Timeout;\n case InjectScriptTargetErrorKind.TargetGone:\n return RelayFrameErrorKind.TargetGone;\n case InjectScriptTargetErrorKind.Unobservable:\n return RelayFrameErrorKind.Unobservable;\n default:\n throw new TypeError(`Unsupported Inject Script target error kind: ${kind}`);\n }\n};\n\nexport const withRelayTimeout = <T>(promise: Promise<T>, timeoutMs?: number): Promise<T> => {\n if (timeoutMs === undefined) {\n return promise;\n }\n\n return new Promise<T>((resolve, reject) => {\n const timeout = setTimeout(() => reject(new RelayFrameTimeoutError(timeoutMs)), timeoutMs);\n\n promise.then(\n result => {\n clearTimeout(timeout);\n resolve(result);\n },\n error => {\n clearTimeout(timeout);\n reject(error);\n }\n );\n });\n};\n\nexport const sortRelayFrameResults = <T>(results: RelayFramesResult<T>): RelayFramesResult<T> => {\n return [...results].sort((a, b) => {\n const frameDifference =\n (a.target.frameId ?? Number.MAX_SAFE_INTEGER) - (b.target.frameId ?? Number.MAX_SAFE_INTEGER);\n\n if (frameDifference !== 0) {\n return frameDifference;\n }\n\n return (a.target.documentId ?? \"\").localeCompare(b.target.documentId ?? \"\");\n });\n};\n"],"mappings":"AAAA,SAAQ,sBAAqB;AAE7B,SAAQ,mCAAkC;AAE1C;AAAA,EACI;AAAA,OAIG;AAEA,MAAM,+BAA+B,MAAM;AAAA,EACvC,YAA4B,WAAmB;AAClD,UAAM,sCAAsC,SAAS,KAAK;AAD3B;AAE/B,SAAK,OAAO;AAAA,EAChB;AAAA,EAHmC;AAIvC;AAEO,MAAM,sBAAsB,CAAI,QAA2B,YAAoC;AAAA,EAClG;AAAA,EACA,QAAQ;AAAA,EACR;AACJ;AAEO,MAAM,qBAAqB,CAC9B,QACA,OACA,UACuB;AAAA,EACvB;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,IACH;AAAA,IACA,GAAG,eAAe,KAAK;AAAA,EAC3B;AACJ;AAEO,MAAM,mBAAmB,CAAC,UAAwC;AACrE,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAErE,MACI,2HAA2H;AAAA,IACvH;AAAA,EACJ,GACF;AACE,WAAO,oBAAoB;AAAA,EAC/B;AAEA,SAAO,oBAAoB;AAC/B;AAEO,MAAM,wBAAwB,CAAC,SAAgE;AAClG,UAAQ,MAAM;AAAA,IACV,KAAK,4BAA4B;AAC7B,aAAO,oBAAoB;AAAA,IAC/B,KAAK,4BAA4B;AAC7B,aAAO,oBAAoB;AAAA,IAC/B,KAAK,4BAA4B;AAC7B,aAAO,oBAAoB;AAAA,IAC/B,KAAK,4BAA4B;AAC7B,aAAO,oBAAoB;AAAA,IAC/B,KAAK,4BAA4B;AAC7B,aAAO,oBAAoB;AAAA,IAC/B;AACI,YAAM,IAAI,UAAU,gDAAgD,IAAI,EAAE;AAAA,EAClF;AACJ;AAEO,MAAM,mBAAmB,CAAI,SAAqB,cAAmC;AACxF,MAAI,cAAc,QAAW;AACzB,WAAO;AAAA,EACX;AAEA,SAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AACvC,UAAM,UAAU,WAAW,MAAM,OAAO,IAAI,uBAAuB,SAAS,CAAC,GAAG,SAAS;AAEzF,YAAQ;AAAA,MACJ,YAAU;AACN,qBAAa,OAAO;AACpB,gBAAQ,MAAM;AAAA,MAClB;AAAA,MACA,WAAS;AACL,qBAAa,OAAO;AACpB,eAAO,KAAK;AAAA,MAChB;AAAA,IACJ;AAAA,EACJ,CAAC;AACL;AAEO,MAAM,wBAAwB,CAAI,YAAwD;AAC7F,SAAO,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;AAC/B,UAAM,mBACD,EAAE,OAAO,WAAW,OAAO,qBAAqB,EAAE,OAAO,WAAW,OAAO;AAEhF,QAAI,oBAAoB,GAAG;AACvB,aAAO;AAAA,IACX;AAEA,YAAQ,EAAE,OAAO,cAAc,IAAI,cAAc,EAAE,OAAO,cAAc,EAAE;AAAA,EAC9E,CAAC;AACL;","names":[]}
@@ -1,7 +1,7 @@
1
1
  import { ProxySandbox, RegisterSandbox } from "./providers/index.js";
2
- import type { DeepAsyncProxy } from "../types/helpers.js";
2
+ import type { RpcAsyncProxy } from "../types/rpc.js";
3
3
  export { ProxySandbox, RegisterSandbox };
4
4
  export interface SandboxRegistry {
5
5
  }
6
6
  export type SandboxName = Extract<keyof SandboxRegistry, string>;
7
- export type SandboxProxyTarget<N extends keyof SandboxRegistry> = DeepAsyncProxy<SandboxRegistry[N]>;
7
+ export type SandboxProxyTarget<N extends keyof SandboxRegistry> = RpcAsyncProxy<SandboxRegistry[N]>;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/sandbox/index.ts"],"sourcesContent":["import {ProxySandbox, RegisterSandbox} from \"./providers\";\n\nimport type {DeepAsyncProxy} from \"@typing/helpers\";\n\nexport {ProxySandbox, RegisterSandbox};\n\nexport interface SandboxRegistry {}\n\nexport type SandboxName = Extract<keyof SandboxRegistry, string>;\n\nexport type SandboxProxyTarget<N extends keyof SandboxRegistry> = DeepAsyncProxy<SandboxRegistry[N]>;\n"],"mappings":"AAAA,SAAQ,cAAc,uBAAsB;","names":[]}
1
+ {"version":3,"sources":["../../src/sandbox/index.ts"],"sourcesContent":["import {ProxySandbox, RegisterSandbox} from \"./providers\";\n\nimport type {RpcAsyncProxy} from \"@typing/rpc\";\n\nexport {ProxySandbox, RegisterSandbox};\n\nexport interface SandboxRegistry {}\n\nexport type SandboxName = Extract<keyof SandboxRegistry, string>;\n\nexport type SandboxProxyTarget<N extends keyof SandboxRegistry> = RpcAsyncProxy<SandboxRegistry[N]>;\n"],"mappings":"AAAA,SAAQ,cAAc,uBAAsB;","names":[]}
@@ -1,8 +1,8 @@
1
1
  import ProxyTransport from "../../transport/ProxyTransport.js";
2
- import type { DeepAsyncProxy } from "../../types/helpers.js";
2
+ import type { RpcAsyncProxy } from "../../types/rpc.js";
3
3
  import type { SandboxParameters } from "../../types/sandbox.js";
4
4
  import type { TransportDictionary, TransportManager, TransportName } from "../../types/transport.js";
5
- export default class<N extends TransportName, T = DeepAsyncProxy<TransportDictionary[N]>> extends ProxyTransport<N, T> {
5
+ export default class<N extends TransportName, T = RpcAsyncProxy<TransportDictionary[N]>> extends ProxyTransport<N, T> {
6
6
  private readonly parameters;
7
7
  constructor(name: N, parameters: SandboxParameters);
8
8
  protected manager(): TransportManager;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/sandbox/providers/ProxySandbox.ts"],"sourcesContent":["import ProxyTransport from \"@transport/ProxyTransport\";\n\nimport SandboxManager from \"../SandboxManager\";\nimport SandboxMessage from \"../SandboxMessage\";\n\nimport type {DeepAsyncProxy} from \"@typing/helpers\";\nimport type {SandboxParameters} from \"@typing/sandbox\";\nimport type {TransportDictionary, TransportManager, TransportName} from \"@typing/transport\";\n\nexport default class<N extends TransportName, T = DeepAsyncProxy<TransportDictionary[N]>> extends ProxyTransport<N, T> {\n constructor(\n name: N,\n private readonly parameters: SandboxParameters\n ) {\n super(name);\n }\n\n protected manager(): TransportManager {\n return SandboxManager.getInstance();\n }\n\n protected apply(args: any[], path?: string): Promise<any> {\n return SandboxMessage.for(this.name, this.parameters).send({path, args});\n }\n}\n"],"mappings":"AAAA,OAAO,oBAAoB;AAE3B,OAAO,oBAAoB;AAC3B,OAAO,oBAAoB;AAM3B,MAAO,6BAA2F,eAAqB;AAAA,EACnH,YACI,MACiB,YACnB;AACE,UAAM,IAAI;AAFO;AAAA,EAGrB;AAAA,EAHqB;AAAA,EAKX,UAA4B;AAClC,WAAO,eAAe,YAAY;AAAA,EACtC;AAAA,EAEU,MAAM,MAAa,MAA6B;AACtD,WAAO,eAAe,IAAI,KAAK,MAAM,KAAK,UAAU,EAAE,KAAK,EAAC,MAAM,KAAI,CAAC;AAAA,EAC3E;AACJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/sandbox/providers/ProxySandbox.ts"],"sourcesContent":["import ProxyTransport from \"@transport/ProxyTransport\";\n\nimport SandboxManager from \"../SandboxManager\";\nimport SandboxMessage from \"../SandboxMessage\";\n\nimport type {RpcAsyncProxy} from \"@typing/rpc\";\nimport type {SandboxParameters} from \"@typing/sandbox\";\nimport type {TransportDictionary, TransportManager, TransportName} from \"@typing/transport\";\n\nexport default class<N extends TransportName, T = RpcAsyncProxy<TransportDictionary[N]>> extends ProxyTransport<N, T> {\n constructor(\n name: N,\n private readonly parameters: SandboxParameters\n ) {\n super(name);\n }\n\n protected manager(): TransportManager {\n return SandboxManager.getInstance();\n }\n\n protected apply(args: any[], path?: string): Promise<any> {\n return SandboxMessage.for(this.name, this.parameters).send({path, args});\n }\n}\n"],"mappings":"AAAA,OAAO,oBAAoB;AAE3B,OAAO,oBAAoB;AAC3B,OAAO,oBAAoB;AAM3B,MAAO,6BAA0F,eAAqB;AAAA,EAClH,YACI,MACiB,YACnB;AACE,UAAM,IAAI;AAFO;AAAA,EAGrB;AAAA,EAHqB;AAAA,EAKX,UAA4B;AAClC,WAAO,eAAe,YAAY;AAAA,EACtC;AAAA,EAEU,MAAM,MAAa,MAA6B;AACtD,WAAO,eAAe,IAAI,KAAK,MAAM,KAAK,UAAU,EAAE,KAAK,EAAC,MAAM,KAAI,CAAC;AAAA,EAC3E;AACJ;","names":[]}
@@ -1,7 +1,7 @@
1
1
  import ProxyTransport from "../../transport/ProxyTransport.js";
2
- import type { DeepAsyncProxy } from "../../types/helpers.js";
2
+ import type { RpcAsyncProxy } from "../../types/rpc.js";
3
3
  import type { TransportDictionary, TransportManager, TransportMessage, TransportName } from "../../types/transport.js";
4
- export default class<N extends TransportName, T = DeepAsyncProxy<TransportDictionary[N]>> extends ProxyTransport<N, T> {
4
+ export default class<N extends TransportName, T = RpcAsyncProxy<TransportDictionary[N]>> extends ProxyTransport<N, T> {
5
5
  protected message: TransportMessage;
6
6
  constructor(name: N);
7
7
  protected manager(): TransportManager;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/service/providers/ProxyService.ts"],"sourcesContent":["import {isBackground} from \"@addon-core/browser\";\n\nimport ProxyTransport from \"@transport/ProxyTransport\";\n\nimport ServiceManager from \"../ServiceManager\";\nimport ServiceMessage from \"../ServiceMessage\";\n\nimport type {DeepAsyncProxy} from \"@typing/helpers\";\nimport type {TransportDictionary, TransportManager, TransportMessage, TransportName} from \"@typing/transport\";\n\nexport default class<N extends TransportName, T = DeepAsyncProxy<TransportDictionary[N]>> extends ProxyTransport<N, T> {\n protected message: TransportMessage;\n\n constructor(name: N) {\n super(name);\n this.message = new ServiceMessage(name);\n }\n\n protected manager(): TransportManager {\n return ServiceManager.getInstance();\n }\n\n protected async apply(args: any[], path?: string): Promise<any> {\n return this.message.send({path, args});\n }\n\n public get(): T {\n if (isBackground()) {\n throw new Error(\n `You are trying to get proxy service \"${this.name}\" from background. You can get original service instead`\n );\n }\n\n return super.get();\n }\n}\n"],"mappings":"AAAA,SAAQ,oBAAmB;AAE3B,OAAO,oBAAoB;AAE3B,OAAO,oBAAoB;AAC3B,OAAO,oBAAoB;AAK3B,MAAO,6BAA2F,eAAqB;AAAA,EACzG;AAAA,EAEV,YAAY,MAAS;AACjB,UAAM,IAAI;AACV,SAAK,UAAU,IAAI,eAAe,IAAI;AAAA,EAC1C;AAAA,EAEU,UAA4B;AAClC,WAAO,eAAe,YAAY;AAAA,EACtC;AAAA,EAEA,MAAgB,MAAM,MAAa,MAA6B;AAC5D,WAAO,KAAK,QAAQ,KAAK,EAAC,MAAM,KAAI,CAAC;AAAA,EACzC;AAAA,EAEO,MAAS;AACZ,QAAI,aAAa,GAAG;AAChB,YAAM,IAAI;AAAA,QACN,wCAAwC,KAAK,IAAI;AAAA,MACrD;AAAA,IACJ;AAEA,WAAO,MAAM,IAAI;AAAA,EACrB;AACJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/service/providers/ProxyService.ts"],"sourcesContent":["import {isBackground} from \"@addon-core/browser\";\n\nimport ProxyTransport from \"@transport/ProxyTransport\";\n\nimport ServiceManager from \"../ServiceManager\";\nimport ServiceMessage from \"../ServiceMessage\";\n\nimport type {RpcAsyncProxy} from \"@typing/rpc\";\nimport type {TransportDictionary, TransportManager, TransportMessage, TransportName} from \"@typing/transport\";\n\nexport default class<N extends TransportName, T = RpcAsyncProxy<TransportDictionary[N]>> extends ProxyTransport<N, T> {\n protected message: TransportMessage;\n\n constructor(name: N) {\n super(name);\n this.message = new ServiceMessage(name);\n }\n\n protected manager(): TransportManager {\n return ServiceManager.getInstance();\n }\n\n protected async apply(args: any[], path?: string): Promise<any> {\n return this.message.send({path, args});\n }\n\n public get(): T {\n if (isBackground()) {\n throw new Error(\n `You are trying to get proxy service \"${this.name}\" from background. You can get original service instead`\n );\n }\n\n return super.get();\n }\n}\n"],"mappings":"AAAA,SAAQ,oBAAmB;AAE3B,OAAO,oBAAoB;AAE3B,OAAO,oBAAoB;AAC3B,OAAO,oBAAoB;AAK3B,MAAO,6BAA0F,eAAqB;AAAA,EACxG;AAAA,EAEV,YAAY,MAAS;AACjB,UAAM,IAAI;AACV,SAAK,UAAU,IAAI,eAAe,IAAI;AAAA,EAC1C;AAAA,EAEU,UAA4B;AAClC,WAAO,eAAe,YAAY;AAAA,EACtC;AAAA,EAEA,MAAgB,MAAM,MAAa,MAA6B;AAC5D,WAAO,KAAK,QAAQ,KAAK,EAAC,MAAM,KAAI,CAAC;AAAA,EACzC;AAAA,EAEO,MAAS;AACZ,QAAI,aAAa,GAAG;AAChB,YAAM,IAAI;AAAA,QACN,wCAAwC,KAAK,IAAI;AAAA,MACrD;AAAA,IACJ;AAEA,WAAO,MAAM,IAAI;AAAA,EACrB;AACJ;","names":[]}
@@ -1,7 +1,7 @@
1
1
  import BaseTransport from "./BaseTransport.js";
2
- import type { DeepAsyncProxy } from "../types/helpers.js";
2
+ import type { RpcAsyncProxy } from "../types/rpc.js";
3
3
  import type { TransportDictionary, TransportName } from "../types/transport.js";
4
- export default abstract class<N extends TransportName, T = DeepAsyncProxy<TransportDictionary[N]>> extends BaseTransport<N, T> {
4
+ export default abstract class<N extends TransportName, T = RpcAsyncProxy<TransportDictionary[N]>> extends BaseTransport<N, T> {
5
5
  protected abstract apply(args: any[], path?: string): any;
6
6
  protected createProxy(path?: string): T;
7
7
  get(): T;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/transport/ProxyTransport.ts"],"sourcesContent":["import BaseTransport from \"./BaseTransport\";\n\nimport type {DeepAsyncProxy} from \"@typing/helpers\";\nimport type {TransportDictionary, TransportName} from \"@typing/transport\";\n\nexport default abstract class<\n N extends TransportName,\n T = DeepAsyncProxy<TransportDictionary[N]>,\n> extends BaseTransport<N, T> {\n protected abstract apply(args: any[], path?: string): any;\n\n protected createProxy(path?: string): T {\n const wrapped = () => {};\n\n const proxy = new Proxy(wrapped, {\n apply: async (_target, _thisArg, args) => this.apply(args, path),\n\n get: (_target, propertyName, receiver) => {\n if (propertyName === \"__proxy\" || typeof propertyName !== \"string\") {\n return Reflect.get(wrapped, propertyName, receiver);\n }\n\n const newPath = path == null ? propertyName : `${path}.${String(propertyName)}`;\n\n return this.createProxy(newPath);\n },\n });\n\n // @ts-expect-error — Adding a hidden property\n proxy.__proxy = true;\n\n return proxy as unknown as T;\n }\n\n public get(): T {\n return this.createProxy();\n }\n}\n"],"mappings":"AAAA,OAAO,mBAAmB;AAK1B,MAAO,+BAGG,cAAoB;AAAA,EAGhB,YAAY,MAAkB;AACpC,UAAM,UAAU,MAAM;AAAA,IAAC;AAEvB,UAAM,QAAQ,IAAI,MAAM,SAAS;AAAA,MAC7B,OAAO,OAAO,SAAS,UAAU,SAAS,KAAK,MAAM,MAAM,IAAI;AAAA,MAE/D,KAAK,CAAC,SAAS,cAAc,aAAa;AACtC,YAAI,iBAAiB,aAAa,OAAO,iBAAiB,UAAU;AAChE,iBAAO,QAAQ,IAAI,SAAS,cAAc,QAAQ;AAAA,QACtD;AAEA,cAAM,UAAU,QAAQ,OAAO,eAAe,GAAG,IAAI,IAAI,OAAO,YAAY,CAAC;AAE7E,eAAO,KAAK,YAAY,OAAO;AAAA,MACnC;AAAA,IACJ,CAAC;AAGD,UAAM,UAAU;AAEhB,WAAO;AAAA,EACX;AAAA,EAEO,MAAS;AACZ,WAAO,KAAK,YAAY;AAAA,EAC5B;AACJ;","names":[]}
1
+ {"version":3,"sources":["../../src/transport/ProxyTransport.ts"],"sourcesContent":["import BaseTransport from \"./BaseTransport\";\n\nimport type {RpcAsyncProxy} from \"@typing/rpc\";\nimport type {TransportDictionary, TransportName} from \"@typing/transport\";\n\nexport default abstract class<N extends TransportName, T = RpcAsyncProxy<TransportDictionary[N]>> extends BaseTransport<\n N,\n T\n> {\n protected abstract apply(args: any[], path?: string): any;\n\n protected createProxy(path?: string): T {\n const wrapped = () => {};\n\n const proxy = new Proxy(wrapped, {\n apply: async (_target, _thisArg, args) => this.apply(args, path),\n\n get: (_target, propertyName, receiver) => {\n if (propertyName === \"__proxy\" || typeof propertyName !== \"string\") {\n return Reflect.get(wrapped, propertyName, receiver);\n }\n\n const newPath = path == null ? propertyName : `${path}.${String(propertyName)}`;\n\n return this.createProxy(newPath);\n },\n });\n\n // @ts-expect-error — Adding a hidden property\n proxy.__proxy = true;\n\n return proxy as unknown as T;\n }\n\n public get(): T {\n return this.createProxy();\n }\n}\n"],"mappings":"AAAA,OAAO,mBAAmB;AAK1B,MAAO,+BAAmG,cAGxG;AAAA,EAGY,YAAY,MAAkB;AACpC,UAAM,UAAU,MAAM;AAAA,IAAC;AAEvB,UAAM,QAAQ,IAAI,MAAM,SAAS;AAAA,MAC7B,OAAO,OAAO,SAAS,UAAU,SAAS,KAAK,MAAM,MAAM,IAAI;AAAA,MAE/D,KAAK,CAAC,SAAS,cAAc,aAAa;AACtC,YAAI,iBAAiB,aAAa,OAAO,iBAAiB,UAAU;AAChE,iBAAO,QAAQ,IAAI,SAAS,cAAc,QAAQ;AAAA,QACtD;AAEA,cAAM,UAAU,QAAQ,OAAO,eAAe,GAAG,IAAI,IAAI,OAAO,YAAY,CAAC;AAE7E,eAAO,KAAK,YAAY,OAAO;AAAA,MACnC;AAAA,IACJ,CAAC;AAGD,UAAM,UAAU;AAEhB,WAAO;AAAA,EACX;AAAA,EAEO,MAAS;AACZ,WAAO,KAAK,YAAY;AAAA,EAC5B;AACJ;","names":[]}
@@ -1,4 +1,5 @@
1
- import type { DeepAsyncProxy } from "../types/helpers.js";
1
+ import type { RpcAsyncProxy } from "../types/rpc.js";
2
+ export type { RpcAsyncProxy, RpcAsyncProxyObject } from "../types/rpc.js";
2
3
  export type TransportTarget<T extends object, K extends keyof T> = T[K];
3
- export type TransportProxyTarget<T extends object, K extends keyof T> = DeepAsyncProxy<T[K]>;
4
+ export type TransportProxyTarget<T extends object, K extends keyof T> = RpcAsyncProxy<T[K]>;
4
5
  export type { TransportDefinition, TransportResolvedDefinition, TransportUnresolvedDefinition, TransportType, TransportOptions, } from "../types/transport.js";
@@ -6,8 +6,4 @@ export type PickNonFunctionProperties<T> = {
6
6
  export type ExcludeFunctionsFromProperties<T> = {
7
7
  [K in keyof T]: ExcludeFunction<T[K]>;
8
8
  };
9
- export type DeepAsyncProxy<T> = {
10
- [K in keyof T]: T[K] extends (...args: any[]) => any ? (...args: Parameters<T[K]>) => Promise<Awaited<ReturnType<T[K]>>> : T[K] extends object ? DeepAsyncProxyObject<T[K]> : () => Promise<Awaited<T[K]>>;
11
- };
12
- export type DeepAsyncProxyObject<T> = (() => Promise<DeepAsyncProxy<T>>) & DeepAsyncProxy<T>;
13
9
  export {};
@@ -66,6 +66,8 @@ export declare const LocaleValuesSeparator = "|";
66
66
  export declare const LocaleCustomKeyForLanguage = "locale";
67
67
  export declare const LocaleKeyMarker = "@";
68
68
  export declare const LanguageCodes: ReadonlySet<string>;
69
+ /** Native language names, independent of the selected UI language. */
70
+ export declare const LanguageNames: Readonly<Record<Language, string>>;
69
71
  export declare const LocaleFileExtensions: ReadonlySet<string>;
70
72
  export type LocaleValue = string | number | Array<string | number>;
71
73
  export type LocaleData = {
@@ -123,6 +125,7 @@ export type LocaleSubstitutionArgs<T, K extends keyof T> = string extends keyof
123
125
  export interface LocaleProvider<S> {
124
126
  lang(): Language;
125
127
  languages(): Set<Language>;
128
+ languageNames(): Map<Language, string>;
126
129
  keys(): ReadonlySet<keyof S>;
127
130
  trans<K extends LocaleNonPluralKeys<S>>(key: K, ...args: LocaleSubstitutionArgs<S, K>): string;
128
131
  choice<K extends LocalePluralKeys<S>>(key: K, count: number, ...args: LocaleSubstitutionArgs<S, K>): string;
@@ -68,10 +68,68 @@ const LocaleValuesSeparator = "|";
68
68
  const LocaleCustomKeyForLanguage = "locale";
69
69
  const LocaleKeyMarker = "@";
70
70
  const LanguageCodes = new Set(Object.values(Language));
71
+ const LanguageNames = Object.freeze({
72
+ ["ar" /* Arabic */]: "\u0627\u0644\u0639\u0631\u0628\u064A\u0629",
73
+ ["am" /* Amharic */]: "\u12A0\u121B\u122D\u129B",
74
+ ["bg" /* Bulgarian */]: "\u0411\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438",
75
+ ["bn" /* Bengali */]: "\u09AC\u09BE\u0982\u09B2\u09BE",
76
+ ["ca" /* Catalan */]: "Catal\xE0",
77
+ ["cs" /* Czech */]: "\u010Ce\u0161tina",
78
+ ["da" /* Danish */]: "Dansk",
79
+ ["de" /* German */]: "Deutsch",
80
+ ["el" /* Greek */]: "\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC",
81
+ ["en" /* English */]: "English",
82
+ ["en_AU" /* EnglishAustralia */]: "English (Australia)",
83
+ ["en_GB" /* EnglishGreatBritain */]: "English (United Kingdom)",
84
+ ["en_US" /* EnglishUSA */]: "English (United States)",
85
+ ["es" /* Spanish */]: "Espa\xF1ol",
86
+ ["es_419" /* SpanishLatinAmericaAndCaribbean */]: "Espa\xF1ol (Latinoam\xE9rica y el Caribe)",
87
+ ["et" /* Estonian */]: "Eesti",
88
+ ["fa" /* Persian */]: "\u0641\u0627\u0631\u0633\u06CC",
89
+ ["fi" /* Finnish */]: "Suomi",
90
+ ["fil" /* Filipino */]: "Filipino",
91
+ ["fr" /* French */]: "Fran\xE7ais",
92
+ ["gu" /* Gujarati */]: "\u0A97\u0AC1\u0A9C\u0AB0\u0ABE\u0AA4\u0AC0",
93
+ ["he" /* Hebrew */]: "\u05E2\u05D1\u05E8\u05D9\u05EA",
94
+ ["hi" /* Hindi */]: "\u0939\u093F\u0928\u094D\u0926\u0940",
95
+ ["hr" /* Croatian */]: "Hrvatski",
96
+ ["hu" /* Hungarian */]: "Magyar",
97
+ ["id" /* Indonesian */]: "Bahasa Indonesia",
98
+ ["it" /* Italian */]: "Italiano",
99
+ ["ja" /* Japanese */]: "\u65E5\u672C\u8A9E",
100
+ ["kn" /* Kannada */]: "\u0C95\u0CA8\u0CCD\u0CA8\u0CA1",
101
+ ["ko" /* Korean */]: "\uD55C\uAD6D\uC5B4",
102
+ ["lt" /* Lithuanian */]: "Lietuvi\u0173",
103
+ ["lv" /* Latvian */]: "Latvie\u0161u",
104
+ ["ml" /* Malayalam */]: "\u0D2E\u0D32\u0D2F\u0D3E\u0D33\u0D02",
105
+ ["mr" /* Marathi */]: "\u092E\u0930\u093E\u0920\u0940",
106
+ ["ms" /* Malay */]: "Bahasa Melayu",
107
+ ["nl" /* Dutch */]: "Nederlands",
108
+ ["no" /* Norwegian */]: "Norsk",
109
+ ["pl" /* Polish */]: "Polski",
110
+ ["pt_BR" /* PortugueseBrazil */]: "Portugu\xEAs (Brasil)",
111
+ ["pt_PT" /* PortuguesePortugal */]: "Portugu\xEAs (Portugal)",
112
+ ["ro" /* Romanian */]: "Rom\xE2n\u0103",
113
+ ["ru" /* Russian */]: "\u0420\u0443\u0441\u0441\u043A\u0438\u0439",
114
+ ["sk" /* Slovak */]: "Sloven\u010Dina",
115
+ ["sl" /* Slovenian */]: "Sloven\u0161\u010Dina",
116
+ ["sr" /* Serbian */]: "\u0421\u0440\u043F\u0441\u043A\u0438",
117
+ ["sv" /* Swedish */]: "Svenska",
118
+ ["sw" /* Swahili */]: "Kiswahili",
119
+ ["ta" /* Tamil */]: "\u0BA4\u0BAE\u0BBF\u0BB4\u0BCD",
120
+ ["te" /* Telugu */]: "\u0C24\u0C46\u0C32\u0C41\u0C17\u0C41",
121
+ ["th" /* Thai */]: "\u0E44\u0E17\u0E22",
122
+ ["tr" /* Turkish */]: "T\xFCrk\xE7e",
123
+ ["uk" /* Ukrainian */]: "\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430",
124
+ ["vi" /* Vietnamese */]: "Ti\u1EBFng Vi\u1EC7t",
125
+ ["zh_CN" /* ChineseChina */]: "\u4E2D\u6587\uFF08\u7B80\u4F53\uFF09",
126
+ ["zh_TW" /* ChineseTaiwan */]: "\u4E2D\u6587\uFF08\u7E41\u9AD4\uFF09"
127
+ });
71
128
  const LocaleFileExtensions = /* @__PURE__ */ new Set(["yaml", "yml", "json"]);
72
129
  export {
73
130
  Language,
74
131
  LanguageCodes,
132
+ LanguageNames,
75
133
  LocaleCustomKeyForLanguage,
76
134
  LocaleDir,
77
135
  LocaleFileExtensions,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/locale.ts"],"sourcesContent":["export enum Language {\n Arabic = \"ar\",\n Amharic = \"am\",\n Bulgarian = \"bg\",\n Bengali = \"bn\",\n Catalan = \"ca\",\n Czech = \"cs\",\n Danish = \"da\",\n German = \"de\",\n Greek = \"el\",\n English = \"en\",\n EnglishAustralia = \"en_AU\",\n EnglishGreatBritain = \"en_GB\",\n EnglishUSA = \"en_US\",\n Spanish = \"es\",\n SpanishLatinAmericaAndCaribbean = \"es_419\",\n Estonian = \"et\",\n Persian = \"fa\",\n Finnish = \"fi\",\n Filipino = \"fil\",\n French = \"fr\",\n Gujarati = \"gu\",\n Hebrew = \"he\",\n Hindi = \"hi\",\n Croatian = \"hr\",\n Hungarian = \"hu\",\n Indonesian = \"id\",\n Italian = \"it\",\n Japanese = \"ja\",\n Kannada = \"kn\",\n Korean = \"ko\",\n Lithuanian = \"lt\",\n Latvian = \"lv\",\n Malayalam = \"ml\",\n Marathi = \"mr\",\n Malay = \"ms\",\n Dutch = \"nl\",\n Norwegian = \"no\",\n Polish = \"pl\",\n PortugueseBrazil = \"pt_BR\",\n PortuguesePortugal = \"pt_PT\",\n Romanian = \"ro\",\n Russian = \"ru\",\n Slovak = \"sk\",\n Slovenian = \"sl\",\n Serbian = \"sr\",\n Swedish = \"sv\",\n Swahili = \"sw\",\n Tamil = \"ta\",\n Telugu = \"te\",\n Thai = \"th\",\n Turkish = \"tr\",\n Ukrainian = \"uk\",\n Vietnamese = \"vi\",\n ChineseChina = \"zh_CN\",\n ChineseTaiwan = \"zh_TW\",\n}\n\nexport enum LocaleDir {\n RightToLeft = \"rtl\",\n LeftToRight = \"ltr\",\n}\n\nexport const RtlLanguages: ReadonlySet<Language> = new Set([Language.Arabic, Language.Persian, Language.Hebrew]);\n\nexport const LocaleNestedKeysSeparator = \".\";\n\nexport const LocaleKeysSeparator = \"_\";\n\nexport const LocaleValuesSeparator = \"|\";\n\nexport const LocaleCustomKeyForLanguage = \"locale\";\n\nexport const LocaleKeyMarker = \"@\";\n\nexport const LanguageCodes: ReadonlySet<string> = new Set(Object.values(Language));\n\nexport const LocaleFileExtensions: ReadonlySet<string> = new Set([\"yaml\", \"yml\", \"json\"]);\n\nexport type LocaleValue = string | number | Array<string | number>;\n\nexport type LocaleData = {\n [key: string]: LocaleValue | LocaleData;\n};\n\nexport type LocaleItems = Map<string, string>;\n\nexport type LocaleKeys = ReadonlySet<string>;\n\nexport type LocaleMessages = {\n [key: string]: {\n message: string;\n };\n};\n\nexport interface LocaleBuilder {\n lang(): Language;\n\n merge(data: LocaleData): this;\n\n build(): LocaleMessages;\n\n get(): LocaleItems;\n\n keys(): LocaleKeys;\n\n structure(): LocaleStructure;\n\n isValid(): boolean;\n\n validate(): this;\n}\n\nexport type LocaleBuilders = Map<Language, LocaleBuilder>;\n\nexport interface LocaleValidator {\n isValid(locale: LocaleBuilder): boolean;\n\n validate(locale: LocaleBuilder): this;\n}\n\nexport interface LocaleContractValidator {\n isValid(builders: LocaleBuilders): boolean;\n\n validate(builders: LocaleBuilders): this;\n}\n\nexport interface LocaleFutures {\n plural: boolean;\n substitutions: readonly string[];\n}\n\nexport interface LocaleStructure {\n [key: string]: LocaleFutures;\n}\n\nexport type LocaleNonPluralKeys<T> = {\n [K in keyof T]: T[K] extends {plural: false} ? K : never;\n}[keyof T] &\n string;\n\nexport type LocalePluralKeys<T> = {\n [K in keyof T]: T[K] extends {plural: true} ? K : never;\n}[keyof T] &\n string;\n\nexport type LocaleSubstitutionValue = string | number;\n\nexport type LocaleSubstitutionKeys<T, K extends keyof T> = T[K] extends {substitutions: readonly (infer U)[]}\n ? U & string\n : never;\n\nexport type LocaleSubstitutionsFor<T, K extends keyof T> = [LocaleSubstitutionKeys<T, K>] extends [never]\n ? never\n : Record<LocaleSubstitutionKeys<T, K>, LocaleSubstitutionValue>;\n\nexport type LocaleSubstitutionArgs<T, K extends keyof T> = string extends keyof T\n ? [substitutions?: Record<string, LocaleSubstitutionValue>]\n : [LocaleSubstitutionKeys<T, K>] extends [never]\n ? []\n : [substitutions: LocaleSubstitutionsFor<T, K>];\n\nexport interface LocaleProvider<S> {\n lang(): Language;\n\n languages(): Set<Language>;\n\n keys(): ReadonlySet<keyof S>;\n\n // non-plural keys\n trans<K extends LocaleNonPluralKeys<S>>(key: K, ...args: LocaleSubstitutionArgs<S, K>): string;\n\n // plural keys\n choice<K extends LocalePluralKeys<S>>(key: K, count: number, ...args: LocaleSubstitutionArgs<S, K>): string;\n}\n\nexport interface LocaleDynamicProvider<S> extends LocaleProvider<S> {\n change(lang: Language): Promise<Language>;\n}\n"],"mappings":"AAAO,IAAK,WAAL,kBAAKA,cAAL;AACH,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,eAAY;AACZ,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,sBAAmB;AACnB,EAAAA,UAAA,yBAAsB;AACtB,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,qCAAkC;AAClC,EAAAA,UAAA,cAAW;AACX,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,cAAW;AACX,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,cAAW;AACX,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,cAAW;AACX,EAAAA,UAAA,eAAY;AACZ,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,cAAW;AACX,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,eAAY;AACZ,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,eAAY;AACZ,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,sBAAmB;AACnB,EAAAA,UAAA,wBAAqB;AACrB,EAAAA,UAAA,cAAW;AACX,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,eAAY;AACZ,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,WAAQ;AACR,EAAAA,UAAA,YAAS;AACT,EAAAA,UAAA,UAAO;AACP,EAAAA,UAAA,aAAU;AACV,EAAAA,UAAA,eAAY;AACZ,EAAAA,UAAA,gBAAa;AACb,EAAAA,UAAA,kBAAe;AACf,EAAAA,UAAA,mBAAgB;AAvDR,SAAAA;AAAA,GAAA;AA0DL,IAAK,YAAL,kBAAKC,eAAL;AACH,EAAAA,WAAA,iBAAc;AACd,EAAAA,WAAA,iBAAc;AAFN,SAAAA;AAAA,GAAA;AAKL,MAAM,eAAsC,oBAAI,IAAI,CAAC,mBAAiB,oBAAkB,iBAAe,CAAC;AAExG,MAAM,4BAA4B;AAElC,MAAM,sBAAsB;AAE5B,MAAM,wBAAwB;AAE9B,MAAM,6BAA6B;AAEnC,MAAM,kBAAkB;AAExB,MAAM,gBAAqC,IAAI,IAAI,OAAO,OAAO,QAAQ,CAAC;AAE1E,MAAM,uBAA4C,oBAAI,IAAI,CAAC,QAAQ,OAAO,MAAM,CAAC;","names":["Language","LocaleDir"]}
1
+ {"version":3,"sources":["../../src/types/locale.ts"],"sourcesContent":["export enum Language {\n Arabic = \"ar\",\n Amharic = \"am\",\n Bulgarian = \"bg\",\n Bengali = \"bn\",\n Catalan = \"ca\",\n Czech = \"cs\",\n Danish = \"da\",\n German = \"de\",\n Greek = \"el\",\n English = \"en\",\n EnglishAustralia = \"en_AU\",\n EnglishGreatBritain = \"en_GB\",\n EnglishUSA = \"en_US\",\n Spanish = \"es\",\n SpanishLatinAmericaAndCaribbean = \"es_419\",\n Estonian = \"et\",\n Persian = \"fa\",\n Finnish = \"fi\",\n Filipino = \"fil\",\n French = \"fr\",\n Gujarati = \"gu\",\n Hebrew = \"he\",\n Hindi = \"hi\",\n Croatian = \"hr\",\n Hungarian = \"hu\",\n Indonesian = \"id\",\n Italian = \"it\",\n Japanese = \"ja\",\n Kannada = \"kn\",\n Korean = \"ko\",\n Lithuanian = \"lt\",\n Latvian = \"lv\",\n Malayalam = \"ml\",\n Marathi = \"mr\",\n Malay = \"ms\",\n Dutch = \"nl\",\n Norwegian = \"no\",\n Polish = \"pl\",\n PortugueseBrazil = \"pt_BR\",\n PortuguesePortugal = \"pt_PT\",\n Romanian = \"ro\",\n Russian = \"ru\",\n Slovak = \"sk\",\n Slovenian = \"sl\",\n Serbian = \"sr\",\n Swedish = \"sv\",\n Swahili = \"sw\",\n Tamil = \"ta\",\n Telugu = \"te\",\n Thai = \"th\",\n Turkish = \"tr\",\n Ukrainian = \"uk\",\n Vietnamese = \"vi\",\n ChineseChina = \"zh_CN\",\n ChineseTaiwan = \"zh_TW\",\n}\n\nexport enum LocaleDir {\n RightToLeft = \"rtl\",\n LeftToRight = \"ltr\",\n}\n\nexport const RtlLanguages: ReadonlySet<Language> = new Set([Language.Arabic, Language.Persian, Language.Hebrew]);\n\nexport const LocaleNestedKeysSeparator = \".\";\n\nexport const LocaleKeysSeparator = \"_\";\n\nexport const LocaleValuesSeparator = \"|\";\n\nexport const LocaleCustomKeyForLanguage = \"locale\";\n\nexport const LocaleKeyMarker = \"@\";\n\nexport const LanguageCodes: ReadonlySet<string> = new Set(Object.values(Language));\n\n/** Native language names, independent of the selected UI language. */\nexport const LanguageNames: Readonly<Record<Language, string>> = Object.freeze({\n [Language.Arabic]: \"العربية\",\n [Language.Amharic]: \"አማርኛ\",\n [Language.Bulgarian]: \"Български\",\n [Language.Bengali]: \"বাংলা\",\n [Language.Catalan]: \"Català\",\n [Language.Czech]: \"Čeština\",\n [Language.Danish]: \"Dansk\",\n [Language.German]: \"Deutsch\",\n [Language.Greek]: \"Ελληνικά\",\n [Language.English]: \"English\",\n [Language.EnglishAustralia]: \"English (Australia)\",\n [Language.EnglishGreatBritain]: \"English (United Kingdom)\",\n [Language.EnglishUSA]: \"English (United States)\",\n [Language.Spanish]: \"Español\",\n [Language.SpanishLatinAmericaAndCaribbean]: \"Español (Latinoamérica y el Caribe)\",\n [Language.Estonian]: \"Eesti\",\n [Language.Persian]: \"فارسی\",\n [Language.Finnish]: \"Suomi\",\n [Language.Filipino]: \"Filipino\",\n [Language.French]: \"Français\",\n [Language.Gujarati]: \"ગુજરાતી\",\n [Language.Hebrew]: \"עברית\",\n [Language.Hindi]: \"हिन्दी\",\n [Language.Croatian]: \"Hrvatski\",\n [Language.Hungarian]: \"Magyar\",\n [Language.Indonesian]: \"Bahasa Indonesia\",\n [Language.Italian]: \"Italiano\",\n [Language.Japanese]: \"日本語\",\n [Language.Kannada]: \"ಕನ್ನಡ\",\n [Language.Korean]: \"한국어\",\n [Language.Lithuanian]: \"Lietuvių\",\n [Language.Latvian]: \"Latviešu\",\n [Language.Malayalam]: \"മലയാളം\",\n [Language.Marathi]: \"मराठी\",\n [Language.Malay]: \"Bahasa Melayu\",\n [Language.Dutch]: \"Nederlands\",\n [Language.Norwegian]: \"Norsk\",\n [Language.Polish]: \"Polski\",\n [Language.PortugueseBrazil]: \"Português (Brasil)\",\n [Language.PortuguesePortugal]: \"Português (Portugal)\",\n [Language.Romanian]: \"Română\",\n [Language.Russian]: \"Русский\",\n [Language.Slovak]: \"Slovenčina\",\n [Language.Slovenian]: \"Slovenščina\",\n [Language.Serbian]: \"Српски\",\n [Language.Swedish]: \"Svenska\",\n [Language.Swahili]: \"Kiswahili\",\n [Language.Tamil]: \"தமிழ்\",\n [Language.Telugu]: \"తెలుగు\",\n [Language.Thai]: \"ไทย\",\n [Language.Turkish]: \"Türkçe\",\n [Language.Ukrainian]: \"Українська\",\n [Language.Vietnamese]: \"Tiếng Việt\",\n [Language.ChineseChina]: \"中文(简体)\",\n [Language.ChineseTaiwan]: \"中文(繁體)\",\n});\n\nexport const LocaleFileExtensions: ReadonlySet<string> = new Set([\"yaml\", \"yml\", \"json\"]);\n\nexport type LocaleValue = string | number | Array<string | number>;\n\nexport type LocaleData = {\n [key: string]: LocaleValue | LocaleData;\n};\n\nexport type LocaleItems = Map<string, string>;\n\nexport type LocaleKeys = ReadonlySet<string>;\n\nexport type LocaleMessages = {\n [key: string]: {\n message: string;\n };\n};\n\nexport interface LocaleBuilder {\n lang(): Language;\n\n merge(data: LocaleData): this;\n\n build(): LocaleMessages;\n\n get(): LocaleItems;\n\n keys(): LocaleKeys;\n\n structure(): LocaleStructure;\n\n isValid(): boolean;\n\n validate(): this;\n}\n\nexport type LocaleBuilders = Map<Language, LocaleBuilder>;\n\nexport interface LocaleValidator {\n isValid(locale: LocaleBuilder): boolean;\n\n validate(locale: LocaleBuilder): this;\n}\n\nexport interface LocaleContractValidator {\n isValid(builders: LocaleBuilders): boolean;\n\n validate(builders: LocaleBuilders): this;\n}\n\nexport interface LocaleFutures {\n plural: boolean;\n substitutions: readonly string[];\n}\n\nexport interface LocaleStructure {\n [key: string]: LocaleFutures;\n}\n\nexport type LocaleNonPluralKeys<T> = {\n [K in keyof T]: T[K] extends {plural: false} ? K : never;\n}[keyof T] &\n string;\n\nexport type LocalePluralKeys<T> = {\n [K in keyof T]: T[K] extends {plural: true} ? K : never;\n}[keyof T] &\n string;\n\nexport type LocaleSubstitutionValue = string | number;\n\nexport type LocaleSubstitutionKeys<T, K extends keyof T> = T[K] extends {substitutions: readonly (infer U)[]}\n ? U & string\n : never;\n\nexport type LocaleSubstitutionsFor<T, K extends keyof T> = [LocaleSubstitutionKeys<T, K>] extends [never]\n ? never\n : Record<LocaleSubstitutionKeys<T, K>, LocaleSubstitutionValue>;\n\nexport type LocaleSubstitutionArgs<T, K extends keyof T> = string extends keyof T\n ? [substitutions?: Record<string, LocaleSubstitutionValue>]\n : [LocaleSubstitutionKeys<T, K>] extends [never]\n ? []\n : [substitutions: LocaleSubstitutionsFor<T, K>];\n\nexport interface LocaleProvider<S> {\n lang(): Language;\n\n languages(): Set<Language>;\n\n languageNames(): Map<Language, string>;\n\n keys(): ReadonlySet<keyof S>;\n\n // non-plural keys\n trans<K extends LocaleNonPluralKeys<S>>(key: K, ...args: LocaleSubstitutionArgs<S, K>): string;\n\n // plural keys\n choice<K extends LocalePluralKeys<S>>(key: K, count: number, ...args: LocaleSubstitutionArgs<S, K>): string;\n}\n\nexport interface LocaleDynamicProvider<S> extends LocaleProvider<S> {\n change(lang: Language): Promise<Language>;\n}\n"],"mappings":"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","names":["Language","LocaleDir"]}