From d33413071661b26f6cf5a5703783424a02220120 Mon Sep 17 00:00:00 2001 From: Arthur Tkachenko Date: Thu, 2 Mar 2023 16:48:15 +0000 Subject: [PATCH] 123 --- html-typography-tags/.eslintrc.json | 18 +++ html-typography-tags/README.md | 104 ++++++++++++++++++ html-typography-tags/jest.config.ts | 15 +++ html-typography-tags/package.json | 17 +++ html-typography-tags/project.json | 40 +++++++ html-typography-tags/src/components/button.ts | 49 +++++++++ html-typography-tags/src/components/config.ts | 20 ++++ html-typography-tags/src/components/div.ts | 32 ++++++ html-typography-tags/src/components/image.ts | 87 +++++++++++++++ .../src/components/imageLink.ts | 41 +++++++ html-typography-tags/src/components/italic.ts | 31 ++++++ html-typography-tags/src/components/link.ts | 30 +++++ html-typography-tags/src/components/list.ts | 14 +++ .../src/components/listItem.ts | 13 +++ .../src/components/paragraph.ts | 29 +++++ html-typography-tags/src/components/strong.ts | 23 ++++ html-typography-tags/src/index.ts | 90 +++++++++++++++ .../src/lib/html-typography-tags.spec.ts | 7 ++ .../src/lib/html-typography-tags.ts | 3 + html-typography-tags/tsconfig.json | 22 ++++ html-typography-tags/tsconfig.lib.json | 10 ++ html-typography-tags/tsconfig.spec.json | 14 +++ html-typography-tags/yarn.lock | 15 +++ 23 files changed, 724 insertions(+) create mode 100644 html-typography-tags/.eslintrc.json create mode 100644 html-typography-tags/README.md create mode 100644 html-typography-tags/jest.config.ts create mode 100644 html-typography-tags/package.json create mode 100644 html-typography-tags/project.json create mode 100644 html-typography-tags/src/components/button.ts create mode 100644 html-typography-tags/src/components/config.ts create mode 100644 html-typography-tags/src/components/div.ts create mode 100644 html-typography-tags/src/components/image.ts create mode 100644 html-typography-tags/src/components/imageLink.ts create mode 100644 html-typography-tags/src/components/italic.ts create mode 100644 html-typography-tags/src/components/link.ts create mode 100644 html-typography-tags/src/components/list.ts create mode 100644 html-typography-tags/src/components/listItem.ts create mode 100644 html-typography-tags/src/components/paragraph.ts create mode 100644 html-typography-tags/src/components/strong.ts create mode 100644 html-typography-tags/src/index.ts create mode 100644 html-typography-tags/src/lib/html-typography-tags.spec.ts create mode 100644 html-typography-tags/src/lib/html-typography-tags.ts create mode 100644 html-typography-tags/tsconfig.json create mode 100644 html-typography-tags/tsconfig.lib.json create mode 100644 html-typography-tags/tsconfig.spec.json create mode 100644 html-typography-tags/yarn.lock diff --git a/html-typography-tags/.eslintrc.json b/html-typography-tags/.eslintrc.json new file mode 100644 index 0000000..9d9c0db --- /dev/null +++ b/html-typography-tags/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/html-typography-tags/README.md b/html-typography-tags/README.md new file mode 100644 index 0000000..6326d03 --- /dev/null +++ b/html-typography-tags/README.md @@ -0,0 +1,104 @@ +# html-typography-tags + +This library was generated with [Nx](https://nx.dev). + +## Building + +Run `nx build html-typography-tags` to build the library. + +## Running unit tests + +Run `nx test html-typography-tags` to execute the unit tests via [Jest](https://jestjs.io). + + +- [ ] TODO: To add examples from the past version to the readme + + +button.js + +div.js + +heading-nmtg.js + +heading.js + +headingOne.js + +image.js + +imageLink.js + +italic.js + +link.js + +list.js + +listItem.js + +paragraph.js + +strong.js + +https://github.com/sindresorhus/create-html-element + + +``` + +const paragraphComponent = (params) => { + if (typeof params != 'object') { + customError.add('"params" is not "object"'); + } + + if (typeof params.attributes == '') { + customError.add('empty attributes'); + } + + if (typeof params.content == '') { + customError.add('empty content'); + } + + const { attributes, content } = params; + + return `

${content}

