diff --git a/api/spfx-template-api/etc/spfx-template-api.api.md b/api/spfx-template-api/etc/spfx-template-api.api.md index 863d98b9..e104860a 100644 --- a/api/spfx-template-api/etc/spfx-template-api.api.md +++ b/api/spfx-template-api/etc/spfx-template-api.api.md @@ -245,7 +245,7 @@ export class ServeJsonMergeHelper extends JsonMergeHelper { } // @public -export const SPFX_TEMPLATE_CATEGORIES: readonly ['webpart', 'extension', 'ace', 'library']; +export const SPFX_TEMPLATE_CATEGORIES: readonly ['webpart', 'extension', 'ace', 'library', 'copilot']; // @public export type SPFxRepositorySource = LocalFileSystemRepositorySource | PublicGitHubRepositorySource; diff --git a/api/spfx-template-api/src/templating/SPFxTemplateJsonFile.ts b/api/spfx-template-api/src/templating/SPFxTemplateJsonFile.ts index 0418f91d..8dbdef75 100644 --- a/api/spfx-template-api/src/templating/SPFxTemplateJsonFile.ts +++ b/api/spfx-template-api/src/templating/SPFxTemplateJsonFile.ts @@ -16,11 +16,12 @@ const DESCRIPTION_MAX_LENGTH: number = 500; * The allowed category values for SPFx templates. * @public */ -export const SPFX_TEMPLATE_CATEGORIES: readonly ['webpart', 'extension', 'ace', 'library'] = [ +export const SPFX_TEMPLATE_CATEGORIES: readonly ['webpart', 'extension', 'ace', 'library', 'copilot'] = [ 'webpart', 'extension', 'ace', - 'library' + 'library', + 'copilot' ] as const; /** diff --git a/apps/spfx-cli/README.md b/apps/spfx-cli/README.md index b01c674e..78eb4ca6 100644 --- a/apps/spfx-cli/README.md +++ b/apps/spfx-cli/README.md @@ -142,6 +142,14 @@ Templates are fetched at runtime from the [SharePoint/spfx](https://github.com/S | `ace-generic-primarytext-card` | Generic primary text card | | `ace-search-card` | Search card | +### Copilot Components + +| Name | Description | +|------|-------------| +| `copilot-component-minimal` | Bare-bones Copilot Component, no UI framework | +| `copilot-component-noframework` | No-framework Copilot Component (HTML/CSS) with theming and localization | +| `copilot-component-react` | React-based Copilot Component using Fluent UI, Microsoft Graph, and SharePoint REST | + ### Other | Name | Description | diff --git a/common/changes/@microsoft/spfx-cli/add-copilot-component-template_2026-06-03.json b/common/changes/@microsoft/spfx-cli/add-copilot-component-template_2026-06-03.json new file mode 100644 index 00000000..a0a328ef --- /dev/null +++ b/common/changes/@microsoft/spfx-cli/add-copilot-component-template_2026-06-03.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@microsoft/spfx-cli", + "comment": "", + "type": "none" + } + ], + "packageName": "@microsoft/spfx-cli" +} diff --git a/common/config/rush/common-versions.json b/common/config/rush/common-versions.json index d3ee1dbf..cebfc8bb 100644 --- a/common/config/rush/common-versions.json +++ b/common/config/rush/common-versions.json @@ -78,6 +78,17 @@ "eslint": [ // Used by templates and examples for now "8.57.1" - ] + ], + // The copilot component templates track a newer SPFx line than the other + // templates (see templates/copilot-component-*). Allow their SPFx package + // versions in addition to the repo's usual version. + "@microsoft/eslint-config-spfx": ["1.24.0-beta.2"], + "@microsoft/eslint-plugin-spfx": ["1.24.0-beta.2"], + "@microsoft/sp-lodash-subset": ["1.24.0-beta.2"], + "@microsoft/sp-module-interfaces": ["1.24.0-beta.2"], + "@microsoft/spfx-web-build-rig": ["1.24.0-beta.2"], + // Copilot component templates use zod 3.x (required by zod-to-json-schema), + // whereas the CLI tooling uses zod 4.x. + "zod": ["3.24.1"] } } diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index b901ebca..25130ad3 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -105,13 +105,13 @@ importers: dependencies: '@microsoft/sp-adaptive-card-extension-base': specifier: 1.23.2 - version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) + version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@microsoft/sp-core-library': specifier: 1.23.2 version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@microsoft/sp-property-pane': specifier: 1.23.2 - version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(scheduler@0.20.2) + version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45) tslib: specifier: 2.3.1 version: 2.3.1 @@ -154,13 +154,13 @@ importers: dependencies: '@microsoft/sp-adaptive-card-extension-base': specifier: 1.23.2 - version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) + version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@microsoft/sp-core-library': specifier: 1.23.2 version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@microsoft/sp-property-pane': specifier: 1.23.2 - version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(scheduler@0.20.2) + version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45) tslib: specifier: 2.3.1 version: 2.3.1 @@ -203,13 +203,13 @@ importers: dependencies: '@microsoft/sp-adaptive-card-extension-base': specifier: 1.23.2 - version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) + version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@microsoft/sp-core-library': specifier: 1.23.2 version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@microsoft/sp-property-pane': specifier: 1.23.2 - version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(scheduler@0.20.2) + version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45) tslib: specifier: 2.3.1 version: 2.3.1 @@ -252,13 +252,13 @@ importers: dependencies: '@microsoft/sp-adaptive-card-extension-base': specifier: 1.23.2 - version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) + version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@microsoft/sp-core-library': specifier: 1.23.2 version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@microsoft/sp-property-pane': specifier: 1.23.2 - version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(scheduler@0.20.2) + version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45) tslib: specifier: 2.3.1 version: 2.3.1 @@ -301,13 +301,13 @@ importers: dependencies: '@microsoft/sp-adaptive-card-extension-base': specifier: 1.23.2 - version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) + version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@microsoft/sp-core-library': specifier: 1.23.2 version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@microsoft/sp-property-pane': specifier: 1.23.2 - version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(scheduler@0.20.2) + version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45) tslib: specifier: 2.3.1 version: 2.3.1 @@ -346,6 +346,183 @@ importers: specifier: ~5.8.3 version: 5.8.3 + ../../examples/copilot-component-minimal: + dependencies: + '@microsoft/sp-copilot-component': + specifier: 1.24.0-beta.2 + version: 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + tslib: + specifier: 2.3.1 + version: 2.3.1 + zod: + specifier: 3.24.1 + version: 3.24.1 + zod-to-json-schema: + specifier: 3.24.1 + version: 3.24.1(zod@3.24.1) + devDependencies: + '@microsoft/eslint-config-spfx': + specifier: 1.24.0-beta.2 + version: 1.24.0-beta.2(eslint@8.57.1)(typescript@5.8.3) + '@microsoft/eslint-plugin-spfx': + specifier: 1.24.0-beta.2 + version: 1.24.0-beta.2(eslint@8.57.1)(typescript@5.8.3) + '@microsoft/sp-module-interfaces': + specifier: 1.24.0-beta.2 + version: 1.24.0-beta.2(@types/node@22.19.13) + '@microsoft/spfx-web-build-rig': + specifier: 1.24.0-beta.2 + version: 1.24.0-beta.2(@types/node@22.19.13)(jest-environment-node@30.3.0)(zod@3.24.1) + '@rushstack/eslint-config': + specifier: 4.6.4 + version: 4.6.4(eslint@8.57.1)(typescript@5.8.3) + '@rushstack/heft': + specifier: ^1.2.19 + version: 1.2.19(@types/node@22.19.13) + '@types/jest': + specifier: ~30.0.0 + version: 30.0.0 + '@types/webpack-env': + specifier: ~1.15.2 + version: 1.15.3 + '@typescript-eslint/parser': + specifier: 8.48.1 + version: 8.48.1(eslint@8.57.1)(typescript@5.8.3) + eslint: + specifier: 8.57.1 + version: 8.57.1 + typescript: + specifier: ~5.8.3 + version: 5.8.3 + + ../../examples/copilot-component-noframework: + dependencies: + '@microsoft/sp-copilot-component': + specifier: 1.24.0-beta.2 + version: 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-lodash-subset': + specifier: 1.24.0-beta.2 + version: 1.24.0-beta.2 + tslib: + specifier: 2.3.1 + version: 2.3.1 + zod: + specifier: 3.24.1 + version: 3.24.1 + zod-to-json-schema: + specifier: 3.24.1 + version: 3.24.1(zod@3.24.1) + devDependencies: + '@microsoft/eslint-config-spfx': + specifier: 1.24.0-beta.2 + version: 1.24.0-beta.2(eslint@8.57.1)(typescript@5.8.3) + '@microsoft/eslint-plugin-spfx': + specifier: 1.24.0-beta.2 + version: 1.24.0-beta.2(eslint@8.57.1)(typescript@5.8.3) + '@microsoft/sp-module-interfaces': + specifier: 1.24.0-beta.2 + version: 1.24.0-beta.2(@types/node@22.19.13) + '@microsoft/spfx-web-build-rig': + specifier: 1.24.0-beta.2 + version: 1.24.0-beta.2(@types/node@22.19.13)(jest-environment-node@30.3.0)(zod@3.24.1) + '@rushstack/eslint-config': + specifier: 4.6.4 + version: 4.6.4(eslint@8.57.1)(typescript@5.8.3) + '@rushstack/heft': + specifier: ^1.2.19 + version: 1.2.19(@types/node@22.19.13) + '@types/jest': + specifier: ~30.0.0 + version: 30.0.0 + '@types/webpack-env': + specifier: ~1.15.2 + version: 1.15.3 + '@typescript-eslint/parser': + specifier: 8.48.1 + version: 8.48.1(eslint@8.57.1)(typescript@5.8.3) + eslint: + specifier: 8.57.1 + version: 8.57.1 + typescript: + specifier: ~5.8.3 + version: 5.8.3 + + ../../examples/copilot-component-react: + dependencies: + '@fluentui/react-components': + specifier: ^9.70.0 + version: 9.73.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) + '@fluentui/react-icons': + specifier: 2.0.314 + version: 2.0.314(react@17.0.1) + '@microsoft/sp-copilot-component': + specifier: 1.24.0-beta.2 + version: 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-http': + specifier: 1.24.0-beta.2 + version: 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + react: + specifier: 17.0.1 + version: 17.0.1 + react-dom: + specifier: 17.0.1 + version: 17.0.1(react@17.0.1) + tslib: + specifier: 2.3.1 + version: 2.3.1 + zod: + specifier: 3.24.1 + version: 3.24.1 + zod-to-json-schema: + specifier: 3.24.1 + version: 3.24.1(zod@3.24.1) + devDependencies: + '@microsoft/eslint-config-spfx': + specifier: 1.24.0-beta.2 + version: 1.24.0-beta.2(eslint@8.57.1)(typescript@5.8.3) + '@microsoft/eslint-plugin-spfx': + specifier: 1.24.0-beta.2 + version: 1.24.0-beta.2(eslint@8.57.1)(typescript@5.8.3) + '@microsoft/sp-module-interfaces': + specifier: 1.24.0-beta.2 + version: 1.24.0-beta.2(@types/node@22.19.13) + '@microsoft/spfx-web-build-rig': + specifier: 1.24.0-beta.2 + version: 1.24.0-beta.2(@types/node@22.19.13)(jest-environment-node@30.3.0)(zod@3.24.1) + '@rushstack/eslint-config': + specifier: 4.6.4 + version: 4.6.4(eslint@8.57.1)(typescript@5.8.3) + '@rushstack/heft': + specifier: ^1.2.19 + version: 1.2.19(@types/node@22.19.13) + '@types/jest': + specifier: ~30.0.0 + version: 30.0.0 + '@types/react': + specifier: 17.0.45 + version: 17.0.45 + '@types/react-dom': + specifier: 17.0.17 + version: 17.0.17 + '@types/webpack-env': + specifier: ~1.15.2 + version: 1.15.3 + '@typescript-eslint/parser': + specifier: 8.48.1 + version: 8.48.1(eslint@8.57.1)(typescript@5.8.3) + eslint: + specifier: 8.57.1 + version: 8.57.1 + eslint-plugin-react: + specifier: ^7.35.0 + version: 7.37.5(eslint@8.57.1) + eslint-plugin-react-hooks: + specifier: ^4.6.2 + version: 4.6.2(eslint@8.57.1) + typescript: + specifier: ~5.8.3 + version: 5.8.3 + ../../examples/extension-application-customizer: dependencies: '@microsoft/decorators': @@ -359,7 +536,7 @@ importers: version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@microsoft/sp-dialog': specifier: 1.23.2 - version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(scheduler@0.20.2) + version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45) tslib: specifier: 2.3.1 version: 2.3.1 @@ -707,7 +884,7 @@ importers: version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@microsoft/sp-dialog': specifier: 1.23.2 - version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(scheduler@0.20.2) + version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45) '@microsoft/sp-listview-extensibility': specifier: 1.23.2 version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -854,10 +1031,10 @@ importers: version: 1.23.2 '@microsoft/sp-property-pane': specifier: 1.23.2 - version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(scheduler@0.20.2) + version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45) '@microsoft/sp-webpart-base': specifier: 1.23.2 - version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(scheduler@0.20.2) + version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45) tslib: specifier: 2.3.1 version: 2.3.1 @@ -912,10 +1089,10 @@ importers: version: 1.23.2 '@microsoft/sp-property-pane': specifier: 1.23.2 - version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(scheduler@0.20.2) + version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45) '@microsoft/sp-webpart-base': specifier: 1.23.2 - version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(scheduler@0.20.2) + version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45) tslib: specifier: 2.3.1 version: 2.3.1 @@ -973,10 +1150,10 @@ importers: version: 1.23.2 '@microsoft/sp-property-pane': specifier: 1.23.2 - version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(scheduler@0.20.2) + version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45) '@microsoft/sp-webpart-base': specifier: 1.23.2 - version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(scheduler@0.20.2) + version: 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45) react: specifier: 17.0.1 version: 17.0.1 @@ -1689,11 +1866,6 @@ packages: peerDependencies: react: '>=16.8.0 <20.0.0' - '@fluentui/react-icons@2.0.320': - resolution: {integrity: sha512-NU4gErPeaTD/T6Z9g3Uvp898lIFS6fDLr3++vpT8pcI4Ds0fZqQdrwNi3dF0R/SVws8DXQaRYiGlPHxszo4J4g==} - peerDependencies: - react: '>=16.8.0 <20.0.0' - '@fluentui/react-image@9.3.15': resolution: {integrity: sha512-k8ftGUc5G3Hj5W9nOFnWEKZ1oXmoZE3EvAEdyI6Cn9R8E6zW2PZ1+cug0p6rr01JCDG8kbry1LAITcObMrlPdw==} peerDependencies: @@ -2111,6 +2283,12 @@ packages: '@griffel/style-types@1.3.0': resolution: {integrity: sha512-bHwD3sUE84Xwv4dH011gOKe1jul77M1S6ZFN9Tnq8pvZ48UMdY//vtES6fv7GRS5wXYT4iqxQPBluAiYAfkpmw==} + '@hono/node-server@1.19.17': + resolution: {integrity: sha512-dSneS5qhiauZWGDCeK4o695Xd9nUNjviSZCMQrj10eetr8Uln1ucn6bbphOM6UynAMMtNIzZNSpL9vnASJwrPQ==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -2165,6 +2343,16 @@ packages: resolution: {integrity: sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/environment-jsdom-abstract@30.3.0': + resolution: {integrity: sha512-0hNFs5N6We3DMCwobzI0ydhkY10sT1tZSC0AAiy+0g2Dt/qEWgrcV5BrMxPczhe41cxW4qm6X+jqZaUdpZIajA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + jsdom: '*' + peerDependenciesMeta: + canvas: + optional: true + '@jest/environment-jsdom-abstract@30.4.1': resolution: {integrity: sha512-dSlKrqug3siYNHVnjwIldShY12wAH3spwRltO/+8VOjg0X+xEq7vOs3DbBs4LRKsu7OH+NUb9kuZUNBF9Ho3TA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2436,10 +2624,17 @@ packages: resolution: {integrity: sha512-kF3GFME4lN22O5zbnXk2RP4y/4PDQdps0xKiYTipMYprkwCmmpsWLZt/N2Fkbil540cSLfJX0BW7LkHzgMVUYg==} hasBin: true + '@microsoft/api-extractor@7.58.7': + resolution: {integrity: sha512-yK6OycD46gIzLRpj6ueVUWPk1ACSpkN1LBo05gY1qPTylbWyUCanXfH7+VgkI5LJrJoRSQR5F04XuCffCXLOBw==} + hasBin: true + '@microsoft/api-extractor@7.58.9': resolution: {integrity: sha512-S2UF4yza5GoxCmf7hJQNxJNZN9ltOVuOQv8Dy+Z21aol5ERoBNMdWcQHm4MJMPPItW4H/4rZD906iaf4mUojJA==} hasBin: true + '@microsoft/app-manifest@1.1.0': + resolution: {integrity: sha512-cSB5hNCmgf24B/XJxerfnB7SlnZ2AldluZ9myxam2RDp3xT3/0T3a3yuOA/IFRdpx6vKXkBwHzJTpdz9imK+MA==} + '@microsoft/decorators@1.23.2': resolution: {integrity: sha512-/kg5AHHO9N+KWEVScbxDiAPtWxoWNBA7opUWffy6xIPqAG06VhaaqrsOl8SKrBOWTHJwkY6uFwwYH9jIp1Lpyw==} engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} @@ -2450,11 +2645,22 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + '@microsoft/eslint-config-spfx@1.24.0-beta.2': + resolution: {integrity: sha512-zfBwcRidJ02EjuXtiTSqUZMoimxCPO0ZniszaqWKJbPiqTh88/G7WdXbqqLeITKRlMMp1W4ezrvEIQF0w3wsbQ==} + engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + '@microsoft/eslint-plugin-spfx@1.23.2': resolution: {integrity: sha512-2p2oWBcc5GYAuOxycWs7FMr2nbjQudQiaHfAJe3Xu8/uzfRfRNTkl9OJ7IT/ak4mVA1GTmXnzf5Al68vXUcTRA==} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + '@microsoft/eslint-plugin-spfx@1.24.0-beta.2': + resolution: {integrity: sha512-DyHY9S9QAznUzX/3nuhxyIleV4ZA3PmelVpRpeDqXQi0Uidu/Kxle5mQL/ACmF36mqyro7yZbg64405XR0A18g==} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + '@microsoft/load-themed-styles@1.10.292': resolution: {integrity: sha512-LQWGImtpv2zHKIPySLalR1aFXumXfOq8UuJvR15mIZRKXIoM+KuN9wZq+ved2FyeuePjQSJGOxYynxtCLLwDBA==} @@ -2494,6 +2700,14 @@ packages: resolution: {integrity: sha512-Lf9spLXg5xgRscVgEOp3ElXs5l0WdHfOOwc9hp9/HfNuF0Bc0GFvMB6MhdlI86SJFXS2uzh44/L3EjGoN4C00w==} engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + '@microsoft/sp-component-base@1.24.0-beta.2': + resolution: {integrity: sha512-uYDusD0T4eJo6OKXdtnVtMbabKhIXHVOkxenoDvYWpQGBoPJMrehknDeWRVAaFGCdueW9uAZi1jnixDUdGHzxQ==} + engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + + '@microsoft/sp-copilot-component@1.24.0-beta.2': + resolution: {integrity: sha512-ldI0wHnP/h0Z/mfS5+8OqztYC6NL5P2Exwy+t5k7mvaMR6h33OoRQ/TCeORvS2PRaAqSZkYnFd097JqFbIVPOw==} + engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + '@microsoft/sp-core-library@1.23.2': resolution: {integrity: sha512-N6rg+9MNQ6a9LS3/hMZhB5CNJQn1INHcwoXNIrIclObCxnCswh7Zcxb0UM1NnU2SvnX2cp+kmx4+G89YiAqpJA==} engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} @@ -2503,15 +2717,33 @@ packages: react: '>=16.13.1 <18.0.0' react-dom: '>=16.13.1 <18.0.0' + '@microsoft/sp-core-library@1.24.0-beta.2': + resolution: {integrity: sha512-J9BkeYtmap8BppRg4gJDDZdeV4ZCZutRxpQqTZkKXzM3Kqv2m7RysMN2DiZrjbCzORthH71IRQikmWxx6WhYiw==} + engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + peerDependencies: + '@types/react': '>=16.9.51 <18.0.0' + '@types/react-dom': '>=16.9.8 <18.0.0' + react: '>=16.13.1 <18.0.0' + react-dom: '>=16.13.1 <18.0.0' + '@microsoft/sp-css-loader@1.23.2': resolution: {integrity: sha512-oy+A5AGlvR7DhNRYrrSzPHKx7uEFTz8t/mlmI0ecoxPpxaGyhLClazM0SJRkNiLpVF3GhQPlguz76EcIiriEHA==} peerDependencies: webpack: ^5.88.1 + '@microsoft/sp-css-loader@1.24.0-beta.2': + resolution: {integrity: sha512-8ay6C663e/zbMwVohnWOPUr+hWdkZ2X2Isdxp1AqwVmpDxqxaaIQCDOivz+dW0eXVJwUDahK0kB1AdPGn+YIBg==} + peerDependencies: + webpack: ^5.88.1 + '@microsoft/sp-diagnostics@1.23.2': resolution: {integrity: sha512-pMhyLhsbxcWJhfDVG9rNd03Mo/Z6rcRNC6V+lRrNT/yJDOEf/Uz0jr3u8kgATFByC7YBDeCTKK0HxWCJe5L7Jw==} engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + '@microsoft/sp-diagnostics@1.24.0-beta.2': + resolution: {integrity: sha512-Dz1F087eJlPA14ym6k8qQxDjlISvUT1p75/4qoSnLzhDk2iFSV51Ou3UpVAFVJIFjGl5FlWY6pRLn+FvyVxODw==} + engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + '@microsoft/sp-dialog@1.23.2': resolution: {integrity: sha512-0gd11fxwHdiFnxlWdX5ln1jFR4wheeqVZkE+kJdhL3c+WLX/mXqLuqrJlUa7JI/tIlG/PdKDmDZNzH5Xb6zrNg==} engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} @@ -2523,6 +2755,10 @@ packages: resolution: {integrity: sha512-1DE3TPXilqeI8kJaK8AL/IE0W4+dhOfeTQMAl7tbwvCzmghUg+cLFDP1WGtWohgvPbjYxK36A0fsX1EJOmINfg==} engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + '@microsoft/sp-dynamic-data@1.24.0-beta.2': + resolution: {integrity: sha512-QhZNpnNjVYFBJZriuY9F5U2DhmMxzLsGqpOcq7l8wWt+uUrfjKt43UHVMCfEiKrZgwyN54CLk9StKCaN6Ycjyg==} + engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + '@microsoft/sp-extension-base@1.23.2': resolution: {integrity: sha512-hwWuiJBssqowurfvJJm93251VwIe/a0kTHV7fS7fjYPC4GZagUtMt7aeqaxEDPlAir5nObdVUzXAQGAU3WH/+g==} engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} @@ -2530,13 +2766,23 @@ packages: '@microsoft/sp-http-base@1.23.2': resolution: {integrity: sha512-BhWlpvkCOT84lNow1BRM3xWjDNDOWWjL9okvkazsta10OXb86tD+ri7iazWjsHbKqMIVJRNu201c8XhMTskMxQ==} + '@microsoft/sp-http-base@1.24.0-beta.2': + resolution: {integrity: sha512-DgaI1QxzxkcDf34amXar7r9h75fDMNoV/naUumzIC2pCFDTo11rQbThVpvrw0WRUQ8qoFMrMicxBLDRPVgVgTA==} + '@microsoft/sp-http-msgraph@1.23.2': resolution: {integrity: sha512-j8DM6KJCQIVvpTz+xE24vDppw/OROjbBGMXQt3yeYnvisDUkyecfRo0UJFMTroPBDV++CqMFpe4vDxQYqngXtQ==} + '@microsoft/sp-http-msgraph@1.24.0-beta.2': + resolution: {integrity: sha512-N5HErvEgBtA4uGghZVMJ6tuAP032p8yV1sq/ggmK6J91mLIjkozo5wyPZItWq1qo52lj2KoFXGyTVfu5GBZl9A==} + '@microsoft/sp-http@1.23.2': resolution: {integrity: sha512-KmiTd4TbQ02qlVg6yQs0KJZYM0lVxNHCKi/XGOd8Lk1ZUEcmwsIp7VCQdalbOp1PCRjcQrVIrV/Z5nB12nNa7w==} engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + '@microsoft/sp-http@1.24.0-beta.2': + resolution: {integrity: sha512-t3lJ+PSI0SIqINZLy5XErQqrfz5Eabs4O+Zdltt/anzifVN/fucZ/q7qZ0cRG7UP3vXqzTIVeNjYNGZLD8+0RQ==} + engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + '@microsoft/sp-image-helper@1.23.2': resolution: {integrity: sha512-486KmVrgiOgZU9I+joY2Xk2tKeVbKPSn252zenBu7xSdM6Y0TMbm+1foDszKlQwCJY2mVm+Gn3KGR7Jl7VBzjA==} engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} @@ -2557,18 +2803,37 @@ packages: '@types/react': '>=16.9.51 <18.0.0' '@types/react-dom': '>=16.9.8 <18.0.0' + '@microsoft/sp-loader@1.24.0-beta.2': + resolution: {integrity: sha512-lsWIoeC7cHjmd1Qtv+bhRx3X81mKbMZG27I2bsPJJEJYUskByXsjAu3tFZd1MO9X09wC9nvwL9RW5DebO33+Og==} + engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + peerDependencies: + '@types/react': '>=16.9.51 <18.0.0' + '@types/react-dom': '>=16.9.8 <18.0.0' + '@microsoft/sp-lodash-subset@1.23.2': resolution: {integrity: sha512-Sg0pb+xSi4U/kx4v3RGEBd7J+62NrRpqQIh42tUH7Y8xT4ng+cpo7VSmv6W0oMyNceQ6QcOEodX4NOiTPOrtcQ==} engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + '@microsoft/sp-lodash-subset@1.24.0-beta.2': + resolution: {integrity: sha512-97kEk+T+pCatT8HKxPp1u2fnK892SvMJ99wZUpoCHNW5wrGSmiEUJ/OosVTPqY+UdC3m7ocvxRrbLY63WNLzaA==} + engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + '@microsoft/sp-module-interfaces@1.23.2': resolution: {integrity: sha512-kRU0szy5VgnynUZIseNYQDKIg04gkKvus02aAy9o9vHpbilh3G8NRSHBQ+7Honww7aZy3xfp9QPF7dbT0YRRdg==} engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + '@microsoft/sp-module-interfaces@1.24.0-beta.2': + resolution: {integrity: sha512-bW6l27yFIx9YfKRxuIAAtQnqhItVrJIUiqyfMBrqficeERMQKXSUVEmZx8/JsuhpBEdsHqNYYAs7yr6K+1BaFQ==} + engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + '@microsoft/sp-odata-types@1.23.2': resolution: {integrity: sha512-sYFuXHMoEApj/rZP47kWkXxklNx1CbkYR/ISindiaI8aNRAiawUraFwr8ytFNISG6hf3jfNaWsot3SjrKxVChw==} engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + '@microsoft/sp-odata-types@1.24.0-beta.2': + resolution: {integrity: sha512-LbU3DAdWflFGz3Op6pBvcmO2HR2FtoM/fZf71H+pGhYezH6SV5v39ergxak21jfgD0+QZTXc2tZmroQgYq3s1Q==} + engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + '@microsoft/sp-office-ui-fabric-core@1.23.2': resolution: {integrity: sha512-I3kt7G8hWU+0yBhjaUcwIXOQ15L15jLaJ/jmChqB+CzoBQvQ5YHwoJqth/BIoP6yIadCCh2b6zrtGOfs1xZfaQ==} engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} @@ -2577,6 +2842,10 @@ packages: resolution: {integrity: sha512-RTOJAonPdn25ysb1vn6e+dmcyaIXWWHMEXdZZI9STv4Mze8uXn4gRK00TYZN34MyFDInLqg/3q4zrRmre6wJsg==} engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + '@microsoft/sp-page-context@1.24.0-beta.2': + resolution: {integrity: sha512-3MskM+jOx0ZLSV+66Y/kFhD4b2enu0bU2f/Ur5l6CHGxOxEx1wG12WTTrNPfK+qXYuFVD2mboONQ10UWsMQfaw==} + engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} + '@microsoft/sp-property-pane@1.23.2': resolution: {integrity: sha512-cRNtzYfolPa63d+5xW/KPlwtV8xjjKbYaHqWd9Mgtmz+/R6Gwpg2KEbhg8YvyU5JX3DwikEMfR8Fd22xsvkB6g==} engines: {node: '>=18.17.1 <19.0.0 || >=22.14.0 < 23.0.0'} @@ -2603,18 +2872,39 @@ packages: peerDependencies: '@rushstack/heft': ^1.1.5 + '@microsoft/spfx-heft-plugins@1.24.0-beta.2': + resolution: {integrity: sha512-eOAakOuMOOm4OK+I3PXRVwsoZpE+3cc0Z8MN8yf3EMpjJ122XRlN9gPjpcLiQ3Iv+HbxZ0pL7w4MyKuk+NhDVg==} + peerDependencies: + '@rushstack/heft': ^1.1.5 + '@microsoft/spfx-web-build-rig@1.23.2': resolution: {integrity: sha512-jr3g/MWnyJqXzT3qBk3NqG0Zhn5+iumXcfujJ0yBmk+ivds5C4ZgPp5aptF+2fpiTMO9nckGwnOfGE96h8xdCQ==} + '@microsoft/spfx-web-build-rig@1.24.0-beta.2': + resolution: {integrity: sha512-6uJQ/7sL7/h2tj6ZRgRPUocdY3lpHJhyjAMfvstq4GNMruwDpufKZJdU5c/ruiNJDkwlMqwrm55Erh7JsqR01A==} + '@microsoft/teams-js@2.36.0': resolution: {integrity: sha512-Ufib7QLYxyYS1BB9Za3Mh71+v34b9LOWGjaUlILwjEY9ux5Pez1zmgE1OMobnqUaMf53E8H4SoOnWQOVenOdHQ==} + '@microsoft/teams-js@2.53.0': + resolution: {integrity: sha512-uGtWZM4HscQUEeYeujtFDE9/XkjSQ1fUvuh7rvOS/19KzXtd9IhS5Eri9rsKJ9Jvp6AbMlWi3l7u5hSgrUDDpQ==} + '@microsoft/tsdoc-config@0.18.1': resolution: {integrity: sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==} '@microsoft/tsdoc@0.16.0': resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} + '@modelcontextprotocol/sdk@1.29.0': + resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + '@napi-rs/wasm-runtime@1.1.6': resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} peerDependencies: @@ -2745,6 +3035,9 @@ packages: '@rushstack/debug-certificate-manager@1.7.13': resolution: {integrity: sha512-8g7aCcv+jeIzFEWd4l3EuyTr/yr090UDKphe3OKcypCm7uBKkxtXcmMZQQu7ysAQXFzkHxSM4v/52UvtXZos3A==} + '@rushstack/debug-certificate-manager@1.7.18': + resolution: {integrity: sha512-Dp93F39EwLQTDKqNWACknNwymsGsU57DIwDLbFuUlt15V2hvmDcIFjfGFT9JHEoIQy9MDpNe+VEVc/suffumGg==} + '@rushstack/debug-certificate-manager@1.7.20': resolution: {integrity: sha512-kNixLU15BzA3Bb0T6h3BFI+oJ5md1H+u68S5uYwUVIDudmYpOrYH9brUQ7sRdg70aR4vi47Snk8bkJCdWY6Vaw==} @@ -2790,6 +3083,11 @@ packages: peerDependencies: '@rushstack/heft': ^1.2.12 + '@rushstack/heft-dev-cert-plugin@1.1.18': + resolution: {integrity: sha512-6XEOXd+q8ErrDp1efkbgdSNCLpIAWdxm+LwwiwfRm1Pz4OL8JX4W+k6zT52wolPyvuhT7nZx+EmMD+lbaHxB7Q==} + peerDependencies: + '@rushstack/heft': ^1.2.17 + '@rushstack/heft-jest-plugin@2.0.6': resolution: {integrity: sha512-EVb1dDeTYDtU8yR2J482wW93ElgXbY/gFZfmEcAZMzizCrKWAsRE1tzBYlST1wmEge2QUzTvmXJ2+C2BE+oAGQ==} peerDependencies: @@ -2820,6 +3118,11 @@ packages: jest-environment-node: optional: true + '@rushstack/heft-lint-plugin@1.2.17': + resolution: {integrity: sha512-1b/UbXhT+PajTjUCM2gaHlc6M9H8BIfdpCKHz5KnXtgBTYBw3pHGVy2wDS9DmHDbYYM5eJ6Y5gaVE2oCFWQftw==} + peerDependencies: + '@rushstack/heft': 1.2.17 + '@rushstack/heft-lint-plugin@1.2.19': resolution: {integrity: sha512-aW/8d33ZI0uGQbNdbNJRo9/d5NinajpoqqnsNpkWtT3Wp8wC6WZIAvn73fEaN+0ocXp20kdjjKX3F7YBH0/hMQ==} peerDependencies: @@ -2840,11 +3143,21 @@ packages: peerDependencies: '@rushstack/heft': ^1.2.17 + '@rushstack/heft-static-asset-typings-plugin@0.1.13': + resolution: {integrity: sha512-PwXsrN3N+qjPcLGOGVJEuWGoAg0jLBB1b2wXvneKlhLBAT6Ml5OgUSsqo9h67JWAvBKoiXHSoX1a9lnlKPeLJw==} + peerDependencies: + '@rushstack/heft': ^1.2.17 + '@rushstack/heft-static-asset-typings-plugin@0.1.3': resolution: {integrity: sha512-7tiYn8JY9B/Wj5SmsntHuxb9BoNyefgU695u4L8YqZBrTGHmmt7zSm93Xrmi3mSXTCYbMCpcSfdPGPFHzDCSwg==} peerDependencies: '@rushstack/heft': ^1.2.7 + '@rushstack/heft-typescript-plugin@1.3.12': + resolution: {integrity: sha512-SGJV8pAe6H8mkhMgG/LD7AzuVshdPDHFloP5HXUExSQ51Iws/NmLLJ8edxE3ShcmiOQqf9i+X/4XMPrTXT776Q==} + peerDependencies: + '@rushstack/heft': 1.2.17 + '@rushstack/heft-typescript-plugin@1.3.14': resolution: {integrity: sha512-iVK9sTLlItYEbzbsmzq67O3Pn2Gre4SaQlMxAKDNaMcsArvs51UwtF5sp+bG7XEh72LtW+GNV7fJGCUUUVa1tA==} peerDependencies: @@ -2861,6 +3174,12 @@ packages: '@rushstack/heft': ^1.2.9 webpack: ^5.82.1 + '@rushstack/heft-webpack5-plugin@1.3.18': + resolution: {integrity: sha512-M6F8/sl99I49k+/MhuEA/DRTboro8BsjXu8Vzq2d8SFJQDTgb5Q21UdPOYYUzB4/HlDPQNUM/G7mdnJ16oA9pA==} + peerDependencies: + '@rushstack/heft': ^1.2.17 + webpack: ^5.82.1 + '@rushstack/heft-webpack5-plugin@1.3.20': resolution: {integrity: sha512-8ogMz9KQsuFCpYykx5k7dM94VOyZO1JnSiLAUyCzPQ0o/yqeSPMSe/O3/I0U64fg3MQPD/QvIVUKQZx2InmKZg==} peerDependencies: @@ -2877,9 +3196,15 @@ packages: engines: {node: '>=10.13.0'} hasBin: true + '@rushstack/loader-raw-script@1.6.17': + resolution: {integrity: sha512-LlMNsqg82kpb0K3X1eZqNqVmHdh52K/zfqpNWgI0eykXmrkMb6qq2uATy7YUFXkZlVVvh8C8fL9s2HcAIs/BTw==} + '@rushstack/loader-raw-script@1.6.7': resolution: {integrity: sha512-jlWGpMrFVxxp4inbAYf6ZTtOyiaAk33ewalX++6PulLDXfxZH3hzF69dG/z2HAGX88ElTHlWpsjGi71IbsqKaA==} + '@rushstack/localization-utilities@0.15.17': + resolution: {integrity: sha512-GHNeA1xGdJ65kxSasyifKDNp3D3NcAURlCZ3l5G2BLuKXqropKtzocPyksinDMYlyboAVn1C989Pu7A6qtE0EA==} + '@rushstack/localization-utilities@0.15.7': resolution: {integrity: sha512-09H26Kley/1bCoc4tcLQjZ2rTh1AZzQ7nO6za+Qrfr5gzB63cVMZjOt6sYvslpOZwfTuZCTv7OMst5zKAPvm4g==} @@ -2891,6 +3216,14 @@ packages: '@types/node': optional: true + '@rushstack/module-minifier@0.9.19': + resolution: {integrity: sha512-r3io3UW/ZuQWfW2dRkcetZrUITicrFiZU2Uw/OjPW6J931LTckm0nZ6bAVYEMz05mGhOPaWTGn/ee6XczpJkew==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + '@rushstack/node-core-library@5.20.3': resolution: {integrity: sha512-95JgEPq2k7tHxhF9/OJnnyHDXfC9cLhhta0An/6MlkDsX2A6dTzDrTUG18vx4vjc280V0fi0xDH9iQczpSuWsw==} peerDependencies: @@ -2945,6 +3278,15 @@ packages: '@rushstack/rig-package@0.7.3': resolution: {integrity: sha512-aAA518n6wxxjCfnTAOjQnm7ngNE0FVHxHAw2pxKlIhxrMn0XQjGcXKF0oKWpjBgJOmsaJpVob/v+zr3zxgPWuA==} + '@rushstack/set-webpack-public-path-plugin@5.3.18': + resolution: {integrity: sha512-0fgaMNj0hzQJEwD/90kXUXJse9hzSaC+uwQ5euyrpCI7elbAcvn3Xpz3/2USrY5XOlo+0PwTjAuVFoVRCDA8xA==} + peerDependencies: + '@types/node': '*' + webpack: ^5.68.0 + peerDependenciesMeta: + '@types/node': + optional: true + '@rushstack/set-webpack-public-path-plugin@5.3.8': resolution: {integrity: sha512-7UhFaO0KHQpscpZUkBvqjGy+OGO7REogNW1YpYsq5PJsQx+5DLQS/1qREER3EZc1xKXPvk8BB9NCxP2Yyhy6Aw==} peerDependencies: @@ -2998,6 +3340,14 @@ packages: '@rushstack/ts-command-line@5.3.9': resolution: {integrity: sha512-GIHqU+sRGQ3LGWAZu1O+9Yh++qwtyNIIGuNbcWHJjBTm2qRez0cwINUHZ+pQLR8UuzZDcMajrDaNbUYoaL/XtQ==} + '@rushstack/typings-generator@0.16.17': + resolution: {integrity: sha512-MUjd+U3KcojLaI5OAscbWULmmTR9IiQJcdCrAIIwlKn/+5rgEEbKkXXSLfRbp9CoKbdNLkvRpjxSoryoSc3huQ==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + '@rushstack/typings-generator@0.16.7': resolution: {integrity: sha512-EHhjGBS+hYEmkW+USMGY+jsG2U25wYGO44EK7Bb/IF8KarTLUhleHfvmuNzLpuPPU910BBhsaREt9Q7xoRAasQ==} peerDependencies: @@ -3006,6 +3356,17 @@ packages: '@types/node': optional: true + '@rushstack/webpack-plugin-utilities@0.6.18': + resolution: {integrity: sha512-KnsGf5sjtTC+rW8xUmjIBjOARjDy15QSY9Vkxlp5QE90/5SzUGazZPpQ54pnMdG6q+iQqr9I/8zCsHvuEzqEFw==} + peerDependencies: + '@types/webpack': ^4.39.8 + webpack: ^5.35.1 || ^4.31.0 + peerDependenciesMeta: + '@types/webpack': + optional: true + webpack: + optional: true + '@rushstack/webpack-plugin-utilities@0.6.8': resolution: {integrity: sha512-AYzrMO9lMIZLM5pt9D4Kp79QKDD3JqGQl6sBO2IP8qpcgN7UCKa7uWBmxPjgy1dyEOCy0mRkO7Y+OFvNimpwcQ==} peerDependencies: @@ -3021,6 +3382,15 @@ packages: resolution: {integrity: sha512-qRlB492Bwi1bqnu5oHCTjYi1H2BMb5CxEL70Tw4YGKxVTilEwhccGwptIvgqI2yEvparqeAZJKQLZJC7QM1qVg==} engines: {node: '>=10.17.1'} + '@rushstack/webpack5-localization-plugin@0.16.17': + resolution: {integrity: sha512-cGEcprJJ0AeXZGFujuE2SAzYQ0KItXbkwZlaQEc5D14lkT0n+sP5wkIpADB0AQX9ZI7GnDs3C2l2nm/3PUbxoA==} + peerDependencies: + '@types/node': '*' + webpack: ^5.68.0 + peerDependenciesMeta: + '@types/node': + optional: true + '@rushstack/webpack5-localization-plugin@0.16.7': resolution: {integrity: sha512-l1loIp5reKCOwgpAvqpZAu1fsoMbhvdhVJsVvPA1LKbe7afORBITXsRR1tRjLDpTq5bQF7LYclzx8KVHbMhH8Q==} peerDependencies: @@ -3030,6 +3400,17 @@ packages: '@types/node': optional: true + '@rushstack/webpack5-module-minifier-plugin@5.8.19': + resolution: {integrity: sha512-t2MxAlEaVEtli4MhObmn6tR4MwHiTITBaTu0xRZaxm1eFQYtVNCizgXvGBJOr4vMOkaPAUTJgGtoxiyULgxcFw==} + engines: {node: '>=14.19.0'} + peerDependencies: + '@rushstack/module-minifier': '*' + '@types/node': '*' + webpack: ^5.68.0 + peerDependenciesMeta: + '@types/node': + optional: true + '@rushstack/webpack5-module-minifier-plugin@5.8.8': resolution: {integrity: sha512-9SqmcUPuNUzg3sBSKzwT7LMglUCJmLjdBq67PyRw9v4qAwn1ucf+xZhVSDxVFbbdpWlu4Lk1/9hGW4kZub6CRQ==} engines: {node: '>=14.19.0'} @@ -3049,6 +3430,14 @@ packages: '@types/node': optional: true + '@rushstack/worker-pool@0.7.17': + resolution: {integrity: sha512-LfjucEzJEWf4ve4xD8xkJTGRnkqtuY9Onz5aapaj7NXnmdUUI7WL2JelUkhmXY47FvzsQxU9M+FsQXk8PXhP1g==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + '@rushstack/worker-pool@0.7.7': resolution: {integrity: sha512-B8uRKeYvtUQkdno1TTvp86DWcV98JOy/qf0KPr9hKfzi/l4B0hM2ES/tR+ae9dX5z1vX9AEy60n7yyrsQh3YUA==} peerDependencies: @@ -3123,6 +3512,9 @@ packages: '@types/express@4.17.25': resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} @@ -3147,9 +3539,15 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/json-schema@7.0.6': + resolution: {integrity: sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==} + '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + '@types/lodash@4.14.117': resolution: {integrity: sha512-xyf2m6tRbz8qQKcxYZa7PA4SllYcay+eh25DN3jmNYY6gSTL7Htc/bttVdkqj2wfJGbeWlQiX8pIyJpKU+tubw==} @@ -3210,6 +3608,10 @@ packages: '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@types/strip-bom@4.0.1': + resolution: {integrity: sha512-d3RZcMmYRuL5f+jG5YM5ISs9z/HCwI2xjqXxhLon54dlpBWfVLVStOFTalO7UcX7RXaIJ6oylqOTg3Cbu6zU1Q==} + deprecated: This is a stub types definition. strip-bom provides its own type definitions, so you do not need this installed. + '@types/tapable@1.0.6': resolution: {integrity: sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==} @@ -3499,6 +3901,10 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + acorn-import-phases@1.0.4: resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} engines: {node: '>=10.13.0'} @@ -3723,6 +4129,10 @@ packages: resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@2.3.0: + resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} + engines: {node: '>=18'} + bonjour-service@1.3.0: resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} @@ -3898,16 +4308,28 @@ packages: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} + engines: {node: '>=18'} + content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + content-type@2.0.0: + resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} + engines: {node: '>=18'} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} cookie-signature@1.0.7: resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + cookie@0.7.2: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} @@ -3986,6 +4408,10 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} @@ -4373,6 +4799,14 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + eventsource-parser@3.1.0: + resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -4385,10 +4819,20 @@ packages: resolution: {integrity: sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + express-rate-limit@8.6.1: + resolution: {integrity: sha512-0D493aP61w0TJ2A0wy27riRsO7FMQ7FK+KUHOKCSfPvYo0R55aiC6emCVgFUeShH0fq0ICPVzNcgoS+BsbXQCA==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + express@4.22.1: resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} engines: {node: '>= 0.10.0'} + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} + fast-content-type-parse@3.0.0: resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} @@ -4438,6 +4882,10 @@ packages: picomatch: optional: true + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -4457,6 +4905,10 @@ packages: resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} engines: {node: '>= 0.8'} + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -4493,6 +4945,10 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -4504,6 +4960,10 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + fs-extra@11.3.4: resolution: {integrity: sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==} engines: {node: '>=14.14'} @@ -4639,6 +5099,10 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hono@4.12.32: + resolution: {integrity: sha512-XcuyW9qE2kJn07PkecMOBd5Vq/hMy7mmGw+idz1yblbg9N17ijJODrvPkn7/dwL3Kulj8LcRJ69DLOWf91dRUg==} + engines: {node: '>=16.9.0'} + hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} @@ -4711,6 +5175,10 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} + icss-utils@5.1.0: resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} @@ -4758,6 +5226,10 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} + ip-address@10.3.1: + resolution: {integrity: sha512-1e9d3kb97NHJTIJDZW9rKqW2h6+dFa50Dy0fpPSMQp2ADje5gvKsXmdiK6dwY5t76TaTt5+P5N1Y/LoToIxP6g==} + engines: {node: '>= 12'} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -4874,6 +5346,9 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -5001,6 +5476,15 @@ packages: resolution: {integrity: sha512-V8eMndg/aZ+3LnCJgSm13IxS5XSBM22QSZc9BtPK8Dek6pm+hfUNfwBdvsB3d342bo1q7wnSkC38zjX259qZNA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-environment-jsdom@30.3.0: + resolution: {integrity: sha512-RLEOJy6ip1lpw0yqJ8tB3i88FC7VBz7i00Zvl2qF71IdxjS98gC9/0SPWYIBVXHm5hgCYK0PAlSlnHGGy9RoMg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + jest-environment-jsdom@30.4.1: resolution: {integrity: sha512-o3nfaN4zej7qgk2X0j8Jhq/S9nAVKs2xK3QeQxeHVvpkEPxaA1yxDGydR+iVI7zPy7Cp62Aq2h3Ja46QvfWHGA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -5130,6 +5614,9 @@ packages: jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + jose@6.2.5: + resolution: {integrity: sha512-2E5L2yRp03FnwreJLJX8/r7mHiZICCf8kG7fAsTWkSQTDAcc46NIZoQLKy+EJ8sPoJlxyS4OQR5H70LjIZZlIQ==} + js-md4@0.3.2: resolution: {integrity: sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==} @@ -5178,6 +5665,9 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -5316,6 +5806,10 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + media-typer@1.1.1: + resolution: {integrity: sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==} + engines: {node: '>= 0.8'} + memfs@4.12.0: resolution: {integrity: sha512-74wDsex5tQDSClVkeK1vtxqYCAgCoXxx+K4NSHzgU/muYVYByFqa+0RnrPO9NM6naWm1+G9JmZ0p6QHhXmeYfA==} engines: {node: '>= 4.0.0'} @@ -5326,6 +5820,10 @@ packages: merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -5441,12 +5939,21 @@ packages: resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + node-exports-info@1.6.0: resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} engines: {node: '>= 0.4'} @@ -5460,6 +5967,10 @@ packages: encoding: optional: true + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-forge@1.4.0: resolution: {integrity: sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==} engines: {node: '>= 6.13.0'} @@ -5632,6 +6143,9 @@ packages: path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -5647,6 +6161,10 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + pkijs@3.3.3: resolution: {integrity: sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==} engines: {node: '>=16.0.0'} @@ -5911,6 +6429,10 @@ packages: resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==} engines: {node: '>=0.6'} + qs@6.15.3: + resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} + engines: {node: '>=0.6'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -5922,6 +6444,10 @@ packages: resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} engines: {node: '>= 0.8'} + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + raw-loader@0.5.1: resolution: {integrity: sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==} @@ -6015,6 +6541,10 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} @@ -6217,6 +6747,10 @@ packages: resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} engines: {node: '>= 0.8.0'} + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + serialize-javascript@7.0.5: resolution: {integrity: sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==} engines: {node: '>=20.0.0'} @@ -6229,6 +6763,10 @@ packages: resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} engines: {node: '>= 0.8.0'} + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -6268,6 +6806,10 @@ packages: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + side-channel-map@1.0.1: resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} engines: {node: '>= 0.4'} @@ -6280,6 +6822,10 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -6424,6 +6970,10 @@ packages: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} + strip-bom@5.0.0: + resolution: {integrity: sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A==} + engines: {node: '>=12'} + strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -6617,6 +7167,10 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -6739,6 +7293,10 @@ packages: wbuf@1.7.3: resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -6899,6 +7457,19 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zod-to-json-schema@3.24.1: + resolution: {integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==} + peerDependencies: + zod: ^3.24.1 + + zod-to-json-schema@3.25.1: + resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} + peerDependencies: + zod: ^3.25 || ^4 + + zod@3.24.1: + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} + zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} @@ -7399,7 +7970,7 @@ snapshots: dependencies: '@fluentui/react-aria': 9.17.10(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-context-selector': 9.2.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-motion': 9.13.0(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-motion-components-preview': 0.15.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -7420,7 +7991,7 @@ snapshots: dependencies: '@fluentui/react-avatar': 9.10.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) '@fluentui/react-button': 9.8.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-tabster': 9.26.13(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-theme': 9.2.1 @@ -7451,7 +8022,7 @@ snapshots: dependencies: '@fluentui/react-badge': 9.4.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-context-selector': 9.2.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-popover': 9.14.0(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) '@fluentui/react-shared-contexts': 9.26.2(@types/react@17.0.45)(react@17.0.1) @@ -7470,7 +8041,7 @@ snapshots: '@fluentui/react-badge@9.4.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': dependencies: - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-shared-contexts': 9.26.2(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-theme': 9.2.1 @@ -7486,7 +8057,7 @@ snapshots: dependencies: '@fluentui/react-aria': 9.17.10(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-button': 9.8.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-link': 9.7.4(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-shared-contexts': 9.26.2(@types/react@17.0.45)(react@17.0.1) @@ -7504,7 +8075,7 @@ snapshots: dependencies: '@fluentui/keyboard-keys': 9.0.8 '@fluentui/react-aria': 9.17.10(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-shared-contexts': 9.26.2(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-tabster': 9.26.13(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -7538,7 +8109,7 @@ snapshots: '@fluentui/react-aria': 9.17.10(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-button': 9.8.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-context-selector': 9.2.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-shared-contexts': 9.26.2(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-tabster': 9.26.13(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -7560,7 +8131,7 @@ snapshots: '@fluentui/react-checkbox@9.5.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2)': dependencies: '@fluentui/react-field': 9.4.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-label': 9.3.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-shared-contexts': 9.26.2(@types/react@17.0.45)(react@17.0.1) @@ -7600,7 +8171,7 @@ snapshots: '@fluentui/react-aria': 9.17.10(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-context-selector': 9.2.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) '@fluentui/react-field': 9.4.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-portal': 9.8.11(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-positioning': 9.22.0(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -7703,7 +8274,7 @@ snapshots: '@fluentui/keyboard-keys': 9.0.8 '@fluentui/react-aria': 9.17.10(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-context-selector': 9.2.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-motion': 9.13.0(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-motion-components-preview': 0.15.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -7757,7 +8328,7 @@ snapshots: '@fluentui/react-field@9.4.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2)': dependencies: '@fluentui/react-context-selector': 9.2.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-label': 9.3.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-shared-contexts': 9.26.2(@types/react@17.0.45)(react@17.0.1) @@ -7798,12 +8369,6 @@ snapshots: react: 17.0.1 tslib: 2.3.1 - '@fluentui/react-icons@2.0.320(react@17.0.1)': - dependencies: - '@griffel/react': 1.5.32(react@17.0.1) - react: 17.0.1 - tslib: 2.3.1 - '@fluentui/react-image@9.3.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': dependencies: '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) @@ -7819,7 +8384,7 @@ snapshots: '@fluentui/react-infobutton@9.0.0-beta.112(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2)': dependencies: - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-label': 9.3.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-popover': 9.14.0(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) @@ -7837,7 +8402,7 @@ snapshots: '@fluentui/react-infolabel@9.4.17(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2)': dependencies: - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-label': 9.3.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-popover': 9.14.0(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) @@ -7929,7 +8494,7 @@ snapshots: '@fluentui/keyboard-keys': 9.0.8 '@fluentui/react-aria': 9.17.10(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-context-selector': 9.2.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-motion': 9.13.0(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-motion-components-preview': 0.15.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -7951,7 +8516,7 @@ snapshots: '@fluentui/react-message-bar@9.6.20(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': dependencies: '@fluentui/react-button': 9.8.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-link': 9.7.4(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-motion': 9.13.0(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -7966,14 +8531,14 @@ snapshots: react: 17.0.1 react-dom: 17.0.1(react@17.0.1) - '@fluentui/react-migration-v8-v9@9.10.4(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2)': + '@fluentui/react-migration-v8-v9@9.10.4(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': dependencies: '@ctrl/tinycolor': 3.6.1 '@fluentui/fluent2-theme': 8.107.152(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react': 8.125.5(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-components': 9.73.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) '@fluentui/react-hooks': 8.10.2(@types/react@17.0.45)(react@17.0.1) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@griffel/react': 1.5.32(react@17.0.1) '@swc/helpers': 0.5.19 '@types/react': 17.0.45 @@ -8010,7 +8575,7 @@ snapshots: '@fluentui/react-context-selector': 9.2.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) '@fluentui/react-divider': 9.6.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-drawer': 9.11.5(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-motion': 9.13.0(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-motion-components-preview': 0.15.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -8134,7 +8699,7 @@ snapshots: '@fluentui/react-provider@9.22.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': dependencies: - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-shared-contexts': 9.26.2(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-tabster': 9.26.13(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -8168,7 +8733,7 @@ snapshots: '@fluentui/react-rating@9.3.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': dependencies: - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-shared-contexts': 9.26.2(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-tabster': 9.26.13(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -8183,7 +8748,7 @@ snapshots: '@fluentui/react-search@9.3.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2)': dependencies: - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-input': 9.7.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-shared-contexts': 9.26.2(@types/react@17.0.45)(react@17.0.1) @@ -8201,7 +8766,7 @@ snapshots: '@fluentui/react-select@9.4.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2)': dependencies: '@fluentui/react-field': 9.4.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-shared-contexts': 9.26.2(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-theme': 9.2.1 @@ -8259,7 +8824,7 @@ snapshots: dependencies: '@fluentui/keyboard-keys': 9.0.8 '@fluentui/react-field': 9.4.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-shared-contexts': 9.26.2(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-theme': 9.2.1 @@ -8291,7 +8856,7 @@ snapshots: dependencies: '@fluentui/react-context-selector': 9.2.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) '@fluentui/react-field': 9.4.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-shared-contexts': 9.26.2(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-tabster': 9.26.13(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -8309,7 +8874,7 @@ snapshots: '@fluentui/react-switch@9.6.0(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2)': dependencies: '@fluentui/react-field': 9.4.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-label': 9.3.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-shared-contexts': 9.26.2(@types/react@17.0.45)(react@17.0.1) @@ -8332,7 +8897,7 @@ snapshots: '@fluentui/react-avatar': 9.10.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) '@fluentui/react-checkbox': 9.5.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) '@fluentui/react-context-selector': 9.2.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-radio': 9.5.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) '@fluentui/react-shared-contexts': 9.26.2(@types/react@17.0.45)(react@17.0.1) @@ -8386,7 +8951,7 @@ snapshots: '@fluentui/react-combobox': 9.16.17(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) '@fluentui/react-context-selector': 9.2.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) '@fluentui/react-field': 9.4.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-portal': 9.8.11(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-positioning': 9.22.0(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -8409,7 +8974,7 @@ snapshots: '@fluentui/keyboard-keys': 9.0.8 '@fluentui/react-aria': 9.17.10(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-avatar': 9.10.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-shared-contexts': 9.26.2(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-tabster': 9.26.13(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -8429,7 +8994,7 @@ snapshots: '@fluentui/react-aria': 9.17.10(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-button': 9.8.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-context-selector': 9.2.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-popover': 9.14.0(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) '@fluentui/react-shared-contexts': 9.26.2(@types/react@17.0.45)(react@17.0.1) @@ -8484,7 +9049,7 @@ snapshots: dependencies: '@fluentui/keyboard-keys': 9.0.8 '@fluentui/react-aria': 9.17.10(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-motion': 9.13.0(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-motion-components-preview': 0.15.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -8545,7 +9110,7 @@ snapshots: '@fluentui/react-button': 9.8.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-checkbox': 9.5.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) '@fluentui/react-context-selector': 9.2.15(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) - '@fluentui/react-icons': 2.0.320(react@17.0.1) + '@fluentui/react-icons': 2.0.314(react@17.0.1) '@fluentui/react-jsx-runtime': 9.4.1(@types/react@17.0.45)(react@17.0.1) '@fluentui/react-motion': 9.13.0(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-motion-components-preview': 0.15.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -8669,6 +9234,10 @@ snapshots: dependencies: csstype: 3.2.3 + '@hono/node-server@1.19.17(hono@4.12.32)': + dependencies: + hono: 4.12.32 + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.7': @@ -8755,6 +9324,17 @@ snapshots: '@jest/diff-sequences@30.3.0': {} + '@jest/environment-jsdom-abstract@30.3.0(jsdom@26.1.0)': + dependencies: + '@jest/environment': 30.3.0 + '@jest/fake-timers': 30.3.0 + '@jest/types': 30.3.0 + '@types/jsdom': 21.1.7 + '@types/node': 22.19.13 + jest-mock: 30.3.0 + jest-util: 30.3.0 + jsdom: 26.1.0 + '@jest/environment-jsdom-abstract@30.4.1(jsdom@26.1.0)': dependencies: '@jest/environment': 30.4.1 @@ -9154,6 +9734,24 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@microsoft/api-extractor@7.58.7(@types/node@22.19.13)': + dependencies: + '@microsoft/api-extractor-model': 7.33.8(@types/node@22.19.13) + '@microsoft/tsdoc': 0.16.0 + '@microsoft/tsdoc-config': 0.18.1 + '@rushstack/node-core-library': 5.23.1(@types/node@22.19.13) + '@rushstack/rig-package': 0.7.3 + '@rushstack/terminal': 0.24.0(@types/node@22.19.13) + '@rushstack/ts-command-line': 5.3.9(@types/node@22.19.13) + diff: 8.0.3 + minimatch: 10.2.3 + resolve: 1.22.11 + semver: 7.7.4 + source-map: 0.6.1 + typescript: 5.9.3 + transitivePeerDependencies: + - '@types/node' + '@microsoft/api-extractor@7.58.9(@types/node@22.19.13)': dependencies: '@microsoft/api-extractor-model': 7.33.8(@types/node@22.19.13) @@ -9172,6 +9770,16 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@microsoft/app-manifest@1.1.0': + dependencies: + '@types/fs-extra': 11.0.4 + '@types/strip-bom': 4.0.1 + ajv: 8.18.0 + ajv-draft-04: 1.0.0(ajv@8.18.0) + ajv-formats: 3.0.1 + node-fetch: 3.3.2 + strip-bom: 5.0.0 + '@microsoft/decorators@1.23.2': dependencies: '@swc/helpers': 0.5.19 @@ -9193,6 +9801,22 @@ snapshots: - supports-color - typescript + '@microsoft/eslint-config-spfx@1.24.0-beta.2(eslint@8.57.1)(typescript@5.8.3)': + dependencies: + '@microsoft/eslint-plugin-spfx': 1.24.0-beta.2(eslint@8.57.1)(typescript@5.8.3) + '@rushstack/eslint-config': 4.6.4(eslint@8.57.1)(typescript@5.8.3) + '@rushstack/eslint-plugin': 0.23.2(eslint@8.57.1)(typescript@5.8.3) + '@rushstack/eslint-plugin-security': 0.14.2(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.56.1(@typescript-eslint/parser@8.56.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/parser': 8.56.1(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/utils': 8.56.1(eslint@8.57.1)(typescript@5.8.3) + eslint: 8.57.1 + eslint-plugin-promise: 7.2.1(eslint@8.57.1) + eslint-plugin-react-hooks: 5.2.0(eslint@8.57.1) + transitivePeerDependencies: + - supports-color + - typescript + '@microsoft/eslint-plugin-spfx@1.23.2(eslint@8.57.1)(typescript@5.8.3)': dependencies: '@rushstack/eslint-plugin': 0.23.2(eslint@8.57.1)(typescript@5.8.3) @@ -9202,6 +9826,15 @@ snapshots: - supports-color - typescript + '@microsoft/eslint-plugin-spfx@1.24.0-beta.2(eslint@8.57.1)(typescript@5.8.3)': + dependencies: + '@rushstack/eslint-plugin': 0.23.2(eslint@8.57.1)(typescript@5.8.3) + '@typescript-eslint/utils': 8.56.1(eslint@8.57.1)(typescript@5.8.3) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + '@microsoft/load-themed-styles@1.10.292': {} '@microsoft/load-themed-styles@1.10.295': {} @@ -9219,7 +9852,7 @@ snapshots: '@babel/runtime': 7.28.6 tslib: 2.3.1 - '@microsoft/sp-adaptive-card-extension-base@1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2)': + '@microsoft/sp-adaptive-card-extension-base@1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': dependencies: '@microsoft/sp-component-base': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@microsoft/sp-core-library': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -9229,7 +9862,7 @@ snapshots: '@microsoft/sp-loader': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45) '@microsoft/sp-lodash-subset': 1.23.2 '@microsoft/sp-module-interfaces': 1.23.2(@types/node@22.19.13) - '@microsoft/sp-property-pane': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(scheduler@0.20.2) + '@microsoft/sp-property-pane': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45) '@microsoft/teams-js-v2': '@microsoft/teams-js@2.36.0' '@swc/helpers': 0.5.19 adaptivecards: 2.11.2(swiper@8.4.7) @@ -9305,6 +9938,54 @@ snapshots: - stream-browserify - supports-color + '@microsoft/sp-component-base@1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': + dependencies: + '@fluentui/react': 8.125.5(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@fluentui/react-components': 9.73.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) + '@microsoft/sp-core-library': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-diagnostics': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-dynamic-data': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-http': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-lodash-subset': 1.24.0-beta.2 + '@microsoft/sp-module-interfaces': 1.24.0-beta.2(@types/node@22.19.13) + '@microsoft/sp-page-context': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@swc/helpers': 0.5.19 + scheduler: 0.20.2 + tslib: 2.3.1 + transitivePeerDependencies: + - '@azure/identity' + - '@azure/msal-browser' + - '@types/node' + - '@types/react' + - '@types/react-dom' + - buffer + - encoding + - react + - react-dom + - stream-browserify + - supports-color + + '@microsoft/sp-copilot-component@1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': + dependencies: + '@microsoft/sp-component-base': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-core-library': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-diagnostics': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-module-interfaces': 1.24.0-beta.2(@types/node@22.19.13) + '@swc/helpers': 0.5.19 + tslib: 2.3.1 + transitivePeerDependencies: + - '@azure/identity' + - '@azure/msal-browser' + - '@types/node' + - '@types/react' + - '@types/react-dom' + - buffer + - encoding + - react + - react-dom + - stream-browserify + - supports-color + '@microsoft/sp-core-library@1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': dependencies: '@microsoft/sp-module-interfaces': 1.23.2(@types/node@22.19.13) @@ -9317,6 +9998,18 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@microsoft/sp-core-library@1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': + dependencies: + '@microsoft/sp-module-interfaces': 1.24.0-beta.2(@types/node@22.19.13) + '@swc/helpers': 0.5.19 + '@types/react': 17.0.45 + '@types/react-dom': 17.0.17 + react: 17.0.1 + react-dom: 17.0.1(react@17.0.1) + tslib: 2.3.1 + transitivePeerDependencies: + - '@types/node' + '@microsoft/sp-css-loader@1.23.2(@types/node@22.19.13)(webpack@5.105.4)': dependencies: '@microsoft/load-themed-styles': 1.10.292 @@ -9335,6 +10028,24 @@ snapshots: - '@rspack/core' - '@types/node' + '@microsoft/sp-css-loader@1.24.0-beta.2(@types/node@22.19.13)(webpack@5.105.4)': + dependencies: + '@microsoft/load-themed-styles': 1.10.292 + '@rushstack/node-core-library': 5.23.1(@types/node@22.19.13) + autoprefixer: 10.4.27(postcss@8.5.16) + css-loader: 7.1.4(webpack@5.105.4) + cssnano: 5.1.15(postcss@8.5.16) + loader-utils: 3.2.2 + postcss: 8.5.16 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.16) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.16) + postcss-modules-scope: 3.2.1(postcss@8.5.16) + postcss-modules-values: 4.0.0(postcss@8.5.16) + webpack: 5.105.4 + transitivePeerDependencies: + - '@rspack/core' + - '@types/node' + '@microsoft/sp-diagnostics@1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': dependencies: '@microsoft/sp-core-library': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -9346,11 +10057,22 @@ snapshots: - react - react-dom - '@microsoft/sp-dialog@1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(scheduler@0.20.2)': + '@microsoft/sp-diagnostics@1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': + dependencies: + '@microsoft/sp-core-library': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-lodash-subset': 1.24.0-beta.2 + transitivePeerDependencies: + - '@types/node' + - '@types/react' + - '@types/react-dom' + - react + - react-dom + + '@microsoft/sp-dialog@1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)': dependencies: '@fluentui/react': 8.125.5(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-components': 9.73.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) - '@fluentui/react-migration-v8-v9': 9.10.4(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) + '@fluentui/react-migration-v8-v9': 9.10.4(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@microsoft/sp-application-base': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@microsoft/sp-core-library': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@microsoft/sp-diagnostics': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -9385,6 +10107,21 @@ snapshots: - react - react-dom + '@microsoft/sp-dynamic-data@1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': + dependencies: + '@microsoft/sp-core-library': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-diagnostics': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-lodash-subset': 1.24.0-beta.2 + '@microsoft/sp-module-interfaces': 1.24.0-beta.2(@types/node@22.19.13) + '@swc/helpers': 0.5.19 + tslib: 2.3.1 + transitivePeerDependencies: + - '@types/node' + - '@types/react' + - '@types/react-dom' + - react + - react-dom + '@microsoft/sp-extension-base@1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': dependencies: '@microsoft/sp-component-base': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -9424,6 +10161,22 @@ snapshots: - react-dom - supports-color + '@microsoft/sp-http-base@1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': + dependencies: + '@microsoft/sp-core-library': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-diagnostics': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-page-context': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/teams-js-v2': '@microsoft/teams-js@2.53.0' + '@swc/helpers': 0.5.19 + tslib: 2.3.1 + transitivePeerDependencies: + - '@types/node' + - '@types/react' + - '@types/react-dom' + - react + - react-dom + - supports-color + '@microsoft/sp-http-msgraph@1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': dependencies: '@microsoft/microsoft-graph-client': 3.0.2 @@ -9447,10 +10200,33 @@ snapshots: - stream-browserify - supports-color - '@microsoft/sp-http@1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': + '@microsoft/sp-http-msgraph@1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': dependencies: - '@microsoft/sp-core-library': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) - '@microsoft/sp-diagnostics': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/microsoft-graph-client': 3.0.2 + '@microsoft/microsoft-graph-clientv1': '@microsoft/microsoft-graph-client@1.7.2-spfx' + '@microsoft/sp-core-library': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-diagnostics': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-http-base': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-loader': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45) + '@swc/helpers': 0.5.19 + tslib: 2.3.1 + transitivePeerDependencies: + - '@azure/identity' + - '@azure/msal-browser' + - '@types/node' + - '@types/react' + - '@types/react-dom' + - buffer + - encoding + - react + - react-dom + - stream-browserify + - supports-color + + '@microsoft/sp-http@1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': + dependencies: + '@microsoft/sp-core-library': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-diagnostics': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@microsoft/sp-http-base': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@microsoft/sp-http-msgraph': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@swc/helpers': 0.5.19 @@ -9468,6 +10244,27 @@ snapshots: - stream-browserify - supports-color + '@microsoft/sp-http@1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': + dependencies: + '@microsoft/sp-core-library': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-diagnostics': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-http-base': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-http-msgraph': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@swc/helpers': 0.5.19 + tslib: 2.3.1 + transitivePeerDependencies: + - '@azure/identity' + - '@azure/msal-browser' + - '@types/node' + - '@types/react' + - '@types/react-dom' + - buffer + - encoding + - react + - react-dom + - stream-browserify + - supports-color + '@microsoft/sp-image-helper@1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': dependencies: '@microsoft/sp-core-library': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -9532,12 +10329,43 @@ snapshots: - '@types/node' - supports-color + '@microsoft/sp-loader@1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)': + dependencies: + '@fluentui/react': 8.125.5(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-core-library': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-diagnostics': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-dynamic-data': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-http-base': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-lodash-subset': 1.24.0-beta.2 + '@microsoft/sp-module-interfaces': 1.24.0-beta.2(@types/node@22.19.13) + '@microsoft/sp-odata-types': 1.24.0-beta.2 + '@microsoft/sp-page-context': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@rushstack/loader-raw-script': 1.6.17 + '@swc/helpers': 0.5.19 + '@types/react': 17.0.45 + '@types/react-dom': 17.0.17 + '@types/requirejs': 2.1.29 + raw-loader: 0.5.1 + react: 17.0.1 + react-dom: 17.0.1(react@17.0.1) + requirejs: 2.3.7 + tslib: 2.3.1 + transitivePeerDependencies: + - '@types/node' + - supports-color + '@microsoft/sp-lodash-subset@1.23.2': dependencies: '@swc/helpers': 0.5.19 '@types/lodash': 4.14.117 tslib: 2.3.1 + '@microsoft/sp-lodash-subset@1.24.0-beta.2': + dependencies: + '@swc/helpers': 0.5.19 + '@types/lodash': 4.14.117 + tslib: 2.3.1 + '@microsoft/sp-module-interfaces@1.23.2(@types/node@22.19.13)': dependencies: '@rushstack/node-core-library': 5.20.3(@types/node@22.19.13) @@ -9545,11 +10373,24 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@microsoft/sp-module-interfaces@1.24.0-beta.2(@types/node@22.19.13)': + dependencies: + '@rushstack/node-core-library': 5.23.1(@types/node@22.19.13) + '@types/json-schema': 7.0.6 + ajv: 8.18.0 + transitivePeerDependencies: + - '@types/node' + '@microsoft/sp-odata-types@1.23.2': dependencies: '@swc/helpers': 0.5.19 tslib: 2.3.1 + '@microsoft/sp-odata-types@1.24.0-beta.2': + dependencies: + '@swc/helpers': 0.5.19 + tslib: 2.3.1 + '@microsoft/sp-office-ui-fabric-core@1.23.2': dependencies: '@swc/helpers': 0.5.19 @@ -9572,7 +10413,23 @@ snapshots: - react - react-dom - '@microsoft/sp-property-pane@1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(scheduler@0.20.2)': + '@microsoft/sp-page-context@1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)': + dependencies: + '@microsoft/sp-core-library': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-diagnostics': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-dynamic-data': 1.24.0-beta.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) + '@microsoft/sp-lodash-subset': 1.24.0-beta.2 + '@microsoft/sp-odata-types': 1.24.0-beta.2 + '@swc/helpers': 0.5.19 + tslib: 2.3.1 + transitivePeerDependencies: + - '@types/node' + - '@types/react' + - '@types/react-dom' + - react + - react-dom + + '@microsoft/sp-property-pane@1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)': dependencies: '@fluentui/react': 8.125.5(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@fluentui/react-components': 9.73.2(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1)(scheduler@0.20.2) @@ -9627,7 +10484,7 @@ snapshots: dependencies: '@swc/helpers': 0.5.19 - '@microsoft/sp-webpart-base@1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(scheduler@0.20.2)': + '@microsoft/sp-webpart-base@1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)': dependencies: '@fluentui/react': 8.125.5(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) '@microsoft/sp-component-base': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) @@ -9639,7 +10496,7 @@ snapshots: '@microsoft/sp-lodash-subset': 1.23.2 '@microsoft/sp-module-interfaces': 1.23.2(@types/node@22.19.13) '@microsoft/sp-page-context': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(react-dom@17.0.1(react@17.0.1))(react@17.0.1) - '@microsoft/sp-property-pane': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45)(scheduler@0.20.2) + '@microsoft/sp-property-pane': 1.23.2(@types/node@22.19.13)(@types/react-dom@17.0.17)(@types/react@17.0.45) '@microsoft/sp-top-actions': 1.23.2 '@microsoft/teams-js-v2': '@microsoft/teams-js@2.36.0' '@swc/helpers': 0.5.19 @@ -9741,6 +10598,51 @@ snapshots: - uglify-js - webpack-cli + '@microsoft/spfx-heft-plugins@1.24.0-beta.2(@rushstack/heft@1.2.17(@types/node@22.19.13))(@types/node@22.19.13)(zod@3.24.1)': + dependencies: + '@azure/storage-blob': 12.26.0 + '@microsoft/app-manifest': 1.1.0 + '@microsoft/sp-css-loader': 1.24.0-beta.2(@types/node@22.19.13)(webpack@5.105.4) + '@microsoft/sp-module-interfaces': 1.24.0-beta.2(@types/node@22.19.13) + '@modelcontextprotocol/sdk': 1.29.0(zod@3.24.1) + '@rushstack/heft': 1.2.17(@types/node@22.19.13) + '@rushstack/heft-config-file': 0.20.10(@types/node@22.19.13) + '@rushstack/localization-utilities': 0.15.17(@types/node@22.19.13) + '@rushstack/module-minifier': 0.9.19(@types/node@22.19.13) + '@rushstack/node-core-library': 5.23.1(@types/node@22.19.13) + '@rushstack/rig-package': 0.7.3 + '@rushstack/set-webpack-public-path-plugin': 5.3.18(@types/node@22.19.13)(webpack@5.105.4) + '@rushstack/terminal': 0.24.0(@types/node@22.19.13) + '@rushstack/webpack5-localization-plugin': 0.16.17(@types/node@22.19.13)(webpack@5.105.4) + '@rushstack/webpack5-module-minifier-plugin': 5.8.19(@rushstack/module-minifier@0.9.19(@types/node@22.19.13))(@types/node@22.19.13)(webpack@5.105.4) + '@types/tapable': 1.0.6 + cors: 2.8.5 + express: 4.22.1 + fast-glob: 3.2.12 + git-repo-info: 2.1.1 + html-loader: 4.2.0(webpack@5.105.4) + jszip: 3.8.0 + lodash: 4.18.1 + mime: 2.5.2 + resolve: 1.17.0 + source-map: 0.6.1 + source-map-loader: 4.0.2(webpack@5.105.4) + tapable: 1.1.3 + uuid: 9.0.1 + webpack: 5.105.4 + xml: 1.0.1 + transitivePeerDependencies: + - '@cfworker/json-schema' + - '@rspack/core' + - '@swc/core' + - '@types/node' + - '@types/webpack' + - esbuild + - supports-color + - uglify-js + - webpack-cli + - zod + '@microsoft/spfx-web-build-rig@1.23.2(@types/node@22.19.13)(jest-environment-node@30.3.0)': dependencies: '@microsoft/api-extractor': 7.58.1(@types/node@22.19.13) @@ -9780,6 +10682,47 @@ snapshots: - utf-8-validate - webpack-cli + '@microsoft/spfx-web-build-rig@1.24.0-beta.2(@types/node@22.19.13)(jest-environment-node@30.3.0)(zod@3.24.1)': + dependencies: + '@microsoft/api-extractor': 7.58.7(@types/node@22.19.13) + '@microsoft/spfx-heft-plugins': 1.24.0-beta.2(@rushstack/heft@1.2.17(@types/node@22.19.13))(@types/node@22.19.13)(zod@3.24.1) + '@rushstack/heft': 1.2.17(@types/node@22.19.13) + '@rushstack/heft-dev-cert-plugin': 1.1.18(@rushstack/heft@1.2.17(@types/node@22.19.13))(@types/node@22.19.13) + '@rushstack/heft-jest-plugin': 2.0.6(@rushstack/heft@1.2.17(@types/node@22.19.13))(@types/jest@30.0.0)(@types/node@22.19.13)(jest-environment-jsdom@30.3.0)(jest-environment-node@30.3.0) + '@rushstack/heft-lint-plugin': 1.2.17(@rushstack/heft@1.2.17(@types/node@22.19.13))(@types/node@22.19.13) + '@rushstack/heft-sass-plugin': 1.4.1(@rushstack/heft@1.2.17(@types/node@22.19.13))(@types/node@22.19.13) + '@rushstack/heft-static-asset-typings-plugin': 0.1.13(@rushstack/heft@1.2.17(@types/node@22.19.13))(@types/node@22.19.13) + '@rushstack/heft-typescript-plugin': 1.3.12(@rushstack/heft@1.2.17(@types/node@22.19.13))(@types/node@22.19.13) + '@rushstack/heft-webpack5-plugin': 1.3.18(@rushstack/heft@1.2.17(@types/node@22.19.13))(@types/node@22.19.13)(webpack@5.105.4) + '@types/jest': 30.0.0 + '@types/webpack-env': 1.15.3 + eslint: 9.37.0 + jest-environment-jsdom: 30.3.0 + jest-junit: 12.3.0 + typescript: 5.3.3 + webpack: 5.105.4 + transitivePeerDependencies: + - '@cfworker/json-schema' + - '@rspack/core' + - '@swc/core' + - '@types/node' + - '@types/webpack' + - babel-plugin-macros + - bufferutil + - canvas + - debug + - esbuild + - esbuild-register + - jest-environment-node + - jiti + - node-notifier + - supports-color + - ts-node + - uglify-js + - utf-8-validate + - webpack-cli + - zod + '@microsoft/teams-js@2.36.0': dependencies: base64-js: 1.5.1 @@ -9787,6 +10730,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@microsoft/teams-js@2.53.0': + dependencies: + base64-js: 1.5.1 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@microsoft/tsdoc-config@0.18.1': dependencies: '@microsoft/tsdoc': 0.16.0 @@ -9796,6 +10746,28 @@ snapshots: '@microsoft/tsdoc@0.16.0': {} + '@modelcontextprotocol/sdk@1.29.0(zod@3.24.1)': + dependencies: + '@hono/node-server': 1.19.17(hono@4.12.32) + ajv: 8.18.0 + ajv-formats: 3.0.1 + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.1.0 + express: 5.2.1 + express-rate-limit: 8.6.1(express@5.2.1) + hono: 4.12.32 + jose: 6.2.5 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 3.24.1 + zod-to-json-schema: 3.25.1(zod@3.24.1) + transitivePeerDependencies: + - supports-color + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 @@ -9996,6 +10968,14 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@rushstack/debug-certificate-manager@1.7.18(@types/node@22.19.13)': + dependencies: + '@rushstack/node-core-library': 5.23.1(@types/node@22.19.13) + '@rushstack/terminal': 0.24.0(@types/node@22.19.13) + node-forge: 1.4.0 + transitivePeerDependencies: + - '@types/node' + '@rushstack/debug-certificate-manager@1.7.20(@types/node@22.19.13)': dependencies: '@rushstack/node-core-library': 5.23.1(@types/node@22.19.13) @@ -10130,6 +11110,37 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@rushstack/heft-dev-cert-plugin@1.1.18(@rushstack/heft@1.2.17(@types/node@22.19.13))(@types/node@22.19.13)': + dependencies: + '@rushstack/debug-certificate-manager': 1.7.18(@types/node@22.19.13) + '@rushstack/heft': 1.2.17(@types/node@22.19.13) + transitivePeerDependencies: + - '@types/node' + + '@rushstack/heft-jest-plugin@2.0.6(@rushstack/heft@1.2.17(@types/node@22.19.13))(@types/jest@30.0.0)(@types/node@22.19.13)(jest-environment-jsdom@30.3.0)(jest-environment-node@30.3.0)': + dependencies: + '@jest/core': 30.3.0 + '@jest/reporters': 30.3.0 + '@jest/transform': 30.3.0 + '@rushstack/heft': 1.2.17(@types/node@22.19.13) + '@rushstack/heft-config-file': 0.20.10(@types/node@22.19.13) + '@rushstack/node-core-library': 5.23.1(@types/node@22.19.13) + '@rushstack/terminal': 0.24.0(@types/node@22.19.13) + jest-config: 30.3.0(@types/node@22.19.13) + jest-resolve: 30.3.0 + jest-snapshot: 30.3.0 + optionalDependencies: + '@types/jest': 30.0.0 + jest-environment-jsdom: 30.3.0 + jest-environment-node: 30.3.0 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - node-notifier + - supports-color + - ts-node + '@rushstack/heft-jest-plugin@2.0.6(@rushstack/heft@1.2.17(@types/node@22.19.13))(@types/jest@30.0.0)(@types/node@22.19.13)(jest-environment-jsdom@30.4.1)(jest-environment-node@30.3.0)': dependencies: '@jest/core': 30.3.0 @@ -10178,6 +11189,15 @@ snapshots: - supports-color - ts-node + '@rushstack/heft-lint-plugin@1.2.17(@rushstack/heft@1.2.17(@types/node@22.19.13))(@types/node@22.19.13)': + dependencies: + '@rushstack/heft': 1.2.17(@types/node@22.19.13) + '@rushstack/node-core-library': 5.23.1(@types/node@22.19.13) + json-stable-stringify-without-jsonify: 1.0.1 + semver: 7.7.4 + transitivePeerDependencies: + - '@types/node' + '@rushstack/heft-lint-plugin@1.2.19(@rushstack/heft@1.2.19(@types/node@22.19.13))(@types/node@22.19.13)': dependencies: '@rushstack/heft': 1.2.19(@types/node@22.19.13) @@ -10231,6 +11251,16 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@rushstack/heft-static-asset-typings-plugin@0.1.13(@rushstack/heft@1.2.17(@types/node@22.19.13))(@types/node@22.19.13)': + dependencies: + '@rushstack/heft': 1.2.17(@types/node@22.19.13) + '@rushstack/heft-config-file': 0.20.10(@types/node@22.19.13) + '@rushstack/node-core-library': 5.23.1(@types/node@22.19.13) + '@rushstack/terminal': 0.24.0(@types/node@22.19.13) + '@rushstack/typings-generator': 0.16.17(@types/node@22.19.13) + transitivePeerDependencies: + - '@types/node' + '@rushstack/heft-static-asset-typings-plugin@0.1.3(@rushstack/heft@1.2.17(@types/node@22.19.13))(@types/node@22.19.13)': dependencies: '@rushstack/heft': 1.2.17(@types/node@22.19.13) @@ -10241,6 +11271,17 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@rushstack/heft-typescript-plugin@1.3.12(@rushstack/heft@1.2.17(@types/node@22.19.13))(@types/node@22.19.13)': + dependencies: + '@rushstack/heft': 1.2.17(@types/node@22.19.13) + '@rushstack/heft-config-file': 0.20.10(@types/node@22.19.13) + '@rushstack/node-core-library': 5.23.1(@types/node@22.19.13) + '@types/tapable': 1.0.6 + semver: 7.7.4 + tapable: 1.1.3 + transitivePeerDependencies: + - '@types/node' + '@rushstack/heft-typescript-plugin@1.3.14(@rushstack/heft@1.2.19(@types/node@22.19.13))(@types/node@22.19.13)': dependencies: '@rushstack/heft': 1.2.19(@types/node@22.19.13) @@ -10281,6 +11322,24 @@ snapshots: - utf-8-validate - webpack-cli + '@rushstack/heft-webpack5-plugin@1.3.18(@rushstack/heft@1.2.17(@types/node@22.19.13))(@types/node@22.19.13)(webpack@5.105.4)': + dependencies: + '@rushstack/debug-certificate-manager': 1.7.18(@types/node@22.19.13) + '@rushstack/heft': 1.2.17(@types/node@22.19.13) + '@rushstack/node-core-library': 5.23.1(@types/node@22.19.13) + '@types/tapable': 1.0.6 + tapable: 1.1.3 + watchpack: 2.4.0 + webpack: 5.105.4 + webpack-dev-server: 5.2.3(webpack@5.105.4) + transitivePeerDependencies: + - '@types/node' + - bufferutil + - debug + - supports-color + - utf-8-validate + - webpack-cli + '@rushstack/heft-webpack5-plugin@1.3.20(@rushstack/heft@1.2.19(@types/node@22.19.13))(@types/node@22.19.13)(webpack@5.105.4)': dependencies: '@rushstack/debug-certificate-manager': 1.7.20(@types/node@22.19.13) @@ -10333,10 +11392,24 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@rushstack/loader-raw-script@1.6.17': + dependencies: + loader-utils: 1.4.2 + '@rushstack/loader-raw-script@1.6.7': dependencies: loader-utils: 1.4.2 + '@rushstack/localization-utilities@0.15.17(@types/node@22.19.13)': + dependencies: + '@rushstack/node-core-library': 5.23.1(@types/node@22.19.13) + '@rushstack/terminal': 0.24.0(@types/node@22.19.13) + '@rushstack/typings-generator': 0.16.17(@types/node@22.19.13) + pseudolocale: 1.1.0 + xmldoc: 1.1.4 + transitivePeerDependencies: + - '@types/node' + '@rushstack/localization-utilities@0.15.7(@types/node@22.19.13)': dependencies: '@rushstack/node-core-library': 5.20.3(@types/node@22.19.13) @@ -10356,6 +11429,15 @@ snapshots: optionalDependencies: '@types/node': 22.19.13 + '@rushstack/module-minifier@0.9.19(@types/node@22.19.13)': + dependencies: + '@rushstack/worker-pool': 0.7.17(@types/node@22.19.13) + serialize-javascript: 7.0.5 + source-map: 0.7.6 + terser: 5.46.0 + optionalDependencies: + '@types/node': 22.19.13 + '@rushstack/node-core-library@5.20.3(@types/node@22.19.13)': dependencies: ajv: 8.18.0 @@ -10429,6 +11511,16 @@ snapshots: jju: 1.4.0 resolve: 1.22.11 + '@rushstack/set-webpack-public-path-plugin@5.3.18(@types/node@22.19.13)(webpack@5.105.4)': + dependencies: + '@rushstack/node-core-library': 5.23.1(@types/node@22.19.13) + '@rushstack/webpack-plugin-utilities': 0.6.18(webpack@5.105.4) + webpack: 5.105.4 + optionalDependencies: + '@types/node': 22.19.13 + transitivePeerDependencies: + - '@types/webpack' + '@rushstack/set-webpack-public-path-plugin@5.3.8(@types/node@22.19.13)(webpack@5.105.4)': dependencies: '@rushstack/node-core-library': 5.20.3(@types/node@22.19.13) @@ -10500,6 +11592,15 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@rushstack/typings-generator@0.16.17(@types/node@22.19.13)': + dependencies: + '@rushstack/node-core-library': 5.23.1(@types/node@22.19.13) + '@rushstack/terminal': 0.24.0(@types/node@22.19.13) + chokidar: 3.6.0 + fast-glob: 3.3.3 + optionalDependencies: + '@types/node': 22.19.13 + '@rushstack/typings-generator@0.16.7(@types/node@22.19.13)': dependencies: '@rushstack/node-core-library': 5.20.3(@types/node@22.19.13) @@ -10509,6 +11610,13 @@ snapshots: optionalDependencies: '@types/node': 22.19.13 + '@rushstack/webpack-plugin-utilities@0.6.18(webpack@5.105.4)': + dependencies: + memfs: 4.12.0 + webpack-merge: 5.8.0 + optionalDependencies: + webpack: 5.105.4 + '@rushstack/webpack-plugin-utilities@0.6.8(webpack@5.105.4)': dependencies: memfs: 4.12.0 @@ -10518,6 +11626,15 @@ snapshots: '@rushstack/webpack-preserve-dynamic-require-plugin@0.12.20': {} + '@rushstack/webpack5-localization-plugin@0.16.17(@types/node@22.19.13)(webpack@5.105.4)': + dependencies: + '@rushstack/localization-utilities': 0.15.17(@types/node@22.19.13) + '@rushstack/node-core-library': 5.23.1(@types/node@22.19.13) + '@rushstack/terminal': 0.24.0(@types/node@22.19.13) + webpack: 5.105.4 + optionalDependencies: + '@types/node': 22.19.13 + '@rushstack/webpack5-localization-plugin@0.16.7(@types/node@22.19.13)(webpack@5.105.4)': dependencies: '@rushstack/localization-utilities': 0.15.7(@types/node@22.19.13) @@ -10527,6 +11644,17 @@ snapshots: optionalDependencies: '@types/node': 22.19.13 + '@rushstack/webpack5-module-minifier-plugin@5.8.19(@rushstack/module-minifier@0.9.19(@types/node@22.19.13))(@types/node@22.19.13)(webpack@5.105.4)': + dependencies: + '@rushstack/module-minifier': 0.9.19(@types/node@22.19.13) + '@rushstack/worker-pool': 0.7.17(@types/node@22.19.13) + '@types/estree': 1.0.8 + '@types/tapable': 1.0.6 + tapable: 2.2.1 + webpack: 5.105.4 + optionalDependencies: + '@types/node': 22.19.13 + '@rushstack/webpack5-module-minifier-plugin@5.8.8(@rushstack/module-minifier@0.9.12(@types/node@22.19.13))(@types/node@22.19.13)(webpack@5.105.4)': dependencies: '@rushstack/module-minifier': 0.9.12(@types/node@22.19.13) @@ -10542,6 +11670,10 @@ snapshots: optionalDependencies: '@types/node': 22.19.13 + '@rushstack/worker-pool@0.7.17(@types/node@22.19.13)': + optionalDependencies: + '@types/node': 22.19.13 + '@rushstack/worker-pool@0.7.7(@types/node@22.19.13)': optionalDependencies: '@types/node': 22.19.13 @@ -10642,6 +11774,11 @@ snapshots: '@types/qs': 6.14.0 '@types/serve-static': 1.15.10 + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 22.19.13 + '@types/http-errors@2.0.5': {} '@types/http-proxy@1.17.17': @@ -10671,8 +11808,14 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/json-schema@7.0.6': {} + '@types/json5@0.0.29': {} + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 22.19.13 + '@types/lodash@4.14.117': {} '@types/lodash@4.17.24': {} @@ -10734,6 +11877,10 @@ snapshots: '@types/stack-utils@2.0.3': {} + '@types/strip-bom@4.0.1': + dependencies: + strip-bom: 5.0.0 + '@types/tapable@1.0.6': {} '@types/tough-cookie@4.0.5': {} @@ -11111,6 +12258,11 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.0.0 + acorn-import-phases@1.0.4(acorn@8.16.0): dependencies: acorn: 8.16.0 @@ -11274,6 +12426,15 @@ snapshots: async@3.2.6: {} + autoprefixer@10.4.27(postcss@8.5.16): + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001776 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + autoprefixer@10.4.27(postcss@8.5.8): dependencies: browserslist: 4.28.1 @@ -11375,6 +12536,20 @@ snapshots: type-is: 1.6.18 unpipe: 1.0.0 + body-parser@2.3.0: + dependencies: + bytes: 3.1.2 + content-type: 2.0.0 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + on-finished: 2.4.1 + qs: 6.15.3 + raw-body: 3.0.2 + type-is: 2.1.0 + transitivePeerDependencies: + - supports-color + bonjour-service@1.3.0: dependencies: fast-deep-equal: 3.1.3 @@ -11549,12 +12724,18 @@ snapshots: dependencies: safe-buffer: 5.2.1 + content-disposition@1.1.0: {} + content-type@1.0.5: {} + content-type@2.0.0: {} + convert-source-map@2.0.0: {} cookie-signature@1.0.7: {} + cookie-signature@1.2.2: {} + cookie@0.7.2: {} core-util-is@1.0.3: {} @@ -11570,6 +12751,10 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + css-declaration-sorter@6.4.1(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + css-declaration-sorter@6.4.1(postcss@8.5.8): dependencies: postcss: 8.5.8 @@ -11604,6 +12789,39 @@ snapshots: cssesc@3.0.0: {} + cssnano-preset-default@5.2.14(postcss@8.5.16): + dependencies: + css-declaration-sorter: 6.4.1(postcss@8.5.16) + cssnano-utils: 3.1.0(postcss@8.5.16) + postcss: 8.5.16 + postcss-calc: 8.2.4(postcss@8.5.16) + postcss-colormin: 5.3.1(postcss@8.5.16) + postcss-convert-values: 5.1.3(postcss@8.5.16) + postcss-discard-comments: 5.1.2(postcss@8.5.16) + postcss-discard-duplicates: 5.1.0(postcss@8.5.16) + postcss-discard-empty: 5.1.1(postcss@8.5.16) + postcss-discard-overridden: 5.1.0(postcss@8.5.16) + postcss-merge-longhand: 5.1.7(postcss@8.5.16) + postcss-merge-rules: 5.1.4(postcss@8.5.16) + postcss-minify-font-values: 5.1.0(postcss@8.5.16) + postcss-minify-gradients: 5.1.1(postcss@8.5.16) + postcss-minify-params: 5.1.4(postcss@8.5.16) + postcss-minify-selectors: 5.2.1(postcss@8.5.16) + postcss-normalize-charset: 5.1.0(postcss@8.5.16) + postcss-normalize-display-values: 5.1.0(postcss@8.5.16) + postcss-normalize-positions: 5.1.1(postcss@8.5.16) + postcss-normalize-repeat-style: 5.1.1(postcss@8.5.16) + postcss-normalize-string: 5.1.0(postcss@8.5.16) + postcss-normalize-timing-functions: 5.1.0(postcss@8.5.16) + postcss-normalize-unicode: 5.1.1(postcss@8.5.16) + postcss-normalize-url: 5.1.0(postcss@8.5.16) + postcss-normalize-whitespace: 5.1.1(postcss@8.5.16) + postcss-ordered-values: 5.1.3(postcss@8.5.16) + postcss-reduce-initial: 5.1.2(postcss@8.5.16) + postcss-reduce-transforms: 5.1.0(postcss@8.5.16) + postcss-svgo: 5.1.0(postcss@8.5.16) + postcss-unique-selectors: 5.1.1(postcss@8.5.16) + cssnano-preset-default@5.2.14(postcss@8.5.8): dependencies: css-declaration-sorter: 6.4.1(postcss@8.5.8) @@ -11637,10 +12855,21 @@ snapshots: postcss-svgo: 5.1.0(postcss@8.5.8) postcss-unique-selectors: 5.1.1(postcss@8.5.8) + cssnano-utils@3.1.0(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + cssnano-utils@3.1.0(postcss@8.5.8): dependencies: postcss: 8.5.8 + cssnano@5.1.15(postcss@8.5.16): + dependencies: + cssnano-preset-default: 5.2.14(postcss@8.5.16) + lilconfig: 2.1.0 + postcss: 8.5.16 + yaml: 1.10.2 + cssnano@5.1.15(postcss@8.5.8): dependencies: cssnano-preset-default: 5.2.14(postcss@8.5.8) @@ -11659,6 +12888,8 @@ snapshots: csstype@3.2.3: {} + data-uri-to-buffer@4.0.1: {} + data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 @@ -12218,6 +13449,12 @@ snapshots: events@3.3.0: {} + eventsource-parser@3.1.0: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.1.0 + execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -12241,6 +13478,14 @@ snapshots: jest-mock: 30.3.0 jest-util: 30.3.0 + express-rate-limit@8.6.1(express@5.2.1): + dependencies: + debug: 4.4.3 + express: 5.2.1 + ip-address: 10.3.1 + transitivePeerDependencies: + - supports-color + express@4.22.1: dependencies: accepts: 1.3.8 @@ -12275,6 +13520,39 @@ snapshots: utils-merge: 1.0.1 vary: 1.1.2 + express@5.2.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.3.0 + content-disposition: 1.1.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.15.3 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.1.0 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + fast-content-type-parse@3.0.0: {} fast-deep-equal@3.1.3: {} @@ -12324,6 +13602,11 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 @@ -12350,6 +13633,17 @@ snapshots: statuses: 2.0.2 unpipe: 1.0.0 + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -12384,12 +13678,18 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + forwarded@0.2.0: {} fraction.js@5.3.4: {} fresh@0.5.2: {} + fresh@2.0.0: {} + fs-extra@11.3.4: dependencies: graceful-fs: 4.2.11 @@ -12525,6 +13825,8 @@ snapshots: dependencies: function-bind: 1.1.2 + hono@4.12.32: {} + hpack.js@2.1.6: dependencies: inherits: 2.0.4 @@ -12620,6 +13922,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 + icss-utils@5.1.0(postcss@8.5.16): dependencies: postcss: 8.5.16 @@ -12660,6 +13966,8 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 + ip-address@10.3.1: {} + ipaddr.js@1.9.1: {} ipaddr.js@2.3.0: {} @@ -12761,6 +14069,8 @@ snapshots: is-potential-custom-element-name@1.0.1: {} + is-promise@4.0.0: {} + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -12955,6 +14265,16 @@ snapshots: jest-util: 30.3.0 pretty-format: 30.3.0 + jest-environment-jsdom@30.3.0: + dependencies: + '@jest/environment': 30.3.0 + '@jest/environment-jsdom-abstract': 30.3.0(jsdom@26.1.0) + jsdom: 26.1.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + jest-environment-jsdom@30.4.1: dependencies: '@jest/environment': 30.4.1 @@ -13252,6 +14572,8 @@ snapshots: jju@1.4.0: {} + jose@6.2.5: {} + js-md4@0.3.2: {} js-tokens@4.0.0: {} @@ -13306,6 +14628,8 @@ snapshots: json-schema-traverse@1.0.0: {} + json-schema-typed@8.0.2: {} + json-stable-stringify-without-jsonify@1.0.1: {} json-with-bigint@3.5.7: {} @@ -13434,6 +14758,8 @@ snapshots: media-typer@0.3.0: {} + media-typer@1.1.1: {} + memfs@4.12.0: dependencies: '@jsonjoy.com/json-pack': 1.21.0(tslib@2.3.1) @@ -13460,6 +14786,8 @@ snapshots: merge-descriptors@1.0.3: {} + merge-descriptors@2.0.0: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -13538,6 +14866,8 @@ snapshots: negotiator@0.6.4: {} + negotiator@1.0.0: {} + neo-async@2.6.2: {} no-case@3.0.4: @@ -13545,6 +14875,8 @@ snapshots: lower-case: 2.0.2 tslib: 2.3.1 + node-domexception@1.0.0: {} + node-exports-info@1.6.0: dependencies: array.prototype.flatmap: 1.3.3 @@ -13556,6 +14888,12 @@ snapshots: dependencies: whatwg-url: 5.0.0 + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-forge@1.4.0: {} node-int64@0.4.0: {} @@ -13734,6 +15072,8 @@ snapshots: path-to-regexp@0.1.12: {} + path-to-regexp@8.4.2: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -13742,6 +15082,8 @@ snapshots: pirates@4.0.7: {} + pkce-challenge@5.0.1: {} + pkijs@3.3.3: dependencies: '@noble/hashes': 1.4.0 @@ -13753,12 +15095,26 @@ snapshots: possible-typed-array-names@1.1.0: {} + postcss-calc@8.2.4(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + postcss-calc@8.2.4(postcss@8.5.8): dependencies: postcss: 8.5.8 postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 + postcss-colormin@5.3.1(postcss@8.5.16): + dependencies: + browserslist: 4.28.1 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + postcss-colormin@5.3.1(postcss@8.5.8): dependencies: browserslist: 4.28.1 @@ -13767,34 +15123,70 @@ snapshots: postcss: 8.5.8 postcss-value-parser: 4.2.0 + postcss-convert-values@5.1.3(postcss@8.5.16): + dependencies: + browserslist: 4.28.1 + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + postcss-convert-values@5.1.3(postcss@8.5.8): dependencies: browserslist: 4.28.1 postcss: 8.5.8 postcss-value-parser: 4.2.0 + postcss-discard-comments@5.1.2(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-discard-comments@5.1.2(postcss@8.5.8): dependencies: postcss: 8.5.8 + postcss-discard-duplicates@5.1.0(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-discard-duplicates@5.1.0(postcss@8.5.8): dependencies: postcss: 8.5.8 + postcss-discard-empty@5.1.1(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-discard-empty@5.1.1(postcss@8.5.8): dependencies: postcss: 8.5.8 + postcss-discard-overridden@5.1.0(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-discard-overridden@5.1.0(postcss@8.5.8): dependencies: postcss: 8.5.8 + postcss-merge-longhand@5.1.7(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + stylehacks: 5.1.1(postcss@8.5.16) + postcss-merge-longhand@5.1.7(postcss@8.5.8): dependencies: postcss: 8.5.8 postcss-value-parser: 4.2.0 stylehacks: 5.1.1(postcss@8.5.8) + postcss-merge-rules@5.1.4(postcss@8.5.16): + dependencies: + browserslist: 4.28.1 + caniuse-api: 3.0.0 + cssnano-utils: 3.1.0(postcss@8.5.16) + postcss: 8.5.16 + postcss-selector-parser: 6.1.2 + postcss-merge-rules@5.1.4(postcss@8.5.8): dependencies: browserslist: 4.28.1 @@ -13803,11 +15195,23 @@ snapshots: postcss: 8.5.8 postcss-selector-parser: 6.1.2 + postcss-minify-font-values@5.1.0(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + postcss-minify-font-values@5.1.0(postcss@8.5.8): dependencies: postcss: 8.5.8 postcss-value-parser: 4.2.0 + postcss-minify-gradients@5.1.1(postcss@8.5.16): + dependencies: + colord: 2.9.3 + cssnano-utils: 3.1.0(postcss@8.5.16) + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + postcss-minify-gradients@5.1.1(postcss@8.5.8): dependencies: colord: 2.9.3 @@ -13815,6 +15219,13 @@ snapshots: postcss: 8.5.8 postcss-value-parser: 4.2.0 + postcss-minify-params@5.1.4(postcss@8.5.16): + dependencies: + browserslist: 4.28.1 + cssnano-utils: 3.1.0(postcss@8.5.16) + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + postcss-minify-params@5.1.4(postcss@8.5.8): dependencies: browserslist: 4.28.1 @@ -13822,6 +15233,11 @@ snapshots: postcss: 8.5.8 postcss-value-parser: 4.2.0 + postcss-minify-selectors@5.2.1(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-selector-parser: 6.1.2 + postcss-minify-selectors@5.2.1(postcss@8.5.8): dependencies: postcss: 8.5.8 @@ -13881,64 +15297,127 @@ snapshots: postcss-modules-values: 4.0.0(postcss@8.5.16) string-hash: 1.1.3 + postcss-normalize-charset@5.1.0(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-normalize-charset@5.1.0(postcss@8.5.8): dependencies: postcss: 8.5.8 + postcss-normalize-display-values@5.1.0(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + postcss-normalize-display-values@5.1.0(postcss@8.5.8): dependencies: postcss: 8.5.8 postcss-value-parser: 4.2.0 + postcss-normalize-positions@5.1.1(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + postcss-normalize-positions@5.1.1(postcss@8.5.8): dependencies: postcss: 8.5.8 postcss-value-parser: 4.2.0 + postcss-normalize-repeat-style@5.1.1(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + postcss-normalize-repeat-style@5.1.1(postcss@8.5.8): dependencies: postcss: 8.5.8 postcss-value-parser: 4.2.0 + postcss-normalize-string@5.1.0(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + postcss-normalize-string@5.1.0(postcss@8.5.8): dependencies: postcss: 8.5.8 postcss-value-parser: 4.2.0 + postcss-normalize-timing-functions@5.1.0(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + postcss-normalize-timing-functions@5.1.0(postcss@8.5.8): dependencies: postcss: 8.5.8 postcss-value-parser: 4.2.0 + postcss-normalize-unicode@5.1.1(postcss@8.5.16): + dependencies: + browserslist: 4.28.1 + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + postcss-normalize-unicode@5.1.1(postcss@8.5.8): dependencies: browserslist: 4.28.1 postcss: 8.5.8 postcss-value-parser: 4.2.0 + postcss-normalize-url@5.1.0(postcss@8.5.16): + dependencies: + normalize-url: 6.1.0 + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + postcss-normalize-url@5.1.0(postcss@8.5.8): dependencies: normalize-url: 6.1.0 postcss: 8.5.8 postcss-value-parser: 4.2.0 + postcss-normalize-whitespace@5.1.1(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + postcss-normalize-whitespace@5.1.1(postcss@8.5.8): dependencies: postcss: 8.5.8 postcss-value-parser: 4.2.0 + postcss-ordered-values@5.1.3(postcss@8.5.16): + dependencies: + cssnano-utils: 3.1.0(postcss@8.5.16) + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + postcss-ordered-values@5.1.3(postcss@8.5.8): dependencies: cssnano-utils: 3.1.0(postcss@8.5.8) postcss: 8.5.8 postcss-value-parser: 4.2.0 + postcss-reduce-initial@5.1.2(postcss@8.5.16): + dependencies: + browserslist: 4.28.1 + caniuse-api: 3.0.0 + postcss: 8.5.16 + postcss-reduce-initial@5.1.2(postcss@8.5.8): dependencies: browserslist: 4.28.1 caniuse-api: 3.0.0 postcss: 8.5.8 + postcss-reduce-transforms@5.1.0(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + postcss-reduce-transforms@5.1.0(postcss@8.5.8): dependencies: postcss: 8.5.8 @@ -13954,12 +15433,23 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-svgo@5.1.0(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-value-parser: 4.2.0 + svgo: 2.8.2 + postcss-svgo@5.1.0(postcss@8.5.8): dependencies: postcss: 8.5.8 postcss-value-parser: 4.2.0 svgo: 2.8.2 + postcss-unique-selectors@5.1.1(postcss@8.5.16): + dependencies: + postcss: 8.5.16 + postcss-selector-parser: 6.1.2 + postcss-unique-selectors@5.1.1(postcss@8.5.8): dependencies: postcss: 8.5.8 @@ -14031,6 +15521,11 @@ snapshots: dependencies: side-channel: 1.1.0 + qs@6.15.3: + dependencies: + es-define-property: 1.0.1 + side-channel: 1.1.1 + queue-microtask@1.2.3: {} range-parser@1.2.1: {} @@ -14042,6 +15537,13 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + unpipe: 1.0.0 + raw-loader@0.5.1: {} react-dom@17.0.1(react@17.0.1): @@ -14143,6 +15645,16 @@ snapshots: dependencies: glob: 7.2.3 + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + rrweb-cssom@0.8.0: {} rtl-css-js@1.16.1: @@ -14325,6 +15837,22 @@ snapshots: range-parser: 1.2.1 statuses: 2.0.2 + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + serialize-javascript@7.0.5: {} serve-index@1.9.2: @@ -14344,6 +15872,15 @@ snapshots: parseurl: 1.3.3 send: 0.19.2 + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -14387,6 +15924,11 @@ snapshots: es-errors: 1.3.0 object-inspect: 1.13.4 + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-map@1.0.1: dependencies: call-bound: 1.0.4 @@ -14410,6 +15952,14 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -14582,12 +16132,20 @@ snapshots: strip-bom@4.0.0: {} + strip-bom@5.0.0: {} + strip-final-newline@2.0.0: {} strip-json-comments@3.1.1: {} strnum@2.2.0: {} + stylehacks@5.1.1(postcss@8.5.16): + dependencies: + browserslist: 4.28.1 + postcss: 8.5.16 + postcss-selector-parser: 6.1.2 + stylehacks@5.1.1(postcss@8.5.8): dependencies: browserslist: 4.28.1 @@ -14746,6 +16304,12 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 + type-is@2.1.0: + dependencies: + content-type: 2.0.0 + media-typer: 1.1.1 + mime-types: 3.0.2 + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -14893,6 +16457,8 @@ snapshots: dependencies: minimalistic-assert: 1.0.1 + web-streams-polyfill@3.3.3: {} + webidl-conversions@3.0.1: {} webidl-conversions@7.0.0: {} @@ -15103,4 +16669,14 @@ snapshots: yocto-queue@0.1.0: {} + zod-to-json-schema@3.24.1(zod@3.24.1): + dependencies: + zod: 3.24.1 + + zod-to-json-schema@3.25.1(zod@3.24.1): + dependencies: + zod: 3.24.1 + + zod@3.24.1: {} + zod@4.3.6: {} diff --git a/common/config/rush/repo-state.json b/common/config/rush/repo-state.json index 0915af95..383dc7a9 100644 --- a/common/config/rush/repo-state.json +++ b/common/config/rush/repo-state.json @@ -1,5 +1,5 @@ // DO NOT MODIFY THIS FILE MANUALLY BUT DO COMMIT IT. It is generated and used by Rush. { - "pnpmShrinkwrapHash": "701727c286bd623fa434162274e35a941a6889a1", + "pnpmShrinkwrapHash": "0b93ab9d09fb0ae272fcc80188c87dce6ea8a8d1", "preferredVersionsHash": "e0fe58342c5c916209e75bfdee56e81689af3359" } diff --git a/examples/copilot-component-minimal/.eslintrc.js b/examples/copilot-component-minimal/.eslintrc.js new file mode 100644 index 00000000..7a2d62ef --- /dev/null +++ b/examples/copilot-component-minimal/.eslintrc.js @@ -0,0 +1,318 @@ +require('@rushstack/eslint-config/patch/modern-module-resolution'); +module.exports = { + extends: ['@microsoft/eslint-config-spfx/lib/profiles/default'], + parserOptions: { tsconfigRootDir: __dirname }, + overrides: [ + { + files: ['*.ts', '*.tsx'], + parser: '@typescript-eslint/parser', + parserOptions: { + project: './tsconfig.json', + ecmaVersion: 2018, + sourceType: 'module' + }, + rules: { + // Prevent usage of the JavaScript null value, while allowing code to access existing APIs that may require null. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/no-new-null': 1, + // Require Jest module mocking APIs to be called before any other statements in their code block. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/hoist-jest-mock': 1, + // Require chunk names for dynamic imports in SPFx projects. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/import-requires-chunk-name': 1, + // Ensure that React components rendered with ReactDOM.render() are unmounted with ReactDOM.unmountComponentAtNode(). https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/pair-react-dom-render-unmount': 1, + // Require regular expressions to be constructed from string constants rather than dynamically building strings at runtime. https://www.npmjs.com/package/@rushstack/eslint-plugin-security + '@rushstack/security/no-unsafe-regexp': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/adjacent-overload-signatures': 1, + // RATIONALE: Code is more readable when the type of every variable is immediately obvious. + // Even if the compiler may be able to infer a type, this inference will be unavailable + // to a person who is reviewing a GitHub diff. This rule makes writing code harder, + // but writing code is a much less important activity than reading it. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/explicit-function-return-type': [ + 1, + { + allowExpressions: true, + allowTypedFunctionExpressions: true, + allowHigherOrderFunctions: false + } + ], + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: although this is a recommended rule, it is up to dev to select coding style. + // Set to 1 (warning) or 2 (error) to enable. + '@typescript-eslint/explicit-member-accessibility': 0, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-array-constructor': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // + // RATIONALE: The "any" keyword disables static type checking, the main benefit of using TypeScript. + // This rule should be suppressed only in very special cases such as JSON.stringify() + // where the type really can be anything. Even if the type is flexible, another type + // may be more appropriate such as "unknown", "{}", or "Record". + '@typescript-eslint/no-explicit-any': 1, + // RATIONALE: The #1 rule of promises is that every promise chain must be terminated by a catch() + // handler. Thus wherever a Promise arises, the code must either append a catch handler, + // or else return the object to a caller (who assumes this responsibility). Unterminated + // promise chains are a serious issue. Besides causing errors to be silently ignored, + // they can also cause a NodeJS process to terminate unexpectedly. + '@typescript-eslint/no-floating-promises': 2, + // RATIONALE: Catches a common coding mistake. + '@typescript-eslint/no-for-in-array': 2, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-misused-new': 2, + // RATIONALE: The "namespace" keyword is not recommended for organizing code because JavaScript lacks + // a "using" statement to traverse namespaces. Nested namespaces prevent certain bundler + // optimizations. If you are declaring loose functions/variables, it's better to make them + // static members of a class, since classes support property getters and their private + // members are accessible by unit tests. Also, the exercise of choosing a meaningful + // class name tends to produce more discoverable APIs: for example, search+replacing + // the function "reverse()" is likely to return many false matches, whereas if we always + // write "Text.reverse()" is more unique. For large scale organization, it's recommended + // to decompose your code into separate NPM packages, which ensures that component + // dependencies are tracked more conscientiously. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-namespace': [ + 1, + { + allowDeclarations: false, + allowDefinitionFiles: false + } + ], + // RATIONALE: Parameter properties provide a shorthand such as "constructor(public title: string)" + // that avoids the effort of declaring "title" as a field. This TypeScript feature makes + // code easier to write, but arguably sacrifices readability: In the notes for + // "@typescript-eslint/member-ordering" we pointed out that fields are central to + // a class's design, so we wouldn't want to bury them in a constructor signature + // just to save some typing. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Set to 1 (warning) or 2 (error) to enable the rule + '@typescript-eslint/parameter-properties': 0, + // RATIONALE: When left in shipping code, unused variables often indicate a mistake. Dead code + // may impact performance. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-unused-vars': [ + 1, + { + vars: 'all', + // Unused function arguments often indicate a mistake in JavaScript code. However in TypeScript code, + // the compiler catches most of those mistakes, and unused arguments are fairly common for type signatures + // that are overriding a base class method or implementing an interface. + args: 'none' + } + ], + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-use-before-define': [ + 2, + { + functions: false, + classes: true, + variables: true, + enums: true, + typedefs: true + } + ], + // Disallows require statements except in import statements. + // In other words, the use of forms such as var foo = require("foo") are banned. Instead use ES6 style imports or import foo = require("foo") imports. + '@typescript-eslint/no-var-requires': 'error', + // RATIONALE: The "module" keyword is deprecated except when describing legacy libraries. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/prefer-namespace-keyword': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: it's up to developer to decide if he wants to add type annotations + // Set to 1 (warning) or 2 (error) to enable the rule + '@typescript-eslint/no-inferrable-types': 0, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: declaration of empty interfaces may be helpful for generic types scenarios + '@typescript-eslint/no-empty-interface': 0, + // RATIONALE: This rule warns if setters are defined without getters, which is probably a mistake. + 'accessor-pairs': 1, + // RATIONALE: In TypeScript, if you write x["y"] instead of x.y, it disables type checking. + 'dot-notation': [ + 1, + { + allowPattern: '^_' + } + ], + // RATIONALE: Catches code that is likely to be incorrect + eqeqeq: 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'for-direction': 1, + // RATIONALE: Catches a common coding mistake. + 'guard-for-in': 2, + // RATIONALE: If you have more than 2,000 lines in a single source file, it's probably time + // to split up your code. + 'max-lines': ['warn', { max: 2000 }], + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-async-promise-executor': 2, + // RATIONALE: Deprecated language feature. + 'no-caller': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-compare-neg-zero': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-cond-assign': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-constant-condition': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-control-regex': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-debugger': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-delete-var': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-duplicate-case': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty-character-class': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty-pattern': 1, + // RATIONALE: Eval is a security concern and a performance concern. + 'no-eval': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-ex-assign': 2, + // RATIONALE: System types are global and should not be tampered with in a scalable code base. + // If two different libraries (or two versions of the same library) both try to modify + // a type, only one of them can win. Polyfills are acceptable because they implement + // a standardized interoperable contract, but polyfills are generally coded in plain + // JavaScript. + 'no-extend-native': 1, + // Disallow unnecessary labels + 'no-extra-label': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-fallthrough': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-func-assign': 1, + // RATIONALE: Catches a common coding mistake. + 'no-implied-eval': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-invalid-regexp': 2, + // RATIONALE: Catches a common coding mistake. + 'no-label-var': 2, + // RATIONALE: Eliminates redundant code. + 'no-lone-blocks': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-misleading-character-class': 2, + // RATIONALE: Catches a common coding mistake. + 'no-multi-str': 2, + // RATIONALE: It's generally a bad practice to call "new Thing()" without assigning the result to + // a variable. Either it's part of an awkward expression like "(new Thing()).doSomething()", + // or else implies that the constructor is doing nontrivial computations, which is often + // a poor class design. + 'no-new': 1, + // RATIONALE: Obsolete language feature that is deprecated. + 'no-new-func': 2, + // RATIONALE: Obsolete language feature that is deprecated. + 'no-new-object': 2, + // RATIONALE: Obsolete notation. + 'no-new-wrappers': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-octal': 2, + // RATIONALE: Catches code that is likely to be incorrect + 'no-octal-escape': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-regex-spaces': 2, + // RATIONALE: Catches a common coding mistake. + 'no-return-assign': 2, + // RATIONALE: Security risk. + 'no-script-url': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-self-assign': 2, + // RATIONALE: Catches a common coding mistake. + 'no-self-compare': 2, + // RATIONALE: This avoids statements such as "while (a = next(), a && a.length);" that use + // commas to create compound expressions. In general code is more readable if each + // step is split onto a separate line. This also makes it easier to set breakpoints + // in the debugger. + 'no-sequences': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-shadow-restricted-names': 2, + // RATIONALE: Obsolete language feature that is deprecated. + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-sparse-arrays': 2, + // RATIONALE: Although in theory JavaScript allows any possible data type to be thrown as an exception, + // such flexibility adds pointless complexity, by requiring every catch block to test + // the type of the object that it receives. Whereas if catch blocks can always assume + // that their object implements the "Error" contract, then the code is simpler, and + // we generally get useful additional information like a call stack. + 'no-throw-literal': 2, + // RATIONALE: Catches a common coding mistake. + 'no-unmodified-loop-condition': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-unsafe-finally': 2, + // RATIONALE: Catches a common coding mistake. + 'no-unused-expressions': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-unused-labels': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-useless-catch': 1, + // RATIONALE: Avoids a potential performance problem. + 'no-useless-concat': 1, + // RATIONALE: The "var" keyword is deprecated because of its confusing "hoisting" behavior. + // Always use "let" or "const" instead. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + 'no-var': 2, + // RATIONALE: Generally not needed in modern code. + 'no-void': 1, + // RATIONALE: Obsolete language feature that is deprecated. + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-with': 2, + // RATIONALE: Makes logic easier to understand, since constants always have a known value + // @typescript-eslint\eslint-plugin\dist\configs\eslint-recommended.js + 'prefer-const': 1, + // RATIONALE: Catches a common coding mistake where "resolve" and "reject" are confused. + 'promise/param-names': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'require-atomic-updates': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'require-yield': 1, + // "Use strict" is redundant when using the TypeScript compiler. + strict: [2, 'never'], + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'use-isnan': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + // Set to 1 (warning) or 2 (error) to enable. + // Rationale to disable: !!{} + 'no-extra-boolean-cast': 0, + // ==================================================================== + // @microsoft/eslint-plugin-spfx + // ==================================================================== + '@microsoft/spfx/no-require-ensure': 2 + } + }, + { + // For unit tests, we can be a little bit less strict. The settings below revise the + // defaults specified in the extended configurations, as well as above. + files: [ + // Test files + '*.test.ts', + '*.test.tsx', + '*.spec.ts', + '*.spec.tsx', + + // Facebook convention + '**/__mocks__/*.ts', + '**/__mocks__/*.tsx', + '**/__tests__/*.ts', + '**/__tests__/*.tsx', + + // Microsoft convention + '**/test/*.ts', + '**/test/*.tsx' + ], + rules: {} + } + ] +}; diff --git a/examples/copilot-component-minimal/.gitignore b/examples/copilot-component-minimal/.gitignore new file mode 100644 index 00000000..56bc0edb --- /dev/null +++ b/examples/copilot-component-minimal/.gitignore @@ -0,0 +1,34 @@ +# Logs +logs +*.log +npm-debug.log* + +# Dependency directories +node_modules + +# Build generated files +dist +lib +lib-dts +lib-commonjs +lib-esm +jest-output +release +solution +teams +temp +*.sppkg +.heft +.spfx-scaffold.jsonl + +# Coverage directory used by tools like istanbul +coverage + +# OSX +.DS_Store + +# Visual Studio files +.ntvs_analysis.dat +.vs +bin +obj diff --git a/examples/copilot-component-minimal/.npmignore b/examples/copilot-component-minimal/.npmignore new file mode 100644 index 00000000..a2378457 --- /dev/null +++ b/examples/copilot-component-minimal/.npmignore @@ -0,0 +1,32 @@ +# Ignore everything by default +** + +# Use negative patterns to bring back the specific things we want to publish +!/bin/** +!/dist/** +!/EULA/** +!/lib/** +!/lib-*/** +!ThirdPartyNotice.txt + +# Ignore certain files in the above folders +/dist/*.stats.* +/dist/**/*.map +/lib/**/*.map +/lib/**/*.test.* +/lib/**/test/** +/lib-*/**/*.map +/lib-*/**/*.test.* +/lib-*/**/test/** + +# NOTE: These don't need to be specified, because NPM includes them automatically. +# +# package.json +# README (and its variants) +# CHANGELOG (and its variants) +# LICENSE / LICENCE + +## Project specific definitions +# ----------------------------- +/lib/**/integration-test/** +/lib/scripts/** \ No newline at end of file diff --git a/examples/copilot-component-minimal/README.md b/examples/copilot-component-minimal/README.md new file mode 100644 index 00000000..3e57517f --- /dev/null +++ b/examples/copilot-component-minimal/README.md @@ -0,0 +1,67 @@ +# @spfx-template/copilot-component-minimal + +## Summary + +Short summary on functionality and used technologies. + +[picture of the solution in action, if possible] + +## Used SharePoint Framework Version + +[![version](https://img.shields.io/badge/version-1.24.0--beta.2-green.svg)](https://img.shields.io/badge/version-1.24.0--beta.2-green.svg) + +## Applies to + +- [SharePoint Framework](https://aka.ms/spfx) +- [Microsoft 365 Copilot](https://learn.microsoft.com/copilot/microsoft-365/) + +> Get your own free development tenant by subscribing to [Microsoft 365 developer program](http://aka.ms/o365devprogram) + +## Prerequisites + +> Any special pre-requisites? + +## Solution + +| Solution | Author(s) | +| ----------- | ------------------------------------------------------- | +| folder name | Author details (name, company, twitter alias with link) | + +## Version history + +| Version | Date | Comments | +| ------- | ---------------- | --------------- | +| 1.0 | January 1, 2025 | Initial release | + +## Disclaimer + +**THIS CODE IS PROVIDED _AS IS_ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.** + +--- + +## Minimal Path to Awesome + +- Clone this repository +- Ensure that you are at the solution folder +- in the command-line run: + - `npm install -g @rushstack/heft` + - `npm install` + - `heft start` + +> Include any additional steps as needed. + +Other build commands can be listed using `heft --help`. + +## Features + +This Copilot Component renders a greeting card when invoked by Microsoft 365 Copilot. + +- Demonstrates the `BaseCopilotComponent` base class +- Uses Zod for properties schema (single source of truth for TypeScript types and JSON Schema) +- Includes a declarative agent manifest for Microsoft 365 Copilot + +## References + +- [Getting started with SharePoint Framework](https://docs.microsoft.com/sharepoint/dev/spfx/set-up-your-developer-tenant) +- [Microsoft 365 Copilot extensibility](https://learn.microsoft.com/copilot/microsoft-365/extensibility/) +- [Heft Documentation](https://heft.rushstack.io/) diff --git a/examples/copilot-component-minimal/config/config.json b/examples/copilot-component-minimal/config/config.json new file mode 100644 index 00000000..7edbd266 --- /dev/null +++ b/examples/copilot-component-minimal/config/config.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/config.2.0.schema.json", + "version": "2.0", + "bundles": { + "minimal-copilot-component": { + "components": [ + { + "entrypoint": "./lib/MinimalCopilotComponent.js", + "manifest": "./src/minimal-copilot-component.manifest.json" + } + ] + } + } +} diff --git a/examples/copilot-component-minimal/config/copilot-agent.json b/examples/copilot-component-minimal/config/copilot-agent.json new file mode 100644 index 00000000..331f54c9 --- /dev/null +++ b/examples/copilot-component-minimal/config/copilot-agent.json @@ -0,0 +1,11 @@ +{ + "$schema": "../node_modules/@microsoft/spfx-heft-plugins/lib-commonjs/plugins/copilotAgentPlugin/copilot-agent.schema.json", + + "agents": [ + { + "name": { "default": "Minimal Agent" }, + "description": { "default": "Minimal CopilotComponent Description" }, + "components": ["838638c8-36e9-53b5-a8c3-37a22b55fa22"] + } + ] +} diff --git a/examples/copilot-component-minimal/config/package-solution.json b/examples/copilot-component-minimal/config/package-solution.json new file mode 100644 index 00000000..5bda43cb --- /dev/null +++ b/examples/copilot-component-minimal/config/package-solution.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/package-solution.schema.json", + "solution": { + "name": "@spfx-template/copilot-component-minimal-client-side-solution", + "id": "22222222-2222-2222-2222-222222222222", + "version": "1.0.0.0", + "includeClientSideAssets": true, + "skipFeatureDeployment": true, + "isDomainIsolated": false, + "developer": { + "name": "", + "websiteUrl": "", + "privacyUrl": "", + "termsOfUseUrl": "", + "mpnId": "Undefined-1.24.0-beta.2" + }, + "metadata": { + "shortDescription": { + "default": "Minimal CopilotComponent Description" + }, + "longDescription": { + "default": "Minimal CopilotComponent Description" + }, + "screenshotPaths": [], + "videoUrl": "", + "categories": [] + }, + "features": [ + { + "title": "@spfx-template/copilot-component-minimal Feature", + "description": "The feature that activates elements of the @spfx-template/copilot-component-minimal solution.", + "id": "0371fe5a-40d6-5183-8b37-80b9120a6ce4", + "version": "1.0.0.0" + } + ] + }, + "paths": { + "zippedPackage": "solution/@spfx-template/copilot-component-minimal.sppkg" + } +} diff --git a/examples/copilot-component-minimal/config/rig.json b/examples/copilot-component-minimal/config/rig.json new file mode 100644 index 00000000..99e34318 --- /dev/null +++ b/examples/copilot-component-minimal/config/rig.json @@ -0,0 +1,7 @@ +{ + // The "rig.json" file directs tools to look for their config files in an external package. + // Documentation for this system: https://www.npmjs.com/package/@rushstack/rig-package + "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", + + "rigPackageName": "@microsoft/spfx-web-build-rig" +} diff --git a/examples/copilot-component-minimal/config/serve.json b/examples/copilot-component-minimal/config/serve.json new file mode 100644 index 00000000..cb0f86dd --- /dev/null +++ b/examples/copilot-component-minimal/config/serve.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/spfx-serve.schema.json", + "port": 4321, + "https": true, + "initialPage": "https://{tenantDomain}/_layouts/CopilotWorkbench.aspx" +} diff --git a/examples/copilot-component-minimal/copilot/ai-plugin.json b/examples/copilot-component-minimal/copilot/ai-plugin.json new file mode 100644 index 00000000..397edbf8 --- /dev/null +++ b/examples/copilot-component-minimal/copilot/ai-plugin.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/copilot/plugin/v2.4/schema.json", + "schema_version": "v2.4", + "namespace": "minimal", + "name_for_human": "Minimal Agent", + "description_for_human": "Minimal CopilotComponent Description", + "description_for_model": "Minimal CopilotComponent Description", + "contact_email": "publisher@contoso.com" +} diff --git a/examples/copilot-component-minimal/copilot/color.png b/examples/copilot-component-minimal/copilot/color.png new file mode 100644 index 00000000..7cdf55b0 Binary files /dev/null and b/examples/copilot-component-minimal/copilot/color.png differ diff --git a/examples/copilot-component-minimal/copilot/declarativeAgent.json b/examples/copilot-component-minimal/copilot/declarativeAgent.json new file mode 100644 index 00000000..bbe66b85 --- /dev/null +++ b/examples/copilot-component-minimal/copilot/declarativeAgent.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.8/schema.json", + "version": "v1.8", + "name": "Minimal Agent", + "description": "Minimal CopilotComponent Description", + "instructions": "$[file('instruction.txt')]", + "conversation_starters": [ + { + "title": "Get started", + "text": "What can you do?" + } + ], + "actions": [ + { + "id": "minimalAction", + "file": "ai-plugin.json" + } + ] +} diff --git a/examples/copilot-component-minimal/copilot/instruction.txt b/examples/copilot-component-minimal/copilot/instruction.txt new file mode 100644 index 00000000..c193c213 --- /dev/null +++ b/examples/copilot-component-minimal/copilot/instruction.txt @@ -0,0 +1,3 @@ +You are the Minimal Agent — an SPFx CopilotComponent deployed as a Microsoft 365 Copilot declarative agent. + +When the user asks you to perform an action, call the appropriate tool. Keep responses short and helpful. diff --git a/examples/copilot-component-minimal/copilot/manifest.json b/examples/copilot-component-minimal/copilot/manifest.json new file mode 100644 index 00000000..bb8386d1 --- /dev/null +++ b/examples/copilot-component-minimal/copilot/manifest.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.29/MicrosoftTeams.schema.json", + "manifestVersion": "1.29", + "version": "1.0.0", + "id": "22222222-2222-2222-2222-222222222222", + "developer": { + "name": "Contoso", + "websiteUrl": "https://www.contoso.com", + "privacyUrl": "https://www.contoso.com/privacy", + "termsOfUseUrl": "https://www.contoso.com/terms" + }, + "icons": { + "color": "color.png", + "outline": "outline.png" + }, + "name": { + "short": "Minimal Agent", + "full": "Minimal Agent — SPFx CopilotComponent" + }, + "description": { + "short": "Minimal CopilotComponent Description", + "full": "Minimal CopilotComponent Description" + }, + "accentColor": "#FFFFFF", + "copilotAgents": { + "declarativeAgents": [ + { + "id": "minimalAgent", + "file": "declarativeAgent.json" + } + ] + }, + "permissions": ["identity"], + "validDomains": [] +} diff --git a/examples/copilot-component-minimal/copilot/outline.png b/examples/copilot-component-minimal/copilot/outline.png new file mode 100644 index 00000000..e8cb4b6b Binary files /dev/null and b/examples/copilot-component-minimal/copilot/outline.png differ diff --git a/examples/copilot-component-minimal/package.json b/examples/copilot-component-minimal/package.json new file mode 100644 index 00000000..2cc63201 --- /dev/null +++ b/examples/copilot-component-minimal/package.json @@ -0,0 +1,35 @@ +{ + "name": "@spfx-template/copilot-component-minimal", + "version": "0.0.1", + "private": true, + "engines": { + "node": ">=22.14.0 < 23.0.0" + }, + "scripts": { + "build": "heft test --clean --production && heft package-solution --production", + "start": "heft start --clean", + "clean": "heft clean", + "_phase:build": "heft run --only build -- --clean", + "_phase:test": "heft run --only test -- --clean", + "_phase:package-solution": "heft run --only package-solution -- --clean" + }, + "dependencies": { + "@microsoft/sp-copilot-component": "1.24.0-beta.2", + "tslib": "2.3.1", + "zod": "3.24.1", + "zod-to-json-schema": "3.24.1" + }, + "devDependencies": { + "@microsoft/eslint-config-spfx": "1.24.0-beta.2", + "@microsoft/eslint-plugin-spfx": "1.24.0-beta.2", + "@microsoft/sp-module-interfaces": "1.24.0-beta.2", + "@microsoft/spfx-web-build-rig": "1.24.0-beta.2", + "@rushstack/eslint-config": "4.6.4", + "@rushstack/heft": "^1.2.19", + "@types/jest": "~30.0.0", + "@types/webpack-env": "~1.15.2", + "@typescript-eslint/parser": "8.48.1", + "eslint": "8.57.1", + "typescript": "~5.8.3" + } +} diff --git a/examples/copilot-component-minimal/src/MinimalCopilotComponent.ts b/examples/copilot-component-minimal/src/MinimalCopilotComponent.ts new file mode 100644 index 00000000..2c3da1d6 --- /dev/null +++ b/examples/copilot-component-minimal/src/MinimalCopilotComponent.ts @@ -0,0 +1,9 @@ +import { BaseCopilotComponent } from '@microsoft/sp-copilot-component'; + +import type { IMinimalCopilotComponentProperties } from './MinimalProperties'; + +export default class MinimalCopilotComponent extends BaseCopilotComponent { + protected override render(): void { + this.context.domElement.textContent = this.properties.message; + } +} diff --git a/examples/copilot-component-minimal/src/MinimalProperties.ts b/examples/copilot-component-minimal/src/MinimalProperties.ts new file mode 100644 index 00000000..a375fbb2 --- /dev/null +++ b/examples/copilot-component-minimal/src/MinimalProperties.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; +import zodToJsonSchema from 'zod-to-json-schema'; + +const propertiesSchema = z.object({ + message: z.string().describe('A message to display.') +}); + +export type IMinimalCopilotComponentProperties = z.infer; + +export default zodToJsonSchema(propertiesSchema); diff --git a/examples/copilot-component-minimal/src/minimal-copilot-component.manifest.json b/examples/copilot-component-minimal/src/minimal-copilot-component.manifest.json new file mode 100644 index 00000000..eb9d7b6d --- /dev/null +++ b/examples/copilot-component-minimal/src/minimal-copilot-component.manifest.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-component-manifest.schema.json", + + "id": "838638c8-36e9-53b5-a8c3-37a22b55fa22", + "alias": "MinimalCopilotComponent", + "componentType": "CopilotComponent", + "copilotType": "Ux", + "version": "*", + "manifestVersion": 2, + + "capabilities": { + "availableDisplayModes": ["inline", "fullscreen"] + }, + + "tools": [ + { + "name": "MinimalTool", + "description": { + "default": "Minimal CopilotComponent Description" + }, + "propertiesSchema": { + "id": "$../lib/MinimalProperties.js:default;" + } + } + ] +} diff --git a/examples/copilot-component-minimal/tsconfig.json b/examples/copilot-component-minimal/tsconfig.json new file mode 100644 index 00000000..e054af28 --- /dev/null +++ b/examples/copilot-component-minimal/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "./node_modules/@microsoft/spfx-web-build-rig/profiles/default/tsconfig-base.json", + "watchOptions": { + // Prevent the TypeScript watch program from re-triggering incremental builds + // when the copilot-agent task regenerates its outputs (temp/copilot staging + // and the teams/.zip package) on every build, which otherwise causes + // an infinite build loop during `heft start` / `heft build-watch`. + "excludeDirectories": ["**/teams", "**/temp/copilot"] + } +} diff --git a/examples/copilot-component-noframework/.eslintrc.js b/examples/copilot-component-noframework/.eslintrc.js new file mode 100644 index 00000000..7a2d62ef --- /dev/null +++ b/examples/copilot-component-noframework/.eslintrc.js @@ -0,0 +1,318 @@ +require('@rushstack/eslint-config/patch/modern-module-resolution'); +module.exports = { + extends: ['@microsoft/eslint-config-spfx/lib/profiles/default'], + parserOptions: { tsconfigRootDir: __dirname }, + overrides: [ + { + files: ['*.ts', '*.tsx'], + parser: '@typescript-eslint/parser', + parserOptions: { + project: './tsconfig.json', + ecmaVersion: 2018, + sourceType: 'module' + }, + rules: { + // Prevent usage of the JavaScript null value, while allowing code to access existing APIs that may require null. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/no-new-null': 1, + // Require Jest module mocking APIs to be called before any other statements in their code block. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/hoist-jest-mock': 1, + // Require chunk names for dynamic imports in SPFx projects. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/import-requires-chunk-name': 1, + // Ensure that React components rendered with ReactDOM.render() are unmounted with ReactDOM.unmountComponentAtNode(). https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/pair-react-dom-render-unmount': 1, + // Require regular expressions to be constructed from string constants rather than dynamically building strings at runtime. https://www.npmjs.com/package/@rushstack/eslint-plugin-security + '@rushstack/security/no-unsafe-regexp': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/adjacent-overload-signatures': 1, + // RATIONALE: Code is more readable when the type of every variable is immediately obvious. + // Even if the compiler may be able to infer a type, this inference will be unavailable + // to a person who is reviewing a GitHub diff. This rule makes writing code harder, + // but writing code is a much less important activity than reading it. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/explicit-function-return-type': [ + 1, + { + allowExpressions: true, + allowTypedFunctionExpressions: true, + allowHigherOrderFunctions: false + } + ], + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: although this is a recommended rule, it is up to dev to select coding style. + // Set to 1 (warning) or 2 (error) to enable. + '@typescript-eslint/explicit-member-accessibility': 0, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-array-constructor': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // + // RATIONALE: The "any" keyword disables static type checking, the main benefit of using TypeScript. + // This rule should be suppressed only in very special cases such as JSON.stringify() + // where the type really can be anything. Even if the type is flexible, another type + // may be more appropriate such as "unknown", "{}", or "Record". + '@typescript-eslint/no-explicit-any': 1, + // RATIONALE: The #1 rule of promises is that every promise chain must be terminated by a catch() + // handler. Thus wherever a Promise arises, the code must either append a catch handler, + // or else return the object to a caller (who assumes this responsibility). Unterminated + // promise chains are a serious issue. Besides causing errors to be silently ignored, + // they can also cause a NodeJS process to terminate unexpectedly. + '@typescript-eslint/no-floating-promises': 2, + // RATIONALE: Catches a common coding mistake. + '@typescript-eslint/no-for-in-array': 2, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-misused-new': 2, + // RATIONALE: The "namespace" keyword is not recommended for organizing code because JavaScript lacks + // a "using" statement to traverse namespaces. Nested namespaces prevent certain bundler + // optimizations. If you are declaring loose functions/variables, it's better to make them + // static members of a class, since classes support property getters and their private + // members are accessible by unit tests. Also, the exercise of choosing a meaningful + // class name tends to produce more discoverable APIs: for example, search+replacing + // the function "reverse()" is likely to return many false matches, whereas if we always + // write "Text.reverse()" is more unique. For large scale organization, it's recommended + // to decompose your code into separate NPM packages, which ensures that component + // dependencies are tracked more conscientiously. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-namespace': [ + 1, + { + allowDeclarations: false, + allowDefinitionFiles: false + } + ], + // RATIONALE: Parameter properties provide a shorthand such as "constructor(public title: string)" + // that avoids the effort of declaring "title" as a field. This TypeScript feature makes + // code easier to write, but arguably sacrifices readability: In the notes for + // "@typescript-eslint/member-ordering" we pointed out that fields are central to + // a class's design, so we wouldn't want to bury them in a constructor signature + // just to save some typing. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Set to 1 (warning) or 2 (error) to enable the rule + '@typescript-eslint/parameter-properties': 0, + // RATIONALE: When left in shipping code, unused variables often indicate a mistake. Dead code + // may impact performance. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-unused-vars': [ + 1, + { + vars: 'all', + // Unused function arguments often indicate a mistake in JavaScript code. However in TypeScript code, + // the compiler catches most of those mistakes, and unused arguments are fairly common for type signatures + // that are overriding a base class method or implementing an interface. + args: 'none' + } + ], + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-use-before-define': [ + 2, + { + functions: false, + classes: true, + variables: true, + enums: true, + typedefs: true + } + ], + // Disallows require statements except in import statements. + // In other words, the use of forms such as var foo = require("foo") are banned. Instead use ES6 style imports or import foo = require("foo") imports. + '@typescript-eslint/no-var-requires': 'error', + // RATIONALE: The "module" keyword is deprecated except when describing legacy libraries. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/prefer-namespace-keyword': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: it's up to developer to decide if he wants to add type annotations + // Set to 1 (warning) or 2 (error) to enable the rule + '@typescript-eslint/no-inferrable-types': 0, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: declaration of empty interfaces may be helpful for generic types scenarios + '@typescript-eslint/no-empty-interface': 0, + // RATIONALE: This rule warns if setters are defined without getters, which is probably a mistake. + 'accessor-pairs': 1, + // RATIONALE: In TypeScript, if you write x["y"] instead of x.y, it disables type checking. + 'dot-notation': [ + 1, + { + allowPattern: '^_' + } + ], + // RATIONALE: Catches code that is likely to be incorrect + eqeqeq: 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'for-direction': 1, + // RATIONALE: Catches a common coding mistake. + 'guard-for-in': 2, + // RATIONALE: If you have more than 2,000 lines in a single source file, it's probably time + // to split up your code. + 'max-lines': ['warn', { max: 2000 }], + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-async-promise-executor': 2, + // RATIONALE: Deprecated language feature. + 'no-caller': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-compare-neg-zero': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-cond-assign': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-constant-condition': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-control-regex': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-debugger': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-delete-var': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-duplicate-case': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty-character-class': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty-pattern': 1, + // RATIONALE: Eval is a security concern and a performance concern. + 'no-eval': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-ex-assign': 2, + // RATIONALE: System types are global and should not be tampered with in a scalable code base. + // If two different libraries (or two versions of the same library) both try to modify + // a type, only one of them can win. Polyfills are acceptable because they implement + // a standardized interoperable contract, but polyfills are generally coded in plain + // JavaScript. + 'no-extend-native': 1, + // Disallow unnecessary labels + 'no-extra-label': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-fallthrough': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-func-assign': 1, + // RATIONALE: Catches a common coding mistake. + 'no-implied-eval': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-invalid-regexp': 2, + // RATIONALE: Catches a common coding mistake. + 'no-label-var': 2, + // RATIONALE: Eliminates redundant code. + 'no-lone-blocks': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-misleading-character-class': 2, + // RATIONALE: Catches a common coding mistake. + 'no-multi-str': 2, + // RATIONALE: It's generally a bad practice to call "new Thing()" without assigning the result to + // a variable. Either it's part of an awkward expression like "(new Thing()).doSomething()", + // or else implies that the constructor is doing nontrivial computations, which is often + // a poor class design. + 'no-new': 1, + // RATIONALE: Obsolete language feature that is deprecated. + 'no-new-func': 2, + // RATIONALE: Obsolete language feature that is deprecated. + 'no-new-object': 2, + // RATIONALE: Obsolete notation. + 'no-new-wrappers': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-octal': 2, + // RATIONALE: Catches code that is likely to be incorrect + 'no-octal-escape': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-regex-spaces': 2, + // RATIONALE: Catches a common coding mistake. + 'no-return-assign': 2, + // RATIONALE: Security risk. + 'no-script-url': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-self-assign': 2, + // RATIONALE: Catches a common coding mistake. + 'no-self-compare': 2, + // RATIONALE: This avoids statements such as "while (a = next(), a && a.length);" that use + // commas to create compound expressions. In general code is more readable if each + // step is split onto a separate line. This also makes it easier to set breakpoints + // in the debugger. + 'no-sequences': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-shadow-restricted-names': 2, + // RATIONALE: Obsolete language feature that is deprecated. + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-sparse-arrays': 2, + // RATIONALE: Although in theory JavaScript allows any possible data type to be thrown as an exception, + // such flexibility adds pointless complexity, by requiring every catch block to test + // the type of the object that it receives. Whereas if catch blocks can always assume + // that their object implements the "Error" contract, then the code is simpler, and + // we generally get useful additional information like a call stack. + 'no-throw-literal': 2, + // RATIONALE: Catches a common coding mistake. + 'no-unmodified-loop-condition': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-unsafe-finally': 2, + // RATIONALE: Catches a common coding mistake. + 'no-unused-expressions': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-unused-labels': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-useless-catch': 1, + // RATIONALE: Avoids a potential performance problem. + 'no-useless-concat': 1, + // RATIONALE: The "var" keyword is deprecated because of its confusing "hoisting" behavior. + // Always use "let" or "const" instead. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + 'no-var': 2, + // RATIONALE: Generally not needed in modern code. + 'no-void': 1, + // RATIONALE: Obsolete language feature that is deprecated. + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-with': 2, + // RATIONALE: Makes logic easier to understand, since constants always have a known value + // @typescript-eslint\eslint-plugin\dist\configs\eslint-recommended.js + 'prefer-const': 1, + // RATIONALE: Catches a common coding mistake where "resolve" and "reject" are confused. + 'promise/param-names': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'require-atomic-updates': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'require-yield': 1, + // "Use strict" is redundant when using the TypeScript compiler. + strict: [2, 'never'], + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'use-isnan': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + // Set to 1 (warning) or 2 (error) to enable. + // Rationale to disable: !!{} + 'no-extra-boolean-cast': 0, + // ==================================================================== + // @microsoft/eslint-plugin-spfx + // ==================================================================== + '@microsoft/spfx/no-require-ensure': 2 + } + }, + { + // For unit tests, we can be a little bit less strict. The settings below revise the + // defaults specified in the extended configurations, as well as above. + files: [ + // Test files + '*.test.ts', + '*.test.tsx', + '*.spec.ts', + '*.spec.tsx', + + // Facebook convention + '**/__mocks__/*.ts', + '**/__mocks__/*.tsx', + '**/__tests__/*.ts', + '**/__tests__/*.tsx', + + // Microsoft convention + '**/test/*.ts', + '**/test/*.tsx' + ], + rules: {} + } + ] +}; diff --git a/examples/copilot-component-noframework/.gitignore b/examples/copilot-component-noframework/.gitignore new file mode 100644 index 00000000..56bc0edb --- /dev/null +++ b/examples/copilot-component-noframework/.gitignore @@ -0,0 +1,34 @@ +# Logs +logs +*.log +npm-debug.log* + +# Dependency directories +node_modules + +# Build generated files +dist +lib +lib-dts +lib-commonjs +lib-esm +jest-output +release +solution +teams +temp +*.sppkg +.heft +.spfx-scaffold.jsonl + +# Coverage directory used by tools like istanbul +coverage + +# OSX +.DS_Store + +# Visual Studio files +.ntvs_analysis.dat +.vs +bin +obj diff --git a/examples/copilot-component-noframework/.npmignore b/examples/copilot-component-noframework/.npmignore new file mode 100644 index 00000000..a2378457 --- /dev/null +++ b/examples/copilot-component-noframework/.npmignore @@ -0,0 +1,32 @@ +# Ignore everything by default +** + +# Use negative patterns to bring back the specific things we want to publish +!/bin/** +!/dist/** +!/EULA/** +!/lib/** +!/lib-*/** +!ThirdPartyNotice.txt + +# Ignore certain files in the above folders +/dist/*.stats.* +/dist/**/*.map +/lib/**/*.map +/lib/**/*.test.* +/lib/**/test/** +/lib-*/**/*.map +/lib-*/**/*.test.* +/lib-*/**/test/** + +# NOTE: These don't need to be specified, because NPM includes them automatically. +# +# package.json +# README (and its variants) +# CHANGELOG (and its variants) +# LICENSE / LICENCE + +## Project specific definitions +# ----------------------------- +/lib/**/integration-test/** +/lib/scripts/** \ No newline at end of file diff --git a/examples/copilot-component-noframework/README.md b/examples/copilot-component-noframework/README.md new file mode 100644 index 00000000..d5b4e066 --- /dev/null +++ b/examples/copilot-component-noframework/README.md @@ -0,0 +1,67 @@ +# @spfx-template/copilot-component-noframework + +## Summary + +Short summary on functionality and used technologies. + +[picture of the solution in action, if possible] + +## Used SharePoint Framework Version + +[![version](https://img.shields.io/badge/version-1.24.0--beta.2-green.svg)](https://img.shields.io/badge/version-1.24.0--beta.2-green.svg) + +## Applies to + +- [SharePoint Framework](https://aka.ms/spfx) +- [Microsoft 365 Copilot](https://learn.microsoft.com/copilot/microsoft-365/) + +> Get your own free development tenant by subscribing to [Microsoft 365 developer program](http://aka.ms/o365devprogram) + +## Prerequisites + +> Any special pre-requisites? + +## Solution + +| Solution | Author(s) | +| ----------- | ------------------------------------------------------- | +| folder name | Author details (name, company, twitter alias with link) | + +## Version history + +| Version | Date | Comments | +| ------- | ---------------- | --------------- | +| 1.0 | January 1, 2025 | Initial release | + +## Disclaimer + +**THIS CODE IS PROVIDED _AS IS_ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.** + +--- + +## Minimal Path to Awesome + +- Clone this repository +- Ensure that you are at the solution folder +- in the command-line run: + - `npm install -g @rushstack/heft` + - `npm install` + - `heft start` + +> Include any additional steps as needed. + +Other build commands can be listed using `heft --help`. + +## Features + +This Copilot Component renders a greeting card when invoked by Microsoft 365 Copilot. + +- Demonstrates the `BaseCopilotComponent` base class +- Uses Zod for properties schema (single source of truth for TypeScript types and JSON Schema) +- Includes a declarative agent manifest for Microsoft 365 Copilot + +## References + +- [Getting started with SharePoint Framework](https://docs.microsoft.com/sharepoint/dev/spfx/set-up-your-developer-tenant) +- [Microsoft 365 Copilot extensibility](https://learn.microsoft.com/copilot/microsoft-365/extensibility/) +- [Heft Documentation](https://heft.rushstack.io/) diff --git a/examples/copilot-component-noframework/config/config.json b/examples/copilot-component-noframework/config/config.json new file mode 100644 index 00000000..bba2dc7c --- /dev/null +++ b/examples/copilot-component-noframework/config/config.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/config.2.0.schema.json", + "version": "2.0", + "bundles": { + "no-framework-copilot-component": { + "components": [ + { + "entrypoint": "./lib/NoFrameworkCopilotComponent.js", + "manifest": "./src/no-framework-copilot-component.manifest.json" + } + ] + } + }, + "externals": {}, + "localizedResources": { + "NoFrameworkCopilotComponentStrings": "lib/loc/{locale}.js" + } +} diff --git a/examples/copilot-component-noframework/config/copilot-agent.json b/examples/copilot-component-noframework/config/copilot-agent.json new file mode 100644 index 00000000..c32c16d6 --- /dev/null +++ b/examples/copilot-component-noframework/config/copilot-agent.json @@ -0,0 +1,11 @@ +{ + "$schema": "../node_modules/@microsoft/spfx-heft-plugins/lib-commonjs/plugins/copilotAgentPlugin/copilot-agent.schema.json", + + "agents": [ + { + "name": { "default": "NoFramework Agent" }, + "description": { "default": "No Framework CopilotComponent Description" }, + "components": ["883e8d4f-7073-52ba-a991-5970ff009391"] + } + ] +} diff --git a/examples/copilot-component-noframework/config/package-solution.json b/examples/copilot-component-noframework/config/package-solution.json new file mode 100644 index 00000000..38cd1ee0 --- /dev/null +++ b/examples/copilot-component-noframework/config/package-solution.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/package-solution.schema.json", + "solution": { + "name": "@spfx-template/copilot-component-noframework-client-side-solution", + "id": "22222222-2222-2222-2222-222222222222", + "version": "1.0.0.0", + "includeClientSideAssets": true, + "skipFeatureDeployment": true, + "isDomainIsolated": false, + "developer": { + "name": "", + "websiteUrl": "", + "privacyUrl": "", + "termsOfUseUrl": "", + "mpnId": "Undefined-1.24.0-beta.2" + }, + "metadata": { + "shortDescription": { + "default": "No Framework CopilotComponent Description" + }, + "longDescription": { + "default": "No Framework CopilotComponent Description" + }, + "screenshotPaths": [], + "videoUrl": "", + "categories": [] + }, + "features": [ + { + "title": "@spfx-template/copilot-component-noframework Feature", + "description": "The feature that activates elements of the @spfx-template/copilot-component-noframework solution.", + "id": "7d46331b-4f37-5bb4-8e4f-2dd9eb8717fa", + "version": "1.0.0.0" + } + ] + }, + "paths": { + "zippedPackage": "solution/@spfx-template/copilot-component-noframework.sppkg" + } +} diff --git a/examples/copilot-component-noframework/config/rig.json b/examples/copilot-component-noframework/config/rig.json new file mode 100644 index 00000000..99e34318 --- /dev/null +++ b/examples/copilot-component-noframework/config/rig.json @@ -0,0 +1,7 @@ +{ + // The "rig.json" file directs tools to look for their config files in an external package. + // Documentation for this system: https://www.npmjs.com/package/@rushstack/rig-package + "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", + + "rigPackageName": "@microsoft/spfx-web-build-rig" +} diff --git a/examples/copilot-component-noframework/config/sass.json b/examples/copilot-component-noframework/config/sass.json new file mode 100644 index 00000000..9022585d --- /dev/null +++ b/examples/copilot-component-noframework/config/sass.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/heft/v0/heft-sass-plugin.schema.json", + + "extends": "@microsoft/spfx-web-build-rig/profiles/default/config/sass.json" +} diff --git a/examples/copilot-component-noframework/config/serve.json b/examples/copilot-component-noframework/config/serve.json new file mode 100644 index 00000000..cb0f86dd --- /dev/null +++ b/examples/copilot-component-noframework/config/serve.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/spfx-serve.schema.json", + "port": 4321, + "https": true, + "initialPage": "https://{tenantDomain}/_layouts/CopilotWorkbench.aspx" +} diff --git a/examples/copilot-component-noframework/config/typescript.json b/examples/copilot-component-noframework/config/typescript.json new file mode 100644 index 00000000..f7a1069b --- /dev/null +++ b/examples/copilot-component-noframework/config/typescript.json @@ -0,0 +1,9 @@ +{ + "extends": "@microsoft/spfx-web-build-rig/profiles/default/config/typescript.json", + + "staticAssetsToCopy": { + "fileExtensions": [".resx", ".jpg", ".png", ".woff", ".eot", ".ttf", ".svg", ".gif"], + + "includeGlobs": ["loc/*.js"] + } +} diff --git a/examples/copilot-component-noframework/copilot/ai-plugin.json b/examples/copilot-component-noframework/copilot/ai-plugin.json new file mode 100644 index 00000000..6473c1a3 --- /dev/null +++ b/examples/copilot-component-noframework/copilot/ai-plugin.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/copilot/plugin/v2.4/schema.json", + "schema_version": "v2.4", + "namespace": "noFramework", + "name_for_human": "NoFramework Agent", + "description_for_human": "No Framework CopilotComponent Description", + "description_for_model": "No Framework CopilotComponent Description", + "contact_email": "publisher@contoso.com" +} diff --git a/examples/copilot-component-noframework/copilot/color.png b/examples/copilot-component-noframework/copilot/color.png new file mode 100644 index 00000000..7cdf55b0 Binary files /dev/null and b/examples/copilot-component-noframework/copilot/color.png differ diff --git a/examples/copilot-component-noframework/copilot/declarativeAgent.json b/examples/copilot-component-noframework/copilot/declarativeAgent.json new file mode 100644 index 00000000..1ee00932 --- /dev/null +++ b/examples/copilot-component-noframework/copilot/declarativeAgent.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.8/schema.json", + "version": "v1.8", + "name": "NoFramework Agent", + "description": "No Framework CopilotComponent Description", + "instructions": "$[file('instruction.txt')]", + "conversation_starters": [ + { + "title": "Get started", + "text": "What can you do?" + } + ], + "actions": [ + { + "id": "noFrameworkAction", + "file": "ai-plugin.json" + } + ] +} diff --git a/examples/copilot-component-noframework/copilot/instruction.txt b/examples/copilot-component-noframework/copilot/instruction.txt new file mode 100644 index 00000000..c142c90d --- /dev/null +++ b/examples/copilot-component-noframework/copilot/instruction.txt @@ -0,0 +1,3 @@ +You are the NoFramework Agent — an SPFx CopilotComponent deployed as a Microsoft 365 Copilot declarative agent. + +When the user asks you to perform an action, call the appropriate tool. Keep responses short and helpful. diff --git a/examples/copilot-component-noframework/copilot/manifest.json b/examples/copilot-component-noframework/copilot/manifest.json new file mode 100644 index 00000000..c1c4f158 --- /dev/null +++ b/examples/copilot-component-noframework/copilot/manifest.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.29/MicrosoftTeams.schema.json", + "manifestVersion": "1.29", + "version": "1.0.0", + "id": "22222222-2222-2222-2222-222222222222", + "developer": { + "name": "Contoso", + "websiteUrl": "https://www.contoso.com", + "privacyUrl": "https://www.contoso.com/privacy", + "termsOfUseUrl": "https://www.contoso.com/terms" + }, + "icons": { + "color": "color.png", + "outline": "outline.png" + }, + "name": { + "short": "NoFramework Agent", + "full": "NoFramework Agent — SPFx CopilotComponent" + }, + "description": { + "short": "No Framework CopilotComponent Description", + "full": "No Framework CopilotComponent Description" + }, + "accentColor": "#FFFFFF", + "copilotAgents": { + "declarativeAgents": [ + { + "id": "noFrameworkAgent", + "file": "declarativeAgent.json" + } + ] + }, + "permissions": ["identity"], + "validDomains": [] +} diff --git a/examples/copilot-component-noframework/copilot/outline.png b/examples/copilot-component-noframework/copilot/outline.png new file mode 100644 index 00000000..e8cb4b6b Binary files /dev/null and b/examples/copilot-component-noframework/copilot/outline.png differ diff --git a/examples/copilot-component-noframework/package.json b/examples/copilot-component-noframework/package.json new file mode 100644 index 00000000..08901b32 --- /dev/null +++ b/examples/copilot-component-noframework/package.json @@ -0,0 +1,36 @@ +{ + "name": "@spfx-template/copilot-component-noframework", + "version": "0.0.1", + "private": true, + "engines": { + "node": ">=22.14.0 < 23.0.0" + }, + "scripts": { + "build": "heft test --clean --production && heft package-solution --production", + "start": "heft start --clean", + "clean": "heft clean", + "_phase:build": "heft run --only build -- --clean", + "_phase:test": "heft run --only test -- --clean", + "_phase:package-solution": "heft run --only package-solution -- --clean" + }, + "dependencies": { + "@microsoft/sp-copilot-component": "1.24.0-beta.2", + "@microsoft/sp-lodash-subset": "1.24.0-beta.2", + "tslib": "2.3.1", + "zod": "3.24.1", + "zod-to-json-schema": "3.24.1" + }, + "devDependencies": { + "@microsoft/eslint-config-spfx": "1.24.0-beta.2", + "@microsoft/eslint-plugin-spfx": "1.24.0-beta.2", + "@microsoft/sp-module-interfaces": "1.24.0-beta.2", + "@microsoft/spfx-web-build-rig": "1.24.0-beta.2", + "@rushstack/eslint-config": "4.6.4", + "@rushstack/heft": "^1.2.19", + "@types/jest": "~30.0.0", + "@types/webpack-env": "~1.15.2", + "@typescript-eslint/parser": "8.48.1", + "eslint": "8.57.1", + "typescript": "~5.8.3" + } +} diff --git a/examples/copilot-component-noframework/src/NoFrameworkCopilotComponent.module.scss b/examples/copilot-component-noframework/src/NoFrameworkCopilotComponent.module.scss new file mode 100644 index 00000000..e2cf83c0 --- /dev/null +++ b/examples/copilot-component-noframework/src/NoFrameworkCopilotComponent.module.scss @@ -0,0 +1,68 @@ +.noFramework { + overflow: hidden; + padding: 12px; + color: #323130; + font-family: "Segoe UI", "Segoe UI Web (West European)", -apple-system, BlinkMacSystemFont, sans-serif; +} + +.header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 16px 20px; + border-radius: 10px; + color: #ffffff; + background: linear-gradient(90deg, #2b6fd6 0%, #7a3fc4 100%); +} + +.greeting { + margin: 0; + font-size: 18px; + font-weight: 600; + line-height: 1.2; + min-width: 0; + flex: 1 1 auto; +} + +.expand { + flex-shrink: 0; + font-size: 18px; + cursor: pointer; +} + +.welcomeImage { + display: block; + width: 100%; + max-width: 420px; + margin: 16px auto 8px; +} + +.details { + margin: 8px 4px 0; +} + +.row { + display: flex; + flex-direction: column; + gap: 2px; + padding: 6px 0; +} + +.label { + color: #605e5c; + font-size: 13px; +} + +.value { + font-weight: 600; + word-break: break-word; +} + +.dark { + color: #f3f2f1; + + .label { + color: #c8c6c4; + } +} diff --git a/examples/copilot-component-noframework/src/NoFrameworkCopilotComponent.ts b/examples/copilot-component-noframework/src/NoFrameworkCopilotComponent.ts new file mode 100644 index 00000000..09cd1d91 --- /dev/null +++ b/examples/copilot-component-noframework/src/NoFrameworkCopilotComponent.ts @@ -0,0 +1,68 @@ +import { BaseCopilotComponent } from '@microsoft/sp-copilot-component'; +import { escape } from '@microsoft/sp-lodash-subset'; + +import type { INoFrameworkCopilotComponentProperties } from './NoFrameworkProperties'; + +import styles from './NoFrameworkCopilotComponent.module.scss'; +import welcomeDark from './assets/welcome-dark.png'; +import welcomeLight from './assets/welcome-light.png'; + +import * as strings from 'NoFrameworkCopilotComponentStrings'; + +const EXPAND_ICON: string = '\u26F6'; + +export default class NoFrameworkCopilotComponent extends BaseCopilotComponent { + protected override render(): void { + const userName: string = this.context.pageContext.user.displayName || 'there'; + const theme: string = this.hostContext.theme || strings.UnknownTheme; + const displayMode: string = this.hostContext.displayMode || strings.UnknownTheme; + const isDarkTheme: boolean = this.hostContext.theme === 'dark'; + const isFullscreen: boolean = this.hostContext.displayMode === 'fullscreen'; + + const rootClass: string = `${styles.noFramework} ${isDarkTheme ? styles.dark : ''}`; + + const expandHtml: string = isFullscreen + ? '' + : `${EXPAND_ICON}`; + + this.context.domElement.innerHTML = ` +
+
+

