Fix: workflow failure with missing lint command and added lint for apps/examples (#866)

* Add turbo run lint

* Add lint to all apps and examples

* Update eslint with monorepo configuration

see: https://typescript-eslint.io/docs/linting/typed-linting/monorepos#one-tsconfigjson-per-package-and-an-optional-one-in-the-root

* Remove unused rules

* Exclude @tldraw/www from global eslint config

* Remove duplicated eslint

* Fix eslint prefer-const errors

* Fix eslint no-unused-vars warning

* Update package.json

* Fix eslint no-unused-vars warning

* bump eslint@^8.20.0

* Correct "Fix eslint no-unused-vars warning"

This reverts commit 0158a2585a.
pull/869/head
Gwenaël Gallon 2022-07-30 09:27:54 +02:00 zatwierdzone przez GitHub
rodzic 82f9278976
commit 3c2c26c11e
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
43 zmienionych plików z 116 dodań i 61 usunięć

Wyświetl plik

@ -1,6 +1,14 @@
{
"root": true,
"parser": "@typescript-eslint/parser",
"parserOptions": {
"tsconfigRootDir": "__dirname",
"project": [
"./apps/*/tsconfig.json",
"./apps/vscode/*/tsconfig.json",
"./packages/*/tsconfig.json"
]
},
"plugins": ["@typescript-eslint", "jest"],
"extends": [
"eslint:recommended",
@ -17,9 +25,6 @@
"files": ["*.ts", "*.tsx"],
"rules": {
"@typescript-eslint/explicit-module-boundary-types": [0],
"no-non-null-assertion": "off",
"no-fallthrough": "off",
"@typescript-eslint/no-fallthrough": "off",
"@typescript-eslint/no-non-null-assertion": "off",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/ban-ts-comment": "off",

Wyświetl plik

@ -15,7 +15,8 @@
"start:electron": "yarn dev",
"build:apps": "yarn build:electron",
"build:electron": "electron-esbuild build",
"package": "electron-builder"
"package": "electron-builder",
"lint": "eslint src/ --ext .ts,.tsx"
},
"devDependencies": {
"@tldraw/tldraw": "^1.16.0",

Wyświetl plik

@ -1,4 +1,4 @@
import { shell, app, Menu, MenuItemConstructorOptions } from 'electron'
import { shell, Menu, MenuItemConstructorOptions } from 'electron'
import type { Message } from 'src/types'
export async function createMenu(send: (message: Message) => Promise<void>) {

Wyświetl plik

@ -1,6 +1,4 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion */
import path from 'path'
import { format } from 'url'
import { BrowserWindow } from 'electron'
import { is } from 'electron-util'

Wyświetl plik

@ -1,4 +1,3 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion */
import { app, BrowserWindow } from 'electron'
import { is } from 'electron-util'
import type { Message } from 'src/types'

Wyświetl plik

@ -13,7 +13,8 @@
"dev:extension": "vite --host",
"build:extension": "yarn build",
"build": "tsc && vite build",
"preview": "vite preview"
"preview": "vite preview",
"lint": "eslint src/ --ext .ts,.tsx"
},
"dependencies": {
"@tldraw/tldraw": "*",

Wyświetl plik

@ -13,7 +13,8 @@
"scripts": {
"start:vscode": "node scripts/dev.mjs -w",
"build": "node scripts/build.mjs",
"build:apps": "yarn build"
"build:apps": "yarn build",
"lint": "eslint src/ --ext .ts,.tsx"
},
"devDependencies": {
"@tldraw/tldraw": "*",

Wyświetl plik

@ -118,13 +118,12 @@
"web": "vscode-test-web --browserType=chromium --extensionDevelopmentPath=.",
"package": "cd ../editor && yarn build && cd ../extension && node scripts/build && node scripts/package",
"publish": "yarn package && vsce publish",
"lint": "eslint src --ext ts"
"lint": "eslint src/ --ext ts"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.10.2",
"@typescript-eslint/parser": "^5.10.2",
"assert": "^2.0.0",
"eslint": "^8.8.0",
"mocha": "^9.1.1",
"process": "^0.11.10",
"ts-loader": "^9.2.5",

Wyświetl plik

@ -1,5 +1,4 @@
import * as vscode from 'vscode'
import * as path from 'path'
import { TldrawWebviewManager } from './TldrawWebviewManager'
/**

Wyświetl plik

@ -1,7 +1,6 @@
import * as vscode from 'vscode'
import { TDFile } from '@tldraw/tldraw'
import { MessageFromWebview, MessageFromExtension } from './types'
import * as path from 'path'
/**
* When a new editor is opened, an instance of this class will

Wyświetl plik

@ -1,4 +1,5 @@
{
"root": true,
"extends": "next/core-web-vitals",
"rules": {
"@typescript-eslint/no-explicit-any": "off"

Wyświetl plik

@ -12,7 +12,8 @@
"scripts": {
"build:core": "yarn build",
"start:core": "node scripts/dev.mjs -w",
"build": "node scripts/build.mjs"
"build": "node scripts/build.mjs",
"lint": "eslint src/ --ext .ts,.tsx"
},
"files": [],
"devDependencies": {

Wyświetl plik

@ -1,5 +1,4 @@
import * as React from 'react'
import { GitHub } from 'react-feather'
import styled from 'stitches.config'
export function TitleLinks() {

Wyświetl plik

@ -1,5 +1,5 @@
import * as React from 'react'
import { ArrowUpRight, Edit2, MousePointer, PenTool, Square, X } from 'react-feather'
import { ArrowUpRight, Edit2, MousePointer, Square, X } from 'react-feather'
import { machine } from 'state/machine'
import styled from 'stitches.config'

Wyświetl plik

@ -2,7 +2,7 @@ import type { Action } from 'state/constants'
export const deleteBindings: Action = (data, payload: { ids: string[] }) => {
try {
payload.ids.forEach((id, i) => {
payload.ids.forEach((id) => {
delete data.page.bindings[id]
})
} catch (e: any) {

Wyświetl plik

@ -6,7 +6,7 @@ export const updateBindings: Action = (
payload: { bindings: (Partial<TLBinding> & Pick<TLBinding, 'id'>)[] }
) => {
try {
payload.bindings.forEach((partial, i) => {
payload.bindings.forEach((partial) => {
Object.assign(data.page.bindings[partial.id], partial)
})
} catch (e: any) {

Wyświetl plik

@ -1,5 +1,4 @@
import { TLBinding, Utils } from '@tldraw/core'
import { intersectLineSegmentBounds } from '@tldraw/intersect'
import Vec from '@tldraw/vec'
import type { ArrowShape } from 'shapes/arrow'
import type { Action } from 'state/constants'

Wyświetl plik

@ -1,5 +1,4 @@
import type { Action } from 'state/constants'
import { Utils } from '@tldraw/core'
import Vec from '@tldraw/vec'
import { mutables } from 'state/mutables'

Wyświetl plik

@ -1,5 +1,4 @@
import type { Action } from 'state/constants'
import { Utils } from '@tldraw/core'
import Vec from '@tldraw/vec'
import { mutables } from 'state/mutables'

Wyświetl plik

@ -3,7 +3,6 @@ import { Utils } from '@tldraw/core'
import Vec from '@tldraw/vec'
import { mutables } from 'state/mutables'
import { getShapeUtils } from 'shapes'
import { getZoomFitCamera } from 'state/helpers'
export const zoomToFit: Action = (data) => {
const { camera } = data.pageState

Wyświetl plik

@ -2,7 +2,6 @@ import { Action, FIT_TO_SCREEN_PADDING } from 'state/constants'
import { Utils } from '@tldraw/core'
import { mutables } from 'state/mutables'
import { getShapeUtils } from 'shapes'
import { getZoomFitCamera } from 'state/helpers'
import Vec from '@tldraw/vec'
export const zoomToSelection: Action = (data) => {

Wyświetl plik

@ -1,6 +1,6 @@
import { current } from 'immer'
import { nanoid } from 'nanoid'
import type { Action, AppData, AppDocument } from 'state/constants'
import type { Action, AppData } from 'state/constants'
import { mutables } from 'state/mutables'
export const loadNewDocument: Action = (data) => {

Wyświetl plik

@ -1,6 +1,5 @@
import type { TLPointerInfo } from '@tldraw/core'
import type { Action } from 'state/constants'
import { getPagePoint } from 'state/helpers'
import { getShapeUtils } from 'shapes'
import { mutables } from 'state/mutables'

Wyświetl plik

@ -1,5 +1,4 @@
import type { Action, CustomBinding } from 'state/constants'
import { getPagePoint } from 'state/helpers'
import { getShapeUtils, Shape } from 'shapes'
import { mutables } from 'state/mutables'
import { nanoid } from 'nanoid'

Wyświetl plik

@ -1,4 +1,3 @@
import { TLPerformanceMode } from '@tldraw/core'
import type { Action } from 'state/constants'
export const setTransformPerformanceMode: Action = (data) => {

Wyświetl plik

@ -1,4 +1,3 @@
import { TLPerformanceMode } from '@tldraw/core'
import type { Action } from 'state/constants'
export const setTranslatePerformanceMode: Action = (data) => {

Wyświetl plik

@ -1,7 +1,6 @@
import type { Action } from 'state/constants'
import { TLPointerInfo, Utils } from '@tldraw/core'
import { mutables } from '../../mutables'
import { getPagePoint } from 'state/helpers'
import { getShapeUtils } from 'shapes'
export const updateBrush: Action = (data, payload: TLPointerInfo) => {

Wyświetl plik

@ -1,8 +1,7 @@
import { nanoid } from 'nanoid'
import Vec from '@tldraw/vec'
import { TLBinding, TLPointerInfo, Utils } from '@tldraw/core'
import { TLPointerInfo, Utils } from '@tldraw/core'
import { getShapeUtils, Shape, shapeUtils } from 'shapes'
import { getPagePoint } from 'state/helpers'
import { mutables } from 'state/mutables'
import type { Action, CustomBinding } from 'state/constants'

Wyświetl plik

@ -1,7 +1,6 @@
import { TLBoundsCorner, TLPointerInfo } from '@tldraw/core'
import { shapeUtils } from 'shapes'
import type { Action } from 'state/constants'
import { getPagePoint } from 'state/helpers'
import { mutables } from 'state/mutables'
export const createBoxShape: Action = (data, payload: TLPointerInfo) => {

Wyświetl plik

@ -1,7 +1,6 @@
import type { TLPointerInfo } from '@tldraw/core'
import type { Action } from 'state/constants'
import { shapeUtils } from 'shapes'
import { getPagePoint } from 'state/helpers'
import { mutables } from 'state/mutables'
export const createPencilShape: Action = (data, payload: TLPointerInfo) => {

Wyświetl plik

@ -1,5 +1,5 @@
import { nanoid } from 'nanoid'
import { getShapeUtils, Shape, shapeUtils } from 'shapes'
import { getShapeUtils, Shape } from 'shapes'
import type { Action } from 'state/constants'
export const createShapes: Action = (

Wyświetl plik

@ -1,8 +1,6 @@
import { TLBoundsCorner, TLPointerInfo, Utils } from '@tldraw/core'
import { TLPointerInfo, Utils } from '@tldraw/core'
import Vec from '@tldraw/vec'
import { shapeUtils } from 'shapes'
import type { Action } from 'state/constants'
import { getPagePoint } from 'state/helpers'
import { mutables } from 'state/mutables'
export const extendPencilShape: Action = (data, payload: TLPointerInfo) => {

Wyświetl plik

@ -6,7 +6,7 @@ export const updateShapes: Action = (
payload: { shapes: (Partial<Shape> & Pick<Shape, 'id'>)[] }
) => {
try {
payload.shapes.forEach((partial, i) => {
payload.shapes.forEach((partial) => {
Object.assign(data.page.shapes[partial.id], partial)
})
} catch (e: any) {

Wyświetl plik

@ -2,7 +2,6 @@ import { TLBoundsCorner, TLBoundsEdge, TLPointerInfo, Utils } from '@tldraw/core
import Vec from '@tldraw/vec'
import { getShapeUtils } from 'shapes'
import type { Action } from 'state/constants'
import { getPagePoint } from 'state/helpers'
import { mutables } from 'state/mutables'
export const resizeSelectedShapes: Action = (data, payload: TLPointerInfo) => {
@ -16,13 +15,13 @@ export const resizeSelectedShapes: Action = (data, payload: TLPointerInfo) => {
)
let rotation = 0
let delta = Vec.sub(mutables.currentPoint, initialPoint)
const delta = Vec.sub(mutables.currentPoint, initialPoint)
if (selectedIds.length === 1) {
rotation = snapshot.page.shapes[selectedIds[0]].rotation || 0
}
let nextCommonBounds = Utils.getTransformedBoundingBox(
const nextCommonBounds = Utils.getTransformedBoundingBox(
initialCommonBounds,
pointedBoundsHandleId as TLBoundsCorner | TLBoundsEdge,
delta,

Wyświetl plik

@ -3,7 +3,6 @@ import Vec from '@tldraw/vec'
import { getShapeUtils } from 'shapes'
import type { ArrowShape } from 'shapes/arrow'
import type { Action } from 'state/constants'
import { getPagePoint } from 'state/helpers'
import { mutables } from 'state/mutables'
export const rotateSelectedShapes: Action = (data, payload: TLPointerInfo) => {

Wyświetl plik

@ -11,7 +11,8 @@
"private": true,
"scripts": {
"start:core": "node scripts/dev.mjs -w",
"build": "node scripts/build.mjs"
"build": "node scripts/build.mjs",
"lint": "eslint src/ --ext .ts,.tsx"
},
"files": [],
"devDependencies": {

Wyświetl plik

@ -12,7 +12,8 @@
],
"scripts": {
"start": "node scripts/dev.mjs -w",
"build": "node scripts/build.mjs"
"build": "node scripts/build.mjs",
"lint": "eslint src/ --ext .ts,.tsx"
},
"devDependencies": {
"@liveblocks/client": "^0.17.0-beta2",

Wyświetl plik

@ -1,6 +1,6 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import * as React from 'react'
import { TDShapeType, Tldraw, TldrawApp, useFileSystem } from '@tldraw/tldraw'
import { Tldraw, TldrawApp, useFileSystem } from '@tldraw/tldraw'
declare const window: Window & { app: TldrawApp }
@ -21,14 +21,6 @@ export default function Develop() {
// })
}, [])
const handleSignOut = React.useCallback(() => {
// noop
}, [])
const handleSignIn = React.useCallback(() => {
// noop
}, [])
const handlePersist = React.useCallback(() => {
// noop
}, [])

Wyświetl plik

@ -33,8 +33,9 @@
"test": "turbo run test --stream",
"test:ci": "turbo run test:ci --stream",
"test:watch": "turbo run test:watch --stream",
"postinstall": "husky install",
"lint": "turbo run lint",
"clean": "turbo run clean",
"postinstall": "husky install",
"pre-commit": "lint-staged",
"pre-push": "yarn test"
},
@ -48,7 +49,7 @@
"@types/vscode": "^1.63.2",
"@typescript-eslint/eslint-plugin": "^5.17.0",
"@typescript-eslint/parser": "^5.17.0",
"eslint": "^8.8.0",
"eslint": "^8.20.0",
"eslint-plugin-jest": "^26.6.0",
"fake-indexeddb": "^3.1.7",
"husky": "^7.0.4",

Wyświetl plik

@ -58,7 +58,6 @@
"@types/react-dom": "^18.0.5",
"@typescript-eslint/eslint-plugin": "^5.10.2",
"@typescript-eslint/parser": "^5.10.2",
"eslint": "^8.8.0",
"@tldraw/lfg": "latest",
"mobx": "^6.3.8",
"react": "^18.1.0",

Wyświetl plik

@ -74,7 +74,6 @@
"@types/react-dom": "^18.0.5",
"@typescript-eslint/eslint-plugin": "^5.10.2",
"@typescript-eslint/parser": "^5.10.2",
"eslint": "^8.8.0",
"mobx": "^6.3.8",
"react": "^18.1.0",
"react-dom": "^18.1.0",

Wyświetl plik

@ -52,7 +52,6 @@
"outputs": ["coverage/**"]
},
"lint": {
"dependsOn": ["build"],
"outputs": []
},
"clean": {

Wyświetl plik

@ -1409,6 +1409,21 @@
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
"@eslint/eslintrc@^1.3.0":
version "1.3.0"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f"
integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==
dependencies:
ajv "^6.12.4"
debug "^4.3.2"
espree "^9.3.2"
globals "^13.15.0"
ignore "^5.2.0"
import-fresh "^3.2.1"
js-yaml "^4.1.0"
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
"@firebase/analytics-compat@0.1.6":
version "0.1.6"
resolved "https://registry.yarnpkg.com/@firebase/analytics-compat/-/analytics-compat-0.1.6.tgz#a5a8c909c67128d89c0aaa1c87699d1c5e873746"
@ -3934,7 +3949,7 @@ acorn-import-assertions@^1.7.6:
resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9"
integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==
acorn-jsx@^5.3.1:
acorn-jsx@^5.3.1, acorn-jsx@^5.3.2:
version "5.3.2"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
@ -3954,6 +3969,11 @@ acorn@^8.2.4, acorn@^8.4.1, acorn@^8.7.0:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
acorn@^8.7.1:
version "8.8.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8"
integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==
agent-base@6:
version "6.0.2"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
@ -6489,6 +6509,47 @@ eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
eslint@^8.20.0:
version "8.20.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.20.0.tgz#048ac56aa18529967da8354a478be4ec0a2bc81b"
integrity sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==
dependencies:
"@eslint/eslintrc" "^1.3.0"
"@humanwhocodes/config-array" "^0.9.2"
ajv "^6.10.0"
chalk "^4.0.0"
cross-spawn "^7.0.2"
debug "^4.3.2"
doctrine "^3.0.0"
escape-string-regexp "^4.0.0"
eslint-scope "^7.1.1"
eslint-utils "^3.0.0"
eslint-visitor-keys "^3.3.0"
espree "^9.3.2"
esquery "^1.4.0"
esutils "^2.0.2"
fast-deep-equal "^3.1.3"
file-entry-cache "^6.0.1"
functional-red-black-tree "^1.0.1"
glob-parent "^6.0.1"
globals "^13.15.0"
ignore "^5.2.0"
import-fresh "^3.0.0"
imurmurhash "^0.1.4"
is-glob "^4.0.0"
js-yaml "^4.1.0"
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.4.1"
lodash.merge "^4.6.2"
minimatch "^3.1.2"
natural-compare "^1.4.0"
optionator "^0.9.1"
regexpp "^3.2.0"
strip-ansi "^6.0.1"
strip-json-comments "^3.1.0"
text-table "^0.2.0"
v8-compile-cache "^2.0.3"
eslint@^8.8.0:
version "8.9.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.9.0.tgz#a2a8227a99599adc4342fd9b854cb8d8d6412fdb"
@ -6539,6 +6600,15 @@ espree@^9.3.1:
acorn-jsx "^5.3.1"
eslint-visitor-keys "^3.3.0"
espree@^9.3.2:
version "9.3.2"
resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596"
integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==
dependencies:
acorn "^8.7.1"
acorn-jsx "^5.3.2"
eslint-visitor-keys "^3.3.0"
esprima@^4.0.0, esprima@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
@ -7125,6 +7195,13 @@ globals@^11.1.0:
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
globals@^13.15.0:
version "13.17.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4"
integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==
dependencies:
type-fest "^0.20.2"
globals@^13.6.0, globals@^13.9.0:
version "13.12.1"
resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.1.tgz#ec206be932e6c77236677127577aa8e50bf1c5cb"
@ -8994,7 +9071,7 @@ minimatch@4.2.1:
dependencies:
brace-expansion "^1.1.7"
minimatch@^3.0.3, minimatch@^3.0.4:
minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==