web: bump the sentry group in /web with 2 updates (#8445)

* web: bump the sentry group in /web with 2 updates

Bumps the sentry group in /web with 2 updates: [@sentry/browser](https://github.com/getsentry/sentry-javascript) and @spotlightjs/spotlight.

Updates `@sentry/browser` from 7.99.0 to 7.100.1
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/7.100.1/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/7.99.0...7.100.1)

Updates `@spotlightjs/spotlight` from 1.2.11 to 1.2.12

---
updated-dependencies:
- dependency-name: "@sentry/browser"
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: sentry
- dependency-name: "@spotlightjs/spotlight"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: sentry
...

Signed-off-by: dependabot[bot] <support@github.com>

* have eslint check for deprecated function usage

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* code cleanup

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* fix eslint server error

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* Revert "have eslint check for deprecated function usage"

This reverts commit 6d5e42e31214ffc44a8ab0720c36030ada424d4e.

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

# Conflicts:
#	web/.eslintrc.json

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jens Langhammer <jens@goauthentik.io>
This commit is contained in:
dependabot[bot]
2024-02-12 13:09:26 +01:00
committed by GitHub
parent 844b4e96cd
commit e4f4482d2a
8 changed files with 82 additions and 86 deletions

View File

@ -13,7 +13,8 @@
"parser": "@typescript-eslint/parser", "parser": "@typescript-eslint/parser",
"parserOptions": { "parserOptions": {
"ecmaVersion": 12, "ecmaVersion": 12,
"sourceType": "module" "sourceType": "module",
"project": true
}, },
"plugins": ["@typescript-eslint", "lit", "custom-elements"], "plugins": ["@typescript-eslint", "lit", "custom-elements"],
"ignorePatterns": ["authentik-live-tests/**"], "ignorePatterns": ["authentik-live-tests/**"],

122
web/package-lock.json generated
View File

@ -24,7 +24,7 @@
"@open-wc/lit-helpers": "^0.6.0", "@open-wc/lit-helpers": "^0.6.0",
"@patternfly/elements": "^2.4.0", "@patternfly/elements": "^2.4.0",
"@patternfly/patternfly": "^4.224.2", "@patternfly/patternfly": "^4.224.2",
"@sentry/browser": "^7.99.0", "@sentry/browser": "^7.100.1",
"@webcomponents/webcomponentsjs": "^2.8.0", "@webcomponents/webcomponentsjs": "^2.8.0",
"base64-js": "^1.5.1", "base64-js": "^1.5.1",
"chart.js": "^4.4.1", "chart.js": "^4.4.1",
@ -61,7 +61,7 @@
"@rollup/plugin-replace": "^5.0.5", "@rollup/plugin-replace": "^5.0.5",
"@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-terser": "^0.4.4",
"@rollup/plugin-typescript": "^11.1.6", "@rollup/plugin-typescript": "^11.1.6",
"@spotlightjs/spotlight": "^1.2.11", "@spotlightjs/spotlight": "^1.2.12",
"@storybook/addon-essentials": "^7.6.14", "@storybook/addon-essentials": "^7.6.14",
"@storybook/addon-links": "^7.6.14", "@storybook/addon-links": "^7.6.14",
"@storybook/api": "^7.6.14", "@storybook/api": "^7.6.14",
@ -4740,102 +4740,102 @@
] ]
}, },
"node_modules/@sentry-internal/feedback": { "node_modules/@sentry-internal/feedback": {
"version": "7.99.0", "version": "7.100.1",
"resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.99.0.tgz", "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.100.1.tgz",
"integrity": "sha512-exIO1o+bE0MW4z30FxC0cYzJ4ZHSMlDPMHCBDPzU+MWGQc/fb8s58QUrx5Dnm6HTh9G3H+YlroCxIo9u0GSwGQ==", "integrity": "sha512-yqcRVnjf+qS+tC4NxOKLJOaSJ+csHmh/dHUzvCTkf5rLsplwXYRnny2r0tqGTQ4tuXMxwgSMKPYwicg81P+xuw==",
"dependencies": { "dependencies": {
"@sentry/core": "7.99.0", "@sentry/core": "7.100.1",
"@sentry/types": "7.99.0", "@sentry/types": "7.100.1",
"@sentry/utils": "7.99.0" "@sentry/utils": "7.100.1"
}, },
"engines": { "engines": {
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/@sentry-internal/replay-canvas": { "node_modules/@sentry-internal/replay-canvas": {
"version": "7.99.0", "version": "7.100.1",
"resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.99.0.tgz", "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-7.100.1.tgz",
"integrity": "sha512-PoIkfusToDq0snfl2M6HJx/1KJYtXxYhQplrn11kYadO04SdG0XGXf4h7wBTMEQ7LDEAtQyvsOu4nEQtTO3YjQ==", "integrity": "sha512-TnqxqJGhbFhhYRhTG2WLFer+lVieV7mNGeIxFBiw1L4kuj8KGl+C0sknssKyZSRVJFSahhHIosHJGRMkkD//7g==",
"dependencies": { "dependencies": {
"@sentry/core": "7.99.0", "@sentry/core": "7.100.1",
"@sentry/replay": "7.99.0", "@sentry/replay": "7.100.1",
"@sentry/types": "7.99.0", "@sentry/types": "7.100.1",
"@sentry/utils": "7.99.0" "@sentry/utils": "7.100.1"
}, },
"engines": { "engines": {
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/@sentry-internal/tracing": { "node_modules/@sentry-internal/tracing": {
"version": "7.99.0", "version": "7.100.1",
"resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.99.0.tgz", "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.100.1.tgz",
"integrity": "sha512-z3JQhHjoM1KdM20qrHwRClKJrNLr2CcKtCluq7xevLtXHJWNAQQbafnWD+Aoj85EWXBzKt9yJMv2ltcXJ+at+w==", "integrity": "sha512-+u9RRf5eL3StiyiRyAHZmdkAR7GTSGx4Mt4Lmi5NEtCcWlTGZ1QgW2r8ZbhouVmTiJkjhQgYCyej3cojtazeJg==",
"dependencies": { "dependencies": {
"@sentry/core": "7.99.0", "@sentry/core": "7.100.1",
"@sentry/types": "7.99.0", "@sentry/types": "7.100.1",
"@sentry/utils": "7.99.0" "@sentry/utils": "7.100.1"
}, },
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/@sentry/browser": { "node_modules/@sentry/browser": {
"version": "7.99.0", "version": "7.100.1",
"resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.99.0.tgz", "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.100.1.tgz",
"integrity": "sha512-bgfoUv3wkwwLgN5YUOe0ibB3y268ZCnamZh6nLFqnY/UBKC1+FXWFdvzVON/XKUm62LF8wlpCybOf08ebNj2yg==", "integrity": "sha512-IxHQ08ixf0bmaWpe4yt1J4UUsOpg02fxax9z3tOQYXw5MSzz5pDXn8M8DFUVJB3wWuyXhHXTub9yD3VIP9fnoA==",
"dependencies": { "dependencies": {
"@sentry-internal/feedback": "7.99.0", "@sentry-internal/feedback": "7.100.1",
"@sentry-internal/replay-canvas": "7.99.0", "@sentry-internal/replay-canvas": "7.100.1",
"@sentry-internal/tracing": "7.99.0", "@sentry-internal/tracing": "7.100.1",
"@sentry/core": "7.99.0", "@sentry/core": "7.100.1",
"@sentry/replay": "7.99.0", "@sentry/replay": "7.100.1",
"@sentry/types": "7.99.0", "@sentry/types": "7.100.1",
"@sentry/utils": "7.99.0" "@sentry/utils": "7.100.1"
}, },
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/@sentry/core": { "node_modules/@sentry/core": {
"version": "7.99.0", "version": "7.100.1",
"resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.99.0.tgz", "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.100.1.tgz",
"integrity": "sha512-vOAtzcAXEUtS/oW7wi3wMkZ3hsb5Ch96gKyrrj/mXdOp2zrcwdNV6N9/pawq2E9P/7Pw8AXw4CeDZztZrjQLuA==", "integrity": "sha512-f+ItUge/o9AjlveQq0ZUbQauKlPH1FIJbC1TRaYLJ4KNfOdrsh8yZ29RmWv0cFJ/e+FGTr603gWpRPObF5rM8Q==",
"dependencies": { "dependencies": {
"@sentry/types": "7.99.0", "@sentry/types": "7.100.1",
"@sentry/utils": "7.99.0" "@sentry/utils": "7.100.1"
}, },
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/@sentry/replay": { "node_modules/@sentry/replay": {
"version": "7.99.0", "version": "7.100.1",
"resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.99.0.tgz", "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.100.1.tgz",
"integrity": "sha512-gyN/I2WpQrLAZDT+rScB/0jnFL2knEVBo8U8/OVt8gNP20Pq8T/rDZKO/TG0cBfvULDUbJj2P4CJryn2p/O2rA==", "integrity": "sha512-B1NFjzGEFaqejxBRdUyEzH8ChXc2kfiqlA/W/Lg0aoWIl2/7nuMk+l4ld9gW5F5bIAXDTVd5vYltb1lWEbpr7w==",
"dependencies": { "dependencies": {
"@sentry-internal/tracing": "7.99.0", "@sentry-internal/tracing": "7.100.1",
"@sentry/core": "7.99.0", "@sentry/core": "7.100.1",
"@sentry/types": "7.99.0", "@sentry/types": "7.100.1",
"@sentry/utils": "7.99.0" "@sentry/utils": "7.100.1"
}, },
"engines": { "engines": {
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/@sentry/types": { "node_modules/@sentry/types": {
"version": "7.99.0", "version": "7.100.1",
"resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.99.0.tgz", "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.100.1.tgz",
"integrity": "sha512-94qwOw4w40sAs5mCmzcGyj8ZUu/KhnWnuMZARRq96k+SjRW/tHFAOlIdnFSrt3BLPvSOK7R3bVAskZQ0N4FTmA==", "integrity": "sha512-fLM+LedHuKzOd8IhXBqaQuym+AA519MGjeczBa5kGakes/BbAsUMwsNfjsKQedp7Kh44RgYF99jwoRPK2oDrXw==",
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/@sentry/utils": { "node_modules/@sentry/utils": {
"version": "7.99.0", "version": "7.100.1",
"resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.99.0.tgz", "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.100.1.tgz",
"integrity": "sha512-cYZy5WNTkWs5GgggGnjfGqC44CWir0pAv4GVVSx0fsup4D4pMKBJPrtub15f9uC+QkUf3vVkqwpBqeFxtmJQTQ==", "integrity": "sha512-Ve6dXr1o6xiBe3VCoJgiutmBKrugryI65EZAbYto5XI+t+PjiLLf9wXtEMF24ZrwImo4Lv3E9Uqza+fWkEbw6A==",
"dependencies": { "dependencies": {
"@sentry/types": "7.99.0" "@sentry/types": "7.100.1"
}, },
"engines": { "engines": {
"node": ">=8" "node": ">=8"
@ -4848,28 +4848,28 @@
"dev": true "dev": true
}, },
"node_modules/@spotlightjs/overlay": { "node_modules/@spotlightjs/overlay": {
"version": "1.5.0", "version": "1.6.0",
"resolved": "https://registry.npmjs.org/@spotlightjs/overlay/-/overlay-1.5.0.tgz", "resolved": "https://registry.npmjs.org/@spotlightjs/overlay/-/overlay-1.6.0.tgz",
"integrity": "sha512-HMzxwHxD4VLZLHL+Ec7akR3NzUxfsGrWJSdFTAjQGeH/bBtZ3wHYIiD1nrpt0ONHYHW2K+bFFX6Razi+OKdlLA==", "integrity": "sha512-8QfE8LnpWtsQHGXutuJev8kpfw7tovtkEiLWurT9sMK6t78G00erAc+h3XfI9VIV1tMJxx+FaiG+n5jQs7wVHw==",
"dev": true "dev": true
}, },
"node_modules/@spotlightjs/sidecar": { "node_modules/@spotlightjs/sidecar": {
"version": "1.3.5", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/@spotlightjs/sidecar/-/sidecar-1.3.5.tgz", "resolved": "https://registry.npmjs.org/@spotlightjs/sidecar/-/sidecar-1.4.0.tgz",
"integrity": "sha512-mtpNWE07DnrUhkvZ1EN8rIH5xVgsfqrw+LSJZTb1FjJ8jODTafiXCJjf40f9tswtGQKhNvaJ+Z24N/o92CYyGw==", "integrity": "sha512-onj/phrNtDI8a79zc8jfxJ5BITQk5klO4xSoQXxiYeQWTZcegVeO8VftOVfWPBnMY/axnh+ltxJm/cHaV5SP6Q==",
"dev": true, "dev": true,
"bin": { "bin": {
"spotlight-sidecar": "server.js" "spotlight-sidecar": "server.js"
} }
}, },
"node_modules/@spotlightjs/spotlight": { "node_modules/@spotlightjs/spotlight": {
"version": "1.2.11", "version": "1.2.12",
"resolved": "https://registry.npmjs.org/@spotlightjs/spotlight/-/spotlight-1.2.11.tgz", "resolved": "https://registry.npmjs.org/@spotlightjs/spotlight/-/spotlight-1.2.12.tgz",
"integrity": "sha512-UE2AQLpGO6bPd7JzEEGfdEzYm1VwpbRMn1BJltpP5j99pKF7DKLWovfaqD7JDCwVQPfDqWzBhb26JTHZJFK+0w==", "integrity": "sha512-FHXsKLOatoyG7fKwsxMYPspkS9h/wEIli02GiA98Hg0UqHWZ5UV7xFzlUqaBmr6hbPLnQoc7fcFIN0ATgVJ9ng==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@spotlightjs/overlay": "1.5.0", "@spotlightjs/overlay": "1.6.0",
"@spotlightjs/sidecar": "1.3.5" "@spotlightjs/sidecar": "1.4.0"
}, },
"bin": { "bin": {
"spotlight-sidecar": "bin/run.js" "spotlight-sidecar": "bin/run.js"

View File

@ -49,7 +49,7 @@
"@open-wc/lit-helpers": "^0.6.0", "@open-wc/lit-helpers": "^0.6.0",
"@patternfly/elements": "^2.4.0", "@patternfly/elements": "^2.4.0",
"@patternfly/patternfly": "^4.224.2", "@patternfly/patternfly": "^4.224.2",
"@sentry/browser": "^7.99.0", "@sentry/browser": "^7.100.1",
"@webcomponents/webcomponentsjs": "^2.8.0", "@webcomponents/webcomponentsjs": "^2.8.0",
"base64-js": "^1.5.1", "base64-js": "^1.5.1",
"chart.js": "^4.4.1", "chart.js": "^4.4.1",
@ -86,7 +86,7 @@
"@rollup/plugin-replace": "^5.0.5", "@rollup/plugin-replace": "^5.0.5",
"@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-terser": "^0.4.4",
"@rollup/plugin-typescript": "^11.1.6", "@rollup/plugin-typescript": "^11.1.6",
"@spotlightjs/spotlight": "^1.2.11", "@spotlightjs/spotlight": "^1.2.12",
"@storybook/addon-essentials": "^7.6.14", "@storybook/addon-essentials": "^7.6.14",
"@storybook/addon-links": "^7.6.14", "@storybook/addon-links": "^7.6.14",
"@storybook/api": "^7.6.14", "@storybook/api": "^7.6.14",

View File

@ -61,7 +61,7 @@ export class AkBackchannelProvidersInput extends AKElement {
>`; >`;
return html` return html`
<ak-form-element-horizontal label=${this.label} name=${name}> <ak-form-element-horizontal label=${this.label} name=${this.name}>
<div class="pf-c-input-group"> <div class="pf-c-input-group">
<ak-provider-select-table ?backchannelOnly=${true} .confirm=${this.confirm}> <ak-provider-select-table ?backchannelOnly=${true} .confirm=${this.confirm}>
<button slot="trigger" class="pf-c-button pf-m-control" type="button"> <button slot="trigger" class="pf-c-button pf-m-control" type="button">

View File

@ -3,7 +3,6 @@ import "@goauthentik/admin/providers/oauth2/OAuth2ProviderForm";
import renderDescriptionList from "@goauthentik/app/components/DescriptionList"; import renderDescriptionList from "@goauthentik/app/components/DescriptionList";
import { DEFAULT_CONFIG } from "@goauthentik/common/api/config"; import { DEFAULT_CONFIG } from "@goauthentik/common/api/config";
import { EVENT_REFRESH } from "@goauthentik/common/constants"; import { EVENT_REFRESH } from "@goauthentik/common/constants";
import { convertToTitle } from "@goauthentik/common/utils";
import "@goauthentik/components/events/ObjectChangelog"; import "@goauthentik/components/events/ObjectChangelog";
import MDProviderOAuth2 from "@goauthentik/docs/providers/oauth2/index.md"; import MDProviderOAuth2 from "@goauthentik/docs/providers/oauth2/index.md";
import { AKElement } from "@goauthentik/elements/Base"; import { AKElement } from "@goauthentik/elements/Base";
@ -31,6 +30,7 @@ import PFGrid from "@patternfly/patternfly/layouts/Grid/grid.css";
import PFBase from "@patternfly/patternfly/patternfly-base.css"; import PFBase from "@patternfly/patternfly/patternfly-base.css";
import { import {
ClientTypeEnum,
CoreApi, CoreApi,
CoreUsersListRequest, CoreUsersListRequest,
OAuth2Provider, OAuth2Provider,
@ -41,6 +41,18 @@ import {
User, User,
} from "@goauthentik/api"; } from "@goauthentik/api";
export function TypeToLabel(type?: ClientTypeEnum): string {
if (!type) return "";
switch (type) {
case ClientTypeEnum.Confidential:
return msg("Confidential");
case ClientTypeEnum.Public:
return msg("Public");
case ClientTypeEnum.UnknownDefaultOpenApi:
return msg("Unknown type");
}
}
@customElement("ak-provider-oauth2-view") @customElement("ak-provider-oauth2-view")
export class OAuth2ProviderViewPage extends AKElement { export class OAuth2ProviderViewPage extends AKElement {
@property({ type: Number }) @property({ type: Number })
@ -198,7 +210,7 @@ export class OAuth2ProviderViewPage extends AKElement {
</dt> </dt>
<dd class="pf-c-description-list__description"> <dd class="pf-c-description-list__description">
<div class="pf-c-description-list__text"> <div class="pf-c-description-list__text">
${convertToTitle(this.provider.clientType || "")} ${TypeToLabel(this.provider.clientType)}
</div> </div>
</dd> </dd>
</div> </div>

View File

@ -38,7 +38,7 @@ export function transformCredentialCreateOptions(
// Because json can't contain raw bytes, the server base64-encodes the User ID // Because json can't contain raw bytes, the server base64-encodes the User ID
// So to get the base64 encoded byte array, we first need to convert it to a regular // So to get the base64 encoded byte array, we first need to convert it to a regular
// string, then a byte array, re-encode it and wrap that in an array. // string, then a byte array, re-encode it and wrap that in an array.
const stringId = decodeURIComponent(escape(window.atob(userId))); const stringId = decodeURIComponent(window.atob(userId));
user.id = u8arr(b64enc(u8arr(stringId))); user.id = u8arr(b64enc(u8arr(stringId)));
const challenge = u8arr(credentialCreateOptions.challenge.toString()); const challenge = u8arr(credentialCreateOptions.challenge.toString());

View File

@ -27,7 +27,7 @@ export async function configureSentry(canDoPpi = false): Promise<Config> {
], ],
release: `authentik@${VERSION}`, release: `authentik@${VERSION}`,
integrations: [ integrations: [
new Sentry.BrowserTracing({ Sentry.browserTracingIntegration({
shouldCreateSpanForRequest: (url: string) => { shouldCreateSpanForRequest: (url: string) => {
return url.startsWith(window.location.host); return url.startsWith(window.location.host);
}, },
@ -57,9 +57,6 @@ export async function configureSentry(canDoPpi = false): Promise<Config> {
Sentry.setTag(TAG_SENTRY_CAPABILITIES, cfg.capabilities.join(",")); Sentry.setTag(TAG_SENTRY_CAPABILITIES, cfg.capabilities.join(","));
if (window.location.pathname.includes("if/")) { if (window.location.pathname.includes("if/")) {
Sentry.setTag(TAG_SENTRY_COMPONENT, `web/${currentInterface()}`); Sentry.setTag(TAG_SENTRY_COMPONENT, `web/${currentInterface()}`);
Sentry.configureScope((scope) =>
scope.setTransactionName(`authentik.web.if.${currentInterface()}`),
);
} }
if (cfg.capabilities.includes(CapabilitiesEnum.CanDebug)) { if (cfg.capabilities.includes(CapabilitiesEnum.CanDebug)) {
const Spotlight = await import("@spotlightjs/spotlight"); const Spotlight = await import("@spotlightjs/spotlight");

View File

@ -25,12 +25,6 @@ export function convertToSlug(text: string): string {
.replace(/[^\w-]+/g, ""); .replace(/[^\w-]+/g, "");
} }
export function convertToTitle(text: string): string {
return text.replace(/\w\S*/g, function (txt) {
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
});
}
/** /**
* Truncate a string based on maximum word count * Truncate a string based on maximum word count
*/ */
@ -84,14 +78,6 @@ export function first<T>(...args: Array<T | undefined | null>): T {
throw new SentryIgnoredError(`No compatible arg given: ${args}`); throw new SentryIgnoredError(`No compatible arg given: ${args}`);
} }
export function hexEncode(buf: Uint8Array): string {
return Array.from(buf)
.map(function (x) {
return ("0" + x.toString(16)).substr(-2);
})
.join("");
}
// Taken from python's string module // Taken from python's string module
export const ascii_lowercase = "abcdefghijklmnopqrstuvwxyz"; export const ascii_lowercase = "abcdefghijklmnopqrstuvwxyz";
export const ascii_uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; export const ascii_uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";