${strings.WelcomeGreeting} ${escape(userName)}

+ ${expandHtml} +
+ + + +
+
+ ${strings.DisplayModeLabel} + ${escape(displayMode)} +
+
+ ${strings.ThemeLabel} + ${escape(theme)} +
+
+ ${strings.MessageLabel} + ${escape(this.properties.message)} +
+
+
`; + + const expandButton: HTMLElement | null = this.context.domElement.querySelector('#hc-expand'); + if (expandButton) { + expandButton.addEventListener('click', this._handleRequestFullscreen); + expandButton.addEventListener('keydown', (event: KeyboardEvent) => { + if (event.key === 'Enter' || event.key === ' ') { + event.preventDefault(); + this._handleRequestFullscreen().catch(() => undefined); + } + }); + } + } + + private _handleRequestFullscreen = async (): Promise => { + await this.requestDisplayModeAsync('fullscreen'); + }; +} diff --git a/examples/copilot-component-noframework/src/NoFrameworkProperties.ts b/examples/copilot-component-noframework/src/NoFrameworkProperties.ts new file mode 100644 index 00000000..0f5f2fef --- /dev/null +++ b/examples/copilot-component-noframework/src/NoFrameworkProperties.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; +import zodToJsonSchema from 'zod-to-json-schema'; + +const propertiesSchema = z.object({ + message: z.string().describe('A message to display.') +}); + +export type INoFrameworkCopilotComponentProperties = z.infer; + +export default zodToJsonSchema(propertiesSchema); diff --git a/examples/copilot-component-noframework/src/assets/welcome-dark.png b/examples/copilot-component-noframework/src/assets/welcome-dark.png new file mode 100644 index 00000000..42f0b8d2 Binary files /dev/null and b/examples/copilot-component-noframework/src/assets/welcome-dark.png differ diff --git a/examples/copilot-component-noframework/src/assets/welcome-light.png b/examples/copilot-component-noframework/src/assets/welcome-light.png new file mode 100644 index 00000000..69eb3b48 Binary files /dev/null and b/examples/copilot-component-noframework/src/assets/welcome-light.png differ diff --git a/examples/copilot-component-noframework/src/images.d.ts b/examples/copilot-component-noframework/src/images.d.ts new file mode 100644 index 00000000..403b544b --- /dev/null +++ b/examples/copilot-component-noframework/src/images.d.ts @@ -0,0 +1,4 @@ +declare module '*.png' { + const content: string; + export default content; +} diff --git a/examples/copilot-component-noframework/src/loc/en-us.js b/examples/copilot-component-noframework/src/loc/en-us.js new file mode 100644 index 00000000..626d3e6b --- /dev/null +++ b/examples/copilot-component-noframework/src/loc/en-us.js @@ -0,0 +1,10 @@ +define([], function () { + return { + UnknownTheme: 'unknown', + ExpandToFullscreenTitle: 'Expand to fullscreen', + WelcomeGreeting: 'Welcome,', + DisplayModeLabel: 'Display mode', + ThemeLabel: 'Theme', + MessageLabel: 'Message' + }; +}); diff --git a/examples/copilot-component-noframework/src/loc/noFrameworkCopilotComponentStrings.d.ts b/examples/copilot-component-noframework/src/loc/noFrameworkCopilotComponentStrings.d.ts new file mode 100644 index 00000000..66c6ec12 --- /dev/null +++ b/examples/copilot-component-noframework/src/loc/noFrameworkCopilotComponentStrings.d.ts @@ -0,0 +1,13 @@ +declare interface INoFrameworkCopilotComponentStrings { + UnknownTheme: string; + ExpandToFullscreenTitle: string; + WelcomeGreeting: string; + DisplayModeLabel: string; + ThemeLabel: string; + MessageLabel: string; +} + +declare module 'NoFrameworkCopilotComponentStrings' { + const strings: INoFrameworkCopilotComponentStrings; + export = strings; +} diff --git a/examples/copilot-component-noframework/src/no-framework-copilot-component.manifest.json b/examples/copilot-component-noframework/src/no-framework-copilot-component.manifest.json new file mode 100644 index 00000000..4f3433bd --- /dev/null +++ b/examples/copilot-component-noframework/src/no-framework-copilot-component.manifest.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-component-manifest.schema.json", + + "id": "883e8d4f-7073-52ba-a991-5970ff009391", + "alias": "NoFrameworkCopilotComponent", + "componentType": "CopilotComponent", + "copilotType": "Ux", + "version": "*", + "manifestVersion": 2, + + "capabilities": { + "availableDisplayModes": ["inline", "fullscreen"] + }, + + "tools": [ + { + "name": "NoFrameworkTool", + "description": { + "default": "No Framework CopilotComponent Description" + }, + "propertiesSchema": { + "id": "$../lib/NoFrameworkProperties.js:default;" + } + } + ] +} diff --git a/examples/copilot-component-noframework/tsconfig.json b/examples/copilot-component-noframework/tsconfig.json new file mode 100644 index 00000000..e054af28 --- /dev/null +++ b/examples/copilot-component-noframework/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "./node_modules/@microsoft/spfx-web-build-rig/profiles/default/tsconfig-base.json", + "watchOptions": { + // Prevent the TypeScript watch program from re-triggering incremental builds + // when the copilot-agent task regenerates its outputs (temp/copilot staging + // and the teams/.zip package) on every build, which otherwise causes + // an infinite build loop during `heft start` / `heft build-watch`. + "excludeDirectories": ["**/teams", "**/temp/copilot"] + } +} diff --git a/examples/copilot-component-react/.eslintrc.js b/examples/copilot-component-react/.eslintrc.js new file mode 100644 index 00000000..55937bc4 --- /dev/null +++ b/examples/copilot-component-react/.eslintrc.js @@ -0,0 +1,318 @@ +require('@rushstack/eslint-config/patch/modern-module-resolution'); +module.exports = { + extends: ['@microsoft/eslint-config-spfx/lib/profiles/react'], + parserOptions: { tsconfigRootDir: __dirname }, + overrides: [ + { + files: ['*.ts', '*.tsx'], + parser: '@typescript-eslint/parser', + parserOptions: { + project: './tsconfig.json', + ecmaVersion: 2018, + sourceType: 'module' + }, + rules: { + // Prevent usage of the JavaScript null value, while allowing code to access existing APIs that may require null. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/no-new-null': 1, + // Require Jest module mocking APIs to be called before any other statements in their code block. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/hoist-jest-mock': 1, + // Require chunk names for dynamic imports in SPFx projects. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/import-requires-chunk-name': 1, + // Ensure that React components rendered with ReactDOM.render() are unmounted with ReactDOM.unmountComponentAtNode(). https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/pair-react-dom-render-unmount': 1, + // Require regular expressions to be constructed from string constants rather than dynamically building strings at runtime. https://www.npmjs.com/package/@rushstack/eslint-plugin-security + '@rushstack/security/no-unsafe-regexp': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/adjacent-overload-signatures': 1, + // RATIONALE: Code is more readable when the type of every variable is immediately obvious. + // Even if the compiler may be able to infer a type, this inference will be unavailable + // to a person who is reviewing a GitHub diff. This rule makes writing code harder, + // but writing code is a much less important activity than reading it. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/explicit-function-return-type': [ + 1, + { + allowExpressions: true, + allowTypedFunctionExpressions: true, + allowHigherOrderFunctions: false + } + ], + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: although this is a recommended rule, it is up to dev to select coding style. + // Set to 1 (warning) or 2 (error) to enable. + '@typescript-eslint/explicit-member-accessibility': 0, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-array-constructor': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // + // RATIONALE: The "any" keyword disables static type checking, the main benefit of using TypeScript. + // This rule should be suppressed only in very special cases such as JSON.stringify() + // where the type really can be anything. Even if the type is flexible, another type + // may be more appropriate such as "unknown", "{}", or "Record". + '@typescript-eslint/no-explicit-any': 1, + // RATIONALE: The #1 rule of promises is that every promise chain must be terminated by a catch() + // handler. Thus wherever a Promise arises, the code must either append a catch handler, + // or else return the object to a caller (who assumes this responsibility). Unterminated + // promise chains are a serious issue. Besides causing errors to be silently ignored, + // they can also cause a NodeJS process to terminate unexpectedly. + '@typescript-eslint/no-floating-promises': 2, + // RATIONALE: Catches a common coding mistake. + '@typescript-eslint/no-for-in-array': 2, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-misused-new': 2, + // RATIONALE: The "namespace" keyword is not recommended for organizing code because JavaScript lacks + // a "using" statement to traverse namespaces. Nested namespaces prevent certain bundler + // optimizations. If you are declaring loose functions/variables, it's better to make them + // static members of a class, since classes support property getters and their private + // members are accessible by unit tests. Also, the exercise of choosing a meaningful + // class name tends to produce more discoverable APIs: for example, search+replacing + // the function "reverse()" is likely to return many false matches, whereas if we always + // write "Text.reverse()" is more unique. For large scale organization, it's recommended + // to decompose your code into separate NPM packages, which ensures that component + // dependencies are tracked more conscientiously. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-namespace': [ + 1, + { + allowDeclarations: false, + allowDefinitionFiles: false + } + ], + // RATIONALE: Parameter properties provide a shorthand such as "constructor(public title: string)" + // that avoids the effort of declaring "title" as a field. This TypeScript feature makes + // code easier to write, but arguably sacrifices readability: In the notes for + // "@typescript-eslint/member-ordering" we pointed out that fields are central to + // a class's design, so we wouldn't want to bury them in a constructor signature + // just to save some typing. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Set to 1 (warning) or 2 (error) to enable the rule + '@typescript-eslint/parameter-properties': 0, + // RATIONALE: When left in shipping code, unused variables often indicate a mistake. Dead code + // may impact performance. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-unused-vars': [ + 1, + { + vars: 'all', + // Unused function arguments often indicate a mistake in JavaScript code. However in TypeScript code, + // the compiler catches most of those mistakes, and unused arguments are fairly common for type signatures + // that are overriding a base class method or implementing an interface. + args: 'none' + } + ], + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-use-before-define': [ + 2, + { + functions: false, + classes: true, + variables: true, + enums: true, + typedefs: true + } + ], + // Disallows require statements except in import statements. + // In other words, the use of forms such as var foo = require("foo") are banned. Instead use ES6 style imports or import foo = require("foo") imports. + '@typescript-eslint/no-var-requires': 'error', + // RATIONALE: The "module" keyword is deprecated except when describing legacy libraries. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/prefer-namespace-keyword': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: it's up to developer to decide if he wants to add type annotations + // Set to 1 (warning) or 2 (error) to enable the rule + '@typescript-eslint/no-inferrable-types': 0, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: declaration of empty interfaces may be helpful for generic types scenarios + '@typescript-eslint/no-empty-interface': 0, + // RATIONALE: This rule warns if setters are defined without getters, which is probably a mistake. + 'accessor-pairs': 1, + // RATIONALE: In TypeScript, if you write x["y"] instead of x.y, it disables type checking. + 'dot-notation': [ + 1, + { + allowPattern: '^_' + } + ], + // RATIONALE: Catches code that is likely to be incorrect + eqeqeq: 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'for-direction': 1, + // RATIONALE: Catches a common coding mistake. + 'guard-for-in': 2, + // RATIONALE: If you have more than 2,000 lines in a single source file, it's probably time + // to split up your code. + 'max-lines': ['warn', { max: 2000 }], + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-async-promise-executor': 2, + // RATIONALE: Deprecated language feature. + 'no-caller': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-compare-neg-zero': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-cond-assign': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-constant-condition': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-control-regex': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-debugger': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-delete-var': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-duplicate-case': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty-character-class': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty-pattern': 1, + // RATIONALE: Eval is a security concern and a performance concern. + 'no-eval': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-ex-assign': 2, + // RATIONALE: System types are global and should not be tampered with in a scalable code base. + // If two different libraries (or two versions of the same library) both try to modify + // a type, only one of them can win. Polyfills are acceptable because they implement + // a standardized interoperable contract, but polyfills are generally coded in plain + // JavaScript. + 'no-extend-native': 1, + // Disallow unnecessary labels + 'no-extra-label': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-fallthrough': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-func-assign': 1, + // RATIONALE: Catches a common coding mistake. + 'no-implied-eval': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-invalid-regexp': 2, + // RATIONALE: Catches a common coding mistake. + 'no-label-var': 2, + // RATIONALE: Eliminates redundant code. + 'no-lone-blocks': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-misleading-character-class': 2, + // RATIONALE: Catches a common coding mistake. + 'no-multi-str': 2, + // RATIONALE: It's generally a bad practice to call "new Thing()" without assigning the result to + // a variable. Either it's part of an awkward expression like "(new Thing()).doSomething()", + // or else implies that the constructor is doing nontrivial computations, which is often + // a poor class design. + 'no-new': 1, + // RATIONALE: Obsolete language feature that is deprecated. + 'no-new-func': 2, + // RATIONALE: Obsolete language feature that is deprecated. + 'no-new-object': 2, + // RATIONALE: Obsolete notation. + 'no-new-wrappers': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-octal': 2, + // RATIONALE: Catches code that is likely to be incorrect + 'no-octal-escape': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-regex-spaces': 2, + // RATIONALE: Catches a common coding mistake. + 'no-return-assign': 2, + // RATIONALE: Security risk. + 'no-script-url': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-self-assign': 2, + // RATIONALE: Catches a common coding mistake. + 'no-self-compare': 2, + // RATIONALE: This avoids statements such as "while (a = next(), a && a.length);" that use + // commas to create compound expressions. In general code is more readable if each + // step is split onto a separate line. This also makes it easier to set breakpoints + // in the debugger. + 'no-sequences': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-shadow-restricted-names': 2, + // RATIONALE: Obsolete language feature that is deprecated. + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-sparse-arrays': 2, + // RATIONALE: Although in theory JavaScript allows any possible data type to be thrown as an exception, + // such flexibility adds pointless complexity, by requiring every catch block to test + // the type of the object that it receives. Whereas if catch blocks can always assume + // that their object implements the "Error" contract, then the code is simpler, and + // we generally get useful additional information like a tool stack. + 'no-throw-literal': 2, + // RATIONALE: Catches a common coding mistake. + 'no-unmodified-loop-condition': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-unsafe-finally': 2, + // RATIONALE: Catches a common coding mistake. + 'no-unused-expressions': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-unused-labels': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-useless-catch': 1, + // RATIONALE: Avoids a potential performance problem. + 'no-useless-concat': 1, + // RATIONALE: The "var" keyword is deprecated because of its confusing "hoisting" behavior. + // Always use "let" or "const" instead. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + 'no-var': 2, + // RATIONALE: Generally not needed in modern code. + 'no-void': 1, + // RATIONALE: Obsolete language feature that is deprecated. + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-with': 2, + // RATIONALE: Makes logic easier to understand, since constants always have a known value + // @typescript-eslint\eslint-plugin\dist\configs\eslint-recommended.js + 'prefer-const': 1, + // RATIONALE: Catches a common coding mistake where "resolve" and "reject" are confused. + 'promise/param-names': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'require-atomic-updates': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'require-yield': 1, + // "Use strict" is redundant when using the TypeScript compiler. + strict: [2, 'never'], + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'use-isnan': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + // Set to 1 (warning) or 2 (error) to enable. + // Rationale to disable: !!{} + 'no-extra-boolean-cast': 0, + // ==================================================================== + // @microsoft/eslint-plugin-spfx + // ==================================================================== + '@microsoft/spfx/no-require-ensure': 2 + } + }, + { + // For unit tests, we can be a little bit less strict. The settings below revise the + // defaults specified in the extended configurations, as well as above. + files: [ + // Test files + '*.test.ts', + '*.test.tsx', + '*.spec.ts', + '*.spec.tsx', + + // Facebook convention + '**/__mocks__/*.ts', + '**/__mocks__/*.tsx', + '**/__tests__/*.ts', + '**/__tests__/*.tsx', + + // Microsoft convention + '**/test/*.ts', + '**/test/*.tsx' + ], + rules: {} + } + ] +}; diff --git a/examples/copilot-component-react/.gitignore b/examples/copilot-component-react/.gitignore new file mode 100644 index 00000000..56bc0edb --- /dev/null +++ b/examples/copilot-component-react/.gitignore @@ -0,0 +1,34 @@ +# Logs +logs +*.log +npm-debug.log* + +# Dependency directories +node_modules + +# Build generated files +dist +lib +lib-dts +lib-commonjs +lib-esm +jest-output +release +solution +teams +temp +*.sppkg +.heft +.spfx-scaffold.jsonl + +# Coverage directory used by tools like istanbul +coverage + +# OSX +.DS_Store + +# Visual Studio files +.ntvs_analysis.dat +.vs +bin +obj diff --git a/examples/copilot-component-react/.npmignore b/examples/copilot-component-react/.npmignore new file mode 100644 index 00000000..a2378457 --- /dev/null +++ b/examples/copilot-component-react/.npmignore @@ -0,0 +1,32 @@ +# Ignore everything by default +** + +# Use negative patterns to bring back the specific things we want to publish +!/bin/** +!/dist/** +!/EULA/** +!/lib/** +!/lib-*/** +!ThirdPartyNotice.txt + +# Ignore certain files in the above folders +/dist/*.stats.* +/dist/**/*.map +/lib/**/*.map +/lib/**/*.test.* +/lib/**/test/** +/lib-*/**/*.map +/lib-*/**/*.test.* +/lib-*/**/test/** + +# NOTE: These don't need to be specified, because NPM includes them automatically. +# +# package.json +# README (and its variants) +# CHANGELOG (and its variants) +# LICENSE / LICENCE + +## Project specific definitions +# ----------------------------- +/lib/**/integration-test/** +/lib/scripts/** \ No newline at end of file diff --git a/examples/copilot-component-react/README.md b/examples/copilot-component-react/README.md new file mode 100644 index 00000000..88ffec52 --- /dev/null +++ b/examples/copilot-component-react/README.md @@ -0,0 +1,67 @@ +# @spfx-template/copilot-component-react + +## Summary + +Short summary on functionality and used technologies. + +[picture of the solution in action, if possible] + +## Used SharePoint Framework Version + +[![version](https://img.shields.io/badge/version-1.24.0--beta.2-green.svg)](https://img.shields.io/badge/version-1.24.0--beta.2-green.svg) + +## Applies to + +- [SharePoint Framework](https://aka.ms/spfx) +- [Microsoft 365 Copilot](https://learn.microsoft.com/copilot/microsoft-365/) + +> Get your own free development tenant by subscribing to [Microsoft 365 developer program](http://aka.ms/o365devprogram) + +## Prerequisites + +> Any special pre-requisites? + +## Solution + +| Solution | Author(s) | +| ----------- | ------------------------------------------------------- | +| folder name | Author details (name, company, twitter alias with link) | + +## Version history + +| Version | Date | Comments | +| ------- | ---------------- | --------------- | +| 1.0 | January 1, 2025 | Initial release | + +## Disclaimer + +**THIS CODE IS PROVIDED _AS IS_ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.** + +--- + +## Minimal Path to Awesome + +- Clone this repository +- Ensure that you are at the solution folder +- in the command-line run: + - `npm install -g @rushstack/heft` + - `npm install` + - `heft start` + +> Include any additional steps as needed. + +Other build commands can be listed using `heft --help`. + +## Features + +This Copilot Component renders a greeting card when invoked by Microsoft 365 Copilot. + +- Demonstrates the `BaseCopilotComponent` base class +- Uses Zod for properties schema (single source of truth for TypeScript types and JSON Schema) +- Includes a declarative agent manifest for Microsoft 365 Copilot + +## References + +- [Getting started with SharePoint Framework](https://docs.microsoft.com/sharepoint/dev/spfx/set-up-your-developer-tenant) +- [Microsoft 365 Copilot extensibility](https://learn.microsoft.com/copilot/microsoft-365/extensibility/) +- [Heft Documentation](https://heft.rushstack.io/) diff --git a/examples/copilot-component-react/config/config.json b/examples/copilot-component-react/config/config.json new file mode 100644 index 00000000..c9721c3e --- /dev/null +++ b/examples/copilot-component-react/config/config.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/config.2.0.schema.json", + "version": "2.0", + "bundles": { + "sample-copilot-component": { + "components": [ + { + "entrypoint": "./lib/SampleCopilotComponent.js", + "manifest": "./src/sample-copilot-component.manifest.json" + } + ] + } + }, + "externals": {}, + "localizedResources": { + "SampleCopilotComponentStrings": "lib/loc/{locale}.js" + } +} diff --git a/examples/copilot-component-react/config/copilot-agent.json b/examples/copilot-component-react/config/copilot-agent.json new file mode 100644 index 00000000..74372270 --- /dev/null +++ b/examples/copilot-component-react/config/copilot-agent.json @@ -0,0 +1,11 @@ +{ + "$schema": "../node_modules/@microsoft/spfx-heft-plugins/lib-commonjs/plugins/copilotAgentPlugin/copilot-agent.schema.json", + + "agents": [ + { + "name": { "default": "Sample Agent" }, + "description": { "default": "React CopilotComponent Description" }, + "components": ["e3f611a9-871f-58d5-a7e2-9483f971c6a3"] + } + ] +} diff --git a/examples/copilot-component-react/config/package-solution.json b/examples/copilot-component-react/config/package-solution.json new file mode 100644 index 00000000..81bdf7e6 --- /dev/null +++ b/examples/copilot-component-react/config/package-solution.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/package-solution.schema.json", + "solution": { + "name": "@spfx-template/copilot-component-react-client-side-solution", + "id": "22222222-2222-2222-2222-222222222222", + "version": "1.0.0.0", + "includeClientSideAssets": true, + "skipFeatureDeployment": true, + "isDomainIsolated": false, + "developer": { + "name": "", + "websiteUrl": "", + "privacyUrl": "", + "termsOfUseUrl": "", + "mpnId": "Undefined-1.24.0-beta.2" + }, + "metadata": { + "shortDescription": { + "default": "React CopilotComponent Description" + }, + "longDescription": { + "default": "React CopilotComponent Description" + }, + "screenshotPaths": [], + "videoUrl": "", + "categories": [] + }, + "features": [ + { + "title": "@spfx-template/copilot-component-react Feature", + "description": "The feature that activates elements of the @spfx-template/copilot-component-react solution.", + "id": "28c78522-a62a-51a0-8fb1-828e86438158", + "version": "1.0.0.0" + } + ] + }, + "paths": { + "zippedPackage": "solution/@spfx-template/copilot-component-react.sppkg" + } +} diff --git a/examples/copilot-component-react/config/rig.json b/examples/copilot-component-react/config/rig.json new file mode 100644 index 00000000..99e34318 --- /dev/null +++ b/examples/copilot-component-react/config/rig.json @@ -0,0 +1,7 @@ +{ + // The "rig.json" file directs tools to look for their config files in an external package. + // Documentation for this system: https://www.npmjs.com/package/@rushstack/rig-package + "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", + + "rigPackageName": "@microsoft/spfx-web-build-rig" +} diff --git a/examples/copilot-component-react/config/serve.json b/examples/copilot-component-react/config/serve.json new file mode 100644 index 00000000..cb0f86dd --- /dev/null +++ b/examples/copilot-component-react/config/serve.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/spfx-serve.schema.json", + "port": 4321, + "https": true, + "initialPage": "https://{tenantDomain}/_layouts/CopilotWorkbench.aspx" +} diff --git a/examples/copilot-component-react/config/typescript.json b/examples/copilot-component-react/config/typescript.json new file mode 100644 index 00000000..f7a1069b --- /dev/null +++ b/examples/copilot-component-react/config/typescript.json @@ -0,0 +1,9 @@ +{ + "extends": "@microsoft/spfx-web-build-rig/profiles/default/config/typescript.json", + + "staticAssetsToCopy": { + "fileExtensions": [".resx", ".jpg", ".png", ".woff", ".eot", ".ttf", ".svg", ".gif"], + + "includeGlobs": ["loc/*.js"] + } +} diff --git a/examples/copilot-component-react/copilot/ai-plugin.json b/examples/copilot-component-react/copilot/ai-plugin.json new file mode 100644 index 00000000..5992262c --- /dev/null +++ b/examples/copilot-component-react/copilot/ai-plugin.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/copilot/plugin/v2.4/schema.json", + "schema_version": "v2.4", + "namespace": "sample", + "name_for_human": "Sample Agent", + "description_for_human": "React CopilotComponent Description", + "description_for_model": "React CopilotComponent Description", + "contact_email": "publisher@contoso.com" +} diff --git a/examples/copilot-component-react/copilot/color.png b/examples/copilot-component-react/copilot/color.png new file mode 100644 index 00000000..7cdf55b0 Binary files /dev/null and b/examples/copilot-component-react/copilot/color.png differ diff --git a/examples/copilot-component-react/copilot/declarativeAgent.json b/examples/copilot-component-react/copilot/declarativeAgent.json new file mode 100644 index 00000000..031a480c --- /dev/null +++ b/examples/copilot-component-react/copilot/declarativeAgent.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.8/schema.json", + "version": "v1.8", + "name": "Sample Agent", + "description": "React CopilotComponent Description", + "instructions": "$[file('instruction.txt')]", + "conversation_starters": [ + { + "title": "Get started", + "text": "What can you do?" + } + ], + "actions": [ + { + "id": "sampleAction", + "file": "ai-plugin.json" + } + ] +} diff --git a/examples/copilot-component-react/copilot/instruction.txt b/examples/copilot-component-react/copilot/instruction.txt new file mode 100644 index 00000000..aeff2a92 --- /dev/null +++ b/examples/copilot-component-react/copilot/instruction.txt @@ -0,0 +1,3 @@ +You are the Sample Agent — an SPFx CopilotComponent deployed as a Microsoft 365 Copilot declarative agent. + +When the user asks you to perform an action, call the appropriate tool. Keep responses short and helpful. diff --git a/examples/copilot-component-react/copilot/manifest.json b/examples/copilot-component-react/copilot/manifest.json new file mode 100644 index 00000000..d17a99f4 --- /dev/null +++ b/examples/copilot-component-react/copilot/manifest.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.29/MicrosoftTeams.schema.json", + "manifestVersion": "1.29", + "version": "1.0.0", + "id": "22222222-2222-2222-2222-222222222222", + "developer": { + "name": "Contoso", + "websiteUrl": "https://www.contoso.com", + "privacyUrl": "https://www.contoso.com/privacy", + "termsOfUseUrl": "https://www.contoso.com/terms" + }, + "icons": { + "color": "color.png", + "outline": "outline.png" + }, + "name": { + "short": "Sample Agent", + "full": "Sample Agent — SPFx CopilotComponent" + }, + "description": { + "short": "React CopilotComponent Description", + "full": "React CopilotComponent Description" + }, + "accentColor": "#FFFFFF", + "copilotAgents": { + "declarativeAgents": [ + { + "id": "sampleAgent", + "file": "declarativeAgent.json" + } + ] + }, + "permissions": ["identity"], + "validDomains": [] +} diff --git a/examples/copilot-component-react/copilot/outline.png b/examples/copilot-component-react/copilot/outline.png new file mode 100644 index 00000000..e8cb4b6b Binary files /dev/null and b/examples/copilot-component-react/copilot/outline.png differ diff --git a/examples/copilot-component-react/package.json b/examples/copilot-component-react/package.json new file mode 100644 index 00000000..87352107 --- /dev/null +++ b/examples/copilot-component-react/package.json @@ -0,0 +1,47 @@ +{ + "name": "@spfx-template/copilot-component-react", + "version": "0.0.1", + "private": true, + "engines": { + "node": ">=22.14.0 < 23.0.0" + }, + "scripts": { + "build": "heft test --clean --production && heft package-solution --production", + "start": "heft start --clean", + "clean": "heft clean", + "_phase:build": "heft run --only build -- --clean", + "_phase:test": "heft run --only test -- --clean", + "_phase:package-solution": "heft run --only package-solution -- --clean" + }, + "dependencies": { + "@fluentui/react-components": "^9.70.0", + "@fluentui/react-icons": "2.0.314", + "@microsoft/sp-copilot-component": "1.24.0-beta.2", + "@microsoft/sp-http": "1.24.0-beta.2", + "react": "17.0.1", + "react-dom": "17.0.1", + "tslib": "2.3.1", + "zod": "3.24.1", + "zod-to-json-schema": "3.24.1" + }, + "devDependencies": { + "@microsoft/eslint-config-spfx": "1.24.0-beta.2", + "@microsoft/eslint-plugin-spfx": "1.24.0-beta.2", + "@microsoft/sp-module-interfaces": "1.24.0-beta.2", + "@microsoft/spfx-web-build-rig": "1.24.0-beta.2", + "@rushstack/eslint-config": "4.6.4", + "@rushstack/heft": "^1.2.19", + "@types/jest": "~30.0.0", + "@types/react": "17.0.45", + "@types/react-dom": "17.0.17", + "@types/webpack-env": "~1.15.2", + "@typescript-eslint/parser": "8.48.1", + "eslint": "8.57.1", + "eslint-plugin-react": "^7.35.0", + "eslint-plugin-react-hooks": "^4.6.2", + "typescript": "~5.8.3" + }, + "resolutions": { + "@types/react": "17.0.45" + } +} diff --git a/examples/copilot-component-react/src/SampleCopilotComponent.tsx b/examples/copilot-component-react/src/SampleCopilotComponent.tsx new file mode 100644 index 00000000..cc5d1507 --- /dev/null +++ b/examples/copilot-component-react/src/SampleCopilotComponent.tsx @@ -0,0 +1,83 @@ +import * as React from 'react'; +import * as ReactDOM from 'react-dom'; + +import { BaseCopilotComponent } from '@microsoft/sp-copilot-component'; +import type { SPCopilotDisplayMode } from '@microsoft/sp-copilot-component'; +import type { MSGraphClientV3 } from '@microsoft/sp-http'; +import { SPHttpClient, type SPHttpClientResponse } from '@microsoft/sp-http'; + +import Sample from './components/Sample'; +import type { ISampleProps } from './components/ISampleProps'; +import type { ISampleCopilotComponentProperties } from './SampleProperties'; + +import * as strings from 'SampleCopilotComponentStrings'; + +/** + * SPFx Copilot Component that renders a React-based UI demonstrating the + * platform's headline capabilities: + * + * - **Brokered SSO data calls** — Microsoft Graph (`/me`) and SharePoint REST + * (`/_api/web`) with zero token code. The SPFx runtime automatically + * provisions tokens for `SPHttpClient` and `MSGraphClientV3`. + * - **Host context & theming** — reads `hostContext.theme` and + * `hostContext.displayMode` to adapt to the Copilot host environment. + * - **Bridge actions** — demonstrates `requestDisplayModeAsync`, + * `openLinkAsync`, `sendFollowUpMessageAsync`, and `requestSizeChangeAsync`. + */ +export default class SampleCopilotComponent extends BaseCopilotComponent { + private _userDisplayName: string = ''; + private _siteTitle: string = ''; + private _siteUrl: string = ''; + + protected override async onInit(): Promise { + this._siteUrl = this.context.pageContext.web.absoluteUrl; + + // Fetch user info from Microsoft Graph (brokered SSO — no token code needed). + // Wrapped in try/catch so the component still renders in the workbench where + // real services may not be available. + try { + const graphClient: MSGraphClientV3 = await this.context.msGraphClientFactory.getClient('3'); + const me: { displayName?: string } = await graphClient.api('/me').select('displayName').get(); + this._userDisplayName = me.displayName || 'User'; + } catch { + this._userDisplayName = this.context.pageContext.user?.displayName || 'User'; + } + + // Fetch site info from SharePoint REST API (brokered SSO). + try { + const response: SPHttpClientResponse = await this.context.spHttpClient.get( + `${this._siteUrl}/_api/web?$select=Title`, + SPHttpClient.configurations.v1 + ); + const webInfo: { Title?: string } = await response.json(); + this._siteTitle = webInfo.Title || 'SharePoint Site'; + } catch { + this._siteTitle = 'SharePoint Site'; + } + } + + protected override render(): void { + const props: ISampleProps = { + message: this.properties.message, + userDisplayName: this._userDisplayName, + siteTitle: this._siteTitle, + siteUrl: this._siteUrl, + hostContext: this.hostContext, + bridge: this.context.copilotBridge, + onRequestDisplayMode: async (mode: SPCopilotDisplayMode): Promise => { + await this.requestDisplayModeAsync(mode); + }, + onRequestSizeChange: async (width: number, height: number): Promise => { + await this.requestSizeChangeAsync(width, height); + }, + targetDocument: this.context.domElement.ownerDocument, + strings + }; + + ReactDOM.render(React.createElement(Sample, props), this.context.domElement); + } + + protected override async onTeardown(): Promise { + ReactDOM.unmountComponentAtNode(this.context.domElement); + } +} diff --git a/examples/copilot-component-react/src/SampleProperties.ts b/examples/copilot-component-react/src/SampleProperties.ts new file mode 100644 index 00000000..1f8e83bf --- /dev/null +++ b/examples/copilot-component-react/src/SampleProperties.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; +import zodToJsonSchema from 'zod-to-json-schema'; + +const propertiesSchema = z.object({ + message: z.string().describe('A message to display.') +}); + +export type ISampleCopilotComponentProperties = z.infer; + +export default zodToJsonSchema(propertiesSchema); diff --git a/examples/copilot-component-react/src/components/ISampleProps.ts b/examples/copilot-component-react/src/components/ISampleProps.ts new file mode 100644 index 00000000..2f3134dc --- /dev/null +++ b/examples/copilot-component-react/src/components/ISampleProps.ts @@ -0,0 +1,47 @@ +import type { + ICopilotComponentHostContext, + ISPCopilotBridge, + SPCopilotDisplayMode +} from '@microsoft/sp-copilot-component'; + +export interface ISampleStrings { + ExpandButtonLabel: string; + OpenSiteButtonLabel: string; + FollowUpButtonLabel: string; + ResizeButtonLabel: string; + CompactButtonLabel: string; + SiteBadgePrefix: string; + ThemeBadgePrefix: string; + ModeBadgePrefix: string; + GreetingPrefix: string; + UnknownTheme: string; + DefaultDisplayMode: string; + FollowUpMessage: string; +} + +export interface ISampleProps { + /** The message passed as a tool argument from the Copilot host. */ + message: string; + /** User display name fetched from Microsoft Graph /me. */ + userDisplayName: string; + /** Site title fetched from SharePoint REST /_api/web. */ + siteTitle: string; + /** Absolute URL of the current SharePoint site. */ + siteUrl: string; + /** Host context (theme, display mode) from the Copilot host. */ + hostContext: ICopilotComponentHostContext; + /** Bridge to communicate with the Copilot host (public API surface). */ + bridge: ISPCopilotBridge; + /** Request the host to change display mode (e.g. 'fullscreen'). */ + onRequestDisplayMode: (mode: SPCopilotDisplayMode) => Promise; + /** Request the host to resize the component iframe. */ + onRequestSizeChange: (width: number, height: number) => Promise; + /** + * Document the FluentProvider should inject its theme styles into. Pass + * `domElement.ownerDocument` so Griffel writes CSS into the correct iframe + * document rather than the top-level page. + */ + targetDocument: Document | undefined; + /** Localized strings for UI labels. */ + strings: ISampleStrings; +} diff --git a/examples/copilot-component-react/src/components/Sample.tsx b/examples/copilot-component-react/src/components/Sample.tsx new file mode 100644 index 00000000..558e00c4 --- /dev/null +++ b/examples/copilot-component-react/src/components/Sample.tsx @@ -0,0 +1,158 @@ +import * as React from 'react'; +import { + FluentProvider, + IdPrefixProvider, + webLightTheme, + webDarkTheme, + Title3, + Body1, + Badge, + Button, + Card, + CardHeader, + makeStyles, + tokens +} from '@fluentui/react-components'; +import { + ArrowExpand24Regular, + Open24Regular, + Chat24Regular, + ResizeLarge24Regular +} from '@fluentui/react-icons'; +import { createCopilotTextContent } from '@microsoft/sp-copilot-component'; + +import type { ISampleProps } from './ISampleProps'; + +const useStyles = makeStyles({ + root: { + display: 'flex', + flexDirection: 'column', + gap: tokens.spacingVerticalM, + padding: tokens.spacingHorizontalM + }, + header: { + display: 'flex', + flexDirection: 'column', + gap: tokens.spacingVerticalXS + }, + badges: { + display: 'flex', + gap: tokens.spacingHorizontalS, + flexWrap: 'wrap' + }, + actions: { + display: 'flex', + gap: tokens.spacingHorizontalS, + flexWrap: 'wrap' + } +}); + +const EXPANDED_WIDTH: number = 600; +const EXPANDED_HEIGHT: number = 400; +const COMPACT_WIDTH: number = 400; +const COMPACT_HEIGHT: number = 250; + +/** + * Main React UI for the Copilot Component starter template. + * + * Demonstrates: + * - **Theming** — wraps content in `` with a theme derived + * from the host's `hostContext.theme` (`'light' | 'dark'`). + * - **Host context** — surfaces the current display mode, theme, and + * available display modes as live badges. + * - **Bridge actions** — four buttons that exercise different bridge methods + * to show how a component communicates with the Copilot host. + */ +export default function Sample(props: ISampleProps): React.ReactElement { + const { + message, + userDisplayName, + siteTitle, + siteUrl, + hostContext, + bridge, + onRequestDisplayMode, + onRequestSizeChange, + strings + } = props; + const styles = useStyles(); + + const [isExpanded, setIsExpanded] = React.useState(false); + + const theme = hostContext.theme === 'dark' ? webDarkTheme : webLightTheme; + + // Request the Copilot host to switch this component to fullscreen mode. + const handleExpand = React.useCallback(async (): Promise => { + await onRequestDisplayMode('fullscreen'); + }, [onRequestDisplayMode]); + + // Ask the host to open the site URL in the user's browser. + const handleOpenLink = React.useCallback(async (): Promise => { + await bridge.openLinkAsync(siteUrl); + }, [bridge, siteUrl]); + + // Send a follow-up message into the Copilot conversation on behalf of the user. + // This triggers Copilot to respond, demonstrating how a component can drive the chat. + const handleFollowUp = React.useCallback(async (): Promise => { + await bridge.sendFollowUpMessageAsync([ + createCopilotTextContent(strings.FollowUpMessage.replace('{0}', siteTitle)) + ]); + }, [bridge, siteTitle, strings]); + + // Toggle between compact and expanded sizes by requesting a resize from the host. + const handleResize = React.useCallback(async (): Promise => { + const nextExpanded: boolean = !isExpanded; + if (nextExpanded) { + await onRequestSizeChange(EXPANDED_WIDTH, EXPANDED_HEIGHT); + } else { + await onRequestSizeChange(COMPACT_WIDTH, COMPACT_HEIGHT); + } + setIsExpanded(nextExpanded); + }, [onRequestSizeChange, isExpanded]); + + return ( + + +
+ + + {strings.GreetingPrefix} {userDisplayName}! + + } + description={{message}} + /> + +
+ + {strings.SiteBadgePrefix} {siteTitle} + + + {strings.ThemeBadgePrefix} {hostContext.theme || strings.UnknownTheme} + + + {strings.ModeBadgePrefix} {hostContext.displayMode || strings.DefaultDisplayMode} + +
+
+ +
+ + + + +
+
+
+
+ ); +} diff --git a/examples/copilot-component-react/src/loc/en-us.js b/examples/copilot-component-react/src/loc/en-us.js new file mode 100644 index 00000000..4de79411 --- /dev/null +++ b/examples/copilot-component-react/src/loc/en-us.js @@ -0,0 +1,16 @@ +define([], function () { + return { + ExpandButtonLabel: 'Expand', + OpenSiteButtonLabel: 'Open Site', + FollowUpButtonLabel: 'Follow Up', + ResizeButtonLabel: 'Resize', + CompactButtonLabel: 'Compact', + SiteBadgePrefix: 'Site:', + ThemeBadgePrefix: 'Theme:', + ModeBadgePrefix: 'Mode:', + GreetingPrefix: 'Hello,', + UnknownTheme: 'unknown', + DefaultDisplayMode: 'inline', + FollowUpMessage: 'Tell me more about the "{0}" site.' + }; +}); diff --git a/examples/copilot-component-react/src/loc/sampleCopilotComponentStrings.d.ts b/examples/copilot-component-react/src/loc/sampleCopilotComponentStrings.d.ts new file mode 100644 index 00000000..d83fcb20 --- /dev/null +++ b/examples/copilot-component-react/src/loc/sampleCopilotComponentStrings.d.ts @@ -0,0 +1,19 @@ +declare interface ISampleCopilotComponentStrings { + ExpandButtonLabel: string; + OpenSiteButtonLabel: string; + FollowUpButtonLabel: string; + ResizeButtonLabel: string; + CompactButtonLabel: string; + SiteBadgePrefix: string; + ThemeBadgePrefix: string; + ModeBadgePrefix: string; + GreetingPrefix: string; + UnknownTheme: string; + DefaultDisplayMode: string; + FollowUpMessage: string; +} + +declare module 'SampleCopilotComponentStrings' { + const strings: ISampleCopilotComponentStrings; + export = strings; +} diff --git a/examples/copilot-component-react/src/sample-copilot-component.manifest.json b/examples/copilot-component-react/src/sample-copilot-component.manifest.json new file mode 100644 index 00000000..f0554da2 --- /dev/null +++ b/examples/copilot-component-react/src/sample-copilot-component.manifest.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-component-manifest.schema.json", + + "id": "e3f611a9-871f-58d5-a7e2-9483f971c6a3", + "alias": "SampleCopilotComponent", + "componentType": "CopilotComponent", + "copilotType": "Ux", + "version": "*", + "manifestVersion": 2, + + "capabilities": { + "availableDisplayModes": ["inline", "fullscreen"] + }, + + "tools": [ + { + "name": "SampleTool", + "description": { + "default": "React CopilotComponent Description" + }, + "propertiesSchema": { + "id": "$../lib/SampleProperties.js:default;" + } + } + ] +} diff --git a/examples/copilot-component-react/tsconfig.json b/examples/copilot-component-react/tsconfig.json new file mode 100644 index 00000000..e054af28 --- /dev/null +++ b/examples/copilot-component-react/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "./node_modules/@microsoft/spfx-web-build-rig/profiles/default/tsconfig-base.json", + "watchOptions": { + // Prevent the TypeScript watch program from re-triggering incremental builds + // when the copilot-agent task regenerates its outputs (temp/copilot staging + // and the teams/.zip package) on every build, which otherwise causes + // an infinite build loop during `heft start` / `heft build-watch`. + "excludeDirectories": ["**/teams", "**/temp/copilot"] + } +} diff --git a/rush.json b/rush.json index 10a04eb2..a2958054 100644 --- a/rush.json +++ b/rush.json @@ -504,6 +504,24 @@ "reviewCategory": "templates", "tags": [] }, + { + "packageName": "@spfx-template/copilot-component-minimal", + "projectFolder": "examples/copilot-component-minimal", + "reviewCategory": "templates", + "tags": [] + }, + { + "packageName": "@spfx-template/copilot-component-noframework", + "projectFolder": "examples/copilot-component-noframework", + "reviewCategory": "templates", + "tags": [] + }, + { + "packageName": "@spfx-template/copilot-component-react", + "projectFolder": "examples/copilot-component-react", + "reviewCategory": "templates", + "tags": [] + }, { "packageName": "@spfx-template/extension-application-customizer", "projectFolder": "examples/extension-application-customizer", diff --git a/templates/copilot-component-minimal/.eslintrc.js b/templates/copilot-component-minimal/.eslintrc.js new file mode 100644 index 00000000..7a2d62ef --- /dev/null +++ b/templates/copilot-component-minimal/.eslintrc.js @@ -0,0 +1,318 @@ +require('@rushstack/eslint-config/patch/modern-module-resolution'); +module.exports = { + extends: ['@microsoft/eslint-config-spfx/lib/profiles/default'], + parserOptions: { tsconfigRootDir: __dirname }, + overrides: [ + { + files: ['*.ts', '*.tsx'], + parser: '@typescript-eslint/parser', + parserOptions: { + project: './tsconfig.json', + ecmaVersion: 2018, + sourceType: 'module' + }, + rules: { + // Prevent usage of the JavaScript null value, while allowing code to access existing APIs that may require null. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/no-new-null': 1, + // Require Jest module mocking APIs to be called before any other statements in their code block. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/hoist-jest-mock': 1, + // Require chunk names for dynamic imports in SPFx projects. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/import-requires-chunk-name': 1, + // Ensure that React components rendered with ReactDOM.render() are unmounted with ReactDOM.unmountComponentAtNode(). https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/pair-react-dom-render-unmount': 1, + // Require regular expressions to be constructed from string constants rather than dynamically building strings at runtime. https://www.npmjs.com/package/@rushstack/eslint-plugin-security + '@rushstack/security/no-unsafe-regexp': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/adjacent-overload-signatures': 1, + // RATIONALE: Code is more readable when the type of every variable is immediately obvious. + // Even if the compiler may be able to infer a type, this inference will be unavailable + // to a person who is reviewing a GitHub diff. This rule makes writing code harder, + // but writing code is a much less important activity than reading it. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/explicit-function-return-type': [ + 1, + { + allowExpressions: true, + allowTypedFunctionExpressions: true, + allowHigherOrderFunctions: false + } + ], + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: although this is a recommended rule, it is up to dev to select coding style. + // Set to 1 (warning) or 2 (error) to enable. + '@typescript-eslint/explicit-member-accessibility': 0, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-array-constructor': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // + // RATIONALE: The "any" keyword disables static type checking, the main benefit of using TypeScript. + // This rule should be suppressed only in very special cases such as JSON.stringify() + // where the type really can be anything. Even if the type is flexible, another type + // may be more appropriate such as "unknown", "{}", or "Record". + '@typescript-eslint/no-explicit-any': 1, + // RATIONALE: The #1 rule of promises is that every promise chain must be terminated by a catch() + // handler. Thus wherever a Promise arises, the code must either append a catch handler, + // or else return the object to a caller (who assumes this responsibility). Unterminated + // promise chains are a serious issue. Besides causing errors to be silently ignored, + // they can also cause a NodeJS process to terminate unexpectedly. + '@typescript-eslint/no-floating-promises': 2, + // RATIONALE: Catches a common coding mistake. + '@typescript-eslint/no-for-in-array': 2, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-misused-new': 2, + // RATIONALE: The "namespace" keyword is not recommended for organizing code because JavaScript lacks + // a "using" statement to traverse namespaces. Nested namespaces prevent certain bundler + // optimizations. If you are declaring loose functions/variables, it's better to make them + // static members of a class, since classes support property getters and their private + // members are accessible by unit tests. Also, the exercise of choosing a meaningful + // class name tends to produce more discoverable APIs: for example, search+replacing + // the function "reverse()" is likely to return many false matches, whereas if we always + // write "Text.reverse()" is more unique. For large scale organization, it's recommended + // to decompose your code into separate NPM packages, which ensures that component + // dependencies are tracked more conscientiously. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-namespace': [ + 1, + { + allowDeclarations: false, + allowDefinitionFiles: false + } + ], + // RATIONALE: Parameter properties provide a shorthand such as "constructor(public title: string)" + // that avoids the effort of declaring "title" as a field. This TypeScript feature makes + // code easier to write, but arguably sacrifices readability: In the notes for + // "@typescript-eslint/member-ordering" we pointed out that fields are central to + // a class's design, so we wouldn't want to bury them in a constructor signature + // just to save some typing. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Set to 1 (warning) or 2 (error) to enable the rule + '@typescript-eslint/parameter-properties': 0, + // RATIONALE: When left in shipping code, unused variables often indicate a mistake. Dead code + // may impact performance. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-unused-vars': [ + 1, + { + vars: 'all', + // Unused function arguments often indicate a mistake in JavaScript code. However in TypeScript code, + // the compiler catches most of those mistakes, and unused arguments are fairly common for type signatures + // that are overriding a base class method or implementing an interface. + args: 'none' + } + ], + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-use-before-define': [ + 2, + { + functions: false, + classes: true, + variables: true, + enums: true, + typedefs: true + } + ], + // Disallows require statements except in import statements. + // In other words, the use of forms such as var foo = require("foo") are banned. Instead use ES6 style imports or import foo = require("foo") imports. + '@typescript-eslint/no-var-requires': 'error', + // RATIONALE: The "module" keyword is deprecated except when describing legacy libraries. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/prefer-namespace-keyword': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: it's up to developer to decide if he wants to add type annotations + // Set to 1 (warning) or 2 (error) to enable the rule + '@typescript-eslint/no-inferrable-types': 0, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: declaration of empty interfaces may be helpful for generic types scenarios + '@typescript-eslint/no-empty-interface': 0, + // RATIONALE: This rule warns if setters are defined without getters, which is probably a mistake. + 'accessor-pairs': 1, + // RATIONALE: In TypeScript, if you write x["y"] instead of x.y, it disables type checking. + 'dot-notation': [ + 1, + { + allowPattern: '^_' + } + ], + // RATIONALE: Catches code that is likely to be incorrect + eqeqeq: 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'for-direction': 1, + // RATIONALE: Catches a common coding mistake. + 'guard-for-in': 2, + // RATIONALE: If you have more than 2,000 lines in a single source file, it's probably time + // to split up your code. + 'max-lines': ['warn', { max: 2000 }], + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-async-promise-executor': 2, + // RATIONALE: Deprecated language feature. + 'no-caller': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-compare-neg-zero': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-cond-assign': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-constant-condition': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-control-regex': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-debugger': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-delete-var': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-duplicate-case': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty-character-class': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty-pattern': 1, + // RATIONALE: Eval is a security concern and a performance concern. + 'no-eval': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-ex-assign': 2, + // RATIONALE: System types are global and should not be tampered with in a scalable code base. + // If two different libraries (or two versions of the same library) both try to modify + // a type, only one of them can win. Polyfills are acceptable because they implement + // a standardized interoperable contract, but polyfills are generally coded in plain + // JavaScript. + 'no-extend-native': 1, + // Disallow unnecessary labels + 'no-extra-label': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-fallthrough': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-func-assign': 1, + // RATIONALE: Catches a common coding mistake. + 'no-implied-eval': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-invalid-regexp': 2, + // RATIONALE: Catches a common coding mistake. + 'no-label-var': 2, + // RATIONALE: Eliminates redundant code. + 'no-lone-blocks': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-misleading-character-class': 2, + // RATIONALE: Catches a common coding mistake. + 'no-multi-str': 2, + // RATIONALE: It's generally a bad practice to call "new Thing()" without assigning the result to + // a variable. Either it's part of an awkward expression like "(new Thing()).doSomething()", + // or else implies that the constructor is doing nontrivial computations, which is often + // a poor class design. + 'no-new': 1, + // RATIONALE: Obsolete language feature that is deprecated. + 'no-new-func': 2, + // RATIONALE: Obsolete language feature that is deprecated. + 'no-new-object': 2, + // RATIONALE: Obsolete notation. + 'no-new-wrappers': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-octal': 2, + // RATIONALE: Catches code that is likely to be incorrect + 'no-octal-escape': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-regex-spaces': 2, + // RATIONALE: Catches a common coding mistake. + 'no-return-assign': 2, + // RATIONALE: Security risk. + 'no-script-url': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-self-assign': 2, + // RATIONALE: Catches a common coding mistake. + 'no-self-compare': 2, + // RATIONALE: This avoids statements such as "while (a = next(), a && a.length);" that use + // commas to create compound expressions. In general code is more readable if each + // step is split onto a separate line. This also makes it easier to set breakpoints + // in the debugger. + 'no-sequences': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-shadow-restricted-names': 2, + // RATIONALE: Obsolete language feature that is deprecated. + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-sparse-arrays': 2, + // RATIONALE: Although in theory JavaScript allows any possible data type to be thrown as an exception, + // such flexibility adds pointless complexity, by requiring every catch block to test + // the type of the object that it receives. Whereas if catch blocks can always assume + // that their object implements the "Error" contract, then the code is simpler, and + // we generally get useful additional information like a call stack. + 'no-throw-literal': 2, + // RATIONALE: Catches a common coding mistake. + 'no-unmodified-loop-condition': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-unsafe-finally': 2, + // RATIONALE: Catches a common coding mistake. + 'no-unused-expressions': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-unused-labels': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-useless-catch': 1, + // RATIONALE: Avoids a potential performance problem. + 'no-useless-concat': 1, + // RATIONALE: The "var" keyword is deprecated because of its confusing "hoisting" behavior. + // Always use "let" or "const" instead. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + 'no-var': 2, + // RATIONALE: Generally not needed in modern code. + 'no-void': 1, + // RATIONALE: Obsolete language feature that is deprecated. + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-with': 2, + // RATIONALE: Makes logic easier to understand, since constants always have a known value + // @typescript-eslint\eslint-plugin\dist\configs\eslint-recommended.js + 'prefer-const': 1, + // RATIONALE: Catches a common coding mistake where "resolve" and "reject" are confused. + 'promise/param-names': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'require-atomic-updates': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'require-yield': 1, + // "Use strict" is redundant when using the TypeScript compiler. + strict: [2, 'never'], + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'use-isnan': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + // Set to 1 (warning) or 2 (error) to enable. + // Rationale to disable: !!{} + 'no-extra-boolean-cast': 0, + // ==================================================================== + // @microsoft/eslint-plugin-spfx + // ==================================================================== + '@microsoft/spfx/no-require-ensure': 2 + } + }, + { + // For unit tests, we can be a little bit less strict. The settings below revise the + // defaults specified in the extended configurations, as well as above. + files: [ + // Test files + '*.test.ts', + '*.test.tsx', + '*.spec.ts', + '*.spec.tsx', + + // Facebook convention + '**/__mocks__/*.ts', + '**/__mocks__/*.tsx', + '**/__tests__/*.ts', + '**/__tests__/*.tsx', + + // Microsoft convention + '**/test/*.ts', + '**/test/*.tsx' + ], + rules: {} + } + ] +}; diff --git a/templates/copilot-component-minimal/.gitignore b/templates/copilot-component-minimal/.gitignore new file mode 100644 index 00000000..56bc0edb --- /dev/null +++ b/templates/copilot-component-minimal/.gitignore @@ -0,0 +1,34 @@ +# Logs +logs +*.log +npm-debug.log* + +# Dependency directories +node_modules + +# Build generated files +dist +lib +lib-dts +lib-commonjs +lib-esm +jest-output +release +solution +teams +temp +*.sppkg +.heft +.spfx-scaffold.jsonl + +# Coverage directory used by tools like istanbul +coverage + +# OSX +.DS_Store + +# Visual Studio files +.ntvs_analysis.dat +.vs +bin +obj diff --git a/templates/copilot-component-minimal/.npmignore b/templates/copilot-component-minimal/.npmignore new file mode 100644 index 00000000..a2378457 --- /dev/null +++ b/templates/copilot-component-minimal/.npmignore @@ -0,0 +1,32 @@ +# Ignore everything by default +** + +# Use negative patterns to bring back the specific things we want to publish +!/bin/** +!/dist/** +!/EULA/** +!/lib/** +!/lib-*/** +!ThirdPartyNotice.txt + +# Ignore certain files in the above folders +/dist/*.stats.* +/dist/**/*.map +/lib/**/*.map +/lib/**/*.test.* +/lib/**/test/** +/lib-*/**/*.map +/lib-*/**/*.test.* +/lib-*/**/test/** + +# NOTE: These don't need to be specified, because NPM includes them automatically. +# +# package.json +# README (and its variants) +# CHANGELOG (and its variants) +# LICENSE / LICENCE + +## Project specific definitions +# ----------------------------- +/lib/**/integration-test/** +/lib/scripts/** \ No newline at end of file diff --git a/templates/copilot-component-minimal/README.md b/templates/copilot-component-minimal/README.md new file mode 100644 index 00000000..a7736ba0 --- /dev/null +++ b/templates/copilot-component-minimal/README.md @@ -0,0 +1,67 @@ +# <%= libraryName %> + +## Summary + +Short summary on functionality and used technologies. + +[picture of the solution in action, if possible] + +## Used SharePoint Framework Version + +[![version](https://img.shields.io/badge/version-<%= spfxVersionForBadgeUrl %>-green.svg)](https://img.shields.io/badge/version-<%= spfxVersionForBadgeUrl %>-green.svg) + +## Applies to + +- [SharePoint Framework](https://aka.ms/spfx) +- [Microsoft 365 Copilot](https://learn.microsoft.com/copilot/microsoft-365/) + +> Get your own free development tenant by subscribing to [Microsoft 365 developer program](http://aka.ms/o365devprogram) + +## Prerequisites + +> Any special pre-requisites? + +## Solution + +| Solution | Author(s) | +| ----------- | ------------------------------------------------------- | +| folder name | Author details (name, company, twitter alias with link) | + +## Version history + +| Version | Date | Comments | +| ------- | ---------------- | --------------- | +| 1.0 | January 1, 2025 | Initial release | + +## Disclaimer + +**THIS CODE IS PROVIDED _AS IS_ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.** + +--- + +## Minimal Path to Awesome + +- Clone this repository +- Ensure that you are at the solution folder +- in the command-line run: + - `npm install -g @rushstack/heft` + - `npm install` + - `heft start` + +> Include any additional steps as needed. + +Other build commands can be listed using `heft --help`. + +## Features + +This Copilot Component renders a greeting card when invoked by Microsoft 365 Copilot. + +- Demonstrates the `BaseCopilotComponent` base class +- Uses Zod for properties schema (single source of truth for TypeScript types and JSON Schema) +- Includes a declarative agent manifest for Microsoft 365 Copilot + +## References + +- [Getting started with SharePoint Framework](https://docs.microsoft.com/sharepoint/dev/spfx/set-up-your-developer-tenant) +- [Microsoft 365 Copilot extensibility](https://learn.microsoft.com/copilot/microsoft-365/extensibility/) +- [Heft Documentation](https://heft.rushstack.io/) diff --git a/templates/copilot-component-minimal/config/config.json b/templates/copilot-component-minimal/config/config.json new file mode 100644 index 00000000..45401909 --- /dev/null +++ b/templates/copilot-component-minimal/config/config.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/config.2.0.schema.json", + "version": "2.0", + "bundles": { + "<%= componentName.hyphen %>-copilot-component": { + "components": [ + { + "entrypoint": "./lib/<%= componentName.pascal %>CopilotComponent.js", + "manifest": "./src/<%= componentName.hyphen %>-copilot-component.manifest.json" + } + ] + } + } +} diff --git a/templates/copilot-component-minimal/config/copilot-agent.json b/templates/copilot-component-minimal/config/copilot-agent.json new file mode 100644 index 00000000..88a389c9 --- /dev/null +++ b/templates/copilot-component-minimal/config/copilot-agent.json @@ -0,0 +1,11 @@ +{ + "$schema": "../node_modules/@microsoft/spfx-heft-plugins/lib-commonjs/plugins/copilotAgentPlugin/copilot-agent.schema.json", + + "agents": [ + { + "name": { "default": "<%= componentName %> Agent" }, + "description": { "default": "<%= componentDescription %>" }, + "components": ["<%= componentId %>"] + } + ] +} diff --git a/templates/copilot-component-minimal/config/package-solution.json b/templates/copilot-component-minimal/config/package-solution.json new file mode 100644 index 00000000..85e86dfc --- /dev/null +++ b/templates/copilot-component-minimal/config/package-solution.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/package-solution.schema.json", + "solution": { + "name": "<%= libraryName %>-client-side-solution", + "id": "<%= solutionId %>", + "version": "1.0.0.0", + "includeClientSideAssets": true, + "skipFeatureDeployment": true, + "isDomainIsolated": false, + "developer": { + "name": "", + "websiteUrl": "", + "privacyUrl": "", + "termsOfUseUrl": "", + "mpnId": "Undefined-<%= spfxVersion %>" + }, + "metadata": { + "shortDescription": { + "default": "<%= componentDescription %>" + }, + "longDescription": { + "default": "<%= componentDescription %>" + }, + "screenshotPaths": [], + "videoUrl": "", + "categories": [] + }, + "features": [ + { + "title": "<%= libraryName %> Feature", + "description": "The feature that activates elements of the <%= libraryName %> solution.", + "id": "<%= featureId %>", + "version": "1.0.0.0" + } + ] + }, + "paths": { + "zippedPackage": "solution/<%= libraryName %>.sppkg" + } +} diff --git a/templates/copilot-component-minimal/config/rig.json b/templates/copilot-component-minimal/config/rig.json new file mode 100644 index 00000000..99e34318 --- /dev/null +++ b/templates/copilot-component-minimal/config/rig.json @@ -0,0 +1,7 @@ +{ + // The "rig.json" file directs tools to look for their config files in an external package. + // Documentation for this system: https://www.npmjs.com/package/@rushstack/rig-package + "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", + + "rigPackageName": "@microsoft/spfx-web-build-rig" +} diff --git a/templates/copilot-component-minimal/config/serve.json b/templates/copilot-component-minimal/config/serve.json new file mode 100644 index 00000000..cb0f86dd --- /dev/null +++ b/templates/copilot-component-minimal/config/serve.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/spfx-serve.schema.json", + "port": 4321, + "https": true, + "initialPage": "https://{tenantDomain}/_layouts/CopilotWorkbench.aspx" +} diff --git a/templates/copilot-component-minimal/copilot/ai-plugin.json b/templates/copilot-component-minimal/copilot/ai-plugin.json new file mode 100644 index 00000000..54ae5093 --- /dev/null +++ b/templates/copilot-component-minimal/copilot/ai-plugin.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/copilot/plugin/v2.4/schema.json", + "schema_version": "v2.4", + "namespace": "<%= componentName.camel %>", + "name_for_human": "<%= componentName %> Agent", + "description_for_human": "<%= componentDescription %>", + "description_for_model": "<%= componentDescription %>", + "contact_email": "publisher@contoso.com" +} diff --git a/templates/copilot-component-minimal/copilot/color.png b/templates/copilot-component-minimal/copilot/color.png new file mode 100644 index 00000000..7cdf55b0 Binary files /dev/null and b/templates/copilot-component-minimal/copilot/color.png differ diff --git a/templates/copilot-component-minimal/copilot/declarativeAgent.json b/templates/copilot-component-minimal/copilot/declarativeAgent.json new file mode 100644 index 00000000..959d675a --- /dev/null +++ b/templates/copilot-component-minimal/copilot/declarativeAgent.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.8/schema.json", + "version": "v1.8", + "name": "<%= componentName %> Agent", + "description": "<%= componentDescription %>", + "instructions": "$[file('instruction.txt')]", + "conversation_starters": [ + { + "title": "Get started", + "text": "What can you do?" + } + ], + "actions": [ + { + "id": "<%= componentName.camel %>Action", + "file": "ai-plugin.json" + } + ] +} diff --git a/templates/copilot-component-minimal/copilot/instruction.txt b/templates/copilot-component-minimal/copilot/instruction.txt new file mode 100644 index 00000000..8e824af7 --- /dev/null +++ b/templates/copilot-component-minimal/copilot/instruction.txt @@ -0,0 +1,3 @@ +You are the <%= componentName %> Agent — an SPFx CopilotComponent deployed as a Microsoft 365 Copilot declarative agent. + +When the user asks you to perform an action, call the appropriate tool. Keep responses short and helpful. diff --git a/templates/copilot-component-minimal/copilot/manifest.json b/templates/copilot-component-minimal/copilot/manifest.json new file mode 100644 index 00000000..3c27c53e --- /dev/null +++ b/templates/copilot-component-minimal/copilot/manifest.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.29/MicrosoftTeams.schema.json", + "manifestVersion": "1.29", + "version": "1.0.0", + "id": "<%= solutionId %>", + "developer": { + "name": "Contoso", + "websiteUrl": "https://www.contoso.com", + "privacyUrl": "https://www.contoso.com/privacy", + "termsOfUseUrl": "https://www.contoso.com/terms" + }, + "icons": { + "color": "color.png", + "outline": "outline.png" + }, + "name": { + "short": "<%= componentName %> Agent", + "full": "<%= componentName %> Agent — SPFx CopilotComponent" + }, + "description": { + "short": "<%= componentDescription %>", + "full": "<%= componentDescription %>" + }, + "accentColor": "#FFFFFF", + "copilotAgents": { + "declarativeAgents": [ + { + "id": "<%= componentName.camel %>Agent", + "file": "declarativeAgent.json" + } + ] + }, + "permissions": ["identity"], + "validDomains": [] +} diff --git a/templates/copilot-component-minimal/copilot/outline.png b/templates/copilot-component-minimal/copilot/outline.png new file mode 100644 index 00000000..e8cb4b6b Binary files /dev/null and b/templates/copilot-component-minimal/copilot/outline.png differ diff --git a/templates/copilot-component-minimal/package.json b/templates/copilot-component-minimal/package.json new file mode 100644 index 00000000..87b02a3a --- /dev/null +++ b/templates/copilot-component-minimal/package.json @@ -0,0 +1,35 @@ +{ + "name": "<%= libraryName %>", + "version": "0.0.1", + "private": true, + "engines": { + "node": ">=22.14.0 < 23.0.0" + }, + "scripts": { + "build": "heft test --clean --production && heft package-solution --production", + "start": "heft start --clean", + "clean": "heft clean", + "_phase:build": "heft run --only build -- --clean", + "_phase:test": "heft run --only test -- --clean", + "_phase:package-solution": "heft run --only package-solution -- --clean" + }, + "dependencies": { + "@microsoft/sp-copilot-component": "<%= spfxVersion %>", + "tslib": "2.3.1", + "zod": "3.24.1", + "zod-to-json-schema": "3.24.1" + }, + "devDependencies": { + "@microsoft/eslint-config-spfx": "<%= spfxVersion %>", + "@microsoft/eslint-plugin-spfx": "<%= spfxVersion %>", + "@microsoft/sp-module-interfaces": "<%= spfxVersion %>", + "@microsoft/spfx-web-build-rig": "<%= spfxVersion %>", + "@rushstack/eslint-config": "4.6.4", + "@rushstack/heft": "^1.2.19", + "@types/jest": "~30.0.0", + "@types/webpack-env": "~1.15.2", + "@typescript-eslint/parser": "8.48.1", + "eslint": "8.57.1", + "typescript": "~5.8.3" + } +} diff --git a/templates/copilot-component-minimal/src/{componentName.hyphen}-copilot-component.manifest.json b/templates/copilot-component-minimal/src/{componentName.hyphen}-copilot-component.manifest.json new file mode 100644 index 00000000..4cbecb24 --- /dev/null +++ b/templates/copilot-component-minimal/src/{componentName.hyphen}-copilot-component.manifest.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-component-manifest.schema.json", + + "id": "<%= componentId %>", + "alias": "<%= componentAlias %>CopilotComponent", + "componentType": "CopilotComponent", + "copilotType": "Ux", + "version": "*", + "manifestVersion": 2, + + "capabilities": { + "availableDisplayModes": ["inline", "fullscreen"] + }, + + "tools": [ + { + "name": "<%= componentName.pascal %>Tool", + "description": { + "default": "<%= componentDescription %>" + }, + "propertiesSchema": { + "id": "$../lib/<%= componentName.pascal %>Properties.js:default;" + } + } + ] +} diff --git a/templates/copilot-component-minimal/src/{componentName.pascal}CopilotComponent.ts b/templates/copilot-component-minimal/src/{componentName.pascal}CopilotComponent.ts new file mode 100644 index 00000000..b37744bc --- /dev/null +++ b/templates/copilot-component-minimal/src/{componentName.pascal}CopilotComponent.ts @@ -0,0 +1,9 @@ +import { BaseCopilotComponent } from '@microsoft/sp-copilot-component'; + +import type { I<%= componentName.pascal %>CopilotComponentProperties } from './<%= componentName.pascal %>Properties'; + +export default class <%= componentName.pascal %>CopilotComponent extends BaseCopilotComponentCopilotComponentProperties> { + protected override render(): void { + this.context.domElement.textContent = this.properties.message; + } +} diff --git a/templates/copilot-component-minimal/src/{componentName.pascal}Properties.ts b/templates/copilot-component-minimal/src/{componentName.pascal}Properties.ts new file mode 100644 index 00000000..317bd67d --- /dev/null +++ b/templates/copilot-component-minimal/src/{componentName.pascal}Properties.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; +import zodToJsonSchema from 'zod-to-json-schema'; + +const propertiesSchema = z.object({ + message: z.string().describe('A message to display.') +}); + +export type I<%= componentName.pascal %>CopilotComponentProperties = z.infer; + +export default zodToJsonSchema(propertiesSchema); diff --git a/templates/copilot-component-minimal/template.json b/templates/copilot-component-minimal/template.json new file mode 100644 index 00000000..06a72ea4 --- /dev/null +++ b/templates/copilot-component-minimal/template.json @@ -0,0 +1,7 @@ +{ + "name": "copilot-component-minimal", + "category": "copilot", + "description": "A minimal Copilot Component template (no framework) for SPFx", + "version": "0.0.1", + "spfxVersion": "1.24.0-beta.2" +} diff --git a/templates/copilot-component-minimal/tsconfig.json b/templates/copilot-component-minimal/tsconfig.json new file mode 100644 index 00000000..e054af28 --- /dev/null +++ b/templates/copilot-component-minimal/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "./node_modules/@microsoft/spfx-web-build-rig/profiles/default/tsconfig-base.json", + "watchOptions": { + // Prevent the TypeScript watch program from re-triggering incremental builds + // when the copilot-agent task regenerates its outputs (temp/copilot staging + // and the teams/.zip package) on every build, which otherwise causes + // an infinite build loop during `heft start` / `heft build-watch`. + "excludeDirectories": ["**/teams", "**/temp/copilot"] + } +} diff --git a/templates/copilot-component-noframework/.eslintrc.js b/templates/copilot-component-noframework/.eslintrc.js new file mode 100644 index 00000000..7a2d62ef --- /dev/null +++ b/templates/copilot-component-noframework/.eslintrc.js @@ -0,0 +1,318 @@ +require('@rushstack/eslint-config/patch/modern-module-resolution'); +module.exports = { + extends: ['@microsoft/eslint-config-spfx/lib/profiles/default'], + parserOptions: { tsconfigRootDir: __dirname }, + overrides: [ + { + files: ['*.ts', '*.tsx'], + parser: '@typescript-eslint/parser', + parserOptions: { + project: './tsconfig.json', + ecmaVersion: 2018, + sourceType: 'module' + }, + rules: { + // Prevent usage of the JavaScript null value, while allowing code to access existing APIs that may require null. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/no-new-null': 1, + // Require Jest module mocking APIs to be called before any other statements in their code block. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/hoist-jest-mock': 1, + // Require chunk names for dynamic imports in SPFx projects. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/import-requires-chunk-name': 1, + // Ensure that React components rendered with ReactDOM.render() are unmounted with ReactDOM.unmountComponentAtNode(). https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/pair-react-dom-render-unmount': 1, + // Require regular expressions to be constructed from string constants rather than dynamically building strings at runtime. https://www.npmjs.com/package/@rushstack/eslint-plugin-security + '@rushstack/security/no-unsafe-regexp': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/adjacent-overload-signatures': 1, + // RATIONALE: Code is more readable when the type of every variable is immediately obvious. + // Even if the compiler may be able to infer a type, this inference will be unavailable + // to a person who is reviewing a GitHub diff. This rule makes writing code harder, + // but writing code is a much less important activity than reading it. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/explicit-function-return-type': [ + 1, + { + allowExpressions: true, + allowTypedFunctionExpressions: true, + allowHigherOrderFunctions: false + } + ], + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: although this is a recommended rule, it is up to dev to select coding style. + // Set to 1 (warning) or 2 (error) to enable. + '@typescript-eslint/explicit-member-accessibility': 0, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-array-constructor': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // + // RATIONALE: The "any" keyword disables static type checking, the main benefit of using TypeScript. + // This rule should be suppressed only in very special cases such as JSON.stringify() + // where the type really can be anything. Even if the type is flexible, another type + // may be more appropriate such as "unknown", "{}", or "Record". + '@typescript-eslint/no-explicit-any': 1, + // RATIONALE: The #1 rule of promises is that every promise chain must be terminated by a catch() + // handler. Thus wherever a Promise arises, the code must either append a catch handler, + // or else return the object to a caller (who assumes this responsibility). Unterminated + // promise chains are a serious issue. Besides causing errors to be silently ignored, + // they can also cause a NodeJS process to terminate unexpectedly. + '@typescript-eslint/no-floating-promises': 2, + // RATIONALE: Catches a common coding mistake. + '@typescript-eslint/no-for-in-array': 2, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-misused-new': 2, + // RATIONALE: The "namespace" keyword is not recommended for organizing code because JavaScript lacks + // a "using" statement to traverse namespaces. Nested namespaces prevent certain bundler + // optimizations. If you are declaring loose functions/variables, it's better to make them + // static members of a class, since classes support property getters and their private + // members are accessible by unit tests. Also, the exercise of choosing a meaningful + // class name tends to produce more discoverable APIs: for example, search+replacing + // the function "reverse()" is likely to return many false matches, whereas if we always + // write "Text.reverse()" is more unique. For large scale organization, it's recommended + // to decompose your code into separate NPM packages, which ensures that component + // dependencies are tracked more conscientiously. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-namespace': [ + 1, + { + allowDeclarations: false, + allowDefinitionFiles: false + } + ], + // RATIONALE: Parameter properties provide a shorthand such as "constructor(public title: string)" + // that avoids the effort of declaring "title" as a field. This TypeScript feature makes + // code easier to write, but arguably sacrifices readability: In the notes for + // "@typescript-eslint/member-ordering" we pointed out that fields are central to + // a class's design, so we wouldn't want to bury them in a constructor signature + // just to save some typing. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Set to 1 (warning) or 2 (error) to enable the rule + '@typescript-eslint/parameter-properties': 0, + // RATIONALE: When left in shipping code, unused variables often indicate a mistake. Dead code + // may impact performance. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-unused-vars': [ + 1, + { + vars: 'all', + // Unused function arguments often indicate a mistake in JavaScript code. However in TypeScript code, + // the compiler catches most of those mistakes, and unused arguments are fairly common for type signatures + // that are overriding a base class method or implementing an interface. + args: 'none' + } + ], + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-use-before-define': [ + 2, + { + functions: false, + classes: true, + variables: true, + enums: true, + typedefs: true + } + ], + // Disallows require statements except in import statements. + // In other words, the use of forms such as var foo = require("foo") are banned. Instead use ES6 style imports or import foo = require("foo") imports. + '@typescript-eslint/no-var-requires': 'error', + // RATIONALE: The "module" keyword is deprecated except when describing legacy libraries. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/prefer-namespace-keyword': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: it's up to developer to decide if he wants to add type annotations + // Set to 1 (warning) or 2 (error) to enable the rule + '@typescript-eslint/no-inferrable-types': 0, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: declaration of empty interfaces may be helpful for generic types scenarios + '@typescript-eslint/no-empty-interface': 0, + // RATIONALE: This rule warns if setters are defined without getters, which is probably a mistake. + 'accessor-pairs': 1, + // RATIONALE: In TypeScript, if you write x["y"] instead of x.y, it disables type checking. + 'dot-notation': [ + 1, + { + allowPattern: '^_' + } + ], + // RATIONALE: Catches code that is likely to be incorrect + eqeqeq: 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'for-direction': 1, + // RATIONALE: Catches a common coding mistake. + 'guard-for-in': 2, + // RATIONALE: If you have more than 2,000 lines in a single source file, it's probably time + // to split up your code. + 'max-lines': ['warn', { max: 2000 }], + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-async-promise-executor': 2, + // RATIONALE: Deprecated language feature. + 'no-caller': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-compare-neg-zero': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-cond-assign': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-constant-condition': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-control-regex': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-debugger': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-delete-var': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-duplicate-case': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty-character-class': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty-pattern': 1, + // RATIONALE: Eval is a security concern and a performance concern. + 'no-eval': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-ex-assign': 2, + // RATIONALE: System types are global and should not be tampered with in a scalable code base. + // If two different libraries (or two versions of the same library) both try to modify + // a type, only one of them can win. Polyfills are acceptable because they implement + // a standardized interoperable contract, but polyfills are generally coded in plain + // JavaScript. + 'no-extend-native': 1, + // Disallow unnecessary labels + 'no-extra-label': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-fallthrough': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-func-assign': 1, + // RATIONALE: Catches a common coding mistake. + 'no-implied-eval': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-invalid-regexp': 2, + // RATIONALE: Catches a common coding mistake. + 'no-label-var': 2, + // RATIONALE: Eliminates redundant code. + 'no-lone-blocks': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-misleading-character-class': 2, + // RATIONALE: Catches a common coding mistake. + 'no-multi-str': 2, + // RATIONALE: It's generally a bad practice to call "new Thing()" without assigning the result to + // a variable. Either it's part of an awkward expression like "(new Thing()).doSomething()", + // or else implies that the constructor is doing nontrivial computations, which is often + // a poor class design. + 'no-new': 1, + // RATIONALE: Obsolete language feature that is deprecated. + 'no-new-func': 2, + // RATIONALE: Obsolete language feature that is deprecated. + 'no-new-object': 2, + // RATIONALE: Obsolete notation. + 'no-new-wrappers': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-octal': 2, + // RATIONALE: Catches code that is likely to be incorrect + 'no-octal-escape': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-regex-spaces': 2, + // RATIONALE: Catches a common coding mistake. + 'no-return-assign': 2, + // RATIONALE: Security risk. + 'no-script-url': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-self-assign': 2, + // RATIONALE: Catches a common coding mistake. + 'no-self-compare': 2, + // RATIONALE: This avoids statements such as "while (a = next(), a && a.length);" that use + // commas to create compound expressions. In general code is more readable if each + // step is split onto a separate line. This also makes it easier to set breakpoints + // in the debugger. + 'no-sequences': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-shadow-restricted-names': 2, + // RATIONALE: Obsolete language feature that is deprecated. + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-sparse-arrays': 2, + // RATIONALE: Although in theory JavaScript allows any possible data type to be thrown as an exception, + // such flexibility adds pointless complexity, by requiring every catch block to test + // the type of the object that it receives. Whereas if catch blocks can always assume + // that their object implements the "Error" contract, then the code is simpler, and + // we generally get useful additional information like a call stack. + 'no-throw-literal': 2, + // RATIONALE: Catches a common coding mistake. + 'no-unmodified-loop-condition': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-unsafe-finally': 2, + // RATIONALE: Catches a common coding mistake. + 'no-unused-expressions': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-unused-labels': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-useless-catch': 1, + // RATIONALE: Avoids a potential performance problem. + 'no-useless-concat': 1, + // RATIONALE: The "var" keyword is deprecated because of its confusing "hoisting" behavior. + // Always use "let" or "const" instead. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + 'no-var': 2, + // RATIONALE: Generally not needed in modern code. + 'no-void': 1, + // RATIONALE: Obsolete language feature that is deprecated. + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-with': 2, + // RATIONALE: Makes logic easier to understand, since constants always have a known value + // @typescript-eslint\eslint-plugin\dist\configs\eslint-recommended.js + 'prefer-const': 1, + // RATIONALE: Catches a common coding mistake where "resolve" and "reject" are confused. + 'promise/param-names': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'require-atomic-updates': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'require-yield': 1, + // "Use strict" is redundant when using the TypeScript compiler. + strict: [2, 'never'], + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'use-isnan': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + // Set to 1 (warning) or 2 (error) to enable. + // Rationale to disable: !!{} + 'no-extra-boolean-cast': 0, + // ==================================================================== + // @microsoft/eslint-plugin-spfx + // ==================================================================== + '@microsoft/spfx/no-require-ensure': 2 + } + }, + { + // For unit tests, we can be a little bit less strict. The settings below revise the + // defaults specified in the extended configurations, as well as above. + files: [ + // Test files + '*.test.ts', + '*.test.tsx', + '*.spec.ts', + '*.spec.tsx', + + // Facebook convention + '**/__mocks__/*.ts', + '**/__mocks__/*.tsx', + '**/__tests__/*.ts', + '**/__tests__/*.tsx', + + // Microsoft convention + '**/test/*.ts', + '**/test/*.tsx' + ], + rules: {} + } + ] +}; diff --git a/templates/copilot-component-noframework/.gitignore b/templates/copilot-component-noframework/.gitignore new file mode 100644 index 00000000..56bc0edb --- /dev/null +++ b/templates/copilot-component-noframework/.gitignore @@ -0,0 +1,34 @@ +# Logs +logs +*.log +npm-debug.log* + +# Dependency directories +node_modules + +# Build generated files +dist +lib +lib-dts +lib-commonjs +lib-esm +jest-output +release +solution +teams +temp +*.sppkg +.heft +.spfx-scaffold.jsonl + +# Coverage directory used by tools like istanbul +coverage + +# OSX +.DS_Store + +# Visual Studio files +.ntvs_analysis.dat +.vs +bin +obj diff --git a/templates/copilot-component-noframework/.npmignore b/templates/copilot-component-noframework/.npmignore new file mode 100644 index 00000000..a2378457 --- /dev/null +++ b/templates/copilot-component-noframework/.npmignore @@ -0,0 +1,32 @@ +# Ignore everything by default +** + +# Use negative patterns to bring back the specific things we want to publish +!/bin/** +!/dist/** +!/EULA/** +!/lib/** +!/lib-*/** +!ThirdPartyNotice.txt + +# Ignore certain files in the above folders +/dist/*.stats.* +/dist/**/*.map +/lib/**/*.map +/lib/**/*.test.* +/lib/**/test/** +/lib-*/**/*.map +/lib-*/**/*.test.* +/lib-*/**/test/** + +# NOTE: These don't need to be specified, because NPM includes them automatically. +# +# package.json +# README (and its variants) +# CHANGELOG (and its variants) +# LICENSE / LICENCE + +## Project specific definitions +# ----------------------------- +/lib/**/integration-test/** +/lib/scripts/** \ No newline at end of file diff --git a/templates/copilot-component-noframework/README.md b/templates/copilot-component-noframework/README.md new file mode 100644 index 00000000..a7736ba0 --- /dev/null +++ b/templates/copilot-component-noframework/README.md @@ -0,0 +1,67 @@ +# <%= libraryName %> + +## Summary + +Short summary on functionality and used technologies. + +[picture of the solution in action, if possible] + +## Used SharePoint Framework Version + +[![version](https://img.shields.io/badge/version-<%= spfxVersionForBadgeUrl %>-green.svg)](https://img.shields.io/badge/version-<%= spfxVersionForBadgeUrl %>-green.svg) + +## Applies to + +- [SharePoint Framework](https://aka.ms/spfx) +- [Microsoft 365 Copilot](https://learn.microsoft.com/copilot/microsoft-365/) + +> Get your own free development tenant by subscribing to [Microsoft 365 developer program](http://aka.ms/o365devprogram) + +## Prerequisites + +> Any special pre-requisites? + +## Solution + +| Solution | Author(s) | +| ----------- | ------------------------------------------------------- | +| folder name | Author details (name, company, twitter alias with link) | + +## Version history + +| Version | Date | Comments | +| ------- | ---------------- | --------------- | +| 1.0 | January 1, 2025 | Initial release | + +## Disclaimer + +**THIS CODE IS PROVIDED _AS IS_ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.** + +--- + +## Minimal Path to Awesome + +- Clone this repository +- Ensure that you are at the solution folder +- in the command-line run: + - `npm install -g @rushstack/heft` + - `npm install` + - `heft start` + +> Include any additional steps as needed. + +Other build commands can be listed using `heft --help`. + +## Features + +This Copilot Component renders a greeting card when invoked by Microsoft 365 Copilot. + +- Demonstrates the `BaseCopilotComponent` base class +- Uses Zod for properties schema (single source of truth for TypeScript types and JSON Schema) +- Includes a declarative agent manifest for Microsoft 365 Copilot + +## References + +- [Getting started with SharePoint Framework](https://docs.microsoft.com/sharepoint/dev/spfx/set-up-your-developer-tenant) +- [Microsoft 365 Copilot extensibility](https://learn.microsoft.com/copilot/microsoft-365/extensibility/) +- [Heft Documentation](https://heft.rushstack.io/) diff --git a/templates/copilot-component-noframework/config/config.json b/templates/copilot-component-noframework/config/config.json new file mode 100644 index 00000000..2dabb468 --- /dev/null +++ b/templates/copilot-component-noframework/config/config.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/config.2.0.schema.json", + "version": "2.0", + "bundles": { + "<%= componentName.hyphen %>-copilot-component": { + "components": [ + { + "entrypoint": "./lib/<%= componentName.pascal %>CopilotComponent.js", + "manifest": "./src/<%= componentName.hyphen %>-copilot-component.manifest.json" + } + ] + } + }, + "externals": {}, + "localizedResources": { + "<%= componentName.pascal %>CopilotComponentStrings": "lib/loc/{locale}.js" + } +} diff --git a/templates/copilot-component-noframework/config/copilot-agent.json b/templates/copilot-component-noframework/config/copilot-agent.json new file mode 100644 index 00000000..88a389c9 --- /dev/null +++ b/templates/copilot-component-noframework/config/copilot-agent.json @@ -0,0 +1,11 @@ +{ + "$schema": "../node_modules/@microsoft/spfx-heft-plugins/lib-commonjs/plugins/copilotAgentPlugin/copilot-agent.schema.json", + + "agents": [ + { + "name": { "default": "<%= componentName %> Agent" }, + "description": { "default": "<%= componentDescription %>" }, + "components": ["<%= componentId %>"] + } + ] +} diff --git a/templates/copilot-component-noframework/config/package-solution.json b/templates/copilot-component-noframework/config/package-solution.json new file mode 100644 index 00000000..85e86dfc --- /dev/null +++ b/templates/copilot-component-noframework/config/package-solution.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/package-solution.schema.json", + "solution": { + "name": "<%= libraryName %>-client-side-solution", + "id": "<%= solutionId %>", + "version": "1.0.0.0", + "includeClientSideAssets": true, + "skipFeatureDeployment": true, + "isDomainIsolated": false, + "developer": { + "name": "", + "websiteUrl": "", + "privacyUrl": "", + "termsOfUseUrl": "", + "mpnId": "Undefined-<%= spfxVersion %>" + }, + "metadata": { + "shortDescription": { + "default": "<%= componentDescription %>" + }, + "longDescription": { + "default": "<%= componentDescription %>" + }, + "screenshotPaths": [], + "videoUrl": "", + "categories": [] + }, + "features": [ + { + "title": "<%= libraryName %> Feature", + "description": "The feature that activates elements of the <%= libraryName %> solution.", + "id": "<%= featureId %>", + "version": "1.0.0.0" + } + ] + }, + "paths": { + "zippedPackage": "solution/<%= libraryName %>.sppkg" + } +} diff --git a/templates/copilot-component-noframework/config/rig.json b/templates/copilot-component-noframework/config/rig.json new file mode 100644 index 00000000..99e34318 --- /dev/null +++ b/templates/copilot-component-noframework/config/rig.json @@ -0,0 +1,7 @@ +{ + // The "rig.json" file directs tools to look for their config files in an external package. + // Documentation for this system: https://www.npmjs.com/package/@rushstack/rig-package + "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", + + "rigPackageName": "@microsoft/spfx-web-build-rig" +} diff --git a/templates/copilot-component-noframework/config/sass.json b/templates/copilot-component-noframework/config/sass.json new file mode 100644 index 00000000..9022585d --- /dev/null +++ b/templates/copilot-component-noframework/config/sass.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/heft/v0/heft-sass-plugin.schema.json", + + "extends": "@microsoft/spfx-web-build-rig/profiles/default/config/sass.json" +} diff --git a/templates/copilot-component-noframework/config/serve.json b/templates/copilot-component-noframework/config/serve.json new file mode 100644 index 00000000..cb0f86dd --- /dev/null +++ b/templates/copilot-component-noframework/config/serve.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/spfx-serve.schema.json", + "port": 4321, + "https": true, + "initialPage": "https://{tenantDomain}/_layouts/CopilotWorkbench.aspx" +} diff --git a/templates/copilot-component-noframework/config/typescript.json b/templates/copilot-component-noframework/config/typescript.json new file mode 100644 index 00000000..f7a1069b --- /dev/null +++ b/templates/copilot-component-noframework/config/typescript.json @@ -0,0 +1,9 @@ +{ + "extends": "@microsoft/spfx-web-build-rig/profiles/default/config/typescript.json", + + "staticAssetsToCopy": { + "fileExtensions": [".resx", ".jpg", ".png", ".woff", ".eot", ".ttf", ".svg", ".gif"], + + "includeGlobs": ["loc/*.js"] + } +} diff --git a/templates/copilot-component-noframework/copilot/ai-plugin.json b/templates/copilot-component-noframework/copilot/ai-plugin.json new file mode 100644 index 00000000..54ae5093 --- /dev/null +++ b/templates/copilot-component-noframework/copilot/ai-plugin.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/copilot/plugin/v2.4/schema.json", + "schema_version": "v2.4", + "namespace": "<%= componentName.camel %>", + "name_for_human": "<%= componentName %> Agent", + "description_for_human": "<%= componentDescription %>", + "description_for_model": "<%= componentDescription %>", + "contact_email": "publisher@contoso.com" +} diff --git a/templates/copilot-component-noframework/copilot/color.png b/templates/copilot-component-noframework/copilot/color.png new file mode 100644 index 00000000..7cdf55b0 Binary files /dev/null and b/templates/copilot-component-noframework/copilot/color.png differ diff --git a/templates/copilot-component-noframework/copilot/declarativeAgent.json b/templates/copilot-component-noframework/copilot/declarativeAgent.json new file mode 100644 index 00000000..959d675a --- /dev/null +++ b/templates/copilot-component-noframework/copilot/declarativeAgent.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.8/schema.json", + "version": "v1.8", + "name": "<%= componentName %> Agent", + "description": "<%= componentDescription %>", + "instructions": "$[file('instruction.txt')]", + "conversation_starters": [ + { + "title": "Get started", + "text": "What can you do?" + } + ], + "actions": [ + { + "id": "<%= componentName.camel %>Action", + "file": "ai-plugin.json" + } + ] +} diff --git a/templates/copilot-component-noframework/copilot/instruction.txt b/templates/copilot-component-noframework/copilot/instruction.txt new file mode 100644 index 00000000..8e824af7 --- /dev/null +++ b/templates/copilot-component-noframework/copilot/instruction.txt @@ -0,0 +1,3 @@ +You are the <%= componentName %> Agent — an SPFx CopilotComponent deployed as a Microsoft 365 Copilot declarative agent. + +When the user asks you to perform an action, call the appropriate tool. Keep responses short and helpful. diff --git a/templates/copilot-component-noframework/copilot/manifest.json b/templates/copilot-component-noframework/copilot/manifest.json new file mode 100644 index 00000000..3c27c53e --- /dev/null +++ b/templates/copilot-component-noframework/copilot/manifest.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.29/MicrosoftTeams.schema.json", + "manifestVersion": "1.29", + "version": "1.0.0", + "id": "<%= solutionId %>", + "developer": { + "name": "Contoso", + "websiteUrl": "https://www.contoso.com", + "privacyUrl": "https://www.contoso.com/privacy", + "termsOfUseUrl": "https://www.contoso.com/terms" + }, + "icons": { + "color": "color.png", + "outline": "outline.png" + }, + "name": { + "short": "<%= componentName %> Agent", + "full": "<%= componentName %> Agent — SPFx CopilotComponent" + }, + "description": { + "short": "<%= componentDescription %>", + "full": "<%= componentDescription %>" + }, + "accentColor": "#FFFFFF", + "copilotAgents": { + "declarativeAgents": [ + { + "id": "<%= componentName.camel %>Agent", + "file": "declarativeAgent.json" + } + ] + }, + "permissions": ["identity"], + "validDomains": [] +} diff --git a/templates/copilot-component-noframework/copilot/outline.png b/templates/copilot-component-noframework/copilot/outline.png new file mode 100644 index 00000000..e8cb4b6b Binary files /dev/null and b/templates/copilot-component-noframework/copilot/outline.png differ diff --git a/templates/copilot-component-noframework/package.json b/templates/copilot-component-noframework/package.json new file mode 100644 index 00000000..8d53df0a --- /dev/null +++ b/templates/copilot-component-noframework/package.json @@ -0,0 +1,36 @@ +{ + "name": "<%= libraryName %>", + "version": "0.0.1", + "private": true, + "engines": { + "node": ">=22.14.0 < 23.0.0" + }, + "scripts": { + "build": "heft test --clean --production && heft package-solution --production", + "start": "heft start --clean", + "clean": "heft clean", + "_phase:build": "heft run --only build -- --clean", + "_phase:test": "heft run --only test -- --clean", + "_phase:package-solution": "heft run --only package-solution -- --clean" + }, + "dependencies": { + "@microsoft/sp-copilot-component": "<%= spfxVersion %>", + "@microsoft/sp-lodash-subset": "<%= spfxVersion %>", + "tslib": "2.3.1", + "zod": "3.24.1", + "zod-to-json-schema": "3.24.1" + }, + "devDependencies": { + "@microsoft/eslint-config-spfx": "<%= spfxVersion %>", + "@microsoft/eslint-plugin-spfx": "<%= spfxVersion %>", + "@microsoft/sp-module-interfaces": "<%= spfxVersion %>", + "@microsoft/spfx-web-build-rig": "<%= spfxVersion %>", + "@rushstack/eslint-config": "4.6.4", + "@rushstack/heft": "^1.2.19", + "@types/jest": "~30.0.0", + "@types/webpack-env": "~1.15.2", + "@typescript-eslint/parser": "8.48.1", + "eslint": "8.57.1", + "typescript": "~5.8.3" + } +} diff --git a/templates/copilot-component-noframework/src/assets/welcome-dark.png b/templates/copilot-component-noframework/src/assets/welcome-dark.png new file mode 100644 index 00000000..42f0b8d2 Binary files /dev/null and b/templates/copilot-component-noframework/src/assets/welcome-dark.png differ diff --git a/templates/copilot-component-noframework/src/assets/welcome-light.png b/templates/copilot-component-noframework/src/assets/welcome-light.png new file mode 100644 index 00000000..69eb3b48 Binary files /dev/null and b/templates/copilot-component-noframework/src/assets/welcome-light.png differ diff --git a/templates/copilot-component-noframework/src/images.d.ts b/templates/copilot-component-noframework/src/images.d.ts new file mode 100644 index 00000000..403b544b --- /dev/null +++ b/templates/copilot-component-noframework/src/images.d.ts @@ -0,0 +1,4 @@ +declare module '*.png' { + const content: string; + export default content; +} diff --git a/templates/copilot-component-noframework/src/loc/en-us.js b/templates/copilot-component-noframework/src/loc/en-us.js new file mode 100644 index 00000000..626d3e6b --- /dev/null +++ b/templates/copilot-component-noframework/src/loc/en-us.js @@ -0,0 +1,10 @@ +define([], function () { + return { + UnknownTheme: 'unknown', + ExpandToFullscreenTitle: 'Expand to fullscreen', + WelcomeGreeting: 'Welcome,', + DisplayModeLabel: 'Display mode', + ThemeLabel: 'Theme', + MessageLabel: 'Message' + }; +}); diff --git a/templates/copilot-component-noframework/src/loc/{componentName.camel}CopilotComponentStrings.d.ts b/templates/copilot-component-noframework/src/loc/{componentName.camel}CopilotComponentStrings.d.ts new file mode 100644 index 00000000..bb01669f --- /dev/null +++ b/templates/copilot-component-noframework/src/loc/{componentName.camel}CopilotComponentStrings.d.ts @@ -0,0 +1,13 @@ +declare interface I<%= componentName.pascal %>CopilotComponentStrings { + UnknownTheme: string; + ExpandToFullscreenTitle: string; + WelcomeGreeting: string; + DisplayModeLabel: string; + ThemeLabel: string; + MessageLabel: string; +} + +declare module '<%= componentName.pascal %>CopilotComponentStrings' { + const strings: I<%= componentName.pascal %>CopilotComponentStrings; + export = strings; +} diff --git a/templates/copilot-component-noframework/src/{componentName.hyphen}-copilot-component.manifest.json b/templates/copilot-component-noframework/src/{componentName.hyphen}-copilot-component.manifest.json new file mode 100644 index 00000000..4cbecb24 --- /dev/null +++ b/templates/copilot-component-noframework/src/{componentName.hyphen}-copilot-component.manifest.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-component-manifest.schema.json", + + "id": "<%= componentId %>", + "alias": "<%= componentAlias %>CopilotComponent", + "componentType": "CopilotComponent", + "copilotType": "Ux", + "version": "*", + "manifestVersion": 2, + + "capabilities": { + "availableDisplayModes": ["inline", "fullscreen"] + }, + + "tools": [ + { + "name": "<%= componentName.pascal %>Tool", + "description": { + "default": "<%= componentDescription %>" + }, + "propertiesSchema": { + "id": "$../lib/<%= componentName.pascal %>Properties.js:default;" + } + } + ] +} diff --git a/templates/copilot-component-noframework/src/{componentName.pascal}CopilotComponent.module.scss b/templates/copilot-component-noframework/src/{componentName.pascal}CopilotComponent.module.scss new file mode 100644 index 00000000..bb78b0e8 --- /dev/null +++ b/templates/copilot-component-noframework/src/{componentName.pascal}CopilotComponent.module.scss @@ -0,0 +1,68 @@ +.<%= componentName.camel %> { + overflow: hidden; + padding: 12px; + color: #323130; + font-family: "Segoe UI", "Segoe UI Web (West European)", -apple-system, BlinkMacSystemFont, sans-serif; +} + +.header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 16px 20px; + border-radius: 10px; + color: #ffffff; + background: linear-gradient(90deg, #2b6fd6 0%, #7a3fc4 100%); +} + +.greeting { + margin: 0; + font-size: 18px; + font-weight: 600; + line-height: 1.2; + min-width: 0; + flex: 1 1 auto; +} + +.expand { + flex-shrink: 0; + font-size: 18px; + cursor: pointer; +} + +.welcomeImage { + display: block; + width: 100%; + max-width: 420px; + margin: 16px auto 8px; +} + +.details { + margin: 8px 4px 0; +} + +.row { + display: flex; + flex-direction: column; + gap: 2px; + padding: 6px 0; +} + +.label { + color: #605e5c; + font-size: 13px; +} + +.value { + font-weight: 600; + word-break: break-word; +} + +.dark { + color: #f3f2f1; + + .label { + color: #c8c6c4; + } +} diff --git a/templates/copilot-component-noframework/src/{componentName.pascal}CopilotComponent.ts b/templates/copilot-component-noframework/src/{componentName.pascal}CopilotComponent.ts new file mode 100644 index 00000000..bafbb3ea --- /dev/null +++ b/templates/copilot-component-noframework/src/{componentName.pascal}CopilotComponent.ts @@ -0,0 +1,68 @@ +import { BaseCopilotComponent } from '@microsoft/sp-copilot-component'; +import { escape } from '@microsoft/sp-lodash-subset'; + +import type { I<%= componentName.pascal %>CopilotComponentProperties } from './<%= componentName.pascal %>Properties'; + +import styles from './<%= componentName.pascal %>CopilotComponent.module.scss'; +import welcomeDark from './assets/welcome-dark.png'; +import welcomeLight from './assets/welcome-light.png'; + +import * as strings from '<%= componentName.pascal %>CopilotComponentStrings'; + +const EXPAND_ICON: string = '\u26F6'; + +export default class <%= componentName.pascal %>CopilotComponent extends BaseCopilotComponentCopilotComponentProperties> { + protected override render(): void { + const userName: string = this.context.pageContext.user.displayName || 'there'; + const theme: string = this.hostContext.theme || strings.UnknownTheme; + const displayMode: string = this.hostContext.displayMode || strings.UnknownTheme; + const isDarkTheme: boolean = this.hostContext.theme === 'dark'; + const isFullscreen: boolean = this.hostContext.displayMode === 'fullscreen'; + + const rootClass: string = `${styles.<%= componentName.camel %>} ${isDarkTheme ? styles.dark : ''}`; + + const expandHtml: string = isFullscreen + ? '' + : `${EXPAND_ICON}`; + + this.context.domElement.innerHTML = ` +
+
+

