diff --git a/@gi-types/cairo/override.d.ts b/@gi-types/cairo/override.d.ts index 48a07048..20893397 100644 --- a/@gi-types/cairo/override.d.ts +++ b/@gi-types/cairo/override.d.ts @@ -46,7 +46,7 @@ export interface Context { pushGroupWithContent(content: number): void; popGroupToSource(): void; rectangle(x: number, y: number, width: number, height: number): void; - relCurveTo(dx1: number, dy1: number, dx2: number, dy2: number, dx3: number, dy3: number); + relCurveTo(dx1: number, dy1: number, dx2: number, dy2: number, dx3: number, dy3: number): void; relLineTo(dx: number, dy: number): void; relMoveTo(dx: number, dy: number): void; resetClip(): void; diff --git a/@gi-types/glib/index.d.ts b/@gi-types/glib/index.d.ts index 202ff30a..c8251418 100644 --- a/@gi-types/glib/index.d.ts +++ b/@gi-types/glib/index.d.ts @@ -4265,7 +4265,7 @@ export class Variant { static ["new"](sig: S, value: $ParseDeepVariant): Variant; static _new_internal(sig: S, value: $ParseDeepVariant): Variant; static new_array( - child_type?: VariantType | null, + child_type: VariantType, children?: Variant<$VariantTypeToString>[] | null ): Variant<`a${C}`>; static new_boolean(value: boolean): Variant<"b">; diff --git a/package-lock.json b/package-lock.json index efc55278..43923bfa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,11 +41,12 @@ "rollup-plugin-copy": "^3.4.0", "tsc-watch": "^4.2.9", "tslib": "^2.2.0", - "typescript": "^4.1.3" + "typescript": "^4.6.3" } }, "node_modules/@babel/code-frame": { "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "dependencies": { @@ -69,6 +70,7 @@ }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { @@ -101,6 +103,7 @@ }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "dev": true, "dependencies": { @@ -115,6 +118,7 @@ }, "node_modules/@eslint/eslintrc/node_modules/ignore": { "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, "engines": { @@ -123,6 +127,7 @@ }, "node_modules/@gi-types/atk": { "version": "2.36.7", + "resolved": "https://registry.npmjs.org/@gi-types/atk/-/atk-2.36.7.tgz", "integrity": "sha512-PWR/EqgBgqehMfDr48fqvy77yGEKLwtqN0qKnKOtWqDm65LbImoAFydlMx5CUeyE/ZNcGDhQGLimQ0Rk6kVivw==", "dev": true, "dependencies": { @@ -132,6 +137,7 @@ }, "node_modules/@gi-types/cairo": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@gi-types/cairo/-/cairo-1.0.3.tgz", "integrity": "sha512-IT4JbSYgMj2aJbx7Yy8nzHgga2vX5i5OHR2+vXKc9vg/wrnExHiSbacWbxO7CZdk6YBqpH/7cjOa4bkTmBN8tg==", "dev": true, "dependencies": { @@ -140,6 +146,7 @@ }, "node_modules/@gi-types/cally": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@gi-types/cally/-/cally-7.0.3.tgz", "integrity": "sha512-mezisdoGvnewxncjpejrAa2XO0WIYsv+jD+olQu49cSU3BIBI9vmVMd1cmkngTGqombkd/2C9KwFMq1ZvEOhiQ==", "dev": true, "dependencies": { @@ -152,6 +159,7 @@ }, "node_modules/@gi-types/clutter": { "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@gi-types/clutter/-/clutter-7.0.6.tgz", "integrity": "sha512-hLQ5K+wnq40B1VWFVJPtENw82at2SHHE1CN+BCagjO6L9PpAvO9sCV9uUSbl9K5zrzcfgxYdwFrXW5NP6wSKTg==", "dev": true, "dependencies": { @@ -180,6 +188,7 @@ }, "node_modules/@gi-types/cogl": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@gi-types/cogl/-/cogl-7.0.3.tgz", "integrity": "sha512-yub8mzFnUvZfcBGCxeTS/mShT9pOWcx/FaVmBU+NCEdUlv6LwA+kaVeDJx9SjVFOIrybsJ06q7f/QedkQOfUQQ==", "dev": true, "dependencies": { @@ -191,6 +200,7 @@ }, "node_modules/@gi-types/coglpango": { "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@gi-types/coglpango/-/coglpango-7.0.2.tgz", "integrity": "sha512-YH6lmMZeo5HU9mhekIKAtj1OCvK2D+l8hzr1NDz5UIxR1K3oAYqu3sMX1EI0dB24pxcn+mqq/J4xpMO50sCnJA==", "dev": true, "dependencies": { @@ -201,6 +211,7 @@ }, "node_modules/@gi-types/gck": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@gi-types/gck/-/gck-1.0.6.tgz", "integrity": "sha512-yjbVHprwZ6KE3B/JqMFgHJvAgULuSs0obEWMJFeSpXHgke5Vab8a2Gi0pXdwU5AHVD1rVxhNy/8dkRdiIucwoA==", "dev": true, "dependencies": { @@ -222,6 +233,7 @@ }, "node_modules/@gi-types/gdesktopenums": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@gi-types/gdesktopenums/-/gdesktopenums-3.0.3.tgz", "integrity": "sha512-2Ng2uCCZcgASARPcIxapkTFrkM5std3ANUeW1pc4CJ4ZXLYgwSad8IQxJ4wB7hXkhZR9CYXmoA4KBmScjaHfyA==", "dev": true, "dependencies": { @@ -244,6 +256,7 @@ }, "node_modules/@gi-types/gdkpixbuf": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@gi-types/gdkpixbuf/-/gdkpixbuf-2.0.5.tgz", "integrity": "sha512-bLw6CFCbM0SNi30vkbupoVxE7T5hz+V6DQHLa1Sh0yYwm8OTQ8jYofZNTabfjBiTR3Z4dxtN65DkIpJoD+9fuQ==", "dev": true, "dependencies": { @@ -254,6 +267,7 @@ }, "node_modules/@gi-types/gio": { "version": "2.66.9", + "resolved": "https://registry.npmjs.org/@gi-types/gio/-/gio-2.66.9.tgz", "integrity": "sha512-hRqJqQSQ4jLjUSiS7XZ7pXvIdu/+ZuFvIGPqrLFXyYa+aTenHiYg/EaLR3iPbAzkvpyBLRZk7Pmgs0quoK+Vtg==", "dev": true, "dependencies": { @@ -263,6 +277,7 @@ }, "node_modules/@gi-types/glib": { "version": "2.66.10", + "resolved": "https://registry.npmjs.org/@gi-types/glib/-/glib-2.66.10.tgz", "integrity": "sha512-x34Y/xngzSS/BjA38/XpZjAzQqdWdUFtEVKsAGIMi4g+2ZES5QvBLkg/vNHwzSeoY/vUf+E/aZ3+6xQZFUzRjg==", "dev": true, "dependencies": { @@ -271,6 +286,7 @@ }, "node_modules/@gi-types/gmodule": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@gi-types/gmodule/-/gmodule-2.0.0.tgz", "integrity": "sha512-ZpDYYbNcz+YEZAVyQl+y4lNO0xSK8E+F4wBIIy98IGtVa35ZjNkeZhuD9uI0ms/FakMOFDTqbV1sVXRmCkcrxA==", "dev": true, "dependencies": { @@ -280,6 +296,7 @@ }, "node_modules/@gi-types/gobject": { "version": "2.66.9", + "resolved": "https://registry.npmjs.org/@gi-types/gobject/-/gobject-2.66.9.tgz", "integrity": "sha512-fr6a0W0UfLQiYYuQg4ZY+u4oFgC0QacjffbCBupiVHyC4NVDH2FbWiEVQEb0V52QmSEZTAfRyc/ZgmDzwpUXuw==", "dev": true, "dependencies": { @@ -288,6 +305,7 @@ }, "node_modules/@gi-types/graphene": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@gi-types/graphene/-/graphene-1.0.1.tgz", "integrity": "sha512-XWzEdAWdvsJH2ieraRhbXqyoFXXG2HP2P8amSpryBsXuWaiessnhsNKgB+pu93cgrW029nnYJMb6AUJodASMrw==", "dev": true, "dependencies": { @@ -344,6 +362,7 @@ }, "node_modules/@gi-types/harfbuzz": { "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@gi-types/harfbuzz/-/harfbuzz-0.0.0.tgz", "integrity": "sha512-pqhpLBN5aYl2P6yOPo0HCZTLmcTDiynGkEgfEq1yPwY0qhJpuEJYmaVUzwb7RrQrt7absVZP7ClhhO8TYiporw==", "dev": true, "dependencies": { @@ -353,6 +372,7 @@ }, "node_modules/@gi-types/json": { "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@gi-types/json/-/json-1.6.6.tgz", "integrity": "sha512-YtnjubEVEmnGirOlcwNkwD9hftaOKuJv2t0HnNFXcHuBCZpD72Jt5iuUtyFFvF7cduVR/jAXh71fw5U3kMYB8g==", "dev": true, "dependencies": { @@ -363,6 +383,7 @@ }, "node_modules/@gi-types/meta": { "version": "3.38.5", + "resolved": "https://registry.npmjs.org/@gi-types/meta/-/meta-3.38.5.tgz", "integrity": "sha512-EzYGvZu58j/hDZv/zQX4ooL0Pq4TEP2Okhn0JlVmGpFIB65ZWOkCHQqj3LODdpp327+cWMNYkG5WHZXJAmtuZQ==", "dev": true, "dependencies": { @@ -383,6 +404,7 @@ }, "node_modules/@gi-types/meta/node_modules/@gi-types/gdk": { "version": "3.24.7", + "resolved": "https://registry.npmjs.org/@gi-types/gdk/-/gdk-3.24.7.tgz", "integrity": "sha512-t50PlPeiqeNNQvXcKuso7/aiy1zm2zNtDgXZgcmtCfjk2u9m4m5gC4/kePzfYtSBqo15FZdv747ESRLC0zNk6Q==", "dev": true, "dependencies": { @@ -396,6 +418,7 @@ }, "node_modules/@gi-types/meta/node_modules/@gi-types/gtk": { "version": "3.24.9", + "resolved": "https://registry.npmjs.org/@gi-types/gtk/-/gtk-3.24.9.tgz", "integrity": "sha512-U2LH7hKlIvPAvjVe0eQX8s6MDjYaFKCRpAGmwR3lIoBPIdvYOyy76odGY1suFKrepBa97iW6JMbEcv/0f2D98w==", "dev": true, "dependencies": { @@ -412,6 +435,7 @@ }, "node_modules/@gi-types/nm": { "version": "1.28.9", + "resolved": "https://registry.npmjs.org/@gi-types/nm/-/nm-1.28.9.tgz", "integrity": "sha512-sZd0HWWJ4aeXTrbnmTlN80jkjqdAohGhhAbtdfrlnIzrR76hROuXe+vxs1dn++FwV/67c1hQuxCERD3JyqEfnw==", "dev": true, "dependencies": { @@ -422,6 +446,7 @@ }, "node_modules/@gi-types/pango": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@gi-types/pango/-/pango-1.0.5.tgz", "integrity": "sha512-FcDRuMaiYwczKcxE11ZErlOCcbBQX69d/u2hKFkhpZxQrZk0fBNTGLbwJ/7QwAoQw4RsrCzYSOZ4TX0phLPQQw==", "dev": true, "dependencies": { @@ -433,6 +458,7 @@ }, "node_modules/@gi-types/polkit": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@gi-types/polkit/-/polkit-1.0.6.tgz", "integrity": "sha512-l7FLcXXzN0ttWjRWIblHHhwZje+jzPdLbXKPNJtRmllBe2ISxVNU31Y+yxxdyXTO1JHr2R543isWEGu2yEmmAA==", "dev": true, "dependencies": { @@ -443,6 +469,7 @@ }, "node_modules/@gi-types/polkitagent": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@gi-types/polkitagent/-/polkitagent-1.0.3.tgz", "integrity": "sha512-x/u0LmV6EC8TACtxlKMIqyAYEur0FRF5P//1wMrBjWdbD0pfBm+KxMvXNCIjs3pHJ1lAZRc9t7Lo4HE03ICPew==", "dev": true, "dependencies": { @@ -477,6 +504,7 @@ }, "node_modules/@gi-types/shell/node_modules/@gi-types/gdk": { "version": "3.24.7", + "resolved": "https://registry.npmjs.org/@gi-types/gdk/-/gdk-3.24.7.tgz", "integrity": "sha512-t50PlPeiqeNNQvXcKuso7/aiy1zm2zNtDgXZgcmtCfjk2u9m4m5gC4/kePzfYtSBqo15FZdv747ESRLC0zNk6Q==", "dev": true, "dependencies": { @@ -490,6 +518,7 @@ }, "node_modules/@gi-types/shell/node_modules/@gi-types/gtk": { "version": "3.24.9", + "resolved": "https://registry.npmjs.org/@gi-types/gtk/-/gtk-3.24.9.tgz", "integrity": "sha512-U2LH7hKlIvPAvjVe0eQX8s6MDjYaFKCRpAGmwR3lIoBPIdvYOyy76odGY1suFKrepBa97iW6JMbEcv/0f2D98w==", "dev": true, "dependencies": { @@ -506,6 +535,7 @@ }, "node_modules/@gi-types/soup": { "version": "2.72.7", + "resolved": "https://registry.npmjs.org/@gi-types/soup/-/soup-2.72.7.tgz", "integrity": "sha512-fpFryknsdeKQtVIPjA5hgUTFmCCxg2o3I9dgSgz9ecBW0noKgAZF2DDXsNTSiAGRfnWFYfePnUOJLzpSqNXKGQ==", "dev": true, "dependencies": { @@ -516,6 +546,7 @@ }, "node_modules/@gi-types/st": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@gi-types/st/-/st-1.0.6.tgz", "integrity": "sha512-xXFs7t19Jmy/GVC9CJFk8oByI546BZdGG/JXx+wN54YG8d+1nX3RiZ2nVNgp2y1gYhJDTcHBRZFnPs+7QUduoQ==", "dev": true, "dependencies": { @@ -535,6 +566,7 @@ }, "node_modules/@gi-types/st/node_modules/@gi-types/gdk": { "version": "3.24.7", + "resolved": "https://registry.npmjs.org/@gi-types/gdk/-/gdk-3.24.7.tgz", "integrity": "sha512-t50PlPeiqeNNQvXcKuso7/aiy1zm2zNtDgXZgcmtCfjk2u9m4m5gC4/kePzfYtSBqo15FZdv747ESRLC0zNk6Q==", "dev": true, "dependencies": { @@ -548,6 +580,7 @@ }, "node_modules/@gi-types/st/node_modules/@gi-types/gtk": { "version": "3.24.9", + "resolved": "https://registry.npmjs.org/@gi-types/gtk/-/gtk-3.24.9.tgz", "integrity": "sha512-U2LH7hKlIvPAvjVe0eQX8s6MDjYaFKCRpAGmwR3lIoBPIdvYOyy76odGY1suFKrepBa97iW6JMbEcv/0f2D98w==", "dev": true, "dependencies": { @@ -564,6 +597,7 @@ }, "node_modules/@gi-types/xlib": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@gi-types/xlib/-/xlib-2.0.0.tgz", "integrity": "sha512-YHNrcCw/i8QX3sh5bZ+SN7xEDrmhKIqAoUh/JgiDyPqqH2du+BpQUZy/e0oM0AIZWPNFKgD5M5Bq0+1MvVS3IA==", "dev": true, "dependencies": { @@ -637,6 +671,7 @@ }, "node_modules/@rollup/pluginutils": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, "dependencies": { @@ -653,11 +688,13 @@ }, "node_modules/@rollup/pluginutils/node_modules/@types/estree": { "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, "node_modules/@rollup/pluginutils/node_modules/estree-walker": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, @@ -712,6 +749,7 @@ }, "node_modules/@types/resolve": { "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", "dev": true, "dependencies": { @@ -870,11 +908,13 @@ }, "node_modules/abbrev": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, "node_modules/acorn": { "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, "bin": { @@ -886,6 +926,7 @@ }, "node_modules/acorn-jsx": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "dev": true, "peerDependencies": { @@ -894,6 +935,7 @@ }, "node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { @@ -909,6 +951,7 @@ }, "node_modules/amdefine": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true, "engines": { @@ -917,6 +960,7 @@ }, "node_modules/ansi-colors": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true, "engines": { @@ -934,6 +978,7 @@ }, "node_modules/ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { @@ -945,11 +990,13 @@ }, "node_modules/aproba": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, "node_modules/are-we-there-yet": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "dependencies": { @@ -959,6 +1006,7 @@ }, "node_modules/argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "dependencies": { @@ -984,6 +1032,7 @@ }, "node_modules/asn1": { "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "dependencies": { @@ -992,6 +1041,7 @@ }, "node_modules/assert-plus": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true, "engines": { @@ -1011,6 +1061,7 @@ }, "node_modules/astral-regex": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, "engines": { @@ -1019,6 +1070,7 @@ }, "node_modules/async-foreach": { "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", "dev": true, "engines": { @@ -1027,11 +1079,13 @@ }, "node_modules/asynckit": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, "node_modules/aws-sign2": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "dev": true, "engines": { @@ -1040,6 +1094,7 @@ }, "node_modules/aws4": { "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, @@ -1050,6 +1105,7 @@ }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "dependencies": { @@ -1058,6 +1114,7 @@ }, "node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { @@ -1078,6 +1135,7 @@ }, "node_modules/builtin-modules": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", "dev": true, "engines": { @@ -1089,6 +1147,7 @@ }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "engines": { @@ -1123,6 +1182,7 @@ }, "node_modules/caseless": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, @@ -1144,6 +1204,7 @@ }, "node_modules/chalk/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { @@ -1158,6 +1219,7 @@ }, "node_modules/chalk/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { @@ -1169,11 +1231,13 @@ }, "node_modules/chalk/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/chalk/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { @@ -1182,6 +1246,7 @@ }, "node_modules/chalk/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { @@ -1201,6 +1266,7 @@ }, "node_modules/cliui": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "dependencies": { @@ -1211,6 +1277,7 @@ }, "node_modules/cliui/node_modules/ansi-regex": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true, "engines": { @@ -1219,11 +1286,13 @@ }, "node_modules/cliui/node_modules/emoji-regex": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "node_modules/cliui/node_modules/is-fullwidth-code-point": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true, "engines": { @@ -1232,6 +1301,7 @@ }, "node_modules/cliui/node_modules/string-width": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "dependencies": { @@ -1245,6 +1315,7 @@ }, "node_modules/cliui/node_modules/strip-ansi": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "dependencies": { @@ -1256,6 +1327,7 @@ }, "node_modules/code-point-at": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "engines": { @@ -1264,6 +1336,7 @@ }, "node_modules/color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "dependencies": { @@ -1272,6 +1345,7 @@ }, "node_modules/color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, @@ -1291,6 +1365,7 @@ }, "node_modules/combined-stream": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "dependencies": { @@ -1302,21 +1377,25 @@ }, "node_modules/concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "node_modules/console-control-strings": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, "node_modules/core-util-is": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "node_modules/cross-spawn": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { @@ -1330,6 +1409,7 @@ }, "node_modules/dashdash": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "dependencies": { @@ -1341,6 +1421,7 @@ }, "node_modules/debug": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "dependencies": { @@ -1357,6 +1438,7 @@ }, "node_modules/decamelize": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true, "engines": { @@ -1387,11 +1469,13 @@ }, "node_modules/deep-is": { "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, "node_modules/deepmerge": { "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true, "engines": { @@ -1400,6 +1484,7 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true, "engines": { @@ -1408,6 +1493,7 @@ }, "node_modules/delegates": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, @@ -1424,6 +1510,7 @@ }, "node_modules/doctrine": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "dependencies": { @@ -1440,6 +1527,7 @@ }, "node_modules/ecc-jsbn": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "dependencies": { @@ -1449,11 +1537,13 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "node_modules/enquirer": { "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, "dependencies": { @@ -1482,6 +1572,7 @@ }, "node_modules/escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true, "engines": { @@ -1574,6 +1665,7 @@ }, "node_modules/eslint-scope": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { @@ -1586,6 +1678,7 @@ }, "node_modules/eslint-utils": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "dependencies": { @@ -1600,6 +1693,7 @@ }, "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, "engines": { @@ -1616,6 +1710,7 @@ }, "node_modules/eslint/node_modules/ignore": { "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, "engines": { @@ -1624,6 +1719,7 @@ }, "node_modules/espree": { "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "dependencies": { @@ -1637,6 +1733,7 @@ }, "node_modules/espree/node_modules/eslint-visitor-keys": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, "engines": { @@ -1645,6 +1742,7 @@ }, "node_modules/esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, "bin": { @@ -1668,6 +1766,7 @@ }, "node_modules/esquery/node_modules/estraverse": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true, "engines": { @@ -1676,6 +1775,7 @@ }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "dependencies": { @@ -1687,6 +1787,7 @@ }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true, "engines": { @@ -1695,6 +1796,7 @@ }, "node_modules/estraverse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "engines": { @@ -1708,6 +1810,7 @@ }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "engines": { @@ -1730,11 +1833,13 @@ }, "node_modules/extend": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "node_modules/extsprintf": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true, "engines": [ @@ -1743,11 +1848,13 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "node_modules/fast-diff": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", "dev": true }, @@ -1769,11 +1876,13 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, @@ -1846,6 +1955,7 @@ }, "node_modules/flat-cache": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "dependencies": { @@ -1858,11 +1968,13 @@ }, "node_modules/flatted": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, "node_modules/forever-agent": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true, "engines": { @@ -1871,6 +1983,7 @@ }, "node_modules/form-data": { "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "dependencies": { @@ -1913,21 +2026,25 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "node_modules/function-bind": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "node_modules/functional-red-black-tree": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, "node_modules/gauge": { "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "dependencies": { @@ -1943,6 +2060,7 @@ }, "node_modules/gauge/node_modules/ansi-regex": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true, "engines": { @@ -1951,6 +2069,7 @@ }, "node_modules/gauge/node_modules/is-fullwidth-code-point": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "dependencies": { @@ -1962,6 +2081,7 @@ }, "node_modules/gauge/node_modules/string-width": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "dependencies": { @@ -1975,6 +2095,7 @@ }, "node_modules/gauge/node_modules/strip-ansi": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "dependencies": { @@ -1986,6 +2107,7 @@ }, "node_modules/gaze": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", "dev": true, "dependencies": { @@ -1997,6 +2119,7 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "engines": { @@ -2014,6 +2137,7 @@ }, "node_modules/getpass": { "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "dependencies": { @@ -2096,6 +2220,7 @@ }, "node_modules/globule": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", "dev": true, "dependencies": { @@ -2114,6 +2239,7 @@ }, "node_modules/har-schema": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true, "engines": { @@ -2122,6 +2248,7 @@ }, "node_modules/har-validator": { "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "deprecated": "this library is no longer supported", "dev": true, @@ -2144,6 +2271,7 @@ }, "node_modules/has": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "dependencies": { @@ -2155,6 +2283,7 @@ }, "node_modules/has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, "engines": { @@ -2163,6 +2292,7 @@ }, "node_modules/has-unicode": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true }, @@ -2180,6 +2310,7 @@ }, "node_modules/http-signature": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "dependencies": { @@ -2202,6 +2333,7 @@ }, "node_modules/import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "dependencies": { @@ -2217,6 +2349,7 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true, "engines": { @@ -2234,6 +2367,7 @@ }, "node_modules/inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "dependencies": { @@ -2243,6 +2377,7 @@ }, "node_modules/inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, @@ -2266,6 +2401,7 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true, "engines": { @@ -2274,6 +2410,7 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { @@ -2282,6 +2419,7 @@ }, "node_modules/is-glob": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "dependencies": { @@ -2293,6 +2431,7 @@ }, "node_modules/is-module": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", "dev": true }, @@ -2323,36 +2462,43 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, "node_modules/isarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "node_modules/isstream": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, "node_modules/js-base64": { "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", "dev": true }, "node_modules/js-tokens": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "node_modules/js-yaml": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { @@ -2365,6 +2511,7 @@ }, "node_modules/jsbn": { "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, @@ -2376,21 +2523,25 @@ }, "node_modules/json-schema": { "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, @@ -2404,6 +2555,7 @@ }, "node_modules/jsprim": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "engines": [ @@ -2427,6 +2579,7 @@ }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "dependencies": { @@ -2445,6 +2598,7 @@ }, "node_modules/locate-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "dependencies": { @@ -2457,6 +2611,7 @@ }, "node_modules/locate-path/node_modules/path-exists": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true, "engines": { @@ -2480,6 +2635,7 @@ }, "node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { @@ -2603,6 +2759,7 @@ }, "node_modules/minimatch": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "dependencies": { @@ -2651,16 +2808,19 @@ }, "node_modules/ms": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "node_modules/nan": { "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", "dev": true }, "node_modules/natural-compare": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, @@ -2823,6 +2983,7 @@ }, "node_modules/number-is-nan": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true, "engines": { @@ -2831,6 +2992,7 @@ }, "node_modules/oauth-sign": { "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true, "engines": { @@ -2839,6 +3001,7 @@ }, "node_modules/object-assign": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true, "engines": { @@ -2847,6 +3010,7 @@ }, "node_modules/once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "dependencies": { @@ -2855,6 +3019,7 @@ }, "node_modules/optionator": { "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "dependencies": { @@ -2871,6 +3036,7 @@ }, "node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { @@ -2885,6 +3051,7 @@ }, "node_modules/p-locate": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "dependencies": { @@ -2896,6 +3063,7 @@ }, "node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "engines": { @@ -2904,6 +3072,7 @@ }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "dependencies": { @@ -2942,6 +3111,7 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "engines": { @@ -2950,6 +3120,7 @@ }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "engines": { @@ -2980,6 +3151,7 @@ }, "node_modules/performance-now": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, @@ -2996,6 +3168,7 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "engines": { @@ -3015,6 +3188,7 @@ }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, "dependencies": { @@ -3026,11 +3200,13 @@ }, "node_modules/process-nextick-args": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, "node_modules/progress": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, "engines": { @@ -3053,11 +3229,13 @@ }, "node_modules/psl": { "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "node_modules/punycode": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true, "engines": { @@ -3066,6 +3244,7 @@ }, "node_modules/qs": { "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true, "engines": { @@ -3170,6 +3349,7 @@ }, "node_modules/readable-stream": { "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "dependencies": { @@ -3219,6 +3399,7 @@ }, "node_modules/regexpp": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true, "engines": { @@ -3230,6 +3411,7 @@ }, "node_modules/request": { "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dev": true, @@ -3261,6 +3443,7 @@ }, "node_modules/require-directory": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true, "engines": { @@ -3269,6 +3452,7 @@ }, "node_modules/require-from-string": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, "engines": { @@ -3277,6 +3461,7 @@ }, "node_modules/require-main-filename": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, @@ -3294,6 +3479,7 @@ }, "node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "engines": { @@ -3311,6 +3497,7 @@ }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { @@ -3394,16 +3581,19 @@ }, "node_modules/safe-buffer": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "node_modules/safer-buffer": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "node_modules/sass-graph": { "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", "dev": true, "dependencies": { @@ -3418,6 +3608,7 @@ }, "node_modules/scss-tokenizer": { "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", "dev": true, "dependencies": { @@ -3441,11 +3632,13 @@ }, "node_modules/set-blocking": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { @@ -3457,6 +3650,7 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "engines": { @@ -3465,11 +3659,13 @@ }, "node_modules/signal-exit": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "node_modules/slash": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "engines": { @@ -3478,6 +3674,7 @@ }, "node_modules/slice-ansi": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "dependencies": { @@ -3494,6 +3691,7 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { @@ -3508,6 +3706,7 @@ }, "node_modules/slice-ansi/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { @@ -3519,11 +3718,13 @@ }, "node_modules/slice-ansi/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/source-map": { "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "dependencies": { @@ -3578,11 +3779,13 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "node_modules/sshpk": { "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "dependencies": { @@ -3607,6 +3810,7 @@ }, "node_modules/stdout-stream": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", "dev": true, "dependencies": { @@ -3623,6 +3827,7 @@ }, "node_modules/string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "dependencies": { @@ -3677,6 +3882,7 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "engines": { @@ -3688,6 +3894,7 @@ }, "node_modules/supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { @@ -3730,6 +3937,7 @@ }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, @@ -3763,6 +3971,7 @@ }, "node_modules/text-table": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, @@ -3784,6 +3993,7 @@ }, "node_modules/tough-cookie": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "dependencies": { @@ -3805,6 +4015,7 @@ }, "node_modules/true-case-path": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", "dev": true, "dependencies": { @@ -3858,6 +4069,7 @@ }, "node_modules/tunnel-agent": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "dependencies": { @@ -3869,11 +4081,13 @@ }, "node_modules/tweetnacl": { "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, "node_modules/type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "dependencies": { @@ -3885,6 +4099,7 @@ }, "node_modules/type-fest": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, "engines": { @@ -3892,8 +4107,9 @@ } }, "node_modules/typescript": { - "version": "4.2.4", - "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -3913,6 +4129,7 @@ }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "dependencies": { @@ -3921,11 +4138,13 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "node_modules/uuid": { "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, @@ -3950,6 +4169,7 @@ }, "node_modules/verror": { "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "engines": [ @@ -3963,6 +4183,7 @@ }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { @@ -3977,11 +4198,13 @@ }, "node_modules/which-module": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "node_modules/wide-align": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "dependencies": { @@ -3990,6 +4213,7 @@ }, "node_modules/wide-align/node_modules/ansi-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true, "engines": { @@ -3998,6 +4222,7 @@ }, "node_modules/wide-align/node_modules/is-fullwidth-code-point": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true, "engines": { @@ -4006,6 +4231,7 @@ }, "node_modules/wide-align/node_modules/string-width": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "dependencies": { @@ -4018,6 +4244,7 @@ }, "node_modules/wide-align/node_modules/strip-ansi": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "dependencies": { @@ -4029,6 +4256,7 @@ }, "node_modules/word-wrap": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true, "engines": { @@ -4037,6 +4265,7 @@ }, "node_modules/wrap-ansi": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "dependencies": { @@ -4050,6 +4279,7 @@ }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true, "engines": { @@ -4058,11 +4288,13 @@ }, "node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true, "engines": { @@ -4071,6 +4303,7 @@ }, "node_modules/wrap-ansi/node_modules/string-width": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "dependencies": { @@ -4084,6 +4317,7 @@ }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "dependencies": { @@ -4095,6 +4329,7 @@ }, "node_modules/wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, @@ -4105,11 +4340,13 @@ }, "node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "node_modules/yargs": { "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "dependencies": { @@ -4127,6 +4364,7 @@ }, "node_modules/yargs-parser": { "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "dependencies": { @@ -4136,6 +4374,7 @@ }, "node_modules/yargs/node_modules/ansi-regex": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true, "engines": { @@ -4144,11 +4383,13 @@ }, "node_modules/yargs/node_modules/emoji-regex": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "node_modules/yargs/node_modules/find-up": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "dependencies": { @@ -4160,6 +4401,7 @@ }, "node_modules/yargs/node_modules/is-fullwidth-code-point": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true, "engines": { @@ -4168,6 +4410,7 @@ }, "node_modules/yargs/node_modules/string-width": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "dependencies": { @@ -4181,6 +4424,7 @@ }, "node_modules/yargs/node_modules/strip-ansi": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "dependencies": { @@ -4194,6 +4438,7 @@ "dependencies": { "@babel/code-frame": { "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { @@ -4217,6 +4462,7 @@ "dependencies": { "chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { @@ -4245,6 +4491,7 @@ "dependencies": { "globals": { "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "dev": true, "requires": { @@ -4253,6 +4500,7 @@ }, "ignore": { "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true } @@ -4260,6 +4508,7 @@ }, "@gi-types/atk": { "version": "2.36.7", + "resolved": "https://registry.npmjs.org/@gi-types/atk/-/atk-2.36.7.tgz", "integrity": "sha512-PWR/EqgBgqehMfDr48fqvy77yGEKLwtqN0qKnKOtWqDm65LbImoAFydlMx5CUeyE/ZNcGDhQGLimQ0Rk6kVivw==", "dev": true, "requires": { @@ -4269,6 +4518,7 @@ }, "@gi-types/cairo": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@gi-types/cairo/-/cairo-1.0.3.tgz", "integrity": "sha512-IT4JbSYgMj2aJbx7Yy8nzHgga2vX5i5OHR2+vXKc9vg/wrnExHiSbacWbxO7CZdk6YBqpH/7cjOa4bkTmBN8tg==", "dev": true, "requires": { @@ -4277,6 +4527,7 @@ }, "@gi-types/cally": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@gi-types/cally/-/cally-7.0.3.tgz", "integrity": "sha512-mezisdoGvnewxncjpejrAa2XO0WIYsv+jD+olQu49cSU3BIBI9vmVMd1cmkngTGqombkd/2C9KwFMq1ZvEOhiQ==", "dev": true, "requires": { @@ -4289,6 +4540,7 @@ }, "@gi-types/clutter": { "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@gi-types/clutter/-/clutter-7.0.6.tgz", "integrity": "sha512-hLQ5K+wnq40B1VWFVJPtENw82at2SHHE1CN+BCagjO6L9PpAvO9sCV9uUSbl9K5zrzcfgxYdwFrXW5NP6wSKTg==", "dev": true, "requires": { @@ -4317,6 +4569,7 @@ }, "@gi-types/cogl": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@gi-types/cogl/-/cogl-7.0.3.tgz", "integrity": "sha512-yub8mzFnUvZfcBGCxeTS/mShT9pOWcx/FaVmBU+NCEdUlv6LwA+kaVeDJx9SjVFOIrybsJ06q7f/QedkQOfUQQ==", "dev": true, "requires": { @@ -4328,6 +4581,7 @@ }, "@gi-types/coglpango": { "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@gi-types/coglpango/-/coglpango-7.0.2.tgz", "integrity": "sha512-YH6lmMZeo5HU9mhekIKAtj1OCvK2D+l8hzr1NDz5UIxR1K3oAYqu3sMX1EI0dB24pxcn+mqq/J4xpMO50sCnJA==", "dev": true, "requires": { @@ -4338,6 +4592,7 @@ }, "@gi-types/gck": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@gi-types/gck/-/gck-1.0.6.tgz", "integrity": "sha512-yjbVHprwZ6KE3B/JqMFgHJvAgULuSs0obEWMJFeSpXHgke5Vab8a2Gi0pXdwU5AHVD1rVxhNy/8dkRdiIucwoA==", "dev": true, "requires": { @@ -4359,6 +4614,7 @@ }, "@gi-types/gdesktopenums": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@gi-types/gdesktopenums/-/gdesktopenums-3.0.3.tgz", "integrity": "sha512-2Ng2uCCZcgASARPcIxapkTFrkM5std3ANUeW1pc4CJ4ZXLYgwSad8IQxJ4wB7hXkhZR9CYXmoA4KBmScjaHfyA==", "dev": true, "requires": { @@ -4381,6 +4637,7 @@ }, "@gi-types/gdkpixbuf": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@gi-types/gdkpixbuf/-/gdkpixbuf-2.0.5.tgz", "integrity": "sha512-bLw6CFCbM0SNi30vkbupoVxE7T5hz+V6DQHLa1Sh0yYwm8OTQ8jYofZNTabfjBiTR3Z4dxtN65DkIpJoD+9fuQ==", "dev": true, "requires": { @@ -4391,6 +4648,7 @@ }, "@gi-types/gio": { "version": "2.66.9", + "resolved": "https://registry.npmjs.org/@gi-types/gio/-/gio-2.66.9.tgz", "integrity": "sha512-hRqJqQSQ4jLjUSiS7XZ7pXvIdu/+ZuFvIGPqrLFXyYa+aTenHiYg/EaLR3iPbAzkvpyBLRZk7Pmgs0quoK+Vtg==", "dev": true, "requires": { @@ -4400,6 +4658,7 @@ }, "@gi-types/glib": { "version": "2.66.10", + "resolved": "https://registry.npmjs.org/@gi-types/glib/-/glib-2.66.10.tgz", "integrity": "sha512-x34Y/xngzSS/BjA38/XpZjAzQqdWdUFtEVKsAGIMi4g+2ZES5QvBLkg/vNHwzSeoY/vUf+E/aZ3+6xQZFUzRjg==", "dev": true, "requires": { @@ -4408,6 +4667,7 @@ }, "@gi-types/gmodule": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@gi-types/gmodule/-/gmodule-2.0.0.tgz", "integrity": "sha512-ZpDYYbNcz+YEZAVyQl+y4lNO0xSK8E+F4wBIIy98IGtVa35ZjNkeZhuD9uI0ms/FakMOFDTqbV1sVXRmCkcrxA==", "dev": true, "requires": { @@ -4417,6 +4677,7 @@ }, "@gi-types/gobject": { "version": "2.66.9", + "resolved": "https://registry.npmjs.org/@gi-types/gobject/-/gobject-2.66.9.tgz", "integrity": "sha512-fr6a0W0UfLQiYYuQg4ZY+u4oFgC0QacjffbCBupiVHyC4NVDH2FbWiEVQEb0V52QmSEZTAfRyc/ZgmDzwpUXuw==", "dev": true, "requires": { @@ -4425,6 +4686,7 @@ }, "@gi-types/graphene": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@gi-types/graphene/-/graphene-1.0.1.tgz", "integrity": "sha512-XWzEdAWdvsJH2ieraRhbXqyoFXXG2HP2P8amSpryBsXuWaiessnhsNKgB+pu93cgrW029nnYJMb6AUJodASMrw==", "dev": true, "requires": { @@ -4481,6 +4743,7 @@ }, "@gi-types/harfbuzz": { "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@gi-types/harfbuzz/-/harfbuzz-0.0.0.tgz", "integrity": "sha512-pqhpLBN5aYl2P6yOPo0HCZTLmcTDiynGkEgfEq1yPwY0qhJpuEJYmaVUzwb7RrQrt7absVZP7ClhhO8TYiporw==", "dev": true, "requires": { @@ -4490,6 +4753,7 @@ }, "@gi-types/json": { "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@gi-types/json/-/json-1.6.6.tgz", "integrity": "sha512-YtnjubEVEmnGirOlcwNkwD9hftaOKuJv2t0HnNFXcHuBCZpD72Jt5iuUtyFFvF7cduVR/jAXh71fw5U3kMYB8g==", "dev": true, "requires": { @@ -4500,6 +4764,7 @@ }, "@gi-types/meta": { "version": "3.38.5", + "resolved": "https://registry.npmjs.org/@gi-types/meta/-/meta-3.38.5.tgz", "integrity": "sha512-EzYGvZu58j/hDZv/zQX4ooL0Pq4TEP2Okhn0JlVmGpFIB65ZWOkCHQqj3LODdpp327+cWMNYkG5WHZXJAmtuZQ==", "dev": true, "requires": { @@ -4520,6 +4785,7 @@ "dependencies": { "@gi-types/gdk": { "version": "3.24.7", + "resolved": "https://registry.npmjs.org/@gi-types/gdk/-/gdk-3.24.7.tgz", "integrity": "sha512-t50PlPeiqeNNQvXcKuso7/aiy1zm2zNtDgXZgcmtCfjk2u9m4m5gC4/kePzfYtSBqo15FZdv747ESRLC0zNk6Q==", "dev": true, "requires": { @@ -4533,6 +4799,7 @@ }, "@gi-types/gtk": { "version": "3.24.9", + "resolved": "https://registry.npmjs.org/@gi-types/gtk/-/gtk-3.24.9.tgz", "integrity": "sha512-U2LH7hKlIvPAvjVe0eQX8s6MDjYaFKCRpAGmwR3lIoBPIdvYOyy76odGY1suFKrepBa97iW6JMbEcv/0f2D98w==", "dev": true, "requires": { @@ -4551,6 +4818,7 @@ }, "@gi-types/nm": { "version": "1.28.9", + "resolved": "https://registry.npmjs.org/@gi-types/nm/-/nm-1.28.9.tgz", "integrity": "sha512-sZd0HWWJ4aeXTrbnmTlN80jkjqdAohGhhAbtdfrlnIzrR76hROuXe+vxs1dn++FwV/67c1hQuxCERD3JyqEfnw==", "dev": true, "requires": { @@ -4561,6 +4829,7 @@ }, "@gi-types/pango": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@gi-types/pango/-/pango-1.0.5.tgz", "integrity": "sha512-FcDRuMaiYwczKcxE11ZErlOCcbBQX69d/u2hKFkhpZxQrZk0fBNTGLbwJ/7QwAoQw4RsrCzYSOZ4TX0phLPQQw==", "dev": true, "requires": { @@ -4572,6 +4841,7 @@ }, "@gi-types/polkit": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@gi-types/polkit/-/polkit-1.0.6.tgz", "integrity": "sha512-l7FLcXXzN0ttWjRWIblHHhwZje+jzPdLbXKPNJtRmllBe2ISxVNU31Y+yxxdyXTO1JHr2R543isWEGu2yEmmAA==", "dev": true, "requires": { @@ -4582,6 +4852,7 @@ }, "@gi-types/polkitagent": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@gi-types/polkitagent/-/polkitagent-1.0.3.tgz", "integrity": "sha512-x/u0LmV6EC8TACtxlKMIqyAYEur0FRF5P//1wMrBjWdbD0pfBm+KxMvXNCIjs3pHJ1lAZRc9t7Lo4HE03ICPew==", "dev": true, "requires": { @@ -4616,6 +4887,7 @@ "dependencies": { "@gi-types/gdk": { "version": "3.24.7", + "resolved": "https://registry.npmjs.org/@gi-types/gdk/-/gdk-3.24.7.tgz", "integrity": "sha512-t50PlPeiqeNNQvXcKuso7/aiy1zm2zNtDgXZgcmtCfjk2u9m4m5gC4/kePzfYtSBqo15FZdv747ESRLC0zNk6Q==", "dev": true, "requires": { @@ -4629,6 +4901,7 @@ }, "@gi-types/gtk": { "version": "3.24.9", + "resolved": "https://registry.npmjs.org/@gi-types/gtk/-/gtk-3.24.9.tgz", "integrity": "sha512-U2LH7hKlIvPAvjVe0eQX8s6MDjYaFKCRpAGmwR3lIoBPIdvYOyy76odGY1suFKrepBa97iW6JMbEcv/0f2D98w==", "dev": true, "requires": { @@ -4647,6 +4920,7 @@ }, "@gi-types/soup": { "version": "2.72.7", + "resolved": "https://registry.npmjs.org/@gi-types/soup/-/soup-2.72.7.tgz", "integrity": "sha512-fpFryknsdeKQtVIPjA5hgUTFmCCxg2o3I9dgSgz9ecBW0noKgAZF2DDXsNTSiAGRfnWFYfePnUOJLzpSqNXKGQ==", "dev": true, "requires": { @@ -4657,6 +4931,7 @@ }, "@gi-types/st": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@gi-types/st/-/st-1.0.6.tgz", "integrity": "sha512-xXFs7t19Jmy/GVC9CJFk8oByI546BZdGG/JXx+wN54YG8d+1nX3RiZ2nVNgp2y1gYhJDTcHBRZFnPs+7QUduoQ==", "dev": true, "requires": { @@ -4676,6 +4951,7 @@ "dependencies": { "@gi-types/gdk": { "version": "3.24.7", + "resolved": "https://registry.npmjs.org/@gi-types/gdk/-/gdk-3.24.7.tgz", "integrity": "sha512-t50PlPeiqeNNQvXcKuso7/aiy1zm2zNtDgXZgcmtCfjk2u9m4m5gC4/kePzfYtSBqo15FZdv747ESRLC0zNk6Q==", "dev": true, "requires": { @@ -4689,6 +4965,7 @@ }, "@gi-types/gtk": { "version": "3.24.9", + "resolved": "https://registry.npmjs.org/@gi-types/gtk/-/gtk-3.24.9.tgz", "integrity": "sha512-U2LH7hKlIvPAvjVe0eQX8s6MDjYaFKCRpAGmwR3lIoBPIdvYOyy76odGY1suFKrepBa97iW6JMbEcv/0f2D98w==", "dev": true, "requires": { @@ -4707,6 +4984,7 @@ }, "@gi-types/xlib": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@gi-types/xlib/-/xlib-2.0.0.tgz", "integrity": "sha512-YHNrcCw/i8QX3sh5bZ+SN7xEDrmhKIqAoUh/JgiDyPqqH2du+BpQUZy/e0oM0AIZWPNFKgD5M5Bq0+1MvVS3IA==", "dev": true, "requires": { @@ -4759,6 +5037,7 @@ }, "@rollup/pluginutils": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, "requires": { @@ -4769,11 +5048,13 @@ "dependencies": { "@types/estree": { "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, "estree-walker": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true } @@ -4830,6 +5111,7 @@ }, "@types/resolve": { "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", "dev": true, "requires": { @@ -4914,22 +5196,26 @@ }, "abbrev": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, "acorn": { "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "acorn-jsx": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "dev": true, "requires": {} }, "ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { @@ -4941,11 +5227,13 @@ }, "amdefine": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, "ansi-colors": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, @@ -4957,6 +5245,7 @@ }, "ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { @@ -4965,11 +5254,13 @@ }, "aproba": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, "are-we-there-yet": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "requires": { @@ -4979,6 +5270,7 @@ }, "argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { @@ -4998,6 +5290,7 @@ }, "asn1": { "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "requires": { @@ -5006,6 +5299,7 @@ }, "assert-plus": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, @@ -5019,26 +5313,31 @@ }, "astral-regex": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "async-foreach": { "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", "dev": true }, "asynckit": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, "aws-sign2": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "dev": true }, "aws4": { "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, @@ -5049,6 +5348,7 @@ }, "bcrypt-pbkdf": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "requires": { @@ -5057,6 +5357,7 @@ }, "brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { @@ -5074,11 +5375,13 @@ }, "builtin-modules": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", "dev": true }, "callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, @@ -5101,6 +5404,7 @@ }, "caseless": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, @@ -5116,6 +5420,7 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { @@ -5124,6 +5429,7 @@ }, "color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { @@ -5132,16 +5438,19 @@ }, "color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { @@ -5157,6 +5466,7 @@ }, "cliui": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { @@ -5167,21 +5477,25 @@ "dependencies": { "ansi-regex": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "emoji-regex": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "string-width": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { @@ -5192,6 +5506,7 @@ }, "strip-ansi": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { @@ -5202,11 +5517,13 @@ }, "code-point-at": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { @@ -5215,6 +5532,7 @@ }, "color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, @@ -5231,6 +5549,7 @@ }, "combined-stream": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { @@ -5239,21 +5558,25 @@ }, "concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "console-control-strings": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, "core-util-is": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "cross-spawn": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { @@ -5264,6 +5587,7 @@ }, "dashdash": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { @@ -5272,6 +5596,7 @@ }, "debug": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { @@ -5280,6 +5605,7 @@ }, "decamelize": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, @@ -5303,21 +5629,25 @@ }, "deep-is": { "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, "deepmerge": { "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, "delayed-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, "delegates": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, @@ -5331,6 +5661,7 @@ }, "doctrine": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { @@ -5344,6 +5675,7 @@ }, "ecc-jsbn": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "requires": { @@ -5353,11 +5685,13 @@ }, "emoji-regex": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "enquirer": { "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, "requires": { @@ -5380,6 +5714,7 @@ }, "escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, @@ -5429,6 +5764,7 @@ "dependencies": { "ignore": { "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true } @@ -5450,6 +5786,7 @@ }, "eslint-scope": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { @@ -5459,6 +5796,7 @@ }, "eslint-utils": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "requires": { @@ -5467,6 +5805,7 @@ "dependencies": { "eslint-visitor-keys": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true } @@ -5479,6 +5818,7 @@ }, "espree": { "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { @@ -5489,6 +5829,7 @@ "dependencies": { "eslint-visitor-keys": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true } @@ -5496,6 +5837,7 @@ }, "esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, @@ -5509,6 +5851,7 @@ "dependencies": { "estraverse": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true } @@ -5516,6 +5859,7 @@ }, "esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { @@ -5524,6 +5868,7 @@ "dependencies": { "estraverse": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true } @@ -5531,6 +5876,7 @@ }, "estraverse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, @@ -5541,6 +5887,7 @@ }, "esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, @@ -5560,21 +5907,25 @@ }, "extend": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "extsprintf": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, "fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "fast-diff": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", "dev": true }, @@ -5593,11 +5944,13 @@ }, "fast-json-stable-stringify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "fast-levenshtein": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, @@ -5657,6 +6010,7 @@ }, "flat-cache": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { @@ -5666,16 +6020,19 @@ }, "flatted": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, "forever-agent": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true }, "form-data": { "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { @@ -5709,21 +6066,25 @@ }, "fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "function-bind": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "functional-red-black-tree": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, "gauge": { "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "requires": { @@ -5739,11 +6100,13 @@ "dependencies": { "ansi-regex": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { @@ -5752,6 +6115,7 @@ }, "string-width": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { @@ -5762,6 +6126,7 @@ }, "strip-ansi": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -5772,6 +6137,7 @@ }, "gaze": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", "dev": true, "requires": { @@ -5780,6 +6146,7 @@ }, "get-caller-file": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, @@ -5791,6 +6158,7 @@ }, "getpass": { "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { @@ -5848,6 +6216,7 @@ }, "globule": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", "dev": true, "requires": { @@ -5863,11 +6232,13 @@ }, "har-schema": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, "har-validator": { "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "dev": true, "requires": { @@ -5883,6 +6254,7 @@ }, "has": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { @@ -5891,11 +6263,13 @@ }, "has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "has-unicode": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true }, @@ -5910,6 +6284,7 @@ }, "http-signature": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { @@ -5925,6 +6300,7 @@ }, "import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { @@ -5934,6 +6310,7 @@ }, "imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, @@ -5945,6 +6322,7 @@ }, "inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { @@ -5954,6 +6332,7 @@ }, "inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, @@ -5974,16 +6353,19 @@ }, "is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "is-glob": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { @@ -5992,6 +6374,7 @@ }, "is-module": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", "dev": true }, @@ -6013,36 +6396,43 @@ }, "is-typedarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, "isarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "isstream": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, "js-base64": { "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", "dev": true }, "js-tokens": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { @@ -6052,6 +6442,7 @@ }, "jsbn": { "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, @@ -6063,21 +6454,25 @@ }, "json-schema": { "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, "json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, "json-stringify-safe": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, @@ -6091,6 +6486,7 @@ }, "jsprim": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { @@ -6108,6 +6504,7 @@ }, "levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { @@ -6123,6 +6520,7 @@ }, "locate-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { @@ -6132,6 +6530,7 @@ "dependencies": { "path-exists": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true } @@ -6154,6 +6553,7 @@ }, "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { @@ -6240,6 +6640,7 @@ }, "minimatch": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { @@ -6276,16 +6677,19 @@ }, "ms": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "nan": { "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", "dev": true }, "natural-compare": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, @@ -6419,21 +6823,25 @@ }, "number-is-nan": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "oauth-sign": { "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, "object-assign": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, "once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { @@ -6442,6 +6850,7 @@ }, "optionator": { "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { @@ -6455,6 +6864,7 @@ }, "p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { @@ -6463,6 +6873,7 @@ }, "p-locate": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { @@ -6471,11 +6882,13 @@ }, "p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { @@ -6502,11 +6915,13 @@ }, "path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, @@ -6531,6 +6946,7 @@ }, "performance-now": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, @@ -6541,6 +6957,7 @@ }, "prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, @@ -6551,6 +6968,7 @@ }, "prettier-linter-helpers": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, "requires": { @@ -6559,11 +6977,13 @@ }, "process-nextick-args": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, "progress": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, @@ -6577,16 +6997,19 @@ }, "psl": { "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "punycode": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, "qs": { "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, @@ -6658,6 +7081,7 @@ }, "readable-stream": { "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { @@ -6700,11 +7124,13 @@ }, "regexpp": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true }, "request": { "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "dev": true, "requires": { @@ -6732,16 +7158,19 @@ }, "require-directory": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-from-string": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, "require-main-filename": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, @@ -6756,6 +7185,7 @@ }, "resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, @@ -6766,6 +7196,7 @@ }, "rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { @@ -6819,16 +7250,19 @@ }, "safe-buffer": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "safer-buffer": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "sass-graph": { "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", "dev": true, "requires": { @@ -6840,6 +7274,7 @@ }, "scss-tokenizer": { "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", "dev": true, "requires": { @@ -6857,11 +7292,13 @@ }, "set-blocking": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { @@ -6870,21 +7307,25 @@ }, "shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "signal-exit": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "slash": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "slice-ansi": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { @@ -6895,6 +7336,7 @@ "dependencies": { "ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { @@ -6903,6 +7345,7 @@ }, "color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { @@ -6911,6 +7354,7 @@ }, "color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true } @@ -6918,6 +7362,7 @@ }, "source-map": { "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { @@ -6966,11 +7411,13 @@ }, "sprintf-js": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "sshpk": { "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { @@ -6987,6 +7434,7 @@ }, "stdout-stream": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", "dev": true, "requires": { @@ -7003,6 +7451,7 @@ }, "string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { @@ -7045,11 +7494,13 @@ }, "strip-json-comments": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { @@ -7082,6 +7533,7 @@ }, "json-schema-traverse": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true } @@ -7110,6 +7562,7 @@ }, "text-table": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, @@ -7128,6 +7581,7 @@ }, "tough-cookie": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { @@ -7143,6 +7597,7 @@ }, "true-case-path": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", "dev": true, "requires": { @@ -7183,6 +7638,7 @@ }, "tunnel-agent": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { @@ -7191,11 +7647,13 @@ }, "tweetnacl": { "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, "type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { @@ -7204,12 +7662,14 @@ }, "type-fest": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, "typescript": { - "version": "4.2.4", - "integrity": "sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", "dev": true }, "universalify": { @@ -7219,6 +7679,7 @@ }, "uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { @@ -7227,11 +7688,13 @@ }, "util-deprecate": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "uuid": { "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, @@ -7252,6 +7715,7 @@ }, "verror": { "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { @@ -7262,6 +7726,7 @@ }, "which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { @@ -7270,11 +7735,13 @@ }, "which-module": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "wide-align": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "requires": { @@ -7283,16 +7750,19 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "string-width": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { @@ -7302,6 +7772,7 @@ }, "strip-ansi": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { @@ -7312,11 +7783,13 @@ }, "word-wrap": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, "wrap-ansi": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { @@ -7327,21 +7800,25 @@ "dependencies": { "ansi-regex": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "emoji-regex": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "string-width": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { @@ -7352,6 +7829,7 @@ }, "strip-ansi": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { @@ -7362,6 +7840,7 @@ }, "wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, @@ -7372,11 +7851,13 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yargs": { "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { @@ -7394,16 +7875,19 @@ "dependencies": { "ansi-regex": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "emoji-regex": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "find-up": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { @@ -7412,11 +7896,13 @@ }, "is-fullwidth-code-point": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "string-width": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { @@ -7427,6 +7913,7 @@ }, "strip-ansi": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { @@ -7437,6 +7924,7 @@ }, "yargs-parser": { "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { diff --git a/package.json b/package.json index fa933255..50bd314c 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "rollup-plugin-copy": "^3.4.0", "tsc-watch": "^4.2.9", "tslib": "^2.2.0", - "typescript": "^4.1.3" + "typescript": "^4.6.3" }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1", diff --git a/scripts/generate_types.py b/scripts/generate_types.py index 4feb0d82..59eeb77a 100755 --- a/scripts/generate_types.py +++ b/scripts/generate_types.py @@ -17,5 +17,10 @@ "// static [\"new\"](sig: A, value: any): Variant;") text = text.replace("static _new_internal(sig: A, value: any): any;", "// static _new_internal(sig: A, value: any): any;") + text = text.replace("relCurveTo(dx1: number, dy1: number, dx2: number, dy2: number, dx3: number, dy3: number);", + "relCurveTo(dx1: number, dy1: number, dx2: number, dy2: number, dx3: number, dy3: number): void;" + ) + text = text.replace("child_type?: VariantType | null,", + "child_type: VariantType,") with open(file, "w") as f: f.write(text) diff --git a/scripts/transpile.ts b/scripts/transpile.ts index 62c52458..9a64e82e 100644 --- a/scripts/transpile.ts +++ b/scripts/transpile.ts @@ -3,21 +3,24 @@ import { walk } from 'estree-walker'; import {BaseNode, Program, ClassDeclaration, Identifier, MethodDefinition, SimpleCallExpression, BlockStatement, ClassExpression, ExpressionStatement, AssignmentExpression, FunctionDeclaration, ArrayExpression, ImportDeclaration, VariableDeclaration, ImportSpecifier} from 'estree'; import { glob } from 'glob'; import * as fs from 'fs'; +import { ASTNode } from "ast-types"; /// Test case that this script should pass. /// It should transpile `testInput` to `testOutput`. +/// Note: Typescript generates the `= TestClass_1` sometimes if you use `TestClass` as a value (not a type) inside the class. const testInput = ` import * as GLib from 'glib'; import { a, b } from 'glib'; +var TestClass_1; -let TestClass = class TestClass extends Clutter.Actor { +let TestClass = TestClass_1 = class TestClass extends Clutter.Actor { constructor(params) { super(params); // This is a test comment } }; -TestClass = __decorate([ +TestClass = TestClass_1 = __decorate([ registerGObjectClass ], TestClass); `; @@ -25,15 +28,16 @@ TestClass = __decorate([ const testOutput = ` const GLib = imports.gi.GLib; const { a, b } = imports.gi.GLib; +var TestClass_1; -let TestClass = class TestClass extends Clutter.Actor { +let TestClass = TestClass_1 = class TestClass extends Clutter.Actor { _init(params) { super._init(params); // This is a test comment } }; -TestClass = __decorate([ +TestClass = TestClass_1 = __decorate([ registerGObjectClass ], TestClass); `; @@ -111,12 +115,17 @@ function getDecoratorTargets(node: BaseNode): string[] | null { for (let child of node.body) { if (!isExpressionStatement(child)) continue; if (!isAssignmentExpression(child.expression)) continue; - if (!isSimpleCallExpression(child.expression.right)) continue; - if (!isIdentifier(child.expression.right.callee)) continue; + let rhs = child.expression.right; - if (child.expression.right.callee.name != "__decorate") continue; + // Essentially go from expressions on the form `a = b = c = d` to `a = d` + while (isAssignmentExpression(rhs)) rhs = rhs.right; - let args = child.expression.right.arguments; + if (!isSimpleCallExpression(rhs)) continue; + if (!isIdentifier(rhs.callee)) continue; + + if (rhs.callee.name != "__decorate") continue; + + let args = rhs.arguments; if (args.length != 2) continue; let decoratorFunctions = args[0]; @@ -181,6 +190,14 @@ function convertImports(text: string) { ] }); + const regexes3: [RegExp, string][] = giImports.map(x => { + const [name, importpath] = x; + return [ + new RegExp(`(const {.+) as (.+} = ${importpath};)`, "g"), + "$1: $2" + ] + }); + for (let regex of regexes) { text = text.replace(regex[0], regex[1]); } @@ -189,6 +206,12 @@ function convertImports(text: string) { text = text.replace(regex[0], regex[1]); } + for (let i = 0; i < 3; i++) { + for (let regex of regexes3) { + text = text.replace(regex[0], regex[1]); + } + } + return text; } function transpile(ast: BaseNode) { @@ -226,7 +249,6 @@ function transpile(ast: BaseNode) { } } if (isSimpleCallExpression(node)) { - // console.log(node); if (node.callee.type == "Super") { // We found a `super(...)` call // Change it to `super._init(...)` @@ -262,7 +284,15 @@ glob("build/**/*.js", {}, (er, files) => { let text = fs.readFileSync(file).toString(); text = convertImports(text); // Parse it into an AST - let ast = parse(text); + let ast: ASTNode; + try { + ast = parse(text); + } catch(e) { + console.log(`Failed to parse ${file}`); + console.log("Writing converted text to temp.js"); + fs.writeFileSync("temp.js", text); + throw e; + } // Change the things we want to change transpile(ast); // Convert it back into a string diff --git a/src/extension.ts b/src/extension.ts index 1e26c528..ff1cd994 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -22,18 +22,19 @@ import { getSettings } from 'src/utils/settings'; import * as St from 'st'; import { Async } from './utils/async'; import { polyfillClutter } from './utils/compatibility'; +import { main as Main } from 'ui'; -const Main = imports.ui.main; const Signals = imports.signals; let disableIncompatibleExtensionsModule: DisableIncompatibleExtensionsModule; -let modules: any[] | undefined; +let modules: { destroy(): void }[] | undefined; let _startupPreparedId: number | undefined; let _splashscreenTimeoutId: number | undefined; let _closingId: number | undefined; let splashscreenCalled: boolean | undefined; let splashScreens: St.Bin[] = []; const oldOverview = Main.overview; + // eslint-disable-next-line no-unused-vars function init() { log('--------------'); @@ -117,12 +118,12 @@ function loaded(disconnect: boolean) { log('----------------'); log('EXTENSION LOADED'); log('----------------'); - if (disconnect) { + if (disconnect && _startupPreparedId !== undefined) { Main.layoutManager.disconnect(_startupPreparedId); } Me.loaded = true; Me.locked = false; - if (oldOverview._visible) oldOverview.toggle(); + if (oldOverview.visible) oldOverview.toggle(); oldOverview.isDummy = true; Me.emit('extension-loaded'); Me.msNotificationManager.check(); @@ -150,7 +151,9 @@ function disable() { Me.disableInProgress = true; Async.clearAllPendingTimeout(); if (!modules) return; - global.display.disconnect(_closingId); + if (_closingId !== undefined) { + global.display.disconnect(_closingId); + } Me.emit('extension-disable'); modules.reverse().forEach((module) => { module.destroy(); diff --git a/src/layout/main.ts b/src/layout/main.ts index e00ac35b..14612c3b 100644 --- a/src/layout/main.ts +++ b/src/layout/main.ts @@ -9,8 +9,7 @@ import { HorizontalPanelPositionEnum, VerticalPanelPositionEnum, } from 'src/manager/msThemeManager'; -import { Monitor } from 'src/types/mod'; -import { assert } from 'src/utils/assert'; +import { assert, assertNotNull } from 'src/utils/assert'; import { Allocate, AllocatePreferredSize, @@ -21,7 +20,10 @@ import { reparentActor } from 'src/utils/index'; import { SignalHandle } from 'src/utils/signal'; import { TranslationAnimator } from 'src/widget/translationAnimator'; import * as St from 'st'; -const Main = imports.ui.main; +import { main as Main, layout } from 'ui'; +import { MsWorkspaceActor } from './msWorkspace/msWorkspace'; +import Monitor = layout.Monitor; + const Background = imports.ui.background; /** Extension imports */ @@ -32,13 +34,13 @@ export class MsMain extends St.Widget { static metaInfo: GObject.MetaInfo = { GTypeName: 'MsMain', }; - panelsVisible: any; + panelsVisible: boolean; monitorsContainer: MonitorContainer[]; aboveContainer: Clutter.Actor; backgroundGroup: Meta.BackgroundGroup; primaryMonitorContainer: PrimaryMonitorContainer; panel: MsPanel; - blurEffect: any; + blurEffect: Shell.BlurEffect | undefined; private _scaleChangedId: SignalHandle | undefined; // Definitely assigned because we call registerToSignals signals!: Signal[]; @@ -47,11 +49,9 @@ export class MsMain extends St.Widget { constructor() { super({}); Me.layout = this; - this.panelsVisible = Me.stateManager.getState('panels-visible'); - this.panelsVisible = - this.panelsVisible === undefined ? true : this.panelsVisible; + this.panelsVisible = Me.stateManager.getState('panels-visible') ?? true; - Main.uiGroup.insert_child_above(this, global.window_group); + Main.layoutManager.uiGroup.insert_child_above(this, global.window_group); this.monitorsContainer = []; this.aboveContainer = new Clutter.Actor(); @@ -64,7 +64,7 @@ export class MsMain extends St.Widget { this.add_child(this.backgroundGroup); this.primaryMonitorContainer = new PrimaryMonitorContainer( - this.primaryMonitor, + assertNotNull(this.primaryMonitor), this.backgroundGroup, { clip_to_allocation: true, @@ -97,8 +97,9 @@ export class MsMain extends St.Widget { const source = event.get_source(); const [x, y] = event.get_coords(); - const [x1, y1] = this.panel.get_transformed_position(); - const [width, height] = this.panel.get_transformed_size(); + // Note: The Clutter typing is incorrect. See https://gitlab.gnome.org/ewlsh/gi.ts/-/issues/2 + const [x1, y1] = this.panel.get_transformed_position() as [number, number]; + const [width, height] = this.panel.get_transformed_size() as [number, number]; if ( !(x >= x1 && x <= x1 + width && y >= y1 && y <= y1 + height) @@ -135,7 +136,7 @@ export class MsMain extends St.Widget { return; } - this.blurEffect = new Shell.BlurEffect({ + const effect = this.blurEffect = new Shell.BlurEffect({ brightness: 0.55, sigma: 60 * themeContext.scale_factor, }); @@ -144,7 +145,7 @@ export class MsMain extends St.Widget { themeContext, 'notify::scale-factor', () => { - this.blurEffect.sigma = 60 * themeContext.scale_factor; + effect.sigma = 60 * themeContext.scale_factor; } ); @@ -158,7 +159,7 @@ export class MsMain extends St.Widget { from: Me.msWorkspaceManager, id: Me.msWorkspaceManager.connect( 'switch-workspace', - (_, from, to) => { + (_, from: number, to: number) => { this.onSwitchWorkspace(from, to); } ), @@ -196,7 +197,7 @@ export class MsMain extends St.Widget { this.signals.push({ from: Main.layoutManager, id: Main.layoutManager.connect('monitors-changed', () => { - this.primaryMonitorContainer.setMonitor(this.primaryMonitor); + this.primaryMonitorContainer.setMonitor(assertNotNull(this.primaryMonitor)); const externalMonitorsDiff = Main.layoutManager.monitors.length - @@ -259,7 +260,7 @@ export class MsMain extends St.Widget { }); } - onSwitchWorkspace(_from, _to): void { + onSwitchWorkspace(_from: number, _to: number): void { this.onMsWorkspacesChanged(); } @@ -348,7 +349,7 @@ export class MsMain extends St.Widget { this.set_child_above_sibling(this.aboveContainer, null); } - setActorAbove(actor) { + setActorAbove(actor: Clutter.Actor) { reparentActor(actor, this.aboveContainer); } vfunc_get_preferred_width(_forHeight: number): [number, number] { @@ -367,15 +368,16 @@ export class MonitorContainer extends St.Widget { static metaInfo: GObject.MetaInfo = { GTypeName: 'MonitorContainer', }; - bgGroup: any; + bgGroup: Meta.BackgroundGroup; horizontalPanelSpacer: St.Widget< Clutter.LayoutManager, Clutter.ContentPrototype, Clutter.Actor >; bgManager: any; - msWorkspaceActor: any; - monitor: any; + msWorkspaceActor: MsWorkspaceActor | undefined; + // Safety: We definitely set this because we call setMonitor from the constructor + monitor!: Monitor; constructor( monitor: Monitor, @@ -421,7 +423,7 @@ export class MonitorContainer extends St.Widget { Me.layout.panelsVisible && !monitorIsFullscreen; } - setMsWorkspaceActor(actor: Clutter.Actor) { + setMsWorkspaceActor(actor: MsWorkspaceActor) { if (actor === this.msWorkspaceActor) return; if ( this.msWorkspaceActor && @@ -526,6 +528,7 @@ export class PrimaryMonitorContainer extends MonitorContainer { this.translationAnimator = new TranslationAnimator(true); this.translationAnimator.connect('transition-completed', () => { + assert(this.msWorkspaceActor !== undefined, "expected a workspace actor to exist"); reparentActor(this.msWorkspaceActor, this.workspaceContainer); this.workspaceContainer.remove_child(this.translationAnimator); this.msWorkspaceActor.updateUI(); @@ -555,7 +558,7 @@ export class PrimaryMonitorContainer extends MonitorContainer { if (!this.translationAnimator.get_parent()) { this.translationAnimator.width = this.width; this.translationAnimator.height = - Main.layoutManager.primaryMonitor.height; + assertNotNull(Main.layoutManager.primaryMonitor).height; this.workspaceContainer.add_child(this.translationAnimator); } const indexOfPrevActor = @@ -578,7 +581,7 @@ export class PrimaryMonitorContainer extends MonitorContainer { ); } - setMsWorkspaceActor(actor: Clutter.Actor) { + setMsWorkspaceActor(actor: MsWorkspaceActor) { if (actor === this.msWorkspaceActor) return; let prevActor; if (this.msWorkspaceActor) { @@ -590,7 +593,7 @@ export class PrimaryMonitorContainer extends MonitorContainer { if (!this.msWorkspaceActor.get_parent()) { reparentActor(this.msWorkspaceActor, this.workspaceContainer); } - this.msWorkspaceActor.msWorkspace.refreshFocus(true); + assertNotNull(this.msWorkspaceActor.msWorkspace).refreshFocus(true); if (prevActor) { this.setTranslation(prevActor, this.msWorkspaceActor); } diff --git a/src/layout/msWorkspace/horizontalPanel/horizontalPanel.ts b/src/layout/msWorkspace/horizontalPanel/horizontalPanel.ts index 0d2b3ad8..5a2b940b 100644 --- a/src/layout/msWorkspace/horizontalPanel/horizontalPanel.ts +++ b/src/layout/msWorkspace/horizontalPanel/horizontalPanel.ts @@ -4,8 +4,8 @@ import * as GObject from 'gobject'; import * as Gio from 'gio'; import * as St from 'st'; import * as GnomeDesktop from 'gnomedesktop'; +import { popupMenu as PopupMenu } from 'ui'; const DND = imports.ui.dnd; -const PopupMenu = imports.ui.popupMenu; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); @@ -21,9 +21,9 @@ import { LayoutSwitcher } from 'src/layout/msWorkspace/horizontalPanel/layoutSwi @registerGObjectClass export class HorizontalPanel extends St.BoxLayout { private _delegate: this; - menuManager: any; - taskBar: any; - layoutSwitcher: any; + menuManager: PopupMenu.PopupMenuManager; + taskBar: TaskBar; + layoutSwitcher: LayoutSwitcher; clockLabel: St.Label | undefined; clockBin: St.BoxLayout | null | undefined; private _wallClock: any; diff --git a/src/layout/msWorkspace/horizontalPanel/layoutSwitcher.ts b/src/layout/msWorkspace/horizontalPanel/layoutSwitcher.ts index 016b21b2..2cfa21a4 100644 --- a/src/layout/msWorkspace/horizontalPanel/layoutSwitcher.ts +++ b/src/layout/msWorkspace/horizontalPanel/layoutSwitcher.ts @@ -4,13 +4,13 @@ import * as Gio from 'gio'; import * as GLib from 'glib'; import * as GObject from 'gobject'; import { MatPanelButton } from 'src/layout/verticalPanel/panelButton'; -import { TilingLayoutByKey } from 'src/manager/layoutManager'; +import { LayoutState, LayoutType, TilingLayoutByKey } from 'src/manager/layoutManager'; import { registerGObjectClass } from 'src/utils/gjs'; import * as St from 'st'; import { MsWorkspace } from '../msWorkspace'; const Animation = imports.ui.animation; -const PopupMenu = imports.ui.popupMenu; -const Main = imports.ui.main; +import { main as Main, popupMenu } from 'ui'; +import { assert, assertNotNull } from 'src/utils/assert'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); @@ -23,11 +23,11 @@ export class LayoutSwitcher extends St.BoxLayout { layoutQuickWidgetBin: St.Bin; tilingIcon: St.Icon; switcherButton: MatPanelButton; - menuManager: any; + menuManager: popupMenu.PopupMenuManager; msWorkspace: MsWorkspace; - menu: any; + menu: popupMenu.PopupMenu; - constructor(msWorkspace, panelMenuManager) { + constructor(msWorkspace: MsWorkspace, panelMenuManager: popupMenu.PopupMenuManager) { super({}); this.layoutQuickWidgetBin = new St.Bin({ style_class: 'layout-quick-widget-bin', @@ -68,7 +68,10 @@ export class LayoutSwitcher extends St.BoxLayout { 'tiling-layout-changed', this.updateLayoutWidget.bind(this) ); - this.buildMenu(); + this.menu = this.buildMenu(); + Main.layoutManager.uiGroup.add_actor(this.menu.actor); + this.menuManager.addMenu(this.menu); + this.connect('destroy', () => { this.msWorkspace.disconnect(connectId); }); @@ -92,13 +95,12 @@ export class LayoutSwitcher extends St.BoxLayout { } buildMenu() { - if (this.menu) this.menu.destroy(); - this.menu = new PopupMenu.PopupMenu(this, 0.5, St.Side.TOP); - this.menu.actor.add_style_class_name('horizontal-panel-menu'); - this.menu.actor.hide(); + const menu = new popupMenu.PopupMenu(this, 0.5, St.Side.TOP); + menu.actor.add_style_class_name('horizontal-panel-menu'); + menu.actor.hide(); Object.entries(TilingLayoutByKey).forEach( ([layoutKey, layoutConstructor]) => { - this.menu.addMenuItem( + menu.addMenuItem( new TilingLayoutMenuItem( layoutConstructor, this.msWorkspace.state.layoutStateList.find( @@ -108,10 +110,9 @@ export class LayoutSwitcher extends St.BoxLayout { ); } ); - this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - this.menu.addMenuItem(new LayoutsToggle(this.menu)); - Main.uiGroup.add_actor(this.menu.actor); - this.menuManager.addMenu(this.menu); + menu.addMenuItem(new popupMenu.PopupSeparatorMenuItem()); + menu.addMenuItem(new LayoutsToggle(menu)); + return menu; } setLayout(layoutKey: string) { @@ -130,7 +131,8 @@ export class LayoutSwitcher extends St.BoxLayout { const wantedIndex = Me.layoutManager.layoutList.findIndex((layout) => { return layoutKey === layout.state.key; }); - const newState = Me.layoutManager.getLayoutByKey(layoutKey).state; + // Note: This cast is safe, typescript is just not good enough to figure that out + const newState = Me.layoutManager.getLayoutByKey(layoutKey).state as LayoutState; if (wantedIndex > this.msWorkspace.state.layoutStateList.length) { this.msWorkspace.state.layoutStateList.push(newState); } else { @@ -176,8 +178,11 @@ export class LayoutSwitcher extends St.BoxLayout { } @registerGObjectClass -export class TilingLayoutMenuItem extends PopupMenu.PopupSwitchMenuItem { - constructor(layoutConstructor, active: boolean, params?) { +export class TilingLayoutMenuItem extends popupMenu.PopupSwitchMenuItem { + layoutConstructor: LayoutType; + editable: boolean = false; + + constructor(layoutConstructor: LayoutType, active: boolean, params?: popupMenu.PopupBaseMenuItemParams) { super(layoutConstructor.label, active, params); this.layoutConstructor = layoutConstructor; this._icon = new St.Icon({ @@ -191,11 +196,13 @@ export class TilingLayoutMenuItem extends PopupMenu.PopupSwitchMenuItem { this.setEditable(false); } - get layoutSwitcher() { - return this._parent.sourceActor; + get layoutSwitcher(): LayoutSwitcher { + const layoutSwitcher = assertNotNull(this._parent).sourceActor; + assert(layoutSwitcher instanceof LayoutSwitcher, "expected menu's source actor to be a LayoutSwitcher"); + return layoutSwitcher; } - activate(event) { + override activate(event: Clutter.Event) { if (!this.editable) { this.layoutSwitcher.setLayout(this.layoutConstructor.state.key); this.emit('activate', event); @@ -243,6 +250,7 @@ export class TilingLayoutMenuItem extends PopupMenu.PopupSwitchMenuItem { duration: 300, }); } + setVisible(visible: boolean) { if (!this.mapped) { return (this.height = visible ? -1 : 0); @@ -270,9 +278,16 @@ export class TilingLayoutMenuItem extends PopupMenu.PopupSwitchMenuItem { } @registerGObjectClass -export class LayoutsToggle extends PopupMenu.PopupImageMenuItem { - constructor(menu, params?) { - const editText = _('Tweak available layout'); +export class LayoutsToggle extends popupMenu.PopupImageMenuItem { + editText: string; + editIcon: Gio.IconPrototype; + confirmText: string; + confirmIcon: Gio.IconPrototype; + menu: popupMenu.PopupMenu; + editable: boolean; + + constructor(menu: popupMenu.PopupMenu, params?: popupMenu.PopupBaseMenuItemParams) { + const editText = _('Tweak available layouts'); const editIcon = Gio.icon_new_for_string( `${Me.path}/assets/icons/category/settings-symbolic.svg` ); @@ -287,7 +302,7 @@ export class LayoutsToggle extends PopupMenu.PopupImageMenuItem { this.editable = false; } - activate(_event) { + activate(_event: Clutter.Event) { this.toggleEditMode(); } diff --git a/src/layout/msWorkspace/horizontalPanel/taskBar.ts b/src/layout/msWorkspace/horizontalPanel/taskBar.ts index 9cbd9c8c..6f6f6c2e 100644 --- a/src/layout/msWorkspace/horizontalPanel/taskBar.ts +++ b/src/layout/msWorkspace/horizontalPanel/taskBar.ts @@ -6,7 +6,7 @@ import * as GObject from 'gobject'; import * as Shell from 'shell'; import { MsWindow } from 'src/layout/msWorkspace/msWindow'; import { MsManager } from 'src/manager/msManager'; -import { assert } from 'src/utils/assert'; +import { assert, assertNotNull } from 'src/utils/assert'; import { Allocate, SetAllocation } from 'src/utils/compatibility'; import { registerGObjectClass } from 'src/utils/gjs'; import { getSettings } from 'src/utils/settings'; @@ -15,15 +15,16 @@ import { MatButton } from 'src/widget/material/button'; import { ReorderableList } from 'src/widget/reorderableList'; import * as St from 'st'; import { MsWorkspace, Tileable } from '../msWorkspace'; +import { popupMenu as PopupMenu } from 'ui'; const DND = imports.ui.dnd; -const PopupMenu = imports.ui.popupMenu; -const Main = imports.ui.main; +import { main as Main } from 'ui'; +import { layout } from 'ui'; +import Monitor = layout.Monitor; +import { MsApplicationLauncher } from 'src/widget/msApplicationLauncher'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); -const dragData = null; - let isTileableItem = (obj: any): obj is TileableItem => { return obj instanceof TileableItem; }; @@ -43,12 +44,12 @@ export class TaskBar extends St.Widget { taskActiveIndicator: TaskActiveIndicator; taskButtonContainer: ReorderableList; msWorkspace: MsWorkspace; - msWorkspaceSignals: any[]; - tracker: any; + msWorkspaceSignals: number[]; + tracker: Shell.WindowTracker; windowFocused: null; - menuManager: any; + menuManager: PopupMenu.PopupMenuManager; - constructor(msWorkspace: MsWorkspace, panelMenuManager) { + constructor(msWorkspace: MsWorkspace, panelMenuManager: PopupMenu.PopupMenuManager) { super({ name: 'taskBar', x_expand: true, @@ -156,7 +157,7 @@ export class TaskBar extends St.Widget { ); for (let tileable of tileableToRemove) { - let item = this.getTaskBarItemOfTileable(tileable); + let item = assertNotNull(this.getTaskBarItemOfTileable(tileable)); item.destroy(); } @@ -182,7 +183,7 @@ export class TaskBar extends St.Widget { return; } - const previousItem = this.getTaskBarItemOfTileable(oldTileableFocused); + const previousItem = oldTileableFocused !== null ? this.getTaskBarItemOfTileable(oldTileableFocused) : null; const nextItem = this.getTaskBarItemOfTileable(tileableFocused); if (previousItem) { @@ -202,11 +203,11 @@ export class TaskBar extends St.Widget { return this.items[this.msWorkspace.focusedIndex]; } - createNewItemForTileable(tileable) { + createNewItemForTileable(tileable: Tileable) { let item: TileableItem | IconTaskBarItem; if (tileable instanceof MsWindow) { item = new TileableItem(tileable); - this.menuManager.addMenu(item.menu); + this.menuManager.addMenu(assertNotNull(item.menu)); item.connect('middle-clicked', (_) => { tileable.kill(); }); @@ -227,7 +228,7 @@ export class TaskBar extends St.Widget { return item; } - getTaskBarItemOfTileable(tileable) { + getTaskBarItemOfTileable(tileable: Tileable) { return this.items.find((item) => { return item.tileable === tileable; }); @@ -302,13 +303,13 @@ export class TaskBarItem extends MatButton { }, }; private _delegate: this; - draggable: any; - contentActor: any; - monitor: any; - menu: any; - tileable: MsWindow | undefined; + draggable: boolean; + contentActor: St.Widget; + monitor: Monitor; + menu: PopupMenu.PopupMenu | undefined; + tileable: Tileable | undefined; - constructor(contentActor, draggable) { + constructor(contentActor: St.Widget, draggable: boolean) { super({ style_class: 'task-bar-item ', }); @@ -316,14 +317,16 @@ export class TaskBarItem extends MatButton { this._delegate = this; this.draggable = draggable; this.contentActor = contentActor; - this.monitor = Main.layoutManager.primaryMonitor; + this.monitor = assertNotNull(Main.layoutManager.primaryMonitor); this.set_child(this.contentActor); this.connect('primary-action', () => { this.emit('left-clicked'); }); this.connect('secondary-action', () => { - this.menu.toggle(); + if (this.menu !== undefined) { + this.menu.toggle(); + } }); this.connect('clicked', (actor, button) => { if (button === Clutter.BUTTON_MIDDLE) { @@ -332,19 +335,19 @@ export class TaskBarItem extends MatButton { }); } - vfunc_parent_set() { + override vfunc_parent_set() { const actor = this.get_parent() || this; if (actor.is_mapped()) { - this.monitor = Main.layoutManager.findMonitorForActor(actor); + this.monitor = assertNotNull(Main.layoutManager.findMonitorForActor(actor)); } } - vfunc_get_preferred_height(_forWidth: number): [number, number] { - const height = Me.msThemeManager.getPanelSize(this.monitor); + override vfunc_get_preferred_height(_forWidth: number): [number, number] { + const height = Me.msThemeManager.getPanelSize(this.monitor.index); return [height, height]; } - setActive(active) { + setActive(active: boolean) { if (!active && this.has_style_class_name('active')) { this.remove_style_class_name('active'); } @@ -363,23 +366,25 @@ export class TileableItem extends TaskBarItem { }, }; container: St.BoxLayout; - tileable: any; - app: any; + // Safety: We definitely initialize this because we call setTileable from the constructor + tileable!: Tileable; + // Safety: We definitely initialize this because we call setTileable from the constructor + app!: Shell.App | null; startIconContainer: St.Bin; endIconContainer: St.Bin; - makePersistentAction: any; - unmakePersistentAction: any; - closeButton: any; - persistentIcon: any; + makePersistentAction: PopupMenu.PopupBaseMenuItem; + unmakePersistentAction: PopupMenu.PopupBaseMenuItem; + closeButton: St.Button; + persistentIcon: St.Icon; title: St.Label; signalManager: MsManager; - titleSignalKiller: any; + titleSignalKiller: (()=>void) | undefined; closeIcon: St.Icon; - icon: any; - lastHeight: any; + icon: St.Widget | undefined; + lastHeight: number | undefined; buildIconIdle: number | undefined; - constructor(tileable) { + constructor(tileable: MsWindow) { const container = new St.BoxLayout({ style_class: 'task-bar-item-content', }); @@ -412,7 +417,9 @@ export class TileableItem extends TaskBarItem { this.makePersistentAction = this.menu.addAction( 'Make this fully persistent', () => { - this.tileable.persistent = true; + if (this.tileable instanceof MsWindow) { + this.tileable.persistent = true; + } this.endIconContainer.set_child(this.persistentIcon); this.makePersistentAction.hide(); this.unmakePersistentAction.show(); @@ -423,7 +430,9 @@ export class TileableItem extends TaskBarItem { this.unmakePersistentAction = this.menu.addAction( 'Unmake this fully persistent', () => { - this.tileable.persistent = false; + if (this.tileable instanceof MsWindow) { + this.tileable.persistent = false; + } this.endIconContainer.set_child(this.closeButton); this.makePersistentAction.show(); this.unmakePersistentAction.hide(); @@ -450,7 +459,7 @@ export class TileableItem extends TaskBarItem { }) ); this.menu.box.add_child(item); */ - Main.uiGroup.add_actor(this.menu.actor); + Main.layoutManager.uiGroup.add_actor(this.menu.actor); this.menu.actor.hide(); // TITLE this.title = new St.Label({ @@ -503,20 +512,20 @@ export class TileableItem extends TaskBarItem { this.setTileable(tileable); } - setTileable(tileable) { + setTileable(tileable: Tileable) { if (tileable === this.tileable) return; if (this.titleSignalKiller) this.titleSignalKiller(); this.tileable = tileable; - this.app = tileable.app; + this.app = tileable instanceof MsWindow ? tileable.app : null; if (this.icon) { - this.buildIcon(this.lastHeight); + this.buildIcon(assertNotNull(this.lastHeight)); } this.titleSignalKiller = this.signalManager.observe( this.tileable, 'title-changed', () => this.updateTitle() ); - if (this.tileable._persistent) { + if (this.tileable instanceof MsWindow && this.tileable._persistent) { this.makePersistentAction.hide(); this.unmakePersistentAction.show(); this.endIconContainer.set_child(this.persistentIcon); @@ -537,10 +546,13 @@ export class TileableItem extends TaskBarItem { } } - buildIcon(height) { + buildIcon(height: number) { if (this.icon) this.icon.destroy(); + assert(this.app !== null, "cannot build an icon without an app"); this.lastHeight = height; - this.icon = this.app.create_icon_texture(height / 2); + const icon = this.app.create_icon_texture(height / 2); + assert(icon instanceof St.Widget, "expected icon to be a widget"); + this.icon = icon; this.icon.style_class = 'app-icon'; this.icon.set_size(height / 2, height / 2); this.startIconContainer.set_child(this.icon); @@ -558,29 +570,33 @@ export class TileableItem extends TaskBarItem { // Update the title and crop it if it's too long updateTitle() { assert(this.tileable !== undefined, 'item has no tileable'); - if (this.style == 'full') { - if (this.tileable.title.includes(this.app.get_name())) { - this.title.text = this.tileable.title; - } else { - const escapedAppName = GLib.markup_escape_text( - this.app.get_name(), - -1 - ); - const escapedTitle = GLib.markup_escape_text( - this.tileable.title, - -1 - ); - (this.title.get_clutter_text() as Clutter.Text).set_markup( - `${escapedTitle} - ${escapedAppName}` - ); + if (this.tileable instanceof MsApplicationLauncher || this.app === null) { + this.title.text = ""; + } else { + if (this.style == 'full') { + if (this.tileable.title.includes(this.app.get_name())) { + this.title.text = this.tileable.title; + } else { + const escapedAppName = GLib.markup_escape_text( + this.app.get_name(), + -1 + ); + const escapedTitle = GLib.markup_escape_text( + this.tileable.title, + -1 + ); + (this.title.get_clutter_text() as Clutter.Text).set_markup( + `${escapedTitle} - ${escapedAppName}` + ); + } + } else if (this.style == 'name') { + this.title.text = this.app.get_name(); } - } else if (this.style == 'name') { - this.title.text = this.app.get_name(); } } - vfunc_allocate(...args: [Clutter.ActorBox]) { + override vfunc_allocate(...args: [Clutter.ActorBox]) { const box = args[0]; const height = box.get_height(); @@ -601,17 +617,17 @@ export class TileableItem extends TaskBarItem { GLib.Source.remove(this.buildIconIdle); } this.signalManager.destroy(); - this.menu.destroy(); + if (this.menu !== undefined) this.menu.destroy(); } } @registerGObjectClass export class IconTaskBarItem extends TaskBarItem { container: St.Bin; - tileable: any; + tileable: Tileable; icon: St.Icon; - constructor(tileable, gicon: Gio.IconPrototype) { + constructor(tileable: Tileable, gicon: Gio.IconPrototype) { const container = new St.Bin({ style_class: 'task-bar-icon-container', }); @@ -624,19 +640,19 @@ export class IconTaskBarItem extends TaskBarItem { icon_size: Me.msThemeManager.getPanelSizeNotScaled() / 2, }); this.container.set_child(this.icon); - this.setTileable(tileable); + this.tileable = tileable; } - setTileable(tileable) { + setTileable(tileable: Tileable) { if (tileable === this.tileable) return; this.tileable = tileable; } - vfunc_get_preferred_width(_forHeight: number): [number, number] { + override vfunc_get_preferred_width(_forHeight: number): [number, number] { return [_forHeight, _forHeight]; } - vfunc_allocate(...args: [Clutter.ActorBox]) { + override vfunc_allocate(...args: [Clutter.ActorBox]) { const box = args[0]; const height = box.get_height() / 2; diff --git a/src/layout/msWorkspace/msWindow.ts b/src/layout/msWorkspace/msWindow.ts index 74e7f92b..8b30f6de 100644 --- a/src/layout/msWorkspace/msWindow.ts +++ b/src/layout/msWorkspace/msWindow.ts @@ -1,7 +1,7 @@ const Me = imports.misc.extensionUtils.getCurrentExtension(); /** Gnome libs imports */ -const Main = imports.ui.main; +import { main as Main } from 'ui'; import * as Clutter from 'clutter'; import * as GLib from 'glib'; import * as GObject from 'gobject'; @@ -24,6 +24,8 @@ import { AppPlaceholder } from 'src/widget/appPlaceholder'; import * as St from 'st'; import { MsWorkspace } from './msWorkspace'; import { PrimaryBorderEffect } from './tilingLayouts/baseResizeableTiling'; +import { App } from 'shell'; +import { assert } from 'src/utils/assert'; const isWayland = GLib.getenv('XDG_SESSION_TYPE').toLowerCase() === 'wayland'; @@ -36,7 +38,7 @@ interface Dialog { clone: Clutter.Clone; } export interface MsWindowState { - appId: number; + appId: string; metaWindowIdentifier: string | null; persistent: boolean | undefined; x: number; @@ -46,9 +48,9 @@ export interface MsWindowState { } export interface MsWindowConstructProps { - app: any; + app: App; metaWindowIdentifier: string | null; - metaWindow: MetaWindowWithMsProperties; + metaWindow: MetaWindowWithMsProperties | null; persistent?: boolean; initialAllocation?: Rectangular; msWorkspace: MsWorkspace; @@ -74,7 +76,7 @@ export class MsWindow extends Clutter.Actor { }, }; - public app: any; + public app: App; _persistent: boolean | undefined; dialogs: Dialog[]; metaWindowIdentifier: string | null; @@ -85,8 +87,7 @@ export class MsWindow extends Clutter.Actor { msContent: MsWindowContent; msWorkspace: MsWorkspace; destroyed: boolean | undefined; - _metaWindow: MetaWindowWithMsProperties; - metaWindowUpdateInProgressPromise: any; + _metaWindow: MetaWindowWithMsProperties | null = null; updateDelayed: boolean | undefined; focusEffects?: { dimmer?: Clutter.BrightnessContrastEffect; @@ -177,8 +178,8 @@ export class MsWindow extends Clutter.Actor { delayGetMetaWindowActor( metaWindow: MetaWindowWithMsProperties, delayedCount: number, - resolve, - reject + resolve: (actor: Meta.WindowActor)=>void, + reject: ()=>void ) { if (delayedCount < 20) { // If we don't have actor we hope to get it in the next loop @@ -304,7 +305,7 @@ export class MsWindow extends Clutter.Actor { super.set_size(width, height); } - getRelativeMetaWindowPosition(metaWindow) { + getRelativeMetaWindowPosition(metaWindow: Meta.Window) { const x = this.x; const y = this.y; @@ -330,9 +331,10 @@ export class MsWindow extends Clutter.Actor { * This function is called every time the position or the size of the actor change and is meant to update the metaWindow accordingly */ updateMetaWindowPositionAndSize() { + const metaWindow = this._metaWindow; const windowActor = - this._metaWindow && - this._metaWindow.get_compositor_private(); + metaWindow && + metaWindow.get_compositor_private(); if ( this.destroyed || @@ -340,17 +342,17 @@ export class MsWindow extends Clutter.Actor { !this.mapped || this.width === 0 || this.height === 0 || - !this._metaWindow.firstFrameDrawn || + !metaWindow.firstFrameDrawn || this.followMetaWindow || this.updateDelayed || - this._metaWindow.minimized + metaWindow.minimized ) { return; } let shouldBeMaximizedHorizontally = - this._metaWindow.maximized_horizontally; - let shouldBeMaximizedVertically = this._metaWindow.maximized_vertically; + metaWindow.maximized_horizontally; + let shouldBeMaximizedVertically = metaWindow.maximized_vertically; // Check for maximized only if the msWindow is inside the tileableContainer if ( @@ -370,30 +372,31 @@ export class MsWindow extends Clutter.Actor { const needToChangeMaximizeHorizontally = shouldBeMaximizedHorizontally !== - this._metaWindow.maximized_horizontally; + metaWindow.maximized_horizontally; const needToChangeMaximizeVertically = shouldBeMaximizedVertically !== - this._metaWindow.maximized_vertically; + metaWindow.maximized_vertically; let needToMove = false; let needToResize = false; let needToMoveOrResize = false; - let moveTo, resizeTo; + let moveTo: { x: number, y: number } | undefined = undefined; + let resizeTo: { width: number, height: number } | undefined = undefined; // check if the window need a changes only if we don't need to already maximize if (!shouldBeMaximizedHorizontally || !shouldBeMaximizedVertically) { - const currentFrameRect = this._metaWindow.get_frame_rect(); + const currentFrameRect = metaWindow.get_frame_rect(); const contentBox = this.msContent.allocation; - if (this._metaWindow.allows_resize()) { - moveTo = this.getRelativeMetaWindowPosition(this._metaWindow); + if (metaWindow.allows_resize()) { + moveTo = this.getRelativeMetaWindowPosition(metaWindow); resizeTo = { width: this.width, height: this.height, }; } else { const relativePosition = this.getRelativeMetaWindowPosition( - this._metaWindow + metaWindow ); moveTo = { @@ -442,32 +445,32 @@ export class MsWindow extends Clutter.Actor { ) { const shouldMaximizeHorizontally = shouldBeMaximizedHorizontally && - !this._metaWindow.maximized_horizontally; + !metaWindow.maximized_horizontally; const shouldMaximizeVertically = shouldBeMaximizedVertically && - !this._metaWindow.maximized_vertically; + !metaWindow.maximized_vertically; const shouldUnMaximizeHorizontally = !shouldBeMaximizedHorizontally && - this._metaWindow.maximized_horizontally; + metaWindow.maximized_horizontally; const shouldUnMaximizeVertically = !shouldBeMaximizedVertically && - this._metaWindow.maximized_vertically; + metaWindow.maximized_vertically; const callback = () => { if (shouldMaximizeVertically && shouldUnMaximizeVertically) { - this._metaWindow.unmaximize(Meta.MaximizeFlags.BOTH); + metaWindow.unmaximize(Meta.MaximizeFlags.BOTH); } else if (shouldUnMaximizeHorizontally) { - this._metaWindow.unmaximize(Meta.MaximizeFlags.HORIZONTAL); + metaWindow.unmaximize(Meta.MaximizeFlags.HORIZONTAL); } else if (shouldUnMaximizeVertically) { - this._metaWindow.unmaximize(Meta.MaximizeFlags.VERTICAL); + metaWindow.unmaximize(Meta.MaximizeFlags.VERTICAL); } if (shouldMaximizeHorizontally && shouldMaximizeVertically) { - this._metaWindow.maximize(Meta.MaximizeFlags.BOTH); + metaWindow.maximize(Meta.MaximizeFlags.BOTH); } else if (shouldMaximizeHorizontally) { - this._metaWindow.maximize(Meta.MaximizeFlags.HORIZONTAL); + metaWindow.maximize(Meta.MaximizeFlags.HORIZONTAL); } else if (shouldMaximizeVertically) { - this._metaWindow.maximize(Meta.MaximizeFlags.VERTICAL); + metaWindow.maximize(Meta.MaximizeFlags.VERTICAL); } }; @@ -481,7 +484,7 @@ export class MsWindow extends Clutter.Actor { } } - if (needToMoveOrResize) { + if (needToMoveOrResize && moveTo !== undefined && resizeTo !== undefined) { // Secure the futur metaWindow Position to ensure it's not outside the current monitor if (!this.dragged) { moveTo.x = Math.max( @@ -505,24 +508,26 @@ export class MsWindow extends Clutter.Actor { } //Set the size accordingly if (isWayland) { + const moveTo2 = moveTo; + const resizeTo2 = resizeTo; GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { if (needToResize) { - this._metaWindow.move_resize_frame( + metaWindow.move_resize_frame( true, - moveTo.x, - moveTo.y, - resizeTo.width, - resizeTo.height + moveTo2.x, + moveTo2.y, + resizeTo2.width, + resizeTo2.height ); } else { - this._metaWindow.move_frame(true, moveTo.x, moveTo.y); + metaWindow.move_frame(true, moveTo2.x, moveTo2.y); } return GLib.SOURCE_REMOVE; }); } else { if (needToResize) { - this._metaWindow.move_resize_frame( + metaWindow.move_resize_frame( true, moveTo.x, moveTo.y, @@ -531,25 +536,26 @@ export class MsWindow extends Clutter.Actor { ); // Enforce window positioning since Gnome Terminal don't always move when requested + const moveTo2 = moveTo; GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => { const currentFrameRect = - this._metaWindow.get_frame_rect(); + metaWindow.get_frame_rect(); if ( - currentFrameRect.x !== moveTo.x || - currentFrameRect.y !== moveTo.y + currentFrameRect.x !== moveTo2.x || + currentFrameRect.y !== moveTo2.y ) { - this._metaWindow.move_frame( + metaWindow.move_frame( true, - moveTo.x, - moveTo.y + moveTo2.x, + moveTo2.y ); } return GLib.SOURCE_REMOVE; }); } else { - this._metaWindow.move_frame(true, moveTo.x, moveTo.y); + metaWindow.move_frame(true, moveTo.x, moveTo.y); } } } @@ -705,12 +711,11 @@ export class MsWindow extends Clutter.Actor { unsetWindow() { this.unregisterOnMetaWindowSignals(); this.reactive = true; - delete this._metaWindow; - delete this.metaWindowUpdateInProgressPromise; + this._metaWindow = null; this.onMetaWindowsChanged(); } - updateWorkspaceAndMonitor(metaWindow) { + updateWorkspaceAndMonitor(metaWindow: Meta.Window) { if (metaWindow && this.msWorkspace) { // We need to move the window before changing the workspace, because // the move itself could cause a workspace change if the window enters @@ -946,7 +951,7 @@ export class MsWindow extends Clutter.Actor { @registerGObjectClass export class MsWindowContent extends St.Widget { - placeholder: any; + placeholder: Clutter.Actor; clone: Clutter.Clone; static metaInfo: GObject.MetaInfo = { @@ -967,12 +972,13 @@ export class MsWindowContent extends St.Widget { this.add_child(this.placeholder); } - vfunc_allocate(box: Clutter.ActorBox, flags?: Clutter.AllocationFlags) { + override vfunc_allocate(box: Clutter.ActorBox, flags?: Clutter.AllocationFlags) { SetAllocation(this, box, flags); const themeNode = this.get_theme_node(); box = themeNode.get_content_box(box); - const metaWindow: MetaWindowWithMsProperties = - this.get_parent().metaWindow; + const parent = this.get_parent(); + assert(parent instanceof MsWindow, "expected parent to be an MsWindow"); + const metaWindow: MetaWindowWithMsProperties = parent.metaWindow; if (metaWindow && metaWindow.firstFrameDrawn) { const windowFrameRect = metaWindow.get_frame_rect(); const windowBufferRect = metaWindow.get_buffer_rect(); diff --git a/src/layout/msWorkspace/msWorkspace.ts b/src/layout/msWorkspace/msWorkspace.ts index a5fa66d2..82d2fb8e 100644 --- a/src/layout/msWorkspace/msWorkspace.ts +++ b/src/layout/msWorkspace/msWorkspace.ts @@ -5,17 +5,19 @@ import * as GObject from 'gobject'; import { HorizontalPanel } from 'src/layout/msWorkspace/horizontalPanel/horizontalPanel'; import { MsWindow, MsWindowState } from 'src/layout/msWorkspace/msWindow'; import { MsWorkspaceCategory } from 'src/layout/msWorkspace/msWorkspaceCategory'; +import { LayoutState, LayoutType } from 'src/manager/layoutManager'; import { HorizontalPanelPositionEnum } from 'src/manager/msThemeManager'; import { MsWorkspaceManager } from 'src/manager/msWorkspaceManager'; -import { Monitor } from 'src/types/mod'; -import { logAssert } from 'src/utils/assert'; +import { layout } from 'ui'; +import { assertNotNull, logAssert } from 'src/utils/assert'; import { Allocate, SetAllocation } from 'src/utils/compatibility'; import { registerGObjectClass, WithSignals } from 'src/utils/gjs'; import { reparentActor } from 'src/utils/index'; import { getSettings } from 'src/utils/settings'; import { MsApplicationLauncher } from 'src/widget/msApplicationLauncher'; +import Monitor = layout.Monitor; const Signals = imports.signals; -const Main = imports.ui.main; +import { main as Main } from 'ui'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); @@ -32,7 +34,7 @@ export interface MsWorkspaceState { focusedIndex: number; forcedCategory: string | null | undefined; msWindowList: MsWindowState[]; - layoutStateList: any; + layoutStateList: LayoutState[]; layoutKey: string; } @@ -45,15 +47,15 @@ export class MsWorkspace extends WithSignals { msWorkspaceCategory: MsWorkspaceCategory; precedentIndex: number; msWorkspaceActor: MsWorkspaceActor; - layout: any; + // Safety: We always assign this because we call setLayoutByKey from the constructor + layout!: InstanceType; destroyed: boolean | undefined; closing = false; - monitorIsExternal: any; - apps: any; - categorizedAppCard: any; + // Safety: We always assign this because we call setMonitor from the constructor + monitorIsExternal!: boolean; // Definitely set because we call `setMonitor` in the constructor monitor!: Monitor; - emitTileableChangedInProgress: any; + emitTileableChangedInProgress: Promise | undefined; constructor( msWorkspaceManager: MsWorkspaceManager, @@ -127,7 +129,6 @@ export class MsWorkspace extends WithSignals { this.layout.onDestroy(); if (this.msWorkspaceActor) { this.msWorkspaceActor.destroy(); - delete this.msWorkspaceActor; } this.destroyed = true; } @@ -250,7 +251,7 @@ export class MsWorkspace extends WithSignals { await this.emitTileableListChangedOnce(oldTileableList); } - async removeMsWindow(msWindow) { + async removeMsWindow(msWindow: MsWindow) { logAssert(!this.destroyed, 'Workspace is destroyed'); if (this.msWindowList.indexOf(msWindow) === -1) return; @@ -301,7 +302,7 @@ export class MsWorkspace extends WithSignals { return this.emitTileableChangedInProgress; } - swapTileable(firstTileable, secondTileable) { + swapTileable(firstTileable: Tileable, secondTileable: Tileable) { const firstIndex = this.tileableList.indexOf(firstTileable); const secondIndex = this.tileableList.indexOf(secondTileable); const oldTileableList = [...this.tileableList]; @@ -310,7 +311,7 @@ export class MsWorkspace extends WithSignals { this.emit('tileableList-changed', this.tileableList, oldTileableList); } - swapTileableLeft(tileable) { + swapTileableLeft(tileable: Tileable) { const index = this.tileableList.indexOf(tileable); if (index === -1) return; if (index > 0 && tileable != this.appLauncher) { @@ -320,7 +321,7 @@ export class MsWorkspace extends WithSignals { } } - swapTileableRight(tileable) { + swapTileableRight(tileable: Tileable) { const index = this.tileableList.indexOf(tileable); if (index === -1) return; if ( @@ -452,7 +453,7 @@ export class MsWorkspace extends WithSignals { nextLayout(direction: number) { this.layout.onDestroy(); - let { key } = this.layout.constructor.state; + let { key } = (this.layout.constructor as LayoutType).state; if ( !this.state.layoutStateList.find( (layoutState) => layoutState.key === key @@ -480,13 +481,9 @@ export class MsWorkspace extends WithSignals { this.layout.onDestroy(); } - const Layout = Me.layoutManager.getLayoutByKey(layoutKey); - this.layout = new Layout( - this, - this.state.layoutStateList.find( - (layoutState) => layoutState.key === layoutKey - ) - ); + this.layout = Me.layoutManager.createLayout(this, assertNotNull(this.state.layoutStateList.find( + (layoutState) => layoutState.key === layoutKey + ))); this.msWorkspaceActor.tileableContainer.set_layout_manager(this.layout); this.emit('tiling-layout-changed'); } @@ -535,10 +532,10 @@ export class MsWorkspace extends WithSignals { // } // } - setApps(apps) { - this.apps = apps; - this.categorizedAppCard._loadApps(apps); - } + // setApps(apps) { + // this.apps = apps; + // this.categorizedAppCard._loadApps(apps); + // } isDisplayed() { if (this.monitorIsExternal) { @@ -598,7 +595,7 @@ export class MsWorkspaceActor extends Clutter.Actor { Clutter.LayoutManager, Clutter.ContentPrototype >; - panel: any; + panel: HorizontalPanel; msWorkspace: MsWorkspace; constructor(msWorkspace: MsWorkspace) { @@ -630,13 +627,13 @@ export class MsWorkspaceActor extends Clutter.Actor { this.visible = !monitorInFullScreen; } - vfunc_allocate(box: Clutter.ActorBox, flags?: Clutter.AllocationFlags) { + override vfunc_allocate(box: Clutter.ActorBox, flags?: Clutter.AllocationFlags) { SetAllocation(this, box, flags); const contentBox = new Clutter.ActorBox(); contentBox.x2 = box.get_width(); contentBox.y2 = box.get_height(); const panelPosition = Me.msThemeManager.horizontalPanelPosition; - const panelHeight = this.panel.get_preferred_height(-1)[1]; + const panelHeight = (this.panel.get_preferred_height(-1) as [number, number])[1]; const panelBox = new Clutter.ActorBox(); panelBox.x1 = contentBox.x1; panelBox.x2 = contentBox.x2; diff --git a/src/layout/msWorkspace/portion.ts b/src/layout/msWorkspace/portion.ts index a8d1e02a..202e05b1 100644 --- a/src/layout/msWorkspace/portion.ts +++ b/src/layout/msWorkspace/portion.ts @@ -9,6 +9,12 @@ const Signals = imports.signals; const MIN_BASIS_RATIO = 0.1; +export type PortionState = { + basis: number; + vertical: boolean; + children: PortionState[]; +} + export class Portion { vertical: boolean; children: Portion[]; @@ -22,7 +28,7 @@ export class Portion { this.borders = []; } - get state() { + get state(): PortionState { return { basis: this.basis, vertical: this.vertical, @@ -42,7 +48,7 @@ export class Portion { this.updateBorders(); } - get portionLength() { + get portionLength(): number { return this.children.length ? this.children.reduce( (sum, portion) => sum + portion.portionLength, @@ -191,7 +197,7 @@ export class Portion { this.updateBorders(); } - isBorderInSubPortion(index: number, after = false) { + isBorderInSubPortion(index: number, after = false): boolean { let portionIndex = 0; const afterOffset = after ? 1 : 0; @@ -346,8 +352,8 @@ export class Portion { } const [position, size] = this.vertical - ? ['y', 'height'] - : ['x', 'width']; + ? ['y', 'height'] as const + : ['x', 'width'] as const; ratio[position] += ratio[size] * (basisSum / basisTotal); ratio[size] *= child.basis / basisTotal; diff --git a/src/layout/msWorkspace/tilingLayouts/baseResizeableTiling.ts b/src/layout/msWorkspace/tilingLayouts/baseResizeableTiling.ts index 29285668..2881f577 100644 --- a/src/layout/msWorkspace/tilingLayouts/baseResizeableTiling.ts +++ b/src/layout/msWorkspace/tilingLayouts/baseResizeableTiling.ts @@ -21,7 +21,7 @@ const Me = imports.misc.extensionUtils.getCurrentExtension(); const BORDER_WIDTH = 2; @registerGObjectClass -export class BaseResizeableTilingLayout extends BaseTilingLayout { +export class BaseResizeableTilingLayout extends BaseTilingLayout { mainPortion: Portion; currentFocusEffect: number; borderContainer: Clutter.Actor | undefined; @@ -29,7 +29,7 @@ export class BaseResizeableTilingLayout extends BaseTilingLayout { constructor( msWorkspace: MsWorkspace, - state: { mainPortion?: Portion } = {} + state: Partial & { mainPortion?: Portion } ) { super(msWorkspace, state); this.mainPortion = new Portion(); @@ -249,6 +249,7 @@ export class BaseResizeableTilingLayout extends BaseTilingLayout { } onFocusChanged(tileable: Tileable, oldTileable: Tileable | null) { + Me.logWithStackTrace("focus changed"); this.setUnFocusEffect(tileable, this.currentFocusEffect, true); if (oldTileable) { if ( @@ -427,7 +428,7 @@ export class PrimaryBorderEffect extends Clutter.Effect { this.color = new Cogl.Color(); } - vfunc_paint_node(node: any, paintContext: Clutter.PaintContext) { + vfunc_paint_node(node: Clutter.PaintNode, paintContext: Clutter.PaintContext) { const framebuffer = paintContext.get_framebuffer(); const coglContext = framebuffer.get_context(); const actor = this.get_actor(); diff --git a/src/layout/msWorkspace/tilingLayouts/baseTiling.ts b/src/layout/msWorkspace/tilingLayouts/baseTiling.ts index 1a12a5fa..9eb2441d 100644 --- a/src/layout/msWorkspace/tilingLayouts/baseTiling.ts +++ b/src/layout/msWorkspace/tilingLayouts/baseTiling.ts @@ -9,22 +9,20 @@ import { registerGObjectClass } from 'src/utils/gjs'; import { InfinityTo0 } from 'src/utils/index'; import { getSettings } from 'src/utils/settings'; import { MsWorkspace, Tileable } from '../msWorkspace'; -const Main = imports.ui.main; +import { main as Main } from 'ui'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); @registerGObjectClass -export class BaseTilingLayout extends Clutter.LayoutManager { - _state: any; +export class BaseTilingLayout extends Clutter.LayoutManager { + _state: S; icon: Gio.IconPrototype; msWorkspace: MsWorkspace; themeSettings: Gio.Settings; signals: Signal[]; - static state: any; - - constructor(msWorkspace: MsWorkspace, state = {}) { + constructor(msWorkspace: MsWorkspace, state: Partial = {}) { super(); this._state = Object.assign({}, (this.constructor as any).state, state); this.icon = Gio.icon_new_for_string( @@ -344,21 +342,21 @@ export class BaseTilingLayout extends Clutter.LayoutManager { // return a widget to add to the panel } - vfunc_get_preferred_width( - _container, + override vfunc_get_preferred_width( + _container: Clutter.Container, _forHeight: number ): [number, number] { return [-1, -1]; } - vfunc_get_preferred_height( - _container, + override vfunc_get_preferred_height( + _container: Clutter.Container, _forWidth: number ): [number, number] { return [-1, -1]; } - vfunc_allocate( + override vfunc_allocate( container: Clutter.Actor, box: Clutter.ActorBox, flags?: Clutter.AllocationFlags diff --git a/src/layout/msWorkspace/tilingLayouts/custom/grid.ts b/src/layout/msWorkspace/tilingLayouts/custom/grid.ts index e82910fc..4b10927f 100644 --- a/src/layout/msWorkspace/tilingLayouts/custom/grid.ts +++ b/src/layout/msWorkspace/tilingLayouts/custom/grid.ts @@ -5,14 +5,13 @@ import * as GObject from 'gobject'; const Me = imports.misc.extensionUtils.getCurrentExtension(); import { BaseResizeableTilingLayout } from 'src/layout/msWorkspace/tilingLayouts/baseResizeableTiling'; import { registerGObjectClass } from 'src/utils/gjs'; +import { Portion } from '../../portion'; @registerGObjectClass -export class GridLayout extends BaseResizeableTilingLayout { +export class GridLayout extends BaseResizeableTilingLayout<{ key: 'grid' }> { static state = { key: 'grid' }; static label = 'Grid'; - mainPortion: any; - updateMainPortionLength(length: number) { const columnLength = Math.ceil(Math.sqrt(length)); const rowLength = Math.ceil(length / columnLength); diff --git a/src/layout/msWorkspace/tilingLayouts/custom/half.ts b/src/layout/msWorkspace/tilingLayouts/custom/half.ts index 89f8a06f..813856fe 100644 --- a/src/layout/msWorkspace/tilingLayouts/custom/half.ts +++ b/src/layout/msWorkspace/tilingLayouts/custom/half.ts @@ -7,10 +7,7 @@ import { registerGObjectClass } from 'src/utils/gjs'; const Me = imports.misc.extensionUtils.getCurrentExtension(); @registerGObjectClass -export class HalfLayout extends BaseResizeableTilingLayout { - static state = { key: 'half' }; - static label = 'Half'; - +export class HalfLayoutBase extends BaseResizeableTilingLayout { updateMainPortionLength(length: number) { while (this.mainPortion.portionLength > length) { this.mainPortion.pop(); @@ -41,3 +38,9 @@ export class HalfLayout extends BaseResizeableTilingLayout { super.tileAll(box); } } + +@registerGObjectClass +export class HalfLayout extends HalfLayoutBase<{ key: 'half' }> { + static state = { key: 'half' }; + static label = 'Half'; +} diff --git a/src/layout/msWorkspace/tilingLayouts/custom/halfHorizontal.ts b/src/layout/msWorkspace/tilingLayouts/custom/halfHorizontal.ts index c78e9532..b8019a58 100644 --- a/src/layout/msWorkspace/tilingLayouts/custom/halfHorizontal.ts +++ b/src/layout/msWorkspace/tilingLayouts/custom/halfHorizontal.ts @@ -3,11 +3,11 @@ import * as GObject from 'gobject'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); -import { HalfLayout } from 'src/layout/msWorkspace/tilingLayouts/custom/half'; +import { HalfLayout, HalfLayoutBase } from 'src/layout/msWorkspace/tilingLayouts/custom/half'; import { registerGObjectClass } from 'src/utils/gjs'; @registerGObjectClass -export class HalfHorizontalLayout extends HalfLayout { +export class HalfHorizontalLayout extends HalfLayoutBase<{ key: 'half-horizontal' }> { static state = { key: 'half-horizontal' }; static label = 'Half horizontal'; diff --git a/src/layout/msWorkspace/tilingLayouts/custom/halfVertical.ts b/src/layout/msWorkspace/tilingLayouts/custom/halfVertical.ts index 6ed8bf58..3264f47c 100644 --- a/src/layout/msWorkspace/tilingLayouts/custom/halfVertical.ts +++ b/src/layout/msWorkspace/tilingLayouts/custom/halfVertical.ts @@ -3,11 +3,11 @@ import * as GObject from 'gobject'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); -import { HalfLayout } from 'src/layout/msWorkspace/tilingLayouts/custom/half'; +import { HalfLayout, HalfLayoutBase } from 'src/layout/msWorkspace/tilingLayouts/custom/half'; import { registerGObjectClass } from 'src/utils/gjs'; @registerGObjectClass -export class HalfVerticalLayout extends HalfLayout { +export class HalfVerticalLayout extends HalfLayoutBase<{ key: 'half-vertical' }> { static state = { key: 'half-vertical' }; static label = 'Half vertical'; diff --git a/src/layout/msWorkspace/tilingLayouts/custom/ratio.ts b/src/layout/msWorkspace/tilingLayouts/custom/ratio.ts index 48c9b5c8..66875c58 100644 --- a/src/layout/msWorkspace/tilingLayouts/custom/ratio.ts +++ b/src/layout/msWorkspace/tilingLayouts/custom/ratio.ts @@ -5,14 +5,15 @@ import * as GObject from 'gobject'; const Me = imports.misc.extensionUtils.getCurrentExtension(); import { BaseResizeableTilingLayout } from 'src/layout/msWorkspace/tilingLayouts/baseResizeableTiling'; import { registerGObjectClass } from 'src/utils/gjs'; +import { Portion } from '../../portion'; @registerGObjectClass -export class RatioLayout extends BaseResizeableTilingLayout { +export class RatioLayout extends BaseResizeableTilingLayout<{ key: 'ratio' }> { static state = { key: 'ratio' }; static label = 'Ratio'; updateMainPortionLength(length: number) { - const pushInPortion = (portion) => { + const pushInPortion = (portion: Portion) => { if (portion.children.length === 2) { pushInPortion(portion.children[1]); } else { diff --git a/src/layout/msWorkspace/tilingLayouts/custom/simple.ts b/src/layout/msWorkspace/tilingLayouts/custom/simple.ts index 7afc610f..4a0ca270 100644 --- a/src/layout/msWorkspace/tilingLayouts/custom/simple.ts +++ b/src/layout/msWorkspace/tilingLayouts/custom/simple.ts @@ -9,10 +9,7 @@ import { registerGObjectClass } from 'src/utils/gjs'; import { BaseResizeableTilingLayout } from 'src/layout/msWorkspace/tilingLayouts/baseResizeableTiling'; @registerGObjectClass -export class SimpleLayout extends BaseResizeableTilingLayout { - static state = { key: 'simple' }; - static label = 'Simple'; - +export class SimpleLayoutBase extends BaseResizeableTilingLayout { isVerticalLayout(box: Clutter.ActorBox) { return box.get_width() < box.get_height(); } @@ -33,3 +30,9 @@ export class SimpleLayout extends BaseResizeableTilingLayout { super.tileAll(box); } } + +@registerGObjectClass +export class SimpleLayout extends SimpleLayoutBase<{ key: 'simple' }> { + static state = { key: 'simple' }; + static label = 'Simple'; +} diff --git a/src/layout/msWorkspace/tilingLayouts/custom/simpleHorizontal.ts b/src/layout/msWorkspace/tilingLayouts/custom/simpleHorizontal.ts index 43757843..2ddc4e9c 100644 --- a/src/layout/msWorkspace/tilingLayouts/custom/simpleHorizontal.ts +++ b/src/layout/msWorkspace/tilingLayouts/custom/simpleHorizontal.ts @@ -3,15 +3,16 @@ import * as GObject from 'gobject'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); -import { SimpleLayout } from 'src/layout/msWorkspace/tilingLayouts/custom/simple'; +import { SimpleLayout, SimpleLayoutBase } from 'src/layout/msWorkspace/tilingLayouts/custom/simple'; import { registerGObjectClass } from 'src/utils/gjs'; @registerGObjectClass -export class SimpleHorizontalLayout extends SimpleLayout { - isVerticalLayout() { +export class SimpleHorizontalLayout extends SimpleLayoutBase<{ key: 'simple-horizontal' }> { + static state = { key: 'simple-horizontal' }; + static label = 'Simple horizontal'; + + override isVerticalLayout() { return false; } } -SimpleHorizontalLayout.state = { key: 'simple-horizontal' }; -SimpleHorizontalLayout.label = 'Simple horizontal'; diff --git a/src/layout/msWorkspace/tilingLayouts/custom/simpleVertical.ts b/src/layout/msWorkspace/tilingLayouts/custom/simpleVertical.ts index 0bcf1af9..368e8c28 100644 --- a/src/layout/msWorkspace/tilingLayouts/custom/simpleVertical.ts +++ b/src/layout/msWorkspace/tilingLayouts/custom/simpleVertical.ts @@ -3,15 +3,16 @@ import * as GObject from 'gobject'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); -import { SimpleLayout } from 'src/layout/msWorkspace/tilingLayouts/custom/simple'; +import { SimpleLayout, SimpleLayoutBase } from 'src/layout/msWorkspace/tilingLayouts/custom/simple'; import { registerGObjectClass } from 'src/utils/gjs'; @registerGObjectClass -export class SimpleVerticalLayout extends SimpleLayout { - isVerticalLayout() { +export class SimpleVerticalLayout extends SimpleLayoutBase<{ key: 'simple-vertical' }> { + static state = { key: 'simple-vertical' }; + static label = 'Simple vertical'; + + override isVerticalLayout() { return true; } } -SimpleVerticalLayout.state = { key: 'simple-vertical' }; -SimpleVerticalLayout.label = 'Simple vertical'; diff --git a/src/layout/msWorkspace/tilingLayouts/float.ts b/src/layout/msWorkspace/tilingLayouts/float.ts index 883543aa..cbe39e7c 100644 --- a/src/layout/msWorkspace/tilingLayouts/float.ts +++ b/src/layout/msWorkspace/tilingLayouts/float.ts @@ -11,21 +11,24 @@ import { MsWindow } from 'src/layout/msWorkspace/msWindow'; import { registerGObjectClass } from 'src/utils/gjs'; import { MsWorkspace, Tileable } from '../msWorkspace'; +type FloatLayoutState = { key: 'float' }; + @registerGObjectClass -export class FloatLayout extends BaseTilingLayout { +export class FloatLayout extends BaseTilingLayout { static state = { key: 'float' }; static label = 'Float'; - tileableFocused: any; + // TODO: Unused? + tileableFocused: Tileable | undefined; - constructor(msWorkspace: MsWorkspace, state) { + constructor(msWorkspace: MsWorkspace, state: FloatLayoutState) { super(msWorkspace, state); global.display.connect('restacked', this.windowsRestacked.bind(this)); this.windowsRestacked(); } - alterTileable(tileable) { - if (tileable.metaWindow) { + alterTileable(tileable: Tileable) { + if (tileable instanceof MsWindow && tileable.metaWindow) { GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { WindowUtils.updateTitleBarVisibility(tileable.metaWindow); tileable.mimicMetaWindowPositionAndSize(); @@ -42,8 +45,8 @@ export class FloatLayout extends BaseTilingLayout { super.alterTileable(tileable); } - restoreTileable(tileable) { - if (tileable.metaWindow) { + restoreTileable(tileable: Tileable) { + if (tileable instanceof MsWindow && tileable.metaWindow) { tileable.msContent.clip_to_allocation = true; GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { @@ -97,13 +100,12 @@ export class FloatLayout extends BaseTilingLayout { windowsRestacked() { global.window_group.get_children().forEach((actor) => { - const metaWindow = actor.metaWindow; - if (metaWindow && metaWindow.msWindow) { + if (actor instanceof MsWindow && actor.metaWindow && actor.metaWindow.msWindow) { if ( - this.msWorkspace.tileableList.includes(metaWindow.msWindow) + this.msWorkspace.tileableList.includes(actor.metaWindow.msWindow) ) { this.msWorkspace.msWorkspaceActor.tileableContainer.set_child_above_sibling( - metaWindow.msWindow, + actor.metaWindow.msWindow, null ); } diff --git a/src/layout/msWorkspace/tilingLayouts/maximize.ts b/src/layout/msWorkspace/tilingLayouts/maximize.ts index c4a8497f..9e55eefd 100644 --- a/src/layout/msWorkspace/tilingLayouts/maximize.ts +++ b/src/layout/msWorkspace/tilingLayouts/maximize.ts @@ -14,15 +14,15 @@ import { MsWorkspace, Tileable } from '../msWorkspace'; import { MsApplicationLauncher } from 'src/widget/msApplicationLauncher'; import { MsWindow } from '../msWindow'; +type MaximizeLayoutState = { key: 'maximize' }; @registerGObjectClass -export class MaximizeLayout extends BaseTilingLayout { +export class MaximizeLayout extends BaseTilingLayout { static state = { key: 'maximize' }; static label = 'Maximize'; translationAnimator: TranslationAnimator; - currentDisplayedActor: any; - currentDisplayedActorDestroySignal: number | undefined; + currentDisplayed: { tileable: Tileable, destroySignal: number } | null = null; - constructor(msWorkspace: MsWorkspace, state) { + constructor(msWorkspace: MsWorkspace, state: MaximizeLayoutState) { super(msWorkspace, state); this.translationAnimator = new TranslationAnimator(); this.translationAnimator.connect('transition-completed', () => { @@ -36,30 +36,32 @@ export class MaximizeLayout extends BaseTilingLayout { ); } - displayTileable(actor) { - if (this.currentDisplayedActor) { + displayTileable(actor: Tileable) { + if (this.currentDisplayed) { if ( this.tileableContainer .get_children() - .includes(this.currentDisplayedActor) + .includes(this.currentDisplayed.tileable) ) { - this.tileableContainer.remove_child(this.currentDisplayedActor); + this.tileableContainer.remove_child(this.currentDisplayed.tileable); } - this.currentDisplayedActor.disconnect( - this.currentDisplayedActorDestroySignal + this.currentDisplayed.tileable.disconnect( + this.currentDisplayed.destroySignal ); } - this.currentDisplayedActor = actor; - this.currentDisplayedActorDestroySignal = this.currentDisplayedActor.connect( - 'destroy', - () => { - delete this.currentDisplayedActor; - } - ); + this.currentDisplayed = { + tileable: actor, + destroySignal: actor.connect( + 'destroy', + () => { + this.currentDisplayed = null; + } + ) + } - reparentActor(this.currentDisplayedActor, this.tileableContainer); - this.currentDisplayedActor.grab_key_focus(); + reparentActor(actor, this.tileableContainer); + actor.grab_key_focus(); } showAppLauncher() { @@ -149,7 +151,9 @@ export class MaximizeLayout extends BaseTilingLayout { } endTransition() { - this.displayTileable(this.msWorkspace.tileableFocused); + if (this.msWorkspace.tileableFocused !== null) { + this.displayTileable(this.msWorkspace.tileableFocused); + } this.tileableContainer.remove_child(this.translationAnimator); } } diff --git a/src/layout/msWorkspace/tilingLayouts/split.ts b/src/layout/msWorkspace/tilingLayouts/split.ts index f972d58b..775da571 100644 --- a/src/layout/msWorkspace/tilingLayouts/split.ts +++ b/src/layout/msWorkspace/tilingLayouts/split.ts @@ -8,24 +8,31 @@ import { TranslationAnimator } from 'src/widget/translationAnimator'; import { MatNumberPicker } from 'src/widget/material/numberPicker'; import { reparentActor } from 'src/utils/index'; import { registerGObjectClass } from 'src/utils/gjs'; -import { Tileable } from '../msWorkspace'; +import { MsWorkspace, Tileable } from '../msWorkspace'; import { MsApplicationLauncher } from 'src/widget/msApplicationLauncher'; import { MsWindow } from '../msWindow'; +import { Portion } from '../portion'; // TODO: Make this configurable // const WINDOW_SLIDE_TWEEN_TIME = 250; +type SplitLayoutState = { + key: 'split'; + nbOfColumns: number; +} + @registerGObjectClass -export class SplitLayout extends BaseResizeableTilingLayout { +export class SplitLayout extends BaseResizeableTilingLayout { static state = { key: 'split', nbOfColumns: 2 }; static label = 'Split'; + // _state: { key: 'split', nbOfColumns: number }; vertical: boolean; translationAnimator: TranslationAnimator; baseIndex: number; activeTileableList: Tileable[]; - constructor(msWorkspace, state) { + constructor(msWorkspace: MsWorkspace, state: Partial) { super(msWorkspace, state); this.baseIndex = 0; this.activeTileableList = []; diff --git a/src/layout/overview.ts b/src/layout/overview.ts index ab609b00..5f40dcb0 100644 --- a/src/layout/overview.ts +++ b/src/layout/overview.ts @@ -2,67 +2,46 @@ import * as Clutter from 'clutter'; import * as Gio from 'gio'; import * as Meta from 'meta'; import * as Shell from 'shell'; +import { assertNotNull } from 'src/utils/assert'; import { registerGObjectClass } from 'src/utils/gjs'; import * as St from 'st'; -const Dash = imports.ui.dash; -const SearchController = imports.ui.searchController; -const LayoutManager = imports.ui.layout; -const Main = imports.ui.main; -const OverviewControls = imports.ui.overviewControls; -const SwipeTracker = imports.ui.swipeTracker; -const WindowManager = imports.ui.windowManager; -const Overview = imports.ui.overview.Overview; -const ShellInfo = imports.ui.overview.ShellInfo; -const AppDisplay = imports.ui.appDisplay; -const Layout = imports.ui.layout; +import { searchController, dash, appDisplay, layout, overviewControls, windowManager, swipeTracker } from 'ui'; +import { main as Main } from 'ui'; +import { overview } from 'ui'; const ANIMATION_TIME = 250; const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard'; const Me = imports.misc.extensionUtils.getCurrentExtension(); -export function _computeWorkspacesBoxForState( - state, - box, - startY, - searchHeight, - dashHeight, - thumbnailsHeight -) { - const workspaceBox = box.copy(); - const [width, height] = workspaceBox.get_size(); - const { spacing } = this; - const { expandFraction } = this._workspacesThumbnails; - - workspaceBox.set_origin(0, startY + searchHeight + spacing); - workspaceBox.set_size(0, 0); - - return workspaceBox; -} - -export function OverviewShow(state = OverviewControls.ControlsState.APP_GRID) { - if (state === OverviewControls.ControlsState.HIDDEN) - throw new Error('Invalid state, use hide() to hide'); - - if (this.isDummy) return; - if (this._shown) return; - this._shown = true; - - if (!this._syncGrab()) return; - - Main.layoutManager.showOverview(); - this._animateVisible(state); -} +// export function _computeWorkspacesBoxForState( +// state, +// box, +// startY, +// searchHeight, +// dashHeight, +// thumbnailsHeight +// ) { +// const workspaceBox = box.copy(); +// const [width, height] = workspaceBox.get_size(); +// const { spacing } = this; +// const { expandFraction } = this._workspacesThumbnails; + +// workspaceBox.set_origin(0, startY + searchHeight + spacing); +// workspaceBox.set_size(0, 0); + +// return workspaceBox; +// } @registerGObjectClass class MsControlsManager extends St.Widget { _searchEntry: St.Entry; _searchEntryBin: St.Bin; - _searchController; - dash; - _a11ySettings; - _appDisplay; - _init() { - super._init({ + _searchController: searchController.SearchController; + dash: dash.Dash; + _a11ySettings: Gio.Settings; + _appDisplay: appDisplay.AppDisplay; + constructor() { + super({ style_class: 'controls-manager', x_expand: true, y_expand: true, @@ -87,9 +66,9 @@ class MsControlsManager extends St.Widget { x_align: Clutter.ActorAlign.CENTER, }); - this.dash = new Dash.Dash(); + this.dash = new dash.Dash(); - this._searchController = new SearchController.SearchController( + this._searchController = new searchController.SearchController( this._searchEntry, this.dash.showAppsButton ); @@ -98,7 +77,7 @@ class MsControlsManager extends St.Widget { this._onSearchChanged.bind(this) ); - this._appDisplay = new AppDisplay.AppDisplay(); + this._appDisplay = new appDisplay.AppDisplay(); this.add_child(this._searchEntryBin); this.add_child(this._appDisplay); @@ -132,12 +111,12 @@ class MsControlsManager extends St.Widget { }); } - animateToOverview(state, callback) { + animateToOverview(state: overviewControls.ControlsState, callback: ()=>void) { this._searchController.prepareToEnterOverview(); callback(); } - animateFromOverview(callback) { + animateFromOverview(callback: ()=>void) { callback(); } _updateAppDisplayVisibility() { @@ -181,7 +160,7 @@ class MsControlsManager extends St.Widget { this._stateAdjustment.gestureInProgress = false; } */ - async runStartupAnimation(callback) { + async runStartupAnimation(callback: ()=>void) { this._searchController.prepareToEnterOverview(); this.dash.showAppsButton.checked = false; @@ -192,7 +171,7 @@ class MsControlsManager extends St.Widget { // We can't run the animation before the first allocation happens //await this.layout_manager.ensureAllocation(); - const { STARTUP_ANIMATION_TIME } = Layout; + const { STARTUP_ANIMATION_TIME } = layout; // Opacity this.ease({ @@ -203,8 +182,8 @@ class MsControlsManager extends St.Widget { // Search bar falls from the ceiling const { primaryMonitor } = Main.layoutManager; - const [, y] = this._searchEntryBin.get_transformed_position(); - const yOffset = y - primaryMonitor.y; + const [, y] = this._searchEntryBin.get_transformed_position() as [number, number]; + const yOffset = y - assertNotNull(primaryMonitor).y; this._searchEntryBin.translation_y = -( yOffset + this._searchEntryBin.height @@ -239,8 +218,10 @@ class MsControlsManager extends St.Widget { @registerGObjectClass class OverviewActor extends St.BoxLayout { _controls: MsControlsManager; - _init() { - super._init({ + _delegate: any; + + constructor() { + super({ name: 'overview', /* Translators: This is the main Fview to select activities. See also note for "Activities" string. */ @@ -249,22 +230,22 @@ class OverviewActor extends St.BoxLayout { }); this.add_constraint( - new LayoutManager.MonitorConstraint({ primary: true }) + new layout.MonitorConstraint({ primary: true }) ); this._controls = new MsControlsManager(); this.add_child(this._controls); } - animateToOverview(state, callback) { + animateToOverview(state: overviewControls.ControlsState, callback: ()=>void) { this._controls.animateToOverview(state, callback); } - animateFromOverview(callback) { + animateFromOverview(callback: ()=>void) { this._controls.animateFromOverview(callback); } - runStartupAnimation(callback) { + runStartupAnimation(callback: ()=>void) { this._controls.runStartupAnimation(callback); } @@ -281,7 +262,7 @@ class OverviewActor extends St.BoxLayout { } } -export class MsOverview extends Overview { +export class MsOverview extends overview.Overview { toto = 'toto'; constructor() { @@ -292,7 +273,7 @@ export class MsOverview extends Overview { // want to access the overview as Main.overview to connect // signal handlers and so forth. So we create them after // construction in this init() method. - init() { + override init() { this._initCalled = true; if (this.isDummy) return; @@ -301,7 +282,7 @@ export class MsOverview extends Overview { this._overview._delegate = this; Main.layoutManager.overviewGroup.add_child(this._overview); - this._shellInfo = new ShellInfo(); + this._shellInfo = new overview.ShellInfo(); Main.layoutManager.connect( 'monitors-changed', @@ -312,23 +293,23 @@ export class MsOverview extends Overview { Main.wm.addKeybinding( 'toggle-overview', new Gio.Settings({ - schema_id: WindowManager.SHELL_KEYBINDINGS_SCHEMA, + schema_id: windowManager.SHELL_KEYBINDINGS_SCHEMA, }), Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW, this.toggle.bind(this) ); - const swipeTracker = new SwipeTracker.SwipeTracker( + const tracker = new swipeTracker.SwipeTracker( global.stage, Clutter.Orientation.VERTICAL, Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW, { allowDrag: false, allowScroll: false } ); - swipeTracker.orientation = Clutter.Orientation.VERTICAL; - swipeTracker.connect('begin', this._gestureBegin.bind(this)); - swipeTracker.connect('update', this._gestureUpdate.bind(this)); - swipeTracker.connect('end', this._gestureEnd.bind(this)); - this._swipeTracker = swipeTracker; + tracker.orientation = Clutter.Orientation.VERTICAL; + tracker.connect('begin', this._gestureBegin.bind(this)); + tracker.connect('update', this._gestureUpdate.bind(this)); + tracker.connect('end', this._gestureEnd.bind(this)); + this._swipeTracker = tracker; } } diff --git a/src/layout/verticalPanel/panelButton.ts b/src/layout/verticalPanel/panelButton.ts index a8bea063..7b6ffd59 100644 --- a/src/layout/verticalPanel/panelButton.ts +++ b/src/layout/verticalPanel/panelButton.ts @@ -4,7 +4,7 @@ import * as Meta from 'meta'; const Me = imports.misc.extensionUtils.getCurrentExtension(); import { MatButton } from 'src/widget/material/button'; import { registerGObjectClass } from 'src/utils/gjs'; -const Main = imports.ui.main; +import { main as Main } from 'ui'; @registerGObjectClass export class MatPanelButton extends MatButton { @@ -50,7 +50,7 @@ export class MatPanelButton extends MatButton { /** * Just the panel width */ - vfunc_get_preferred_width(_forHeight): [number, number] { + override vfunc_get_preferred_width(_forHeight: number): [number, number] { return [ Me.msThemeManager.getPanelSize(this.monitorIndex), Me.msThemeManager.getPanelSize(this.monitorIndex), @@ -60,7 +60,7 @@ export class MatPanelButton extends MatButton { /** * Just the panel height */ - vfunc_get_preferred_height(_forWidth): [number, number] { + override vfunc_get_preferred_height(_forWidth: number): [number, number] { return [ Me.msThemeManager.getPanelSize(this.monitorIndex), Me.msThemeManager.getPanelSize(this.monitorIndex), diff --git a/src/layout/verticalPanel/searchResultList.ts b/src/layout/verticalPanel/searchResultList.ts index 948d27e7..30cd7f4b 100644 --- a/src/layout/verticalPanel/searchResultList.ts +++ b/src/layout/verticalPanel/searchResultList.ts @@ -9,18 +9,14 @@ import { Async } from 'src/utils/async'; import { registerGObjectClass } from 'src/utils/gjs'; import { MatButton } from 'src/widget/material/button'; import * as St from 'st'; - -const AppDisplay = imports.ui.appDisplay; +import { appDisplay, remoteSearch } from 'ui'; const DND = imports.ui.dnd; -const Main = imports.ui.main; const ShellEntry = imports.ui.shellEntry; const ParentalControlsManager = imports.misc.parentalControlsManager; -const RemoteSearch = imports.ui.remoteSearch; -const PopupMenu = imports.ui.popupMenu; const SystemActions = imports.misc.systemActions; -function getTermsForSearchString(searchString) { +function getTermsForSearchString(searchString: string): string[] { searchString = searchString.replace(/^\s+/g, '').replace(/\s+$/g, ''); if (searchString === '') return []; return searchString.split(/\s+/); @@ -30,13 +26,15 @@ const SEARCH_PROVIDERS_SCHEMA = 'org.gnome.desktop.search-providers'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); +type SearchProvider = appDisplay.AppSearchProvider | remoteSearch.RemoteSearchProvider; + @registerGObjectClass export class SearchResultHeader extends St.Bin { static metaInfo: GObject.MetaInfo = { GTypeName: 'SearchResultHeader', }; label: St.Label; - constructor(text) { + constructor(text: string) { super({ style_class: 'subtitle-2 margin margin-top-x2 margin-bottom-x2', }); @@ -60,20 +58,22 @@ export class SearchResultEntry extends MatButton { }, }; layout = new St.BoxLayout(); - icon: St.Icon; + icon: St.Icon | null; textLayout = new St.BoxLayout({ vertical: true, styleClass: 'margin-left-x2 margin-top margin-bottom margin-right-x2', y_align: Clutter.ActorAlign.CENTER, }); title: St.Label; - description: St.Label; - constructor(icon, title, description?, withMenu?) { + description: St.Label | null; + constructor(icon: St.Icon | null, title: string, description?: string, withMenu?: boolean) { super({}); if (icon) { this.icon = icon; this.icon.set_style('margin: 12px'); this.layout.add_child(this.icon); + } else { + this.icon = null; } this.layout.add_child(this.textLayout); @@ -88,6 +88,8 @@ export class SearchResultEntry extends MatButton { style: 'margin-top:2px', }); this.textLayout.add_child(this.description); + } else { + this.description = null; } this.set_child(this.layout); @@ -97,7 +99,7 @@ export class SearchResultEntry extends MatButton { } */ } - setSelected(selected) { + setSelected(selected: boolean) { if (selected) { this.add_style_class_name('highlighted'); } else { @@ -120,14 +122,13 @@ export class SearchResultList extends St.BoxLayout { searchEntry: St.Entry; text: Text; parentalControlsManager; - providers = []; + providers: SearchProvider[] = []; searchSettings; terms: string[] = []; private searchTimeoutId = 0; - startingSearch: boolean; - private results: any = {}; - isSubSearch: boolean; - highlightRegex: RegExp; + startingSearch: boolean = false; + private results: Record = {}; + isSubSearch: boolean = false; cancellable = new Gio.Cancellable(); clearIcon = new St.Icon({ style_class: 'search-entry-icon', @@ -146,6 +147,7 @@ export class SearchResultList extends St.BoxLayout { this.text = this.searchEntry.clutter_text; this.text.connect('text-changed', this.onTextChanged.bind(this)); + // Note: Clutter typedefs seem to be incorrect. According to the docs `ev` should be a Clutter.KeyEvent, but it actually seems to be a Clutter.Event. this.text.connect('key-press-event', this.onKeyPress.bind(this)); this.text.connect('key-focus-in', () => {}); this.text.connect('key-focus-out', () => {}); @@ -182,7 +184,7 @@ export class SearchResultList extends St.BoxLayout { this.reloadRemoteProviders.bind(this) ); - this.registerProvider(new AppDisplay.AppSearchProvider()); + this.registerProvider(new appDisplay.AppSearchProvider()); const appSystem = Shell.AppSystem.get_default(); appSystem.connect( @@ -198,12 +200,12 @@ export class SearchResultList extends St.BoxLayout { ) as SearchResultEntry[]; } - registerProvider(provider): void { + registerProvider(provider: SearchProvider): void { provider.searchInProgress = false; // Filter out unwanted providers. if ( - provider.appInfo && + provider.isRemoteProvider && !this.parentalControlsManager.shouldShowApp(provider.appInfo) ) return; @@ -219,7 +221,7 @@ export class SearchResultList extends St.BoxLayout { this.unregisterProvider(provider); }); - RemoteSearch.loadRemoteSearchProviders( + remoteSearch.loadRemoteSearchProviders( this.searchSettings, (providers) => { providers.forEach(this.registerProvider.bind(this)); @@ -227,7 +229,7 @@ export class SearchResultList extends St.BoxLayout { ); } - unregisterProvider(provider): void { + unregisterProvider(provider: SearchProvider): void { const index = this.providers.indexOf(provider); this.providers.splice(index, 1); @@ -262,7 +264,7 @@ export class SearchResultList extends St.BoxLayout { } } - onKeyPress(entry, event) { + onKeyPress(entry: Clutter.Actor, event: Clutter.Event) { const symbol = event.get_key_symbol(); if (symbol === Clutter.KEY_Escape) { this.resetAndClose(); @@ -288,7 +290,9 @@ export class SearchResultList extends St.BoxLayout { symbol === Clutter.KEY_Return || symbol === Clutter.KEY_KP_Enter ) { - this.entrySelected.emit('primary-action'); + if (this.entrySelected !== null) { + this.entrySelected.emit('primary-action'); + } return Clutter.EVENT_STOP; } } @@ -351,7 +355,7 @@ export class SearchResultList extends St.BoxLayout { if (this.text.text !== '') this.reset(); } - setTerms(terms): void { + setTerms(terms: string[]): void { // Check for the case of making a duplicate previous search before // setting state of the current search or cancelling the search. // This will prevent incorrect state being as a result of a duplicate @@ -387,20 +391,16 @@ export class SearchResultList extends St.BoxLayout { const escapedTerms = this.terms.map((term) => Shell.util_regex_escape(term) ); - this.highlightRegex = new RegExp( - ('(%s)' as any).format(escapedTerms.join('|')), - 'gi' - ); //this.emit('terms-changed'); } - gotResults(results, provider) { + gotResults(results: string[], provider: SearchProvider) { this.results[provider.id] = results; this.updateResults(provider, results); } - updateResults(provider, results) { + updateResults(provider: SearchProvider, results: string[]) { if (!results.length) return; if (provider.isRemoteProvider) { @@ -408,105 +408,119 @@ export class SearchResultList extends St.BoxLayout { } else { this.add_child(new SearchResultHeader(_('Applications'))); } - provider.getResultMetas( - results, - (resMetas, index) => { - this.resMetas = resMetas; - let moreEntry; - // - const extraResults = []; - if (resMetas.length > 5) { - moreEntry = new SearchResultEntry( - new St.Icon({ - icon_size: 32, - gicon: Gio.icon_new_for_string( - `${Me.path}/assets/icons/chevron-down-symbolic.svg` - ), - }), - ngettext( - '%d more', - '%d more', - resMetas.length - 5 - ).format(resMetas.length - 5), - '', - provider.id === 'applications' - ); - - moreEntry.connect('primary-action', () => { - extraResults.forEach((entry) => { - this.insert_child_below(entry, moreEntry); - }); - this.remove_child(moreEntry); - this.selectResult(extraResults[0]); + + // Note: The remote search provider also provides a description field, but the app search does not + const onSearchMetas = (resMetas: { id: string, name: string, description?: string, createIcon: (size: number)=>St.Icon }[] ) => { + this.resMetas = resMetas; + let moreEntry: SearchResultEntry | null = null; + // + const extraResults: SearchResultEntry[] = []; + if (resMetas.length > 5) { + const more = moreEntry = new SearchResultEntry( + new St.Icon({ + icon_size: 32, + gicon: Gio.icon_new_for_string( + `${Me.path}/assets/icons/chevron-down-symbolic.svg` + ), + }), + ngettext( + '%d more', + '%d more', + resMetas.length - 5 + ).format(resMetas.length - 5), + '', + provider.id === 'applications' + ); + + more.connect('primary-action', () => { + extraResults.forEach((entry) => { + this.insert_child_below(entry, more); + }); + this.remove_child(more); + this.selectResult(extraResults[0]); + }); + } + let numberOfRes = 0; + for (const res of resMetas) { + if (!res.name) return; + numberOfRes++; + + let icon = res.createIcon(32); + if (!icon && provider.isRemoteProvider) { + icon = new St.Icon({ + icon_size: 32, + gicon: provider.appInfo.get_icon(), }); } - let numberOfRes = 0; - for (const res of resMetas) { - if (!res.name) return; - numberOfRes++; - - let icon = res.createIcon(32); - if (!icon && provider.appInfo) { - icon = new St.Icon({ - icon_size: 32, - gicon: provider.appInfo.get_icon(), - }); - } - const entry = new SearchResultEntry( - icon, - res.name, - res.description, - provider.id === 'applications' - ); - entry.connect('primary-action', () => { - if (provider.isRemoteProvider) { - provider.activateResult(res.id, this.terms); - } else { - const app = - Shell.AppSystem.get_default().lookup_app( - res.id - ); - if (app) { - if (app.can_open_new_window()) { - const msWindow = - Me.msWindowManager.createNewMsWindow( - app.id, - null, - null, - { - msWorkspace: - Me.msWorkspaceManager.getActiveMsWorkspace(), - focus: true, - insert: true, - } - ); + const entry = new SearchResultEntry( + icon, + res.name, + // The remote search provider also provides a description field, but the app search does not + res.description, + provider.id === 'applications' + ); + entry.connect('primary-action', () => { + if (provider.isRemoteProvider) { + provider.activateResult(res.id, this.terms); + } else { + const app = + Shell.AppSystem.get_default().lookup_app( + res.id + ); + if (app) { + if (app.can_open_new_window()) { + const msWindow = + Me.msWindowManager.createNewMsWindow( + app.id, + null, + null, + { + msWorkspace: + Me.msWorkspaceManager.getActiveMsWorkspace(), + focus: true, + insert: true, + } + ); + if (msWindow !== undefined) { Me.msWindowManager.openAppForMsWindow( msWindow ); - } else { - app.activate(); } } else { - SystemActions.getDefault().activateAction( - res.id - ); + app.activate(); } + } else { + SystemActions.getDefault().activateAction( + res.id + ); } - - this.resetAndClose(); - }); - if (numberOfRes <= 5) { - this.addResult(entry); - } else { - extraResults.push(entry); } + + this.resetAndClose(); + }); + if (numberOfRes <= 5) { + this.addResult(entry); + } else { + extraResults.push(entry); } - if (moreEntry) { - this.addResult(moreEntry); - } - }, - this.cancellable - ); + } + if (moreEntry) { + this.addResult(moreEntry); + } + }; + + if (provider.isRemoteProvider) { + provider.getResultMetas( + results, + onSearchMetas, + this.cancellable + ); + } else { + provider.getResultMetas( + results, + onSearchMetas + ); + } /* display.updateSearch(results, terms, () => { provider.searchInProgress = false; @@ -533,7 +547,7 @@ export class SearchResultList extends St.BoxLayout { } selectNext() { - const currentIndex = this.resultEntryList.indexOf(this.entrySelected); + const currentIndex = this.entrySelected !== null ? this.resultEntryList.indexOf(this.entrySelected) : -1; const nextEntry = this.resultEntryList[currentIndex + 1]; if (nextEntry) { this.selectResult(nextEntry); @@ -541,7 +555,7 @@ export class SearchResultList extends St.BoxLayout { } selectPrevious() { - const currentIndex = this.resultEntryList.indexOf(this.entrySelected); + const currentIndex = this.entrySelected !== null ? this.resultEntryList.indexOf(this.entrySelected) : -1; const previousEntry = this.resultEntryList[currentIndex - 1]; if (previousEntry) { this.selectResult(previousEntry); diff --git a/src/layout/verticalPanel/statusArea.ts b/src/layout/verticalPanel/statusArea.ts index 1a8038d5..e877fd2a 100644 --- a/src/layout/verticalPanel/statusArea.ts +++ b/src/layout/verticalPanel/statusArea.ts @@ -4,11 +4,11 @@ import * as Gio from 'gio'; import * as GnomeDesktop from 'gnomedesktop'; import * as GObject from 'gobject'; import { VerticalPanelPositionEnum } from 'src/manager/msThemeManager'; -import { assert } from 'src/utils/assert'; +import { assert, assertNotNull } from 'src/utils/assert'; import { registerGObjectClass } from 'src/utils/gjs'; import { reparentActor } from 'src/utils/index'; import * as St from 'st'; -const Main = imports.ui.main; +import { dateMenu, main as Main, panel } from 'ui'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); @@ -18,16 +18,18 @@ export class MsStatusArea extends Clutter.Actor { static metaInfo: GObject.MetaInfo = { GTypeName: 'MsStatusArea', }; - gnomeShellPanel: any; + gnomeShellPanel: panel.Panel; leftBoxActors: Clutter.Actor[]; rightBoxActors: Clutter.Actor[]; - dateMenu: any; + dateMenu: dateMenu.DateMenuButton; originalDateMenuBox: any; msDateMenuBox?: MsDateMenuBox; - leftBoxActorAddedSignal: any; - centerBoxActorAddedSignal: any; - centerBoxActors: any; - rightBoxActorAddedSignal: any; + signalIds: { + leftBoxActor: number; + centerBoxActor: number; + rightBoxActor: number; + } | null = null; + centerBoxActors: Clutter.Actor[]; constructor() { super({ @@ -62,11 +64,6 @@ export class MsStatusArea extends Clutter.Actor { } unVerticaliseDateMenuButton() { - assert( - this.msDateMenuBox !== undefined, - "date menu button hasn't been verticalized" - ); - this.msDateMenuBox.destroy(); delete this.msDateMenuBox; this.dateMenu.add_child(this.originalDateMenuBox); } @@ -84,7 +81,7 @@ export class MsStatusArea extends Clutter.Actor { .forEach((actor) => { this.stealActor(actor, this.leftBoxActors); }); - this.leftBoxActorAddedSignal = this.gnomeShellPanel._leftBox.connect( + const leftBoxActorAddedSignal = this.gnomeShellPanel._leftBox.connect( 'actor-added', (_, actor) => { this.stealActor(actor, this.leftBoxActors); @@ -93,7 +90,7 @@ export class MsStatusArea extends Clutter.Actor { this.gnomeShellPanel._centerBox.get_children().forEach((actor) => { this.stealActor(actor, this.centerBoxActors); }); - this.centerBoxActorAddedSignal = + const centerBoxActorAddedSignal = this.gnomeShellPanel._centerBox.connect( 'actor-added', (_, actor) => { @@ -106,12 +103,17 @@ export class MsStatusArea extends Clutter.Actor { .forEach((actor) => { this.stealActor(actor, this.rightBoxActors); }); - this.rightBoxActorAddedSignal = this.gnomeShellPanel._rightBox.connect( + const rightBoxActorAddedSignal = this.gnomeShellPanel._rightBox.connect( 'actor-added', (_, actor) => { this.stealActor(actor, this.rightBoxActors); } ); + this.signalIds = { + rightBoxActor: rightBoxActorAddedSignal, + leftBoxActor: leftBoxActorAddedSignal, + centerBoxActor: centerBoxActorAddedSignal, + }; } stealActor(actor: Clutter.Actor, container: Clutter.Actor[]) { @@ -126,13 +128,10 @@ export class MsStatusArea extends Clutter.Actor { } restorePanelActors() { - this.gnomeShellPanel._leftBox.disconnect(this.leftBoxActorAddedSignal); - this.gnomeShellPanel._centerBox.disconnect( - this.centerBoxActorAddedSignal - ); - this.gnomeShellPanel._rightBox.disconnect( - this.rightBoxActorAddedSignal - ); + const signalIds = assertNotNull(this.signalIds); + this.gnomeShellPanel._leftBox.disconnect(signalIds.leftBoxActor); + this.gnomeShellPanel._centerBox.disconnect(signalIds.centerBoxActor); + this.gnomeShellPanel._rightBox.disconnect(signalIds.rightBoxActor); this.leftBoxActors.forEach((actor) => { if (!actor) return; @@ -182,29 +181,200 @@ export class MsStatusArea extends Clutter.Actor { overridePanelMenuSide() { // For each menu override the opening side to match the vertical panel - this.gnomeShellPanel.menuManager._menus.forEach((menuData) => { - const menu = menuData.menu ?? menuData; + this.gnomeShellPanel.menuManager._menus.forEach((menu) => { if (menu._boxPointer) { - menu._boxPointer.oldArrowSideFunction = + (menu._boxPointer as any).oldArrowSideFunction = menu._boxPointer._calculateArrowSide; menu._boxPointer._calculateArrowSide = function () { + log('_calculateArrowSide'); return Me.msThemeManager.verticalPanelPosition === VerticalPanelPositionEnum.LEFT ? St.Side.LEFT : St.Side.RIGHT; }; + menu._boxPointer._arrowSide = + menu._boxPointer._calculateArrowSide( + menu._boxPointer._arrowSide + ); + (menu._boxPointer as any)._reposition = function ( + allocationBox: Clutter.ActorBox + ) { + let sourceActor = this._sourceActor; + let alignment = this._arrowAlignment; + let monitorIndex = ( + Main.layoutManager as any + ).findIndexForActor(sourceActor); + + this._sourceExtents = sourceActor.get_transformed_extents(); + this._workArea = + Main.layoutManager.getWorkAreaForMonitor(monitorIndex); + log( + `_workArea ${this._workArea.x} ${this._workArea.y} ${this._workArea.width} ${this._workArea.height}` + ); + // Position correctly relative to the sourceActor + const sourceAllocation = sourceActor.get_allocation_box(); + const sourceContentBox = + sourceActor instanceof St.Widget + ? sourceActor + .get_theme_node() + .get_content_box(sourceAllocation) + : new Clutter.ActorBox({ + x2: sourceAllocation.get_width(), + y2: sourceAllocation.get_height(), + }); + let sourceTopLeft = this._sourceExtents.get_top_left(); + let sourceBottomRight = + this._sourceExtents.get_bottom_right(); + let sourceCenterX = + sourceTopLeft.x + + sourceContentBox.x1 + + (sourceContentBox.x2 - sourceContentBox.x1) * + this._sourceAlignment; + let sourceCenterY = + sourceTopLeft.y + + sourceContentBox.y1 + + (sourceContentBox.y2 - sourceContentBox.y1) * + this._sourceAlignment; + let [, , natWidth, natHeight] = this.get_preferred_size(); + + // We also want to keep it onscreen, and separated from the + // edge by the same distance as the main part of the box is + // separated from its sourceActor + let workarea = this._workArea; + let themeNode = this.get_theme_node(); + let borderWidth = themeNode.get_length( + '-arrow-border-width' + ); + let arrowBase = themeNode.get_length('-arrow-base'); + let borderRadius = themeNode.get_length( + '-arrow-border-radius' + ); + let margin = 4 * borderRadius + borderWidth + arrowBase; + + let gap = themeNode.get_length('-boxpointer-gap'); + let padding = themeNode.get_length('-arrow-rise'); + + let resX, resY; + log('_arrowSide ' + this._arrowSide); + + switch (this._arrowSide) { + case St.Side.TOP: + resY = sourceBottomRight.y + gap; + break; + case St.Side.BOTTOM: + resY = sourceTopLeft.y - natHeight - gap; + break; + case St.Side.LEFT: + resX = sourceBottomRight.x + gap; + break; + case St.Side.RIGHT: + resX = sourceTopLeft.x - natWidth - gap; + break; + } + + // Now align and position the pointing axis, making sure it fits on + // screen. If the arrowOrigin is so close to the edge that the arrow + // will not be isosceles, we try to compensate as follows: + // - We skip the rounded corner and settle for a right angled arrow + // as shown below. See _drawBorder for further details. + // |\_____ + // | + // | + // - If the arrow was going to be acute angled, we move the position + // of the box to maintain the arrow's accuracy. + + let arrowOrigin; + let halfBase = Math.floor(arrowBase / 2); + let halfBorder = borderWidth / 2; + let halfMargin = margin / 2; + let [x1, y1] = [halfBorder, halfBorder]; + let [x2, y2] = [ + natWidth - halfBorder, + natHeight - halfBorder, + ]; + + switch (this._arrowSide) { + case St.Side.TOP: + case St.Side.BOTTOM: + resX = + sourceCenterX - + (halfMargin + (natWidth - margin) * alignment); + + resX = Math.max(resX, workarea.x + padding); + resX = Math.min( + resX, + workarea.x + + workarea.width - + (padding + natWidth) + ); + + arrowOrigin = sourceCenterX - resX; + if (arrowOrigin <= x1 + (borderRadius + halfBase)) { + if (arrowOrigin > x1) resX += arrowOrigin - x1; + arrowOrigin = x1; + } else if ( + arrowOrigin >= + x2 - (borderRadius + halfBase) + ) { + if (arrowOrigin < x2) resX -= x2 - arrowOrigin; + arrowOrigin = x2; + } + break; + + case St.Side.LEFT: + case St.Side.RIGHT: + resY = + sourceCenterY - + (halfMargin + (natHeight - margin) * alignment); + + resY = Math.max(resY, workarea.y + padding); + resY = Math.min( + resY, + workarea.y + + workarea.height - + (padding + natHeight) + ); + + arrowOrigin = sourceCenterY - resY; + if (arrowOrigin <= y1 + (borderRadius + halfBase)) { + if (arrowOrigin > y1) resY += arrowOrigin - y1; + arrowOrigin = y1; + } else if ( + arrowOrigin >= + y2 - (borderRadius + halfBase) + ) { + if (arrowOrigin < y2) resY -= y2 - arrowOrigin; + arrowOrigin = y2; + } + break; + } + + this.setArrowOrigin(arrowOrigin); + + let parent = this.get_parent(); + let success, x, y; + while (!success) { + [success, x, y] = parent.transform_stage_point( + resX, + resY + ); + parent = parent.get_parent(); + } + log('x: ' + Math.floor(x) + ' y: ' + Math.floor(y)); + // Actually set the position + allocationBox.set_origin(Math.floor(x), Math.floor(y)); + }; } }); } restorePanelMenuSide() { - this.gnomeShellPanel.menuManager._menus.forEach((menuData) => { - const menu = menuData.menu ?? menuData; - + this.gnomeShellPanel.menuManager._menus.forEach((menu) => { if (menu._boxPointer) { - menu._boxPointer._calculateArrowSide = - menu._boxPointer.oldArrowSideFunction; - delete menu._boxPointer.oldArrowSideFunction; + menu._boxPointer._calculateArrowSide = ( + menu._boxPointer as any + ).oldArrowSideFunction; + delete (menu._boxPointer as any).oldArrowSideFunction; } }); } @@ -222,8 +392,8 @@ export class MsDateMenuBox extends St.Widget { static metaInfo: GObject.MetaInfo = { GTypeName: 'MsDateMenuBox', }; - dateMenu: any; - indicatorActor: any; + dateMenu: dateMenu.DateMenuButton; + indicatorActor: dateMenu.MessagesIndicator; private _wallClock: any; clockLabel: St.Label< Clutter.Actor @@ -239,20 +409,16 @@ export class MsDateMenuBox extends St.Widget { >; private _settings: Gio.Settings; iconDisplay: Clutter.Actor; - dateMenuSignal: any; - indicatorSignal: any; + dateMenuSignal: number; + indicatorSignal: number; - constructor(dateMenu: any) { + constructor(dateMenu: dateMenu.DateMenuButton) { super({ x_align: Clutter.ActorAlign.CENTER, layout_manager: new Clutter.BinLayout(), }); this.dateMenu = dateMenu; - // Before 3.36 _indicator was just a class with an actor as property - this.indicatorActor = - this.dateMenu._indicator instanceof Clutter.Actor - ? this.dateMenu._indicator - : this.dateMenu._indicator.actor; + this.indicatorActor = this.dateMenu._indicator; this._wallClock = new GnomeDesktop.WallClock({ time_only: true }); diff --git a/src/layout/verticalPanel/verticalPanel.ts b/src/layout/verticalPanel/verticalPanel.ts index 68b3ae06..bc3b7e5b 100644 --- a/src/layout/verticalPanel/verticalPanel.ts +++ b/src/layout/verticalPanel/verticalPanel.ts @@ -14,7 +14,8 @@ const Util = imports.misc.util; const SearchController = imports.ui.searchController; -const Main = imports.ui.main; +import { main as Main, panel } from 'ui'; +import { assert } from 'src/utils/assert'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); @@ -33,8 +34,7 @@ export class PanelContent extends St.BoxLayout { topBox: St.BoxLayout; workspaceList: WorkspaceList; statusArea: MsStatusArea; - disableConnect: number; - searchButton; + searchButton: MatPanelButton; buttonIcon: St.Icon; constructor() { super({ @@ -99,7 +99,7 @@ export class PanelContent extends St.BoxLayout { this.statusArea.disable(); } - vfunc_get_preferred_width(_forHeight): [number, number] { + override vfunc_get_preferred_width(_forHeight: number): [number, number] { return [ Me.msThemeManager.getPanelSize(Main.layoutManager.primaryIndex), Me.msThemeManager.getPanelSize(Main.layoutManager.primaryIndex), @@ -129,7 +129,6 @@ export class SearchContent extends St.BoxLayout { searchEntry: St.Entry; searchEntryBin: St.Bin; searchResultList: SearchResultList; - disableConnect: number; scrollView = new St.ScrollView({ x_expand: true, hscrollbar_policy: St.PolicyType.NEVER, @@ -198,7 +197,7 @@ export class SearchContent extends St.BoxLayout { this.add_child(this.scrollView); } - vfunc_get_preferred_width(_forHeight): [number, number] { + override vfunc_get_preferred_width(_forHeight: number): [number, number] { return [ 448 - Me.msThemeManager.getPanelSize(Main.layoutManager.primaryIndex), @@ -212,8 +211,7 @@ export class MsPanel extends St.BoxLayout { static metaInfo: GObject.MetaInfo = { GTypeName: 'MsPanel', }; - gnomeShellPanel: any; - searchButton: MatPanelButton; + gnomeShellPanel: panel.Panel; panelContent: PanelContent; searchContent: SearchContent; divider: MatDivider; @@ -344,10 +342,12 @@ export class MsPanel extends St.BoxLayout { } } - vfunc_get_preferred_height(_forWidth): [number, number] { + override vfunc_get_preferred_height(_forWidth: number): [number, number] { + const monitor = Main.layoutManager.primaryMonitor; + assert(monitor !== null, "found no primary monitor"); return [ - Main.layoutManager.primaryMonitor.height, - Main.layoutManager.primaryMonitor.height, + monitor.height, + monitor.height, ]; } } diff --git a/src/layout/verticalPanel/workspaceList.ts b/src/layout/verticalPanel/workspaceList.ts index e693be6f..33ea3022 100644 --- a/src/layout/verticalPanel/workspaceList.ts +++ b/src/layout/verticalPanel/workspaceList.ts @@ -14,9 +14,9 @@ import { MatButton } from 'src/widget/material/button'; import { ReorderableList } from 'src/widget/reorderableList'; import * as St from 'st'; import { MsWorkspace } from '../msWorkspace/msWorkspace'; -const PopupMenu = imports.ui.popupMenu; +import { popupMenu } from 'ui'; const DND = imports.ui.dnd; -const Main = imports.ui.main; +import { main as Main } from 'ui'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); @@ -26,7 +26,7 @@ export class WorkspaceList extends St.Widget { private _delegate: this; msWorkspaceButtonMap: Map; msWorkspaceManager: MsWorkspaceManager; - menuManager: any; + menuManager: popupMenu.PopupMenuManager; buttonList: ReorderableList; workspaceActiveIndicator: St.Widget; workspaceSignal: number; @@ -43,7 +43,7 @@ export class WorkspaceList extends St.Widget { this.connect('destroy', this._onDestroy.bind(this)); this.msWorkspaceButtonMap = new Map(); this.msWorkspaceManager = Me.msWorkspaceManager; - this.menuManager = new PopupMenu.PopupMenuManager(this); + this.menuManager = new popupMenu.PopupMenuManager(this); this.buttonList = new ReorderableList(true); this.buttonList.connect('actor-moved', (_, actor, index) => { @@ -396,10 +396,10 @@ export class WorkspaceButton extends MatButton { } buildMenu() { - this.menu = new PopupMenu.PopupMenu(this, 0.5, St.Side.LEFT); + this.menu = new popupMenu.PopupMenu(this, 0.5, St.Side.LEFT); this.menu.actor.add_style_class_name('panel-menu'); this.menu.addMenuItem( - new PopupMenu.PopupSeparatorMenuItem(_('Panel icons style')) + new popupMenu.PopupSeparatorMenuItem(_('Panel icons style')) ); this.panelIconStyleHybridRadio = this.menu.addAction( _('Hybrid'), @@ -479,10 +479,10 @@ export class WorkspaceButton extends MatButton { }); this.menu.addMenuItem( - new PopupMenu.PopupSeparatorMenuItem(_('Override category')) + new popupMenu.PopupSeparatorMenuItem(_('Override category')) ); const autoSentence = _('Determined automatically'); - this.subMenu = new PopupMenu.PopupSubMenuMenuItem( + this.subMenu = new popupMenu.PopupSubMenuMenuItem( this.msWorkspace.msWorkspaceCategory.forcedCategory || autoSentence ); const setCategory = (category?: string) => { @@ -508,7 +508,7 @@ export class WorkspaceButton extends MatButton { }); this.menu.addMenuItem(this.subMenu); - Main.uiGroup.add_actor(this.menu.actor); + Main.layoutManager.uiGroup.add_actor(this.menu.actor); this.menu.close(); } @@ -524,14 +524,14 @@ export class WorkspaceButton extends MatButton { }); } - handleDragOver(source, actor, x, y) { + handleDragOver(source: any, actor: Clutter.Actor, x: number, y: number) { if (source instanceof TaskBarItem) { return DND.DragMotionResult.MOVE_DROP; } return DND.DragMotionResult.NO_DROP; } - acceptDrop(source) { + acceptDrop(source: any) { if (source instanceof TaskBarItem) { if (source.tileable instanceof MsWindow) { Me.msWorkspaceManager.setWindowToMsWorkspace( @@ -618,6 +618,7 @@ export class WorkspaceButtonIcon extends St.Widget { this.desaturateEffect ); } else { + assert(this.desaturateEffect !== undefined, "true by construction"); this.remove_effect(this.desaturateEffect); delete this.desaturateEffect; } diff --git a/src/manager/layoutManager.ts b/src/manager/layoutManager.ts index 5fdffb11..339b608b 100644 --- a/src/manager/layoutManager.ts +++ b/src/manager/layoutManager.ts @@ -1,5 +1,5 @@ /** Gnome libs imports */ -const Main = imports.ui.main; +import { main as Main } from 'ui'; import * as GLib from 'glib'; import * as Meta from 'meta'; @@ -20,8 +20,35 @@ import { SimpleHorizontalLayout } from 'src/layout/msWorkspace/tilingLayouts/cus import { SimpleVerticalLayout } from 'src/layout/msWorkspace/tilingLayouts/custom/simpleVertical'; import { RatioLayout } from 'src/layout/msWorkspace/tilingLayouts/custom/ratio'; import { GridLayout } from 'src/layout/msWorkspace/tilingLayouts/custom/grid'; - -type LayoutType = typeof BaseTilingLayout; +import { MsWorkspace } from 'src/layout/msWorkspace/msWorkspace'; +import { Settings } from 'gio'; + +type ExtractState = L extends BaseTilingLayout ? S : never; + +export type LayoutState = + ExtractState + | ExtractState + | ExtractState + | ExtractState + | ExtractState + | ExtractState + | ExtractState + | ExtractState + | ExtractState + | ExtractState + | ExtractState + +export type LayoutType = (typeof MaximizeLayout + | typeof SplitLayout + | typeof GridLayout + | typeof HalfLayout + | typeof HalfHorizontalLayout + | typeof HalfVerticalLayout + | typeof RatioLayout + | typeof SimpleLayout + | typeof SimpleHorizontalLayout + | typeof SimpleVerticalLayout + | typeof FloatLayout) const layouts: LayoutType[] = [ MaximizeLayout, @@ -38,16 +65,16 @@ const layouts: LayoutType[] = [ ]; export const TilingLayoutByKey: { - [key: string]: typeof BaseTilingLayout; + [key: string]: LayoutType; } = layouts.reduce((layoutsByKey, layout) => { layoutsByKey[layout.state.key] = layout; return layoutsByKey; -}, {}); +}, {} as { [key: string]: LayoutType; }); export class LayoutManager extends MsManager { workspaceManager: Meta.WorkspaceManager; - layoutList: any[]; - layoutsSettings: any; + layoutList: LayoutType[]; + layoutsSettings: Settings; screenGap: number; ratio: number; useScreenGap: boolean; @@ -118,6 +145,22 @@ export class LayoutManager extends MsManager { }); } + createLayout(workspace: MsWorkspace, state: LayoutState): InstanceType { + switch(state.key) { + case "maximize": return new MaximizeLayout(workspace, state); + case "split": return new SplitLayout(workspace, state); + case "grid": return new GridLayout(workspace, state); + case "half": return new HalfLayout(workspace, state); + case "half-horizontal": return new HalfHorizontalLayout(workspace, state); + case "half-vertical": return new HalfVerticalLayout(workspace, state); + case "ratio": return new RatioLayout(workspace, state); + case "simple": return new SimpleLayout(workspace, state); + case "simple-horizontal": return new SimpleHorizontalLayout(workspace, state); + case "simple-vertical": return new SimpleVerticalLayout(workspace, state); + case "float": return new FloatLayout(workspace, state); + } + } + getLayoutByKey(key: string): LayoutType { return TilingLayoutByKey[key]; } diff --git a/src/manager/msDndManager.ts b/src/manager/msDndManager.ts index c3e5b4db..d112e27e 100644 --- a/src/manager/msDndManager.ts +++ b/src/manager/msDndManager.ts @@ -6,12 +6,12 @@ import { MsWindow } from 'src/layout/msWorkspace/msWindow'; import { MsWorkspace } from 'src/layout/msWorkspace/msWorkspace'; import { MsManager } from 'src/manager/msManager'; import { KeyBindingAction } from 'src/module/hotKeysModule'; -import { assert } from 'src/utils/assert'; +import { assert, assertNotNull } from 'src/utils/assert'; import { Async } from 'src/utils/async'; import { registerGObjectClass } from 'src/utils/gjs'; import { reparentActor, throttle } from 'src/utils/index'; import { MsWindowManager } from './msWindowManager'; -const Main = imports.ui.main; +import { main as Main } from 'ui'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); @@ -273,7 +273,7 @@ export class InputGrabber extends Clutter.Actor { }) ); } - vfunc_key_press_event(keyEvent: Clutter.KeyEvent) { + override vfunc_key_press_event(keyEvent: Clutter.KeyEvent) { const actionId = global.display.get_keybinding_action( keyEvent.hardware_keycode, keyEvent.modifier_state @@ -282,24 +282,24 @@ export class InputGrabber extends Clutter.Actor { const actionName = Me.hotKeysModule.actionIdToNameMap.get(actionId); switch (actionName) { case KeyBindingAction.PREVIOUS_WINDOW: - Me.hotKeysModule.actionNameToActionMap.get( + assertNotNull(Me.hotKeysModule.actionNameToActionMap.get( KeyBindingAction.MOVE_WINDOW_LEFT - )(); + ))(); break; case KeyBindingAction.NEXT_WINDOW: - Me.hotKeysModule.actionNameToActionMap.get( + assertNotNull(Me.hotKeysModule.actionNameToActionMap.get( KeyBindingAction.MOVE_WINDOW_RIGHT - )(); + ))(); break; case KeyBindingAction.PREVIOUS_WORKSPACE: - Me.hotKeysModule.actionNameToActionMap.get( + assertNotNull(Me.hotKeysModule.actionNameToActionMap.get( KeyBindingAction.MOVE_WINDOW_TOP - )(); + ))(); break; case KeyBindingAction.NEXT_WORKSPACE: - Me.hotKeysModule.actionNameToActionMap.get( + assertNotNull(Me.hotKeysModule.actionNameToActionMap.get( KeyBindingAction.MOVE_WINDOW_BOTTOM - )(); + ))(); break; } } diff --git a/src/manager/msFocusManager.ts b/src/manager/msFocusManager.ts index 079d4e8c..1ba5bfab 100644 --- a/src/manager/msFocusManager.ts +++ b/src/manager/msFocusManager.ts @@ -1,6 +1,8 @@ /** Gnome libs imports */ import { Actor } from 'clutter'; import * as GLib from 'glib'; +import { ModalOptions } from 'meta'; +import { ActionMode } from 'shell'; import { MsWindow } from 'src/layout/msWorkspace/msWindow'; import { MsManager } from 'src/manager/msManager'; import { Async } from 'src/utils/async'; @@ -8,7 +10,7 @@ import { MetaWindowWithMsProperties, MsWindowManagerType, } from './msWindowManager'; -const Main = imports.ui.main; +import { main as Main } from 'ui'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); @@ -17,7 +19,7 @@ export type MsFocusManagerType = InstanceType; export class MsFocusManager extends MsManager { msWindowManager: MsWindowManagerType; lastMsWindowFocused: MsWindow | null = null; - lastKeyFocus: MsWindow | null = null; + lastKeyFocus: Actor | null = null; focusProtected?: boolean; actorGrabMap: Map = new Map(); constructor(msWindowManager: MsWindowManagerType) { @@ -74,19 +76,16 @@ export class MsFocusManager extends MsManager { } let actor = keyFocus; - let isChildrenOfMsWindow = false; - while (actor.get_parent() && !isChildrenOfMsWindow) { + while (actor.get_parent()) { actor = actor.get_parent(); if (actor instanceof MsWindow) { - isChildrenOfMsWindow = true; + this.setFocusToMsWindow(actor); + return; } } - if (isChildrenOfMsWindow) { - this.setFocusToMsWindow(actor); - } else { - if (keyFocus != Main.layoutManager.uiGroup) { - this.lastMsWindowFocused = null; - } + + if (keyFocus != Main.layoutManager.uiGroup) { + this.lastMsWindowFocused = null; } } @@ -118,13 +117,13 @@ export class MsFocusManager extends MsManager { ); } - pushModal(actor, options?) { + pushModal(actor: Actor, options?: { timestamp?: number, options?: ModalOptions, actionMode?: ActionMode }) { const currentFocus = global.stage.key_focus; let grab = Main.pushModal(actor, options); this.actorGrabMap.set(actor, grab); } - popModal(actor) { + popModal(actor: Actor) { let grab = this.actorGrabMap.get(actor); if (grab != null) { Main.popModal(grab != true ? grab : actor); diff --git a/src/manager/msNotificationManager.ts b/src/manager/msNotificationManager.ts index d73f279d..2b6afcfc 100644 --- a/src/manager/msNotificationManager.ts +++ b/src/manager/msNotificationManager.ts @@ -7,7 +7,7 @@ import { registerGObjectClass } from 'src/utils/gjs'; import { getSettings } from 'src/utils/settings'; import { ShellVersionMatch } from 'src/utils/shellVersionMatch'; import { messageTray } from 'ui'; -const Main = imports.ui.main; +import { main as Main } from 'ui'; const Dialog = imports.ui.dialog; const ModalDialog = imports.ui.modalDialog; @@ -46,7 +46,7 @@ export class MsNotificationManager extends MsManager { let notifications: NotificationResponseItem[] = []; try { notifications = JSON.parse(message.response_body.data); - } catch (e) { + } catch (e: any) { global.log(`error unpack notification error ${e.toString()}`); return; } diff --git a/src/manager/msResizeManager.ts b/src/manager/msResizeManager.ts index ae3608d9..31cb649d 100644 --- a/src/manager/msResizeManager.ts +++ b/src/manager/msResizeManager.ts @@ -10,7 +10,7 @@ import { assert } from 'src/utils/assert'; import { registerGObjectClass } from 'src/utils/gjs'; import { throttle } from 'src/utils/index'; import { MsWindowManager } from './msWindowManager'; -const Main = imports.ui.main; +import { main as Main } from 'ui'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); @@ -148,6 +148,7 @@ export class MsResizeManager extends MsManager { getFirstPortionPositionAndSize(): Rectangular { assert(this.resizeInProgress !== null, 'No resize in progress'); const { layout } = this.resizeInProgress.msWorkspace; + assert(layout instanceof BaseResizeableTilingLayout, "expected a resizable layout"); const ratio = layout.mainPortion.getRatioForPortion( this.resizeInProgress.border.firstPortion ); diff --git a/src/manager/msThemeManager.ts b/src/manager/msThemeManager.ts index 9837619b..c3644afa 100644 --- a/src/manager/msThemeManager.ts +++ b/src/manager/msThemeManager.ts @@ -6,7 +6,7 @@ import { MsManager } from 'src/manager/msManager'; import { getSettings } from 'src/utils/settings'; import { ShellVersionMatch } from 'src/utils/shellVersionMatch'; import * as St from 'st'; -const Main = imports.ui.main; +import { main as Main } from 'ui'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); @@ -57,11 +57,11 @@ export class MsThemeManager extends MsManager { Me.log('theme changed'); this.theme = this.themeContext.get_theme(); - if (Main.uiGroup.has_style_class_name('no-theme')) { - Main.uiGroup.remove_style_class_name('no-theme'); + if (Main.layoutManager.uiGroup.has_style_class_name('no-theme')) { + Main.layoutManager.uiGroup.remove_style_class_name('no-theme'); } if (!this.theme.application_stylesheet) { - Main.uiGroup.add_style_class_name('no-theme'); + Main.layoutManager.uiGroup.add_style_class_name('no-theme'); } }); this.observe(this.themeSettings, 'changed::theme', (schema) => { @@ -155,7 +155,7 @@ export class MsThemeManager extends MsManager { return this.themeSettings.get_boolean('clock-app-launcher'); } - getPanelSize(monitorIndex) { + getPanelSize(monitorIndex: number) { return ( this.themeSettings.get_int('panel-size') * global.display.get_monitor_scale(monitorIndex) @@ -170,7 +170,7 @@ export class MsThemeManager extends MsManager { return this.themeSettings.get_enum('focus-effect'); } - isColorDark(color) { + isColorDark(color: string) { color = color.replace('#', ''); const r = parseInt(color.substring(0, 2), 16); const g = parseInt(color.substring(2, 4), 16); @@ -237,7 +237,7 @@ export class MsThemeManager extends MsManager { }); } - async buildThemeStylesheetToFile(file) { + async buildThemeStylesheetToFile(file: Gio.FilePrototype) { const originThemeFile = Gio.file_new_for_path( `${Me.path}/style-${this.themeValue}-theme.css` ); @@ -251,7 +251,7 @@ export class MsThemeManager extends MsManager { async regenerateStylesheet() { this.unloadStylesheet(); if (!this.theme.application_stylesheet) { - Main.uiGroup.add_style_class_name('no-theme'); + Main.layoutManager.uiGroup.add_style_class_name('no-theme'); } if (ShellVersionMatch('3.34')) { //TODO The new code may prevent crashes on 3.34 without this, needs testing @@ -269,8 +269,8 @@ export class MsThemeManager extends MsManager { } unloadStylesheet() { - if (Main.uiGroup.has_style_class_name('no-theme')) { - Main.uiGroup.remove_style_class_name('no-theme'); + if (Main.layoutManager.uiGroup.has_style_class_name('no-theme')) { + Main.layoutManager.uiGroup.remove_style_class_name('no-theme'); } this.theme.unload_stylesheet(this.themeFile); } diff --git a/src/manager/msWindowManager.ts b/src/manager/msWindowManager.ts index b447abfc..4e8a2de6 100644 --- a/src/manager/msWindowManager.ts +++ b/src/manager/msWindowManager.ts @@ -41,7 +41,10 @@ export class MsWindowManager extends MsManager { msResizeManager: MsResizeManager; msFocusManager: MsFocusManager; signals: any[]; - metaWindowWaitingForAssignationList: any[]; + metaWindowWaitingForAssignationList: { + timestamp: number, + metaWindow: MetaWindowWithMsProperties, + }[]; checkInProgress: boolean | undefined; constructor() { @@ -93,11 +96,7 @@ export class MsWindowManager extends MsManager { } onNewMetaWindow( - metaWindow: Meta.Window & { - createdAt?: number; - firstFrameDrawn?: boolean; - handledByMaterialShell?: boolean; - } + metaWindow: MetaWindowWithMsProperties ) { if (Me.disableInProgress) return; metaWindow.createdAt = metaWindow.user_time; @@ -137,7 +136,7 @@ export class MsWindowManager extends MsManager { return this.setMetaWindowAsWaitingForAssignation(metaWindow); } - onMetaWindowUnManaged(metaWindow) { + onMetaWindowUnManaged(metaWindow: MetaWindowWithMsProperties) { if (Me.disableInProgress || Me.closing) return; if ( this.metaWindowWaitingForAssignationList @@ -158,9 +157,9 @@ export class MsWindowManager extends MsManager { } createNewMsWindow( - appId: any, + appId: string, description: string | null, - metaWindow: any, + metaWindow: MetaWindowWithMsProperties | null, msWorkspace: { msWorkspace: MsWorkspace; focus: boolean; @@ -170,7 +169,7 @@ export class MsWindowManager extends MsManager { initialAllocation?: Rectangular ) { const appSys = Shell.AppSystem.get_default(); - const app = + const app: Shell.App = appSys.lookup_app(appId) || (metaWindow && this.windowTracker.get_window_app(metaWindow)); if (!app) { @@ -202,7 +201,7 @@ export class MsWindowManager extends MsManager { return msWindow; } - setMetaWindowAsWaitingForAssignation(metaWindow) { + setMetaWindowAsWaitingForAssignation(metaWindow: MetaWindowWithMsProperties) { this.metaWindowWaitingForAssignationList.push({ timestamp: Date.now(), metaWindow, @@ -211,7 +210,7 @@ export class MsWindowManager extends MsManager { this.checkWindowsForAssignations(); } - setMsWindowAsWaitingForMetaWindow(msWindow) { + setMsWindowAsWaitingForMetaWindow(msWindow: MsWindow) { this.msWindowWaitingForMetaWindowList.push({ timestamp: Date.now(), msWindow, @@ -230,16 +229,17 @@ export class MsWindowManager extends MsManager { const app = this.windowTracker.get_window_app( waitingMetaWindow.metaWindow ); - let msWindowFound: MsWindow | null = null; + let msWindowFound: MsWindow | undefined = undefined; // If window is dialog try t0 find his parent if (this.isMetaWindowDialog(waitingMetaWindow.metaWindow)) { // The best way to find it's parent it with the root ancestor. - let root; + let root: MetaWindowWithMsProperties | undefined; waitingMetaWindow.metaWindow.foreach_ancestor( (ancestor) => { - if (!root && ancestor.msWindow) { + if (!root && (ancestor as MetaWindowWithMsProperties).msWindow) { root = ancestor; } + return true; } ); if (root) { @@ -398,16 +398,16 @@ export class MsWindowManager extends MsManager { } } - openAppForMsWindow(msWindow) { + openAppForMsWindow(msWindow: MsWindow) { this.setMsWindowAsWaitingForMetaWindow(msWindow); const workspaceIndex = Me.msWorkspaceManager.primaryMsWorkspaces.indexOf( msWindow.msWorkspace ); - msWindow.app.launch(0, workspaceIndex, false); + msWindow.app.launch(0, workspaceIndex, Shell.AppLaunchGpu.APP_PREF); } - _handleWindow(metaWindow) { + _handleWindow(metaWindow: MetaWindowWithMsProperties) { if ( metaWindow.wm_class !== '' && getSettings('layouts') @@ -432,7 +432,7 @@ export class MsWindowManager extends MsManager { return types.includes(metaWindow.window_type); } - isMetaWindowDialog(metaWindow) { + isMetaWindowDialog(metaWindow: MetaWindowWithMsProperties) { const dialogTypes = [ Meta.WindowType.DIALOG, Meta.WindowType.MODAL_DIALOG, @@ -453,7 +453,7 @@ export class MsWindowManager extends MsManager { ); } - buildMetaWindowIdentifier(metaWindow) { + buildMetaWindowIdentifier(metaWindow: MetaWindowWithMsProperties) { return `${metaWindow.get_wm_class_instance()}-${metaWindow.get_pid()}-${metaWindow.get_stable_sequence()}`; } diff --git a/src/manager/msWorkspaceManager.ts b/src/manager/msWorkspaceManager.ts index 01ddd06f..b266a26a 100644 --- a/src/manager/msWorkspaceManager.ts +++ b/src/manager/msWorkspaceManager.ts @@ -10,17 +10,16 @@ import { MsWorkspaceState, } from 'src/layout/msWorkspace/msWorkspace'; import { MsManager } from 'src/manager/msManager'; -import { Monitor } from 'src/types/mod'; -import { assert } from 'src/utils/assert'; +import { assert, assertNotNull } from 'src/utils/assert'; import { isNonNull } from 'src/utils/predicates'; import { getSettings } from 'src/utils/settings'; import { MetaWindowWithMsProperties } from './msWindowManager'; - -const Main = imports.ui.main; +import { main as Main, windowManager, layout } from 'ui'; +import Monitor = layout.Monitor; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); -const { WorkspaceTracker } = imports.ui.windowManager; +const WorkspaceTracker = windowManager.WorkspaceTracker; interface MsWorkspaceManagerState { msWorkspaceList: MsWorkspaceState[]; @@ -36,7 +35,7 @@ export class MsWorkspaceManager extends MsManager { metaWindowFocused: Meta.Window | null; numOfMonitors: number; primaryIndex: number; - workspaceTracker: any; + workspaceTracker: windowManager.WorkspaceTracker; private _updatingMonitors: boolean | undefined; restoringState: any; stateChangedTriggered: any; @@ -59,7 +58,7 @@ export class MsWorkspaceManager extends MsManager { this.numOfMonitors = global.display.get_n_monitors(); this.primaryIndex = global.display.get_primary_monitor(); this.workspaceTracker = Main.wm._workspaceTracker; - WorkspaceTracker.prototype._oldCheckWorkspaces = + (WorkspaceTracker.prototype as any)._oldCheckWorkspaces = WorkspaceTracker.prototype._checkWorkspaces; WorkspaceTracker.prototype._checkWorkspaces = function () { const workspaceManager = global.workspace_manager; @@ -87,9 +86,6 @@ export class MsWorkspaceManager extends MsManager { return false; } - // Update workspaces only if Dynamic Workspace Management has not been paused by some other function - if (this._pauseWorkspaceCheck) return true; - for (i = 0; i < this._workspaces.length; i++) { const lastRemoved = this._workspaces[i]._lastRemovedWindow; if ( @@ -215,7 +211,7 @@ export class MsWorkspaceManager extends MsManager { this.observe( global.window_manager, 'switch-workspace', - (_, from, to) => { + (_, from: number, to: number) => { if (!this.restoringState) { this.emit('switch-workspace', from, to); this.stateChanged(); @@ -231,8 +227,8 @@ export class MsWorkspaceManager extends MsManager { destroy() { super.destroy(); WorkspaceTracker.prototype._checkWorkspaces = - WorkspaceTracker.prototype._oldCheckWorkspaces; - delete WorkspaceTracker.prototype._oldCheckWorkspaces; + (WorkspaceTracker.prototype as any)._oldCheckWorkspaces; + delete (WorkspaceTracker.prototype as any)._oldCheckWorkspaces; for (let i = 0; i < this.workspaceManager.n_workspaces; i++) { // _keepAliveId is an internal field in gnome-shell const workspace = this.workspaceManager.get_workspace_by_index( @@ -396,7 +392,7 @@ export class MsWorkspaceManager extends MsManager { // if there is not external msWorkspace available create one if (msWorkspace) { - const workspace = this.getWorkspaceOfMsWorkspace(msWorkspace); + const workspace = assertNotNull(this.getWorkspaceOfMsWorkspace(msWorkspace)); msWorkspace.setMonitor(externalMonitor); if (!Meta.prefs_get_dynamic_workspaces()) { this.workspaceManager.remove_workspace( @@ -417,7 +413,7 @@ export class MsWorkspaceManager extends MsManager { ) .forEach((msWorkspace) => { if (!msWorkspace.monitorIsExternal) { - msWorkspace.setMonitor(Main.layoutManager.primaryMonitor); + msWorkspace.setMonitor(assertNotNull(Main.layoutManager.primaryMonitor)); } else { const monitorIsNowPrimary = msWorkspace.monitor === @@ -432,7 +428,7 @@ export class MsWorkspaceManager extends MsManager { // Try to find an unused monitor; const availableMonitor = Main.layoutManager.monitors.find( - (monitor) => { + (monitor: any) => { return ( monitor != Main.layoutManager.primaryMonitor && !this.msWorkspaceList.find((msWorkspace) => { @@ -471,7 +467,7 @@ export class MsWorkspaceManager extends MsManager { this.restoringState = false; } msWorkspace.setMonitor( - Main.layoutManager.primaryMonitor + assertNotNull(Main.layoutManager.primaryMonitor) ); /* this.setMsWorkspaceAt( msWorkspace, @@ -498,7 +494,7 @@ export class MsWorkspaceManager extends MsManager { initialState?: Partial ) { this.createNewMsWorkspace( - Main.layoutManager.primaryMonitor, + assertNotNull(Main.layoutManager.primaryMonitor), initialState ); this.observe(workspace, 'window-added', (workspace, window) => { @@ -625,7 +621,7 @@ export class MsWorkspaceManager extends MsManager { return this.primaryMsWorkspaces[activeWorkspaceIndex]; } - getWorkspaceOfMsWorkspace(msWorkspace: MsWorkspace): Meta.Workspace { + getWorkspaceOfMsWorkspace(msWorkspace: MsWorkspace): Meta.Workspace | null { return this.workspaceManager.get_workspace_by_index( this.primaryMsWorkspaces.indexOf(msWorkspace) ); @@ -654,7 +650,7 @@ export class MsWorkspaceManager extends MsManager { } } - getMsWorkspaceOfMsWindow(msWindow: MsWindow): MsWorkspace { + getMsWorkspaceOfMsWindow(msWindow: MsWindow): MsWorkspace | undefined { return this.msWorkspaceList.find((msWorkspace) => { return msWorkspace.msWindowList.includes(msWindow); }); @@ -802,7 +798,7 @@ export class MsWorkspaceManager extends MsManager { const backend = Clutter.get_default_backend(); const seat = backend.get_default_seat(); const [containerX, containerY] = - msWorkspace.msWorkspaceActor.tileableContainer.get_transformed_position(); + msWorkspace.msWorkspaceActor.tileableContainer.get_transformed_position() as [number, number]; seat.warp_pointer( containerX + Math.floor( diff --git a/src/manager/stateManager.ts b/src/manager/stateManager.ts index eac0fc90..d5c6beaa 100644 --- a/src/manager/stateManager.ts +++ b/src/manager/stateManager.ts @@ -74,7 +74,7 @@ export class StateManager { ...workspacesState.externalWorkspaces, ]; - workspacesState.msWorkspaceList.map((msWorkspaceState) => { + workspacesState.msWorkspaceList.map((msWorkspaceState: any) => { msWorkspaceState.layoutKey = msWorkspaceState.layoutKey || msWorkspaceState.tilingLayout; @@ -96,7 +96,7 @@ export class StateManager { getState(key: string) { return this.state[key]; } - setState(key: string, value) { + setState(key: string, value: any) { if (value === undefined) { delete this.state[key]; } else { diff --git a/src/manager/tooltipManager.ts b/src/manager/tooltipManager.ts index c76806b3..35bc0a0c 100644 --- a/src/manager/tooltipManager.ts +++ b/src/manager/tooltipManager.ts @@ -6,7 +6,7 @@ import { MsManager } from 'src/manager/msManager'; import { Async } from 'src/utils/async'; import { registerGObjectClass } from 'src/utils/gjs'; import * as St from 'st'; -const Main = imports.ui.main; +import { main as Main } from 'ui'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); @@ -156,7 +156,7 @@ export class MatTooltip extends St.Label { vfunc_allocate(...args: [Clutter.ActorBox]) { const relativeActor = this.params.relativeActor || this.sourceActor; const [stageX, stageY] = relativeActor.get_transformed_position(); - let x, y; + let x: number, y: number; switch (this.params.side) { case TooltipSide.LEFT: x = stageX! - this.get_width(); diff --git a/src/module/disableIncompatibleExtensionsModule.ts b/src/module/disableIncompatibleExtensionsModule.ts index f90dcd13..bc6eed50 100644 --- a/src/module/disableIncompatibleExtensionsModule.ts +++ b/src/module/disableIncompatibleExtensionsModule.ts @@ -1,5 +1,5 @@ /** Gnome libs imports */ -const Main = imports.ui.main; +import { main as Main } from 'ui'; const { ExtensionManager, ENABLED_EXTENSIONS_KEY } = imports.ui.extensionSystem; /** Extension imports */ @@ -16,8 +16,7 @@ let originalFunction: { apply: (uuid: any, args: IArguments) => void } | null; export class DisableIncompatibleExtensionsModule { constructor() { originalFunction = ExtensionManager.prototype._callExtensionEnable; - ExtensionManager.prototype._callExtensionEnable = function (...args) { - const uuid = args[0]; + ExtensionManager.prototype._callExtensionEnable = function (uuid: string, ...args: any[]) { if (incompatibleExtensions.includes(uuid)) return; // eslint-disable-next-line prefer-rest-params originalFunction!.apply(this, arguments); diff --git a/src/module/hotKeysModule.ts b/src/module/hotKeysModule.ts index f9aab657..0af25862 100644 --- a/src/module/hotKeysModule.ts +++ b/src/module/hotKeysModule.ts @@ -7,14 +7,14 @@ import { MsWindow } from 'src/layout/msWorkspace/msWindow'; import { TilingLayoutByKey } from 'src/manager/layoutManager'; import { getSettings } from 'src/utils/settings'; import { MsApplicationLauncher } from 'src/widget/msApplicationLauncher'; -const Main = imports.ui.main; +import { main as Main } from 'ui'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); /* exported HotKeysModule, KeyBindingAction */ -export const KeyBindingAction = { +export const KeyBindingAction: Record = { // window actions PREVIOUS_WINDOW: 'previous-window', NEXT_WINDOW: 'next-window', @@ -49,8 +49,8 @@ export const KeyBindingAction = { export class HotKeysModule { workspaceManager: Meta.WorkspaceManager; settings: Gio.Settings; - actionIdToNameMap: Map; - actionNameToActionMap: Map; + actionIdToNameMap: Map; + actionNameToActionMap: Mapvoid>; connectId: number; lastStash: number | null; nextStash: number | null; @@ -190,7 +190,6 @@ export class HotKeysModule { Me.msWorkspaceManager.primaryMsWorkspaces[ currentMsWorkspaceIndex - 1 ]; - Me.msWorkspaceManager.setWindowToMsWorkspace( activeMsWorkspace.tileableFocused, nextMsWorkspace @@ -338,7 +337,7 @@ export class HotKeysModule { } ); - ['LEFT', 'UP', 'RIGHT', 'DOWN'].forEach((DIRECTION) => { + (['LEFT', 'UP', 'RIGHT', 'DOWN'] as const).forEach((DIRECTION) => { this.actionNameToActionMap.set( KeyBindingAction[`FOCUS_MONITOR_${DIRECTION}`], () => { @@ -520,22 +519,28 @@ export class HotKeysModule { this.nextStash = null; } - addKeybinding(name) { + addKeybinding(name: string) { + const actionCallback = this.actionNameToActionMap.get(name); + if (actionCallback === undefined) { + Me.log("Error: Cannot add keybinding. No such action exists: " + name); + return; + } + const actionId = Main.wm.addKeybinding( name, this.settings, Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, Shell.ActionMode.NORMAL, - this.actionNameToActionMap.get(name) + actionCallback ); this.actionIdToNameMap.set(actionId, name); } destroy() { - this.actionIdToNameMap.forEach((key) => { - Main.wm.removeKeybinding(key); - this.actionIdToNameMap.delete(key); - }); + for (let [_, value] of this.actionIdToNameMap) { + Main.wm.removeKeybinding(value); + } + this.actionIdToNameMap.clear(); if (this.connectId) { global.window_manager.disconnect(this.connectId); } diff --git a/src/module/overrideModule.ts b/src/module/overrideModule.ts index 5301d045..a4c0d88f 100644 --- a/src/module/overrideModule.ts +++ b/src/module/overrideModule.ts @@ -1,6 +1,6 @@ /** Gnome libs imports */ import * as Meta from 'meta'; -const { WindowManager } = imports.ui.windowManager; +import { windowManager } from 'ui'; /* exported OverrideModule */ export class OverrideModule { @@ -23,12 +23,12 @@ export class OverrideModule { overrideWindowManagerFunctions() { this.windowManagersFunctionToRestore = []; - const _shouldAnimate = WindowManager.prototype._shouldAnimate; - WindowManager.prototype._shouldAnimate = function (_actor, _types) { + const _shouldAnimate = windowManager.WindowManager.prototype._shouldAnimate; + windowManager.WindowManager.prototype._shouldAnimate = function (_actor, _types) { return false; }; this.windowManagersFunctionToRestore.push([ - WindowManager.prototype._shouldAnimate, + windowManager.WindowManager.prototype._shouldAnimate, _shouldAnimate, ]); } diff --git a/src/module/requiredSettingsModule.ts b/src/module/requiredSettingsModule.ts index 7f6b0079..7d886f68 100644 --- a/src/module/requiredSettingsModule.ts +++ b/src/module/requiredSettingsModule.ts @@ -1,6 +1,7 @@ /** Gnome libs imports */ import * as Gio from 'gio'; import { Signal } from 'src/manager/msManager'; +import { assert } from 'src/utils/assert'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); @@ -10,14 +11,14 @@ interface Setting { schema: string; key: string; value: boolean | string; - valueType: string; + valueType: "string" | "boolean"; } interface RestoreSetting { setting: Gio.Settings; key: string; value: boolean | string; - valueType: string; + valueType: "string" | "boolean"; } interface RestoreKey { @@ -26,6 +27,26 @@ interface RestoreKey { shortcut: string[]; } +function getDynamic(settings: Gio.Settings, key: string, valueType: "string" | "boolean"): string | boolean { + switch (valueType) { + case "string": + return settings.get_string(key); + case "boolean": + return settings.get_boolean(key); + } +} + +function setDynamic(settings: Gio.Settings, key: string, valueType: "string" | "boolean", value: string | boolean) { + switch (valueType) { + case "string": + assert(typeof value === "string", "invalid value"); + return settings.set_string(key, value); + case "boolean": + assert(typeof value === "boolean", "invalid value"); + return settings.set_boolean(key, value); + } +} + export class RequiredSettingsModule { mutterSettings: Gio.Settings; settingsToForce: Setting[]; @@ -123,7 +144,7 @@ export class RequiredSettingsModule { this.signals = []; this.settingsToRestore.forEach((settingToRestore) => { const { setting, key, value, valueType } = settingToRestore; - setting[`set_${valueType}`](key, value); + setDynamic(setting, key, valueType, value); }); this.keysToRestore.forEach((keyToRestore) => { keyToRestore.setting.set_strv( @@ -138,16 +159,17 @@ export class RequiredSettingsModule { setting: Gio.Settings, key: string, value: string | boolean, - valueType: string + valueType: "string" | "boolean" ) { - if (setting[`get_${valueType}`](key) !== value) { + const prevVal = getDynamic(setting, key, valueType); + if (prevVal !== value) { this.settingsToRestore.push({ setting, key, - value: setting[`get_${valueType}`](key), + value: prevVal, valueType, }); - setting[`set_${valueType}`](key, value); + setDynamic(setting, key, valueType, value); } } } diff --git a/src/prefs/prefs.ts b/src/prefs/prefs.ts index 28c45d86..8bbfef76 100644 --- a/src/prefs/prefs.ts +++ b/src/prefs/prefs.ts @@ -3,6 +3,7 @@ import * as Gio from 'gio'; import * as GLib from 'glib'; import * as GObject from 'gobject'; import * as Gtk from 'gtk'; +import { assert, assertNotNull } from 'src/utils/assert'; import { registerGObjectClass } from 'src/utils/gjs'; const Me = imports.misc.extensionUtils.getCurrentExtension(); @@ -22,10 +23,13 @@ function log(...args: any[]) { GLib.log_structured(domain, GLib.LogLevelFlags.LEVEL_MESSAGE, fields); } // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function -function init() {} +function init() { + log("INITIALIZING PREFERENCES"); +} // eslint-disable-next-line @typescript-eslint/no-unused-vars function buildPrefsWidget() { + log("Prefs widget"); return new PrefsWidget(); } @@ -85,12 +89,12 @@ class SettingListBoxRow extends Gtk.ListBoxRow { ], }; - private _name_label: Gtk.Label; - private _description_label: Gtk.Label; - private _widget_container: Gtk.Box; + private declare _name_label: Gtk.Label; + private declare _description_label: Gtk.Label; + private declare _widget_container: Gtk.Box; private _settings_widget: Gtk.Widget; - constructor(summary, description, widget) { + constructor(summary: string, description: string, widget: Gtk.Widget) { super(); this._name_label.set_text(summary); this._description_label.set_text(description); @@ -128,21 +132,25 @@ class HotkeyListBox extends Gtk.ListBox { }); this.settings = new Gio.Settings({ - settings_schema: schemaSource.lookup(hotkeysSchemaName, false), + settings_schema: schemaSource.lookup(hotkeysSchemaName, false) || undefined, }); this.settings .list_keys() .map((key) => { - const [_, accelKey, accelerators, mods] = + const [ok, accelKey, accelerators, mods] = Gtk.accelerator_parse_with_keycode( this.settings.get_strv(key)[0], null ); + if (!ok) { + Me.log(`Could not parse key for ${key}: ${this.settings.get_strv(key)[0]}`); + } let accelName; if (accelKey == 0) { accelName = 'Disabled'; } else { + assert(accelKey !== null && mods !== null, "parse should have succeeded"); accelName = Gtk.accelerator_get_label(accelKey, mods); } const summary = this.settings.settings_schema @@ -194,9 +202,10 @@ class HotkeyListBoxRow extends Gtk.ListBoxRow { }, }, }; - private _accel_label: Gtk.Label; - private _hotkey_label: Gtk.Label; - private _dialog: Gtk.Dialog; + // Note: will be created by gjs from the InternalChildren meta info property + private declare _accel_label: Gtk.Label; + private declare _hotkey_label: Gtk.Label; + private declare _dialog: Gtk.Dialog; key: string; constructor(key: string, hotkeyName: string, accel: string) { @@ -211,12 +220,12 @@ class HotkeyListBoxRow extends Gtk.ListBoxRow { this._dialog.transient_for = this.get_root() as Gtk.Window; this._dialog.present(); ( - this.get_root().get_surface() as Gdk.Toplevel + assertNotNull(this.get_root()).get_surface() as Gdk.Toplevel ).inhibit_system_shortcuts(null); } onKeyPressed( - _widget, + _widget: Gtk.Widget, keyval: number, keycode: number, state: Gdk.ModifierType @@ -253,7 +262,7 @@ class HotkeyListBoxRow extends Gtk.ListBoxRow { closeDialog() { ( - this.get_root().get_surface() as Gdk.Toplevel + assertNotNull(this.get_root()).get_surface() as Gdk.Toplevel ).restore_system_shortcuts(); this._dialog.close(); } @@ -274,8 +283,11 @@ class SettingCategoryListBox extends Gtk.Box { }, InternalChildren: ['title_label', 'list_box'], }; - private _title_label: Gtk.Label; - private _list_box: Gtk.ListBox; + + // Note: will be created by gjs from the InternalChildren meta info property + private declare _title_label: Gtk.Label; + // Note: will be created by gjs from the InternalChildren meta info property + private declare _list_box: Gtk.ListBox; public settings: Gio.Settings; @@ -283,7 +295,7 @@ class SettingCategoryListBox extends Gtk.Box { super(); this.settings = new Gio.Settings({ - settings_schema: schemaSource.lookup(schema, false), + settings_schema: schemaSource.lookup(schema, false) || undefined, }); this.title = title; } @@ -300,7 +312,7 @@ class SettingCategoryListBox extends Gtk.Box { const settingKey = this.settings.settings_schema.get_key(key); const summary = settingKey.get_summary(); const description = settingKey.get_description(); - let widget; + let widget: Gtk.Widget; switch (type) { case WidgetType.BOOLEAN: widget = new Gtk.Switch(); @@ -313,13 +325,13 @@ class SettingCategoryListBox extends Gtk.Box { break; case WidgetType.COMBO: - widget = new Gtk.ComboBoxText(); + const combo = widget = new Gtk.ComboBoxText(); const a = settingKey .get_range() .get_child_value(1) .recursiveUnpack() as any[]; a.forEach((value) => { - widget.append(value, value); + combo.append(value, value); }); this.settings.bind( key, @@ -330,10 +342,10 @@ class SettingCategoryListBox extends Gtk.Box { break; case WidgetType.COLOR: { - widget = new Gtk.ColorButton(); + const btn = widget = new Gtk.ColorButton(); const rgba = new Gdk.RGBA(); rgba.parse(this.settings.get_string(key)); - widget.set_rgba(rgba); + btn.set_rgba(rgba); widget.connect('color-set', (button) => { const rgba = button.get_rgba(); const css = rgba.to_string(); @@ -343,20 +355,20 @@ class SettingCategoryListBox extends Gtk.Box { break; } case WidgetType.INT: - widget = Gtk.SpinButton.new_with_range(0, 1000, 1); + const spin = widget = Gtk.SpinButton.new_with_range(0, 1000, 1); this.settings.bind( key, - widget.get_adjustment(), + spin.get_adjustment(), 'value', Gio.SettingsBindFlags.DEFAULT ); break; case WidgetType.DECIMAL: - widget = Gtk.SpinButton.new_with_range(0, 1, 0.1); + const spin2 = widget = Gtk.SpinButton.new_with_range(0, 1, 0.1); this.settings.bind( key, - widget.get_adjustment(), + spin2.get_adjustment(), 'value', Gio.SettingsBindFlags.DEFAULT ); @@ -373,6 +385,9 @@ class SettingCategoryListBox extends Gtk.Box { break; case WidgetType.CUSTOM: + if (customWidget == undefined) { + throw new Error("Supplied custom widget is undefined"); + } widget = customWidget; break; } @@ -389,7 +404,9 @@ class PrefsWidget extends Gtk.Box { Template: Me.dir.get_child('prefs.ui').get_uri(), InternalChildren: ['settings_box'], }; - private _settings_box: Gtk.Box; + + // Note: will be created by gjs from the InternalChildren meta info property + private declare _settings_box: Gtk.Box; constructor() { super(); @@ -469,7 +486,7 @@ class PrefsWidget extends Gtk.Box { function cssHexString(css: string) { let rrggbb = '#'; - let start: number; + let start: number | undefined = undefined; for (let loop = 0; loop < 3; loop++) { let end = 0; let xx = ''; @@ -484,6 +501,7 @@ function cssHexString(css: string) { start = end; } } + assert(start !== undefined, "true by construction"); xx = parseInt(css.slice(start, end)).toString(16); if (xx.length == 1) xx = `0${xx}`; rrggbb += xx; diff --git a/src/types/mod.d.ts b/src/types/mod.d.ts index 93ba483f..7fc85567 100644 --- a/src/types/mod.d.ts +++ b/src/types/mod.d.ts @@ -1,9 +1,11 @@ /* eslint-disable @typescript-eslint/no-misused-new */ /* eslint-disable @typescript-eslint/ban-types */ import * as Clutter from 'clutter'; +import { AppLaunchContext } from 'gio'; import * as GLib from 'glib'; import * as GObject from 'gobject'; import * as Meta from 'meta'; +import * as Shell from 'shell'; import { MsWorkspace } from 'src/layout/msWorkspace/msWorkspace'; import { MsOverview } from 'src/layout/overview'; import { LayoutManager } from 'src/manager/layoutManager'; @@ -53,14 +55,14 @@ declare global { * @param timestamp the timestamp for the launch (or 0 for current time) * @param workspace a workspace index, or -1 to indicate the current one */ - create_app_launch_context(timestep: number, workspace: number); + create_app_launch_context(timestep: number, workspace: number): AppLaunchContext; /** Material shell */ ms: Extension; display: Meta.Display; session_mode: string; - stage: Clutter.Stage & { key_focus: any }; + stage: Clutter.Stage; window_group: Clutter.Actor; - window_manager: any; + window_manager: Shell.WM; workspace_manager: Meta.WorkspaceManager; top_window_group: Clutter.Actor; } @@ -90,6 +92,7 @@ declare global { layout: any; uuid: string; path: string; + logWithStackTrace: (...args: any[]) => void; logFocus: (...args: any[]) => void; logBlank: () => void; log: (...args: any[]) => void; @@ -112,14 +115,6 @@ declare global { } } -export interface Monitor { - readonly index: number; - readonly x: number; - readonly y: number; - readonly width: number; - readonly height: number; -} - export interface Rectangular { x: number; y: number; @@ -167,7 +162,7 @@ declare module 'gobject' { declare module 'clutter' { export interface Actor { - metaWindow?: any; + // metaWindow?: any; msWorkspace?: MsWorkspace; } @@ -260,21 +255,21 @@ declare module 'clutter' { } } -declare namespace Shell { - interface Dialog extends St.Widget { - _dialog: St.Widget; - contentLayout: St.Widget; - } +// declare namespace Shell { +// interface Dialog extends St.Widget { +// _dialog: St.Widget; +// contentLayout: St.Widget; +// } - interface ModalDialog extends St.Widget { - contentLayout: St.Widget; - dialogLayout: Dialog; +// interface ModalDialog extends St.Widget { +// contentLayout: St.Widget; +// dialogLayout: Dialog; - addButton(action: DialogButtonAction): void; +// addButton(action: DialogButtonAction): void; - close(timestamp: number): void; - open(timestamp: number, on_primary: boolean): void; +// close(timestamp: number): void; +// open(timestamp: number, on_primary: boolean): void; - setInitialKeyFocus(actor: Clutter.Actor): void; - } -} +// setInitialKeyFocus(actor: Clutter.Actor): void; +// } +// } diff --git a/src/types/ui.d.ts b/src/types/ui.d.ts index fd418ae0..b1f3c080 100644 --- a/src/types/ui.d.ts +++ b/src/types/ui.d.ts @@ -1,4 +1,28 @@ +import * as Clutter from 'clutter'; +import { Actor } from 'clutter'; import * as Gio from 'gio'; +import * as Meta from 'meta'; +import { + KeyBindingAction, + KeyBindingFlags, + KeyHandlerFunc, + ModalOptions, + Rectangle, + WindowType, + Workspace, +} from 'meta'; +import { ActionMode } from 'shell'; +import * as St from 'st'; +import { Widget } from 'st'; +import { GObject } from './mod'; + +declare module 'meta' { + // Expose some additional "private" fields of the Workspace class + interface Workspace { + _lastRemovedWindow: Meta.Window; + _keepAliveId: number | undefined; + } +} declare module 'ui' { export namespace messageTray { @@ -26,7 +50,464 @@ declare module 'ui' { getIcon(): Gio.Icon; showNotification(notification: Notification): void; } + + class MessageTray extends Widget { + add(source: any): void; + } } export namespace Overview {} + + export namespace layout { + const STARTUP_ANIMATION_TIME: number; + + export class Monitor { + readonly index: number; + readonly x: number; + readonly y: number; + readonly width: number; + readonly height: number; + readonly geometry_scale: any; + } + + class MonitorConstraint extends Clutter.Constraint { + constructor( + props: Partial<{ + primary: boolean; + workArea: boolean; + index: number; + }> + ); + get primary(): boolean; + set primary(v: boolean); + get workArea(): boolean; + set workArea(v: boolean); + get index(): number; + set index(v: number); + } + + export class UiActor extends St.Widget {} + + export class LayoutManager extends GObject.Object { + monitors: Monitor[]; + /// The primary monitor. Can be null if there are no monitors. + primaryMonitor: Monitor | null; + get currentMonitor(): Monitor; + get keyboardMonitor(): Monitor; + // Note: can be -1 + get focusIndex(): number; + get focusMonitor(): Monitor | null; + primaryIndex: number; + hotCorners: any[]; + _startingUp: boolean; + overviewGroup: St.Widget; + + uiGroup: UiActor; + + removeChrome(actor: Actor): void; + addChrome(actor: Actor): void; + _findActor(actor: Actor): number; + _trackActor( + actor: Actor, + params: { + trackFullscreen?: boolean; + affectsStruts?: boolean; + affectsInputRegion?: boolean; + } + ): void; + _untrackActor(actor: Actor): void; + getWorkAreaForMonitor(monitorIndex: number): Rectangle; + findMonitorForActor(actor: Actor): Monitor | null; + showOverview(): void; + } + } + + export const main: { + layoutManager: layout.LayoutManager; + wm: windowManager.WindowManager; + sessionMode: sessionMode.SessionMode; + overview: overview.Overview; + panel: panel.Panel; + messageTray: messageTray.MessageTray; + uiGroup: layout.UiActor; + extensionManager: extensionSystem.ExtensionManager; + pushModal( + actor: Actor, + options?: { + timestamp?: number; + options?: ModalOptions; + actionMode?: ActionMode; + } + ): void; + popModal(actor: Actor): void; + _findModal(grab: any): number; + loadTheme(): void; + reloadThemeResource(): void; + }; + + export namespace extensionSystem { + class ExtensionManager { + lookup( + uuid: string + ): { uuid: string; stateObj: extension.Extension } | undefined; + } + } + + export namespace extension { + class Extension { + enable(): void; + disable(): void; + } + } + + export namespace panel { + class Panel extends St.Widget { + _leftBox: St.BoxLayout; + _centerBox: St.BoxLayout; + _rightBox: St.BoxLayout; + menuManager: popupMenu.PopupMenuManager; + statusArea: { + // TODO: Make all optional? + activities: any; // ActivitiesButton, + aggregateMenu: any; // AggregateMenu, + appMenu: any; // AppMenuButton, + dateMenu: dateMenu.DateMenuButton; + a11y: any; // imports.ui.status.accessibility.ATIndicator, + keyboard: any; // imports.ui.status.keyboard.InputSourceIndicator, + dwellClick: any; // imports.ui.status.dwellClick.DwellClickIndicator, + screenRecording: any; // imports.ui.status.remoteAccess.ScreenRecordingIndicator, + }; + } + } + + export namespace dateMenu { + class DateMenuButton extends panelMenu.Button { + _clockDisplay: St.Label; + _indicator: MessagesIndicator; + } + + class MessagesIndicator extends St.Icon {} + } + + export namespace panelMenu { + class ButtonBox extends St.Widget {} + + class Button extends ButtonBox {} + } + + export namespace popupMenu { + class PopupMenuManager { + constructor(owner: any, params?: any); + _menus: PopupMenu[]; + addMenu(menu: PopupMenu, position?: number): void; + removeMenu(menu: PopupMenu): void; + } + + interface PopupBaseMenuItemParams { + reactive?: boolean; + activate?: boolean; + hover?: boolean; + style_class?: string | null; + can_focus?: boolean; + } + + class PopupBaseMenuItem extends St.BoxLayout { + _icon?: St.Icon; + _parent: PopupMenuBase | null; + toggle(): void; + activate(event: Clutter.Event): void; + } + + class PopupSeparatorMenuItem extends PopupBaseMenuItem { + constructor(text?: string); + } + + class PopupImageMenuItem extends PopupBaseMenuItem { + label: St.Label; + _icon: St.Icon; + constructor( + text: string, + icon: Gio.Icon | string, + params?: PopupBaseMenuItemParams + ); + } + + class PopupSubMenuMenuItem extends PopupBaseMenuItem { + constructor(text: string, wantIcon?: boolean); + menu: PopupSubMenu; + } + + class PopupSwitchMenuItem extends PopupBaseMenuItem { + _statusBin: St.Bin; + get state(): boolean; + constructor( + text: string, + active: boolean, + params?: PopupBaseMenuItemParams + ); + } + + class PopupMenuBase { + actor: St.Widget; + sourceActor: Clutter.Actor; + toggle(): void; + destroy(): void; + removeAll(): void; + addMenuItem( + menuItem: + | PopupMenuSection + | PopupSubMenuMenuItem + | PopupSeparatorMenuItem + | PopupBaseMenuItem, + position?: number + ): void; + addAction( + title: string, + callback: (event: any) => void, + icon?: Gio.IconPrototype + ): PopupBaseMenuItem; + _getMenuItems(): (PopupBaseMenuItem | PopupMenuSection)[]; + get numMenuItems(): number; + } + + class PopupMenuSection extends PopupMenuBase {} + + class PopupSubMenu extends PopupMenuBase {} + + class PopupMenu extends PopupMenuBase { + constructor( + sourceActor: Actor, + arrowAlignment: number, + arrowSide: St.Side + ); + _boxPointer: boxPointer.BoxPointer; + } + } + + export namespace boxPointer { + class BoxPointer extends St.Widget { + _calculateArrowSide(arrowSide: St.Side): St.Side; + _arrowSide: St.Side; + } + } + + export namespace appDisplay { + class BaseAppView extends St.Widget {} + class AppDisplay extends BaseAppView { + constructor(); + } + + interface SearchProvider { + isRemoteProvider: boolean; + id: string; + canLaunchSearch: boolean; + searchInProgress?: boolean; + display: search.SearchResult | null | undefined; + + getInitialResultSet( + terms: string[], + callback: (results: string[]) => void, + _cancellable: Gio.Cancellable + ): void; + getSubsearchResultSet( + previousResults: string[], + terms: string[], + callback: (results: string[]) => void, + _cancellable: Gio.Cancellable + ): void; + activateResult(id: string, terms: string[]): void; + getResultMetas( + identifiers: string[], + callback: ( + metas: { + id: string; + name: string; + createIcon: (size: number) => St.Icon; + }[] + ) => void + ): void; + } + + class AppIcon extends GObject.Object {} + + class AppSearchProvider implements SearchProvider { + isRemoteProvider: false; + id: string; + canLaunchSearch: boolean; + searchInProgress?: boolean; + display: search.SearchResult | null | undefined; + + getInitialResultSet( + terms: string[], + callback: (results: string[]) => void, + _cancellable: Gio.Cancellable + ): void; + getSubsearchResultSet( + previousResults: string[], + terms: string[], + callback: (results: string[]) => void, + _cancellable: Gio.Cancellable + ): void; + activateResult(id: string, terms: string[]): void; + getResultMetas( + identifiers: string[], + callback: ( + metas: { + id: string; + name: string; + createIcon: (size: number) => St.Icon; + }[] + ) => void + ): void; + } + } + + export namespace search { + class SearchResult extends St.Button {} + } + + export namespace remoteSearch { + class RemoteSearchProvider implements appDisplay.SearchProvider { + isRemoteProvider: true; + id: string; + canLaunchSearch: boolean; + searchInProgress?: boolean; + display: search.SearchResult | null | undefined; + + getInitialResultSet( + terms: string[], + callback: (results: string[]) => void, + _cancellable: Gio.Cancellable + ): void; + getSubsearchResultSet( + previousResults: string[], + terms: string[], + callback: (results: string[]) => void, + _cancellable: Gio.Cancellable + ): void; + activateResult(id: string, terms: string[]): void; + getResultMetas( + identifiers: string[], + callback: ( + metas: { + id: string; + name: string; + description: string; + createIcon: (size: number) => St.Icon; + }[] + ) => void, + cancellable?: Gio.Cancellable + ): void; + + appInfo: Gio.DesktopAppInfo; + } + + function loadRemoteSearchProviders( + searchSettings: Gio.Settings, + callback: (providers: remoteSearch.RemoteSearchProvider[]) => void + ): void; + } + + export namespace sessionMode { + class SessionMode { + pushMode(mode: string): void; + popMode(mode: string): void; + switchMode(mode: string): void; + get currentMode(): string; + } + } + + export namespace overview { + class OverviewActor extends St.BoxLayout { + _delegate: any; + } + + class ShellInfo { + constructor(); + } + + class Overview { + _initCalled: boolean; + _visible: boolean; + _shellInfo: ShellInfo; + _swipeTracker: swipeTracker.SwipeTracker; + isDummy: boolean; + _overview: OverviewActor; + init(): void; + toggle(): void; + _relayout(): void; + _gestureBegin(tracker: swipeTracker.SwipeTracker): void; + _gestureUpdate( + tracker: swipeTracker.SwipeTracker, + progress: number + ): void; + _gestureEnd( + tracker: swipeTracker.SwipeTracker, + duration: number, + endProgress: number + ): void; + get visible(): boolean; + } + } + + export namespace swipeTracker { + class SwipeTracker extends GObject.Object { + orientation: Clutter.Orientation; + constructor( + actor: Actor, + orientation: Clutter.Orientation, + allowedModes: ActionMode, + params: { allowDrag: boolean; allowScroll: boolean } + ); + } + } + + export namespace overviewControls { + export enum ControlsState { + HIDDEN = 0, + WINDOW_PICKER = 1, + APP_GRID = 2, + } + } + + export namespace windowManager { + export const SHELL_KEYBINDINGS_SCHEMA: string; + + export class WindowManager { + _workspaceTracker: WorkspaceTracker; + _shouldAnimate(actor: Actor, types: WindowType[]): void; + removeKeybinding(name: string): void; + addKeybinding( + name: string, + settings: Gio.Settings, + flags: KeyBindingFlags, + modes: ActionMode, + handler: KeyHandlerFunc + ): number | KeyBindingAction.NONE; + } + + export class WorkspaceTracker { + _workspaces: Workspace[]; + _checkWorkspacesId: number; + _queueCheckWorkspaces(): void; + _checkWorkspaces(): void; + } + } + + export namespace searchController { + class SearchController extends St.Widget { + constructor(searchEntry: St.Entry, showAppsButton: St.Button); + prepareToEnterOverview(): void; + get searchActive(): boolean; + visible: boolean; + } + } + + export namespace dash { + class Dash extends St.Widget { + constructor(); + + showAppsButton: St.Button; + } + } } diff --git a/src/utils/assert.ts b/src/utils/assert.ts index 94fe5708..2aaed8fb 100644 --- a/src/utils/assert.ts +++ b/src/utils/assert.ts @@ -1,5 +1,14 @@ import * as GLib from 'glib'; +export function assertNotNull( + value: T | null | undefined, +): T { + if (value === null || value === undefined) { + throw Error(`Expected value, but found ${value}`); + } + return value; +} + export function assert( shouldBeTrue: boolean, message: string diff --git a/src/utils/async.ts b/src/utils/async.ts index 81b766ba..503fbccc 100644 --- a/src/utils/async.ts +++ b/src/utils/async.ts @@ -4,8 +4,7 @@ export class Async { static timeoutIdList = [] as number[]; static addTimeout(priority: number, interval: number, func: () => void) { - let timeoutId; - timeoutId = GLib.timeout_add(priority, interval, () => { + const timeoutId = GLib.timeout_add(priority, interval, () => { func(); this.clearTimeoutId(timeoutId); return GLib.SOURCE_REMOVE; diff --git a/src/utils/debug.ts b/src/utils/debug.ts index d7936160..75a83d25 100644 --- a/src/utils/debug.ts +++ b/src/utils/debug.ts @@ -9,7 +9,7 @@ const FOCUS_ONLY = false; let indent = 0; export function initDebug() { // TODO: Essentially dead code - const AddLogToFunctions = function (prototype) { + const AddLogToFunctions = function (prototype: any) { if (!DEBUG) return; for (const key of Object.getOwnPropertyNames(prototype)) { if (key === 'constructor') continue; @@ -17,7 +17,7 @@ export function initDebug() { if (descriptor) { const value = descriptor.value; if (typeof value === 'function') { - prototype[key] = function (...args) { + prototype[key] = function (...args: any[]) { // Before Me.log( `${prototype.constructor.name}.${key} (${Array.from( @@ -44,6 +44,10 @@ export function initDebug() { } }; + Me.logWithStackTrace = function (...args: any[]) { + Me.log(...args, new Error().stack); + } + Me.log = function (...args: any[]) { if (!DEBUG || FOCUS_ONLY) return; const fields = { MESSAGE: `${' '.repeat(indent)}${args.join(', ')}` }; diff --git a/src/utils/index.ts b/src/utils/index.ts index 23302bea..6fa41c3d 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -2,7 +2,8 @@ import * as Clutter from 'clutter'; import * as GLib from 'glib'; import { Async } from './async'; -const Main = imports.ui.main; +import { main as Main } from 'ui'; +import { assert } from './assert'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); @@ -44,13 +45,14 @@ interface TrottleParams { // as much as it can, without ever going more than once per `wait` duration; // but if you'd like to disable the execution on the leading edge, pass // `{leading: false}`. To disable execution on the trailing edge, ditto. -export function throttle( +export function throttle( + this: C, func: (...args: T) => R, wait: number, options?: Partial ): (...args: T) => R { - let context: any; - let args, result: R; + let call: { context: C, args: T } | null; + let result: R; let timeout: number | null = null; let previous = 0; const definedOptions: TrottleParams = Object.assign( @@ -64,23 +66,24 @@ export function throttle( const later = function () { previous = definedOptions.leading === false ? 0 : Date.now(); timeout = null; - result = func.apply(context, args); - if (!timeout) context = args = null; + assert(call !== null, "unreachable"); + result = func.apply(call.context, call.args); + if (!timeout) call = null; return false; }; - return function (...args) { + return function (this: C, ...params: T) { const now = Date.now(); if (!previous && definedOptions.leading === false) previous = now; const remaining = wait - (now - previous); - context = this; + call = { context: this, args: params }; if (remaining <= 0 || remaining > wait) { if (timeout !== null) { Async.clearTimeoutId(timeout); timeout = null; } previous = now; - result = func.apply(context, args); - if (!timeout) context = args = null; + result = func.apply(call.context, call.args); + if (!timeout) call = null; } else if (!timeout && definedOptions.trailing !== false) { timeout = Async.addTimeout(GLib.PRIORITY_DEFAULT, remaining, later); } diff --git a/src/utils/shellVersionMatch.ts b/src/utils/shellVersionMatch.ts index 139d24a7..33836938 100644 --- a/src/utils/shellVersionMatch.ts +++ b/src/utils/shellVersionMatch.ts @@ -1,6 +1,6 @@ const { PACKAGE_VERSION } = imports.misc.config; /* exported ShellVersionMatch*/ -export function ShellVersionMatch(version) { +export function ShellVersionMatch(version: string) { return PACKAGE_VERSION.match(new RegExp(`^${version}`)) !== null; } diff --git a/src/utils/windows.ts b/src/utils/windows.ts index 8b41d1fa..2787b37f 100644 --- a/src/utils/windows.ts +++ b/src/utils/windows.ts @@ -10,7 +10,7 @@ export const updateTitleBarVisibility = function ( metaWindow: MetaWindowWithMsProperties ) { const msWorkspaceIsInFloatLayout = - metaWindow.msWindow.msWorkspace.layout.state.key === 'float'; + metaWindow.msWindow?.msWorkspace.layout.state.key === 'float' ?? false; const shouldTitleBarBeVisible = msWorkspaceIsInFloatLayout; if ( !metaWindow.titleBarVisible || @@ -46,9 +46,9 @@ export const setTitleBarVisibility = function ( metaWindow.titleBarVisible = visible; }; -export const getWindowXID = function (win: Meta.Window) { +export const getWindowXID = function (win: Meta.Window): string | null { const desc = win.get_description() || ''; - const match = desc.match(/0x[0-9a-f]+/) || [null]; + const match = desc.match(/0x[0-9a-f]+/); - return match[0]; + return match !== null ? match[0] : null; }; diff --git a/src/widget/appPlaceholder.ts b/src/widget/appPlaceholder.ts index 3efa4ac5..c162b2a3 100644 --- a/src/widget/appPlaceholder.ts +++ b/src/widget/appPlaceholder.ts @@ -2,6 +2,7 @@ import * as Clutter from 'clutter'; import * as GLib from 'glib'; import * as GObject from 'gobject'; +import { App } from 'shell'; import { registerGObjectClass } from 'src/utils/gjs'; import { ShellVersionMatch } from 'src/utils/shellVersionMatch'; import { RippleBackground } from 'src/widget/material/rippleBackground'; @@ -22,10 +23,10 @@ export class AppPlaceholder extends St.Widget { }, }, }; - app: any; + app: App; icon: any; pressed = false; - waitForReset: boolean; + waitForReset: boolean = false; clickableContainer: RippleBackground; box: any; identityContainer: any; @@ -35,7 +36,7 @@ export class AppPlaceholder extends St.Widget { vertical = true; private _spinner: any; - constructor(app) { + constructor(app: App) { super({ x_align: Clutter.ActorAlign.CENTER, y_align: Clutter.ActorAlign.CENTER, @@ -112,7 +113,7 @@ export class AppPlaceholder extends St.Widget { }); } - setOrientation(width, height) { + setOrientation(width: number, height: number) { const vertical = width < height; if (vertical === this.vertical) return; this.vertical = vertical; @@ -150,7 +151,7 @@ export class AppPlaceholder extends St.Widget { super.vfunc_allocate(...args); } - activate(button) { + activate(button: number) { if (this.waitForReset) return; this.waitForReset = true; this.clickableContainer.reactive = false; diff --git a/src/widget/material/divider.ts b/src/widget/material/divider.ts index 956b713d..5a65f346 100644 --- a/src/widget/material/divider.ts +++ b/src/widget/material/divider.ts @@ -23,14 +23,16 @@ export class MatDivider extends St.Widget { this.vertical = vertical; } - vfunc_get_preferred_width(forHeight: number): [number, number] { + override vfunc_get_preferred_width(forHeight: number): [number, number] { return this.vertical ? [1, 1] - : super.vfunc_get_preferred_width(forHeight); + // Note: clutter typing is incorrect here + : super.vfunc_get_preferred_width(forHeight) as [number, number]; } - vfunc_get_preferred_height(forWidth: number): [number, number] { + override vfunc_get_preferred_height(forWidth: number): [number, number] { return !this.vertical ? [1, 1] - : super.vfunc_get_preferred_height(forWidth); + // Note: clutter typing is incorrect here + : super.vfunc_get_preferred_height(forWidth) as [number, number]; } } diff --git a/src/widget/material/numberPicker.ts b/src/widget/material/numberPicker.ts index 57bc20e2..d575423f 100644 --- a/src/widget/material/numberPicker.ts +++ b/src/widget/material/numberPicker.ts @@ -6,10 +6,14 @@ import * as Gio from 'gio'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); -import { SetAllocation, Allocate } from 'src/utils/compatibility'; -import { RippleBackground } from 'src/widget/material/rippleBackground'; import { registerGObjectClass } from 'src/utils/gjs'; +export interface NumberPickerParams { + step: number; + min: number; + max: number; +} + @registerGObjectClass export class MatNumberPicker extends St.BoxLayout { static metaInfo: GObject.MetaInfo = { @@ -22,14 +26,14 @@ export class MatNumberPicker extends St.BoxLayout { }; value: number; - params: any; + params: NumberPickerParams; minIcon: St.Icon; minButton: St.Button; plusIcon: St.Icon; plusButton: St.Button; valueLabel: St.Label; - constructor(value: number, params) { + constructor(value: number, params: Partial) { super({ y_align: Clutter.ActorAlign.CENTER, }); diff --git a/src/widget/material/rippleBackground.ts b/src/widget/material/rippleBackground.ts index a11ddd75..c545ff93 100644 --- a/src/widget/material/rippleBackground.ts +++ b/src/widget/material/rippleBackground.ts @@ -1,9 +1,6 @@ -const Me = imports.misc.extensionUtils.getCurrentExtension(); - /** Gnome libs imports */ import * as St from 'st'; import * as Clutter from 'clutter'; -import * as GObject from 'gobject'; import * as GLib from 'glib'; import { registerGObjectClass } from 'src/utils/gjs'; diff --git a/src/widget/msApplicationLauncher.ts b/src/widget/msApplicationLauncher.ts index 2d5733ab..8cc1d424 100644 --- a/src/widget/msApplicationLauncher.ts +++ b/src/widget/msApplicationLauncher.ts @@ -12,7 +12,7 @@ import { ShellVersionMatch } from 'src/utils/shellVersionMatch'; import { SignalHandle } from 'src/utils/signal'; import { MatButton } from 'src/widget/material/button'; import * as St from 'st'; -const Main = imports.ui.main; +import { main as Main } from 'ui'; /** Extension imports */ const Me = imports.misc.extensionUtils.getCurrentExtension(); @@ -111,8 +111,10 @@ export class MsApplicationLauncher extends St.Widget { insert: false, } ); - Me.msWindowManager.openAppForMsWindow(msWindow); - this.appListContainer.reset(); + if (msWindow) { + Me.msWindowManager.openAppForMsWindow(msWindow); + this.appListContainer.reset(); + } }); this.appListContainer.addAppButton(button); }); @@ -171,7 +173,7 @@ export class MsApplicationButtonContainer extends St.Widget { inputLayout: St.BoxLayout; searchIcon: St.Icon; inputContainer: St.Entry; - private _text: any; + private _text: Clutter.Text; filteredAppButtonListBuffer: MsApplicationButton[]; container: St.Widget; msWorkspace: MsWorkspace; @@ -715,7 +717,7 @@ export class MsApplicationButtonContainer extends St.Widget { } hideButton( - button, + button: MsApplicationButton, contentBox: Clutter.ActorBox, flags?: Clutter.AllocationFlags ) { @@ -735,12 +737,12 @@ export class MsApplicationButton extends MatButton { GTypeName: 'MsApplicationButton', }; - app: any; + app: Shell.App; buttonSize: number; layout: St.BoxLayout; icon: any; title: St.Label | undefined; - constructor({ app, buttonSize }: { app: any; buttonSize: number }) { + constructor({ app, buttonSize }: { app: Shell.App; buttonSize: number }) { super({}); this.app = app; this.buttonSize = buttonSize; diff --git a/src/widget/reorderableList.ts b/src/widget/reorderableList.ts index 5079c582..53970c99 100644 --- a/src/widget/reorderableList.ts +++ b/src/widget/reorderableList.ts @@ -232,18 +232,20 @@ export class DropPlaceholder extends St.Widget { 'drag-over': {}, }, }; - private _delegate: this; + _delegate: this; constructor() { super({ style_class: 'drop-placeholder' }); this._delegate = this; } - handleDragOver(source) { + /// Called by gnome's drag-drop system via the _delegate field + handleDragOver(source: Clutter.Actor) { return DND.DragMotionResult.MOVE_DROP; } - acceptDrop(source) { + /// Called by gnome's drag-drop system via the _delegate field + acceptDrop(source: Clutter.Actor) { this.emit('drag-dropped', source); return true; } diff --git a/tsconfig.json b/tsconfig.json index e5cb7b59..f83c2765 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,10 +13,12 @@ "declaration": false, "removeComments": true, "incremental": true, - "noImplicitAny": false, + "noImplicitAny": true, "noUnusedLocals": false, "noUnusedParameters": false, + "strictNullChecks": true, "allowJs": true, + "strict": true, "moduleResolution": "node", "importHelpers": true, "baseUrl": ".",