@lukso/core 1.0.0-dev.e515cef → 1.1.0-dev.5916302

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.
@@ -0,0 +1,159 @@
1
+ // src/utils/browserInfo.ts
2
+ var EXTENSION_STORE_LINKS = {
3
+ chrome: "https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn",
4
+ brave: "https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn",
5
+ edge: "https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn",
6
+ opera: "",
7
+ safari: "",
8
+ firefox: ""
9
+ };
10
+ var browserInfo = (deviceService) => {
11
+ const browserInfoDefaults = {
12
+ id: "chrome",
13
+ name: "",
14
+ icon: ""
15
+ };
16
+ const detectBrowser = () => {
17
+ const { isChrome, isBrave, isFirefox, isSafari, isEdge, isOpera } = deviceService;
18
+ if (isBrave) {
19
+ return {
20
+ id: "brave",
21
+ name: "Brave",
22
+ icon: "logo-brave",
23
+ storeLink: EXTENSION_STORE_LINKS.brave
24
+ };
25
+ }
26
+ if (isEdge) {
27
+ return {
28
+ id: "edge",
29
+ name: "Edge",
30
+ icon: "logo-edge",
31
+ storeLink: EXTENSION_STORE_LINKS.edge
32
+ };
33
+ }
34
+ if (isOpera) {
35
+ return {
36
+ id: "opera",
37
+ name: "Opera",
38
+ icon: "logo-opera",
39
+ storeLink: EXTENSION_STORE_LINKS.opera
40
+ };
41
+ }
42
+ if (isChrome) {
43
+ return {
44
+ id: "chrome",
45
+ name: "Chrome",
46
+ icon: "logo-chrome",
47
+ storeLink: EXTENSION_STORE_LINKS.chrome
48
+ };
49
+ }
50
+ if (isFirefox) {
51
+ return {
52
+ id: "firefox",
53
+ name: "Firefox",
54
+ icon: "logo-firefox",
55
+ storeLink: EXTENSION_STORE_LINKS.firefox
56
+ };
57
+ }
58
+ if (isSafari) {
59
+ return {
60
+ id: "safari",
61
+ name: "Safari",
62
+ icon: "logo-safari",
63
+ storeLink: EXTENSION_STORE_LINKS.safari
64
+ };
65
+ }
66
+ };
67
+ const browserInfo2 = { ...browserInfoDefaults, ...detectBrowser() };
68
+ return browserInfo2;
69
+ };
70
+
71
+ // src/utils/slug.ts
72
+ var slug = (value) => {
73
+ if (!value) {
74
+ return "";
75
+ }
76
+ return value.toLowerCase().replace(/\s+/g, "-");
77
+ };
78
+
79
+ // src/utils/url-resolver.ts
80
+ var UrlConverter = class {
81
+ /**
82
+ * It will relatively append pathname or hostname to the destination URL
83
+ *
84
+ * For example:
85
+ * destination=https://some.api.gateway/something/ipfs
86
+ * url=ipfs://QmSomeHash
87
+ * output=https://some.api.gateway/something/ipfs/QmSomeHash
88
+ *
89
+ * destination=https://some.api.gateway/something/ipfs
90
+ * url=https://something.com/somewhere
91
+ * output=https://some.api.gateway/something/ipfs/somewhere
92
+ *
93
+ * @param destination destination string | URL
94
+ */
95
+ constructor(destination) {
96
+ this.destination = new URL(destination);
97
+ if (this.destination.pathname.at(-1) !== "/") {
98
+ this.destination.pathname += "/";
99
+ }
100
+ }
101
+ resolveUrl(url) {
102
+ const source = new URL(url);
103
+ const relativePath = source.pathname ? `./${source.hostname}${source.pathname}` : `./${source.hostname}`;
104
+ const out = new URL(relativePath, this.destination);
105
+ out.pathname = out.pathname.replaceAll(/\/\/+/g, "/");
106
+ return out.toString();
107
+ }
108
+ };
109
+ var UrlResolver = class {
110
+ constructor(converters) {
111
+ this.converters = [];
112
+ for (const item of converters) {
113
+ const [match, _converter] = item;
114
+ if (match == null) {
115
+ throw new TypeError("Match criteria not defined");
116
+ }
117
+ const converter = typeof _converter === "string" ? new UrlConverter(_converter) : _converter;
118
+ if (!(converter instanceof UrlConverter)) {
119
+ throw new TypeError("Invalid converter");
120
+ }
121
+ this.converters.push({ match, converter });
122
+ }
123
+ }
124
+ /**
125
+ * Resolves a URL to a gateway URL.
126
+ * Supports possible multiple converters transforming the URL
127
+ * in sequence until no converter matches.
128
+ *
129
+ * @param {string} url to resolve
130
+ * @returns {string} resolved url (if resolver is found, otherwise the parameter url is returned)
131
+ */
132
+ resolveUrl(url_) {
133
+ let url = url_;
134
+ const current = new Set(this.converters);
135
+ let found = true;
136
+ while (found) {
137
+ found = false;
138
+ for (const entry of current) {
139
+ const { match, converter } = entry;
140
+ if (match instanceof RegExp ? match.test(url) : url.startsWith(match)) {
141
+ url = converter.resolveUrl(url);
142
+ current.delete(entry);
143
+ found = true;
144
+ break;
145
+ }
146
+ }
147
+ }
148
+ return url;
149
+ }
150
+ };
151
+
152
+ export {
153
+ EXTENSION_STORE_LINKS,
154
+ browserInfo,
155
+ slug,
156
+ UrlConverter,
157
+ UrlResolver
158
+ };
159
+ //# sourceMappingURL=chunk-GFLV5EJV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/browserInfo.ts","../src/utils/slug.ts","../src/utils/url-resolver.ts"],"sourcesContent":["import type { DeviceService } from '../services'\n\nexport type BrowserName =\n | 'chrome'\n | 'safari'\n | 'firefox'\n | 'edge'\n | 'opera'\n | 'brave'\n\nexport type BrowserInfo = {\n id: BrowserName\n name: string\n icon: string\n storeLink: string\n}\n\n// extension store links (all webkit based browsers use chrome web store installation)\nexport const EXTENSION_STORE_LINKS = {\n chrome:\n 'https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn',\n brave:\n 'https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn',\n edge: 'https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn',\n opera: '',\n safari: '',\n firefox: '',\n}\n\n/**\n * Expose browser info to the app\n */\nexport const browserInfo = (deviceService: DeviceService): BrowserInfo => {\n const browserInfoDefaults = {\n id: 'chrome',\n name: '',\n icon: '',\n } as BrowserInfo\n\n const detectBrowser = (): BrowserInfo | undefined => {\n const { isChrome, isBrave, isFirefox, isSafari, isEdge, isOpera } =\n deviceService\n\n if (isBrave) {\n return {\n id: 'brave',\n name: 'Brave',\n icon: 'logo-brave',\n storeLink: EXTENSION_STORE_LINKS.brave,\n }\n }\n\n if (isEdge) {\n return {\n id: 'edge',\n name: 'Edge',\n icon: 'logo-edge',\n storeLink: EXTENSION_STORE_LINKS.edge,\n }\n }\n\n if (isOpera) {\n return {\n id: 'opera',\n name: 'Opera',\n icon: 'logo-opera',\n storeLink: EXTENSION_STORE_LINKS.opera,\n }\n }\n\n if (isChrome) {\n return {\n id: 'chrome',\n name: 'Chrome',\n icon: 'logo-chrome',\n storeLink: EXTENSION_STORE_LINKS.chrome,\n }\n }\n\n if (isFirefox) {\n return {\n id: 'firefox',\n name: 'Firefox',\n icon: 'logo-firefox',\n storeLink: EXTENSION_STORE_LINKS.firefox,\n }\n }\n\n if (isSafari) {\n return {\n id: 'safari',\n name: 'Safari',\n icon: 'logo-safari',\n storeLink: EXTENSION_STORE_LINKS.safari,\n }\n }\n }\n\n const browserInfo = { ...browserInfoDefaults, ...detectBrowser() }\n\n return browserInfo\n}\n","/**\n * Make slug from text\n *\n * @param value\n * @returns\n */\nexport const slug = (value?: string) => {\n if (!value) {\n return ''\n }\n\n return value.toLowerCase().replace(/\\s+/g, '-') // convert spaces to hyphens\n}\n","export class UrlConverter {\n private destination: URL\n /**\n * It will relatively append pathname or hostname to the destination URL\n *\n * For example:\n * destination=https://some.api.gateway/something/ipfs\n * url=ipfs://QmSomeHash\n * output=https://some.api.gateway/something/ipfs/QmSomeHash\n *\n * destination=https://some.api.gateway/something/ipfs\n * url=https://something.com/somewhere\n * output=https://some.api.gateway/something/ipfs/somewhere\n *\n * @param destination destination string | URL\n */\n constructor(destination: string | URL) {\n this.destination = new URL(destination)\n if (this.destination.pathname.at(-1) !== '/') {\n this.destination.pathname += '/'\n }\n }\n\n resolveUrl(url: string): string {\n // Parse and convert to javascript URL objects\n // this will manage / and relative paths for us.\n const source = new URL(url)\n // extract the relative path. For URLs with a pathname prepend \".\" to make it ./ (i.e. relative)\n // for anything that only has a hostname we prepend ./ to make it relative\n // the pathname is at least slash for https urls, but '' for ipfs for example\n const relativePath = source.pathname\n ? `./${source.hostname}${source.pathname}` // pathname always starts with at least a slash\n : `./${source.hostname}`\n // Construct relative URL on destination using the relative pathname.\n const out = new URL(relativePath, this.destination)\n out.pathname = out.pathname.replaceAll(/\\/\\/+/g, '/')\n return out.toString()\n }\n}\n\nexport class UrlResolver {\n private converters: Array<{\n match: string | RegExp\n converter: UrlConverter\n }> = []\n constructor(converters: Array<[string | RegExp, UrlConverter | string]>) {\n for (const item of converters) {\n const [match, _converter] = item\n if (match == null) {\n throw new TypeError('Match criteria not defined')\n }\n const converter =\n typeof _converter === 'string'\n ? new UrlConverter(_converter)\n : _converter\n if (!(converter instanceof UrlConverter)) {\n throw new TypeError('Invalid converter')\n }\n this.converters.push({ match, converter })\n }\n }\n\n /**\n * Resolves a URL to a gateway URL.\n * Supports possible multiple converters transforming the URL\n * in sequence until no converter matches.\n *\n * @param {string} url to resolve\n * @returns {string} resolved url (if resolver is found, otherwise the parameter url is returned)\n */\n resolveUrl(url_: string): string {\n let url = url_\n const current = new Set<{\n match: string | RegExp\n converter: UrlConverter\n }>(this.converters)\n let found = true\n while (found) {\n found = false\n for (const entry of current) {\n const { match, converter } = entry\n if (match instanceof RegExp ? match.test(url) : url.startsWith(match)) {\n url = converter.resolveUrl(url)\n // This converter matches, so don't use it again.\n current.delete(entry)\n found = true\n break\n }\n }\n }\n return url\n }\n}\n"],"mappings":"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","names":["browserInfo"]}
@@ -0,0 +1,159 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/utils/browserInfo.ts
2
+ var EXTENSION_STORE_LINKS = {
3
+ chrome: "https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn",
4
+ brave: "https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn",
5
+ edge: "https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn",
6
+ opera: "",
7
+ safari: "",
8
+ firefox: ""
9
+ };
10
+ var browserInfo = (deviceService) => {
11
+ const browserInfoDefaults = {
12
+ id: "chrome",
13
+ name: "",
14
+ icon: ""
15
+ };
16
+ const detectBrowser = () => {
17
+ const { isChrome, isBrave, isFirefox, isSafari, isEdge, isOpera } = deviceService;
18
+ if (isBrave) {
19
+ return {
20
+ id: "brave",
21
+ name: "Brave",
22
+ icon: "logo-brave",
23
+ storeLink: EXTENSION_STORE_LINKS.brave
24
+ };
25
+ }
26
+ if (isEdge) {
27
+ return {
28
+ id: "edge",
29
+ name: "Edge",
30
+ icon: "logo-edge",
31
+ storeLink: EXTENSION_STORE_LINKS.edge
32
+ };
33
+ }
34
+ if (isOpera) {
35
+ return {
36
+ id: "opera",
37
+ name: "Opera",
38
+ icon: "logo-opera",
39
+ storeLink: EXTENSION_STORE_LINKS.opera
40
+ };
41
+ }
42
+ if (isChrome) {
43
+ return {
44
+ id: "chrome",
45
+ name: "Chrome",
46
+ icon: "logo-chrome",
47
+ storeLink: EXTENSION_STORE_LINKS.chrome
48
+ };
49
+ }
50
+ if (isFirefox) {
51
+ return {
52
+ id: "firefox",
53
+ name: "Firefox",
54
+ icon: "logo-firefox",
55
+ storeLink: EXTENSION_STORE_LINKS.firefox
56
+ };
57
+ }
58
+ if (isSafari) {
59
+ return {
60
+ id: "safari",
61
+ name: "Safari",
62
+ icon: "logo-safari",
63
+ storeLink: EXTENSION_STORE_LINKS.safari
64
+ };
65
+ }
66
+ };
67
+ const browserInfo2 = { ...browserInfoDefaults, ...detectBrowser() };
68
+ return browserInfo2;
69
+ };
70
+
71
+ // src/utils/slug.ts
72
+ var slug = (value) => {
73
+ if (!value) {
74
+ return "";
75
+ }
76
+ return value.toLowerCase().replace(/\s+/g, "-");
77
+ };
78
+
79
+ // src/utils/url-resolver.ts
80
+ var UrlConverter = class {
81
+ /**
82
+ * It will relatively append pathname or hostname to the destination URL
83
+ *
84
+ * For example:
85
+ * destination=https://some.api.gateway/something/ipfs
86
+ * url=ipfs://QmSomeHash
87
+ * output=https://some.api.gateway/something/ipfs/QmSomeHash
88
+ *
89
+ * destination=https://some.api.gateway/something/ipfs
90
+ * url=https://something.com/somewhere
91
+ * output=https://some.api.gateway/something/ipfs/somewhere
92
+ *
93
+ * @param destination destination string | URL
94
+ */
95
+ constructor(destination) {
96
+ this.destination = new URL(destination);
97
+ if (this.destination.pathname.at(-1) !== "/") {
98
+ this.destination.pathname += "/";
99
+ }
100
+ }
101
+ resolveUrl(url) {
102
+ const source = new URL(url);
103
+ const relativePath = source.pathname ? `./${source.hostname}${source.pathname}` : `./${source.hostname}`;
104
+ const out = new URL(relativePath, this.destination);
105
+ out.pathname = out.pathname.replaceAll(/\/\/+/g, "/");
106
+ return out.toString();
107
+ }
108
+ };
109
+ var UrlResolver = class {
110
+ constructor(converters) {
111
+ this.converters = [];
112
+ for (const item of converters) {
113
+ const [match, _converter] = item;
114
+ if (match == null) {
115
+ throw new TypeError("Match criteria not defined");
116
+ }
117
+ const converter = typeof _converter === "string" ? new UrlConverter(_converter) : _converter;
118
+ if (!(converter instanceof UrlConverter)) {
119
+ throw new TypeError("Invalid converter");
120
+ }
121
+ this.converters.push({ match, converter });
122
+ }
123
+ }
124
+ /**
125
+ * Resolves a URL to a gateway URL.
126
+ * Supports possible multiple converters transforming the URL
127
+ * in sequence until no converter matches.
128
+ *
129
+ * @param {string} url to resolve
130
+ * @returns {string} resolved url (if resolver is found, otherwise the parameter url is returned)
131
+ */
132
+ resolveUrl(url_) {
133
+ let url = url_;
134
+ const current = new Set(this.converters);
135
+ let found = true;
136
+ while (found) {
137
+ found = false;
138
+ for (const entry of current) {
139
+ const { match, converter } = entry;
140
+ if (match instanceof RegExp ? match.test(url) : url.startsWith(match)) {
141
+ url = converter.resolveUrl(url);
142
+ current.delete(entry);
143
+ found = true;
144
+ break;
145
+ }
146
+ }
147
+ }
148
+ return url;
149
+ }
150
+ };
151
+
152
+
153
+
154
+
155
+
156
+
157
+
158
+ exports.EXTENSION_STORE_LINKS = EXTENSION_STORE_LINKS; exports.browserInfo = browserInfo; exports.slug = slug; exports.UrlConverter = UrlConverter; exports.UrlResolver = UrlResolver;
159
+ //# sourceMappingURL=chunk-QU6NUTY6.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-QU6NUTY6.cjs","../src/utils/browserInfo.ts","../src/utils/slug.ts","../src/utils/url-resolver.ts"],"names":["browserInfo"],"mappings":"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","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-QU6NUTY6.cjs","sourcesContent":[null,"import type { DeviceService } from '../services'\n\nexport type BrowserName =\n | 'chrome'\n | 'safari'\n | 'firefox'\n | 'edge'\n | 'opera'\n | 'brave'\n\nexport type BrowserInfo = {\n id: BrowserName\n name: string\n icon: string\n storeLink: string\n}\n\n// extension store links (all webkit based browsers use chrome web store installation)\nexport const EXTENSION_STORE_LINKS = {\n chrome:\n 'https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn',\n brave:\n 'https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn',\n edge: 'https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn',\n opera: '',\n safari: '',\n firefox: '',\n}\n\n/**\n * Expose browser info to the app\n */\nexport const browserInfo = (deviceService: DeviceService): BrowserInfo => {\n const browserInfoDefaults = {\n id: 'chrome',\n name: '',\n icon: '',\n } as BrowserInfo\n\n const detectBrowser = (): BrowserInfo | undefined => {\n const { isChrome, isBrave, isFirefox, isSafari, isEdge, isOpera } =\n deviceService\n\n if (isBrave) {\n return {\n id: 'brave',\n name: 'Brave',\n icon: 'logo-brave',\n storeLink: EXTENSION_STORE_LINKS.brave,\n }\n }\n\n if (isEdge) {\n return {\n id: 'edge',\n name: 'Edge',\n icon: 'logo-edge',\n storeLink: EXTENSION_STORE_LINKS.edge,\n }\n }\n\n if (isOpera) {\n return {\n id: 'opera',\n name: 'Opera',\n icon: 'logo-opera',\n storeLink: EXTENSION_STORE_LINKS.opera,\n }\n }\n\n if (isChrome) {\n return {\n id: 'chrome',\n name: 'Chrome',\n icon: 'logo-chrome',\n storeLink: EXTENSION_STORE_LINKS.chrome,\n }\n }\n\n if (isFirefox) {\n return {\n id: 'firefox',\n name: 'Firefox',\n icon: 'logo-firefox',\n storeLink: EXTENSION_STORE_LINKS.firefox,\n }\n }\n\n if (isSafari) {\n return {\n id: 'safari',\n name: 'Safari',\n icon: 'logo-safari',\n storeLink: EXTENSION_STORE_LINKS.safari,\n }\n }\n }\n\n const browserInfo = { ...browserInfoDefaults, ...detectBrowser() }\n\n return browserInfo\n}\n","/**\n * Make slug from text\n *\n * @param value\n * @returns\n */\nexport const slug = (value?: string) => {\n if (!value) {\n return ''\n }\n\n return value.toLowerCase().replace(/\\s+/g, '-') // convert spaces to hyphens\n}\n","export class UrlConverter {\n private destination: URL\n /**\n * It will relatively append pathname or hostname to the destination URL\n *\n * For example:\n * destination=https://some.api.gateway/something/ipfs\n * url=ipfs://QmSomeHash\n * output=https://some.api.gateway/something/ipfs/QmSomeHash\n *\n * destination=https://some.api.gateway/something/ipfs\n * url=https://something.com/somewhere\n * output=https://some.api.gateway/something/ipfs/somewhere\n *\n * @param destination destination string | URL\n */\n constructor(destination: string | URL) {\n this.destination = new URL(destination)\n if (this.destination.pathname.at(-1) !== '/') {\n this.destination.pathname += '/'\n }\n }\n\n resolveUrl(url: string): string {\n // Parse and convert to javascript URL objects\n // this will manage / and relative paths for us.\n const source = new URL(url)\n // extract the relative path. For URLs with a pathname prepend \".\" to make it ./ (i.e. relative)\n // for anything that only has a hostname we prepend ./ to make it relative\n // the pathname is at least slash for https urls, but '' for ipfs for example\n const relativePath = source.pathname\n ? `./${source.hostname}${source.pathname}` // pathname always starts with at least a slash\n : `./${source.hostname}`\n // Construct relative URL on destination using the relative pathname.\n const out = new URL(relativePath, this.destination)\n out.pathname = out.pathname.replaceAll(/\\/\\/+/g, '/')\n return out.toString()\n }\n}\n\nexport class UrlResolver {\n private converters: Array<{\n match: string | RegExp\n converter: UrlConverter\n }> = []\n constructor(converters: Array<[string | RegExp, UrlConverter | string]>) {\n for (const item of converters) {\n const [match, _converter] = item\n if (match == null) {\n throw new TypeError('Match criteria not defined')\n }\n const converter =\n typeof _converter === 'string'\n ? new UrlConverter(_converter)\n : _converter\n if (!(converter instanceof UrlConverter)) {\n throw new TypeError('Invalid converter')\n }\n this.converters.push({ match, converter })\n }\n }\n\n /**\n * Resolves a URL to a gateway URL.\n * Supports possible multiple converters transforming the URL\n * in sequence until no converter matches.\n *\n * @param {string} url to resolve\n * @returns {string} resolved url (if resolver is found, otherwise the parameter url is returned)\n */\n resolveUrl(url_: string): string {\n let url = url_\n const current = new Set<{\n match: string | RegExp\n converter: UrlConverter\n }>(this.converters)\n let found = true\n while (found) {\n found = false\n for (const entry of current) {\n const { match, converter } = entry\n if (match instanceof RegExp ? match.test(url) : url.startsWith(match)) {\n url = converter.resolveUrl(url)\n // This converter matches, so don't use it again.\n current.delete(entry)\n found = true\n break\n }\n }\n }\n return url\n }\n}\n"]}
package/dist/index.cjs CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkMBIRTPNMcjs = require('./chunk-MBIRTPNM.cjs');
5
+
6
+
7
+ var _chunkQU6NUTY6cjs = require('./chunk-QU6NUTY6.cjs');
6
8
 
