From 04c349d5be69b064509088f0feb42f2dac0f7f19 Mon Sep 17 00:00:00 2001 From: Nick Pape <5674316+nick-pape@users.noreply.github.com> Date: Wed, 3 Jun 2026 11:16:46 -0500 Subject: [PATCH 1/9] Add copilot-component-minimal template Adds a new "copilot" template category and a minimal Copilot Component template based on the greeting-copilot-component reference implementation. The template scaffolds a hello-world CopilotComponent with Zod-based properties schema, declarative agent manifests, and copilot agent config. Note: the example is not registered in rush.json because @microsoft/sp-copilot-component has not been published yet. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../etc/spfx-template-api.api.md | 2 +- .../src/templating/SPFxTemplateJsonFile.ts | 5 +- apps/spfx-cli/README.md | 6 + ...copilot-component-template_2026-06-03.json | 10 ++ .../copilot-component-minimal/.eslintrc.js | 148 ++++++++++++++++++ examples/copilot-component-minimal/.gitignore | 33 ++++ examples/copilot-component-minimal/.npmignore | 32 ++++ examples/copilot-component-minimal/README.md | 67 ++++++++ .../config/config.json | 14 ++ .../config/copilot-agent.json | 11 ++ .../config/package-solution.json | 40 +++++ .../copilot-component-minimal/config/rig.json | 7 + .../config/serve.json | 10 ++ .../copilot/ai-plugin.json | 9 ++ .../copilot/color.png | Bin 0 -> 2106 bytes .../copilot/declarativeAgent.json | 19 +++ .../copilot/instruction.txt | 5 + .../copilot/manifest.json | 35 +++++ .../copilot/outline.png | Bin 0 -> 249 bytes .../copilot-component-minimal/package.json | 35 +++++ .../src/MinimalCopilotComponent.ts | 9 ++ .../src/MinimalProperties.ts | 10 ++ .../minimal-copilot-component.manifest.json | 26 +++ .../copilot-component-minimal/tsconfig.json | 3 + .../copilot-component-minimal/.eslintrc.js | 148 ++++++++++++++++++ .../copilot-component-minimal/.gitignore | 33 ++++ .../copilot-component-minimal/.npmignore | 32 ++++ templates/copilot-component-minimal/README.md | 67 ++++++++ .../config/config.json | 14 ++ .../config/copilot-agent.json | 11 ++ .../config/package-solution.json | 40 +++++ .../copilot-component-minimal/config/rig.json | 7 + .../config/serve.json | 10 ++ .../copilot/ai-plugin.json | 9 ++ .../copilot/color.png | Bin 0 -> 2106 bytes .../copilot/declarativeAgent.json | 19 +++ .../copilot/instruction.txt | 5 + .../copilot/manifest.json | 35 +++++ .../copilot/outline.png | Bin 0 -> 249 bytes .../copilot-component-minimal/package.json | 35 +++++ ...me.hyphen}-copilot-component.manifest.json | 26 +++ .../{componentName.pascal}CopilotComponent.ts | 9 ++ .../src/{componentName.pascal}Properties.ts | 10 ++ .../copilot-component-minimal/template.json | 7 + .../copilot-component-minimal/tsconfig.json | 3 + .../multi-component.test.ts.snap | 8 +- .../__snapshots__/templates.test.ts.snap | 138 ++++++++++++++-- .../src/tests/templates.test.ts | 9 ++ 48 files changed, 1189 insertions(+), 22 deletions(-) create mode 100644 common/changes/@microsoft/spfx-cli/add-copilot-component-template_2026-06-03.json create mode 100644 examples/copilot-component-minimal/.eslintrc.js create mode 100644 examples/copilot-component-minimal/.gitignore create mode 100644 examples/copilot-component-minimal/.npmignore create mode 100644 examples/copilot-component-minimal/README.md create mode 100644 examples/copilot-component-minimal/config/config.json create mode 100644 examples/copilot-component-minimal/config/copilot-agent.json create mode 100644 examples/copilot-component-minimal/config/package-solution.json create mode 100644 examples/copilot-component-minimal/config/rig.json create mode 100644 examples/copilot-component-minimal/config/serve.json create mode 100644 examples/copilot-component-minimal/copilot/ai-plugin.json create mode 100644 examples/copilot-component-minimal/copilot/color.png create mode 100644 examples/copilot-component-minimal/copilot/declarativeAgent.json create mode 100644 examples/copilot-component-minimal/copilot/instruction.txt create mode 100644 examples/copilot-component-minimal/copilot/manifest.json create mode 100644 examples/copilot-component-minimal/copilot/outline.png create mode 100644 examples/copilot-component-minimal/package.json create mode 100644 examples/copilot-component-minimal/src/MinimalCopilotComponent.ts create mode 100644 examples/copilot-component-minimal/src/MinimalProperties.ts create mode 100644 examples/copilot-component-minimal/src/minimal-copilot-component.manifest.json create mode 100644 examples/copilot-component-minimal/tsconfig.json create mode 100644 templates/copilot-component-minimal/.eslintrc.js create mode 100644 templates/copilot-component-minimal/.gitignore create mode 100644 templates/copilot-component-minimal/.npmignore create mode 100644 templates/copilot-component-minimal/README.md create mode 100644 templates/copilot-component-minimal/config/config.json create mode 100644 templates/copilot-component-minimal/config/copilot-agent.json create mode 100644 templates/copilot-component-minimal/config/package-solution.json create mode 100644 templates/copilot-component-minimal/config/rig.json create mode 100644 templates/copilot-component-minimal/config/serve.json create mode 100644 templates/copilot-component-minimal/copilot/ai-plugin.json create mode 100644 templates/copilot-component-minimal/copilot/color.png create mode 100644 templates/copilot-component-minimal/copilot/declarativeAgent.json create mode 100644 templates/copilot-component-minimal/copilot/instruction.txt create mode 100644 templates/copilot-component-minimal/copilot/manifest.json create mode 100644 templates/copilot-component-minimal/copilot/outline.png create mode 100644 templates/copilot-component-minimal/package.json create mode 100644 templates/copilot-component-minimal/src/{componentName.hyphen}-copilot-component.manifest.json create mode 100644 templates/copilot-component-minimal/src/{componentName.pascal}CopilotComponent.ts create mode 100644 templates/copilot-component-minimal/src/{componentName.pascal}Properties.ts create mode 100644 templates/copilot-component-minimal/template.json create mode 100644 templates/copilot-component-minimal/tsconfig.json 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..9d5883dd 100644 --- a/apps/spfx-cli/README.md +++ b/apps/spfx-cli/README.md @@ -142,6 +142,12 @@ 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 | + ### 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/examples/copilot-component-minimal/.eslintrc.js b/examples/copilot-component-minimal/.eslintrc.js new file mode 100644 index 00000000..7eecfadb --- /dev/null +++ b/examples/copilot-component-minimal/.eslintrc.js @@ -0,0 +1,148 @@ +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: { + '@rushstack/no-new-null': 1, + '@rushstack/hoist-jest-mock': 1, + '@rushstack/import-requires-chunk-name': 1, + '@rushstack/security/no-unsafe-regexp': 1, + '@typescript-eslint/adjacent-overload-signatures': 1, + '@typescript-eslint/explicit-function-return-type': [ + 1, + { + allowExpressions: true, + allowTypedFunctionExpressions: true, + allowHigherOrderFunctions: false + } + ], + '@typescript-eslint/explicit-member-accessibility': 0, + '@typescript-eslint/no-array-constructor': 1, + '@typescript-eslint/no-explicit-any': 1, + '@typescript-eslint/no-floating-promises': 2, + '@typescript-eslint/no-for-in-array': 2, + '@typescript-eslint/no-misused-new': 2, + '@typescript-eslint/no-namespace': [ + 1, + { + allowDeclarations: false, + allowDefinitionFiles: false + } + ], + '@typescript-eslint/parameter-properties': 0, + '@typescript-eslint/no-unused-vars': [ + 1, + { + vars: 'all', + args: 'none' + } + ], + '@typescript-eslint/no-use-before-define': [ + 2, + { + functions: false, + classes: true, + variables: true, + enums: true, + typedefs: true + } + ], + '@typescript-eslint/no-var-requires': 'error', + '@typescript-eslint/prefer-namespace-keyword': 1, + '@typescript-eslint/no-inferrable-types': 0, + '@typescript-eslint/no-empty-interface': 0, + 'accessor-pairs': 1, + 'dot-notation': [ + 1, + { + allowPattern: '^_' + } + ], + eqeqeq: 1, + 'for-direction': 1, + 'guard-for-in': 2, + 'max-lines': ['warn', { max: 2000 }], + 'no-async-promise-executor': 2, + 'no-caller': 2, + 'no-compare-neg-zero': 2, + 'no-cond-assign': 2, + 'no-constant-condition': 1, + 'no-control-regex': 2, + 'no-debugger': 1, + 'no-delete-var': 2, + 'no-duplicate-case': 2, + 'no-empty': 1, + 'no-empty-character-class': 2, + 'no-empty-pattern': 1, + 'no-eval': 1, + 'no-ex-assign': 2, + 'no-extend-native': 1, + 'no-extra-label': 1, + 'no-fallthrough': 2, + 'no-func-assign': 1, + 'no-implied-eval': 2, + 'no-invalid-regexp': 2, + 'no-label-var': 2, + 'no-lone-blocks': 1, + 'no-misleading-character-class': 2, + 'no-multi-str': 2, + 'no-new': 1, + 'no-new-func': 2, + 'no-new-object': 2, + 'no-new-wrappers': 1, + 'no-octal': 2, + 'no-octal-escape': 2, + 'no-regex-spaces': 2, + 'no-return-assign': 2, + 'no-script-url': 1, + 'no-self-assign': 2, + 'no-self-compare': 2, + 'no-sequences': 1, + 'no-shadow-restricted-names': 2, + 'no-sparse-arrays': 2, + 'no-throw-literal': 2, + 'no-unmodified-loop-condition': 1, + 'no-unsafe-finally': 2, + 'no-unused-expressions': 1, + 'no-unused-labels': 1, + 'no-useless-catch': 1, + 'no-useless-concat': 1, + 'no-var': 2, + 'no-void': 1, + 'no-with': 2, + 'prefer-const': 1, + 'promise/param-names': 2, + 'require-atomic-updates': 2, + 'require-yield': 1, + strict: [2, 'never'], + 'use-isnan': 2, + 'no-extra-boolean-cast': 0, + '@microsoft/spfx/no-require-ensure': 2 + } + }, + { + files: [ + '*.test.ts', + '*.test.tsx', + '*.spec.ts', + '*.spec.tsx', + '**/__mocks__/*.ts', + '**/__mocks__/*.tsx', + '**/__tests__/*.ts', + '**/__tests__/*.tsx', + '**/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..b0b3dd25 --- /dev/null +++ b/examples/copilot-component-minimal/.gitignore @@ -0,0 +1,33 @@ +# 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 +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..c48f3f13 --- /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.22.2-green.svg)](https://img.shields.io/badge/version-1.22.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..7640b12d --- /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.22.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..3df493f0 --- /dev/null +++ b/examples/copilot-component-minimal/config/serve.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/spfx-serve.schema.json", + "port": 4321, + "https": true, + "serveConfigurations": { + "default": { + "pageUrl": "https://{tenantDomain}/" + } + } +} 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..42c33b04 --- /dev/null +++ b/examples/copilot-component-minimal/copilot/ai-plugin.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://aka.ms/json-schemas/copilot-extensions/v2.1/plugin.schema.json", + "schema_version": "v2.4", + "namespace": "minimalagent", + "name_for_human": "Minimal Agent", + "description_for_human": "Minimal CopilotComponent Description", + "description_for_model": "Calls the MinimalCopilotComponent tool to render a personalized greeting card for the user.", + "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 0000000000000000000000000000000000000000..7cdf55b04655810e334cccfe1ac86fd89e625572 GIT binary patch literal 2106 zcmd5;Yc!i#7k(o~qE*DSwAE0w{Y;IDstG#AEd+I`RxfTTQKD{5(6kdJM(YwvdZ9|y zl+Kh;r3|K0lF{iX6JeB~L|luyBvc5A#V)j+3VTQv-hE$_QLMk zv3~~u0K42=F=xQY-gdYOc%B)FhJitq=;{{_06Vp|9n#BBmH_~4!42c!d!u-f?;Y`Y z9ofEo^@0ZP;!6LiK%4ZsD{BU&WA}UV9Np!sz0DVUobYWUdc9M%cXrRCKIidP@%1l8 z4|+ZIw3*!O3Hiyh6tmA<_XdZP(F|jzZ)&66hTP7K{IO%v;CoLQmab<_DVZss`I5|! zbQ9A>Ndc5!u&kL^aba7DP|Vh$rLO>zA>eBC@31IZB4qIOuleVgq{h|$%)FHaE9b2E5S_Xt#`%*kWoC?ST4D8yS*0Y&sA>QZn)( z_F3p;BUu{T)lT#v>O-uK&Wc!;#J@JBak|Ohfi;$Q2i3++mk2{?DM0b=1WASfS+S|7 z=;FJ93k@hxtmf_^%oy&IXDoZv`jkPfmNz$w%GKJZ z%S}z!6vEc3A6YKjnCZDj0}hJK>){r>hig>7(=}%{a89GRU7;Y1#7lVSUZif5-6g#m ziuB&w?vKIph1}69jWXYtgAKG);eOd|Ygq}!P_p{Kr1a(CV>Da%sLb+@3?vA^g;6T{ zH?V53qYER2XV;i$ul}t;<8;A`R_J8u_^HyG|ESY;vAq=?fr}?CKVKJ%dDj#b>4L9M zq|$#lHdtLF#Qat{>#EYj)8@|)QE(@*wz86^h&#E93)97aAA%Bn0^bT%wH%CC1!Fsu zi1s6Ig>#+Zjm7>gL$WqJri!Kl`I93(o^29|tj}}r*u4D+z>}9ewuD+~4AUodP`(&y7Zq>NOlokY> zjUYK|CP=7>b?CnM@(D*koo16t;i@1xKj&Qb^f3b3F?$?Z1Tfd5O2pHH2vOK07@X}B z;>;FZ#Q^G23Ce1U^U9j_6^-A7NSd&Kc{aXAFP&whl<7C9d){0ohqEEu$pbDxZUmT2 zMJbQnbpbD6SRj{yPG!u^+sPN?;elt>s7U__9MHI8SYi1d6w*T$3J;2dxAE9xEISz` z(-5hRRXpuh4iArN5`GjA6z@brd;HH3-T%NL0&b?6L>3<$$QoB zgux?M^|>yLYo+Xl;p;Jxo6S=WBs^5|?rh=$7p>s0HEPILaKD@^4qMY_P==>6bd3C* zs-vERdN>3fJA60Of50R_-kYPL^2`NrjI(X89Niubw@pYe2;6Og8%xgu4(9xS=6O6N zAnN)A&hgvGpd1$;Jakqx1SLdB?pqYNX1Oy0m-))*EL-=WyulU+4YIJQ&4V;N+?k(9 zo@n^O6BN|n>c%u-XUS!fsyD0C7sxSXV@zoPfqZp#p6G)&yXSlK!or4*w@P!IAxFME zbbE?Rq9v*JJ@oRUUOKiEb|P)GfbOQw@=JxHEarvt4czD>OJP=B%;1tr46Ns&*UVE-@54%wS literal 0 HcmV?d00001 diff --git a/examples/copilot-component-minimal/copilot/declarativeAgent.json b/examples/copilot-component-minimal/copilot/declarativeAgent.json new file mode 100644 index 00000000..bf8f61bc --- /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.5/schema.json", + "version": "v1.5", + "name": "Minimal Agent", + "description": "Minimal CopilotComponent Description", + "instructions": "$[file('instruction.txt')]", + "conversation_starters": [ + { + "title": "Greet me", + "text": "Greet me by name." + } + ], + "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..bfeb59a7 --- /dev/null +++ b/examples/copilot-component-minimal/copilot/instruction.txt @@ -0,0 +1,5 @@ +You are the Minimal Agent — a minimal SPFx CopilotComponent deployed as a Microsoft 365 Copilot declarative agent. + +When the user asks to be greeted, call the MinimalCopilotComponent tool with the name the user provides (defaulting to "friend" if none is given). The tool renders a personalized greeting card in an iframe hosted by the SPFx MCP server. + +Keep responses short and friendly. Do not answer questions outside the greeting use case — politely say you are a simple sample agent focused on greetings and suggest the user try "Greet me by name". diff --git a/examples/copilot-component-minimal/copilot/manifest.json b/examples/copilot-component-minimal/copilot/manifest.json new file mode 100644 index 00000000..7b02eaf7 --- /dev/null +++ b/examples/copilot-component-minimal/copilot/manifest.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.24/MicrosoftTeams.schema.json", + "manifestVersion": "1.24", + "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 0000000000000000000000000000000000000000..e8cb4b6ba4f726d47a2e274f16b6069b9a8041cc GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG z%|CHbgX^da?eHs6`1kLARhjOac zf3;y1Iq~M{LLS3g_M2bU{+PBvomV=FH7$YTy5I%1<5B$=?>3fqI5P%5iajq7)W9SX p;gpazd1JnvZNlx8HB0WjVJ`J~Q+P@%pA+aZ22WQ%mvv4FO#n^cR9FB2 literal 0 HcmV?d00001 diff --git a/examples/copilot-component-minimal/package.json b/examples/copilot-component-minimal/package.json new file mode 100644 index 00000000..0e6ed561 --- /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.22.2", + "tslib": "2.3.1", + "zod": "3.25.75", + "zod-to-json-schema": "3.25.1" + }, + "devDependencies": { + "@microsoft/eslint-config-spfx": "1.22.2", + "@microsoft/eslint-plugin-spfx": "1.22.2", + "@microsoft/sp-module-interfaces": "1.22.2", + "@microsoft/spfx-web-build-rig": "1.22.2", + "@rushstack/eslint-config": "4.6.4", + "@rushstack/heft": "^1.2.9", + "@types/heft-jest": "^1.0.6", + "@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..1fb1bc8c --- /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 render(): void { + this.context.domElement.textContent = `Hello, ${this.properties.name}!`; + } +} diff --git a/examples/copilot-component-minimal/src/MinimalProperties.ts b/examples/copilot-component-minimal/src/MinimalProperties.ts new file mode 100644 index 00000000..32c0657a --- /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 minimalPropertiesSchema: z.ZodObject<{ name: z.ZodString }> = z.object({ + name: z.string().describe('The name of the person to greet.') +}); + +export type IMinimalCopilotComponentProperties = z.infer; + +export default zodToJsonSchema(minimalPropertiesSchema); 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..93ac510c --- /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"] + }, + + "tools": [ + { + "name": "Minimal", + "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..ee582d51 --- /dev/null +++ b/examples/copilot-component-minimal/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./node_modules/@microsoft/spfx-web-build-rig/profiles/default/tsconfig-base.json" +} diff --git a/templates/copilot-component-minimal/.eslintrc.js b/templates/copilot-component-minimal/.eslintrc.js new file mode 100644 index 00000000..7eecfadb --- /dev/null +++ b/templates/copilot-component-minimal/.eslintrc.js @@ -0,0 +1,148 @@ +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: { + '@rushstack/no-new-null': 1, + '@rushstack/hoist-jest-mock': 1, + '@rushstack/import-requires-chunk-name': 1, + '@rushstack/security/no-unsafe-regexp': 1, + '@typescript-eslint/adjacent-overload-signatures': 1, + '@typescript-eslint/explicit-function-return-type': [ + 1, + { + allowExpressions: true, + allowTypedFunctionExpressions: true, + allowHigherOrderFunctions: false + } + ], + '@typescript-eslint/explicit-member-accessibility': 0, + '@typescript-eslint/no-array-constructor': 1, + '@typescript-eslint/no-explicit-any': 1, + '@typescript-eslint/no-floating-promises': 2, + '@typescript-eslint/no-for-in-array': 2, + '@typescript-eslint/no-misused-new': 2, + '@typescript-eslint/no-namespace': [ + 1, + { + allowDeclarations: false, + allowDefinitionFiles: false + } + ], + '@typescript-eslint/parameter-properties': 0, + '@typescript-eslint/no-unused-vars': [ + 1, + { + vars: 'all', + args: 'none' + } + ], + '@typescript-eslint/no-use-before-define': [ + 2, + { + functions: false, + classes: true, + variables: true, + enums: true, + typedefs: true + } + ], + '@typescript-eslint/no-var-requires': 'error', + '@typescript-eslint/prefer-namespace-keyword': 1, + '@typescript-eslint/no-inferrable-types': 0, + '@typescript-eslint/no-empty-interface': 0, + 'accessor-pairs': 1, + 'dot-notation': [ + 1, + { + allowPattern: '^_' + } + ], + eqeqeq: 1, + 'for-direction': 1, + 'guard-for-in': 2, + 'max-lines': ['warn', { max: 2000 }], + 'no-async-promise-executor': 2, + 'no-caller': 2, + 'no-compare-neg-zero': 2, + 'no-cond-assign': 2, + 'no-constant-condition': 1, + 'no-control-regex': 2, + 'no-debugger': 1, + 'no-delete-var': 2, + 'no-duplicate-case': 2, + 'no-empty': 1, + 'no-empty-character-class': 2, + 'no-empty-pattern': 1, + 'no-eval': 1, + 'no-ex-assign': 2, + 'no-extend-native': 1, + 'no-extra-label': 1, + 'no-fallthrough': 2, + 'no-func-assign': 1, + 'no-implied-eval': 2, + 'no-invalid-regexp': 2, + 'no-label-var': 2, + 'no-lone-blocks': 1, + 'no-misleading-character-class': 2, + 'no-multi-str': 2, + 'no-new': 1, + 'no-new-func': 2, + 'no-new-object': 2, + 'no-new-wrappers': 1, + 'no-octal': 2, + 'no-octal-escape': 2, + 'no-regex-spaces': 2, + 'no-return-assign': 2, + 'no-script-url': 1, + 'no-self-assign': 2, + 'no-self-compare': 2, + 'no-sequences': 1, + 'no-shadow-restricted-names': 2, + 'no-sparse-arrays': 2, + 'no-throw-literal': 2, + 'no-unmodified-loop-condition': 1, + 'no-unsafe-finally': 2, + 'no-unused-expressions': 1, + 'no-unused-labels': 1, + 'no-useless-catch': 1, + 'no-useless-concat': 1, + 'no-var': 2, + 'no-void': 1, + 'no-with': 2, + 'prefer-const': 1, + 'promise/param-names': 2, + 'require-atomic-updates': 2, + 'require-yield': 1, + strict: [2, 'never'], + 'use-isnan': 2, + 'no-extra-boolean-cast': 0, + '@microsoft/spfx/no-require-ensure': 2 + } + }, + { + files: [ + '*.test.ts', + '*.test.tsx', + '*.spec.ts', + '*.spec.tsx', + '**/__mocks__/*.ts', + '**/__mocks__/*.tsx', + '**/__tests__/*.ts', + '**/__tests__/*.tsx', + '**/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..b0b3dd25 --- /dev/null +++ b/templates/copilot-component-minimal/.gitignore @@ -0,0 +1,33 @@ +# 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 +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..3df493f0 --- /dev/null +++ b/templates/copilot-component-minimal/config/serve.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/spfx-serve.schema.json", + "port": 4321, + "https": true, + "serveConfigurations": { + "default": { + "pageUrl": "https://{tenantDomain}/" + } + } +} 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..9019f93f --- /dev/null +++ b/templates/copilot-component-minimal/copilot/ai-plugin.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://aka.ms/json-schemas/copilot-extensions/v2.1/plugin.schema.json", + "schema_version": "v2.4", + "namespace": "<%= componentName.camel %>agent", + "name_for_human": "<%= componentName %> Agent", + "description_for_human": "<%= componentDescription %>", + "description_for_model": "Calls the <%= componentName.pascal %>CopilotComponent tool to render a personalized greeting card for the user.", + "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 0000000000000000000000000000000000000000..7cdf55b04655810e334cccfe1ac86fd89e625572 GIT binary patch literal 2106 zcmd5;Yc!i#7k(o~qE*DSwAE0w{Y;IDstG#AEd+I`RxfTTQKD{5(6kdJM(YwvdZ9|y zl+Kh;r3|K0lF{iX6JeB~L|luyBvc5A#V)j+3VTQv-hE$_QLMk zv3~~u0K42=F=xQY-gdYOc%B)FhJitq=;{{_06Vp|9n#BBmH_~4!42c!d!u-f?;Y`Y z9ofEo^@0ZP;!6LiK%4ZsD{BU&WA}UV9Np!sz0DVUobYWUdc9M%cXrRCKIidP@%1l8 z4|+ZIw3*!O3Hiyh6tmA<_XdZP(F|jzZ)&66hTP7K{IO%v;CoLQmab<_DVZss`I5|! zbQ9A>Ndc5!u&kL^aba7DP|Vh$rLO>zA>eBC@31IZB4qIOuleVgq{h|$%)FHaE9b2E5S_Xt#`%*kWoC?ST4D8yS*0Y&sA>QZn)( z_F3p;BUu{T)lT#v>O-uK&Wc!;#J@JBak|Ohfi;$Q2i3++mk2{?DM0b=1WASfS+S|7 z=;FJ93k@hxtmf_^%oy&IXDoZv`jkPfmNz$w%GKJZ z%S}z!6vEc3A6YKjnCZDj0}hJK>){r>hig>7(=}%{a89GRU7;Y1#7lVSUZif5-6g#m ziuB&w?vKIph1}69jWXYtgAKG);eOd|Ygq}!P_p{Kr1a(CV>Da%sLb+@3?vA^g;6T{ zH?V53qYER2XV;i$ul}t;<8;A`R_J8u_^HyG|ESY;vAq=?fr}?CKVKJ%dDj#b>4L9M zq|$#lHdtLF#Qat{>#EYj)8@|)QE(@*wz86^h&#E93)97aAA%Bn0^bT%wH%CC1!Fsu zi1s6Ig>#+Zjm7>gL$WqJri!Kl`I93(o^29|tj}}r*u4D+z>}9ewuD+~4AUodP`(&y7Zq>NOlokY> zjUYK|CP=7>b?CnM@(D*koo16t;i@1xKj&Qb^f3b3F?$?Z1Tfd5O2pHH2vOK07@X}B z;>;FZ#Q^G23Ce1U^U9j_6^-A7NSd&Kc{aXAFP&whl<7C9d){0ohqEEu$pbDxZUmT2 zMJbQnbpbD6SRj{yPG!u^+sPN?;elt>s7U__9MHI8SYi1d6w*T$3J;2dxAE9xEISz` z(-5hRRXpuh4iArN5`GjA6z@brd;HH3-T%NL0&b?6L>3<$$QoB zgux?M^|>yLYo+Xl;p;Jxo6S=WBs^5|?rh=$7p>s0HEPILaKD@^4qMY_P==>6bd3C* zs-vERdN>3fJA60Of50R_-kYPL^2`NrjI(X89Niubw@pYe2;6Og8%xgu4(9xS=6O6N zAnN)A&hgvGpd1$;Jakqx1SLdB?pqYNX1Oy0m-))*EL-=WyulU+4YIJQ&4V;N+?k(9 zo@n^O6BN|n>c%u-XUS!fsyD0C7sxSXV@zoPfqZp#p6G)&yXSlK!or4*w@P!IAxFME zbbE?Rq9v*JJ@oRUUOKiEb|P)GfbOQw@=JxHEarvt4czD>OJP=B%;1tr46Ns&*UVE-@54%wS literal 0 HcmV?d00001 diff --git a/templates/copilot-component-minimal/copilot/declarativeAgent.json b/templates/copilot-component-minimal/copilot/declarativeAgent.json new file mode 100644 index 00000000..38091ec5 --- /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.5/schema.json", + "version": "v1.5", + "name": "<%= componentName %> Agent", + "description": "<%= componentDescription %>", + "instructions": "$[file('instruction.txt')]", + "conversation_starters": [ + { + "title": "Greet me", + "text": "Greet me by name." + } + ], + "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..6c5945dc --- /dev/null +++ b/templates/copilot-component-minimal/copilot/instruction.txt @@ -0,0 +1,5 @@ +You are the <%= componentName %> Agent — a minimal SPFx CopilotComponent deployed as a Microsoft 365 Copilot declarative agent. + +When the user asks to be greeted, call the <%= componentName.pascal %>CopilotComponent tool with the name the user provides (defaulting to "friend" if none is given). The tool renders a personalized greeting card in an iframe hosted by the SPFx MCP server. + +Keep responses short and friendly. Do not answer questions outside the greeting use case — politely say you are a simple sample agent focused on greetings and suggest the user try "Greet me by name". diff --git a/templates/copilot-component-minimal/copilot/manifest.json b/templates/copilot-component-minimal/copilot/manifest.json new file mode 100644 index 00000000..b14a6fd9 --- /dev/null +++ b/templates/copilot-component-minimal/copilot/manifest.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.24/MicrosoftTeams.schema.json", + "manifestVersion": "1.24", + "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 0000000000000000000000000000000000000000..e8cb4b6ba4f726d47a2e274f16b6069b9a8041cc GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG z%|CHbgX^da?eHs6`1kLARhjOac zf3;y1Iq~M{LLS3g_M2bU{+PBvomV=FH7$YTy5I%1<5B$=?>3fqI5P%5iajq7)W9SX p;gpazd1JnvZNlx8HB0WjVJ`J~Q+P@%pA+aZ22WQ%mvv4FO#n^cR9FB2 literal 0 HcmV?d00001 diff --git a/templates/copilot-component-minimal/package.json b/templates/copilot-component-minimal/package.json new file mode 100644 index 00000000..6908f416 --- /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.25.75", + "zod-to-json-schema": "3.25.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.9", + "@types/heft-jest": "^1.0.6", + "@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..8bcba082 --- /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"] + }, + + "tools": [ + { + "name": "<%= componentName.pascal %>", + "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..cee61ec7 --- /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 render(): void { + this.context.domElement.textContent = `Hello, ${this.properties.name}!`; + } +} 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..89b09936 --- /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 <%= componentName.camel %>PropertiesSchema: z.ZodObject<{ name: z.ZodString }> = z.object({ + name: z.string().describe('The name of the person to greet.') +}); + +export type I<%= componentName.pascal %>CopilotComponentProperties = z.inferPropertiesSchema>; + +export default zodToJsonSchema(<%= componentName.camel %>PropertiesSchema); diff --git a/templates/copilot-component-minimal/template.json b/templates/copilot-component-minimal/template.json new file mode 100644 index 00000000..0756d03e --- /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.22.2" +} diff --git a/templates/copilot-component-minimal/tsconfig.json b/templates/copilot-component-minimal/tsconfig.json new file mode 100644 index 00000000..ee582d51 --- /dev/null +++ b/templates/copilot-component-minimal/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./node_modules/@microsoft/spfx-web-build-rig/profiles/default/tsconfig-base.json" +} 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 c9cd57fe..9f258a0f 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,7 +165,7 @@ 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 18 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] @@ -180,6 +180,8 @@ Found 17 templates: [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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.2 [gray]│[default] 22 [gray]│[default] @@ -236,7 +238,7 @@ 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 18 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] @@ -251,6 +253,8 @@ Found 17 templates: [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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.2 [gray]│[default] 22 [gray]│[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 5a90e3da..2eb73983 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,7 +2,7 @@ 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: +Found 18 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] @@ -17,6 +17,8 @@ Found 17 templates: [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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.2 [gray]│[default] 22 [gray]│[default] @@ -75,7 +77,7 @@ 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: +Found 18 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] @@ -90,6 +92,8 @@ Found 17 templates: [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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.2 [gray]│[default] 22 [gray]│[default] @@ -148,7 +152,7 @@ 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: +Found 18 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] @@ -163,6 +167,8 @@ Found 17 templates: [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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.2 [gray]│[default] 22 [gray]│[default] @@ -221,7 +227,7 @@ 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: +Found 18 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] @@ -236,6 +242,8 @@ Found 17 templates: [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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.2 [gray]│[default] 22 [gray]│[default] @@ -294,7 +302,7 @@ 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: +Found 18 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] @@ -309,6 +317,8 @@ Found 17 templates: [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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.2 [gray]│[default] 22 [gray]│[default] @@ -365,9 +375,79 @@ 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 18 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.22.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.22.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.22.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.22.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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.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.22.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.22.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.22.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.22.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.22.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.22.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.22.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.22.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.22.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.22.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 extension-application-customizer template and match example output: stdout 1`] = ` "Adding local template source: -Found 17 templates: +Found 18 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] @@ -382,6 +462,8 @@ Found 17 templates: [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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.2 [gray]│[default] 22 [gray]│[default] @@ -437,7 +519,7 @@ 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: +Found 18 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] @@ -452,6 +534,8 @@ Found 17 templates: [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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.2 [gray]│[default] 22 [gray]│[default] @@ -507,7 +591,7 @@ 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: +Found 18 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] @@ -522,6 +606,8 @@ Found 17 templates: [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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.2 [gray]│[default] 22 [gray]│[default] @@ -577,7 +663,7 @@ 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: +Found 18 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] @@ -592,6 +678,8 @@ Found 17 templates: [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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.2 [gray]│[default] 22 [gray]│[default] @@ -648,7 +736,7 @@ 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: +Found 18 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] @@ -663,6 +751,8 @@ Found 17 templates: [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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.2 [gray]│[default] 22 [gray]│[default] @@ -717,7 +807,7 @@ 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: +Found 18 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] @@ -732,6 +822,8 @@ Found 17 templates: [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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.2 [gray]│[default] 22 [gray]│[default] @@ -785,7 +877,7 @@ 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: +Found 18 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] @@ -800,6 +892,8 @@ Found 17 templates: [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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.2 [gray]│[default] 22 [gray]│[default] @@ -857,7 +951,7 @@ 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: +Found 18 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] @@ -872,6 +966,8 @@ Found 17 templates: [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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.2 [gray]│[default] 22 [gray]│[default] @@ -927,7 +1023,7 @@ 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: +Found 18 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] @@ -942,6 +1038,8 @@ Found 17 templates: [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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.2 [gray]│[default] 22 [gray]│[default] @@ -1014,7 +1112,7 @@ 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: +Found 18 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] @@ -1029,6 +1127,8 @@ Found 17 templates: [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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.2 [gray]│[default] 22 [gray]│[default] @@ -1085,7 +1185,7 @@ 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: +Found 18 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] @@ -1100,6 +1200,8 @@ Found 17 templates: [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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.2 [gray]│[default] 22 [gray]│[default] @@ -1159,7 +1261,7 @@ 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: +Found 18 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] @@ -1174,6 +1276,8 @@ Found 17 templates: [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.22.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.22.2 [gray]│[default] 20 [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.22.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.22.2 [gray]│[default] 22 [gray]│[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..0b9ed74b 100644 --- a/tests/spfx-template-test/src/tests/templates.test.ts +++ b/tests/spfx-template-test/src/tests/templates.test.ts @@ -189,6 +189,15 @@ 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' } ]; From defd333c37112ba2ab97de12a3f6c03306c3f235 Mon Sep 17 00:00:00 2001 From: Santiago Valencia Sanchez Date: Fri, 31 Jul 2026 02:11:38 +0000 Subject: [PATCH 2/9] Align copilot-component-minimal template to SPFx 1.24.0-beta.2 Bumps spfxVersion in the copilot-component-minimal template.json from 1.22.2 to 1.24.0-beta.2 and regenerates the example from the template (package.json deps, package-solution mpnId, README version badge). Updates the spfx-template-test snapshots to reflect the new version in the template listing table. --- examples/copilot-component-minimal/README.md | 2 +- .../config/package-solution.json | 2 +- .../copilot-component-minimal/package.json | 10 +- .../copilot-component-minimal/template.json | 2 +- .../multi-component.test.ts.snap | 156 +- .../__snapshots__/templates.test.ts.snap | 1404 ++++++++--------- 6 files changed, 788 insertions(+), 788 deletions(-) diff --git a/examples/copilot-component-minimal/README.md b/examples/copilot-component-minimal/README.md index c48f3f13..3e57517f 100644 --- a/examples/copilot-component-minimal/README.md +++ b/examples/copilot-component-minimal/README.md @@ -8,7 +8,7 @@ Short summary on functionality and used technologies. ## Used SharePoint Framework Version -[![version](https://img.shields.io/badge/version-1.22.2-green.svg)](https://img.shields.io/badge/version-1.22.2-green.svg) +[![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 diff --git a/examples/copilot-component-minimal/config/package-solution.json b/examples/copilot-component-minimal/config/package-solution.json index 7640b12d..5bda43cb 100644 --- a/examples/copilot-component-minimal/config/package-solution.json +++ b/examples/copilot-component-minimal/config/package-solution.json @@ -12,7 +12,7 @@ "websiteUrl": "", "privacyUrl": "", "termsOfUseUrl": "", - "mpnId": "Undefined-1.22.2" + "mpnId": "Undefined-1.24.0-beta.2" }, "metadata": { "shortDescription": { diff --git a/examples/copilot-component-minimal/package.json b/examples/copilot-component-minimal/package.json index 0e6ed561..66f9826d 100644 --- a/examples/copilot-component-minimal/package.json +++ b/examples/copilot-component-minimal/package.json @@ -14,16 +14,16 @@ "_phase:package-solution": "heft run --only package-solution -- --clean" }, "dependencies": { - "@microsoft/sp-copilot-component": "1.22.2", + "@microsoft/sp-copilot-component": "1.24.0-beta.2", "tslib": "2.3.1", "zod": "3.25.75", "zod-to-json-schema": "3.25.1" }, "devDependencies": { - "@microsoft/eslint-config-spfx": "1.22.2", - "@microsoft/eslint-plugin-spfx": "1.22.2", - "@microsoft/sp-module-interfaces": "1.22.2", - "@microsoft/spfx-web-build-rig": "1.22.2", + "@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.9", "@types/heft-jest": "^1.0.6", diff --git a/templates/copilot-component-minimal/template.json b/templates/copilot-component-minimal/template.json index 0756d03e..06a72ea4 100644 --- a/templates/copilot-component-minimal/template.json +++ b/templates/copilot-component-minimal/template.json @@ -3,5 +3,5 @@ "category": "copilot", "description": "A minimal Copilot Component template (no framework) for SPFx", "version": "0.0.1", - "spfxVersion": "1.22.2" + "spfxVersion": "1.24.0-beta.2" } 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 41cf93ce..6a2b321e 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 @@ -167,45 +167,45 @@ exports[`Multi-component scaffolding should scaffold webpart-minimal then extens "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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] @@ -240,45 +240,45 @@ exports[`Multi-component scaffolding should scaffold webpart-minimal then extens "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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 3ce5fe07..189d2515 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 @@ -4,45 +4,45 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should sc "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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] @@ -79,45 +79,45 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should sc "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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] @@ -154,45 +154,45 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should sc "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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] @@ -229,45 +229,45 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should sc "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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] @@ -304,45 +304,45 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should sc "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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] @@ -379,45 +379,45 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should sc "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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] @@ -449,45 +449,45 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should sc "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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] @@ -521,45 +521,45 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should sc "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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] @@ -593,45 +593,45 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should sc "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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] @@ -665,45 +665,45 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should sc "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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] @@ -738,45 +738,45 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should sc "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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] @@ -809,45 +809,45 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should sc "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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] @@ -879,45 +879,45 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should sc "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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] @@ -953,45 +953,45 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should sc "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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] @@ -1025,45 +1025,45 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should sc "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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] @@ -1114,45 +1114,45 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should sc "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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] @@ -1187,45 +1187,45 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should sc "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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] @@ -1263,45 +1263,45 @@ exports[`SPFx Template Scaffolding Template scaffolding and comparison should sc "Adding local template source: Found 18 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.22.2 [gray]│[default] 20 [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] 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] From 4d20b9eacc55c028546b83d3e8d7012b11feeb8f Mon Sep 17 00:00:00 2001 From: Santiago Valencia Sanchez Date: Fri, 31 Jul 2026 03:19:22 +0000 Subject: [PATCH 3/9] Migrate copilot-component-minimal to match odsp behavior - Component renders this.properties.message (matches odsp minimal sample) - Properties.ts: default import zodToJsonSchema, generic propertiesSchema, pin zod + zod-to-json-schema to 3.24.1 (the odsp-proven, compile-clean pair) - Fix devDeps: @types/heft-jest -> @types/jest ~30.0.0; @rushstack/heft ^1.2.19 - copilot/: bump schemas (Teams v1.29, declarative agent v1.8, ai-plugin v2.4) and generalize instruction.txt - serve.json: initialPage -> CopilotWorkbench.aspx - tsconfig.json: add watchOptions to avoid copilot-agent build loop - Register example in rush.json; allowlist zod 3.24.1 + SPFx 1.24.0-beta.2 in common-versions.json; regenerate example and snapshots --- common/config/rush/common-versions.json | 12 +- common/config/rush/pnpm-lock.yaml | 1465 ++++++++++++++++- common/config/rush/repo-state.json | 2 +- .../config/serve.json | 6 +- .../copilot/ai-plugin.json | 6 +- .../copilot/declarativeAgent.json | 8 +- .../copilot/instruction.txt | 6 +- .../copilot/manifest.json | 4 +- .../copilot-component-minimal/package.json | 8 +- .../src/MinimalCopilotComponent.ts | 2 +- .../src/MinimalProperties.ts | 10 +- .../minimal-copilot-component.manifest.json | 4 +- .../teams/minimal-agent.zip | Bin 0 -> 4125 bytes .../copilot-component-minimal/tsconfig.json | 9 +- rush.json | 6 + .../config/serve.json | 6 +- .../copilot/ai-plugin.json | 6 +- .../copilot/declarativeAgent.json | 8 +- .../copilot/instruction.txt | 6 +- .../copilot/manifest.json | 4 +- .../copilot-component-minimal/package.json | 8 +- ...me.hyphen}-copilot-component.manifest.json | 4 +- .../{componentName.pascal}CopilotComponent.ts | 2 +- .../src/{componentName.pascal}Properties.ts | 10 +- .../copilot-component-minimal/tsconfig.json | 9 +- 25 files changed, 1544 insertions(+), 67 deletions(-) create mode 100644 examples/copilot-component-minimal/teams/minimal-agent.zip diff --git a/common/config/rush/common-versions.json b/common/config/rush/common-versions.json index d3ee1dbf..2f0c1e2d 100644 --- a/common/config/rush/common-versions.json +++ b/common/config/rush/common-versions.json @@ -78,6 +78,16 @@ "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-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..fac6ca1d 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -346,6 +346,55 @@ 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/extension-application-customizer: dependencies: '@microsoft/decorators': @@ -2111,6 +2160,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 +2220,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 +2501,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 +2522,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 +2577,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 +2594,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 +2632,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 +2643,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 +2680,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 +2719,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 +2749,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 +2912,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 +2960,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 +2995,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 +3020,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 +3051,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 +3073,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 +3093,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 +3155,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 +3217,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 +3233,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 +3259,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 +3277,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 +3307,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 +3389,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 +3416,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 +3485,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 +3778,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 +4006,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 +4185,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 +4285,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 +4676,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 +4696,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 +4759,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 +4782,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 +4822,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 +4837,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 +4976,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 +5052,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 +5103,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 +5223,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 +5353,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 +5491,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 +5542,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 +5683,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 +5697,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 +5816,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 +5844,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 +6020,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 +6038,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 +6306,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 +6321,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 +6418,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 +6624,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 +6640,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 +6683,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 +6699,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 +6847,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 +7044,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 +7170,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 +7334,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==} @@ -8669,6 +9117,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 +9207,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,7 +9617,7 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.58.9(@types/node@22.19.13)': + '@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 @@ -9162,7 +9625,7 @@ snapshots: '@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.10(@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 @@ -9172,7 +9635,35 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/decorators@1.23.2': + '@microsoft/api-extractor@7.58.9(@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.10(@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/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 tslib: 2.3.1 @@ -9193,6 +9684,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 +9709,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': {} @@ -9305,6 +9821,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 +9881,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 +9911,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,6 +9940,17 @@ snapshots: - react - react-dom + '@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)(scheduler@0.20.2)': 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) @@ -9385,6 +9990,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 +10044,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,6 +10083,29 @@ snapshots: - stream-browserify - supports-color + '@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/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) @@ -9468,6 +10127,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 +10212,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 +10256,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,6 +10296,22 @@ snapshots: - react - react-dom + '@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)(scheduler@0.20.2)': 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) @@ -9741,6 +10481,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 +10565,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 +10613,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 +10629,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 +10851,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 +10993,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 +11072,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 +11134,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 +11154,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 +11205,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 +11275,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 +11312,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 +11394,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 +11475,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 +11493,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 +11509,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 +11527,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 +11553,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 +11657,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 +11691,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 +11760,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 +12141,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 +12309,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 +12419,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 +12607,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 +12634,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 +12672,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 +12738,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 +12771,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 +13332,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 +13361,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 +13403,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.14.2 + 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 +13485,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 +13516,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 +13561,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 +13708,8 @@ snapshots: dependencies: function-bind: 1.1.2 + hono@4.12.32: {} + hpack.js@2.1.6: dependencies: inherits: 2.0.4 @@ -12620,6 +13805,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 +13849,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 +13952,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 +14148,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 +14455,8 @@ snapshots: jju@1.4.0: {} + jose@6.2.5: {} + js-md4@0.3.2: {} js-tokens@4.0.0: {} @@ -13306,6 +14511,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 +14641,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 +14669,8 @@ snapshots: merge-descriptors@1.0.3: {} + merge-descriptors@2.0.0: {} + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -13538,6 +14749,8 @@ snapshots: negotiator@0.6.4: {} + negotiator@1.0.0: {} + neo-async@2.6.2: {} no-case@3.0.4: @@ -13545,6 +14758,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 +14771,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 +14955,8 @@ snapshots: path-to-regexp@0.1.12: {} + path-to-regexp@8.4.2: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -13742,6 +14965,8 @@ snapshots: pirates@4.0.7: {} + pkce-challenge@5.0.1: {} + pkijs@3.3.3: dependencies: '@noble/hashes': 1.4.0 @@ -13753,12 +14978,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 +15006,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 +15078,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 +15102,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 +15116,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 +15180,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 +15316,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 +15404,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 +15420,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 +15528,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 +15720,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 +15755,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 +15807,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 +15835,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 +16015,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 +16187,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 +16340,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 +16552,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..8b9150b2 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": "2646d4994e765a0683e1502c03c3a22bfa8a6bcd", "preferredVersionsHash": "e0fe58342c5c916209e75bfdee56e81689af3359" } diff --git a/examples/copilot-component-minimal/config/serve.json b/examples/copilot-component-minimal/config/serve.json index 3df493f0..cb0f86dd 100644 --- a/examples/copilot-component-minimal/config/serve.json +++ b/examples/copilot-component-minimal/config/serve.json @@ -2,9 +2,5 @@ "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/spfx-serve.schema.json", "port": 4321, "https": true, - "serveConfigurations": { - "default": { - "pageUrl": "https://{tenantDomain}/" - } - } + "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 index 42c33b04..397edbf8 100644 --- a/examples/copilot-component-minimal/copilot/ai-plugin.json +++ b/examples/copilot-component-minimal/copilot/ai-plugin.json @@ -1,9 +1,9 @@ { - "$schema": "https://aka.ms/json-schemas/copilot-extensions/v2.1/plugin.schema.json", + "$schema": "https://developer.microsoft.com/json-schemas/copilot/plugin/v2.4/schema.json", "schema_version": "v2.4", - "namespace": "minimalagent", + "namespace": "minimal", "name_for_human": "Minimal Agent", "description_for_human": "Minimal CopilotComponent Description", - "description_for_model": "Calls the MinimalCopilotComponent tool to render a personalized greeting card for the user.", + "description_for_model": "Minimal CopilotComponent Description", "contact_email": "publisher@contoso.com" } diff --git a/examples/copilot-component-minimal/copilot/declarativeAgent.json b/examples/copilot-component-minimal/copilot/declarativeAgent.json index bf8f61bc..bbe66b85 100644 --- a/examples/copilot-component-minimal/copilot/declarativeAgent.json +++ b/examples/copilot-component-minimal/copilot/declarativeAgent.json @@ -1,13 +1,13 @@ { - "$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.5/schema.json", - "version": "v1.5", + "$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": "Greet me", - "text": "Greet me by name." + "title": "Get started", + "text": "What can you do?" } ], "actions": [ diff --git a/examples/copilot-component-minimal/copilot/instruction.txt b/examples/copilot-component-minimal/copilot/instruction.txt index bfeb59a7..c193c213 100644 --- a/examples/copilot-component-minimal/copilot/instruction.txt +++ b/examples/copilot-component-minimal/copilot/instruction.txt @@ -1,5 +1,3 @@ -You are the Minimal Agent — a minimal SPFx CopilotComponent deployed as a Microsoft 365 Copilot declarative agent. +You are the Minimal Agent — an SPFx CopilotComponent deployed as a Microsoft 365 Copilot declarative agent. -When the user asks to be greeted, call the MinimalCopilotComponent tool with the name the user provides (defaulting to "friend" if none is given). The tool renders a personalized greeting card in an iframe hosted by the SPFx MCP server. - -Keep responses short and friendly. Do not answer questions outside the greeting use case — politely say you are a simple sample agent focused on greetings and suggest the user try "Greet me by name". +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 index 7b02eaf7..bb8386d1 100644 --- a/examples/copilot-component-minimal/copilot/manifest.json +++ b/examples/copilot-component-minimal/copilot/manifest.json @@ -1,6 +1,6 @@ { - "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.24/MicrosoftTeams.schema.json", - "manifestVersion": "1.24", + "$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": { diff --git a/examples/copilot-component-minimal/package.json b/examples/copilot-component-minimal/package.json index 66f9826d..2cc63201 100644 --- a/examples/copilot-component-minimal/package.json +++ b/examples/copilot-component-minimal/package.json @@ -16,8 +16,8 @@ "dependencies": { "@microsoft/sp-copilot-component": "1.24.0-beta.2", "tslib": "2.3.1", - "zod": "3.25.75", - "zod-to-json-schema": "3.25.1" + "zod": "3.24.1", + "zod-to-json-schema": "3.24.1" }, "devDependencies": { "@microsoft/eslint-config-spfx": "1.24.0-beta.2", @@ -25,8 +25,8 @@ "@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.9", - "@types/heft-jest": "^1.0.6", + "@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", diff --git a/examples/copilot-component-minimal/src/MinimalCopilotComponent.ts b/examples/copilot-component-minimal/src/MinimalCopilotComponent.ts index 1fb1bc8c..83c77202 100644 --- a/examples/copilot-component-minimal/src/MinimalCopilotComponent.ts +++ b/examples/copilot-component-minimal/src/MinimalCopilotComponent.ts @@ -4,6 +4,6 @@ import type { IMinimalCopilotComponentProperties } from './MinimalProperties'; export default class MinimalCopilotComponent extends BaseCopilotComponent { protected render(): void { - this.context.domElement.textContent = `Hello, ${this.properties.name}!`; + 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 index 32c0657a..a375fbb2 100644 --- a/examples/copilot-component-minimal/src/MinimalProperties.ts +++ b/examples/copilot-component-minimal/src/MinimalProperties.ts @@ -1,10 +1,10 @@ import { z } from 'zod'; -import { zodToJsonSchema } from 'zod-to-json-schema'; +import zodToJsonSchema from 'zod-to-json-schema'; -const minimalPropertiesSchema: z.ZodObject<{ name: z.ZodString }> = z.object({ - name: z.string().describe('The name of the person to greet.') +const propertiesSchema = z.object({ + message: z.string().describe('A message to display.') }); -export type IMinimalCopilotComponentProperties = z.infer; +export type IMinimalCopilotComponentProperties = z.infer; -export default zodToJsonSchema(minimalPropertiesSchema); +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 index 93ac510c..eb9d7b6d 100644 --- a/examples/copilot-component-minimal/src/minimal-copilot-component.manifest.json +++ b/examples/copilot-component-minimal/src/minimal-copilot-component.manifest.json @@ -9,12 +9,12 @@ "manifestVersion": 2, "capabilities": { - "availableDisplayModes": ["inline"] + "availableDisplayModes": ["inline", "fullscreen"] }, "tools": [ { - "name": "Minimal", + "name": "MinimalTool", "description": { "default": "Minimal CopilotComponent Description" }, diff --git a/examples/copilot-component-minimal/teams/minimal-agent.zip b/examples/copilot-component-minimal/teams/minimal-agent.zip new file mode 100644 index 0000000000000000000000000000000000000000..89477012a7703995ba00ae4aa461f2696114911e GIT binary patch literal 4125 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.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..e780e8be 100644 --- a/rush.json +++ b/rush.json @@ -504,6 +504,12 @@ "reviewCategory": "templates", "tags": [] }, + { + "packageName": "@spfx-template/copilot-component-minimal", + "projectFolder": "examples/copilot-component-minimal", + "reviewCategory": "templates", + "tags": [] + }, { "packageName": "@spfx-template/extension-application-customizer", "projectFolder": "examples/extension-application-customizer", diff --git a/templates/copilot-component-minimal/config/serve.json b/templates/copilot-component-minimal/config/serve.json index 3df493f0..cb0f86dd 100644 --- a/templates/copilot-component-minimal/config/serve.json +++ b/templates/copilot-component-minimal/config/serve.json @@ -2,9 +2,5 @@ "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/spfx-serve.schema.json", "port": 4321, "https": true, - "serveConfigurations": { - "default": { - "pageUrl": "https://{tenantDomain}/" - } - } + "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 index 9019f93f..54ae5093 100644 --- a/templates/copilot-component-minimal/copilot/ai-plugin.json +++ b/templates/copilot-component-minimal/copilot/ai-plugin.json @@ -1,9 +1,9 @@ { - "$schema": "https://aka.ms/json-schemas/copilot-extensions/v2.1/plugin.schema.json", + "$schema": "https://developer.microsoft.com/json-schemas/copilot/plugin/v2.4/schema.json", "schema_version": "v2.4", - "namespace": "<%= componentName.camel %>agent", + "namespace": "<%= componentName.camel %>", "name_for_human": "<%= componentName %> Agent", "description_for_human": "<%= componentDescription %>", - "description_for_model": "Calls the <%= componentName.pascal %>CopilotComponent tool to render a personalized greeting card for the user.", + "description_for_model": "<%= componentDescription %>", "contact_email": "publisher@contoso.com" } diff --git a/templates/copilot-component-minimal/copilot/declarativeAgent.json b/templates/copilot-component-minimal/copilot/declarativeAgent.json index 38091ec5..959d675a 100644 --- a/templates/copilot-component-minimal/copilot/declarativeAgent.json +++ b/templates/copilot-component-minimal/copilot/declarativeAgent.json @@ -1,13 +1,13 @@ { - "$schema": "https://developer.microsoft.com/json-schemas/copilot/declarative-agent/v1.5/schema.json", - "version": "v1.5", + "$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": "Greet me", - "text": "Greet me by name." + "title": "Get started", + "text": "What can you do?" } ], "actions": [ diff --git a/templates/copilot-component-minimal/copilot/instruction.txt b/templates/copilot-component-minimal/copilot/instruction.txt index 6c5945dc..8e824af7 100644 --- a/templates/copilot-component-minimal/copilot/instruction.txt +++ b/templates/copilot-component-minimal/copilot/instruction.txt @@ -1,5 +1,3 @@ -You are the <%= componentName %> Agent — a minimal SPFx CopilotComponent deployed as a Microsoft 365 Copilot declarative agent. +You are the <%= componentName %> Agent — an SPFx CopilotComponent deployed as a Microsoft 365 Copilot declarative agent. -When the user asks to be greeted, call the <%= componentName.pascal %>CopilotComponent tool with the name the user provides (defaulting to "friend" if none is given). The tool renders a personalized greeting card in an iframe hosted by the SPFx MCP server. - -Keep responses short and friendly. Do not answer questions outside the greeting use case — politely say you are a simple sample agent focused on greetings and suggest the user try "Greet me by name". +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 index b14a6fd9..3c27c53e 100644 --- a/templates/copilot-component-minimal/copilot/manifest.json +++ b/templates/copilot-component-minimal/copilot/manifest.json @@ -1,6 +1,6 @@ { - "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.24/MicrosoftTeams.schema.json", - "manifestVersion": "1.24", + "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.29/MicrosoftTeams.schema.json", + "manifestVersion": "1.29", "version": "1.0.0", "id": "<%= solutionId %>", "developer": { diff --git a/templates/copilot-component-minimal/package.json b/templates/copilot-component-minimal/package.json index 6908f416..87b02a3a 100644 --- a/templates/copilot-component-minimal/package.json +++ b/templates/copilot-component-minimal/package.json @@ -16,8 +16,8 @@ "dependencies": { "@microsoft/sp-copilot-component": "<%= spfxVersion %>", "tslib": "2.3.1", - "zod": "3.25.75", - "zod-to-json-schema": "3.25.1" + "zod": "3.24.1", + "zod-to-json-schema": "3.24.1" }, "devDependencies": { "@microsoft/eslint-config-spfx": "<%= spfxVersion %>", @@ -25,8 +25,8 @@ "@microsoft/sp-module-interfaces": "<%= spfxVersion %>", "@microsoft/spfx-web-build-rig": "<%= spfxVersion %>", "@rushstack/eslint-config": "4.6.4", - "@rushstack/heft": "^1.2.9", - "@types/heft-jest": "^1.0.6", + "@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", 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 index 8bcba082..4cbecb24 100644 --- a/templates/copilot-component-minimal/src/{componentName.hyphen}-copilot-component.manifest.json +++ b/templates/copilot-component-minimal/src/{componentName.hyphen}-copilot-component.manifest.json @@ -9,12 +9,12 @@ "manifestVersion": 2, "capabilities": { - "availableDisplayModes": ["inline"] + "availableDisplayModes": ["inline", "fullscreen"] }, "tools": [ { - "name": "<%= componentName.pascal %>", + "name": "<%= componentName.pascal %>Tool", "description": { "default": "<%= componentDescription %>" }, diff --git a/templates/copilot-component-minimal/src/{componentName.pascal}CopilotComponent.ts b/templates/copilot-component-minimal/src/{componentName.pascal}CopilotComponent.ts index cee61ec7..65ca58f8 100644 --- a/templates/copilot-component-minimal/src/{componentName.pascal}CopilotComponent.ts +++ b/templates/copilot-component-minimal/src/{componentName.pascal}CopilotComponent.ts @@ -4,6 +4,6 @@ import type { I<%= componentName.pascal %>CopilotComponentProperties } from './< export default class <%= componentName.pascal %>CopilotComponent extends BaseCopilotComponentCopilotComponentProperties> { protected render(): void { - this.context.domElement.textContent = `Hello, ${this.properties.name}!`; + 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 index 89b09936..317bd67d 100644 --- a/templates/copilot-component-minimal/src/{componentName.pascal}Properties.ts +++ b/templates/copilot-component-minimal/src/{componentName.pascal}Properties.ts @@ -1,10 +1,10 @@ import { z } from 'zod'; -import { zodToJsonSchema } from 'zod-to-json-schema'; +import zodToJsonSchema from 'zod-to-json-schema'; -const <%= componentName.camel %>PropertiesSchema: z.ZodObject<{ name: z.ZodString }> = z.object({ - name: z.string().describe('The name of the person to greet.') +const propertiesSchema = z.object({ + message: z.string().describe('A message to display.') }); -export type I<%= componentName.pascal %>CopilotComponentProperties = z.inferPropertiesSchema>; +export type I<%= componentName.pascal %>CopilotComponentProperties = z.infer; -export default zodToJsonSchema(<%= componentName.camel %>PropertiesSchema); +export default zodToJsonSchema(propertiesSchema); diff --git a/templates/copilot-component-minimal/tsconfig.json b/templates/copilot-component-minimal/tsconfig.json index ee582d51..e054af28 100644 --- a/templates/copilot-component-minimal/tsconfig.json +++ b/templates/copilot-component-minimal/tsconfig.json @@ -1,3 +1,10 @@ { - "extends": "./node_modules/@microsoft/spfx-web-build-rig/profiles/default/tsconfig-base.json" + "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"] + } } From db19fc3e849b796c13052205ec743d46d54bd7dc Mon Sep 17 00:00:00 2001 From: Santiago Valencia Sanchez Date: Fri, 31 Jul 2026 03:27:48 +0000 Subject: [PATCH 4/9] Add copilot-component-noframework template (odsp 'none' migration) Rich no-framework Copilot Component sample migrated from odsp-web, adapted to spfx conventions (flat src/, .eslintrc.js, published-version deps): - HTML/CSS render with theme/display-mode details, welcome image, and an expand-to-fullscreen control (requestDisplayModeAsync) - .module.scss + config/sass.json; loc/ localization + config/typescript.json staticAssetsToCopy + config.json localizedResources; src/images.d.ts for png - deps: add @microsoft/sp-lodash-subset (escape); allowlist it at 1.24.0-beta.2 - Register example in rush.json + templates.test.ts; example builds and snapshot test passes (21 total) --- common/config/rush/common-versions.json | 1 + common/config/rush/pnpm-lock.yaml | 52 ++++++ common/config/rush/repo-state.json | 2 +- .../.eslintrc.js | 148 +++++++++++++++++ .../copilot-component-noframework/.gitignore | 33 ++++ .../copilot-component-noframework/.npmignore | 32 ++++ .../copilot-component-noframework/README.md | 67 ++++++++ .../config/config.json | 18 +++ .../config/copilot-agent.json | 11 ++ .../config/package-solution.json | 40 +++++ .../config/rig.json | 7 + .../config/sass.json | 5 + .../config/serve.json | 6 + .../config/typescript.json | 9 ++ .../copilot/ai-plugin.json | 9 ++ .../copilot/color.png | Bin 0 -> 2106 bytes .../copilot/declarativeAgent.json | 19 +++ .../copilot/instruction.txt | 3 + .../copilot/manifest.json | 35 ++++ .../copilot/outline.png | Bin 0 -> 249 bytes .../package.json | 36 +++++ .../NoFrameworkCopilotComponent.module.scss | 68 ++++++++ .../src/NoFrameworkCopilotComponent.ts | 68 ++++++++ .../src/NoFrameworkProperties.ts | 10 ++ .../src/assets/welcome-dark.png | Bin 0 -> 12545 bytes .../src/assets/welcome-light.png | Bin 0 -> 12816 bytes .../src/images.d.ts | 4 + .../src/loc/en-us.js | 10 ++ .../noFrameworkCopilotComponentStrings.d.ts | 13 ++ ...-framework-copilot-component.manifest.json | 26 +++ .../teams/noframework-agent.zip | Bin 0 -> 4151 bytes .../tsconfig.json | 10 ++ rush.json | 6 + .../.eslintrc.js | 148 +++++++++++++++++ .../copilot-component-noframework/.gitignore | 33 ++++ .../copilot-component-noframework/.npmignore | 32 ++++ .../copilot-component-noframework/README.md | 67 ++++++++ .../config/config.json | 18 +++ .../config/copilot-agent.json | 11 ++ .../config/package-solution.json | 40 +++++ .../config/rig.json | 7 + .../config/sass.json | 5 + .../config/serve.json | 6 + .../config/typescript.json | 9 ++ .../copilot/ai-plugin.json | 9 ++ .../copilot/color.png | Bin 0 -> 2106 bytes .../copilot/declarativeAgent.json | 19 +++ .../copilot/instruction.txt | 3 + .../copilot/manifest.json | 35 ++++ .../copilot/outline.png | Bin 0 -> 249 bytes .../package.json | 36 +++++ .../src/assets/welcome-dark.png | Bin 0 -> 12545 bytes .../src/assets/welcome-light.png | Bin 0 -> 12816 bytes .../src/images.d.ts | 4 + .../src/loc/en-us.js | 10 ++ ...entName.camel}CopilotComponentStrings.d.ts | 13 ++ ...me.hyphen}-copilot-component.manifest.json | 26 +++ ...ntName.pascal}CopilotComponent.module.scss | 68 ++++++++ .../{componentName.pascal}CopilotComponent.ts | 68 ++++++++ .../src/{componentName.pascal}Properties.ts | 10 ++ .../template.json | 7 + .../tsconfig.json | 10 ++ .../multi-component.test.ts.snap | 8 +- .../__snapshots__/templates.test.ts.snap | 152 +++++++++++++++--- .../src/tests/templates.test.ts | 9 ++ 65 files changed, 1590 insertions(+), 21 deletions(-) create mode 100644 examples/copilot-component-noframework/.eslintrc.js create mode 100644 examples/copilot-component-noframework/.gitignore create mode 100644 examples/copilot-component-noframework/.npmignore create mode 100644 examples/copilot-component-noframework/README.md create mode 100644 examples/copilot-component-noframework/config/config.json create mode 100644 examples/copilot-component-noframework/config/copilot-agent.json create mode 100644 examples/copilot-component-noframework/config/package-solution.json create mode 100644 examples/copilot-component-noframework/config/rig.json create mode 100644 examples/copilot-component-noframework/config/sass.json create mode 100644 examples/copilot-component-noframework/config/serve.json create mode 100644 examples/copilot-component-noframework/config/typescript.json create mode 100644 examples/copilot-component-noframework/copilot/ai-plugin.json create mode 100644 examples/copilot-component-noframework/copilot/color.png create mode 100644 examples/copilot-component-noframework/copilot/declarativeAgent.json create mode 100644 examples/copilot-component-noframework/copilot/instruction.txt create mode 100644 examples/copilot-component-noframework/copilot/manifest.json create mode 100644 examples/copilot-component-noframework/copilot/outline.png create mode 100644 examples/copilot-component-noframework/package.json create mode 100644 examples/copilot-component-noframework/src/NoFrameworkCopilotComponent.module.scss create mode 100644 examples/copilot-component-noframework/src/NoFrameworkCopilotComponent.ts create mode 100644 examples/copilot-component-noframework/src/NoFrameworkProperties.ts create mode 100644 examples/copilot-component-noframework/src/assets/welcome-dark.png create mode 100644 examples/copilot-component-noframework/src/assets/welcome-light.png create mode 100644 examples/copilot-component-noframework/src/images.d.ts create mode 100644 examples/copilot-component-noframework/src/loc/en-us.js create mode 100644 examples/copilot-component-noframework/src/loc/noFrameworkCopilotComponentStrings.d.ts create mode 100644 examples/copilot-component-noframework/src/no-framework-copilot-component.manifest.json create mode 100644 examples/copilot-component-noframework/teams/noframework-agent.zip create mode 100644 examples/copilot-component-noframework/tsconfig.json create mode 100644 templates/copilot-component-noframework/.eslintrc.js create mode 100644 templates/copilot-component-noframework/.gitignore create mode 100644 templates/copilot-component-noframework/.npmignore create mode 100644 templates/copilot-component-noframework/README.md create mode 100644 templates/copilot-component-noframework/config/config.json create mode 100644 templates/copilot-component-noframework/config/copilot-agent.json create mode 100644 templates/copilot-component-noframework/config/package-solution.json create mode 100644 templates/copilot-component-noframework/config/rig.json create mode 100644 templates/copilot-component-noframework/config/sass.json create mode 100644 templates/copilot-component-noframework/config/serve.json create mode 100644 templates/copilot-component-noframework/config/typescript.json create mode 100644 templates/copilot-component-noframework/copilot/ai-plugin.json create mode 100644 templates/copilot-component-noframework/copilot/color.png create mode 100644 templates/copilot-component-noframework/copilot/declarativeAgent.json create mode 100644 templates/copilot-component-noframework/copilot/instruction.txt create mode 100644 templates/copilot-component-noframework/copilot/manifest.json create mode 100644 templates/copilot-component-noframework/copilot/outline.png create mode 100644 templates/copilot-component-noframework/package.json create mode 100644 templates/copilot-component-noframework/src/assets/welcome-dark.png create mode 100644 templates/copilot-component-noframework/src/assets/welcome-light.png create mode 100644 templates/copilot-component-noframework/src/images.d.ts create mode 100644 templates/copilot-component-noframework/src/loc/en-us.js create mode 100644 templates/copilot-component-noframework/src/loc/{componentName.camel}CopilotComponentStrings.d.ts create mode 100644 templates/copilot-component-noframework/src/{componentName.hyphen}-copilot-component.manifest.json create mode 100644 templates/copilot-component-noframework/src/{componentName.pascal}CopilotComponent.module.scss create mode 100644 templates/copilot-component-noframework/src/{componentName.pascal}CopilotComponent.ts create mode 100644 templates/copilot-component-noframework/src/{componentName.pascal}Properties.ts create mode 100644 templates/copilot-component-noframework/template.json create mode 100644 templates/copilot-component-noframework/tsconfig.json diff --git a/common/config/rush/common-versions.json b/common/config/rush/common-versions.json index 2f0c1e2d..cebfc8bb 100644 --- a/common/config/rush/common-versions.json +++ b/common/config/rush/common-versions.json @@ -84,6 +84,7 @@ // 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), diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index fac6ca1d..32267d67 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -395,6 +395,58 @@ importers: 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/extension-application-customizer: dependencies: '@microsoft/decorators': diff --git a/common/config/rush/repo-state.json b/common/config/rush/repo-state.json index 8b9150b2..2018cbf3 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": "2646d4994e765a0683e1502c03c3a22bfa8a6bcd", + "pnpmShrinkwrapHash": "9a2aca807728ec30fd8a058e110bb8f2a74f2e88", "preferredVersionsHash": "e0fe58342c5c916209e75bfdee56e81689af3359" } diff --git a/examples/copilot-component-noframework/.eslintrc.js b/examples/copilot-component-noframework/.eslintrc.js new file mode 100644 index 00000000..7eecfadb --- /dev/null +++ b/examples/copilot-component-noframework/.eslintrc.js @@ -0,0 +1,148 @@ +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: { + '@rushstack/no-new-null': 1, + '@rushstack/hoist-jest-mock': 1, + '@rushstack/import-requires-chunk-name': 1, + '@rushstack/security/no-unsafe-regexp': 1, + '@typescript-eslint/adjacent-overload-signatures': 1, + '@typescript-eslint/explicit-function-return-type': [ + 1, + { + allowExpressions: true, + allowTypedFunctionExpressions: true, + allowHigherOrderFunctions: false + } + ], + '@typescript-eslint/explicit-member-accessibility': 0, + '@typescript-eslint/no-array-constructor': 1, + '@typescript-eslint/no-explicit-any': 1, + '@typescript-eslint/no-floating-promises': 2, + '@typescript-eslint/no-for-in-array': 2, + '@typescript-eslint/no-misused-new': 2, + '@typescript-eslint/no-namespace': [ + 1, + { + allowDeclarations: false, + allowDefinitionFiles: false + } + ], + '@typescript-eslint/parameter-properties': 0, + '@typescript-eslint/no-unused-vars': [ + 1, + { + vars: 'all', + args: 'none' + } + ], + '@typescript-eslint/no-use-before-define': [ + 2, + { + functions: false, + classes: true, + variables: true, + enums: true, + typedefs: true + } + ], + '@typescript-eslint/no-var-requires': 'error', + '@typescript-eslint/prefer-namespace-keyword': 1, + '@typescript-eslint/no-inferrable-types': 0, + '@typescript-eslint/no-empty-interface': 0, + 'accessor-pairs': 1, + 'dot-notation': [ + 1, + { + allowPattern: '^_' + } + ], + eqeqeq: 1, + 'for-direction': 1, + 'guard-for-in': 2, + 'max-lines': ['warn', { max: 2000 }], + 'no-async-promise-executor': 2, + 'no-caller': 2, + 'no-compare-neg-zero': 2, + 'no-cond-assign': 2, + 'no-constant-condition': 1, + 'no-control-regex': 2, + 'no-debugger': 1, + 'no-delete-var': 2, + 'no-duplicate-case': 2, + 'no-empty': 1, + 'no-empty-character-class': 2, + 'no-empty-pattern': 1, + 'no-eval': 1, + 'no-ex-assign': 2, + 'no-extend-native': 1, + 'no-extra-label': 1, + 'no-fallthrough': 2, + 'no-func-assign': 1, + 'no-implied-eval': 2, + 'no-invalid-regexp': 2, + 'no-label-var': 2, + 'no-lone-blocks': 1, + 'no-misleading-character-class': 2, + 'no-multi-str': 2, + 'no-new': 1, + 'no-new-func': 2, + 'no-new-object': 2, + 'no-new-wrappers': 1, + 'no-octal': 2, + 'no-octal-escape': 2, + 'no-regex-spaces': 2, + 'no-return-assign': 2, + 'no-script-url': 1, + 'no-self-assign': 2, + 'no-self-compare': 2, + 'no-sequences': 1, + 'no-shadow-restricted-names': 2, + 'no-sparse-arrays': 2, + 'no-throw-literal': 2, + 'no-unmodified-loop-condition': 1, + 'no-unsafe-finally': 2, + 'no-unused-expressions': 1, + 'no-unused-labels': 1, + 'no-useless-catch': 1, + 'no-useless-concat': 1, + 'no-var': 2, + 'no-void': 1, + 'no-with': 2, + 'prefer-const': 1, + 'promise/param-names': 2, + 'require-atomic-updates': 2, + 'require-yield': 1, + strict: [2, 'never'], + 'use-isnan': 2, + 'no-extra-boolean-cast': 0, + '@microsoft/spfx/no-require-ensure': 2 + } + }, + { + files: [ + '*.test.ts', + '*.test.tsx', + '*.spec.ts', + '*.spec.tsx', + '**/__mocks__/*.ts', + '**/__mocks__/*.tsx', + '**/__tests__/*.ts', + '**/__tests__/*.tsx', + '**/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..b0b3dd25 --- /dev/null +++ b/examples/copilot-component-noframework/.gitignore @@ -0,0 +1,33 @@ +# 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 +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 0000000000000000000000000000000000000000..7cdf55b04655810e334cccfe1ac86fd89e625572 GIT binary patch literal 2106 zcmd5;Yc!i#7k(o~qE*DSwAE0w{Y;IDstG#AEd+I`RxfTTQKD{5(6kdJM(YwvdZ9|y zl+Kh;r3|K0lF{iX6JeB~L|luyBvc5A#V)j+3VTQv-hE$_QLMk zv3~~u0K42=F=xQY-gdYOc%B)FhJitq=;{{_06Vp|9n#BBmH_~4!42c!d!u-f?;Y`Y z9ofEo^@0ZP;!6LiK%4ZsD{BU&WA}UV9Np!sz0DVUobYWUdc9M%cXrRCKIidP@%1l8 z4|+ZIw3*!O3Hiyh6tmA<_XdZP(F|jzZ)&66hTP7K{IO%v;CoLQmab<_DVZss`I5|! zbQ9A>Ndc5!u&kL^aba7DP|Vh$rLO>zA>eBC@31IZB4qIOuleVgq{h|$%)FHaE9b2E5S_Xt#`%*kWoC?ST4D8yS*0Y&sA>QZn)( z_F3p;BUu{T)lT#v>O-uK&Wc!;#J@JBak|Ohfi;$Q2i3++mk2{?DM0b=1WASfS+S|7 z=;FJ93k@hxtmf_^%oy&IXDoZv`jkPfmNz$w%GKJZ z%S}z!6vEc3A6YKjnCZDj0}hJK>){r>hig>7(=}%{a89GRU7;Y1#7lVSUZif5-6g#m ziuB&w?vKIph1}69jWXYtgAKG);eOd|Ygq}!P_p{Kr1a(CV>Da%sLb+@3?vA^g;6T{ zH?V53qYER2XV;i$ul}t;<8;A`R_J8u_^HyG|ESY;vAq=?fr}?CKVKJ%dDj#b>4L9M zq|$#lHdtLF#Qat{>#EYj)8@|)QE(@*wz86^h&#E93)97aAA%Bn0^bT%wH%CC1!Fsu zi1s6Ig>#+Zjm7>gL$WqJri!Kl`I93(o^29|tj}}r*u4D+z>}9ewuD+~4AUodP`(&y7Zq>NOlokY> zjUYK|CP=7>b?CnM@(D*koo16t;i@1xKj&Qb^f3b3F?$?Z1Tfd5O2pHH2vOK07@X}B z;>;FZ#Q^G23Ce1U^U9j_6^-A7NSd&Kc{aXAFP&whl<7C9d){0ohqEEu$pbDxZUmT2 zMJbQnbpbD6SRj{yPG!u^+sPN?;elt>s7U__9MHI8SYi1d6w*T$3J;2dxAE9xEISz` z(-5hRRXpuh4iArN5`GjA6z@brd;HH3-T%NL0&b?6L>3<$$QoB zgux?M^|>yLYo+Xl;p;Jxo6S=WBs^5|?rh=$7p>s0HEPILaKD@^4qMY_P==>6bd3C* zs-vERdN>3fJA60Of50R_-kYPL^2`NrjI(X89Niubw@pYe2;6Og8%xgu4(9xS=6O6N zAnN)A&hgvGpd1$;Jakqx1SLdB?pqYNX1Oy0m-))*EL-=WyulU+4YIJQ&4V;N+?k(9 zo@n^O6BN|n>c%u-XUS!fsyD0C7sxSXV@zoPfqZp#p6G)&yXSlK!or4*w@P!IAxFME zbbE?Rq9v*JJ@oRUUOKiEb|P)GfbOQw@=JxHEarvt4czD>OJP=B%;1tr46Ns&*UVE-@54%wS literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e8cb4b6ba4f726d47a2e274f16b6069b9a8041cc GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG z%|CHbgX^da?eHs6`1kLARhjOac zf3;y1Iq~M{LLS3g_M2bU{+PBvomV=FH7$YTy5I%1<5B$=?>3fqI5P%5iajq7)W9SX p;gpazd1JnvZNlx8HB0WjVJ`J~Q+P@%pA+aZ22WQ%mvv4FO#n^cR9FB2 literal 0 HcmV?d00001 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..a528d8d0 --- /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 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 0000000000000000000000000000000000000000..42f0b8d24a9aa964a2be4885fe5700c1c54191a9 GIT binary patch literal 12545 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�Gp~kbx)oU28ew4C2+WtKA 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 G`2PSf1J4)$ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..69eb3b48cd83031f106df4b4df127c749657e319 GIT binary patch literal 12816 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 literal 0 HcmV?d00001 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/teams/noframework-agent.zip b/examples/copilot-component-noframework/teams/noframework-agent.zip new file mode 100644 index 0000000000000000000000000000000000000000..c1b5c66ba0cc2db8132c9457c4a5f8436520a58f GIT binary patch literal 4151 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 literal 0 HcmV?d00001 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/rush.json b/rush.json index e780e8be..9f946a0b 100644 --- a/rush.json +++ b/rush.json @@ -510,6 +510,12 @@ "reviewCategory": "templates", "tags": [] }, + { + "packageName": "@spfx-template/copilot-component-noframework", + "projectFolder": "examples/copilot-component-noframework", + "reviewCategory": "templates", + "tags": [] + }, { "packageName": "@spfx-template/extension-application-customizer", "projectFolder": "examples/extension-application-customizer", diff --git a/templates/copilot-component-noframework/.eslintrc.js b/templates/copilot-component-noframework/.eslintrc.js new file mode 100644 index 00000000..7eecfadb --- /dev/null +++ b/templates/copilot-component-noframework/.eslintrc.js @@ -0,0 +1,148 @@ +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: { + '@rushstack/no-new-null': 1, + '@rushstack/hoist-jest-mock': 1, + '@rushstack/import-requires-chunk-name': 1, + '@rushstack/security/no-unsafe-regexp': 1, + '@typescript-eslint/adjacent-overload-signatures': 1, + '@typescript-eslint/explicit-function-return-type': [ + 1, + { + allowExpressions: true, + allowTypedFunctionExpressions: true, + allowHigherOrderFunctions: false + } + ], + '@typescript-eslint/explicit-member-accessibility': 0, + '@typescript-eslint/no-array-constructor': 1, + '@typescript-eslint/no-explicit-any': 1, + '@typescript-eslint/no-floating-promises': 2, + '@typescript-eslint/no-for-in-array': 2, + '@typescript-eslint/no-misused-new': 2, + '@typescript-eslint/no-namespace': [ + 1, + { + allowDeclarations: false, + allowDefinitionFiles: false + } + ], + '@typescript-eslint/parameter-properties': 0, + '@typescript-eslint/no-unused-vars': [ + 1, + { + vars: 'all', + args: 'none' + } + ], + '@typescript-eslint/no-use-before-define': [ + 2, + { + functions: false, + classes: true, + variables: true, + enums: true, + typedefs: true + } + ], + '@typescript-eslint/no-var-requires': 'error', + '@typescript-eslint/prefer-namespace-keyword': 1, + '@typescript-eslint/no-inferrable-types': 0, + '@typescript-eslint/no-empty-interface': 0, + 'accessor-pairs': 1, + 'dot-notation': [ + 1, + { + allowPattern: '^_' + } + ], + eqeqeq: 1, + 'for-direction': 1, + 'guard-for-in': 2, + 'max-lines': ['warn', { max: 2000 }], + 'no-async-promise-executor': 2, + 'no-caller': 2, + 'no-compare-neg-zero': 2, + 'no-cond-assign': 2, + 'no-constant-condition': 1, + 'no-control-regex': 2, + 'no-debugger': 1, + 'no-delete-var': 2, + 'no-duplicate-case': 2, + 'no-empty': 1, + 'no-empty-character-class': 2, + 'no-empty-pattern': 1, + 'no-eval': 1, + 'no-ex-assign': 2, + 'no-extend-native': 1, + 'no-extra-label': 1, + 'no-fallthrough': 2, + 'no-func-assign': 1, + 'no-implied-eval': 2, + 'no-invalid-regexp': 2, + 'no-label-var': 2, + 'no-lone-blocks': 1, + 'no-misleading-character-class': 2, + 'no-multi-str': 2, + 'no-new': 1, + 'no-new-func': 2, + 'no-new-object': 2, + 'no-new-wrappers': 1, + 'no-octal': 2, + 'no-octal-escape': 2, + 'no-regex-spaces': 2, + 'no-return-assign': 2, + 'no-script-url': 1, + 'no-self-assign': 2, + 'no-self-compare': 2, + 'no-sequences': 1, + 'no-shadow-restricted-names': 2, + 'no-sparse-arrays': 2, + 'no-throw-literal': 2, + 'no-unmodified-loop-condition': 1, + 'no-unsafe-finally': 2, + 'no-unused-expressions': 1, + 'no-unused-labels': 1, + 'no-useless-catch': 1, + 'no-useless-concat': 1, + 'no-var': 2, + 'no-void': 1, + 'no-with': 2, + 'prefer-const': 1, + 'promise/param-names': 2, + 'require-atomic-updates': 2, + 'require-yield': 1, + strict: [2, 'never'], + 'use-isnan': 2, + 'no-extra-boolean-cast': 0, + '@microsoft/spfx/no-require-ensure': 2 + } + }, + { + files: [ + '*.test.ts', + '*.test.tsx', + '*.spec.ts', + '*.spec.tsx', + '**/__mocks__/*.ts', + '**/__mocks__/*.tsx', + '**/__tests__/*.ts', + '**/__tests__/*.tsx', + '**/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..b0b3dd25 --- /dev/null +++ b/templates/copilot-component-noframework/.gitignore @@ -0,0 +1,33 @@ +# 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 +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 0000000000000000000000000000000000000000..7cdf55b04655810e334cccfe1ac86fd89e625572 GIT binary patch literal 2106 zcmd5;Yc!i#7k(o~qE*DSwAE0w{Y;IDstG#AEd+I`RxfTTQKD{5(6kdJM(YwvdZ9|y zl+Kh;r3|K0lF{iX6JeB~L|luyBvc5A#V)j+3VTQv-hE$_QLMk zv3~~u0K42=F=xQY-gdYOc%B)FhJitq=;{{_06Vp|9n#BBmH_~4!42c!d!u-f?;Y`Y z9ofEo^@0ZP;!6LiK%4ZsD{BU&WA}UV9Np!sz0DVUobYWUdc9M%cXrRCKIidP@%1l8 z4|+ZIw3*!O3Hiyh6tmA<_XdZP(F|jzZ)&66hTP7K{IO%v;CoLQmab<_DVZss`I5|! zbQ9A>Ndc5!u&kL^aba7DP|Vh$rLO>zA>eBC@31IZB4qIOuleVgq{h|$%)FHaE9b2E5S_Xt#`%*kWoC?ST4D8yS*0Y&sA>QZn)( z_F3p;BUu{T)lT#v>O-uK&Wc!;#J@JBak|Ohfi;$Q2i3++mk2{?DM0b=1WASfS+S|7 z=;FJ93k@hxtmf_^%oy&IXDoZv`jkPfmNz$w%GKJZ z%S}z!6vEc3A6YKjnCZDj0}hJK>){r>hig>7(=}%{a89GRU7;Y1#7lVSUZif5-6g#m ziuB&w?vKIph1}69jWXYtgAKG);eOd|Ygq}!P_p{Kr1a(CV>Da%sLb+@3?vA^g;6T{ zH?V53qYER2XV;i$ul}t;<8;A`R_J8u_^HyG|ESY;vAq=?fr}?CKVKJ%dDj#b>4L9M zq|$#lHdtLF#Qat{>#EYj)8@|)QE(@*wz86^h&#E93)97aAA%Bn0^bT%wH%CC1!Fsu zi1s6Ig>#+Zjm7>gL$WqJri!Kl`I93(o^29|tj}}r*u4D+z>}9ewuD+~4AUodP`(&y7Zq>NOlokY> zjUYK|CP=7>b?CnM@(D*koo16t;i@1xKj&Qb^f3b3F?$?Z1Tfd5O2pHH2vOK07@X}B z;>;FZ#Q^G23Ce1U^U9j_6^-A7NSd&Kc{aXAFP&whl<7C9d){0ohqEEu$pbDxZUmT2 zMJbQnbpbD6SRj{yPG!u^+sPN?;elt>s7U__9MHI8SYi1d6w*T$3J;2dxAE9xEISz` z(-5hRRXpuh4iArN5`GjA6z@brd;HH3-T%NL0&b?6L>3<$$QoB zgux?M^|>yLYo+Xl;p;Jxo6S=WBs^5|?rh=$7p>s0HEPILaKD@^4qMY_P==>6bd3C* zs-vERdN>3fJA60Of50R_-kYPL^2`NrjI(X89Niubw@pYe2;6Og8%xgu4(9xS=6O6N zAnN)A&hgvGpd1$;Jakqx1SLdB?pqYNX1Oy0m-))*EL-=WyulU+4YIJQ&4V;N+?k(9 zo@n^O6BN|n>c%u-XUS!fsyD0C7sxSXV@zoPfqZp#p6G)&yXSlK!or4*w@P!IAxFME zbbE?Rq9v*JJ@oRUUOKiEb|P)GfbOQw@=JxHEarvt4czD>OJP=B%;1tr46Ns&*UVE-@54%wS literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e8cb4b6ba4f726d47a2e274f16b6069b9a8041cc GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG z%|CHbgX^da?eHs6`1kLARhjOac zf3;y1Iq~M{LLS3g_M2bU{+PBvomV=FH7$YTy5I%1<5B$=?>3fqI5P%5iajq7)W9SX p;gpazd1JnvZNlx8HB0WjVJ`J~Q+P@%pA+aZ22WQ%mvv4FO#n^cR9FB2 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..42f0b8d24a9aa964a2be4885fe5700c1c54191a9 GIT binary patch literal 12545 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�Gp~kbx)oU28ew4C2+WtKA z?ii5OmkiU`=%DSZvRn_T6N8n7gMpPiuw|6cx+?2QoiiV*HPSBURRb((2HlrP$nR1s zE!ixA3%lrPad}1)Ev0nH@FIc9zz{>ERl9N6scn~9yO(pwlPFAF3t>lYw5|VV|64D6>pIGI3Rm+c zKbkssWHyfURs`J^lLRc1d4J~Ah>WmH{s63$6_HH-NM=y z>;@rMW?hUwN)7?6`tE#kp-XQFh3y(8I&q6Z-Yu=~01lRW0<^gnfcn$IJ&TZ9FF7&o zV4t%GQz0SrTZ^PJ_1)7K#6^!$)g-G`)=?MWVN5O}tQm!p12t6A+Of`2+&o!Nekuid=bR0fGTXpW~)oGkX%aRNDiMeoFHRq+T)jo8H})cIhJ zPTRyN&TWN^lH$?(u!;?ZzQ$=9yZLkS#1ScsM)=G7XRkRSFfy=2Mg&)sJD2lVdMbJWMSd+=nUsu%&;wbB1^A^ z?rQSHzQ$fY;&TLz`)?BFfO5e(3XhWu$=rfVj34YGnnzCU=wXsoPLTh+90ynqCsqhk zYy=A){iJzTYWrDR&`A+IfqXa{nAX~`qEB)DjcgrF+>*APef@_U`Oq0aT;t@CY(>c4h}{&c-RjvoQ8DMpY=)g9o+>NU{QgUOqSKgmyrqyKU1Dg(uS(kR4uD0% z)U_-?+)|X)&hbK3FYW94IO>-dP8@a^HOzlTZxVD^;%aq|B}a=!ijidAmNIaZP<&@R zP+1#=-8X$$Gx-DbgM`w6Bgea*c-jXh)lK9mNM1+!u4x)x5ble>gE6?skgv5zbtS6p zguFN;VLQyFgEXQ)>neCi-{CPNvNCBI3nh08A+4R;x#uw5uT9NT0hz)@|zA?uCJFfS2#`L zL~RKmYQTb!J)*cb+AqSKKm4Ndxs<3F->WzvZA*~YaJKs-{Tg-zBn6Uooxn2i)v3It zLRX7&gl2f65*7pL32*8YNfdS|1TN-eMM*>=kN%dVfQox{)a3t2!43=!x|LDC|8n}1MB!pUtK42c{r<}m<^X8K zKT$|4E3Ham!jf4X7V*9;Km5QI8mo=S_#Z~1l@I6@Ek_k9qj+A(SzI`n`0}U7o0@?G zi{9?5!$-|oX9@0&IN66)ZXB97ooK6_S2`EpGxpvRB-RWc4v(t18isepQgMMeTm@l< zMhlxU!<7JL)&EAR9EXL;6ZH?Zk0E?kH0fV7^hZO-_Q& zpC}S8S;)2Eh3Et3tB)H1J2?y6F9X^=oy1pThwL9$A9fQeEG!reEz}%zCTv$XBs>+W zATfsO&fLEBp412N<)&0yh<@*%oR)IT^{9SR;rf;BOrB8C0(ySBitd7##@bZcWZ zz9Uq+Vy739f!9D|t|1>ODDUPEm462)aWV2=vmkKsNIm*y`f>Yza2Ywc|0~*PQ$M-n zi^#>~GS#qeW~6tzLngVh;~6GBfm7|c51O+KmsH8-pRpA$NFO^1O!E&A71Cc>p?7)N zAN<9jvM4_iaVV?&XSwGaMh;uewlb$(be4lMNQ4qx=-+U0;RY>HV0x?*P;36>Ebvwa zD6jcnMR;cepwtx}U*%9y>s~3vou$=p{@Mw8BWpDhpk%%{d^ov?g&HCC%pW*piE$L4 z9=!9m@gQ#B%=P-y=Dob>T8vPVqDcyGuB2KB4|`CGSFYZJ~hG;6dp{lH@~RvJk42^-$H>7?0W^P-_SDVUbY?LK)NLi~qblRiT{fES-fpdgw;tX||%2yyhA~`?!4pACHi`xh)x$&r;6U4!gPc9=NkxxtoHE zknMrdfVo&XBsm#U8d_QM77NZ`m_<-a9EMVaZ$CP8f>C>ytUBGKL`r1Nz?&G`!w}Yj zC4S&|^NEAnDqGm9!3R&oJ! z#axCX32OI8 z0Ya>4RsNOxTP?F;Fd>EkP(FZ}GQ=`sVI+o3ijQ16??*1g+J}ij>{*oV^xN5j+i%IJ z+oM!w5qM5bB2TZ6M6{CeqO?t(Mdy-fY~^#CEw0E9A!ZIRZQvu3NZ#_j64p&ZlIKi zDxtXK4xWq3W3{8OrMNPgH&bzVA6bx_4`Z=ldabh|mBI#nU~#C5KN8s7@W>0b8xOytF{wcIZ{KA!`6{j8DD{1$nM z8s6qm2TJCY<70W-C4p+Pbt0do1>m47NRr40&|M>kE-QH)47|C2xc?-ha8tB&fk1PIONh3xsUz7f7vN02Sc9tVLV1! zvNH#D6T}LRg|ItqZR>GR^m*+i6M}S?de#tn>Cvmje>y%H&MR8~oR2AQV7pe2M zznj)Cj3eRmw~kc*?(BT<5u$LjNWLwT(%;klDB*q^Zo4iiPM+_0M{@(3wIRm)833t= zfslP$WBd`q0*gPo#o~Nk|H|eAM|t``0r$g8SjCK&9|+j2}|C7I^AWF_IAd&PMqF1RuEq zcx!|bRh8uox_z3x_hWedYHDhF3uAeQXQ4%BJ|n%e2axKOv?gHz0iVjAoJeQJAqffz|3m~)}2AClI;2pJnk2gyQ;uFlTfbA){f<D0>VCw-mkdAdDXt8)K@_44!;Y4pu~Ea!8+Hm{#aOKN6R)+^!6Ryf&$_s3RL|B)lkGfgG4BG zq&~Nx4q+D_xW2f*_q31` zQJy7f-L`UE{A{P)#=6@>44d*Xqm7;_cUx}ac8Eyl20)bC_7wzGp5T|8CE6c~gS90Q zL*(MP4IYaR;;a4F@Wo4FM3ogtuji{DOgYTcN%sD}XNe}rq*Jz~hW%p!PEJZ$vR2$Q G`2PSf1J4)$ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..69eb3b48cd83031f106df4b4df127c749657e319 GIT binary patch literal 12816 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 literal 0 HcmV?d00001 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..1dc0b091 --- /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 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/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 6a2b321e..26588a71 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,7 +165,7 @@ Object { exports[`Multi-component scaffolding should scaffold webpart-minimal then extension-application-customizer into same directory: stdout 1`] = ` "Adding local template source: -Found 18 templates: +Found 19 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] @@ -182,6 +182,8 @@ Found 18 templates: [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] 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] @@ -238,7 +240,7 @@ targetDir: exports[`Multi-component scaffolding should scaffold webpart-minimal then extension-application-customizer into same directory: stdout 2`] = ` "Adding local template source: -Found 18 templates: +Found 19 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] @@ -255,6 +257,8 @@ Found 18 templates: [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] 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] 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 189d2515..9d2e67f1 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,7 +2,7 @@ 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 18 templates: +Found 19 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] @@ -19,6 +19,8 @@ Found 18 templates: [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] 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] @@ -77,7 +79,7 @@ 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 18 templates: +Found 19 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] @@ -94,6 +96,8 @@ Found 18 templates: [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] 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] @@ -152,7 +156,7 @@ 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 18 templates: +Found 19 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] @@ -169,6 +173,8 @@ Found 18 templates: [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] 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] @@ -227,7 +233,7 @@ 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 18 templates: +Found 19 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] @@ -244,6 +250,8 @@ Found 18 templates: [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] 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] @@ -302,7 +310,7 @@ 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 18 templates: +Found 19 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] @@ -319,6 +327,8 @@ Found 18 templates: [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] 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] @@ -377,7 +387,7 @@ 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 18 templates: +Found 19 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] @@ -394,6 +404,8 @@ Found 18 templates: [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] 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] @@ -445,9 +457,89 @@ targetDir: " `; +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 19 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] 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 extension-application-customizer template and match example output: stdout 1`] = ` "Adding local template source: -Found 18 templates: +Found 19 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] @@ -464,6 +556,8 @@ Found 18 templates: [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] 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] @@ -519,7 +613,7 @@ 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 18 templates: +Found 19 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] @@ -536,6 +630,8 @@ Found 18 templates: [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] 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] @@ -591,7 +687,7 @@ 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 18 templates: +Found 19 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] @@ -608,6 +704,8 @@ Found 18 templates: [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] 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] @@ -663,7 +761,7 @@ 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 18 templates: +Found 19 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] @@ -680,6 +778,8 @@ Found 18 templates: [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] 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] @@ -736,7 +836,7 @@ 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 18 templates: +Found 19 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] @@ -753,6 +853,8 @@ Found 18 templates: [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] 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] @@ -807,7 +909,7 @@ 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 18 templates: +Found 19 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] @@ -824,6 +926,8 @@ Found 18 templates: [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] 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] @@ -877,7 +981,7 @@ 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 18 templates: +Found 19 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] @@ -894,6 +998,8 @@ Found 18 templates: [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] 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] @@ -951,7 +1057,7 @@ 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 18 templates: +Found 19 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] @@ -968,6 +1074,8 @@ Found 18 templates: [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] 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] @@ -1023,7 +1131,7 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold library template and match example output: stdout 1`] = ` "Adding local template source: -Found 18 templates: +Found 19 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] @@ -1040,6 +1148,8 @@ Found 18 templates: [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] 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] @@ -1112,7 +1222,7 @@ 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 18 templates: +Found 19 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] @@ -1129,6 +1239,8 @@ Found 18 templates: [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] 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] @@ -1185,7 +1297,7 @@ 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 18 templates: +Found 19 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] @@ -1202,6 +1314,8 @@ Found 18 templates: [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] 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] @@ -1261,7 +1375,7 @@ 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 18 templates: +Found 19 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] @@ -1278,6 +1392,8 @@ Found 18 templates: [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] 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] diff --git a/tests/spfx-template-test/src/tests/templates.test.ts b/tests/spfx-template-test/src/tests/templates.test.ts index 0b9ed74b..eba41757 100644 --- a/tests/spfx-template-test/src/tests/templates.test.ts +++ b/tests/spfx-template-test/src/tests/templates.test.ts @@ -198,6 +198,15 @@ const TEMPLATE_CONFIGS: ITemplateConfig[] = [ 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' } ]; From 066d6ba693a0d442e830ec8be0bf005d9ba6e6fb Mon Sep 17 00:00:00 2001 From: Santiago Valencia Sanchez Date: Fri, 31 Jul 2026 03:38:19 +0000 Subject: [PATCH 5/9] Add copilot-component-react template (odsp react migration) React-based Copilot Component sample migrated from odsp-web, adapted to spfx conventions (flat src/, .eslintrc.js react profile, published-version deps): - Main component fetches user (Graph /me) + site (SharePoint REST) via brokered SSO, then mounts a Fluent UI v9 React tree; unmounts on teardown - components/.tsx: FluentProvider theming + host-context badges + four bridge actions (expand, open link, follow-up message, resize) - loc/ localization + config/typescript.json staticAssetsToCopy + config.json localizedResources - deps: react/react-dom 17, @fluentui/react-components v9, @fluentui/react-icons, @microsoft/sp-http, eslint-plugin-react(-hooks); @types/react resolutions - Register example in rush.json + templates.test.ts (component name 'Sample' to avoid colliding with the React import); example builds; suite green (22 total) --- common/config/rush/pnpm-lock.yaml | 201 +++++++---- common/config/rush/repo-state.json | 2 +- examples/copilot-component-react/.eslintrc.js | 318 ++++++++++++++++++ examples/copilot-component-react/.gitignore | 33 ++ examples/copilot-component-react/.npmignore | 32 ++ examples/copilot-component-react/README.md | 67 ++++ .../config/config.json | 18 + .../config/copilot-agent.json | 11 + .../config/package-solution.json | 40 +++ .../copilot-component-react/config/rig.json | 7 + .../copilot-component-react/config/serve.json | 6 + .../config/typescript.json | 9 + .../copilot/ai-plugin.json | 9 + .../copilot-component-react/copilot/color.png | Bin 0 -> 2106 bytes .../copilot/declarativeAgent.json | 19 ++ .../copilot/instruction.txt | 3 + .../copilot/manifest.json | 35 ++ .../copilot/outline.png | Bin 0 -> 249 bytes examples/copilot-component-react/package.json | 47 +++ .../src/SampleCopilotComponent.tsx | 83 +++++ .../src/SampleProperties.ts | 10 + .../src/components/ISampleProps.ts | 47 +++ .../src/components/Sample.tsx | 157 +++++++++ .../copilot-component-react/src/loc/en-us.js | 16 + .../loc/sampleCopilotComponentStrings.d.ts | 19 ++ .../sample-copilot-component.manifest.json | 26 ++ .../teams/sample-agent.zip | Bin 0 -> 4129 bytes .../copilot-component-react/tsconfig.json | 10 + rush.json | 6 + .../copilot-component-react/.eslintrc.js | 318 ++++++++++++++++++ templates/copilot-component-react/.gitignore | 33 ++ templates/copilot-component-react/.npmignore | 32 ++ templates/copilot-component-react/README.md | 67 ++++ .../config/config.json | 18 + .../config/copilot-agent.json | 11 + .../config/package-solution.json | 40 +++ .../copilot-component-react/config/rig.json | 7 + .../copilot-component-react/config/serve.json | 6 + .../config/typescript.json | 9 + .../copilot/ai-plugin.json | 9 + .../copilot-component-react/copilot/color.png | Bin 0 -> 2106 bytes .../copilot/declarativeAgent.json | 19 ++ .../copilot/instruction.txt | 3 + .../copilot/manifest.json | 35 ++ .../copilot/outline.png | Bin 0 -> 249 bytes .../copilot-component-react/package.json | 47 +++ .../I{componentName.pascal}Props.ts | 47 +++ .../src/components/{componentName.pascal}.tsx | 157 +++++++++ .../copilot-component-react/src/loc/en-us.js | 16 + ...entName.camel}CopilotComponentStrings.d.ts | 19 ++ ...me.hyphen}-copilot-component.manifest.json | 26 ++ ...{componentName.pascal}CopilotComponent.tsx | 83 +++++ .../src/{componentName.pascal}Properties.ts | 10 + .../copilot-component-react/template.json | 7 + .../copilot-component-react/tsconfig.json | 10 + .../multi-component.test.ts.snap | 8 +- .../__snapshots__/templates.test.ts.snap | 155 +++++++-- .../src/tests/templates.test.ts | 9 + 58 files changed, 2342 insertions(+), 90 deletions(-) create mode 100644 examples/copilot-component-react/.eslintrc.js create mode 100644 examples/copilot-component-react/.gitignore create mode 100644 examples/copilot-component-react/.npmignore create mode 100644 examples/copilot-component-react/README.md create mode 100644 examples/copilot-component-react/config/config.json create mode 100644 examples/copilot-component-react/config/copilot-agent.json create mode 100644 examples/copilot-component-react/config/package-solution.json create mode 100644 examples/copilot-component-react/config/rig.json create mode 100644 examples/copilot-component-react/config/serve.json create mode 100644 examples/copilot-component-react/config/typescript.json create mode 100644 examples/copilot-component-react/copilot/ai-plugin.json create mode 100644 examples/copilot-component-react/copilot/color.png create mode 100644 examples/copilot-component-react/copilot/declarativeAgent.json create mode 100644 examples/copilot-component-react/copilot/instruction.txt create mode 100644 examples/copilot-component-react/copilot/manifest.json create mode 100644 examples/copilot-component-react/copilot/outline.png create mode 100644 examples/copilot-component-react/package.json create mode 100644 examples/copilot-component-react/src/SampleCopilotComponent.tsx create mode 100644 examples/copilot-component-react/src/SampleProperties.ts create mode 100644 examples/copilot-component-react/src/components/ISampleProps.ts create mode 100644 examples/copilot-component-react/src/components/Sample.tsx create mode 100644 examples/copilot-component-react/src/loc/en-us.js create mode 100644 examples/copilot-component-react/src/loc/sampleCopilotComponentStrings.d.ts create mode 100644 examples/copilot-component-react/src/sample-copilot-component.manifest.json create mode 100644 examples/copilot-component-react/teams/sample-agent.zip create mode 100644 examples/copilot-component-react/tsconfig.json create mode 100644 templates/copilot-component-react/.eslintrc.js create mode 100644 templates/copilot-component-react/.gitignore create mode 100644 templates/copilot-component-react/.npmignore create mode 100644 templates/copilot-component-react/README.md create mode 100644 templates/copilot-component-react/config/config.json create mode 100644 templates/copilot-component-react/config/copilot-agent.json create mode 100644 templates/copilot-component-react/config/package-solution.json create mode 100644 templates/copilot-component-react/config/rig.json create mode 100644 templates/copilot-component-react/config/serve.json create mode 100644 templates/copilot-component-react/config/typescript.json create mode 100644 templates/copilot-component-react/copilot/ai-plugin.json create mode 100644 templates/copilot-component-react/copilot/color.png create mode 100644 templates/copilot-component-react/copilot/declarativeAgent.json create mode 100644 templates/copilot-component-react/copilot/instruction.txt create mode 100644 templates/copilot-component-react/copilot/manifest.json create mode 100644 templates/copilot-component-react/copilot/outline.png create mode 100644 templates/copilot-component-react/package.json create mode 100644 templates/copilot-component-react/src/components/I{componentName.pascal}Props.ts create mode 100644 templates/copilot-component-react/src/components/{componentName.pascal}.tsx create mode 100644 templates/copilot-component-react/src/loc/en-us.js create mode 100644 templates/copilot-component-react/src/loc/{componentName.camel}CopilotComponentStrings.d.ts create mode 100644 templates/copilot-component-react/src/{componentName.hyphen}-copilot-component.manifest.json create mode 100644 templates/copilot-component-react/src/{componentName.pascal}CopilotComponent.tsx create mode 100644 templates/copilot-component-react/src/{componentName.pascal}Properties.ts create mode 100644 templates/copilot-component-react/template.json create mode 100644 templates/copilot-component-react/tsconfig.json diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 32267d67..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 @@ -447,6 +447,82 @@ importers: 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': @@ -460,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 @@ -808,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) @@ -955,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 @@ -1013,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 @@ -1074,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 @@ -1790,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: @@ -7899,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) @@ -7920,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 @@ -7951,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) @@ -7970,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 @@ -7986,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) @@ -8004,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) @@ -8038,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) @@ -8060,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) @@ -8100,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) @@ -8203,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) @@ -8257,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) @@ -8298,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) @@ -8319,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) @@ -8337,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) @@ -8429,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) @@ -8451,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) @@ -8466,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 @@ -8510,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) @@ -8634,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) @@ -8668,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) @@ -8683,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) @@ -8701,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 @@ -8759,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 @@ -8791,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) @@ -8809,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) @@ -8832,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) @@ -8886,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) @@ -8909,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) @@ -8929,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) @@ -8984,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) @@ -9045,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) @@ -9787,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) @@ -9797,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) @@ -10003,11 +10068,11 @@ 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-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) @@ -10364,7 +10429,7 @@ 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-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) @@ -10419,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) @@ -10431,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 @@ -13477,7 +13542,7 @@ snapshots: once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.14.2 + qs: 6.15.3 range-parser: 1.2.1 router: 2.2.0 send: 1.2.1 diff --git a/common/config/rush/repo-state.json b/common/config/rush/repo-state.json index 2018cbf3..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": "9a2aca807728ec30fd8a058e110bb8f2a74f2e88", + "pnpmShrinkwrapHash": "0b93ab9d09fb0ae272fcc80188c87dce6ea8a8d1", "preferredVersionsHash": "e0fe58342c5c916209e75bfdee56e81689af3359" } 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..b0b3dd25 --- /dev/null +++ b/examples/copilot-component-react/.gitignore @@ -0,0 +1,33 @@ +# 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 +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 0000000000000000000000000000000000000000..7cdf55b04655810e334cccfe1ac86fd89e625572 GIT binary patch literal 2106 zcmd5;Yc!i#7k(o~qE*DSwAE0w{Y;IDstG#AEd+I`RxfTTQKD{5(6kdJM(YwvdZ9|y zl+Kh;r3|K0lF{iX6JeB~L|luyBvc5A#V)j+3VTQv-hE$_QLMk zv3~~u0K42=F=xQY-gdYOc%B)FhJitq=;{{_06Vp|9n#BBmH_~4!42c!d!u-f?;Y`Y z9ofEo^@0ZP;!6LiK%4ZsD{BU&WA}UV9Np!sz0DVUobYWUdc9M%cXrRCKIidP@%1l8 z4|+ZIw3*!O3Hiyh6tmA<_XdZP(F|jzZ)&66hTP7K{IO%v;CoLQmab<_DVZss`I5|! zbQ9A>Ndc5!u&kL^aba7DP|Vh$rLO>zA>eBC@31IZB4qIOuleVgq{h|$%)FHaE9b2E5S_Xt#`%*kWoC?ST4D8yS*0Y&sA>QZn)( z_F3p;BUu{T)lT#v>O-uK&Wc!;#J@JBak|Ohfi;$Q2i3++mk2{?DM0b=1WASfS+S|7 z=;FJ93k@hxtmf_^%oy&IXDoZv`jkPfmNz$w%GKJZ z%S}z!6vEc3A6YKjnCZDj0}hJK>){r>hig>7(=}%{a89GRU7;Y1#7lVSUZif5-6g#m ziuB&w?vKIph1}69jWXYtgAKG);eOd|Ygq}!P_p{Kr1a(CV>Da%sLb+@3?vA^g;6T{ zH?V53qYER2XV;i$ul}t;<8;A`R_J8u_^HyG|ESY;vAq=?fr}?CKVKJ%dDj#b>4L9M zq|$#lHdtLF#Qat{>#EYj)8@|)QE(@*wz86^h&#E93)97aAA%Bn0^bT%wH%CC1!Fsu zi1s6Ig>#+Zjm7>gL$WqJri!Kl`I93(o^29|tj}}r*u4D+z>}9ewuD+~4AUodP`(&y7Zq>NOlokY> zjUYK|CP=7>b?CnM@(D*koo16t;i@1xKj&Qb^f3b3F?$?Z1Tfd5O2pHH2vOK07@X}B z;>;FZ#Q^G23Ce1U^U9j_6^-A7NSd&Kc{aXAFP&whl<7C9d){0ohqEEu$pbDxZUmT2 zMJbQnbpbD6SRj{yPG!u^+sPN?;elt>s7U__9MHI8SYi1d6w*T$3J;2dxAE9xEISz` z(-5hRRXpuh4iArN5`GjA6z@brd;HH3-T%NL0&b?6L>3<$$QoB zgux?M^|>yLYo+Xl;p;Jxo6S=WBs^5|?rh=$7p>s0HEPILaKD@^4qMY_P==>6bd3C* zs-vERdN>3fJA60Of50R_-kYPL^2`NrjI(X89Niubw@pYe2;6Og8%xgu4(9xS=6O6N zAnN)A&hgvGpd1$;Jakqx1SLdB?pqYNX1Oy0m-))*EL-=WyulU+4YIJQ&4V;N+?k(9 zo@n^O6BN|n>c%u-XUS!fsyD0C7sxSXV@zoPfqZp#p6G)&yXSlK!or4*w@P!IAxFME zbbE?Rq9v*JJ@oRUUOKiEb|P)GfbOQw@=JxHEarvt4czD>OJP=B%;1tr46Ns&*UVE-@54%wS literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e8cb4b6ba4f726d47a2e274f16b6069b9a8041cc GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG z%|CHbgX^da?eHs6`1kLARhjOac zf3;y1Iq~M{LLS3g_M2bU{+PBvomV=FH7$YTy5I%1<5B$=?>3fqI5P%5iajq7)W9SX p;gpazd1JnvZNlx8HB0WjVJ`J~Q+P@%pA+aZ22WQ%mvv4FO#n^cR9FB2 literal 0 HcmV?d00001 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..cef65b3f --- /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 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 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 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..c1b4ad72 --- /dev/null +++ b/examples/copilot-component-react/src/components/Sample.tsx @@ -0,0 +1,157 @@ +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 => { + if (isExpanded) { + await onRequestSizeChange(COMPACT_WIDTH, COMPACT_HEIGHT); + } else { + await onRequestSizeChange(EXPANDED_WIDTH, EXPANDED_HEIGHT); + } + setIsExpanded(!isExpanded); + }, [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/teams/sample-agent.zip b/examples/copilot-component-react/teams/sample-agent.zip new file mode 100644 index 0000000000000000000000000000000000000000..85fabfc407ec21cf14884709307381ac76befeba GIT binary patch literal 4129 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.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 9f946a0b..a2958054 100644 --- a/rush.json +++ b/rush.json @@ -516,6 +516,12 @@ "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-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..b0b3dd25 --- /dev/null +++ b/templates/copilot-component-react/.gitignore @@ -0,0 +1,33 @@ +# 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 +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 0000000000000000000000000000000000000000..7cdf55b04655810e334cccfe1ac86fd89e625572 GIT binary patch literal 2106 zcmd5;Yc!i#7k(o~qE*DSwAE0w{Y;IDstG#AEd+I`RxfTTQKD{5(6kdJM(YwvdZ9|y zl+Kh;r3|K0lF{iX6JeB~L|luyBvc5A#V)j+3VTQv-hE$_QLMk zv3~~u0K42=F=xQY-gdYOc%B)FhJitq=;{{_06Vp|9n#BBmH_~4!42c!d!u-f?;Y`Y z9ofEo^@0ZP;!6LiK%4ZsD{BU&WA}UV9Np!sz0DVUobYWUdc9M%cXrRCKIidP@%1l8 z4|+ZIw3*!O3Hiyh6tmA<_XdZP(F|jzZ)&66hTP7K{IO%v;CoLQmab<_DVZss`I5|! zbQ9A>Ndc5!u&kL^aba7DP|Vh$rLO>zA>eBC@31IZB4qIOuleVgq{h|$%)FHaE9b2E5S_Xt#`%*kWoC?ST4D8yS*0Y&sA>QZn)( z_F3p;BUu{T)lT#v>O-uK&Wc!;#J@JBak|Ohfi;$Q2i3++mk2{?DM0b=1WASfS+S|7 z=;FJ93k@hxtmf_^%oy&IXDoZv`jkPfmNz$w%GKJZ z%S}z!6vEc3A6YKjnCZDj0}hJK>){r>hig>7(=}%{a89GRU7;Y1#7lVSUZif5-6g#m ziuB&w?vKIph1}69jWXYtgAKG);eOd|Ygq}!P_p{Kr1a(CV>Da%sLb+@3?vA^g;6T{ zH?V53qYER2XV;i$ul}t;<8;A`R_J8u_^HyG|ESY;vAq=?fr}?CKVKJ%dDj#b>4L9M zq|$#lHdtLF#Qat{>#EYj)8@|)QE(@*wz86^h&#E93)97aAA%Bn0^bT%wH%CC1!Fsu zi1s6Ig>#+Zjm7>gL$WqJri!Kl`I93(o^29|tj}}r*u4D+z>}9ewuD+~4AUodP`(&y7Zq>NOlokY> zjUYK|CP=7>b?CnM@(D*koo16t;i@1xKj&Qb^f3b3F?$?Z1Tfd5O2pHH2vOK07@X}B z;>;FZ#Q^G23Ce1U^U9j_6^-A7NSd&Kc{aXAFP&whl<7C9d){0ohqEEu$pbDxZUmT2 zMJbQnbpbD6SRj{yPG!u^+sPN?;elt>s7U__9MHI8SYi1d6w*T$3J;2dxAE9xEISz` z(-5hRRXpuh4iArN5`GjA6z@brd;HH3-T%NL0&b?6L>3<$$QoB zgux?M^|>yLYo+Xl;p;Jxo6S=WBs^5|?rh=$7p>s0HEPILaKD@^4qMY_P==>6bd3C* zs-vERdN>3fJA60Of50R_-kYPL^2`NrjI(X89Niubw@pYe2;6Og8%xgu4(9xS=6O6N zAnN)A&hgvGpd1$;Jakqx1SLdB?pqYNX1Oy0m-))*EL-=WyulU+4YIJQ&4V;N+?k(9 zo@n^O6BN|n>c%u-XUS!fsyD0C7sxSXV@zoPfqZp#p6G)&yXSlK!or4*w@P!IAxFME zbbE?Rq9v*JJ@oRUUOKiEb|P)GfbOQw@=JxHEarvt4czD>OJP=B%;1tr46Ns&*UVE-@54%wS literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e8cb4b6ba4f726d47a2e274f16b6069b9a8041cc GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oVGw3ym^DWND9BhG z%|CHbgX^da?eHs6`1kLARhjOac zf3;y1Iq~M{LLS3g_M2bU{+PBvomV=FH7$YTy5I%1<5B$=?>3fqI5P%5iajq7)W9SX p;gpazd1JnvZNlx8HB0WjVJ`J~Q+P@%pA+aZ22WQ%mvv4FO#n^cR9FB2 literal 0 HcmV?d00001 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..826f2b16 --- /dev/null +++ b/templates/copilot-component-react/src/components/{componentName.pascal}.tsx @@ -0,0 +1,157 @@ +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 => { + if (isExpanded) { + await onRequestSizeChange(COMPACT_WIDTH, COMPACT_HEIGHT); + } else { + await onRequestSizeChange(EXPANDED_WIDTH, EXPANDED_HEIGHT); + } + setIsExpanded(!isExpanded); + }, [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..43c09658 --- /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 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 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 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 26588a71..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,7 +165,7 @@ Object { exports[`Multi-component scaffolding should scaffold webpart-minimal then extension-application-customizer into same directory: stdout 1`] = ` "Adding local template source: -Found 19 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] @@ -184,6 +184,8 @@ Found 19 templates: [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] @@ -240,7 +242,7 @@ targetDir: exports[`Multi-component scaffolding should scaffold webpart-minimal then extension-application-customizer into same directory: stdout 2`] = ` "Adding local template source: -Found 19 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] @@ -259,6 +261,8 @@ Found 19 templates: [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] 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 9d2e67f1..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,7 +2,7 @@ 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 19 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] @@ -21,6 +21,8 @@ Found 19 templates: [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] @@ -79,7 +81,7 @@ 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 19 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] @@ -98,6 +100,8 @@ Found 19 templates: [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] @@ -156,7 +160,7 @@ 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 19 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] @@ -175,6 +179,8 @@ Found 19 templates: [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] @@ -233,7 +239,7 @@ 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 19 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] @@ -252,6 +258,8 @@ Found 19 templates: [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] @@ -310,7 +318,7 @@ 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 19 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] @@ -329,6 +337,8 @@ Found 19 templates: [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] @@ -387,7 +397,7 @@ 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 19 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] @@ -406,6 +416,8 @@ Found 19 templates: [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] @@ -459,7 +471,7 @@ targetDir: 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 19 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] @@ -478,6 +490,8 @@ Found 19 templates: [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] @@ -537,9 +551,88 @@ targetDir: " `; +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 19 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] @@ -558,6 +651,8 @@ Found 19 templates: [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] @@ -613,7 +708,7 @@ 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 19 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] @@ -632,6 +727,8 @@ Found 19 templates: [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] @@ -687,7 +784,7 @@ 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 19 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] @@ -706,6 +803,8 @@ Found 19 templates: [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] @@ -761,7 +860,7 @@ 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 19 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] @@ -780,6 +879,8 @@ Found 19 templates: [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] @@ -836,7 +937,7 @@ 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 19 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] @@ -855,6 +956,8 @@ Found 19 templates: [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] @@ -909,7 +1012,7 @@ 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 19 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] @@ -928,6 +1031,8 @@ Found 19 templates: [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] @@ -981,7 +1086,7 @@ 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 19 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] @@ -1000,6 +1105,8 @@ Found 19 templates: [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] @@ -1057,7 +1164,7 @@ 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 19 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] @@ -1076,6 +1183,8 @@ Found 19 templates: [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] @@ -1131,7 +1240,7 @@ targetDir: exports[`SPFx Template Scaffolding Template scaffolding and comparison should scaffold library template and match example output: stdout 1`] = ` "Adding local template source: -Found 19 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] @@ -1150,6 +1259,8 @@ Found 19 templates: [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] @@ -1222,7 +1333,7 @@ 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 19 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] @@ -1241,6 +1352,8 @@ Found 19 templates: [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] @@ -1297,7 +1410,7 @@ 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 19 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] @@ -1316,6 +1429,8 @@ Found 19 templates: [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] @@ -1375,7 +1490,7 @@ 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 19 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] @@ -1394,6 +1509,8 @@ Found 19 templates: [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] diff --git a/tests/spfx-template-test/src/tests/templates.test.ts b/tests/spfx-template-test/src/tests/templates.test.ts index eba41757..ce449c2b 100644 --- a/tests/spfx-template-test/src/tests/templates.test.ts +++ b/tests/spfx-template-test/src/tests/templates.test.ts @@ -207,6 +207,15 @@ const TEMPLATE_CONFIGS: ITemplateConfig[] = [ 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' } ]; From a8524eb7d4f89edf2b667461af9cb61b1940e9d3 Mon Sep 17 00:00:00 2001 From: Santiago Valencia Sanchez Date: Fri, 31 Jul 2026 14:50:31 +0000 Subject: [PATCH 6/9] Ignore copilot-agent build output (teams/*-agent.zip) The copilot-agent Heft plugin emits teams/-agent.zip during build. These are build artifacts, not part of the scaffold, so add teams/ to the copilot template .gitignore and untrack the accidentally-committed zips. --- examples/copilot-component-minimal/.gitignore | 1 + .../teams/minimal-agent.zip | Bin 4125 -> 0 bytes .../copilot-component-noframework/.gitignore | 1 + .../teams/noframework-agent.zip | Bin 4151 -> 0 bytes examples/copilot-component-react/.gitignore | 1 + .../teams/sample-agent.zip | Bin 4129 -> 0 bytes templates/copilot-component-minimal/.gitignore | 1 + .../copilot-component-noframework/.gitignore | 1 + templates/copilot-component-react/.gitignore | 1 + 9 files changed, 6 insertions(+) delete mode 100644 examples/copilot-component-minimal/teams/minimal-agent.zip delete mode 100644 examples/copilot-component-noframework/teams/noframework-agent.zip delete mode 100644 examples/copilot-component-react/teams/sample-agent.zip diff --git a/examples/copilot-component-minimal/.gitignore b/examples/copilot-component-minimal/.gitignore index b0b3dd25..56bc0edb 100644 --- a/examples/copilot-component-minimal/.gitignore +++ b/examples/copilot-component-minimal/.gitignore @@ -15,6 +15,7 @@ lib-esm jest-output release solution +teams temp *.sppkg .heft diff --git a/examples/copilot-component-minimal/teams/minimal-agent.zip b/examples/copilot-component-minimal/teams/minimal-agent.zip deleted file mode 100644 index 89477012a7703995ba00ae4aa461f2696114911e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4125 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 diff --git a/examples/copilot-component-react/.gitignore b/examples/copilot-component-react/.gitignore index b0b3dd25..56bc0edb 100644 --- a/examples/copilot-component-react/.gitignore +++ b/examples/copilot-component-react/.gitignore @@ -15,6 +15,7 @@ lib-esm jest-output release solution +teams temp *.sppkg .heft diff --git a/examples/copilot-component-react/teams/sample-agent.zip b/examples/copilot-component-react/teams/sample-agent.zip deleted file mode 100644 index 85fabfc407ec21cf14884709307381ac76befeba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4129 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 Date: Fri, 31 Jul 2026 15:23:11 +0000 Subject: [PATCH 7/9] Address PR review comments - Add 'override' keyword to overridden lifecycle hooks (render/onInit/onTeardown) across the minimal, noframework, and react copilot components (CLAUDE.md convention) - react handleResize: compute the next expanded state once and use it for both the resize request and setState, avoiding divergence on re-entry - spfx-cli README: list copilot-component-noframework and copilot-component-react in the Copilot Components table - Regenerate the three examples from the updated templates --- apps/spfx-cli/README.md | 2 ++ .../src/MinimalCopilotComponent.ts | 2 +- .../src/NoFrameworkCopilotComponent.ts | 2 +- .../src/SampleCopilotComponent.tsx | 6 +++--- .../copilot-component-react/src/components/Sample.tsx | 9 +++++---- .../src/{componentName.pascal}CopilotComponent.ts | 2 +- .../src/{componentName.pascal}CopilotComponent.ts | 2 +- .../src/components/{componentName.pascal}.tsx | 9 +++++---- .../src/{componentName.pascal}CopilotComponent.tsx | 6 +++--- 9 files changed, 22 insertions(+), 18 deletions(-) diff --git a/apps/spfx-cli/README.md b/apps/spfx-cli/README.md index 9d5883dd..78eb4ca6 100644 --- a/apps/spfx-cli/README.md +++ b/apps/spfx-cli/README.md @@ -147,6 +147,8 @@ Templates are fetched at runtime from the [SharePoint/spfx](https://github.com/S | 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 diff --git a/examples/copilot-component-minimal/src/MinimalCopilotComponent.ts b/examples/copilot-component-minimal/src/MinimalCopilotComponent.ts index 83c77202..2c3da1d6 100644 --- a/examples/copilot-component-minimal/src/MinimalCopilotComponent.ts +++ b/examples/copilot-component-minimal/src/MinimalCopilotComponent.ts @@ -3,7 +3,7 @@ import { BaseCopilotComponent } from '@microsoft/sp-copilot-component'; import type { IMinimalCopilotComponentProperties } from './MinimalProperties'; export default class MinimalCopilotComponent extends BaseCopilotComponent { - protected render(): void { + protected override render(): void { this.context.domElement.textContent = this.properties.message; } } diff --git a/examples/copilot-component-noframework/src/NoFrameworkCopilotComponent.ts b/examples/copilot-component-noframework/src/NoFrameworkCopilotComponent.ts index a528d8d0..09cd1d91 100644 --- a/examples/copilot-component-noframework/src/NoFrameworkCopilotComponent.ts +++ b/examples/copilot-component-noframework/src/NoFrameworkCopilotComponent.ts @@ -12,7 +12,7 @@ import * as strings from 'NoFrameworkCopilotComponentStrings'; const EXPAND_ICON: string = '\u26F6'; export default class NoFrameworkCopilotComponent extends BaseCopilotComponent { - protected render(): void { + 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; diff --git a/examples/copilot-component-react/src/SampleCopilotComponent.tsx b/examples/copilot-component-react/src/SampleCopilotComponent.tsx index cef65b3f..cc5d1507 100644 --- a/examples/copilot-component-react/src/SampleCopilotComponent.tsx +++ b/examples/copilot-component-react/src/SampleCopilotComponent.tsx @@ -29,7 +29,7 @@ export default class SampleCopilotComponent extends BaseCopilotComponent { + protected override async onInit(): Promise { this._siteUrl = this.context.pageContext.web.absoluteUrl; // Fetch user info from Microsoft Graph (brokered SSO — no token code needed). @@ -56,7 +56,7 @@ export default class SampleCopilotComponent extends BaseCopilotComponent { + protected override async onTeardown(): Promise { ReactDOM.unmountComponentAtNode(this.context.domElement); } } diff --git a/examples/copilot-component-react/src/components/Sample.tsx b/examples/copilot-component-react/src/components/Sample.tsx index c1b4ad72..6fb427ba 100644 --- a/examples/copilot-component-react/src/components/Sample.tsx +++ b/examples/copilot-component-react/src/components/Sample.tsx @@ -101,12 +101,13 @@ export default function Sample(props: ISampleProps): React.ReactElement { // Toggle between compact and expanded sizes by requesting a resize from the host. const handleResize = React.useCallback(async (): Promise => { - if (isExpanded) { - await onRequestSizeChange(COMPACT_WIDTH, COMPACT_HEIGHT); - } else { + const nextExpanded: boolean = !isExpanded; + if (nextExpanded) { await onRequestSizeChange(EXPANDED_WIDTH, EXPANDED_HEIGHT); + } else { + await onRequestSizeChange(COMPACT_WIDTH, COMPACT_HEIGHT); } - setIsExpanded(!isExpanded); + setIsExpanded(nextExpanded); }, [onRequestSizeChange, isExpanded]); return ( diff --git a/templates/copilot-component-minimal/src/{componentName.pascal}CopilotComponent.ts b/templates/copilot-component-minimal/src/{componentName.pascal}CopilotComponent.ts index 65ca58f8..b37744bc 100644 --- a/templates/copilot-component-minimal/src/{componentName.pascal}CopilotComponent.ts +++ b/templates/copilot-component-minimal/src/{componentName.pascal}CopilotComponent.ts @@ -3,7 +3,7 @@ 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 render(): void { + protected override render(): void { this.context.domElement.textContent = this.properties.message; } } diff --git a/templates/copilot-component-noframework/src/{componentName.pascal}CopilotComponent.ts b/templates/copilot-component-noframework/src/{componentName.pascal}CopilotComponent.ts index 1dc0b091..bafbb3ea 100644 --- a/templates/copilot-component-noframework/src/{componentName.pascal}CopilotComponent.ts +++ b/templates/copilot-component-noframework/src/{componentName.pascal}CopilotComponent.ts @@ -12,7 +12,7 @@ import * as strings from '<%= componentName.pascal %>CopilotComponentStrings'; const EXPAND_ICON: string = '\u26F6'; export default class <%= componentName.pascal %>CopilotComponent extends BaseCopilotComponentCopilotComponentProperties> { - protected render(): void { + 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; diff --git a/templates/copilot-component-react/src/components/{componentName.pascal}.tsx b/templates/copilot-component-react/src/components/{componentName.pascal}.tsx index 826f2b16..53a0eb2e 100644 --- a/templates/copilot-component-react/src/components/{componentName.pascal}.tsx +++ b/templates/copilot-component-react/src/components/{componentName.pascal}.tsx @@ -101,12 +101,13 @@ export default function <%= componentName.pascal %>(props: I<%= componentName.pa // Toggle between compact and expanded sizes by requesting a resize from the host. const handleResize = React.useCallback(async (): Promise => { - if (isExpanded) { - await onRequestSizeChange(COMPACT_WIDTH, COMPACT_HEIGHT); - } else { + const nextExpanded: boolean = !isExpanded; + if (nextExpanded) { await onRequestSizeChange(EXPANDED_WIDTH, EXPANDED_HEIGHT); + } else { + await onRequestSizeChange(COMPACT_WIDTH, COMPACT_HEIGHT); } - setIsExpanded(!isExpanded); + setIsExpanded(nextExpanded); }, [onRequestSizeChange, isExpanded]); return ( diff --git a/templates/copilot-component-react/src/{componentName.pascal}CopilotComponent.tsx b/templates/copilot-component-react/src/{componentName.pascal}CopilotComponent.tsx index 43c09658..4d3766b6 100644 --- a/templates/copilot-component-react/src/{componentName.pascal}CopilotComponent.tsx +++ b/templates/copilot-component-react/src/{componentName.pascal}CopilotComponent.tsx @@ -29,7 +29,7 @@ export default class <%= componentName.pascal %>CopilotComponent extends BaseCop private _siteTitle: string = ''; private _siteUrl: string = ''; - protected async onInit(): Promise { + protected override async onInit(): Promise { this._siteUrl = this.context.pageContext.web.absoluteUrl; // Fetch user info from Microsoft Graph (brokered SSO — no token code needed). @@ -56,7 +56,7 @@ export default class <%= componentName.pascal %>CopilotComponent extends BaseCop } } - protected render(): void { + protected override render(): void { const props: I<%= componentName.pascal %>Props = { message: this.properties.message, userDisplayName: this._userDisplayName, @@ -77,7 +77,7 @@ export default class <%= componentName.pascal %>CopilotComponent extends BaseCop ReactDOM.render(React.createElement(<%= componentName.pascal %>, props), this.context.domElement); } - protected async onTeardown(): Promise { + protected override async onTeardown(): Promise { ReactDOM.unmountComponentAtNode(this.context.domElement); } } From a879372adc1d9d0a2772d459a25119a00c21a22c Mon Sep 17 00:00:00 2001 From: Santiago Valencia Sanchez Date: Sat, 1 Aug 2026 00:31:05 +0000 Subject: [PATCH 8/9] Fix invisible Mode badge in light mode (copilot-component-react) The host-context 'Mode' badge used Fluent UI v9 color="subtle", which renders near-invisible low-contrast text in light theme. Switch it to color="important" (high-contrast and theme-neutral, visible in both light and dark). Pre-existing issue carried over from the odsp reference; fixed in the new spfx template and regenerated the example. --- examples/copilot-component-react/src/components/Sample.tsx | 2 +- .../src/components/{componentName.pascal}.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/copilot-component-react/src/components/Sample.tsx b/examples/copilot-component-react/src/components/Sample.tsx index 6fb427ba..558e00c4 100644 --- a/examples/copilot-component-react/src/components/Sample.tsx +++ b/examples/copilot-component-react/src/components/Sample.tsx @@ -131,7 +131,7 @@ export default function Sample(props: ISampleProps): React.ReactElement { {strings.ThemeBadgePrefix} {hostContext.theme || strings.UnknownTheme} - + {strings.ModeBadgePrefix} {hostContext.displayMode || strings.DefaultDisplayMode} diff --git a/templates/copilot-component-react/src/components/{componentName.pascal}.tsx b/templates/copilot-component-react/src/components/{componentName.pascal}.tsx index 53a0eb2e..a97d997c 100644 --- a/templates/copilot-component-react/src/components/{componentName.pascal}.tsx +++ b/templates/copilot-component-react/src/components/{componentName.pascal}.tsx @@ -131,7 +131,7 @@ export default function <%= componentName.pascal %>(props: I<%= componentName.pa {strings.ThemeBadgePrefix} {hostContext.theme || strings.UnknownTheme} - + {strings.ModeBadgePrefix} {hostContext.displayMode || strings.DefaultDisplayMode} From c5e6f65afe629d36c40d17b7b234203b2d30e951 Mon Sep 17 00:00:00 2001 From: Santiago Valencia Sanchez Date: Thu, 6 Aug 2026 15:34:04 +0000 Subject: [PATCH 9/9] Align copilot non-React ESLint configs with webpart baseline Restore the @rushstack/pair-react-dom-render-unmount rule and the standardized rule commentary to the minimal and noframework copilot component templates (and their examples) so they match the canonical non-React template baseline (webpart-minimal/webpart-noframework). Addresses PR review feedback. --- .../copilot-component-minimal/.eslintrc.js | 170 ++++++++++++++++++ .../.eslintrc.js | 170 ++++++++++++++++++ .../copilot-component-minimal/.eslintrc.js | 170 ++++++++++++++++++ .../.eslintrc.js | 170 ++++++++++++++++++ 4 files changed, 680 insertions(+) diff --git a/examples/copilot-component-minimal/.eslintrc.js b/examples/copilot-component-minimal/.eslintrc.js index 7eecfadb..7a2d62ef 100644 --- a/examples/copilot-component-minimal/.eslintrc.js +++ b/examples/copilot-component-minimal/.eslintrc.js @@ -12,11 +12,24 @@ module.exports = { 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, { @@ -25,12 +38,41 @@ module.exports = { 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, { @@ -38,14 +80,31 @@ module.exports = { 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, { @@ -56,89 +115,200 @@ module.exports = { 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' ], diff --git a/examples/copilot-component-noframework/.eslintrc.js b/examples/copilot-component-noframework/.eslintrc.js index 7eecfadb..7a2d62ef 100644 --- a/examples/copilot-component-noframework/.eslintrc.js +++ b/examples/copilot-component-noframework/.eslintrc.js @@ -12,11 +12,24 @@ module.exports = { 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, { @@ -25,12 +38,41 @@ module.exports = { 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, { @@ -38,14 +80,31 @@ module.exports = { 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, { @@ -56,89 +115,200 @@ module.exports = { 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' ], diff --git a/templates/copilot-component-minimal/.eslintrc.js b/templates/copilot-component-minimal/.eslintrc.js index 7eecfadb..7a2d62ef 100644 --- a/templates/copilot-component-minimal/.eslintrc.js +++ b/templates/copilot-component-minimal/.eslintrc.js @@ -12,11 +12,24 @@ module.exports = { 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, { @@ -25,12 +38,41 @@ module.exports = { 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, { @@ -38,14 +80,31 @@ module.exports = { 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, { @@ -56,89 +115,200 @@ module.exports = { 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' ], diff --git a/templates/copilot-component-noframework/.eslintrc.js b/templates/copilot-component-noframework/.eslintrc.js index 7eecfadb..7a2d62ef 100644 --- a/templates/copilot-component-noframework/.eslintrc.js +++ b/templates/copilot-component-noframework/.eslintrc.js @@ -12,11 +12,24 @@ module.exports = { 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, { @@ -25,12 +38,41 @@ module.exports = { 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, { @@ -38,14 +80,31 @@ module.exports = { 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, { @@ -56,89 +115,200 @@ module.exports = { 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' ],