${strings.WelcomeGreeting} ${escape(userName)}

+ ${expandHtml} +
+ + + +
+
+ ${strings.DisplayModeLabel} + ${escape(displayMode)} +
+
+ ${strings.ThemeLabel} + ${escape(theme)} +
+
+ ${strings.MessageLabel} + ${escape(this.properties.message)} +
+
+
`; + + const expandButton: HTMLElement | null = this.context.domElement.querySelector('#hc-expand'); + if (expandButton) { + expandButton.addEventListener('click', this._handleRequestFullscreen); + expandButton.addEventListener('keydown', (event: KeyboardEvent) => { + if (event.key === 'Enter' || event.key === ' ') { + event.preventDefault(); + this._handleRequestFullscreen().catch(() => undefined); + } + }); + } + } + + private _handleRequestFullscreen = async (): Promise => { + await this.requestDisplayModeAsync('fullscreen'); + }; +} diff --git a/templates/copilot-component-noframework/src/{componentName.pascal}Properties.ts b/templates/copilot-component-noframework/src/{componentName.pascal}Properties.ts new file mode 100644 index 00000000..317bd67d --- /dev/null +++ b/templates/copilot-component-noframework/src/{componentName.pascal}Properties.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; +import zodToJsonSchema from 'zod-to-json-schema'; + +const propertiesSchema = z.object({ + message: z.string().describe('A message to display.') +}); + +export type I<%= componentName.pascal %>CopilotComponentProperties = z.infer; + +export default zodToJsonSchema(propertiesSchema); diff --git a/templates/copilot-component-noframework/template.json b/templates/copilot-component-noframework/template.json new file mode 100644 index 00000000..f9d933f9 --- /dev/null +++ b/templates/copilot-component-noframework/template.json @@ -0,0 +1,7 @@ +{ + "name": "copilot-component-noframework", + "category": "copilot", + "description": "A no-framework Copilot Component template (HTML/CSS) for SPFx", + "version": "0.0.1", + "spfxVersion": "1.24.0-beta.2" +} diff --git a/templates/copilot-component-noframework/tsconfig.json b/templates/copilot-component-noframework/tsconfig.json new file mode 100644 index 00000000..e054af28 --- /dev/null +++ b/templates/copilot-component-noframework/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "./node_modules/@microsoft/spfx-web-build-rig/profiles/default/tsconfig-base.json", + "watchOptions": { + // Prevent the TypeScript watch program from re-triggering incremental builds + // when the copilot-agent task regenerates its outputs (temp/copilot staging + // and the teams/.zip package) on every build, which otherwise causes + // an infinite build loop during `heft start` / `heft build-watch`. + "excludeDirectories": ["**/teams", "**/temp/copilot"] + } +} diff --git a/templates/copilot-component-react/.eslintrc.js b/templates/copilot-component-react/.eslintrc.js new file mode 100644 index 00000000..55937bc4 --- /dev/null +++ b/templates/copilot-component-react/.eslintrc.js @@ -0,0 +1,318 @@ +require('@rushstack/eslint-config/patch/modern-module-resolution'); +module.exports = { + extends: ['@microsoft/eslint-config-spfx/lib/profiles/react'], + parserOptions: { tsconfigRootDir: __dirname }, + overrides: [ + { + files: ['*.ts', '*.tsx'], + parser: '@typescript-eslint/parser', + parserOptions: { + project: './tsconfig.json', + ecmaVersion: 2018, + sourceType: 'module' + }, + rules: { + // Prevent usage of the JavaScript null value, while allowing code to access existing APIs that may require null. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/no-new-null': 1, + // Require Jest module mocking APIs to be called before any other statements in their code block. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/hoist-jest-mock': 1, + // Require chunk names for dynamic imports in SPFx projects. https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/import-requires-chunk-name': 1, + // Ensure that React components rendered with ReactDOM.render() are unmounted with ReactDOM.unmountComponentAtNode(). https://www.npmjs.com/package/@rushstack/eslint-plugin + '@rushstack/pair-react-dom-render-unmount': 1, + // Require regular expressions to be constructed from string constants rather than dynamically building strings at runtime. https://www.npmjs.com/package/@rushstack/eslint-plugin-security + '@rushstack/security/no-unsafe-regexp': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/adjacent-overload-signatures': 1, + // RATIONALE: Code is more readable when the type of every variable is immediately obvious. + // Even if the compiler may be able to infer a type, this inference will be unavailable + // to a person who is reviewing a GitHub diff. This rule makes writing code harder, + // but writing code is a much less important activity than reading it. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/explicit-function-return-type': [ + 1, + { + allowExpressions: true, + allowTypedFunctionExpressions: true, + allowHigherOrderFunctions: false + } + ], + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: although this is a recommended rule, it is up to dev to select coding style. + // Set to 1 (warning) or 2 (error) to enable. + '@typescript-eslint/explicit-member-accessibility': 0, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-array-constructor': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // + // RATIONALE: The "any" keyword disables static type checking, the main benefit of using TypeScript. + // This rule should be suppressed only in very special cases such as JSON.stringify() + // where the type really can be anything. Even if the type is flexible, another type + // may be more appropriate such as "unknown", "{}", or "Record". + '@typescript-eslint/no-explicit-any': 1, + // RATIONALE: The #1 rule of promises is that every promise chain must be terminated by a catch() + // handler. Thus wherever a Promise arises, the code must either append a catch handler, + // or else return the object to a caller (who assumes this responsibility). Unterminated + // promise chains are a serious issue. Besides causing errors to be silently ignored, + // they can also cause a NodeJS process to terminate unexpectedly. + '@typescript-eslint/no-floating-promises': 2, + // RATIONALE: Catches a common coding mistake. + '@typescript-eslint/no-for-in-array': 2, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-misused-new': 2, + // RATIONALE: The "namespace" keyword is not recommended for organizing code because JavaScript lacks + // a "using" statement to traverse namespaces. Nested namespaces prevent certain bundler + // optimizations. If you are declaring loose functions/variables, it's better to make them + // static members of a class, since classes support property getters and their private + // members are accessible by unit tests. Also, the exercise of choosing a meaningful + // class name tends to produce more discoverable APIs: for example, search+replacing + // the function "reverse()" is likely to return many false matches, whereas if we always + // write "Text.reverse()" is more unique. For large scale organization, it's recommended + // to decompose your code into separate NPM packages, which ensures that component + // dependencies are tracked more conscientiously. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-namespace': [ + 1, + { + allowDeclarations: false, + allowDefinitionFiles: false + } + ], + // RATIONALE: Parameter properties provide a shorthand such as "constructor(public title: string)" + // that avoids the effort of declaring "title" as a field. This TypeScript feature makes + // code easier to write, but arguably sacrifices readability: In the notes for + // "@typescript-eslint/member-ordering" we pointed out that fields are central to + // a class's design, so we wouldn't want to bury them in a constructor signature + // just to save some typing. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Set to 1 (warning) or 2 (error) to enable the rule + '@typescript-eslint/parameter-properties': 0, + // RATIONALE: When left in shipping code, unused variables often indicate a mistake. Dead code + // may impact performance. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-unused-vars': [ + 1, + { + vars: 'all', + // Unused function arguments often indicate a mistake in JavaScript code. However in TypeScript code, + // the compiler catches most of those mistakes, and unused arguments are fairly common for type signatures + // that are overriding a base class method or implementing an interface. + args: 'none' + } + ], + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/no-use-before-define': [ + 2, + { + functions: false, + classes: true, + variables: true, + enums: true, + typedefs: true + } + ], + // Disallows require statements except in import statements. + // In other words, the use of forms such as var foo = require("foo") are banned. Instead use ES6 style imports or import foo = require("foo") imports. + '@typescript-eslint/no-var-requires': 'error', + // RATIONALE: The "module" keyword is deprecated except when describing legacy libraries. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + '@typescript-eslint/prefer-namespace-keyword': 1, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: it's up to developer to decide if he wants to add type annotations + // Set to 1 (warning) or 2 (error) to enable the rule + '@typescript-eslint/no-inferrable-types': 0, + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + // Rationale to disable: declaration of empty interfaces may be helpful for generic types scenarios + '@typescript-eslint/no-empty-interface': 0, + // RATIONALE: This rule warns if setters are defined without getters, which is probably a mistake. + 'accessor-pairs': 1, + // RATIONALE: In TypeScript, if you write x["y"] instead of x.y, it disables type checking. + 'dot-notation': [ + 1, + { + allowPattern: '^_' + } + ], + // RATIONALE: Catches code that is likely to be incorrect + eqeqeq: 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'for-direction': 1, + // RATIONALE: Catches a common coding mistake. + 'guard-for-in': 2, + // RATIONALE: If you have more than 2,000 lines in a single source file, it's probably time + // to split up your code. + 'max-lines': ['warn', { max: 2000 }], + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-async-promise-executor': 2, + // RATIONALE: Deprecated language feature. + 'no-caller': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-compare-neg-zero': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-cond-assign': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-constant-condition': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-control-regex': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-debugger': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-delete-var': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-duplicate-case': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty-character-class': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-empty-pattern': 1, + // RATIONALE: Eval is a security concern and a performance concern. + 'no-eval': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-ex-assign': 2, + // RATIONALE: System types are global and should not be tampered with in a scalable code base. + // If two different libraries (or two versions of the same library) both try to modify + // a type, only one of them can win. Polyfills are acceptable because they implement + // a standardized interoperable contract, but polyfills are generally coded in plain + // JavaScript. + 'no-extend-native': 1, + // Disallow unnecessary labels + 'no-extra-label': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-fallthrough': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-func-assign': 1, + // RATIONALE: Catches a common coding mistake. + 'no-implied-eval': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-invalid-regexp': 2, + // RATIONALE: Catches a common coding mistake. + 'no-label-var': 2, + // RATIONALE: Eliminates redundant code. + 'no-lone-blocks': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-misleading-character-class': 2, + // RATIONALE: Catches a common coding mistake. + 'no-multi-str': 2, + // RATIONALE: It's generally a bad practice to call "new Thing()" without assigning the result to + // a variable. Either it's part of an awkward expression like "(new Thing()).doSomething()", + // or else implies that the constructor is doing nontrivial computations, which is often + // a poor class design. + 'no-new': 1, + // RATIONALE: Obsolete language feature that is deprecated. + 'no-new-func': 2, + // RATIONALE: Obsolete language feature that is deprecated. + 'no-new-object': 2, + // RATIONALE: Obsolete notation. + 'no-new-wrappers': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-octal': 2, + // RATIONALE: Catches code that is likely to be incorrect + 'no-octal-escape': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-regex-spaces': 2, + // RATIONALE: Catches a common coding mistake. + 'no-return-assign': 2, + // RATIONALE: Security risk. + 'no-script-url': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-self-assign': 2, + // RATIONALE: Catches a common coding mistake. + 'no-self-compare': 2, + // RATIONALE: This avoids statements such as "while (a = next(), a && a.length);" that use + // commas to create compound expressions. In general code is more readable if each + // step is split onto a separate line. This also makes it easier to set breakpoints + // in the debugger. + 'no-sequences': 1, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-shadow-restricted-names': 2, + // RATIONALE: Obsolete language feature that is deprecated. + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-sparse-arrays': 2, + // RATIONALE: Although in theory JavaScript allows any possible data type to be thrown as an exception, + // such flexibility adds pointless complexity, by requiring every catch block to test + // the type of the object that it receives. Whereas if catch blocks can always assume + // that their object implements the "Error" contract, then the code is simpler, and + // we generally get useful additional information like a tool stack. + 'no-throw-literal': 2, + // RATIONALE: Catches a common coding mistake. + 'no-unmodified-loop-condition': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-unsafe-finally': 2, + // RATIONALE: Catches a common coding mistake. + 'no-unused-expressions': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-unused-labels': 1, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-useless-catch': 1, + // RATIONALE: Avoids a potential performance problem. + 'no-useless-concat': 1, + // RATIONALE: The "var" keyword is deprecated because of its confusing "hoisting" behavior. + // Always use "let" or "const" instead. + // + // STANDARDIZED BY: @typescript-eslint\eslint-plugin\dist\configs\recommended.json + 'no-var': 2, + // RATIONALE: Generally not needed in modern code. + 'no-void': 1, + // RATIONALE: Obsolete language feature that is deprecated. + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'no-with': 2, + // RATIONALE: Makes logic easier to understand, since constants always have a known value + // @typescript-eslint\eslint-plugin\dist\configs\eslint-recommended.js + 'prefer-const': 1, + // RATIONALE: Catches a common coding mistake where "resolve" and "reject" are confused. + 'promise/param-names': 2, + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'require-atomic-updates': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'require-yield': 1, + // "Use strict" is redundant when using the TypeScript compiler. + strict: [2, 'never'], + // RATIONALE: Catches code that is likely to be incorrect + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + 'use-isnan': 2, + // STANDARDIZED BY: eslint\conf\eslint-recommended.js + // Set to 1 (warning) or 2 (error) to enable. + // Rationale to disable: !!{} + 'no-extra-boolean-cast': 0, + // ==================================================================== + // @microsoft/eslint-plugin-spfx + // ==================================================================== + '@microsoft/spfx/no-require-ensure': 2 + } + }, + { + // For unit tests, we can be a little bit less strict. The settings below revise the + // defaults specified in the extended configurations, as well as above. + files: [ + // Test files + '*.test.ts', + '*.test.tsx', + '*.spec.ts', + '*.spec.tsx', + + // Facebook convention + '**/__mocks__/*.ts', + '**/__mocks__/*.tsx', + '**/__tests__/*.ts', + '**/__tests__/*.tsx', + + // Microsoft convention + '**/test/*.ts', + '**/test/*.tsx' + ], + rules: {} + } + ] +}; diff --git a/templates/copilot-component-react/.gitignore b/templates/copilot-component-react/.gitignore new file mode 100644 index 00000000..56bc0edb --- /dev/null +++ b/templates/copilot-component-react/.gitignore @@ -0,0 +1,34 @@ +# Logs +logs +*.log +npm-debug.log* + +# Dependency directories +node_modules + +# Build generated files +dist +lib +lib-dts +lib-commonjs +lib-esm +jest-output +release +solution +teams +temp +*.sppkg +.heft +.spfx-scaffold.jsonl + +# Coverage directory used by tools like istanbul +coverage + +# OSX +.DS_Store + +# Visual Studio files +.ntvs_analysis.dat +.vs +bin +obj diff --git a/templates/copilot-component-react/.npmignore b/templates/copilot-component-react/.npmignore new file mode 100644 index 00000000..a2378457 --- /dev/null +++ b/templates/copilot-component-react/.npmignore @@ -0,0 +1,32 @@ +# Ignore everything by default +** + +# Use negative patterns to bring back the specific things we want to publish +!/bin/** +!/dist/** +!/EULA/** +!/lib/** +!/lib-*/** +!ThirdPartyNotice.txt + +# Ignore certain files in the above folders +/dist/*.stats.* +/dist/**/*.map +/lib/**/*.map +/lib/**/*.test.* +/lib/**/test/** +/lib-*/**/*.map +/lib-*/**/*.test.* +/lib-*/**/test/** + +# NOTE: These don't need to be specified, because NPM includes them automatically. +# +# package.json +# README (and its variants) +# CHANGELOG (and its variants) +# LICENSE / LICENCE + +## Project specific definitions +# ----------------------------- +/lib/**/integration-test/** +/lib/scripts/** \ No newline at end of file diff --git a/templates/copilot-component-react/README.md b/templates/copilot-component-react/README.md new file mode 100644 index 00000000..a7736ba0 --- /dev/null +++ b/templates/copilot-component-react/README.md @@ -0,0 +1,67 @@ +# <%= libraryName %> + +## Summary + +Short summary on functionality and used technologies. + +[picture of the solution in action, if possible] + +## Used SharePoint Framework Version + +[![version](https://img.shields.io/badge/version-<%= spfxVersionForBadgeUrl %>-green.svg)](https://img.shields.io/badge/version-<%= spfxVersionForBadgeUrl %>-green.svg) + +## Applies to + +- [SharePoint Framework](https://aka.ms/spfx) +- [Microsoft 365 Copilot](https://learn.microsoft.com/copilot/microsoft-365/) + +> Get your own free development tenant by subscribing to [Microsoft 365 developer program](http://aka.ms/o365devprogram) + +## Prerequisites + +> Any special pre-requisites? + +## Solution + +| Solution | Author(s) | +| ----------- | ------------------------------------------------------- | +| folder name | Author details (name, company, twitter alias with link) | + +## Version history + +| Version | Date | Comments | +| ------- | ---------------- | --------------- | +| 1.0 | January 1, 2025 | Initial release | + +## Disclaimer + +**THIS CODE IS PROVIDED _AS IS_ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.** + +--- + +## Minimal Path to Awesome + +- Clone this repository +- Ensure that you are at the solution folder +- in the command-line run: + - `npm install -g @rushstack/heft` + - `npm install` + - `heft start` + +> Include any additional steps as needed. + +Other build commands can be listed using `heft --help`. + +## Features + +This Copilot Component renders a greeting card when invoked by Microsoft 365 Copilot. + +- Demonstrates the `BaseCopilotComponent` base class +- Uses Zod for properties schema (single source of truth for TypeScript types and JSON Schema) +- Includes a declarative agent manifest for Microsoft 365 Copilot + +## References + +- [Getting started with SharePoint Framework](https://docs.microsoft.com/sharepoint/dev/spfx/set-up-your-developer-tenant) +- [Microsoft 365 Copilot extensibility](https://learn.microsoft.com/copilot/microsoft-365/extensibility/) +- [Heft Documentation](https://heft.rushstack.io/) diff --git a/templates/copilot-component-react/config/config.json b/templates/copilot-component-react/config/config.json new file mode 100644 index 00000000..2dabb468 --- /dev/null +++ b/templates/copilot-component-react/config/config.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/config.2.0.schema.json", + "version": "2.0", + "bundles": { + "<%= componentName.hyphen %>-copilot-component": { + "components": [ + { + "entrypoint": "./lib/<%= componentName.pascal %>CopilotComponent.js", + "manifest": "./src/<%= componentName.hyphen %>-copilot-component.manifest.json" + } + ] + } + }, + "externals": {}, + "localizedResources": { + "<%= componentName.pascal %>CopilotComponentStrings": "lib/loc/{locale}.js" + } +} diff --git a/templates/copilot-component-react/config/copilot-agent.json b/templates/copilot-component-react/config/copilot-agent.json new file mode 100644 index 00000000..88a389c9 --- /dev/null +++ b/templates/copilot-component-react/config/copilot-agent.json @@ -0,0 +1,11 @@ +{ + "$schema": "../node_modules/@microsoft/spfx-heft-plugins/lib-commonjs/plugins/copilotAgentPlugin/copilot-agent.schema.json", + + "agents": [ + { + "name": { "default": "<%= componentName %> Agent" }, + "description": { "default": "<%= componentDescription %>" }, + "components": ["<%= componentId %>"] + } + ] +} diff --git a/templates/copilot-component-react/config/package-solution.json b/templates/copilot-component-react/config/package-solution.json new file mode 100644 index 00000000..85e86dfc --- /dev/null +++ b/templates/copilot-component-react/config/package-solution.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/package-solution.schema.json", + "solution": { + "name": "<%= libraryName %>-client-side-solution", + "id": "<%= solutionId %>", + "version": "1.0.0.0", + "includeClientSideAssets": true, + "skipFeatureDeployment": true, + "isDomainIsolated": false, + "developer": { + "name": "", + "websiteUrl": "", + "privacyUrl": "", + "termsOfUseUrl": "", + "mpnId": "Undefined-<%= spfxVersion %>" + }, + "metadata": { + "shortDescription": { + "default": "<%= componentDescription %>" + }, + "longDescription": { + "default": "<%= componentDescription %>" + }, + "screenshotPaths": [], + "videoUrl": "", + "categories": [] + }, + "features": [ + { + "title": "<%= libraryName %> Feature", + "description": "The feature that activates elements of the <%= libraryName %> solution.", + "id": "<%= featureId %>", + "version": "1.0.0.0" + } + ] + }, + "paths": { + "zippedPackage": "solution/<%= libraryName %>.sppkg" + } +} diff --git a/templates/copilot-component-react/config/rig.json b/templates/copilot-component-react/config/rig.json new file mode 100644 index 00000000..99e34318 --- /dev/null +++ b/templates/copilot-component-react/config/rig.json @@ -0,0 +1,7 @@ +{ + // The "rig.json" file directs tools to look for their config files in an external package. + // Documentation for this system: https://www.npmjs.com/package/@rushstack/rig-package + "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", + + "rigPackageName": "@microsoft/spfx-web-build-rig" +} diff --git a/templates/copilot-component-react/config/serve.json b/templates/copilot-component-react/config/serve.json new file mode 100644 index 00000000..cb0f86dd --- /dev/null +++ b/templates/copilot-component-react/config/serve.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/spfx-serve.schema.json", + "port": 4321, + "https": true, + "initialPage": "https://{tenantDomain}/_layouts/CopilotWorkbench.aspx" +} diff --git a/templates/copilot-component-react/config/typescript.json b/templates/copilot-component-react/config/typescript.json new file mode 100644 index 00000000..f7a1069b --- /dev/null +++ b/templates/copilot-component-react/config/typescript.json @@ -0,0 +1,9 @@ +{ + "extends": "@microsoft/spfx-web-build-rig/profiles/default/config/typescript.json", + + "staticAssetsToCopy": { + "fileExtensions": [".resx", ".jpg", ".png", ".woff", ".eot", ".ttf", ".svg", ".gif"], + + "includeGlobs": ["loc/*.js"] + } +} diff --git a/templates/copilot-component-react/copilot/ai-plugin.json b/templates/copilot-component-react/copilot/ai-plugin.json new file mode 100644 index 00000000..54ae5093 --- /dev/null +++ b/templates/copilot-component-react/copilot/ai-plugin.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/copilot/plugin/v2.4/schema.json", + "schema_version": "v2.4", + "namespace": "<%= componentName.camel %>", + "name_for_human": "<%= componentName %> Agent", + "description_for_human": "<%= componentDescription %>", + "description_for_model": "<%= componentDescription %>", + "contact_email": "publisher@contoso.com" +} diff --git a/templates/copilot-component-react/copilot/color.png b/templates/copilot-component-react/copilot/color.png new file mode 100644 index 00000000..7cdf55b0 Binary files /dev/null and b/templates/copilot-component-react/copilot/color.png differ diff --git a/templates/copilot-component-react/copilot/declarativeAgent.json b/templates/copilot-component-react/copilot/declarativeAgent.json new file mode 100644 index 00000000..959d675a --- /dev/null +++ b/templates/copilot-component-react/copilot/declarativeAgent.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.8/schema.json", + "version": "v1.8", + "name": "<%= componentName %> Agent", + "description": "<%= componentDescription %>", + "instructions": "$[file('instruction.txt')]", + "conversation_starters": [ + { + "title": "Get started", + "text": "What can you do?" + } + ], + "actions": [ + { + "id": "<%= componentName.camel %>Action", + "file": "ai-plugin.json" + } + ] +} diff --git a/templates/copilot-component-react/copilot/instruction.txt b/templates/copilot-component-react/copilot/instruction.txt new file mode 100644 index 00000000..8e824af7 --- /dev/null +++ b/templates/copilot-component-react/copilot/instruction.txt @@ -0,0 +1,3 @@ +You are the <%= componentName %> Agent — an SPFx CopilotComponent deployed as a Microsoft 365 Copilot declarative agent. + +When the user asks you to perform an action, call the appropriate tool. Keep responses short and helpful. diff --git a/templates/copilot-component-react/copilot/manifest.json b/templates/copilot-component-react/copilot/manifest.json new file mode 100644 index 00000000..3c27c53e --- /dev/null +++ b/templates/copilot-component-react/copilot/manifest.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.29/MicrosoftTeams.schema.json", + "manifestVersion": "1.29", + "version": "1.0.0", + "id": "<%= solutionId %>", + "developer": { + "name": "Contoso", + "websiteUrl": "https://www.contoso.com", + "privacyUrl": "https://www.contoso.com/privacy", + "termsOfUseUrl": "https://www.contoso.com/terms" + }, + "icons": { + "color": "color.png", + "outline": "outline.png" + }, + "name": { + "short": "<%= componentName %> Agent", + "full": "<%= componentName %> Agent — SPFx CopilotComponent" + }, + "description": { + "short": "<%= componentDescription %>", + "full": "<%= componentDescription %>" + }, + "accentColor": "#FFFFFF", + "copilotAgents": { + "declarativeAgents": [ + { + "id": "<%= componentName.camel %>Agent", + "file": "declarativeAgent.json" + } + ] + }, + "permissions": ["identity"], + "validDomains": [] +} diff --git a/templates/copilot-component-react/copilot/outline.png b/templates/copilot-component-react/copilot/outline.png new file mode 100644 index 00000000..e8cb4b6b Binary files /dev/null and b/templates/copilot-component-react/copilot/outline.png differ diff --git a/templates/copilot-component-react/package.json b/templates/copilot-component-react/package.json new file mode 100644 index 00000000..f4e86460 --- /dev/null +++ b/templates/copilot-component-react/package.json @@ -0,0 +1,47 @@ +{ + "name": "<%= libraryName %>", + "version": "0.0.1", + "private": true, + "engines": { + "node": ">=22.14.0 < 23.0.0" + }, + "scripts": { + "build": "heft test --clean --production && heft package-solution --production", + "start": "heft start --clean", + "clean": "heft clean", + "_phase:build": "heft run --only build -- --clean", + "_phase:test": "heft run --only test -- --clean", + "_phase:package-solution": "heft run --only package-solution -- --clean" + }, + "dependencies": { + "@fluentui/react-components": "^9.70.0", + "@fluentui/react-icons": "2.0.314", + "@microsoft/sp-copilot-component": "<%= spfxVersion %>", + "@microsoft/sp-http": "<%= spfxVersion %>", + "react": "17.0.1", + "react-dom": "17.0.1", + "tslib": "2.3.1", + "zod": "3.24.1", + "zod-to-json-schema": "3.24.1" + }, + "devDependencies": { + "@microsoft/eslint-config-spfx": "<%= spfxVersion %>", + "@microsoft/eslint-plugin-spfx": "<%= spfxVersion %>", + "@microsoft/sp-module-interfaces": "<%= spfxVersion %>", + "@microsoft/spfx-web-build-rig": "<%= spfxVersion %>", + "@rushstack/eslint-config": "4.6.4", + "@rushstack/heft": "^1.2.19", + "@types/jest": "~30.0.0", + "@types/react": "17.0.45", + "@types/react-dom": "17.0.17", + "@types/webpack-env": "~1.15.2", + "@typescript-eslint/parser": "8.48.1", + "eslint": "8.57.1", + "eslint-plugin-react": "^7.35.0", + "eslint-plugin-react-hooks": "^4.6.2", + "typescript": "~5.8.3" + }, + "resolutions": { + "@types/react": "17.0.45" + } +} diff --git a/templates/copilot-component-react/src/components/I{componentName.pascal}Props.ts b/templates/copilot-component-react/src/components/I{componentName.pascal}Props.ts new file mode 100644 index 00000000..ec08ea2a --- /dev/null +++ b/templates/copilot-component-react/src/components/I{componentName.pascal}Props.ts @@ -0,0 +1,47 @@ +import type { + ICopilotComponentHostContext, + ISPCopilotBridge, + SPCopilotDisplayMode +} from '@microsoft/sp-copilot-component'; + +export interface I<%= componentName.pascal %>Strings { + ExpandButtonLabel: string; + OpenSiteButtonLabel: string; + FollowUpButtonLabel: string; + ResizeButtonLabel: string; + CompactButtonLabel: string; + SiteBadgePrefix: string; + ThemeBadgePrefix: string; + ModeBadgePrefix: string; + GreetingPrefix: string; + UnknownTheme: string; + DefaultDisplayMode: string; + FollowUpMessage: string; +} + +export interface I<%= componentName.pascal %>Props { + /** The message passed as a tool argument from the Copilot host. */ + message: string; + /** User display name fetched from Microsoft Graph /me. */ + userDisplayName: string; + /** Site title fetched from SharePoint REST /_api/web. */ + siteTitle: string; + /** Absolute URL of the current SharePoint site. */ + siteUrl: string; + /** Host context (theme, display mode) from the Copilot host. */ + hostContext: ICopilotComponentHostContext; + /** Bridge to communicate with the Copilot host (public API surface). */ + bridge: ISPCopilotBridge; + /** Request the host to change display mode (e.g. 'fullscreen'). */ + onRequestDisplayMode: (mode: SPCopilotDisplayMode) => Promise; + /** Request the host to resize the component iframe. */ + onRequestSizeChange: (width: number, height: number) => Promise; + /** + * Document the FluentProvider should inject its theme styles into. Pass + * `domElement.ownerDocument` so Griffel writes CSS into the correct iframe + * document rather than the top-level page. + */ + targetDocument: Document | undefined; + /** Localized strings for UI labels. */ + strings: I<%= componentName.pascal %>Strings; +} diff --git a/templates/copilot-component-react/src/components/{componentName.pascal}.tsx b/templates/copilot-component-react/src/components/{componentName.pascal}.tsx new file mode 100644 index 00000000..a97d997c --- /dev/null +++ b/templates/copilot-component-react/src/components/{componentName.pascal}.tsx @@ -0,0 +1,158 @@ +import * as React from 'react'; +import { + FluentProvider, + IdPrefixProvider, + webLightTheme, + webDarkTheme, + Title3, + Body1, + Badge, + Button, + Card, + CardHeader, + makeStyles, + tokens +} from '@fluentui/react-components'; +import { + ArrowExpand24Regular, + Open24Regular, + Chat24Regular, + ResizeLarge24Regular +} from '@fluentui/react-icons'; +import { createCopilotTextContent } from '@microsoft/sp-copilot-component'; + +import type { I<%= componentName.pascal %>Props } from './I<%= componentName.pascal %>Props'; + +const useStyles = makeStyles({ + root: { + display: 'flex', + flexDirection: 'column', + gap: tokens.spacingVerticalM, + padding: tokens.spacingHorizontalM + }, + header: { + display: 'flex', + flexDirection: 'column', + gap: tokens.spacingVerticalXS + }, + badges: { + display: 'flex', + gap: tokens.spacingHorizontalS, + flexWrap: 'wrap' + }, + actions: { + display: 'flex', + gap: tokens.spacingHorizontalS, + flexWrap: 'wrap' + } +}); + +const EXPANDED_WIDTH: number = 600; +const EXPANDED_HEIGHT: number = 400; +const COMPACT_WIDTH: number = 400; +const COMPACT_HEIGHT: number = 250; + +/** + * Main React UI for the Copilot Component starter template. + * + * Demonstrates: + * - **Theming** — wraps content in `` with a theme derived + * from the host's `hostContext.theme` (`'light' | 'dark'`). + * - **Host context** — surfaces the current display mode, theme, and + * available display modes as live badges. + * - **Bridge actions** — four buttons that exercise different bridge methods + * to show how a component communicates with the Copilot host. + */ +export default function <%= componentName.pascal %>(props: I<%= componentName.pascal %>Props): React.ReactElement { + const { + message, + userDisplayName, + siteTitle, + siteUrl, + hostContext, + bridge, + onRequestDisplayMode, + onRequestSizeChange, + strings + } = props; + const styles = useStyles(); + + const [isExpanded, setIsExpanded] = React.useState(false); + + const theme = hostContext.theme === 'dark' ? webDarkTheme : webLightTheme; + + // Request the Copilot host to switch this component to fullscreen mode. + const handleExpand = React.useCallback(async (): Promise => { + await onRequestDisplayMode('fullscreen'); + }, [onRequestDisplayMode]); + + // Ask the host to open the site URL in the user's browser. + const handleOpenLink = React.useCallback(async (): Promise => { + await bridge.openLinkAsync(siteUrl); + }, [bridge, siteUrl]); + + // Send a follow-up message into the Copilot conversation on behalf of the user. + // This triggers Copilot to respond, demonstrating how a component can drive the chat. + const handleFollowUp = React.useCallback(async (): Promise => { + await bridge.sendFollowUpMessageAsync([ + createCopilotTextContent(strings.FollowUpMessage.replace('{0}', siteTitle)) + ]); + }, [bridge, siteTitle, strings]); + + // Toggle between compact and expanded sizes by requesting a resize from the host. + const handleResize = React.useCallback(async (): Promise => { + const nextExpanded: boolean = !isExpanded; + if (nextExpanded) { + await onRequestSizeChange(EXPANDED_WIDTH, EXPANDED_HEIGHT); + } else { + await onRequestSizeChange(COMPACT_WIDTH, COMPACT_HEIGHT); + } + setIsExpanded(nextExpanded); + }, [onRequestSizeChange, isExpanded]); + + return ( + + +
+ + + {strings.GreetingPrefix} {userDisplayName}! + + } + description={{message}} + /> + +
+ + {strings.SiteBadgePrefix} {siteTitle} + + + {strings.ThemeBadgePrefix} {hostContext.theme || strings.UnknownTheme} + + + {strings.ModeBadgePrefix} {hostContext.displayMode || strings.DefaultDisplayMode} + +
+
+ +
+ + + + +
+
+
+
+ ); +} diff --git a/templates/copilot-component-react/src/loc/en-us.js b/templates/copilot-component-react/src/loc/en-us.js new file mode 100644 index 00000000..4de79411 --- /dev/null +++ b/templates/copilot-component-react/src/loc/en-us.js @@ -0,0 +1,16 @@ +define([], function () { + return { + ExpandButtonLabel: 'Expand', + OpenSiteButtonLabel: 'Open Site', + FollowUpButtonLabel: 'Follow Up', + ResizeButtonLabel: 'Resize', + CompactButtonLabel: 'Compact', + SiteBadgePrefix: 'Site:', + ThemeBadgePrefix: 'Theme:', + ModeBadgePrefix: 'Mode:', + GreetingPrefix: 'Hello,', + UnknownTheme: 'unknown', + DefaultDisplayMode: 'inline', + FollowUpMessage: 'Tell me more about the "{0}" site.' + }; +}); diff --git a/templates/copilot-component-react/src/loc/{componentName.camel}CopilotComponentStrings.d.ts b/templates/copilot-component-react/src/loc/{componentName.camel}CopilotComponentStrings.d.ts new file mode 100644 index 00000000..0e8bd6c5 --- /dev/null +++ b/templates/copilot-component-react/src/loc/{componentName.camel}CopilotComponentStrings.d.ts @@ -0,0 +1,19 @@ +declare interface I<%= componentName.pascal %>CopilotComponentStrings { + ExpandButtonLabel: string; + OpenSiteButtonLabel: string; + FollowUpButtonLabel: string; + ResizeButtonLabel: string; + CompactButtonLabel: string; + SiteBadgePrefix: string; + ThemeBadgePrefix: string; + ModeBadgePrefix: string; + GreetingPrefix: string; + UnknownTheme: string; + DefaultDisplayMode: string; + FollowUpMessage: string; +} + +declare module '<%= componentName.pascal %>CopilotComponentStrings' { + const strings: I<%= componentName.pascal %>CopilotComponentStrings; + export = strings; +} diff --git a/templates/copilot-component-react/src/{componentName.hyphen}-copilot-component.manifest.json b/templates/copilot-component-react/src/{componentName.hyphen}-copilot-component.manifest.json new file mode 100644 index 00000000..4cbecb24 --- /dev/null +++ b/templates/copilot-component-react/src/{componentName.hyphen}-copilot-component.manifest.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-component-manifest.schema.json", + + "id": "<%= componentId %>", + "alias": "<%= componentAlias %>CopilotComponent", + "componentType": "CopilotComponent", + "copilotType": "Ux", + "version": "*", + "manifestVersion": 2, + + "capabilities": { + "availableDisplayModes": ["inline", "fullscreen"] + }, + + "tools": [ + { + "name": "<%= componentName.pascal %>Tool", + "description": { + "default": "<%= componentDescription %>" + }, + "propertiesSchema": { + "id": "$../lib/<%= componentName.pascal %>Properties.js:default;" + } + } + ] +} diff --git a/templates/copilot-component-react/src/{componentName.pascal}CopilotComponent.tsx b/templates/copilot-component-react/src/{componentName.pascal}CopilotComponent.tsx new file mode 100644 index 00000000..4d3766b6 --- /dev/null +++ b/templates/copilot-component-react/src/{componentName.pascal}CopilotComponent.tsx @@ -0,0 +1,83 @@ +import * as React from 'react'; +import * as ReactDOM from 'react-dom'; + +import { BaseCopilotComponent } from '@microsoft/sp-copilot-component'; +import type { SPCopilotDisplayMode } from '@microsoft/sp-copilot-component'; +import type { MSGraphClientV3 } from '@microsoft/sp-http'; +import { SPHttpClient, type SPHttpClientResponse } from '@microsoft/sp-http'; + +import <%= componentName.pascal %> from './components/<%= componentName.pascal %>'; +import type { I<%= componentName.pascal %>Props } from './components/I<%= componentName.pascal %>Props'; +import type { I<%= componentName.pascal %>CopilotComponentProperties } from './<%= componentName.pascal %>Properties'; + +import * as strings from '<%= componentName.pascal %>CopilotComponentStrings'; + +/** + * SPFx Copilot Component that renders a React-based UI demonstrating the + * platform's headline capabilities: + * + * - **Brokered SSO data calls** — Microsoft Graph (`/me`) and SharePoint REST + * (`/_api/web`) with zero token code. The SPFx runtime automatically + * provisions tokens for `SPHttpClient` and `MSGraphClientV3`. + * - **Host context & theming** — reads `hostContext.theme` and + * `hostContext.displayMode` to adapt to the Copilot host environment. + * - **Bridge actions** — demonstrates `requestDisplayModeAsync`, + * `openLinkAsync`, `sendFollowUpMessageAsync`, and `requestSizeChangeAsync`. + */ +export default class <%= componentName.pascal %>CopilotComponent extends BaseCopilotComponentCopilotComponentProperties> { + private _userDisplayName: string = ''; + private _siteTitle: string = ''; + private _siteUrl: string = ''; + + protected override async onInit(): Promise { + this._siteUrl = this.context.pageContext.web.absoluteUrl; + + // Fetch user info from Microsoft Graph (brokered SSO — no token code needed). + // Wrapped in try/catch so the component still renders in the workbench where + // real services may not be available. + try { + const graphClient: MSGraphClientV3 = await this.context.msGraphClientFactory.getClient('3'); + const me: { displayName?: string } = await graphClient.api('/me').select('displayName').get(); + this._userDisplayName = me.displayName || 'User'; + } catch { + this._userDisplayName = this.context.pageContext.user?.displayName || 'User'; + } + + // Fetch site info from SharePoint REST API (brokered SSO). + try { + const response: SPHttpClientResponse = await this.context.spHttpClient.get( + `${this._siteUrl}/_api/web?$select=Title`, + SPHttpClient.configurations.v1 + ); + const webInfo: { Title?: string } = await response.json(); + this._siteTitle = webInfo.Title || 'SharePoint Site'; + } catch { + this._siteTitle = 'SharePoint Site'; + } + } + + protected override render(): void { + const props: I<%= componentName.pascal %>Props = { + message: this.properties.message, + userDisplayName: this._userDisplayName, + siteTitle: this._siteTitle, + siteUrl: this._siteUrl, + hostContext: this.hostContext, + bridge: this.context.copilotBridge, + onRequestDisplayMode: async (mode: SPCopilotDisplayMode): Promise => { + await this.requestDisplayModeAsync(mode); + }, + onRequestSizeChange: async (width: number, height: number): Promise => { + await this.requestSizeChangeAsync(width, height); + }, + targetDocument: this.context.domElement.ownerDocument, + strings + }; + + ReactDOM.render(React.createElement(<%= componentName.pascal %>, props), this.context.domElement); + } + + protected override async onTeardown(): Promise { + ReactDOM.unmountComponentAtNode(this.context.domElement); + } +} diff --git a/templates/copilot-component-react/src/{componentName.pascal}Properties.ts b/templates/copilot-component-react/src/{componentName.pascal}Properties.ts new file mode 100644 index 00000000..317bd67d --- /dev/null +++ b/templates/copilot-component-react/src/{componentName.pascal}Properties.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; +import zodToJsonSchema from 'zod-to-json-schema'; + +const propertiesSchema = z.object({ + message: z.string().describe('A message to display.') +}); + +export type I<%= componentName.pascal %>CopilotComponentProperties = z.infer; + +export default zodToJsonSchema(propertiesSchema); diff --git a/templates/copilot-component-react/template.json b/templates/copilot-component-react/template.json new file mode 100644 index 00000000..08d21261 --- /dev/null +++ b/templates/copilot-component-react/template.json @@ -0,0 +1,7 @@ +{ + "name": "copilot-component-react", + "category": "copilot", + "description": "A React-based Copilot Component template for SPFx", + "version": "0.0.1", + "spfxVersion": "1.24.0-beta.2" +} diff --git a/templates/copilot-component-react/tsconfig.json b/templates/copilot-component-react/tsconfig.json new file mode 100644 index 00000000..e054af28 --- /dev/null +++ b/templates/copilot-component-react/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "./node_modules/@microsoft/spfx-web-build-rig/profiles/default/tsconfig-base.json", + "watchOptions": { + // Prevent the TypeScript watch program from re-triggering incremental builds + // when the copilot-agent task regenerates its outputs (temp/copilot staging + // and the teams/.zip package) on every build, which otherwise causes + // an infinite build loop during `heft start` / `heft build-watch`. + "excludeDirectories": ["**/teams", "**/temp/copilot"] + } +} diff --git a/tests/spfx-template-test/src/tests/__snapshots__/multi-component.test.ts.snap b/tests/spfx-template-test/src/tests/__snapshots__/multi-component.test.ts.snap index 376f7a40..2ae5c56b 100644 --- a/tests/spfx-template-test/src/tests/__snapshots__/multi-component.test.ts.snap +++ b/tests/spfx-template-test/src/tests/__snapshots__/multi-component.test.ts.snap @@ -165,45 +165,51 @@ Object { exports[`Multi-component scaffolding should scaffold webpart-minimal then extension-application-customizer into same directory: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 20 templates: -[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] -[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] -[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] targetDir: [cyan]The following files will be generated:[default] @@ -236,45 +242,51 @@ targetDir: exports[`Multi-component scaffolding should scaffold webpart-minimal then extension-application-customizer into same directory: stdout 2`] = ` "Adding local template source: -Found 17 templates: +Found 20 templates: -[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] -[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] -[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] targetDir: [cyan]The following files will be generated:[default] diff --git a/tests/spfx-template-test/src/tests/__snapshots__/templates.test.ts.snap b/tests/spfx-template-test/src/tests/__snapshots__/templates.test.ts.snap index 23259011..e55e43a2 100644 --- a/tests/spfx-template-test/src/tests/__snapshots__/templates.test.ts.snap +++ b/tests/spfx-template-test/src/tests/__snapshots__/templates.test.ts.snap @@ -2,45 +2,51 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold ace-data-visualization template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: - -[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] -[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] -[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] targetDir: [cyan]The following files will be generated:[default] @@ -75,45 +81,51 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold ace-generic-card template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: - -[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] -[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] -[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] targetDir: [cyan]The following files will be generated:[default] @@ -148,45 +160,51 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold ace-generic-image-card template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: - -[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] -[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] -[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] targetDir: [cyan]The following files will be generated:[default] @@ -221,45 +239,51 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold ace-generic-primarytext-card template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: - -[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] -[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] -[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] targetDir: [cyan]The following files will be generated:[default] @@ -294,45 +318,51 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold ace-search-card template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: - -[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] -[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] -[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] targetDir: [cyan]The following files will be generated:[default] @@ -365,47 +395,288 @@ targetDir: " `; +exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold copilot-component-minimal template and match example output: stdout 1`] = ` +"Adding local template source: +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] +targetDir: + +[cyan]The following files will be generated:[default] +[green] .eslintrc.js[default] +[green] .gitignore[default] +[green] .npmignore[default] +[green] README.md[default] +[green] config/config.json[default] +[green] config/copilot-agent.json[default] +[green] config/package-solution.json[default] +[green] config/rig.json[default] +[green] config/serve.json[default] +[green] copilot/ai-plugin.json[default] +[green] copilot/color.png[default] +[green] copilot/declarativeAgent.json[default] +[green] copilot/instruction.txt[default] +[green] copilot/manifest.json[default] +[green] copilot/outline.png[default] +[green] package.json[default] +[green] src/MinimalCopilotComponent.ts[default] +[green] src/MinimalProperties.ts[default] +[green] src/minimal-copilot-component.manifest.json[default] +[green] tsconfig.json[default] + +" +`; + +exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold copilot-component-noframework template and match example output: stdout 1`] = ` +"Adding local template source: +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] +targetDir: + +[cyan]The following files will be generated:[default] +[green] .eslintrc.js[default] +[green] .gitignore[default] +[green] .npmignore[default] +[green] README.md[default] +[green] config/config.json[default] +[green] config/copilot-agent.json[default] +[green] config/package-solution.json[default] +[green] config/rig.json[default] +[green] config/sass.json[default] +[green] config/serve.json[default] +[green] config/typescript.json[default] +[green] copilot/ai-plugin.json[default] +[green] copilot/color.png[default] +[green] copilot/declarativeAgent.json[default] +[green] copilot/instruction.txt[default] +[green] copilot/manifest.json[default] +[green] copilot/outline.png[default] +[green] package.json[default] +[green] src/NoFrameworkCopilotComponent.module.scss[default] +[green] src/NoFrameworkCopilotComponent.ts[default] +[green] src/NoFrameworkProperties.ts[default] +[green] src/assets/welcome-dark.png[default] +[green] src/assets/welcome-light.png[default] +[green] src/images.d.ts[default] +[green] src/loc/en-us.js[default] +[green] src/loc/noFrameworkCopilotComponentStrings.d.ts[default] +[green] src/no-framework-copilot-component.manifest.json[default] +[green] tsconfig.json[default] + +" +`; + +exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold copilot-component-react template and match example output: stdout 1`] = ` +"Adding local template source: +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] +targetDir: + +[cyan]The following files will be generated:[default] +[green] .eslintrc.js[default] +[green] .gitignore[default] +[green] .npmignore[default] +[green] README.md[default] +[green] config/config.json[default] +[green] config/copilot-agent.json[default] +[green] config/package-solution.json[default] +[green] config/rig.json[default] +[green] config/serve.json[default] +[green] config/typescript.json[default] +[green] copilot/ai-plugin.json[default] +[green] copilot/color.png[default] +[green] copilot/declarativeAgent.json[default] +[green] copilot/instruction.txt[default] +[green] copilot/manifest.json[default] +[green] copilot/outline.png[default] +[green] package.json[default] +[green] src/SampleCopilotComponent.tsx[default] +[green] src/SampleProperties.ts[default] +[green] src/components/ISampleProps.ts[default] +[green] src/components/Sample.tsx[default] +[green] src/loc/en-us.js[default] +[green] src/loc/sampleCopilotComponentStrings.d.ts[default] +[green] src/sample-copilot-component.manifest.json[default] +[green] tsconfig.json[default] + +" +`; + exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold extension-application-customizer template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: - -[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] -[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] -[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] targetDir: [cyan]The following files will be generated:[default] @@ -437,45 +708,51 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold extension-fieldcustomizer-minimal template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: - -[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] -[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] -[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] targetDir: [cyan]The following files will be generated:[default] @@ -507,45 +784,51 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold extension-fieldcustomizer-noframework template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: - -[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] -[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] -[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] targetDir: [cyan]The following files will be generated:[default] @@ -577,45 +860,51 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold extension-fieldcustomizer-react template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: - -[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] -[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] -[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] targetDir: [cyan]The following files will be generated:[default] @@ -648,45 +937,51 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold extension-formcustomizer-noframework template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: - -[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] -[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] -[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] targetDir: [cyan]The following files will be generated:[default] @@ -717,45 +1012,51 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold extension-formcustomizer-react template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: - -[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] -[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] -[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] targetDir: [cyan]The following files will be generated:[default] @@ -785,45 +1086,51 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold extension-listviewcommandset template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: - -[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] -[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] -[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] targetDir: [cyan]The following files will be generated:[default] @@ -857,45 +1164,51 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold extension-search-query-modifier template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: - -[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] -[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] -[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] targetDir: [cyan]The following files will be generated:[default] @@ -927,45 +1240,51 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold library template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: - -[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] -[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] -[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] targetDir: [cyan]The following files will be generated:[default] @@ -1014,45 +1333,51 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold webpart-minimal template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: - -[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] -[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] -[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] targetDir: [cyan]The following files will be generated:[default] @@ -1085,45 +1410,51 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold webpart-noframework template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: - -[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] -[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] -[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] targetDir: [cyan]The following files will be generated:[default] @@ -1159,45 +1490,51 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold webpart-react template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: - -[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬──────────────[default][gray]┬───────┐[default] -[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] -[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼──────────────[default][gray]┼───────┤[default] -[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] -[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴──────────────[default][gray]┴───────┘[default] +Found 20 templates: + +[gray]┌───────────────────────────────────────[default][gray]┬───────────[default][gray]┬──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┬─────────[default][gray]┬───────────────[default][gray]┬───────┐[default] +[gray]│[default][red] Name [default][gray]│[default][red] Category [default][gray]│[default][red] Description [default][gray]│[default][red] Version [default][gray]│[default][red] SPFx Version [default][gray]│[default][red] Files [default][gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-data-visualization [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Data Visualization [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Generic Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-image-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Image Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-generic-primarytext-card [gray]│[default] ace [gray]│[default] A SharePoint Framework Adaptive Card Extension with Primary Text Card Template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] ace-search-card [gray]│[default] ace [gray]│[default] Adaptive Card Extension with Search Card template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-minimal [gray]│[default] copilot [gray]│[default] A minimal Copilot Component template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-noframework [gray]│[default] copilot [gray]│[default] A no-framework Copilot Component template (HTML/CSS) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 28 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] copilot-component-react [gray]│[default] copilot [gray]│[default] A React-based Copilot Component template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.24.0-beta.2 [gray]│[default] 25 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-application-customizer [gray]│[default] extension [gray]│[default] A SharePoint Framework Application Customizer extension template [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-minimal [gray]│[default] extension [gray]│[default] A minimal Field Customizer extension for SharePoint Framework without any framework dependencies [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework field customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-fieldcustomizer-react [gray]│[default] extension [gray]│[default] SharePoint Framework Field Customizer extension with React framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-noframework [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with no framework [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-formcustomizer-react [gray]│[default] extension [gray]│[default] A SharePoint Framework Form Customizer extension with React [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 20 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-listviewcommandset [gray]│[default] extension [gray]│[default] SharePoint Framework list view command set extension template [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 24 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] extension-search-query-modifier [gray]│[default] extension [gray]│[default] A SharePoint Framework search query modifier extension [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 22 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] library [gray]│[default] library [gray]│[default] A SharePoint Framework Library Component [gray]│[default] 1.0.0 [gray]│[default] 1.23.2 [gray]│[default] 21 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-minimal [gray]│[default] webpart [gray]│[default] A minimal web part template (no framework) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 23 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-noframework [gray]│[default] webpart [gray]│[default] A web part template with no framework (plain TypeScript) for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 26 [gray]│[default] +[gray]├───────────────────────────────────────[default][gray]┼───────────[default][gray]┼──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┼─────────[default][gray]┼───────────────[default][gray]┼───────┤[default] +[gray]│[default] webpart-react [gray]│[default] webpart [gray]│[default] A React-based web part template for SPFx [gray]│[default] 0.0.1 [gray]│[default] 1.23.2 [gray]│[default] 27 [gray]│[default] +[gray]└───────────────────────────────────────[default][gray]┴───────────[default][gray]┴──────────────────────────────────────────────────────────────────────────────────────────────────[default][gray]┴─────────[default][gray]┴───────────────[default][gray]┴───────┘[default] targetDir: [cyan]The following files will be generated:[default] diff --git a/tests/spfx-template-test/src/tests/templates.test.ts b/tests/spfx-template-test/src/tests/templates.test.ts index 42147bf5..ce449c2b 100644 --- a/tests/spfx-template-test/src/tests/templates.test.ts +++ b/tests/spfx-template-test/src/tests/templates.test.ts @@ -189,6 +189,33 @@ const TEMPLATE_CONFIGS: ITemplateConfig[] = [ componentName: 'Minimal', componentAlias: 'Minimal', componentDescription: 'Minimal Web Part Description' + }, + { + libraryName: '@spfx-template/copilot-component-minimal', + templateName: 'copilot-component-minimal', + templatePath: `${REPO_ROOT}/templates/copilot-component-minimal`, + localTemplatePath: TEMPLATES_DIR, + componentName: 'Minimal', + componentAlias: 'Minimal', + componentDescription: 'Minimal CopilotComponent Description' + }, + { + libraryName: '@spfx-template/copilot-component-noframework', + templateName: 'copilot-component-noframework', + templatePath: `${REPO_ROOT}/templates/copilot-component-noframework`, + localTemplatePath: TEMPLATES_DIR, + componentName: 'NoFramework', + componentAlias: 'NoFramework', + componentDescription: 'No Framework CopilotComponent Description' + }, + { + libraryName: '@spfx-template/copilot-component-react', + templateName: 'copilot-component-react', + templatePath: `${REPO_ROOT}/templates/copilot-component-react`, + localTemplatePath: TEMPLATES_DIR, + componentName: 'Sample', + componentAlias: 'Sample', + componentDescription: 'React CopilotComponent Description' } ];