7
9
 
8
10
 
@@ -51,5 +53,7 @@ var _chunkNJQVWIZLcjs = require('./chunk-NJQVWIZL.cjs');
51
53
 
52
54
 
53
55
 
54
- exports.EXTENSION_STORE_LINKS = _chunkMBIRTPNMcjs.EXTENSION_STORE_LINKS; exports.GRAPHQL_ENDPOINT_MAINNET = _chunkLUT5BHYLcjs.GRAPHQL_ENDPOINT_MAINNET; exports.GRAPHQL_ENDPOINT_TESTNET = _chunkLUT5BHYLcjs.GRAPHQL_ENDPOINT_TESTNET; exports.LUKSO_CHAINS_BY_ID = _chunkMCNNULYXcjs.LUKSO_CHAINS_BY_ID; exports.SUPPORTED_NETWORK_IDS = _chunkLUT5BHYLcjs.SUPPORTED_NETWORK_IDS; exports.browserInfo = _chunkMBIRTPNMcjs.browserInfo; exports.clearIntlService = _chunkRM42NG7Ecjs.clearIntlService; exports.createIntlService = _chunkRM42NG7Ecjs.createIntlService; exports.defaultConfig = _chunkRM42NG7Ecjs.defaultConfig; exports.deviceService = _chunkNJQVWIZLcjs.deviceService; exports.getChainById = _chunkMCNNULYXcjs.getChainById; exports.getIntlService = _chunkRM42NG7Ecjs.getIntlService; exports.luksoMainnet = _chunkMCNNULYXcjs.luksoMainnet; exports.luksoTestnet = _chunkMCNNULYXcjs.luksoTestnet; exports.setIntlService = _chunkRM42NG7Ecjs.setIntlService; exports.slug = _chunkMBIRTPNMcjs.slug; exports.withDeviceService = _chunkCC3LFUYYcjs.withDeviceService; exports.withIntlService = _chunkFR74YPGJcjs.withIntlService;
56
+
57
+
58
+ exports.EXTENSION_STORE_LINKS = _chunkQU6NUTY6cjs.EXTENSION_STORE_LINKS; exports.GRAPHQL_ENDPOINT_MAINNET = _chunkLUT5BHYLcjs.GRAPHQL_ENDPOINT_MAINNET; exports.GRAPHQL_ENDPOINT_TESTNET = _chunkLUT5BHYLcjs.GRAPHQL_ENDPOINT_TESTNET; exports.LUKSO_CHAINS_BY_ID = _chunkMCNNULYXcjs.LUKSO_CHAINS_BY_ID; exports.SUPPORTED_NETWORK_IDS = _chunkLUT5BHYLcjs.SUPPORTED_NETWORK_IDS; exports.UrlConverter = _chunkQU6NUTY6cjs.UrlConverter; exports.UrlResolver = _chunkQU6NUTY6cjs.UrlResolver; exports.browserInfo = _chunkQU6NUTY6cjs.browserInfo; exports.clearIntlService = _chunkRM42NG7Ecjs.clearIntlService; exports.createIntlService = _chunkRM42NG7Ecjs.createIntlService; exports.defaultConfig = _chunkRM42NG7Ecjs.defaultConfig; exports.deviceService = _chunkNJQVWIZLcjs.deviceService; exports.getChainById = _chunkMCNNULYXcjs.getChainById; exports.getIntlService = _chunkRM42NG7Ecjs.getIntlService; exports.luksoMainnet = _chunkMCNNULYXcjs.luksoMainnet; exports.luksoTestnet = _chunkMCNNULYXcjs.luksoTestnet; exports.setIntlService = _chunkRM42NG7Ecjs.setIntlService; exports.slug = _chunkQU6NUTY6cjs.slug; exports.withDeviceService = _chunkCC3LFUYYcjs.withDeviceService; exports.withIntlService = _chunkFR74YPGJcjs.withIntlService;
55
59
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,ylCAAC","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/index.cjs"}
1
+ {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,qsCAAC","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/index.cjs"}
package/dist/index.d.cts CHANGED
@@ -4,7 +4,7 @@ export { withDeviceService } from './mixins/device.cjs';
4
4
  export { withIntlService } from './mixins/intl.cjs';
5
5
  export { DeviceService, NavigatorExtended, deviceService } from './services/device.cjs';
6
6
  export { IntlMessages, IntlService, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService } from './services/intl.cjs';
7
- export { BrowserInfo, BrowserName, EXTENSION_STORE_LINKS, browserInfo, slug } from './utils/index.cjs';
7
+ export { BrowserInfo, BrowserName, EXTENSION_STORE_LINKS, UrlConverter, UrlResolver, browserInfo, slug } from './utils/index.cjs';
8
8
  import 'viem';
9
9
  import 'lit';
10
10
  import 'ua-parser-js';
package/dist/index.d.ts CHANGED
@@ -4,7 +4,7 @@ export { withDeviceService } from './mixins/device.js';
4
4
  export { withIntlService } from './mixins/intl.js';
5
5
  export { DeviceService, NavigatorExtended, deviceService } from './services/device.js';
6
6
  export { IntlMessages, IntlService, clearIntlService, createIntlService, defaultConfig, getIntlService, setIntlService } from './services/intl.js';
7
- export { BrowserInfo, BrowserName, EXTENSION_STORE_LINKS, browserInfo, slug } from './utils/index.js';
7
+ export { BrowserInfo, BrowserName, EXTENSION_STORE_LINKS, UrlConverter, UrlResolver, browserInfo, slug } from './utils/index.js';
8
8
  import 'viem';
9
9
  import 'lit';
10
10
  import 'ua-parser-js';
package/dist/index.js CHANGED
@@ -1,8 +1,10 @@
1
1
  import {
2
2
  EXTENSION_STORE_LINKS,
3
+ UrlConverter,
4
+ UrlResolver,
3
5
  browserInfo,
4
6
  slug
5
- } from "./chunk-DKXHVRHM.js";
7
+ } from "./chunk-GFLV5EJV.js";
6
8
  import {
7
9
  LUKSO_CHAINS_BY_ID,
8
10
  getChainById,
@@ -38,6 +40,8 @@ export {
38
40
  GRAPHQL_ENDPOINT_TESTNET,
39
41
  LUKSO_CHAINS_BY_ID,
40
42
  SUPPORTED_NETWORK_IDS,
43
+ UrlConverter,
44
+ UrlResolver,
41
45
  browserInfo,
42
46
  clearIntlService,
43
47
  createIntlService,
@@ -2,10 +2,14 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkMBIRTPNMcjs = require('../chunk-MBIRTPNM.cjs');
6
5
 
7
6
 
7
+ var _chunkQU6NUTY6cjs = require('../chunk-QU6NUTY6.cjs');
8
8
 
9
9
 
10
- exports.EXTENSION_STORE_LINKS = _chunkMBIRTPNMcjs.EXTENSION_STORE_LINKS; exports.browserInfo = _chunkMBIRTPNMcjs.browserInfo; exports.slug = _chunkMBIRTPNMcjs.slug;
10
+
11
+
12
+
13
+
14
+ exports.EXTENSION_STORE_LINKS = _chunkQU6NUTY6cjs.EXTENSION_STORE_LINKS; exports.UrlConverter = _chunkQU6NUTY6cjs.UrlConverter; exports.UrlResolver = _chunkQU6NUTY6cjs.UrlResolver; exports.browserInfo = _chunkQU6NUTY6cjs.browserInfo; exports.slug = _chunkQU6NUTY6cjs.slug;
11
15
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/utils/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACF,yDAA8B;AAC9B;AACE;AACA;AACA;AACF,oKAAC","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/utils/index.cjs"}
1
+ {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/utils/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACF,gRAAC","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/utils/index.cjs"}
@@ -29,4 +29,37 @@ declare const browserInfo: (deviceService: DeviceService) => BrowserInfo;
29
29
  */
30
30
  declare const slug: (value?: string) => string;
31
31
 
32
- export { type BrowserInfo, type BrowserName, EXTENSION_STORE_LINKS, browserInfo, slug };
32
+ declare class UrlConverter {
33
+ private destination;
34
+ /**
35
+ * It will relatively append pathname or hostname to the destination URL
36
+ *
37
+ * For example:
38
+ * destination=https://some.api.gateway/something/ipfs
39
+ * url=ipfs://QmSomeHash
40
+ * output=https://some.api.gateway/something/ipfs/QmSomeHash
41
+ *
42
+ * destination=https://some.api.gateway/something/ipfs
43
+ * url=https://something.com/somewhere
44
+ * output=https://some.api.gateway/something/ipfs/somewhere
45
+ *
46
+ * @param destination destination string | URL
47
+ */
48
+ constructor(destination: string | URL);
49
+ resolveUrl(url: string): string;
50
+ }
51
+ declare class UrlResolver {
52
+ private converters;
53
+ constructor(converters: Array<[string | RegExp, UrlConverter | string]>);
54
+ /**
55
+ * Resolves a URL to a gateway URL.
56
+ * Supports possible multiple converters transforming the URL
57
+ * in sequence until no converter matches.
58
+ *
59
+ * @param {string} url to resolve
60
+ * @returns {string} resolved url (if resolver is found, otherwise the parameter url is returned)
61
+ */
62
+ resolveUrl(url_: string): string;
63
+ }
64
+
65
+ export { type BrowserInfo, type BrowserName, EXTENSION_STORE_LINKS, UrlConverter, UrlResolver, browserInfo, slug };
@@ -29,4 +29,37 @@ declare const browserInfo: (deviceService: DeviceService) => BrowserInfo;
29
29
  */
30
30
  declare const slug: (value?: string) => string;
31
31
 
32
- export { type BrowserInfo, type BrowserName, EXTENSION_STORE_LINKS, browserInfo, slug };
32
+ declare class UrlConverter {
33
+ private destination;
34
+ /**
35
+ * It will relatively append pathname or hostname to the destination URL
36
+ *
37
+ * For example:
38
+ * destination=https://some.api.gateway/something/ipfs
39
+ * url=ipfs://QmSomeHash
40
+ * output=https://some.api.gateway/something/ipfs/QmSomeHash
41
+ *
42
+ * destination=https://some.api.gateway/something/ipfs
43
+ * url=https://something.com/somewhere
44
+ * output=https://some.api.gateway/something/ipfs/somewhere
45
+ *
46
+ * @param destination destination string | URL
47
+ */
48
+ constructor(destination: string | URL);
49
+ resolveUrl(url: string): string;
50
+ }
51
+ declare class UrlResolver {
52
+ private converters;
53
+ constructor(converters: Array<[string | RegExp, UrlConverter | string]>);
54
+ /**
55
+ * Resolves a URL to a gateway URL.
56
+ * Supports possible multiple converters transforming the URL
57
+ * in sequence until no converter matches.
58
+ *
59
+ * @param {string} url to resolve
60
+ * @returns {string} resolved url (if resolver is found, otherwise the parameter url is returned)
61
+ */
62
+ resolveUrl(url_: string): string;
63
+ }
64
+
65
+ export { type BrowserInfo, type BrowserName, EXTENSION_STORE_LINKS, UrlConverter, UrlResolver, browserInfo, slug };
@@ -1,10 +1,14 @@
1
1
  import {
2
2
  EXTENSION_STORE_LINKS,
3
+ UrlConverter,
4
+ UrlResolver,
3
5
  browserInfo,
4
6
  slug
5
- } from "../chunk-DKXHVRHM.js";
7
+ } from "../chunk-GFLV5EJV.js";
6
8
  export {
7
9
  EXTENSION_STORE_LINKS,
10
+ UrlConverter,
11
+ UrlResolver,
8
12
  browserInfo,
9
13
  slug
10
14
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lukso/core",
3
- "version": "1.0.0-dev.e515cef",
3
+ "version": "1.1.0-dev.5916302",
4
4
  "description": "Core utilities, services, and mixins for LUKSO web components and applications",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -130,6 +130,6 @@
130
130
  "clean": "rm -rf dist",
131
131
  "test": "vitest",
132
132
  "test:run": "vitest run",
133
- "check": "tsc --noEmit"
133
+ "typecheck": "tsc --noEmit"
134
134
  }
135
135
  }
@@ -2,3 +2,4 @@ export type { BrowserInfo, BrowserName } from './browserInfo.js'
2
2
  export { browserInfo, EXTENSION_STORE_LINKS } from './browserInfo.js'
3
3
 
4
4
  export { slug } from './slug.js'
5
+ export { UrlConverter, UrlResolver } from './url-resolver.js'
@@ -0,0 +1,93 @@
1
+ export class UrlConverter {
2
+ private destination: URL
3
+ /**
4
+ * It will relatively append pathname or hostname to the destination URL
5
+ *
6
+ * For example:
7
+ * destination=https://some.api.gateway/something/ipfs
8
+ * url=ipfs://QmSomeHash
9
+ * output=https://some.api.gateway/something/ipfs/QmSomeHash
10
+ *
11
+ * destination=https://some.api.gateway/something/ipfs
12
+ * url=https://something.com/somewhere
13
+ * output=https://some.api.gateway/something/ipfs/somewhere
14
+ *
15
+ * @param destination destination string | URL
16
+ */
17
+ constructor(destination: string | URL) {
18
+ this.destination = new URL(destination)
19
+ if (this.destination.pathname.at(-1) !== '/') {
20
+ this.destination.pathname += '/'
21
+ }
22
+ }
23
+
24
+ resolveUrl(url: string): string {
25
+ // Parse and convert to javascript URL objects
26
+ // this will manage / and relative paths for us.
27
+ const source = new URL(url)
28
+ // extract the relative path. For URLs with a pathname prepend "." to make it ./ (i.e. relative)
29
+ // for anything that only has a hostname we prepend ./ to make it relative
30
+ // the pathname is at least slash for https urls, but '' for ipfs for example
31
+ const relativePath = source.pathname
32
+ ? `./${source.hostname}${source.pathname}` // pathname always starts with at least a slash
33
+ : `./${source.hostname}`
34
+ // Construct relative URL on destination using the relative pathname.
35
+ const out = new URL(relativePath, this.destination)
36
+ out.pathname = out.pathname.replaceAll(/\/\/+/g, '/')
37
+ return out.toString()
38
+ }
39
+ }
40
+
41
+ export class UrlResolver {
42
+ private converters: Array<{
43
+ match: string | RegExp
44
+ converter: UrlConverter
45
+ }> = []
46
+ constructor(converters: Array<[string | RegExp, UrlConverter | string]>) {
47
+ for (const item of converters) {
48
+ const [match, _converter] = item
49
+ if (match == null) {
50
+ throw new TypeError('Match criteria not defined')
51
+ }
52
+ const converter =
53
+ typeof _converter === 'string'
54
+ ? new UrlConverter(_converter)
55
+ : _converter
56
+ if (!(converter instanceof UrlConverter)) {
57
+ throw new TypeError('Invalid converter')
58
+ }
59
+ this.converters.push({ match, converter })
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Resolves a URL to a gateway URL.
65
+ * Supports possible multiple converters transforming the URL
66
+ * in sequence until no converter matches.
67
+ *
68
+ * @param {string} url to resolve
69
+ * @returns {string} resolved url (if resolver is found, otherwise the parameter url is returned)
70
+ */
71
+ resolveUrl(url_: string): string {
72
+ let url = url_
73
+ const current = new Set<{
74
+ match: string | RegExp
75
+ converter: UrlConverter
76
+ }>(this.converters)
77
+ let found = true
78
+ while (found) {
79
+ found = false
80
+ for (const entry of current) {
81
+ const { match, converter } = entry
82
+ if (match instanceof RegExp ? match.test(url) : url.startsWith(match)) {
83
+ url = converter.resolveUrl(url)
84
+ // This converter matches, so don't use it again.
85
+ current.delete(entry)
86
+ found = true
87
+ break
88
+ }
89
+ }
90
+ }
91
+ return url
92
+ }
93
+ }
@@ -1,84 +0,0 @@
1
- // src/utils/browserInfo.ts
2
- var EXTENSION_STORE_LINKS = {
3
- chrome: "https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn",
4
- brave: "https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn",
5
- edge: "https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn",
6
- opera: "",
7
- safari: "",
8
- firefox: ""
9
- };
10
- var browserInfo = (deviceService) => {
11
- const browserInfoDefaults = {
12
- id: "chrome",
13
- name: "",
14
- icon: ""
15
- };
16
- const detectBrowser = () => {
17
- const { isChrome, isBrave, isFirefox, isSafari, isEdge, isOpera } = deviceService;
18
- if (isBrave) {
19
- return {
20
- id: "brave",
21
- name: "Brave",
22
- icon: "logo-brave",
23
- storeLink: EXTENSION_STORE_LINKS.brave
24
- };
25
- }
26
- if (isEdge) {
27
- return {
28
- id: "edge",
29
- name: "Edge",
30
- icon: "logo-edge",
31
- storeLink: EXTENSION_STORE_LINKS.edge
32
- };
33
- }
34
- if (isOpera) {
35
- return {
36
- id: "opera",
37
- name: "Opera",
38
- icon: "logo-opera",
39
- storeLink: EXTENSION_STORE_LINKS.opera
40
- };
41
- }
42
- if (isChrome) {
43
- return {
44
- id: "chrome",
45
- name: "Chrome",
46
- icon: "logo-chrome",
47
- storeLink: EXTENSION_STORE_LINKS.chrome
48
- };
49
- }
50
- if (isFirefox) {
51
- return {
52
- id: "firefox",
53
- name: "Firefox",
54
- icon: "logo-firefox",
55
- storeLink: EXTENSION_STORE_LINKS.firefox
56
- };
57
- }
58
- if (isSafari) {
59
- return {
60
- id: "safari",
61
- name: "Safari",
62
- icon: "logo-safari",
63
- storeLink: EXTENSION_STORE_LINKS.safari
64
- };
65
- }
66
- };
67
- const browserInfo2 = { ...browserInfoDefaults, ...detectBrowser() };
68
- return browserInfo2;
69
- };
70
-
71
- // src/utils/slug.ts
72
- var slug = (value) => {
73
- if (!value) {
74
- return "";
75
- }
76
- return value.toLowerCase().replace(/\s+/g, "-");
77
- };
78
-
79
- export {
80
- EXTENSION_STORE_LINKS,
81
- browserInfo,
82
- slug
83
- };
84
- //# sourceMappingURL=chunk-DKXHVRHM.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/browserInfo.ts","../src/utils/slug.ts"],"sourcesContent":["import type { DeviceService } from '../services'\n\nexport type BrowserName =\n | 'chrome'\n | 'safari'\n | 'firefox'\n | 'edge'\n | 'opera'\n | 'brave'\n\nexport type BrowserInfo = {\n id: BrowserName\n name: string\n icon: string\n storeLink: string\n}\n\n// extension store links (all webkit based browsers use chrome web store installation)\nexport const EXTENSION_STORE_LINKS = {\n chrome:\n 'https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn',\n brave:\n 'https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn',\n edge: 'https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn',\n opera: '',\n safari: '',\n firefox: '',\n}\n\n/**\n * Expose browser info to the app\n */\nexport const browserInfo = (deviceService: DeviceService): BrowserInfo => {\n const browserInfoDefaults = {\n id: 'chrome',\n name: '',\n icon: '',\n } as BrowserInfo\n\n const detectBrowser = (): BrowserInfo | undefined => {\n const { isChrome, isBrave, isFirefox, isSafari, isEdge, isOpera } =\n deviceService\n\n if (isBrave) {\n return {\n id: 'brave',\n name: 'Brave',\n icon: 'logo-brave',\n storeLink: EXTENSION_STORE_LINKS.brave,\n }\n }\n\n if (isEdge) {\n return {\n id: 'edge',\n name: 'Edge',\n icon: 'logo-edge',\n storeLink: EXTENSION_STORE_LINKS.edge,\n }\n }\n\n if (isOpera) {\n return {\n id: 'opera',\n name: 'Opera',\n icon: 'logo-opera',\n storeLink: EXTENSION_STORE_LINKS.opera,\n }\n }\n\n if (isChrome) {\n return {\n id: 'chrome',\n name: 'Chrome',\n icon: 'logo-chrome',\n storeLink: EXTENSION_STORE_LINKS.chrome,\n }\n }\n\n if (isFirefox) {\n return {\n id: 'firefox',\n name: 'Firefox',\n icon: 'logo-firefox',\n storeLink: EXTENSION_STORE_LINKS.firefox,\n }\n }\n\n if (isSafari) {\n return {\n id: 'safari',\n name: 'Safari',\n icon: 'logo-safari',\n storeLink: EXTENSION_STORE_LINKS.safari,\n }\n }\n }\n\n const browserInfo = { ...browserInfoDefaults, ...detectBrowser() }\n\n return browserInfo\n}\n","/**\n * Make slug from text\n *\n * @param value\n * @returns\n */\nexport const slug = (value?: string) => {\n if (!value) {\n return ''\n }\n\n return value.toLowerCase().replace(/\\s+/g, '-') // convert spaces to hyphens\n}\n"],"mappings":";AAkBO,IAAM,wBAAwB;AAAA,EACnC,QACE;AAAA,EACF,OACE;AAAA,EACF,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AACX;AAKO,IAAM,cAAc,CAAC,kBAA8C;AACxE,QAAM,sBAAsB;AAAA,IAC1B,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,QAAM,gBAAgB,MAA+B;AACnD,UAAM,EAAE,UAAU,SAAS,WAAW,UAAU,QAAQ,QAAQ,IAC9D;AAEF,QAAI,SAAS;AACX,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,sBAAsB;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,QAAQ;AACV,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,sBAAsB;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,SAAS;AACX,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,sBAAsB;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,UAAU;AACZ,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,sBAAsB;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,WAAW;AACb,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,sBAAsB;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,UAAU;AACZ,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,sBAAsB;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,QAAMA,eAAc,EAAE,GAAG,qBAAqB,GAAG,cAAc,EAAE;AAEjE,SAAOA;AACT;;;AC/FO,IAAM,OAAO,CAAC,UAAmB;AACtC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,YAAY,EAAE,QAAQ,QAAQ,GAAG;AAChD;","names":["browserInfo"]}
@@ -1,84 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/utils/browserInfo.ts
2
- var EXTENSION_STORE_LINKS = {
3
- chrome: "https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn",
4
- brave: "https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn",
5
- edge: "https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn",
6
- opera: "",
7
- safari: "",
8
- firefox: ""
9
- };
10
- var browserInfo = (deviceService) => {
11
- const browserInfoDefaults = {
12
- id: "chrome",
13
- name: "",
14
- icon: ""
15
- };
16
- const detectBrowser = () => {
17
- const { isChrome, isBrave, isFirefox, isSafari, isEdge, isOpera } = deviceService;
18
- if (isBrave) {
19
- return {
20
- id: "brave",
21
- name: "Brave",
22
- icon: "logo-brave",
23
- storeLink: EXTENSION_STORE_LINKS.brave
24
- };
25
- }
26
- if (isEdge) {
27
- return {
28
- id: "edge",
29
- name: "Edge",
30
- icon: "logo-edge",
31
- storeLink: EXTENSION_STORE_LINKS.edge
32
- };
33
- }
34
- if (isOpera) {
35
- return {
36
- id: "opera",
37
- name: "Opera",
38
- icon: "logo-opera",
39
- storeLink: EXTENSION_STORE_LINKS.opera
40
- };
41
- }
42
- if (isChrome) {
43
- return {
44
- id: "chrome",
45
- name: "Chrome",
46
- icon: "logo-chrome",
47
- storeLink: EXTENSION_STORE_LINKS.chrome
48
- };
49
- }
50
- if (isFirefox) {
51
- return {
52
- id: "firefox",
53
- name: "Firefox",
54
- icon: "logo-firefox",
55
- storeLink: EXTENSION_STORE_LINKS.firefox
56
- };
57
- }
58
- if (isSafari) {
59
- return {
60
- id: "safari",
61
- name: "Safari",
62
- icon: "logo-safari",
63
- storeLink: EXTENSION_STORE_LINKS.safari
64
- };
65
- }
66
- };
67
- const browserInfo2 = { ...browserInfoDefaults, ...detectBrowser() };
68
- return browserInfo2;
69
- };
70
-
71
- // src/utils/slug.ts
72
- var slug = (value) => {
73
- if (!value) {
74
- return "";
75
- }
76
- return value.toLowerCase().replace(/\s+/g, "-");
77
- };
78
-
79
-
80
-
81
-
82
-
83
- exports.EXTENSION_STORE_LINKS = EXTENSION_STORE_LINKS; exports.browserInfo = browserInfo; exports.slug = slug;
84
- //# sourceMappingURL=chunk-MBIRTPNM.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-MBIRTPNM.cjs","../src/utils/browserInfo.ts","../src/utils/slug.ts"],"names":["browserInfo"],"mappings":"AAAA;ACkBO,IAAM,sBAAA,EAAwB;AAAA,EACnC,MAAA,EACE,sGAAA;AAAA,EACF,KAAA,EACE,sGAAA;AAAA,EACF,IAAA,EAAM,sGAAA;AAAA,EACN,KAAA,EAAO,EAAA;AAAA,EACP,MAAA,EAAQ,EAAA;AAAA,EACR,OAAA,EAAS;AACX,CAAA;AAKO,IAAM,YAAA,EAAc,CAAC,aAAA,EAAA,GAA8C;AACxE,EAAA,MAAM,oBAAA,EAAsB;AAAA,IAC1B,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,EAAA;AAAA,IACN,IAAA,EAAM;AAAA,EACR,CAAA;AAEA,EAAA,MAAM,cAAA,EAAgB,CAAA,EAAA,GAA+B;AACnD,IAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,QAAQ,EAAA,EAC9D,aAAA;AAEF,IAAA,GAAA,CAAI,OAAA,EAAS;AACX,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,OAAA;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,YAAA;AAAA,QACN,SAAA,EAAW,qBAAA,CAAsB;AAAA,MACnC,CAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,MAAA,EAAQ;AACV,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,MAAA;AAAA,QACJ,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,WAAA;AAAA,QACN,SAAA,EAAW,qBAAA,CAAsB;AAAA,MACnC,CAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,OAAA,EAAS;AACX,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,OAAA;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,YAAA;AAAA,QACN,SAAA,EAAW,qBAAA,CAAsB;AAAA,MACnC,CAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,QAAA,EAAU;AACZ,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,QAAA;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,aAAA;AAAA,QACN,SAAA,EAAW,qBAAA,CAAsB;AAAA,MACnC,CAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,SAAA,EAAW;AACb,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,SAAA;AAAA,QACJ,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,cAAA;AAAA,QACN,SAAA,EAAW,qBAAA,CAAsB;AAAA,MACnC,CAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,QAAA,EAAU;AACZ,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,QAAA;AAAA,QACJ,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,aAAA;AAAA,QACN,SAAA,EAAW,qBAAA,CAAsB;AAAA,MACnC,CAAA;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAMA,aAAAA,EAAc,EAAE,GAAG,mBAAA,EAAqB,GAAG,aAAA,CAAc,EAAE,CAAA;AAEjE,EAAA,OAAOA,YAAAA;AACT,CAAA;ADhCA;AACA;AEhEO,IAAM,KAAA,EAAO,CAAC,KAAA,EAAA,GAAmB;AACtC,EAAA,GAAA,CAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA,CAAM,WAAA,CAAY,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA;AAChD,CAAA;AFiEA;AACA;AACE;AACA;AACA;AACF,8GAAC","file":"/home/runner/work/service-auth-simple/service-auth-simple/packages/core/dist/chunk-MBIRTPNM.cjs","sourcesContent":[null,"import type { DeviceService } from '../services'\n\nexport type BrowserName =\n | 'chrome'\n | 'safari'\n | 'firefox'\n | 'edge'\n | 'opera'\n | 'brave'\n\nexport type BrowserInfo = {\n id: BrowserName\n name: string\n icon: string\n storeLink: string\n}\n\n// extension store links (all webkit based browsers use chrome web store installation)\nexport const EXTENSION_STORE_LINKS = {\n chrome:\n 'https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn',\n brave:\n 'https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn',\n edge: 'https://chrome.google.com/webstore/detail/universal-profiles-testin/abpickdkkbnbcoepogfhkhennhfhehfn',\n opera: '',\n safari: '',\n firefox: '',\n}\n\n/**\n * Expose browser info to the app\n */\nexport const browserInfo = (deviceService: DeviceService): BrowserInfo => {\n const browserInfoDefaults = {\n id: 'chrome',\n name: '',\n icon: '',\n } as BrowserInfo\n\n const detectBrowser = (): BrowserInfo | undefined => {\n const { isChrome, isBrave, isFirefox, isSafari, isEdge, isOpera } =\n deviceService\n\n if (isBrave) {\n return {\n id: 'brave',\n name: 'Brave',\n icon: 'logo-brave',\n storeLink: EXTENSION_STORE_LINKS.brave,\n }\n }\n\n if (isEdge) {\n return {\n id: 'edge',\n name: 'Edge',\n icon: 'logo-edge',\n storeLink: EXTENSION_STORE_LINKS.edge,\n }\n }\n\n if (isOpera) {\n return {\n id: 'opera',\n name: 'Opera',\n icon: 'logo-opera',\n storeLink: EXTENSION_STORE_LINKS.opera,\n }\n }\n\n if (isChrome) {\n return {\n id: 'chrome',\n name: 'Chrome',\n icon: 'logo-chrome',\n storeLink: EXTENSION_STORE_LINKS.chrome,\n }\n }\n\n if (isFirefox) {\n return {\n id: 'firefox',\n name: 'Firefox',\n icon: 'logo-firefox',\n storeLink: EXTENSION_STORE_LINKS.firefox,\n }\n }\n\n if (isSafari) {\n return {\n id: 'safari',\n name: 'Safari',\n icon: 'logo-safari',\n storeLink: EXTENSION_STORE_LINKS.safari,\n }\n }\n }\n\n const browserInfo = { ...browserInfoDefaults, ...detectBrowser() }\n\n return browserInfo\n}\n","/**\n * Make slug from text\n *\n * @param value\n * @returns\n */\nexport const slug = (value?: string) => {\n if (!value) {\n return ''\n }\n\n return value.toLowerCase().replace(/\\s+/g, '-') // convert spaces to hyphens\n}\n"]}