console-self-xss-warning 1.0.3 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -43
- package/dist/detectLanguage.d.ts +1 -0
- package/dist/detectLanguage.js +7 -4
- package/dist/index.d.ts +101 -1
- package/dist/index.js +122 -26
- package/dist/translations.default.json +87 -31
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
Show a self-XSS warning in the browser console to protect users from social
|
|
4
4
|
engineering.
|
|
5
5
|
|
|
6
|
+

|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
- Runs only in the browser and is safe for SSR.
|
|
11
|
+
- Default language is auto-detected via `navigator.language` with `en` fallback.
|
|
12
|
+
- Language tags use [BCP 47](https://developer.mozilla.org/en-US/docs/Glossary/BCP_47_language_tag) with normalization and primary subtag fallback (e.g. `en-US` -> `en`).
|
|
13
|
+
- Built-in translations for 40+ languages.
|
|
14
|
+
- `\\n` in translations is converted to a real line break in console output.
|
|
15
|
+
- No external dependencies.
|
|
16
|
+
|
|
6
17
|
## Install
|
|
7
18
|
|
|
8
19
|
```
|
|
@@ -17,44 +28,23 @@ import { showConsoleWarning } from "console-self-xss-warning";
|
|
|
17
28
|
showConsoleWarning();
|
|
18
29
|
```
|
|
19
30
|
|
|
20
|
-
##
|
|
21
|
-
|
|
22
|
-
Call it in a client component so it runs only in the browser.
|
|
23
|
-
|
|
24
|
-
```tsx
|
|
25
|
-
"use client";
|
|
26
|
-
|
|
27
|
-
import { useEffect } from "react";
|
|
28
|
-
import { showConsoleWarning } from "console-self-xss-warning";
|
|
29
|
-
|
|
30
|
-
export function ConsoleWarning() {
|
|
31
|
-
useEffect(() => {
|
|
32
|
-
showConsoleWarning({ productionOnly: true });
|
|
33
|
-
}, []);
|
|
34
|
-
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
Re-log on route changes:
|
|
40
|
-
|
|
41
|
-
```tsx
|
|
42
|
-
"use client";
|
|
31
|
+
## Framework examples
|
|
43
32
|
|
|
44
|
-
|
|
45
|
-
import { usePathname } from "next/navigation";
|
|
46
|
-
import { showConsoleWarning } from "console-self-xss-warning";
|
|
47
|
-
|
|
48
|
-
export function ConsoleWarning() {
|
|
49
|
-
const pathname = usePathname();
|
|
50
|
-
|
|
51
|
-
useEffect(() => {
|
|
52
|
-
showConsoleWarning({ once: false, clearConsole: false, productionOnly: true });
|
|
53
|
-
}, [pathname]);
|
|
33
|
+
Full examples for popular frameworks and Vanilla JS are in [`examples/`](https://github.com/hksm-app/console-self-xss-warning/tree/main/examples).
|
|
54
34
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
35
|
+
- Vanilla JS: [`examples/vanilla/README.md`](https://github.com/hksm-app/console-self-xss-warning/tree/main/examples/vanilla/README.md)
|
|
36
|
+
- React: [`examples/react/README.md`](https://github.com/hksm-app/console-self-xss-warning/tree/main/examples/react/README.md)
|
|
37
|
+
- Next.js: [`examples/nextjs/README.md`](https://github.com/hksm-app/console-self-xss-warning/tree/main/examples/nextjs/README.md)
|
|
38
|
+
- Vue: [`examples/vue/README.md`](https://github.com/hksm-app/console-self-xss-warning/tree/main/examples/vue/README.md)
|
|
39
|
+
- Nuxt: [`examples/nuxt/README.md`](https://github.com/hksm-app/console-self-xss-warning/tree/main/examples/nuxt/README.md)
|
|
40
|
+
- Svelte/SvelteKit: [`examples/svetle/README.md`](https://github.com/hksm-app/console-self-xss-warning/tree/main/examples/svetle/README.md)
|
|
41
|
+
- Vite: [`examples/vite/README.md`](https://github.com/hksm-app/console-self-xss-warning/tree/main/examples/vite/README.md)
|
|
42
|
+
- Angular: [`examples/angular/README.md`](https://github.com/hksm-app/console-self-xss-warning/tree/main/examples/angular/README.md)
|
|
43
|
+
- Astro: [`examples/astro/README.md`](https://github.com/hksm-app/console-self-xss-warning/tree/main/examples/astro/README.md)
|
|
44
|
+
- Remix: [`examples/remix/README.md`](https://github.com/hksm-app/console-self-xss-warning/tree/main/examples/remix/README.md)
|
|
45
|
+
- Gatsby: [`examples/gatsby/README.md`](https://github.com/hksm-app/console-self-xss-warning/tree/main/examples/gatsby/README.md)
|
|
46
|
+
- Solid: [`examples/solid/README.md`](https://github.com/hksm-app/console-self-xss-warning/tree/main/examples/solid/README.md)
|
|
47
|
+
- Qwik: [`examples/qwik/README.md`](https://github.com/hksm-app/console-self-xss-warning/tree/main/examples/qwik/README.md)
|
|
58
48
|
|
|
59
49
|
## Configuration
|
|
60
50
|
|
|
@@ -66,6 +56,13 @@ export function ConsoleWarning() {
|
|
|
66
56
|
| `productionOnly` | `false` | no | show only in production mode |
|
|
67
57
|
| `clearConsole` | `false` | no | clear the console before logging |
|
|
68
58
|
| `productionOnlyEnvKey` | default key list | no | read `productionOnly` from an env variable |
|
|
59
|
+
| `config` | default warning config | no | override styles and behavior defaults |
|
|
60
|
+
|
|
61
|
+
### Language tags (BCP 47)
|
|
62
|
+
|
|
63
|
+
Language keys and `forceLang` accept [BCP 47 language tags](https://developer.mozilla.org/en-US/docs/Glossary/BCP_47_language_tag) (e.g. `en`, `en-US`, `pt-BR`).
|
|
64
|
+
Tags are normalized to lowercase with `-`, and if a region-specific tag is not
|
|
65
|
+
found the primary subtag is used as a fallback (e.g. `en-US` -> `en`).
|
|
69
66
|
|
|
70
67
|
### Common options
|
|
71
68
|
|
|
@@ -114,6 +111,16 @@ showConsoleWarning({
|
|
|
114
111
|
});
|
|
115
112
|
```
|
|
116
113
|
|
|
114
|
+
### Config overrides
|
|
115
|
+
|
|
116
|
+
| key | default | description |
|
|
117
|
+
| --- | --- | --- |
|
|
118
|
+
| `defaultTitleStyle` | `color:red;font-size:48px;font-weight:bold;` | default title style |
|
|
119
|
+
| `defaultMessageStyle` | `font-size:16px;` | default message style |
|
|
120
|
+
| `defaultSpamIntervalMs` | `2000` | repeat interval for the warning in ms |
|
|
121
|
+
| `devtoolsSizeThresholdPx` | `160` | threshold used to detect open devtools |
|
|
122
|
+
|
|
123
|
+
|
|
117
124
|
## Environment config for productionOnly
|
|
118
125
|
|
|
119
126
|
If you want `productionOnly` to be driven by an environment variable, pass
|
|
@@ -158,14 +165,13 @@ type Options = {
|
|
|
158
165
|
productionOnly?: boolean
|
|
159
166
|
clearConsole?: boolean
|
|
160
167
|
productionOnlyEnvKey?: string | string[]
|
|
168
|
+
config?: {
|
|
169
|
+
defaultTitleStyle?: string
|
|
170
|
+
defaultMessageStyle?: string
|
|
171
|
+
defaultSpamIntervalMs?: number
|
|
172
|
+
devtoolsSizeThresholdPx?: number
|
|
173
|
+
}
|
|
161
174
|
}
|
|
162
175
|
|
|
163
176
|
showConsoleWarning(options?)
|
|
164
177
|
```
|
|
165
|
-
|
|
166
|
-
## Notes
|
|
167
|
-
|
|
168
|
-
- Runs only in the browser and is safe for SSR.
|
|
169
|
-
- Default language is auto-detected via `navigator.language` with `en` fallback.
|
|
170
|
-
- `\\n` in translations is converted to a real line break in console output.
|
|
171
|
-
- No external dependencies.
|
package/dist/detectLanguage.d.ts
CHANGED
package/dist/detectLanguage.js
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
|
+
export function normalizeLanguageTag(tag) {
|
|
2
|
+
return tag.trim().toLowerCase().replace(/_/g, "-");
|
|
3
|
+
}
|
|
1
4
|
export function detectLanguage(fallback = "en") {
|
|
2
5
|
if (typeof navigator === "undefined") {
|
|
3
|
-
return fallback;
|
|
6
|
+
return normalizeLanguageTag(fallback);
|
|
4
7
|
}
|
|
5
8
|
const raw = (Array.isArray(navigator.languages) && navigator.languages[0]) ||
|
|
6
9
|
navigator.language ||
|
|
7
10
|
fallback;
|
|
8
11
|
if (!raw) {
|
|
9
|
-
return fallback;
|
|
12
|
+
return normalizeLanguageTag(fallback);
|
|
10
13
|
}
|
|
11
|
-
const normalized = raw
|
|
12
|
-
return normalized
|
|
14
|
+
const normalized = normalizeLanguageTag(raw);
|
|
15
|
+
return normalized || normalizeLanguageTag(fallback);
|
|
13
16
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,12 +4,112 @@ export type Translation = {
|
|
|
4
4
|
titleStyle?: string;
|
|
5
5
|
messageStyle?: string;
|
|
6
6
|
};
|
|
7
|
+
declare const BUILT_IN_LANGUAGES: readonly ["en", "es", "fr", "de", "it", "pt", "nl", "sv", "no", "nb", "da", "fi", "ru", "uk", "pl", "cs", "sk", "hu", "ro", "bg", "tr", "el", "ar", "he", "hi", "th", "vi", "id", "ms", "zh", "ja", "ko", "et", "lt", "lv", "hr", "sl", "sr", "mk", "sq", "is", "ga", "fa", "ur", "bn"];
|
|
8
|
+
export type BuiltInLanguage = (typeof BUILT_IN_LANGUAGES)[number];
|
|
9
|
+
export type ForceLanguage = BuiltInLanguage | (string & {});
|
|
10
|
+
/**
|
|
11
|
+
* Options for `showConsoleWarning`.
|
|
12
|
+
*/
|
|
7
13
|
export type Options = {
|
|
14
|
+
/**
|
|
15
|
+
* Override built-in translations per language.
|
|
16
|
+
*/
|
|
8
17
|
translations?: Record<string, Translation>;
|
|
9
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Force a specific {@link https://developer.mozilla.org/en-US/docs/Glossary/BCP_47_language_tag BCP 47 language tag}
|
|
20
|
+
* @example `en`, `en-US`, `fr`
|
|
21
|
+
*/
|
|
22
|
+
forceLang?: ForceLanguage;
|
|
23
|
+
/**
|
|
24
|
+
* Show only once per page load.
|
|
25
|
+
*
|
|
26
|
+
* @default true
|
|
27
|
+
*/
|
|
10
28
|
once?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Show only in production mode.
|
|
31
|
+
*
|
|
32
|
+
* @default false
|
|
33
|
+
*/
|
|
11
34
|
productionOnly?: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Clear the console before logging.
|
|
37
|
+
*
|
|
38
|
+
* @default false
|
|
39
|
+
*/
|
|
12
40
|
clearConsole?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Env key(s) that control `productionOnly` with boolean values.
|
|
43
|
+
*
|
|
44
|
+
* @default ["CONSOLE_SELF_XSS_WARNING_PRODUCTION_ONLY", "VITE_CONSOLE_SELF_XSS_WARNING_PRODUCTION_ONLY", "NEXT_PUBLIC_CONSOLE_SELF_XSS_WARNING_PRODUCTION_ONLY"]
|
|
45
|
+
*/
|
|
13
46
|
productionOnlyEnvKey?: string | string[];
|
|
47
|
+
/**
|
|
48
|
+
* Override warning behavior and styling defaults.
|
|
49
|
+
*
|
|
50
|
+
* @default {@link DEFAULT_WARNING_CONFIG}
|
|
51
|
+
*/
|
|
52
|
+
config?: Partial<WarningConfig>;
|
|
14
53
|
};
|
|
54
|
+
export type WarningConfig = {
|
|
55
|
+
/**
|
|
56
|
+
* Default title style.
|
|
57
|
+
*
|
|
58
|
+
* @default "color:red;font-size:48px;font-weight:bold;"
|
|
59
|
+
*/
|
|
60
|
+
defaultTitleStyle: string;
|
|
61
|
+
/**
|
|
62
|
+
* Default message style.
|
|
63
|
+
*
|
|
64
|
+
* @default "font-size:16px;"
|
|
65
|
+
*/
|
|
66
|
+
defaultMessageStyle: string;
|
|
67
|
+
/**
|
|
68
|
+
* Default spam interval in ms.
|
|
69
|
+
*
|
|
70
|
+
* @default 2000
|
|
71
|
+
*/
|
|
72
|
+
defaultSpamIntervalMs: number;
|
|
73
|
+
/**
|
|
74
|
+
* Threshold used to detect open devtools.
|
|
75
|
+
*
|
|
76
|
+
* @default 160
|
|
77
|
+
*/
|
|
78
|
+
devtoolsSizeThresholdPx: number;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Default warning configuration.
|
|
82
|
+
*
|
|
83
|
+
* @default
|
|
84
|
+
* ```ts
|
|
85
|
+
* {
|
|
86
|
+
* defaultTitleStyle: "color:red;font-size:48px;font-weight:bold;",
|
|
87
|
+
* defaultMessageStyle: "font-size:16px;",
|
|
88
|
+
* defaultSpamIntervalMs: 2000,
|
|
89
|
+
* devtoolsSizeThresholdPx: 160
|
|
90
|
+
* }
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
export declare const DEFAULT_WARNING_CONFIG: WarningConfig;
|
|
94
|
+
/**
|
|
95
|
+
* Log a self-XSS warning into the browser console.
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* showConsoleWarning();
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* showConsoleWarning({ forceLang: "fr", clearConsole: true });
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* showConsoleWarning({
|
|
105
|
+
* translations: {
|
|
106
|
+
* en: {
|
|
107
|
+
* title: "STOP!",
|
|
108
|
+
* message: "This is a developer-only feature.\\nDo not paste anything here."
|
|
109
|
+
* }
|
|
110
|
+
* },
|
|
111
|
+
* once: false
|
|
112
|
+
* });
|
|
113
|
+
*/
|
|
15
114
|
export declare function showConsoleWarning(options?: Options): void;
|
|
115
|
+
export {};
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,71 @@
|
|
|
1
1
|
import defaultTranslations from "./translations.default.json";
|
|
2
|
-
import { detectLanguage } from "./detectLanguage";
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
import { detectLanguage, normalizeLanguageTag } from "./detectLanguage";
|
|
3
|
+
const BUILT_IN_LANGUAGES = [
|
|
4
|
+
"en",
|
|
5
|
+
"es",
|
|
6
|
+
"fr",
|
|
7
|
+
"de",
|
|
8
|
+
"it",
|
|
9
|
+
"pt",
|
|
10
|
+
"nl",
|
|
11
|
+
"sv",
|
|
12
|
+
"no",
|
|
13
|
+
"nb",
|
|
14
|
+
"da",
|
|
15
|
+
"fi",
|
|
16
|
+
"ru",
|
|
17
|
+
"uk",
|
|
18
|
+
"pl",
|
|
19
|
+
"cs",
|
|
20
|
+
"sk",
|
|
21
|
+
"hu",
|
|
22
|
+
"ro",
|
|
23
|
+
"bg",
|
|
24
|
+
"tr",
|
|
25
|
+
"el",
|
|
26
|
+
"ar",
|
|
27
|
+
"he",
|
|
28
|
+
"hi",
|
|
29
|
+
"th",
|
|
30
|
+
"vi",
|
|
31
|
+
"id",
|
|
32
|
+
"ms",
|
|
33
|
+
"zh",
|
|
34
|
+
"ja",
|
|
35
|
+
"ko",
|
|
36
|
+
"et",
|
|
37
|
+
"lt",
|
|
38
|
+
"lv",
|
|
39
|
+
"hr",
|
|
40
|
+
"sl",
|
|
41
|
+
"sr",
|
|
42
|
+
"mk",
|
|
43
|
+
"sq",
|
|
44
|
+
"is",
|
|
45
|
+
"ga",
|
|
46
|
+
"fa",
|
|
47
|
+
"ur",
|
|
48
|
+
"bn"
|
|
49
|
+
];
|
|
50
|
+
/**
|
|
51
|
+
* Default warning configuration.
|
|
52
|
+
*
|
|
53
|
+
* @default
|
|
54
|
+
* ```ts
|
|
55
|
+
* {
|
|
56
|
+
* defaultTitleStyle: "color:red;font-size:48px;font-weight:bold;",
|
|
57
|
+
* defaultMessageStyle: "font-size:16px;",
|
|
58
|
+
* defaultSpamIntervalMs: 2000,
|
|
59
|
+
* devtoolsSizeThresholdPx: 160
|
|
60
|
+
* }
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export const DEFAULT_WARNING_CONFIG = {
|
|
64
|
+
defaultTitleStyle: "color:red;font-size:48px;font-weight:bold;",
|
|
65
|
+
defaultMessageStyle: "font-size:16px;",
|
|
66
|
+
defaultSpamIntervalMs: 2000,
|
|
67
|
+
devtoolsSizeThresholdPx: 160
|
|
68
|
+
};
|
|
7
69
|
const GLOBAL_ONCE_FLAG = "__consoleSelfXssWarningShown__";
|
|
8
70
|
let hasShown = false;
|
|
9
71
|
let spamIntervalId;
|
|
@@ -23,12 +85,12 @@ function setHasShown() {
|
|
|
23
85
|
globalThis[GLOBAL_ONCE_FLAG] = true;
|
|
24
86
|
}
|
|
25
87
|
}
|
|
26
|
-
function isDevtoolsLikelyOpen() {
|
|
88
|
+
function isDevtoolsLikelyOpen(config) {
|
|
27
89
|
if (typeof window === "undefined") {
|
|
28
90
|
return false;
|
|
29
91
|
}
|
|
30
|
-
return (window.outerWidth - window.innerWidth >
|
|
31
|
-
window.outerHeight - window.innerHeight >
|
|
92
|
+
return (window.outerWidth - window.innerWidth > config.devtoolsSizeThresholdPx ||
|
|
93
|
+
window.outerHeight - window.innerHeight > config.devtoolsSizeThresholdPx);
|
|
32
94
|
}
|
|
33
95
|
function isBrowser() {
|
|
34
96
|
return typeof window !== "undefined" && typeof console !== "undefined";
|
|
@@ -118,14 +180,23 @@ function resolveTranslation(translations, lang) {
|
|
|
118
180
|
const fallback = translations.en ||
|
|
119
181
|
defaultTranslations.en || {
|
|
120
182
|
title: "STOP!",
|
|
121
|
-
message: "This is a browser feature
|
|
183
|
+
message: "This is a developer-only browser feature.\\nIf someone told you to paste code here, it is a scam.\\nPasting code can give attackers access to your account."
|
|
184
|
+
};
|
|
185
|
+
const normalizedFallback = {
|
|
186
|
+
...fallback,
|
|
187
|
+
title: fallback.title ? fallback.title.replace(/\\n/g, "\n") : fallback.title,
|
|
188
|
+
message: fallback.message
|
|
189
|
+
? fallback.message.replace(/\\n/g, "\n")
|
|
190
|
+
: fallback.message
|
|
122
191
|
};
|
|
123
|
-
const
|
|
192
|
+
const normalized = normalizeLanguageTag(lang);
|
|
193
|
+
const primary = normalized.split("-")[0] || normalized;
|
|
194
|
+
const selected = translations[normalized] || translations[primary];
|
|
124
195
|
if (!selected) {
|
|
125
|
-
return
|
|
196
|
+
return normalizedFallback;
|
|
126
197
|
}
|
|
127
|
-
const rawTitle = selected.title ||
|
|
128
|
-
const rawMessage = selected.message ||
|
|
198
|
+
const rawTitle = selected.title || normalizedFallback.title;
|
|
199
|
+
const rawMessage = selected.message || normalizedFallback.message;
|
|
129
200
|
return {
|
|
130
201
|
title: rawTitle.replace(/\\n/g, "\n"),
|
|
131
202
|
message: rawMessage.replace(/\\n/g, "\n"),
|
|
@@ -133,14 +204,14 @@ function resolveTranslation(translations, lang) {
|
|
|
133
204
|
messageStyle: selected.messageStyle
|
|
134
205
|
};
|
|
135
206
|
}
|
|
136
|
-
function logWarning(payload) {
|
|
207
|
+
function logWarning(payload, config) {
|
|
137
208
|
if (payload.clearConsole && typeof console.clear === "function") {
|
|
138
209
|
console.clear();
|
|
139
210
|
}
|
|
140
|
-
console.log(`%c${payload.title}`, payload.titleStyle ||
|
|
141
|
-
console.log(`%c${payload.message}`, payload.messageStyle ||
|
|
211
|
+
console.log(`%c${payload.title}`, payload.titleStyle || config.defaultTitleStyle);
|
|
212
|
+
console.log(`%c${payload.message}`, payload.messageStyle || config.defaultMessageStyle);
|
|
142
213
|
}
|
|
143
|
-
function startSpam(payload) {
|
|
214
|
+
function startSpam(payload, config) {
|
|
144
215
|
spamPayload = payload;
|
|
145
216
|
if (typeof window === "undefined") {
|
|
146
217
|
return;
|
|
@@ -148,24 +219,49 @@ function startSpam(payload) {
|
|
|
148
219
|
if (spamIntervalId !== undefined) {
|
|
149
220
|
return;
|
|
150
221
|
}
|
|
151
|
-
if (isDevtoolsLikelyOpen()) {
|
|
152
|
-
logWarning(payload);
|
|
222
|
+
if (isDevtoolsLikelyOpen(config)) {
|
|
223
|
+
logWarning(payload, config);
|
|
153
224
|
setHasShown();
|
|
154
225
|
}
|
|
155
226
|
spamIntervalId = window.setInterval(() => {
|
|
156
|
-
if (!spamPayload || !isDevtoolsLikelyOpen()) {
|
|
227
|
+
if (!spamPayload || !isDevtoolsLikelyOpen(config)) {
|
|
157
228
|
return;
|
|
158
229
|
}
|
|
159
|
-
logWarning(spamPayload);
|
|
230
|
+
logWarning(spamPayload, config);
|
|
160
231
|
setHasShown();
|
|
161
|
-
},
|
|
232
|
+
}, config.defaultSpamIntervalMs);
|
|
162
233
|
}
|
|
234
|
+
/**
|
|
235
|
+
* Log a self-XSS warning into the browser console.
|
|
236
|
+
*
|
|
237
|
+
* @example
|
|
238
|
+
* showConsoleWarning();
|
|
239
|
+
*
|
|
240
|
+
* @example
|
|
241
|
+
* showConsoleWarning({ forceLang: "fr", clearConsole: true });
|
|
242
|
+
*
|
|
243
|
+
* @example
|
|
244
|
+
* showConsoleWarning({
|
|
245
|
+
* translations: {
|
|
246
|
+
* en: {
|
|
247
|
+
* title: "STOP!",
|
|
248
|
+
* message: "This is a developer-only feature.\\nDo not paste anything here."
|
|
249
|
+
* }
|
|
250
|
+
* },
|
|
251
|
+
* once: false
|
|
252
|
+
* });
|
|
253
|
+
*/
|
|
163
254
|
export function showConsoleWarning(options = {}) {
|
|
164
255
|
var _a;
|
|
165
256
|
if (!isBrowser()) {
|
|
166
257
|
return;
|
|
167
258
|
}
|
|
168
|
-
const { translations: translationOverrides, forceLang, once = true, productionOnly, clearConsole = false, productionOnlyEnvKey } = options;
|
|
259
|
+
const { translations: translationOverrides, forceLang, once = true, productionOnly, clearConsole = false, productionOnlyEnvKey, config: configOverrides } = options;
|
|
260
|
+
// Merge defaults with user-provided overrides.
|
|
261
|
+
const resolvedConfig = {
|
|
262
|
+
...DEFAULT_WARNING_CONFIG,
|
|
263
|
+
...configOverrides
|
|
264
|
+
};
|
|
169
265
|
const resolvedProductionOnly = (_a = productionOnly !== null && productionOnly !== void 0 ? productionOnly : getConfigProductionOnly(productionOnlyEnvKey)) !== null && _a !== void 0 ? _a : false;
|
|
170
266
|
if (resolvedProductionOnly && !isProduction()) {
|
|
171
267
|
return;
|
|
@@ -174,7 +270,7 @@ export function showConsoleWarning(options = {}) {
|
|
|
174
270
|
return;
|
|
175
271
|
}
|
|
176
272
|
const translations = mergeTranslations(translationOverrides);
|
|
177
|
-
const lang = (forceLang || detectLanguage("en"))
|
|
273
|
+
const lang = normalizeLanguageTag(forceLang || detectLanguage("en"));
|
|
178
274
|
const { title, message, titleStyle, messageStyle } = resolveTranslation(translations, lang);
|
|
179
275
|
const payload = {
|
|
180
276
|
title,
|
|
@@ -184,9 +280,9 @@ export function showConsoleWarning(options = {}) {
|
|
|
184
280
|
clearConsole
|
|
185
281
|
};
|
|
186
282
|
if (!once) {
|
|
187
|
-
startSpam(payload);
|
|
283
|
+
startSpam(payload, resolvedConfig);
|
|
188
284
|
return;
|
|
189
285
|
}
|
|
190
|
-
logWarning(payload);
|
|
286
|
+
logWarning(payload, resolvedConfig);
|
|
191
287
|
setHasShown();
|
|
192
288
|
}
|
|
@@ -1,126 +1,182 @@
|
|
|
1
1
|
{
|
|
2
2
|
"en": {
|
|
3
3
|
"title": "STOP!",
|
|
4
|
-
"message": "This is a browser feature
|
|
4
|
+
"message": "This is a developer-only browser feature.\\nIf someone told you to paste code here, it is a scam.\\nPasting code can give attackers access to your account."
|
|
5
5
|
},
|
|
6
6
|
"es": {
|
|
7
7
|
"title": "¡ALTO!",
|
|
8
|
-
"message": "Esta es una función del navegador para desarrolladores.\\nSi alguien te pide que pegues algo aquí, es una estafa."
|
|
8
|
+
"message": "Esta es una función del navegador para desarrolladores.\\nSi alguien te pide que pegues algo aquí, es una estafa.\\nPegar código puede dar a los atacantes acceso a tu cuenta."
|
|
9
9
|
},
|
|
10
10
|
"fr": {
|
|
11
11
|
"title": "STOP !",
|
|
12
|
-
"message": "Ceci est une fonctionnalité du navigateur pour les développeurs.\\nSi quelqu'un vous demande de coller quelque chose ici, c'est une arnaque."
|
|
12
|
+
"message": "Ceci est une fonctionnalité du navigateur pour les développeurs.\\nSi quelqu'un vous demande de coller quelque chose ici, c'est une arnaque.\\nColler du code peut donner aux attaquants l'accès à votre compte."
|
|
13
13
|
},
|
|
14
14
|
"de": {
|
|
15
15
|
"title": "STOPP!",
|
|
16
|
-
"message": "Dies ist eine Browserfunktion für Entwickler.\\nWenn dich jemand bittet, hier etwas einzufügen, ist das Betrug."
|
|
16
|
+
"message": "Dies ist eine Browserfunktion für Entwickler.\\nWenn dich jemand bittet, hier etwas einzufügen, ist das Betrug.\\nDas Einfügen von Code kann Angreifern Zugriff auf dein Konto geben."
|
|
17
17
|
},
|
|
18
18
|
"it": {
|
|
19
19
|
"title": "STOP!",
|
|
20
|
-
"message": "Questa è una funzione del browser per sviluppatori.\\nSe qualcuno ti chiede di incollare qualcosa qui, è una truffa."
|
|
20
|
+
"message": "Questa è una funzione del browser per sviluppatori.\\nSe qualcuno ti chiede di incollare qualcosa qui, è una truffa.\\nIncollare codice può dare agli aggressori accesso al tuo account."
|
|
21
21
|
},
|
|
22
22
|
"pt": {
|
|
23
23
|
"title": "PARE!",
|
|
24
|
-
"message": "Este é um recurso do navegador para desenvolvedores.\\nSe alguém pedir para você colar algo aqui, é um golpe."
|
|
24
|
+
"message": "Este é um recurso do navegador para desenvolvedores.\\nSe alguém pedir para você colar algo aqui, é um golpe.\\nColar código pode dar aos atacantes acesso à sua conta."
|
|
25
25
|
},
|
|
26
26
|
"nl": {
|
|
27
27
|
"title": "STOP!",
|
|
28
|
-
"message": "Dit is een browserfunctie voor ontwikkelaars.\\nAls iemand je vraagt hier iets te plakken, is dat oplichting."
|
|
28
|
+
"message": "Dit is een browserfunctie voor ontwikkelaars.\\nAls iemand je vraagt hier iets te plakken, is dat oplichting.\\nCode plakken kan aanvallers toegang geven tot je account."
|
|
29
29
|
},
|
|
30
30
|
"sv": {
|
|
31
31
|
"title": "STOPP!",
|
|
32
|
-
"message": "Det här är en webbläsarfunktion för utvecklare.\\nOm någon ber dig klistra in något här är det en bluff."
|
|
32
|
+
"message": "Det här är en webbläsarfunktion för utvecklare.\\nOm någon ber dig klistra in något här är det en bluff.\\nAtt klistra in kod kan ge angripare åtkomst till ditt konto."
|
|
33
33
|
},
|
|
34
34
|
"no": {
|
|
35
35
|
"title": "STOPP!",
|
|
36
|
-
"message": "Dette er en nettleserfunksjon for utviklere.\\nHvis noen ber deg lime inn noe her, er det svindel."
|
|
36
|
+
"message": "Dette er en nettleserfunksjon for utviklere.\\nHvis noen ber deg lime inn noe her, er det svindel.\\nÅ lime inn kode kan gi angripere tilgang til kontoen din."
|
|
37
|
+
},
|
|
38
|
+
"nb": {
|
|
39
|
+
"title": "STOPP!",
|
|
40
|
+
"message": "Dette er en nettleserfunksjon for utviklere.\\nHvis noen ber deg lime inn noe her, er det svindel.\\nÅ lime inn kode kan gi angripere tilgang til kontoen din."
|
|
37
41
|
},
|
|
38
42
|
"da": {
|
|
39
43
|
"title": "STOP!",
|
|
40
|
-
"message": "Dette er en browserfunktion for udviklere.\\nHvis nogen beder dig om at indsætte noget her, er det snyd."
|
|
44
|
+
"message": "Dette er en browserfunktion for udviklere.\\nHvis nogen beder dig om at indsætte noget her, er det snyd.\\nAt indsætte kode kan give angribere adgang til din konto."
|
|
41
45
|
},
|
|
42
46
|
"fi": {
|
|
43
47
|
"title": "SEIS!",
|
|
44
|
-
"message": "Tämä on selaimen ominaisuus kehittäjille.\\nJos joku pyytää sinua liittämään jotain tähän, se on huijaus."
|
|
48
|
+
"message": "Tämä on selaimen ominaisuus kehittäjille.\\nJos joku pyytää sinua liittämään jotain tähän, se on huijaus.\\nKoodin liittäminen voi antaa hyökkääjille pääsyn tiliisi."
|
|
45
49
|
},
|
|
46
50
|
"ru": {
|
|
47
51
|
"title": "СТОП!",
|
|
48
|
-
"message": "Это функция браузера для разработчиков.\\nЕсли кто-то просит вставить сюда что-то — это
|
|
52
|
+
"message": "Это функция браузера для разработчиков.\\nЕсли кто-то просит вставить сюда что-то — это мошенничество.\\nВставка кода может дать злоумышленникам доступ к вашему аккаунту."
|
|
49
53
|
},
|
|
50
54
|
"uk": {
|
|
51
55
|
"title": "СТОП!",
|
|
52
|
-
"message": "Це функція браузера для розробників.\\nЯкщо хтось просить вставити щось сюди — це
|
|
56
|
+
"message": "Це функція браузера для розробників.\\nЯкщо хтось просить вставити щось сюди — це шахрайство.\\nВставлення коду може надати зловмисникам доступ до вашого облікового запису."
|
|
53
57
|
},
|
|
54
58
|
"pl": {
|
|
55
59
|
"title": "STOP!",
|
|
56
|
-
"message": "To funkcja przeglądarki dla deweloperów.\\nJeśli ktoś prosi, abyś wkleił coś tutaj, to oszustwo."
|
|
60
|
+
"message": "To funkcja przeglądarki dla deweloperów.\\nJeśli ktoś prosi, abyś wkleił coś tutaj, to oszustwo.\\nWklejenie kodu może dać atakującym dostęp do Twojego konta."
|
|
57
61
|
},
|
|
58
62
|
"cs": {
|
|
59
63
|
"title": "STOP!",
|
|
60
|
-
"message": "Toto je funkce prohlížeče pro vývojáře.\\nPokud vás někdo požádá, abyste sem něco vložili, je to podvod."
|
|
64
|
+
"message": "Toto je funkce prohlížeče pro vývojáře.\\nPokud vás někdo požádá, abyste sem něco vložili, je to podvod.\\nVložení kódu může dát útočníkům přístup k vašemu účtu."
|
|
61
65
|
},
|
|
62
66
|
"sk": {
|
|
63
67
|
"title": "STOP!",
|
|
64
|
-
"message": "Toto je funkcia prehliadača pre vývojárov.\\nAk vás niekto požiada, aby ste sem niečo vložili, je to podvod."
|
|
68
|
+
"message": "Toto je funkcia prehliadača pre vývojárov.\\nAk vás niekto požiada, aby ste sem niečo vložili, je to podvod.\\nVloženie kódu môže dať útočníkom prístup k vášmu účtu."
|
|
65
69
|
},
|
|
66
70
|
"hu": {
|
|
67
71
|
"title": "ÁLLJ!",
|
|
68
|
-
"message": "Ez egy böngészőfunkció fejlesztőknek.\\nHa valaki arra kér, hogy ide másolj valamit, az átverés."
|
|
72
|
+
"message": "Ez egy böngészőfunkció fejlesztőknek.\\nHa valaki arra kér, hogy ide másolj valamit, az átverés.\\nKód beillesztése hozzáférést adhat a támadóknak a fiókodhoz."
|
|
69
73
|
},
|
|
70
74
|
"ro": {
|
|
71
75
|
"title": "STOP!",
|
|
72
|
-
"message": "Aceasta este o funcție a browserului pentru dezvoltatori.\\nDacă cineva îți cere să lipești ceva aici, este o înșelătorie."
|
|
76
|
+
"message": "Aceasta este o funcție a browserului pentru dezvoltatori.\\nDacă cineva îți cere să lipești ceva aici, este o înșelătorie.\\nLipirea codului poate oferi atacatorilor acces la contul tău."
|
|
73
77
|
},
|
|
74
78
|
"bg": {
|
|
75
79
|
"title": "СТОП!",
|
|
76
|
-
"message": "Това е функция на браузъра за разработчици.\\nАко някой ви помоли да поставите нещо тук, това е
|
|
80
|
+
"message": "Това е функция на браузъра за разработчици.\\nАко някой ви помоли да поставите нещо тук, това е измама.\\nПоставянето на код може да даде на нападатели достъп до вашия акаунт."
|
|
77
81
|
},
|
|
78
82
|
"tr": {
|
|
79
83
|
"title": "DUR!",
|
|
80
|
-
"message": "Bu, geliştiriciler için bir tarayıcı özelliğidir.\\nBirisi buraya bir şey yapıştırmanı isterse, bu bir dolandırıcılıktır."
|
|
84
|
+
"message": "Bu, geliştiriciler için bir tarayıcı özelliğidir.\\nBirisi buraya bir şey yapıştırmanı isterse, bu bir dolandırıcılıktır.\\nKod yapıştırmak, saldırganların hesabınıza erişmesine neden olabilir."
|
|
81
85
|
},
|
|
82
86
|
"el": {
|
|
83
87
|
"title": "ΣΤΟΠ!",
|
|
84
|
-
"message": "Αυτή είναι μια λειτουργία του προγράμματος περιήγησης για προγραμματιστές.\\nΑν κάποιος σας ζητήσει να επικολλήσετε κάτι εδώ, είναι
|
|
88
|
+
"message": "Αυτή είναι μια λειτουργία του προγράμματος περιήγησης για προγραμματιστές.\\nΑν κάποιος σας ζητήσει να επικολλήσετε κάτι εδώ, είναι απάτη.\\nΗ επικόλληση κώδικα μπορεί να δώσει στους επιτιθέμενους πρόσβαση στον λογαριασμό σας."
|
|
85
89
|
},
|
|
86
90
|
"ar": {
|
|
87
91
|
"title": "توقف!",
|
|
88
|
-
"message": "هذه ميزة في المتصفح للمطورين.\\nإذا طلب منك أحد لصق شيء هنا، فهذه عملية
|
|
92
|
+
"message": "هذه ميزة في المتصفح للمطورين.\\nإذا طلب منك أحد لصق شيء هنا، فهذه عملية احتيال.\\nلصق الشفرة يمكن أن يمنح المهاجمين إمكانية الوصول إلى حسابك."
|
|
89
93
|
},
|
|
90
94
|
"he": {
|
|
91
95
|
"title": "עצור!",
|
|
92
|
-
"message": "זו תכונת דפדפן למפתחים.\\nאם מישהו מבקש ממך להדביק משהו כאן, זו
|
|
96
|
+
"message": "זו תכונת דפדפן למפתחים.\\nאם מישהו מבקש ממך להדביק משהו כאן, זו הונאה.\\nהדבקת קוד יכולה לתת לתוקפים גישה לחשבון שלך."
|
|
93
97
|
},
|
|
94
98
|
"hi": {
|
|
95
99
|
"title": "रुको!",
|
|
96
|
-
"message": "यह डेवलपर्स के लिए ब्राउज़र की सुविधा है।\\nयदि कोई आपसे यहां कुछ पेस्ट करने को कहे, तो यह धोखाधड़ी है।"
|
|
100
|
+
"message": "यह डेवलपर्स के लिए ब्राउज़र की सुविधा है।\\nयदि कोई आपसे यहां कुछ पेस्ट करने को कहे, तो यह धोखाधड़ी है।\\nकोड पेस्ट करने से हमलावरों को आपके खाते तक पहुंच मिल सकती है।"
|
|
97
101
|
},
|
|
98
102
|
"th": {
|
|
99
103
|
"title": "หยุด!",
|
|
100
|
-
"message": "นี่เป็นฟีเจอร์ของเบราว์เซอร์สำหรับนักพัฒนา\\nหากมีคนขอให้คุณวางบางอย่างที่นี่
|
|
104
|
+
"message": "นี่เป็นฟีเจอร์ของเบราว์เซอร์สำหรับนักพัฒนา\\nหากมีคนขอให้คุณวางบางอย่างที่นี่ นี่คือการหลอกลวง\\nการวางโค้ดอาจทำให้ผู้โจมตีเข้าถึงบัญชีของคุณได้"
|
|
101
105
|
},
|
|
102
106
|
"vi": {
|
|
103
107
|
"title": "DỪNG!",
|
|
104
|
-
"message": "Đây là một tính năng của trình duyệt dành cho lập trình viên.\\nNếu ai đó yêu cầu bạn dán thứ gì đó vào đây, đó là lừa đảo."
|
|
108
|
+
"message": "Đây là một tính năng của trình duyệt dành cho lập trình viên.\\nNếu ai đó yêu cầu bạn dán thứ gì đó vào đây, đó là lừa đảo.\\nViệc dán mã có thể cho kẻ tấn công quyền truy cập vào tài khoản của bạn."
|
|
105
109
|
},
|
|
106
110
|
"id": {
|
|
107
111
|
"title": "BERHENTI!",
|
|
108
|
-
"message": "Ini adalah fitur browser untuk pengembang.\\nJika seseorang meminta Anda menempelkan sesuatu di sini, itu penipuan."
|
|
112
|
+
"message": "Ini adalah fitur browser untuk pengembang.\\nJika seseorang meminta Anda menempelkan sesuatu di sini, itu penipuan.\\nMenempelkan kode dapat memberi penyerang akses ke akun Anda."
|
|
109
113
|
},
|
|
110
114
|
"ms": {
|
|
111
115
|
"title": "BERHENTI!",
|
|
112
|
-
"message": "Ini adalah ciri pelayar untuk pembangun.\\nJika seseorang meminta anda menampal sesuatu di sini, itu penipuan."
|
|
116
|
+
"message": "Ini adalah ciri pelayar untuk pembangun.\\nJika seseorang meminta anda menampal sesuatu di sini, itu penipuan.\\nMenampal kod boleh memberi penyerang akses kepada akaun anda."
|
|
113
117
|
},
|
|
114
118
|
"zh": {
|
|
115
119
|
"title": "停止!",
|
|
116
|
-
"message": "这是给开发者使用的浏览器功能。\\n
|
|
120
|
+
"message": "这是给开发者使用的浏览器功能。\\n如果有人让你在这里粘贴内容,那是诈骗。\\n粘贴代码可能会让攻击者访问你的账户。"
|
|
117
121
|
},
|
|
118
122
|
"ja": {
|
|
119
123
|
"title": "停止!",
|
|
120
|
-
"message": "これは開発者向けのブラウザー機能です。\\n
|
|
124
|
+
"message": "これは開発者向けのブラウザー機能です。\\nここに何かを貼り付けるよう求められたら、それは詐欺です。\\nコードを貼り付けると、攻撃者があなたのアカウントにアクセスできる可能性があります。"
|
|
121
125
|
},
|
|
122
126
|
"ko": {
|
|
123
127
|
"title": "멈춰!",
|
|
124
|
-
"message": "이것은 개발자를 위한 브라우저 기능입니다.\\n여기에 무언가를 붙여 넣으라고 요청받으면
|
|
128
|
+
"message": "이것은 개발자를 위한 브라우저 기능입니다.\\n여기에 무언가를 붙여 넣으라고 요청받으면 사기입니다.\\n코드를 붙여 넣으면 공격자가 계정에 접근할 수 있습니다."
|
|
129
|
+
},
|
|
130
|
+
"et": {
|
|
131
|
+
"title": "STOPP!",
|
|
132
|
+
"message": "See on arendajatele mõeldud brauserifunktsioon.\\nKui keegi palub sul siia midagi kleepida, on see pettus.\\nKoodi kleepimine võib anda ründajatele ligipääsu sinu kontole."
|
|
133
|
+
},
|
|
134
|
+
"lt": {
|
|
135
|
+
"title": "STOP!",
|
|
136
|
+
"message": "Tai naršyklės funkcija, skirta kūrėjams.\\nJei kas nors prašo čia ką nors įklijuoti, tai apgaulė.\\nKodo įklijavimas gali suteikti užpuolikams prieigą prie jūsų paskyros."
|
|
137
|
+
},
|
|
138
|
+
"lv": {
|
|
139
|
+
"title": "STOP!",
|
|
140
|
+
"message": "Šī ir pārlūka funkcija izstrādātājiem.\\nJa kāds lūdz šeit kaut ko ielīmēt, tā ir krāpšana.\\nKoda ielīmēšana var dot uzbrucējiem piekļuvi jūsu kontam."
|
|
141
|
+
},
|
|
142
|
+
"hr": {
|
|
143
|
+
"title": "STOP!",
|
|
144
|
+
"message": "Ovo je značajka preglednika namijenjena razvojnim programerima.\\nAko vas netko traži da ovdje zalijepite nešto, to je prijevara.\\nLijepljenje koda može napadačima dati pristup vašem računu."
|
|
145
|
+
},
|
|
146
|
+
"sl": {
|
|
147
|
+
"title": "STOP!",
|
|
148
|
+
"message": "To je funkcija brskalnika za razvijalce.\\nČe vas kdo prosi, da sem prilepite nekaj, je to prevara.\\nLepljenje kode lahko napadalcem omogoči dostop do vašega računa."
|
|
149
|
+
},
|
|
150
|
+
"sr": {
|
|
151
|
+
"title": "СТОП!",
|
|
152
|
+
"message": "Ово је функција прегледача за програмере.\\nАко вам неко тражи да овде налепите нешто, то је превара.\\nЛепљење кода може омогућити нападачима приступ вашем налогу."
|
|
153
|
+
},
|
|
154
|
+
"mk": {
|
|
155
|
+
"title": "СТОП!",
|
|
156
|
+
"message": "Ова е функција на прелистувачот за програмери.\\nАко некој бара да залепите нешто тука, тоа е измама.\\nЛепењето код може да им даде пристап на напаѓачите до вашата сметка."
|
|
157
|
+
},
|
|
158
|
+
"sq": {
|
|
159
|
+
"title": "NDALO!",
|
|
160
|
+
"message": "Kjo është një veçori e shfletuesit për zhvilluesit.\\nNëse dikush ju kërkon të ngjitni diçka këtu, është mashtrim.\\nNgjitja e kodit mund t'u japë sulmuesve qasje në llogarinë tuaj."
|
|
161
|
+
},
|
|
162
|
+
"is": {
|
|
163
|
+
"title": "STOPP!",
|
|
164
|
+
"message": "Þetta er vafraeiginleiki fyrir forritara.\\nEf einhver biður þig um að líma eitthvað hér, þá er það svindl.\\nAð líma inn kóða getur veitt árásaraðilum aðgang að reikningnum þínum."
|
|
165
|
+
},
|
|
166
|
+
"ga": {
|
|
167
|
+
"title": "STOP!",
|
|
168
|
+
"message": "Gné de bhrabhsálaí do fhorbróirí atá anseo.\\nMá iarrann duine ort rud éigin a ghreamú anseo, is camscéim é.\\nIs féidir le cód a ghreamú rochtain a thabhairt d'ionsaitheoirí ar do chuntas."
|
|
169
|
+
},
|
|
170
|
+
"fa": {
|
|
171
|
+
"title": "توقف!",
|
|
172
|
+
"message": "این یک قابلیت مرورگر برای توسعهدهندگان است.\\nاگر کسی از شما خواست چیزی را اینجا جایگذاری کنید، این یک کلاهبرداری است.\\nجایگذاری کد میتواند به مهاجمان امکان دسترسی به حساب شما را بدهد."
|
|
173
|
+
},
|
|
174
|
+
"ur": {
|
|
175
|
+
"title": "رکیں!",
|
|
176
|
+
"message": "یہ ڈویلپرز کے لیے براؤزر کی ایک خصوصیت ہے۔\\nاگر کوئی آپ سے یہاں کچھ پیسٹ کرنے کو کہے، تو یہ دھوکہ ہے۔\\nکوڈ پیسٹ کرنا حملہ آوروں کو آپ کے اکاؤنٹ تک رسائی دے سکتا ہے۔"
|
|
177
|
+
},
|
|
178
|
+
"bn": {
|
|
179
|
+
"title": "থামুন!",
|
|
180
|
+
"message": "এটি ডেভেলপারদের জন্য একটি ব্রাউজার ফিচার।\\nযদি কেউ আপনাকে এখানে কিছু পেস্ট করতে বলে, এটি প্রতারণা।\\nকোড পেস্ট করা আক্রমণকারীদের আপনার অ্যাকাউন্টে প্রবেশাধিকার দিতে পারে।"
|
|
125
181
|
}
|
|
126
182
|
}
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "console-self-xss-warning",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "Show a self-XSS warning in the browser console.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
8
|
"license": "MIT",
|
|
9
|
-
"author": "
|
|
9
|
+
"author": "Nikita Kononenko <nick@knko.me> (https://github.com/jadnast)",
|
|
10
|
+
"publisher": "Hikasami",
|
|
10
11
|
"repository": {
|
|
11
12
|
"type": "git",
|
|
12
13
|
"url": "git+https://github.com/hksm-app/console-self-xss-warning.git"
|