`; +}; +``` + +``` +const buttonComponent = (params) => { + const { id, href, text } = params; + const error = new Errors('contentButton'); + + if (id == '') { + error.add('No id button'); + } + if (href == '') { + error.add('No href button'); + } + if (text == '') { + error.add('No text button'); + } + + return buttonMainBlock(id, href, text); +}; +``` + +``` +export default function (params) { + const { hrefTitle, idTitle, textTitle } = params; + const error = new Errors('contentTitleText'); + + if (hrefTitle == '') { + error.add('No hrefTitle'); + } + if (idTitle == '') { + error.add('No idTitle'); + } + if (textTitle == '') { + error.add('No textTitle'); + } + + return headingMainBlock(hrefTitle, idTitle, textTitle); +} +``` + diff --git a/html-typography-tags/jest.config.ts b/html-typography-tags/jest.config.ts new file mode 100644 index 0000000..7e501a9 --- /dev/null +++ b/html-typography-tags/jest.config.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +export default { + displayName: 'html-typography-tags', + preset: '../../jest.preset.js', + globals: { + 'ts-jest': { + tsconfig: '/tsconfig.spec.json', + }, + }, + transform: { + '^.+\\.[tj]s$': 'ts-jest', + }, + moduleFileExtensions: ['ts', 'js', 'html'], + coverageDirectory: '../../coverage/packages/html-typography-tags', +}; diff --git a/html-typography-tags/package.json b/html-typography-tags/package.json new file mode 100644 index 0000000..8ac076f --- /dev/null +++ b/html-typography-tags/package.json @@ -0,0 +1,17 @@ +{ + "name": "@template/html-typography-tags", + "version": "4.2.2", + "type": "commonjs", + "dependencies": { + "stringify-attributes": "^3.0.0" + }, + "author": "Arthur Tkachenko, Yuriy", + "license": "MIT", + "private": false, + "release": { + "publishDir": "dist" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/html-typography-tags/project.json b/html-typography-tags/project.json new file mode 100644 index 0000000..0b561a2 --- /dev/null +++ b/html-typography-tags/project.json @@ -0,0 +1,40 @@ +{ + "name": "html-typography-tags", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "packages/html-typography-tags/src", + "projectType": "library", + "targets": { + "build": { + "executor": "@nrwl/js:tsc", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/packages/html-typography-tags", + "main": "packages/html-typography-tags/src/index.ts", + "tsConfig": "packages/html-typography-tags/tsconfig.lib.json", + "assets": ["packages/html-typography-tags/*.md"] + } + }, + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["packages/html-typography-tags/**/*.ts"] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "packages/html-typography-tags/jest.config.ts", + "passWithNoTests": true + }, + "configurations": { + "ci": { + "ci": true, + "codeCoverage": true + } + } + } + }, + "tags": [] +} diff --git a/html-typography-tags/src/components/button.ts b/html-typography-tags/src/components/button.ts new file mode 100644 index 0000000..ce70480 --- /dev/null +++ b/html-typography-tags/src/components/button.ts @@ -0,0 +1,49 @@ +// import Errors from './Errors'; +import linkComponent from './link'; +import stringifyAttributes from 'stringify-attributes'; + +// import stringifyAttributes from '../../node_modules/stringify-attributes'; + +// stringifyAttributes({ +// rainbow: true, +// number: 1, +// multiple: ['a', 'b'], +// }); + +// function printToConsole(s: string) { +// console.log(s); +// } + + +function buttonComponent(params: { id: string, href: string, text: string }) { + const attributes = { + id: params.id, + class: `mlContentButton`, + href: params.href, + 'data-link-id': params.id, + style: `font-family: "Poppins", sans-serif; background-color: #d6685e; border-radius: 3px; color: #ffffff; display: inline-block; font-size: 17px; font-weight: 400; line-height: 23px; padding: 15px 0 15px 0; text-align: center; text-decoration: none; width: 260px;`, + }; + + const attributesStr = stringifyAttributes(attributes); + + console.log(attributesStr); + + const linkObject = { + attributes: attributesStr, + content: params.text + } + + console.log(linkObject); + + return linkComponent(linkObject); +} + +// // we will probably loose id param during changes that Arthur is doing. +// const bottonTwoMainBlock = (id, href, text) => { +// return ` +// ${text} +// `; +// }; + +export default buttonComponent; diff --git a/html-typography-tags/src/components/config.ts b/html-typography-tags/src/components/config.ts new file mode 100644 index 0000000..a4d7943 --- /dev/null +++ b/html-typography-tags/src/components/config.ts @@ -0,0 +1,20 @@ +// Create config file +const contact = "xxx"; +const mailingAddress = "contact@nomoretogo.co"; +const unsubscribe = + "https://click.mailerlite.com/link/c/YT0xOTM0MzU4ODYxNzU0NDA1OTgyJmM9bDhuNSZiPTk2MDM1NzY2OSZkPWo3eTJlNHY=.Ec_fY2NpMcOTAMs-XIr1n9exawt8fd3IsksWtSJ2kak"; +const pathToImages = "../data/images/"; +const pathMainLogo = "../data/images/logo.jpeg"; +const pathSocialIcons = "../data/images/"; +const titleHead = + "Korean Barbecue Beef | Pork Schnitzel | Bahn Mi Meatball Skewers"; + +export { + contact, + mailingAddress, + unsubscribe, + pathToImages, + pathMainLogo, + pathSocialIcons, + titleHead, +}; diff --git a/html-typography-tags/src/components/div.ts b/html-typography-tags/src/components/div.ts new file mode 100644 index 0000000..fe7130d --- /dev/null +++ b/html-typography-tags/src/components/div.ts @@ -0,0 +1,32 @@ +import stringifyAttributes from 'stringify-attributes'; +// import stringifyAttributes from '../../node_modules/stringify-attributes'; + +// TODO think about renaming content into children + +// params: { id: string, href: string, text: string } +function divComponent (params: any) { + + + + const { attributes, content } = params; + + const attributesStr = stringifyAttributes(attributes); + + + return `
${content}
`; + } + + export default divComponent; + + + // if (typeof params != 'object') { + // customError.add('"params" is not "object"'); + // } + + // if (typeof params.attributes == '') { + // customError.add('empty attributes'); + // } + + // if (typeof params.content == '') { + // customError.add('empty content'); + // } \ No newline at end of file diff --git a/html-typography-tags/src/components/image.ts b/html-typography-tags/src/components/image.ts new file mode 100644 index 0000000..8ab5095 --- /dev/null +++ b/html-typography-tags/src/components/image.ts @@ -0,0 +1,87 @@ +// Error +// import Errors from './Errors'; +// Config file +// import { pathToImages } from '../config.js'; + +// TODO to solve everything related to image component +// passing src, width, error handling, etc +// plus to move it later between other templates + +import stringifyAttributes from 'stringify-attributes'; +// import stringifyAttributes from '../../node_modules/stringify-attributes'; + +function imageComponent (params: { src: string, width: string }) { + + + const attributes = { + src: params.src, + style: `display: block;`, + border:"0", + alt:"", + width: params.width, // TODO test if it can work withot width param or not + }; + + + const attributesStr = stringifyAttributes(attributes); + + // console.log(attributesStr); + + return ``; + +} + + +export default imageComponent; + + +//------------------------------------------ +//------------------------------------------ + +// const { id, href, src, width } = params; + +// const error = new Errors('image'); + +// if (id == '') { +// error.add('No id'); +// } +// if (href == '') { +// error.add('No href'); +// } +// if (src == '') { +// error.add('No src'); +// } + +//------------------------------------------ +//------------------------------------------ + +// import linkComponent from './link'; + + + +// const imageComponentOld = (attributes) => { +// const { src, width } = attributes; + +// if(!width){ +// return ``; +// } + +// return ``; +// } + +// if (typeof params != 'object') { +// customError.add('"params" is not "object"'); +// } + +// if (typeof params.attributes == '') { +// customError.add('empty attributes'); +// } + + + // const { src, width } = attributes; + + // if(!width){ + // return ``; + // } + + + // return ``; diff --git a/html-typography-tags/src/components/imageLink.ts b/html-typography-tags/src/components/imageLink.ts new file mode 100644 index 0000000..db3de4b --- /dev/null +++ b/html-typography-tags/src/components/imageLink.ts @@ -0,0 +1,41 @@ +import stringifyAttributes from 'stringify-attributes'; +// import stringifyAttributes from '../../node_modules/stringify-attributes'; + +import linkComponent from './link'; + +import imageComponent from "./image"; +// TODO upgrade it +// params: { src: string, width: string } +function imageLink (params: { id: string, href: string, src: string, width: string }) { + + const { id, href, src, width } = params; + + const image_attributes = { + src, width + }; + + const image = imageComponent(image_attributes); + + // const imagePath = ; + + // const attr = `src="${src}" + // border="0" alt="" ` + + // (width === undefined ? `` : `width="${width}"`) + + // ` style="display: block;"`; + + // const image = imageComponent(attr); + + const link_attributes = { + href, + 'data-link-id': id, + target: "_self", + } + + const parameters = { + attributes: stringifyAttributes(link_attributes), + content: image, + }; + return linkComponent(parameters); + } + + export default imageLink; diff --git a/html-typography-tags/src/components/italic.ts b/html-typography-tags/src/components/italic.ts new file mode 100644 index 0000000..481012c --- /dev/null +++ b/html-typography-tags/src/components/italic.ts @@ -0,0 +1,31 @@ +import stringifyAttributes from 'stringify-attributes'; + +// TODO think about renaming content into children +// params: { src: string, width: string } +function italicComponent (params: any) { + + + const { content } = params; + + + return `${content}`; + } + + export default italicComponent; + + +// export default italicComponent; + + + // if (typeof params != 'object') { + // customError.add('"params" is not "object"'); + // } + + // if (typeof params.attributes == '') { + // customError.add('empty attributes'); + // } + + // if (typeof params.content == '') { + // customError.add('empty content'); + // } + \ No newline at end of file diff --git a/html-typography-tags/src/components/link.ts b/html-typography-tags/src/components/link.ts new file mode 100644 index 0000000..da9e152 --- /dev/null +++ b/html-typography-tags/src/components/link.ts @@ -0,0 +1,30 @@ +import stringifyAttributes from 'stringify-attributes'; +// import stringifyAttributes from '../../node_modules/stringify-attributes'; +// import customErrors from './Errors'; +// const customError = new customErrors('link'); + +// import ow from 'ow'; +// params: { src: string, width: string } +function linkComponent (params: any) { + + + + const { attributes, content } = params; + const attributesStr = stringifyAttributes(attributes); + + return `${content}`; +} + +export default linkComponent; + + // if (typeof params != 'object') { + // customError.add('"params" is not "object"'); + // } + + // if (typeof params.attributes == '') { + // customError.add('empty attributes'); + // } + + // if (typeof params.content == '') { + // customError.add('empty content'); + // } \ No newline at end of file diff --git a/html-typography-tags/src/components/list.ts b/html-typography-tags/src/components/list.ts new file mode 100644 index 0000000..23d74eb --- /dev/null +++ b/html-typography-tags/src/components/list.ts @@ -0,0 +1,14 @@ +import stringifyAttributes from 'stringify-attributes'; +// import stringifyAttributes from '../../node_modules/stringify-attributes'; +// params: { src: string, width: string } +function listComponent (params: any) { + + + + const { attributes, children } = params; + const attributesStr = stringifyAttributes(attributes); + + return ``; +} + +export default listComponent; diff --git a/html-typography-tags/src/components/listItem.ts b/html-typography-tags/src/components/listItem.ts new file mode 100644 index 0000000..88a54c6 --- /dev/null +++ b/html-typography-tags/src/components/listItem.ts @@ -0,0 +1,13 @@ +import stringifyAttributes from 'stringify-attributes'; +// import stringifyAttributes from '../../node_modules/stringify-attributes'; +// params: { src: string, width: string } +function listItemComponent (params: any) { + + + const { attributes, children } = params; + const attributesStr = stringifyAttributes(attributes); + + return `
  • ${children}
  • `; +} + +export default listItemComponent; diff --git a/html-typography-tags/src/components/paragraph.ts b/html-typography-tags/src/components/paragraph.ts new file mode 100644 index 0000000..30ced07 --- /dev/null +++ b/html-typography-tags/src/components/paragraph.ts @@ -0,0 +1,29 @@ +import stringifyAttributes from 'stringify-attributes'; +// import stringifyAttributes from '../../node_modules/stringify-attributes'; +// params: { src: string, width: string } +function paragraphComponent (params: any) { + + + const { attributes, content } = params; + + const attributesStr = stringifyAttributes(attributes); + + + return `

    ${content}

    `; + } + + export default paragraphComponent; + + + + // if (typeof params != 'object') { + // customError.add('"params" is not "object"'); + // } + + // if (typeof params.attributes == '') { + // customError.add('empty attributes'); + // } + + // if (typeof params.content == '') { + // customError.add('empty content'); + // } \ No newline at end of file diff --git a/html-typography-tags/src/components/strong.ts b/html-typography-tags/src/components/strong.ts new file mode 100644 index 0000000..3aa6dea --- /dev/null +++ b/html-typography-tags/src/components/strong.ts @@ -0,0 +1,23 @@ +// Create strong component +import stringifyAttributes from 'stringify-attributes'; +// import stringifyAttributes from '../../node_modules/stringify-attributes'; + +// TODO should we replace content with child as we might have other components inside? +// params: { src: string, width: string } +function strongComponent (params: any) { + + + const { attributes, content } = params; + const attributesStr = stringifyAttributes(attributes); + + return `${content}`; +} + +export default strongComponent; + + +// const error = new Errors('strong'); + +// if (content == '') { +// error.add('No content'); +// } diff --git a/html-typography-tags/src/index.ts b/html-typography-tags/src/index.ts new file mode 100644 index 0000000..64c6a17 --- /dev/null +++ b/html-typography-tags/src/index.ts @@ -0,0 +1,90 @@ +// export * from './lib/html-typography-tags'; + + + + +import buttonComponent from './components/button'; + +import divComponent from './components/div'; + + +// import heading from './components/heading-nmtg'; + +// import headingComponent from './components/heading'; + +// import headingOneComponent from './components/headingOne'; + +import imageComponent from './components/image'; + +import imageLink from './components/imageLink'; + +import italicComponent from './components/italic'; + +import linkComponent from './components/link'; + +import listComponent from './components/list'; +import listItemComponent from './components/listItem'; + +import paragraphComponent from './components/paragraph'; + +import strongComponent from './components/strong'; + +/////////////////////////////// +// I'm adding my tests here, because i dont know how to organize it right now +////////////////////////////// + + +const attributes = { + style: "width: 600px" + } + +const content = "Bla bla bla"; + +const config = {id: '12', href: 'https://google.com', text: 'Bla bla bla'}; + +const data = { + id: 'imageBlock-26', + href: 'https://www.nomoretogo.com/weekly-menu/', + src: 'https://raw.githubusercontent.com/LLazyEmail/nomoretogo_email_template/main/data/images/recipe1.jpeg', + //------ + title: 'Chipotle Cream Skillet Chicken', + text: 'over Rice and Snap Peas', + width: "600px" +}; + + +const linkHTML = linkComponent(config); + +const buttonHTML = buttonComponent(config); + +const strongHTML = strongComponent({attributes, content}); + +const imageLinkHTML = imageLink(data); + +console.log(linkHTML); + +console.log(buttonHTML); + +console.log(strongHTML); + +console.log(imageLinkHTML); + + + + +// End of tests +//// + + +export { + buttonComponent, + divComponent, + imageComponent, + imageLink, + italicComponent, + linkComponent, + listComponent, + listItemComponent, + paragraphComponent, + strongComponent, +} \ No newline at end of file diff --git a/html-typography-tags/src/lib/html-typography-tags.spec.ts b/html-typography-tags/src/lib/html-typography-tags.spec.ts new file mode 100644 index 0000000..ddcdc0e --- /dev/null +++ b/html-typography-tags/src/lib/html-typography-tags.spec.ts @@ -0,0 +1,7 @@ +import { htmlTypographyTags } from './html-typography-tags'; + +describe('htmlTypographyTags', () => { + it('should work', () => { + expect(htmlTypographyTags()).toEqual('html-typography-tags'); + }); +}); diff --git a/html-typography-tags/src/lib/html-typography-tags.ts b/html-typography-tags/src/lib/html-typography-tags.ts new file mode 100644 index 0000000..1ee06d4 --- /dev/null +++ b/html-typography-tags/src/lib/html-typography-tags.ts @@ -0,0 +1,3 @@ +export function htmlTypographyTags(): string { + return 'html-typography-tags'; +} diff --git a/html-typography-tags/tsconfig.json b/html-typography-tags/tsconfig.json new file mode 100644 index 0000000..f5b8565 --- /dev/null +++ b/html-typography-tags/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "module": "commonjs", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/html-typography-tags/tsconfig.lib.json b/html-typography-tags/tsconfig.lib.json new file mode 100644 index 0000000..33eca2c --- /dev/null +++ b/html-typography-tags/tsconfig.lib.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "declaration": true, + "types": ["node"] + }, + "include": ["src/**/*.ts"], + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/html-typography-tags/tsconfig.spec.json b/html-typography-tags/tsconfig.spec.json new file mode 100644 index 0000000..9b2a121 --- /dev/null +++ b/html-typography-tags/tsconfig.spec.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/html-typography-tags/yarn.lock b/html-typography-tags/yarn.lock new file mode 100644 index 0000000..3d36d39 --- /dev/null +++ b/html-typography-tags/yarn.lock @@ -0,0 +1,15 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +escape-goat@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-3.0.0.tgz#e8b5fb658553fe8a3c4959c316c6ebb8c842b19c" + integrity sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw== + +stringify-attributes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stringify-attributes/-/stringify-attributes-3.0.0.tgz#10d8c3615924df47b70d28c848d71c8afb0a8e52" + integrity sha512-tJKiThlLfog6ljT7ZTihlMh0iAtjKlu/ss9DMmBE5oOosbMqOMcuxc7zDfxP2lGzSb2Bwvbd3gQTqTSCmXyySw== + dependencies: + escape-goat "^3.0.0"