diff --git a/change/@fluentui-web-components-da4963ac-6e80-41f8-ad09-a208d9b1dea3.json b/change/@fluentui-web-components-da4963ac-6e80-41f8-ad09-a208d9b1dea3.json new file mode 100644 index 00000000000000..cdaa738b1b83d5 --- /dev/null +++ b/change/@fluentui-web-components-da4963ac-6e80-41f8-ad09-a208d9b1dea3.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Add a custom elements manifest", + "packageName": "@fluentui/web-components", + "email": "7559015+janechu@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/packages/web-components/README.md b/packages/web-components/README.md index 18686453cc9860..7b572f25fe9d84 100644 --- a/packages/web-components/README.md +++ b/packages/web-components/README.md @@ -76,6 +76,16 @@ import { ButtonDefinition, FluentDesignSystem } from '@fluentui/web-components'; ButtonDefinition.define(FluentDesignSystem.registry); ``` +## Developer Experience + +For convenience we have included a [CEM (custom elements manifest)](https://github.com/webcomponents/custom-elements-manifest). + +```js +import CEM from '@fluentui/custom-elements.json'; +``` + +We have also included an [HTML custom data file for VS Code](./vs-code.md). + ## Development To start the component development environment, run `yarn start`. diff --git a/packages/web-components/custom-elements-manifest.config.js b/packages/web-components/custom-elements-manifest.config.js new file mode 100644 index 00000000000000..db7c46f7592d23 --- /dev/null +++ b/packages/web-components/custom-elements-manifest.config.js @@ -0,0 +1,35 @@ +import { tagNameFix, typescriptTypeTextSanitize } from "./custom-elements-manifest.plugins.js"; +import { customElementVsCodePlugin } from "custom-element-vs-code-integration"; + +export default { + /** Globs to analyze */ + globs: ["src/**/*.ts"], + /** Globs to exclude */ + exclude: [ + "*.js", + "*.ts", + "src/helpers.stories.ts", + "src/helpers.tests.ts", + "src/index-rollup.ts", + "src/utils/benchmark-wrapper.ts", + "src/**/*.bench.ts", + "src/**/*.spec.ts", + "src/**/*.stories.ts", + "src/**/define.ts", + "src/**/index.ts", + "src/**/*.md" + ], + /** Directory to output CEM to */ + outdir: "dist", + /** Run in dev mode, provides extra logging */ + dev: false, + /** Enable special handling for fast */ + fast: true, + plugins: [ + tagNameFix(), + typescriptTypeTextSanitize(), + customElementVsCodePlugin({ + outdir: "dist" + }) + ], +}; diff --git a/packages/web-components/custom-elements-manifest.plugins.js b/packages/web-components/custom-elements-manifest.plugins.js new file mode 100644 index 00000000000000..0798bb0893e4b2 --- /dev/null +++ b/packages/web-components/custom-elements-manifest.plugins.js @@ -0,0 +1,167 @@ +import { readFileSync } from "fs"; +import path from "path"; +import ts from "typescript"; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const getTagNameFromCommentInDefinitionFile = function (definitionPathName) { + const indexFilePath = path.resolve(__dirname, `./${definitionPathName}`); + let name; + + try { + let sourceFile = ts.createSourceFile( + indexFilePath, + readFileSync(indexFilePath).toString(), + ts.ScriptTarget.ES2015, + /*setParentNodes */ true + ); + + if (Array.isArray(sourceFile.statements)) { + sourceFile.statements.forEach((statement) => { + if (Array.isArray(statement.jsDoc) && statement.jsDoc[0].tags !== undefined) { + statement.jsDoc.forEach((jsDoc) => { + if (Array.isArray(jsDoc.tags)) { + jsDoc.tags.forEach((tag) => { + if (typeof tag.comment === "string" && tag.comment.startsWith("HTML Element:")) { + name = tag.comment.match(/<(.*)>/)[1].replace("\\", ""); + } + }); + } + }) + } + }) + } + } catch (err) { + // do nothing + } + + return name; +} + +const resolveDefinitionFilePath = function(filePathName) { + return filePathName.split("/").map((pathItem) => { + if (pathItem.endsWith(".ts")) { + const splitPathItem = pathItem.split("."); + splitPathItem.splice(1, 0, "definition"); + return splitPathItem.join("."); + } + + return pathItem; + }).join("/"); +} + +const checkIsUnresolvedTypeScriptType = function(type) { + /** + * Due to TypeScript types being PascalCase, and all other default + * types being lowercase, we determine if this is a typescript type by checking + * the first letter. + */ + return type[0] === type[0].toUpperCase() && isNaN(type[0]); +} + +const resolveTypeToValues = function(CEM, type) { + let values = ""; + + CEM.modules.forEach((cemModule) => { + if (cemModule.kind === "javascript-module") { + cemModule.declarations.forEach((declaration) => { + if (declaration.name === type) { + const sanitizedType = declaration.type?.text; + const matches = sanitizedType + .match(/((?:.*):(?:.*))/gm) + .map((match) => { + return match.match(/(?:(?:')(.*)(?:')|(\d+))/)[0]; + }); + values = matches.reduce((accum, match) => { + return `${accum}${accum === "" ? "" : " | "}${match}`; + }, values) + } + }) + } + }); + + return values; +} + +/** + * @return {import('@custom-elements-manifest/analyzer').Plugin} + * + * This plugin adds the tagName after the manifest has been processed + * See: https://github.com/webcomponents/custom-elements-manifest/blob/main/schema.json + */ +export function tagNameFix() { + return { + name: "fluentTagName", + packageLinkPhase({customElementsManifest, context}){ + customElementsManifest.modules.map((item) => { + item.declarations.forEach((declaration) => { + if (declaration.customElement) { + const name = getTagNameFromCommentInDefinitionFile( + resolveDefinitionFilePath(item.path) + ); + + if (typeof name === "undefined") { + console.error(`no tag name for ${item.path}`); + } else { + declaration.tagName = name; + } + } + }) + }); + }, + }; +} + +/** + * @return {import('@custom-elements-manifest/analyzer').Plugin} + * + * This plugin changes the types to use pipe syntax so that the vscode plugin can + * correctly interpret the possible values, eg. + * from: + * { + * "name": "heading-level", + * "type": { + * "text": "HeadingLevel" + * }, + * "fieldName": "headinglevel" + * } + * + * to: + * { + * "name": "heading-level", + * "type": { + * "text": "1 | 2 | 3 | 4 | 5 | 6" + * }, + * "fieldName": "headinglevel" + * }, + */ +export function typescriptTypeTextSanitize() { + return { + name: "typescriptTypeTextSanitize", + packageLinkPhase({customElementsManifest, context}){ + customElementsManifest.modules.map((item) => { + item.declarations.forEach((declaration) => { + if (declaration.customElement && Array.isArray(declaration.attributes)) { + declaration.attributes.forEach((attribute) => { + if (typeof attribute.type?.text === "string") { + const possibleTypes = attribute.type.text.split("|").map((item) => { + return item.trim(); + }).map((possibleType) => { + if (checkIsUnresolvedTypeScriptType(possibleType)) { + return resolveTypeToValues(customElementsManifest, possibleType); + } + + return possibleType; + }).join(" | "); + + attribute.type.text = possibleTypes; + } + }); + } + }) + }); + }, + }; +} diff --git a/packages/web-components/package.json b/packages/web-components/package.json index c4e94ba3dea805..b3dba5069663d5 100644 --- a/packages/web-components/package.json +++ b/packages/web-components/package.json @@ -23,7 +23,8 @@ "dist/dts/", "dist/esm/", "dist/*.js", - "dist/*.d.ts" + "dist/*.d.ts", + "dist/*.json" ], "exports": { ".": { @@ -182,6 +183,7 @@ "types": "./dist/dts/utils/index.d.ts", "default": "./dist/esm/utils/index.js" }, + "./custom-elements.json": "./dist/custom-elements.json", "./package.json": "./package.json" }, "sideEffects": [ @@ -227,11 +229,12 @@ "verify-packaging": "node ./scripts/verify-packaging", "type-check": "node ./scripts/type-check", "benchmark": "yarn clean && yarn compile:benchmark && yarn compile && node ./scripts/run-benchmarks", + "cem-analyze": "cem analyze", "compile": "node ./scripts/compile", "compile:benchmark": "rollup -c rollup.bench.js", "clean": "node ./scripts/clean dist", "generate-api": "api-extractor run --local", - "build": "yarn compile && yarn rollup -c && yarn generate-api", + "build": "yarn compile && yarn rollup -c && yarn generate-api && yarn cem-analyze", "lint": "eslint . --ext .ts", "lint:fix": "eslint . --ext .ts --fix", "format": "prettier -w src/**/*.{ts,html} --ignore-path ../../.prettierignore", @@ -246,9 +249,11 @@ "devDependencies": { "@microsoft/fast-element": "2.0.0-beta.26", "@tensile-perf/web-components": "~0.2.0", + "@custom-elements-manifest/analyzer": "9.8.0", "@types/web": "^0.0.142", "@storybook/html": "6.5.15", - "chromedriver": "^125.0.0" + "chromedriver": "^125.0.0", + "custom-element-vs-code-integration": "^1.4.0" }, "dependencies": { "@microsoft/fast-web-utilities": "^6.0.0", diff --git a/packages/web-components/src/avatar/avatar.definition.ts b/packages/web-components/src/avatar/avatar.definition.ts index 6f076756e58606..5882dddd6aa3a9 100644 --- a/packages/web-components/src/avatar/avatar.definition.ts +++ b/packages/web-components/src/avatar/avatar.definition.ts @@ -8,7 +8,7 @@ import { template } from './avatar.template.js'; * * @public * @remarks - * HTML Element: \ + * HTML Element: \ */ export const definition = Avatar.compose({ name: `${FluentDesignSystem.prefix}-avatar`, diff --git a/packages/web-components/src/compound-button/compound-button.definition.ts b/packages/web-components/src/compound-button/compound-button.definition.ts index ee2f7922f68972..4e80366c1967b1 100644 --- a/packages/web-components/src/compound-button/compound-button.definition.ts +++ b/packages/web-components/src/compound-button/compound-button.definition.ts @@ -6,7 +6,7 @@ import { template } from './compound-button.template.js'; /** * @public * @remarks - * HTML Element: \ + * HTML Element: \ */ export const definition = CompoundButton.compose({ name: `${FluentDesignSystem.prefix}-compound-button`, diff --git a/packages/web-components/src/divider/divider.options.ts b/packages/web-components/src/divider/divider.options.ts index c537eeab5b92c5..06f40304d8c167 100644 --- a/packages/web-components/src/divider/divider.options.ts +++ b/packages/web-components/src/divider/divider.options.ts @@ -1,4 +1,3 @@ -import { Orientation } from '@microsoft/fast-web-utilities'; import type { ValuesOf } from '../utils/index.js'; /** @@ -27,7 +26,10 @@ export type DividerRole = ValuesOf; * Divider orientation * @public */ -export const DividerOrientation = Orientation; +export const DividerOrientation = { + horizontal: 'horizontal', + vertical: 'vertical', +} as const; /** * The types for Divider orientation diff --git a/packages/web-components/src/drawer-body/drawer-body.definition.ts b/packages/web-components/src/drawer-body/drawer-body.definition.ts index 562c0647ad36cb..99fed79f27509e 100644 --- a/packages/web-components/src/drawer-body/drawer-body.definition.ts +++ b/packages/web-components/src/drawer-body/drawer-body.definition.ts @@ -7,7 +7,7 @@ import { template } from './drawer-body.template.js'; * * @public * @remarks - * HTML Element: + * HTML Element: */ export const definition = DrawerBody.compose({ diff --git a/packages/web-components/src/menu-button/menu-button.definition.ts b/packages/web-components/src/menu-button/menu-button.definition.ts index 4ffae145c2c7fd..dc47ac72816612 100644 --- a/packages/web-components/src/menu-button/menu-button.definition.ts +++ b/packages/web-components/src/menu-button/menu-button.definition.ts @@ -6,7 +6,7 @@ import { template } from './menu-button.template.js'; /** * @public * @remarks - * HTML Element: \ + * HTML Element: \ */ export const definition = MenuButton.compose({ name: `${FluentDesignSystem.prefix}-menu-button`, diff --git a/packages/web-components/src/radio-group/radio-group.options.ts b/packages/web-components/src/radio-group/radio-group.options.ts index d3af40bc749f50..41b70c6a60bda4 100644 --- a/packages/web-components/src/radio-group/radio-group.options.ts +++ b/packages/web-components/src/radio-group/radio-group.options.ts @@ -1,11 +1,13 @@ -import { Orientation } from '@microsoft/fast-web-utilities'; import type { ValuesOf } from '../utils/index.js'; /** * Radio Group orientation * @public */ -export const RadioGroupOrientation = Orientation; +export const RadioGroupOrientation = { + horizontal: 'horizontal', + vertical: 'vertical', +} as const; /** * Types of Radio Group orientation diff --git a/packages/web-components/src/tab-panel/tab-panel.definition.ts b/packages/web-components/src/tab-panel/tab-panel.definition.ts index b94f49a3289680..32038505e39cff 100644 --- a/packages/web-components/src/tab-panel/tab-panel.definition.ts +++ b/packages/web-components/src/tab-panel/tab-panel.definition.ts @@ -3,6 +3,13 @@ import { TabPanel } from './tab-panel.js'; import { template } from './tab-panel.template.js'; import { styles } from './tab-panel.styles.js'; +/** + * The definition for the Fluent Tab Panel component. + * + * @public + * @remarks + * HTML Element: `` + */ export const definition = TabPanel.compose({ name: `${FluentDesignSystem.prefix}-tab-panel`, template, diff --git a/packages/web-components/src/tab/tab.definition.ts b/packages/web-components/src/tab/tab.definition.ts index 16fbae5108492c..e711a543b85a57 100644 --- a/packages/web-components/src/tab/tab.definition.ts +++ b/packages/web-components/src/tab/tab.definition.ts @@ -3,6 +3,13 @@ import { Tab } from './tab.js'; import { template } from './tab.template.js'; import { styles } from './tab.styles.js'; +/** + * The definition for the Fluent Tab component. + * + * @public + * @remarks + * HTML Element: `` + */ export const definition = Tab.compose({ name: `${FluentDesignSystem.prefix}-tab`, template, diff --git a/packages/web-components/src/tabs/tabs.definition.ts b/packages/web-components/src/tabs/tabs.definition.ts index f3b2494308437d..fb3244c943ca8a 100644 --- a/packages/web-components/src/tabs/tabs.definition.ts +++ b/packages/web-components/src/tabs/tabs.definition.ts @@ -3,6 +3,13 @@ import { Tabs } from './tabs.js'; import { template } from './tabs.template.js'; import { styles } from './tabs.styles.js'; +/** + * The definition for the Fluent Tabs component. + * + * @public + * @remarks + * HTML Element: `` + */ export const definition = Tabs.compose({ name: `${FluentDesignSystem.prefix}-tabs`, template, diff --git a/packages/web-components/src/tabs/tabs.options.ts b/packages/web-components/src/tabs/tabs.options.ts index c236c1ec53e677..22cec7fba9929b 100644 --- a/packages/web-components/src/tabs/tabs.options.ts +++ b/packages/web-components/src/tabs/tabs.options.ts @@ -1,4 +1,3 @@ -import { Orientation } from '@microsoft/fast-web-utilities'; import { StartEndOptions } from '../patterns/index.js'; import type { ValuesOf } from '../utils/index.js'; import { Tabs } from './tabs.js'; @@ -28,7 +27,10 @@ export type TabsOptions = StartEndOptions; * The orientation of the component * @public */ -export const TabsOrientation = Orientation; +export const TabsOrientation = { + horizontal: 'horizontal', + vertical: 'vertical', +} as const; /** * The types for the Tabs component diff --git a/packages/web-components/vs-code.md b/packages/web-components/vs-code.md new file mode 100644 index 00000000000000..119b74241781b9 --- /dev/null +++ b/packages/web-components/vs-code.md @@ -0,0 +1,17 @@ +# Using VS Code + +As an additional helper included in the `@fluentui/web-components` package is HTML custom data. + +![VS Code Custom Data user experience](./vscode-custom-html-data.gif) + +To use this, reference the custom data file in your VS Code settings: + +```json +{ + "html.customData": ["../node_modules/@fluentui/web-components/dist/vscode.html-custom-data.json"] +} +``` + +**Note:** The path is relative to the root of the project, not the settings file. + +Once it has been added, you will need to restart VS Code in order for it to register the new components. diff --git a/packages/web-components/vscode-custom-html-data.gif b/packages/web-components/vscode-custom-html-data.gif new file mode 100644 index 00000000000000..9eedf9ed226d90 Binary files /dev/null and b/packages/web-components/vscode-custom-html-data.gif differ diff --git a/yarn.lock b/yarn.lock index 7c74128db84262..e34eba730429c6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1638,6 +1638,29 @@ resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.3.4.tgz#59691edd031eedc431bda1bdf601257c06289a40" integrity sha512-8vmPV/nIULFDWsnJalQJDqFLC2uTPx6A/ASA2t27QGp+7oXnbWWXCe0uV8xasIH2rGbI/XoB2vmkdP/94WvMrw== +"@custom-elements-manifest/analyzer@9.8.0": + version "0.10.3" + resolved "https://registry.yarnpkg.com/@custom-elements-manifest/analyzer/-/analyzer-0.10.3.tgz#3b12957514475b24672ed08f48e007c7e5f018ea" + integrity sha512-e2Ax59vK9sNedmDlPqZS11L54iAlKSjOJuv5etpTy5SygLBW3GcUtocHZm8wO013L0griTPpgWB0tuV7/JXy5A== + dependencies: + "@custom-elements-manifest/find-dependencies" "^0.0.5" + "@github/catalyst" "^1.6.0" + "@web/config-loader" "0.1.3" + chokidar "3.5.2" + command-line-args "5.1.2" + comment-parser "1.2.4" + custom-elements-manifest "1.0.0" + debounce "1.2.1" + globby "11.0.4" + typescript "~5.4.2" + +"@custom-elements-manifest/find-dependencies@^0.0.5": + version "0.0.5" + resolved "https://registry.yarnpkg.com/@custom-elements-manifest/find-dependencies/-/find-dependencies-0.0.5.tgz#ebc11672019de3d52bb8f29f76efe510b8401fbd" + integrity sha512-fKIMMZCDFSoL2ySUoz8knWgpV4jpb0lUXgLOvdZQMQFHxgxz1PqOJpUIypwvEVyKk3nEHRY4f10gNol02HjeCg== + dependencies: + es-module-lexer "^0.9.3" + "@cypress/react@8.0.0": version "8.0.0" resolved "https://registry.yarnpkg.com/@cypress/react/-/react-8.0.0.tgz#9ed7a04284d149e65ad7ae9dc35aa2a20c2c4e57" @@ -2107,6 +2130,11 @@ "@griffel/react" "^1.5.14" "@swc/helpers" "^0.5.1" +"@github/catalyst@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@github/catalyst/-/catalyst-1.6.0.tgz#378734d1d2b6a85af169d7e66c1a2a604bf1e82c" + integrity sha512-u8A+DameixqpeyHzvnJWTGj+wfiskQOYHzSiJscCWVfMkIT3rxnbHMtGh3lMthaRY21nbUOK71WcsCnCrXhBJQ== + "@griffel/babel-preset@1.5.8", "@griffel/babel-preset@^1.5.8": version "1.5.8" resolved "https://registry.yarnpkg.com/@griffel/babel-preset/-/babel-preset-1.5.8.tgz#2ee5e404b34350fcb40a2506d73b0467f1a66be0" @@ -3449,6 +3477,13 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== +"@prettier/sync@^0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@prettier/sync/-/sync-0.5.2.tgz#f8401e45b667e8d6207015fd03619ea2c2e3e680" + integrity sha512-Yb569su456XNx5BsH/Vyem7xD6g/y9iLmLUzRKM1a/dhU/D7HqqvkAG72znulXlMXztbV0iiu9O5AL8K98TzZQ== + dependencies: + make-synchronized "^0.2.8" + "@react-native/babel-plugin-codegen@0.73.4": version "0.73.4" resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.73.4.tgz#8a2037d5585b41877611498ae66adbf1dddfec1b" @@ -6291,6 +6326,13 @@ loglevel-plugin-prefix "^0.8.4" strip-ansi "^7.1.0" +"@web/config-loader@0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@web/config-loader/-/config-loader-0.1.3.tgz#8325ea54f75ef2ee7166783e64e66936db25bff7" + integrity sha512-XVKH79pk4d3EHRhofete8eAnqto1e8mCRAqPV00KLNFzCWSe8sWmLnqKCqkPNARC6nksMaGrATnA5sPDRllMpQ== + dependencies: + semver "^7.3.4" + "@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.11.5": version "1.12.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" @@ -7151,7 +7193,7 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-back@^3.0.1, array-back@^3.1.0: +array-back@^3.0.1: version "3.1.0" resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== @@ -7161,7 +7203,7 @@ array-back@^4.0.1, array-back@^4.0.2: resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== -array-back@^6.2.2: +array-back@^6.1.2, array-back@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/array-back/-/array-back-6.2.2.tgz#f567d99e9af88a6d3d2f9dfcc21db6f9ba9fd157" integrity sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw== @@ -8791,6 +8833,21 @@ chokidar@3.3.0: optionalDependencies: fsevents "~2.1.1" +chokidar@3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + "chokidar@>=3.0.0 <4.0.0", chokidar@^3.2.1, chokidar@^3.3.1, chokidar@^3.4.1, chokidar@^3.4.2, chokidar@^3.5.2, chokidar@^3.5.3: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" @@ -9283,12 +9340,12 @@ comma-separated-tokens@^1.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.7.tgz#419cd7fb3258b1ed838dc0953167a25e152f5b59" integrity sha512-Jrx3xsP4pPv4AwJUDWY9wOXGtwPXARej6Xd99h4TUGotmf8APuquKMpK+dnD3UgyxK7OEWaisjZz+3b5jtL6xQ== -command-line-args@^5.0.2: - version "5.2.1" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" - integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== +command-line-args@5.1.2, command-line-args@^5.0.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.1.2.tgz#25908e573d2214bc23a8437e3df853b02dffa425" + integrity sha512-fytTsbndLbl+pPWtS0CxLV3BEWw9wJayB8NnU2cbQqVPsNdYezQeT+uIQv009m+GShnMNyuoBrRo8DTmuTfSCA== dependencies: - array-back "^3.1.0" + array-back "^6.1.2" find-replace "^3.0.0" lodash.camelcase "^4.3.0" typical "^4.0.0" @@ -9353,6 +9410,11 @@ commander@^9.4.1: resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== +comment-parser@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.2.4.tgz#489f3ee55dfd184a6e4bffb31baba284453cb760" + integrity sha512-pm0b+qv+CkWNriSTMsfnjChF9kH0kxz55y44Wo5le9qLxMj5xDQAaEd9ZN1ovSuk9CsrncWaFwgpOMg7ClJwkw== + comment-parser@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.4.1.tgz#bdafead37961ac079be11eb7ec65c4d021eaf9cc" @@ -9972,6 +10034,18 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" +custom-element-vs-code-integration@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/custom-element-vs-code-integration/-/custom-element-vs-code-integration-1.4.1.tgz#3afb347705a48d0cea3606349c06c795e919c75e" + integrity sha512-aOQpNayEzXHUg7JRo/eIS8aCMiOPLuMwhANj4iFdAz3NnHy5Y0Us7uS/qSeJhYbl+5NddygQvp3is8L0ggxMbQ== + dependencies: + "@prettier/sync" "^0.5.2" + +custom-elements-manifest@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/custom-elements-manifest/-/custom-elements-manifest-1.0.0.tgz#b35c2129076a1dc9f95d720c6f7b5b71a857274b" + integrity sha512-j59k0ExGCKA8T6Mzaq+7axc+KVHwpEphEERU7VZ99260npu/p/9kd+Db+I3cGKxHkM5y6q5gnlXn00mzRQkX2A== + cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" @@ -10343,7 +10417,7 @@ dayjs@^1.10.4: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.0.tgz#009bf7ef2e2ea2d5db2e6583d2d39a4b5061e805" integrity sha512-JLC809s6Y948/FuCZPm5IX8rRhQwOiyMb2TfVVQEixG7P8Lm/gt5S7yoQZmC8x1UehI9Pb7sksEt4xx14m+7Ug== -debounce@^1.2.1: +debounce@1.2.1, debounce@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== @@ -11427,7 +11501,17 @@ es-iterator-helpers@^1.0.19: iterator.prototype "^1.1.2" safe-array-concat "^1.1.2" -es-module-lexer@^1.2.1, es-module-lexer@^1.3.1, es-module-lexer@^1.5.3: +es-module-lexer@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +es-module-lexer@^1.2.1, es-module-lexer@^1.3.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.2.tgz#00b423304f2500ac59359cc9b6844951f372d497" + integrity sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA== + +es-module-lexer@^1.5.3: version "1.5.4" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== @@ -12367,7 +12451,7 @@ fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" -fast-glob@^3.0.3, fast-glob@^3.2.11, fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1, fast-glob@^3.3.2: +fast-glob@^3.0.3, fast-glob@^3.1.1, fast-glob@^3.2.11, fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1, fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -13613,6 +13697,18 @@ globby@*, globby@11.1.0, globby@^11.0.0, globby@^11.0.1, globby@^11.0.2, globby@ merge2 "^1.4.1" slash "^3.0.0" +globby@11.0.4: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + globby@^10.0.1: version "10.0.2" resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" @@ -14677,7 +14773,7 @@ ignore@^4.0.3: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.0.4, ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4: +ignore@^5.0.4, ignore@^5.1.1, ignore@^5.1.4, ignore@^5.2.0, ignore@^5.2.4: version "5.3.1" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== @@ -17467,6 +17563,11 @@ make-iterator@^1.0.0: dependencies: kind-of "^6.0.2" +make-synchronized@^0.2.8: + version "0.2.9" + resolved "https://registry.yarnpkg.com/make-synchronized/-/make-synchronized-0.2.9.tgz#edcbe2d8e7aeac8e0f41a0bb25b05cc7a7e2e8e4" + integrity sha512-4wczOs8SLuEdpEvp3vGo83wh8rjJ78UsIk7DIX5fxdfmfMJGog4bQzxfvOwq7Q3yCHLC4jp1urPHIxRS/A93gA== + makeerror@1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a"