From b6fd6f9d639ba23c34299742029fd03d5ba66117 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 6 Oct 2024 01:47:10 +0200 Subject: [PATCH 1/5] Sample data update (#314) Automated check and update of SPFx extensions and webparts samples data and aces sample data. Co-authored-by: Adam-it --- data/sp-dev-fx-samples.json | 75 +++++++++++++++++++++++++++++++++++-- 1 file changed, 72 insertions(+), 3 deletions(-) diff --git a/data/sp-dev-fx-samples.json b/data/sp-dev-fx-samples.json index 00df3d3..0d78cca 100644 --- a/data/sp-dev-fx-samples.json +++ b/data/sp-dev-fx-samples.json @@ -4790,6 +4790,52 @@ "sampleGalerry": "sp-dev-fx-webparts", "sampleType": "samples" }, + { + "name": "pnp-sp-dev-spfx-web-parts-react-employees-onboarding", + "title": "Employee Onboarding", + "url": "https://github.com/pnp/sp-dev-fx-webparts/tree/main/samples/react-employees-onboarding", + "description": "This project is an SPFx (SharePoint Framework) application designed for employee onboarding.", + "image": "https://github.com/pnp/sp-dev-fx-webparts/raw/main/samples/react-employees-onboarding/assets/D:\\GitHub\\pnp\\sp-dev-fx-webparts\\samples\\react-employees-onboarding\\assets\\demo1.png", + "authors": [ + { + "name": "Ejaz Hussain", + "pictureUrl": "https://github.com/ejazhussain.png" + } + ], + "tags": [ + "SharePoint" + ], + "createDate": "2024-09-01", + "updateDate": "2024-09-01", + "version": "1.19.0", + "componentType": "webpart", + "extensionType": null, + "sampleGalerry": "sp-dev-fx-webparts", + "sampleType": "samples" + }, + { + "name": "pnp-sp-dev-spfx-web-parts-react-enhanced-button", + "title": "Enhanced Button", + "url": "https://github.com/pnp/sp-dev-fx-webparts/tree/main/samples/react-enhanced-button", + "description": "Extends the functionality of the native button web part.", + "image": "https://github.com/pnp/sp-dev-fx-webparts/raw/main/samples/react-enhanced-button/assets/app.jpeg", + "authors": [ + { + "name": "Ari Gunawan", + "pictureUrl": "https://github.com/AriGunawan.png" + } + ], + "tags": [ + "SharePoint" + ], + "createDate": "2024-09-01", + "updateDate": "2024-09-01", + "version": "1.19.0", + "componentType": "webpart", + "extensionType": null, + "sampleGalerry": "sp-dev-fx-webparts", + "sampleType": "samples" + }, { "name": "pnp-sp-dev-spfx-web-parts-react-enhanced-list-formatting", "title": "Enhanced List Formatting Web Part", @@ -5595,8 +5641,8 @@ "SharePoint" ], "createDate": "2020-11-06", - "updateDate": "2020-11-06", - "version": "1.9.1", + "updateDate": "2024-09-12", + "version": "1.19.0", "componentType": "webpart", "extensionType": null, "sampleGalerry": "sp-dev-fx-webparts", @@ -8519,7 +8565,7 @@ "Microsoft Teams" ], "createDate": "2022-09-26", - "updateDate": "2022-11-12", + "updateDate": "2024-09-13", "version": "1.15.2", "componentType": "webpart", "extensionType": null, @@ -9708,6 +9754,29 @@ "sampleGalerry": "sp-dev-fx-webparts", "sampleType": "samples" }, + { + "name": "pnp-sp-dev-spfx-web-parts-react-training-checklist", + "title": "Training Checklist", + "url": "https://github.com/pnp/sp-dev-fx-webparts/tree/main/samples/react-training-checklist", + "description": "YSample web part to display a training checklist in a SharePoint page.", + "image": "https://github.com/pnp/sp-dev-fx-webparts/raw/main/samples/react-training-checklist/assets/trainingchecklist.png", + "authors": [ + { + "name": "Valeras Narbutas", + "pictureUrl": "https://github.com/ValerasNarbutas.png" + } + ], + "tags": [ + "SharePoint" + ], + "createDate": "2024-09-12", + "updateDate": "2024-09-12", + "version": "1.20.0-beta.0", + "componentType": "webpart", + "extensionType": null, + "sampleGalerry": "sp-dev-fx-webparts", + "sampleType": "samples" + }, { "name": "pnp-sp-dev-spfx-web-parts-react-twitter", "title": "Twitter Timeline Web Part", From a766d5edfd32d783467fd03503e3606a1bac52ea Mon Sep 17 00:00:00 2001 From: guidozam Date: Sat, 5 Oct 2024 17:22:29 +0200 Subject: [PATCH 2/5] Added additional settings. --- package.json | 16 ++++ src/constants/ProjectFileContent.ts | 2 + src/constants/WebviewCommand.ts | 10 +++ src/extension.ts | 12 +++ src/models/SpfxScaffoldCommandInput.ts | 3 + src/services/actions/Scaffolder.ts | 64 +++++++++++++++- src/webview/PnPWebview.ts | 9 +++ .../forms/spfxProject/AdditionalStep.tsx | 73 ++++++++++++++++++- .../spfxProject/ScaffoldSpfxProjectView.tsx | 13 +++- 9 files changed, 198 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 8e70f12..90defc8 100644 --- a/package.json +++ b/package.json @@ -186,6 +186,22 @@ "type": "boolean", "default": true, "description": "Show the tenant-wide extensions in the account view." + }, + "spfx-toolkit.createNodeVersionFileDefaultValue": { + "title": "Default value for the Node version file option", + "type": "boolean", + "default": "false", + "description": "The default value for the new project's setting for creating the Node version file. If checked the default selected value will be YES." + }, + "spfx-toolkit.nodeVersionManagerFile": { + "title": "Node version manager file to be used", + "type": "string", + "default": ".nvmrc", + "enum": [ + ".nvmrc", + ".node-version" + ], + "description": "The file to be used to store the Node version for the selected Node version manager. Remember that the .node-version file is supported only while using nvs." } } }, diff --git a/src/constants/ProjectFileContent.ts b/src/constants/ProjectFileContent.ts index ba5a945..f0afe46 100644 --- a/src/constants/ProjectFileContent.ts +++ b/src/constants/ProjectFileContent.ts @@ -5,4 +5,6 @@ export enum ProjectFileContent { installReusablePropertyPaneControls = 'install-spfx-property-controls', installReusableReactControls = 'install-spfx-controls-react', installPnPJs = 'install-pnpjs', + createNVMRCFile = 'create-nvmrc-file', + createNodeVersionFile = 'create-node-version-file', } \ No newline at end of file diff --git a/src/constants/WebviewCommand.ts b/src/constants/WebviewCommand.ts index af04b04..81596a5 100644 --- a/src/constants/WebviewCommand.ts +++ b/src/constants/WebviewCommand.ts @@ -5,6 +5,11 @@ export const WebviewCommand = { folderPath: 'folder-path', validateSolutionName: 'validate-solution-name', validateComponentName: 'validate-component-name', + createNodeVersionFileDefaultValue: 'should-create-node-version-file', + nodeVersionManager: 'node-version-manager', + nodeVersionManagerFile: 'node-version-manager-file', + createNVMRCFile: 'create-nvmrc-file', + createNodeVersionManagerFile: 'node-version-manager-file', }, toVSCode: { useSample: 'use-sample', @@ -17,5 +22,10 @@ export const WebviewCommand = { validateComponentName: 'validate-component-name', addSpfxComponent: 'add-spfx-component', createAppReg: 'create-app-reg', + createNodeVersionFileDefaultValue: 'should-create-node-version-file', + nodeVersionManager: 'node-version-manager', + nodeVersionManagerFile: 'node-version-manager-file', + createNVMRCFile: 'create-nvmrc-file', + createNodeVersionManagerFile: 'node-version-manager-file', } }; \ No newline at end of file diff --git a/src/extension.ts b/src/extension.ts index bbcfc94..f963013 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -63,6 +63,18 @@ export async function activate(context: vscode.ExtensionContext) { if (fileContents.indexOf(ProjectFileContent.installPnPJs) > -1) { await TerminalCommandExecuter.runCommand('npm install @pnp/sp @pnp/graph --save', [], terminalTitle, terminalIcon); } + + // If either of the following strings are found in the project file, run the command to get the node version + if (fileContents.indexOf(ProjectFileContent.createNVMRCFile) > -1 || fileContents.indexOf(ProjectFileContent.createNodeVersionFile) > -1) { + let nodeVersionCommand = 'node --version > '; + if (fileContents.indexOf(ProjectFileContent.createNVMRCFile) > -1) { + nodeVersionCommand += '.nvmrc'; + } + else if (fileContents.indexOf(ProjectFileContent.createNodeVersionFile) > -1) { + nodeVersionCommand += '.node-version'; + } + await TerminalCommandExecuter.runCommand(nodeVersionCommand, [], 'Creating Node version configuration file'); + } } } }); diff --git a/src/models/SpfxScaffoldCommandInput.ts b/src/models/SpfxScaffoldCommandInput.ts index 3e15091..8ed4bb5 100644 --- a/src/models/SpfxScaffoldCommandInput.ts +++ b/src/models/SpfxScaffoldCommandInput.ts @@ -8,4 +8,7 @@ export interface SpfxScaffoldCommandInput extends SpfxAddComponentCommandInput { shouldInstallReusablePropertyPaneControls: boolean; shouldInstallReusableReactControls: boolean; shouldInstallPnPJs: boolean; + shouldCreateNodeVersionFile: boolean; + nodeVersionManagerFile: '.nvmrc' | '.node-version'; + nodeVersionManager: 'nvm' | 'nvs' | 'none'; } \ No newline at end of file diff --git a/src/services/actions/Scaffolder.ts b/src/services/actions/Scaffolder.ts index 8ee79e1..df7fa7b 100644 --- a/src/services/actions/Scaffolder.ts +++ b/src/services/actions/Scaffolder.ts @@ -11,7 +11,7 @@ import * as glob from 'fast-glob'; import { Extension } from '../dataType/Extension'; import download from 'github-directory-downloader/esm'; import { CliExecuter } from '../executeWrappers/CliCommandExecuter'; -import { getPlatform } from '../../utils'; +import { getExtensionSettings, getPlatform } from '../../utils'; import { PnPWebview } from '../../webview/PnPWebview'; import { Executer } from '../executeWrappers/CommandExecuter'; import { TeamsToolkitIntegration } from '../dataType/TeamsToolkitIntegration'; @@ -147,6 +147,45 @@ export class Scaffolder { PnPWebview.postMessage(WebviewCommand.toWebview.validateComponentName, true); } + /** + * Returns the value of the createNodeVersionFileDefaultValue setting and sends it to the webview. + */ + public static async createNodeVersionFileDefaultValue() { + const value = getExtensionSettings( + 'createNodeVersionFileDefaultValue', + false + ); + + PnPWebview.postMessage( + WebviewCommand.toWebview.createNodeVersionFileDefaultValue, + value + ); + } + + /** + * Returns the value of the nodeVersionManagerFile setting and sends it to the webview. + */ + public static async nodeVersionManagerFile() { + const value = getExtensionSettings('nodeVersionManagerFile', false); + + PnPWebview.postMessage( + WebviewCommand.toWebview.createNodeVersionManagerFile, + value + ); + } + + /** + * Returns the value of the nodeVersionManager setting and sends it to the webview. + */ + public static async nodeVersionManager() { + const value = getExtensionSettings('nodeVersionManager', false); + + PnPWebview.postMessage( + WebviewCommand.toWebview.nodeVersionManager, + value + ); + } + /** * Scaffold method for creating a new project. * @param input - The input for the scaffold command. @@ -225,6 +264,29 @@ export class Scaffolder { content += ` ${ProjectFileContent.installPnPJs}`; } + if (newSolutionInput.shouldCreateNodeVersionFile) { + switch (newSolutionInput.nodeVersionManager) { + case 'nvm': + // If the node version manager is nvm, create the .nvmrc file even if the user has selected .node-version + content += ` ${ProjectFileContent.createNVMRCFile}`; + break; + case 'nvs': + // If the node version manager is nvs, create the file based on the user's settings + switch (newSolutionInput.nodeVersionManagerFile) { + case '.nvmrc': + content += ` ${ProjectFileContent.createNVMRCFile}`; + break; + case '.node-version': + content += ` ${ProjectFileContent.createNodeVersionFile}`; + break; + } + break; + case 'none': + // If the node version manager is none, do not create any file + break; + } + } + Scaffolder.createProjectFileAndOpen(newFolderPath, content); } else { PnPWebview.close(); diff --git a/src/webview/PnPWebview.ts b/src/webview/PnPWebview.ts index f8134cf..408f8c9 100644 --- a/src/webview/PnPWebview.ts +++ b/src/webview/PnPWebview.ts @@ -156,6 +156,15 @@ export class PnPWebview { case WebviewCommand.toVSCode.createAppReg: EntraAppRegistration.createEntraAppRegistration(); break; + case WebviewCommand.toVSCode.createNodeVersionFileDefaultValue: + Scaffolder.createNodeVersionFileDefaultValue(); + break; + case WebviewCommand.toVSCode.nodeVersionManagerFile: + Scaffolder.nodeVersionManagerFile(); + break; + case WebviewCommand.toVSCode.nodeVersionManager: + Scaffolder.nodeVersionManager(); + break; } }); } diff --git a/src/webview/view/components/forms/spfxProject/AdditionalStep.tsx b/src/webview/view/components/forms/spfxProject/AdditionalStep.tsx index 9c001cc..1f8808c 100644 --- a/src/webview/view/components/forms/spfxProject/AdditionalStep.tsx +++ b/src/webview/view/components/forms/spfxProject/AdditionalStep.tsx @@ -2,7 +2,8 @@ import { VSCodeCheckbox } from '@vscode/webview-ui-toolkit/react'; import * as React from 'react'; import { StepHeader } from './StepHeader'; import { PackageSelector } from './PackageSelector'; - +import { WebviewCommand } from '../../../../../constants'; +import { Messenger } from '@estruyf/vscode/dist/client'; interface AdditionalStepProps { shouldRunInit: boolean; @@ -13,6 +14,11 @@ interface AdditionalStepProps { setShouldInstallReusableReactControls: (value: boolean) => void; shouldInstallPnPJs: boolean; setShouldInstallPnPJs: (value: boolean) => void; + shouldCreateNodeVersionFile: boolean; + setShouldCreateNodeVersionFile: (value: boolean) => void; + nodeVersionManager: 'nvm' | 'nvs' | 'none'; + setNodeVersionManager: (value: 'nvm' | 'nvs' | 'none') => void; + setNodeVersionManagerFile: (value: '.nvmrc' | '.node-version') => void; } export const AdditionalStep: React.FunctionComponent = ({ @@ -23,7 +29,64 @@ export const AdditionalStep: React.FunctionComponent = ({ shouldInstallReusableReactControls, setShouldInstallReusableReactControls, shouldInstallPnPJs, - setShouldInstallPnPJs }: React.PropsWithChildren) => { + setShouldInstallPnPJs, + shouldCreateNodeVersionFile, + setShouldCreateNodeVersionFile, + setNodeVersionManagerFile, + nodeVersionManager, + setNodeVersionManager +}: React.PropsWithChildren) => { + // Send a message to retrieve the default value for the create node version file + const getCreateNodeVersionFileDefaultValue = React.useCallback(() => { + Messenger.send(WebviewCommand.toVSCode.createNodeVersionFileDefaultValue, {}); + }, []); + + // Send a message to retrieve the node version manager file + const getNodeVersionManagerFile = React.useCallback(() => { + Messenger.send(WebviewCommand.toVSCode.nodeVersionManagerFile, {}); + }, []); + + // Send a message to retrieve the node version manager + const getNodeVersionManager = React.useCallback(() => { + Messenger.send(WebviewCommand.toVSCode.nodeVersionManager, {}); + }, []); + + // Listen for the response to the message/s + React.useEffect(() => { + const messageListener = (event: MessageEvent) => { + const { command, payload } = event.data; + switch (command) { + case WebviewCommand.toWebview.nodeVersionManager: + setNodeVersionManager(payload); + break; + case WebviewCommand.toWebview.nodeVersionManagerFile: + setNodeVersionManagerFile(payload); + break; + case WebviewCommand.toWebview.createNodeVersionFileDefaultValue: + setShouldCreateNodeVersionFile(payload); + break; + default: + break; + } + }; + + Messenger.listen(messageListener); + + return () => { + Messenger.unlisten(messageListener); + }; + }, [setNodeVersionManager, setNodeVersionManagerFile, setShouldCreateNodeVersionFile]); + + // Sends the requests to load the settings values only once + React.useEffect(() => { + // Get the default value for the create node version file + getCreateNodeVersionFileDefaultValue(); + // Get the node version manager + getNodeVersionManager(); + // Get the node version manager file + getNodeVersionManagerFile(); + }, []); + return (
@@ -50,6 +113,12 @@ export const AdditionalStep: React.FunctionComponent = ({ setValue={setShouldInstallPnPJs} label='Install PnPjs (@pnp/sp, @pnp/graph)' link='https://pnp.github.io/pnpjs/' /> + + {nodeVersionManager !== 'none' && + }
); diff --git a/src/webview/view/components/forms/spfxProject/ScaffoldSpfxProjectView.tsx b/src/webview/view/components/forms/spfxProject/ScaffoldSpfxProjectView.tsx index ea7df72..3d52640 100644 --- a/src/webview/view/components/forms/spfxProject/ScaffoldSpfxProjectView.tsx +++ b/src/webview/view/components/forms/spfxProject/ScaffoldSpfxProjectView.tsx @@ -26,6 +26,9 @@ export const ScaffoldSpfxProjectView: React.FunctionComponent(false); const [shouldInstallReusableReactControls, setShouldInstallReusableReactControls] = useState(false); const [shouldInstallPnPJs, setShouldInstallPnPJs] = useState(false); + const [shouldCreateNodeVersionFile, setShouldCreateNodeVersionFile] = useState(false); + const [nodeVersionManager, setNodeVersionManager] = useState<'nvm' | 'nvs' | 'none'>('nvm'); + const [nodeVersionManagerFile, setNodeVersionManagerFile] = useState<'.nvmrc' | '.node-version'>('.nvmrc'); const location: any = useLocation(); useEffect(() => { @@ -78,7 +81,10 @@ export const ScaffoldSpfxProjectView: React.FunctionComponent } From 1ae06711adc2e8e813b124152763d79867f59859 Mon Sep 17 00:00:00 2001 From: guidozam Date: Sun, 13 Oct 2024 17:58:56 +0200 Subject: [PATCH 3/5] Various fixes --- package.json | 2 +- src/constants/WebviewCommand.ts | 3 --- src/extension.ts | 2 +- src/services/actions/Scaffolder.ts | 12 +++++++----- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 90defc8..64a92f6 100644 --- a/package.json +++ b/package.json @@ -190,7 +190,7 @@ "spfx-toolkit.createNodeVersionFileDefaultValue": { "title": "Default value for the Node version file option", "type": "boolean", - "default": "false", + "default": false, "description": "The default value for the new project's setting for creating the Node version file. If checked the default selected value will be YES." }, "spfx-toolkit.nodeVersionManagerFile": { diff --git a/src/constants/WebviewCommand.ts b/src/constants/WebviewCommand.ts index 81596a5..b685971 100644 --- a/src/constants/WebviewCommand.ts +++ b/src/constants/WebviewCommand.ts @@ -8,7 +8,6 @@ export const WebviewCommand = { createNodeVersionFileDefaultValue: 'should-create-node-version-file', nodeVersionManager: 'node-version-manager', nodeVersionManagerFile: 'node-version-manager-file', - createNVMRCFile: 'create-nvmrc-file', createNodeVersionManagerFile: 'node-version-manager-file', }, toVSCode: { @@ -25,7 +24,5 @@ export const WebviewCommand = { createNodeVersionFileDefaultValue: 'should-create-node-version-file', nodeVersionManager: 'node-version-manager', nodeVersionManagerFile: 'node-version-manager-file', - createNVMRCFile: 'create-nvmrc-file', - createNodeVersionManagerFile: 'node-version-manager-file', } }; \ No newline at end of file diff --git a/src/extension.ts b/src/extension.ts index f963013..b532c01 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -73,7 +73,7 @@ export async function activate(context: vscode.ExtensionContext) { else if (fileContents.indexOf(ProjectFileContent.createNodeVersionFile) > -1) { nodeVersionCommand += '.node-version'; } - await TerminalCommandExecuter.runCommand(nodeVersionCommand, [], 'Creating Node version configuration file'); + await TerminalCommandExecuter.runCommand(nodeVersionCommand, [], terminalTitle, terminalIcon); } } } diff --git a/src/services/actions/Scaffolder.ts b/src/services/actions/Scaffolder.ts index df7fa7b..e4b2bed 100644 --- a/src/services/actions/Scaffolder.ts +++ b/src/services/actions/Scaffolder.ts @@ -166,7 +166,7 @@ export class Scaffolder { * Returns the value of the nodeVersionManagerFile setting and sends it to the webview. */ public static async nodeVersionManagerFile() { - const value = getExtensionSettings('nodeVersionManagerFile', false); + const value = getExtensionSettings('nodeVersionManagerFile', '.nvmrc'); PnPWebview.postMessage( WebviewCommand.toWebview.createNodeVersionManagerFile, @@ -178,7 +178,7 @@ export class Scaffolder { * Returns the value of the nodeVersionManager setting and sends it to the webview. */ public static async nodeVersionManager() { - const value = getExtensionSettings('nodeVersionManager', false); + const value = getExtensionSettings('nodeVersionManager', 'nvm'); PnPWebview.postMessage( WebviewCommand.toWebview.nodeVersionManager, @@ -281,11 +281,13 @@ export class Scaffolder { break; } break; - case 'none': // If the node version manager is none, do not create any file + case 'none': + // By default, do not create any file + default: break; - } - } + } + } Scaffolder.createProjectFileAndOpen(newFolderPath, content); } else { From 02aa7002b68387cbae8af64caf1fbb0edff1fb1e Mon Sep 17 00:00:00 2001 From: guidozam Date: Sun, 13 Oct 2024 18:37:09 +0200 Subject: [PATCH 4/5] Updated README. --- README.md | 16 +++++++++++++++- ...scaffolding-additional-step-node-version.png | Bin 0 -> 28727 bytes ...-node-version-manager-file-default-value.png | Bin 0 -> 11155 bytes .../settings-node-version-manager-file.png | Bin 0 -> 9572 bytes assets/images/settings-node-version-manager.png | Bin 0 -> 8055 bytes 5 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 assets/images/scaffolding-additional-step-node-version.png create mode 100644 assets/images/settings-node-version-manager-file-default-value.png create mode 100644 assets/images/settings-node-version-manager-file.png create mode 100644 assets/images/settings-node-version-manager.png diff --git a/README.md b/README.md index cf37ad6..e984e49 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,10 @@ Install additional dependencies with a single click straight from the scaffoldin ![Additional dependency step](./assets/images/scaffolding-additional-step.png) +When you can set the additional dependencies it's also possible to automatically create the node version manager file with the version of Node.js used when creating the project. These settings are available in the extensiown settings. + +![Additional dependency step node version](./assets/images/scaffolding-additional-step-node-version.png) + [Check out our docs for more details](https://github.com/pnp/vscode-viva/wiki/5.2-Scaffolding#1-scaffold-a-new-spfx-project) ### 6️⃣ Sign in to your tenant & retrieve environment details @@ -272,7 +276,17 @@ Check it out in action 👇 By default, the SharePoint Framework Toolkit will use the Node.js version that is installed on your machine. If you want to use a different version, you can use a Node.js Version Manager such as [nvm](https://github.com/nvm-sh/nvm) or [nvs](https://github.com/jasongin/nvs). The SharePoint Framework Toolkit will detect the preferred version of Node.js if a `.nvmrc` file is present in the root of your project, and will use that version for all the actions. -You can use the settings to change which Node.js version manager you want to use. You may choose between `nvm` and `nvs`. If you wish to avoid using a Node.js version manager, you can set the value to `none` +It's possible to use the settings to change which Node.js version manager you want to use. You may choose between `nvm` and `nvs`. If you wish to avoid using a Node.js version manager, you can set the value to `none` + +![Settings Node version manager](./assets/images/settings-node-version-manager.png) + +Other than selecting the Node.js version manager you may also select which file should be used to store the Node.js version. By default, the extension will use `.nvmrc` file, but you may change it to `.node-version` if you are using `nvs`. + +![Settings Node version file](./assets/images/settings-node-version-manager-file.png) + +It is also possible to set which is the default behavior when you're about to scaffold a new project. To do so there is a specific setting named `Create Node Version File Default Value`. + +![Settings Node version file default value](./assets/images/settings-node-version-manager-file-default-value.png) ### 1️⃣3️⃣ SPFx Toolkit GitHub Chat Participant diff --git a/assets/images/scaffolding-additional-step-node-version.png b/assets/images/scaffolding-additional-step-node-version.png new file mode 100644 index 0000000000000000000000000000000000000000..851384000233e22c702847c2126afbeb5f8eb51c GIT binary patch literal 28727 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

T5c%PL4%w=d2rT! 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 TS{8WNA42Pf-t~8?HWB{^Bu}b{ literal 0 HcmV?d00001 diff --git a/assets/images/settings-node-version-manager-file-default-value.png b/assets/images/settings-node-version-manager-file-default-value.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1ccf79140ae8c18ce222b679ae3e9d9b32c9c0 GIT binary patch literal 11155 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 T(u%r%)k*rTf_RbWd%ynx2BRAM literal 0 HcmV?d00001 diff --git a/assets/images/settings-node-version-manager.png b/assets/images/settings-node-version-manager.png new file mode 100644 index 0000000000000000000000000000000000000000..ac550e8e6e95fffe2457e77c1839df517cc24d32 GIT binary patch literal 8055 zcmd6MX7P3G8A3?myN^f7*9vLqVj^6(QW%OS2!QPDkz-#>0KW8b^ zYS)yJpk!Uy+&%i?{~c2mk=d;g%=+;q+Ht32U>Bmj|xJ(T0`1<7-zX zy*d9ds|lPdFc^$E-h>R}wO`d~eMOY;Yf5u+avCcd`kuWf5{dQPkDnV$j@y-dwiTBz zQHleF*v6dz!19ALe`7%jt3GsGu#2$Uh-=cm=x=Myj&#AR?yH%}p z*ZDPQH5boJ?Ck+1_%%Y$gV}ITyX+J*={nEg+_@YMVTtG~U5Iy8xl~Nm>le6Z+cJOL zPkHa>TBd5|`cfD~PP6w`p+}p9e%ol~qXYoB@pTD^DdMyiZ%WLG4x_z1wd?dgZE30> zb@ngHd-tchmF)Uf0ii_~{3=P|NwumiI~Kpv9vWpaOqK#Le%1yiK;Ssg1kx)+7hG+(&9LXw&~pBb=LDGTP?MMBCi2iiuo1?iXv|(u-&yHg`+axw?uOYl!fgaD*hGDbe9UiHK5x zbaf_;`pKa^m}1195+hiig3(>!ZC11_j3r<=@|z%uRfhw0$?Ydk2ro zZBJ|(iU~Tp1Lek8E^X@*Q5V14WVh;O`OAk~wH)COWSudaIF*w5$QjrKO?$_~FBUTm z%uKR{xEA!m9q&zUGU2ojaEJJK<`ng+f5w4lv`$EUm}bCDAzHYxF^Q{9*vZHA=&JPGxUk%wYGOqipob;Cd6X9UlD~$4z8c zt6pL3TuqQ^aqx8Z`f<;2(I&uPU&Z6Gy(jG6Ay6!+m22Ge(-U9I9ZRQ=^S;||i1772 zEM9OSU4g8Bmrp);&dki~5%Eu(`NbNfg?Ic0H&E%yhswDpemYSUukYD-=grBh(GL`# zf!BVd+kbs=#QI;|vcZZE7-NOwirP*qtt*qz5MFxG`q7kU&lDIz^hW_;+nm9upi04r zXFwlNaK0IuO&j_f=j~T+!}W0{m%*;7I+5r+0Ry2dI^A30i560e#$Uv;zc2pewCPS9 z-0Kg?w^3EpC$=0)Q9t{tMBcvSOP+$AkYN#ots)MgsR6kr@h5F38xHMQHnQw(k3yE$ z!gTrknyb-^;8!Ky;8y~~mxPCbReGSy$~ked?@p5KPXyTM{j_H!e4*FS`XzZX*#}bt zh2LE1ua}I*YU@)mH99*u*>*_fs@Il*7Z?*|QT9e@OBaDPIl9ntNC>ITpfSNx1#-5a zL|s)|67!Qam6`ggpA^YQMID7Z5{NVHcY||EK)qWWmHk!0Bkx~$rZb;|6TFMq|HOzL z=pTYl+k)~hb&MEoV#PzEPS1w~KO6>G3~zb7^I6G`5x!AJ4G>$gL?=r8J!@=B%L`Pm zlZ4Dz##=>yDC{@d@HhaV*;et`?TcsU1R+|v&0c3Bj4zLNi*Y}4YFV9H% z{wQL;bpOeZX5wWka~O)yviOy$1^st0r0qlcK20khXtXn8 zV)1LkR|3O-;?e~KyA8KB&nTEH)YVVzh@*xnUrJrtA0&?jE!ta#rB zO}AO07#f1z5^ACbuS9z;u%IJBgv7C3$5mlgTcImY2oy8#i`%h^q7K{nUyL(R0aG$_ zNo6$HuEH#%eJ0eH{`U|GML;Z&9U7!AwLswq2GyhI6G~#&HxbgbH8r%XA<6U97nl(R z$3p`2PeWsT!#>8EZlxXpud`#(c!5)|ZXYL|$@LX>in=U-SnZRW03R*{@A0?V;7}Cw z`Y}c!0Cg|cFwV;=uK(aMVr5&F(&Uz0B&qXI8v3nJQ+zN#%dbRIDpE z(XH5_GPd4qYxghzMR;6Zr8~ZWvmVO8V_Zwo{MIjOUUE13?$anGCoXL-t8@2p=G~24 z8L{`&<(_ph=5{nCdpjE1;Gc?c9CLIe zA{PafPtZERdt0Y)Wg_BfH^{zZtdtJg1FcVE&v%57!(W*zZwwHDeFfU65T`Mzz76}UPA~5BUeF&#w zvAI#Vf_wnsc{oAdaz_F6w{XNrNPI|JII>`(1<;RkNTH1MUv+b-~^ zfZSX}I^j9gq`@<#JXuc6FXhEUre(S zo$>3qmDeRYW4Ugw(n5srCqAGh*)TV5T%cX>&lcP5SRg~wW@o@+3z0_7^5>Y}EBD=j zecBs$?+SzIxU~=^7@HOuO~oS<^7MuIZgT!`=?qBP*vO~=h{llvejos~9*{?>1QX>= zmmLHfKCl@L1L&mCQr*huK}8*TEP1e<9PcqGp|R|0QF7&A^_J1h-+`OqKF*783iqu} z=3HW3QIBb!`S3o6${f7(&)FS2?cbG;?0o;3t@<@dwLRaBRwKPuSp&hSeu?VaQr&HY zxa!y>RXFtFPL<30_F-O1E&lP#f48I-(lZS?_#;|>WB-8x;j!@3DTSR;W=4ckSU3S@4~SpmkK0Y>k(SrgSzI zZ_KrLV}T(-gTJ$BF5X(|W!Fb>V9d6ZFfcII(8c-uuVtqHhgFuh)V*LStD$Hg z{`sl6rGDjRa6j);bE5tIZ#>@(fXZjOz?*>v1FOgL{;86d zM0u(Z5vTjKXCIyc09+55?)TpyLq@0nXVKCxx#iBi_V36bw25bP#Hs4$!wDkBREaE9 z2cv#}J`v_LELtKJahh4x5sRa>jX|^maJ2RWS}JCKYkOEZ>|MAp)r6eSrFnO8XUNH1 zF|SBEj)X6c=~kw%%i?BDi4`iKC6vI%*9THdmSw;2E?V$K(jb39j$+!tzlsP6sk)t7 zn%9g|ZdKIRww_>+u4}$-U7O1bqbc&fUe(b$Wv&6JOesPM+&pj#{rTt8@iIu@Kc7-V z3X)KQNL~6>-;E;&s7YHuG<*#ZC>Rm&3*$ zD?zTyg2gfFKQn&AM|<7xJW)0h56b)jLc*H$_*E;s8{1ov5Pkj3H zX+33AF>-v$rVP2yqg(*hW#NEE_o6D*{n^^K>sBgZZ8b$+>evdOsPOQ*?BlzawD+K0q+Yfm^-utDgh4B>j0_+cfoT%Bt;V ze~Roxd37Jvr;-}j@daiV#)SK-Zd7Lmx4MGF>+=wuo?k2zhFy9im|rdj0ee9~qQQ~9 z{(x zBl1nZjdAZoLh4icvIG?5?9~J0QSC}=sW2RgTI}Mv=+G3&8hG-9LX69V1T$8_eu|iy ze^5NtEz}<_l?Z&{s|$(lY4%yymb($9pGzhb=M;3@A~yISu|q8CW8 z9#vZeyOa#a3FApDk%#weYB@A^*bZ%?lM0wM^;xkX$DCVg=4DUV=kt^PAF9APT2bz@2e8K5|?wInxcLvdQxR#x?;$^Pxn% zNMYXqMHqX5A3G({W-P-OJ3i6Bv-)r@a7s!dZC2DPxCU80A)p9*5PLWIE>dFF{bn${ z0lGgq9cbuR@oFzaJHaiaQh=7M&1*EgQ3duSco^6@lhhtUIE}qM9~{aJ-OZCJnP1W8 zqO>(GB-7v8A9E0C{Z(PwFdj~Mdv7eIz3M@!j<;W6j`YHYJ|EmcodWu|j&gn_`!;HN z9$XpXZCB%-t_$U7mCK*B=iQ3`6Y!T6!>AflOZ*(4z2bY7_Vy zjwR{itd$?u2|D@4N}#`NswnDDPBAXB)1o&KYEeD(h4KQkp{HyR`f-;zbJJTjbPH59 ztI}4_JZGHB^%Dn#vz5Km=)0B*|CKM4WMd?aMQSw(q3ik@mhh+YH@m`-^5$#!%#`Tu zvINJe6R9byW^M~)gjPn+%6aejyrIoF7xH)MR_^>m($!$!J6Jzr{`-IVnOY67>j2Mf zK&+WZ&~~wPOa{us*`pBHw%`KtVz=<`gEOg>GA|glP4T$b=uxkG%N>P41$@D0(SJhpPphx|PId z2z$|>|C=_RUnM+hMUyyfSSv2j^aH6`wp=2Mk@unXHHk*j$RC^XA#*XMns$s2F6$lb z6dXi*ASJyuLb4j=20o_kC^AS8fX~A!`3b#Z21)WBhGWkdw}#JnDp^#Pxu?p{7?V*k zO9svwhmA&%=0OEr7DzvV*l3KiBOG9h!}h@4$8qT1By$Afnn>?I5DP}QL{ zv)%>m5RM0JK*h&!Q2rXnLa7T#>;yVwB)^p!_plMlS9jcOxZBJXjp=|Lk8RJunF@S3 zZ;Sp&Q@!J!76mtw40BeRYiUe-3a^6`GF*oH$Ms^Hp5GGJh<)RF7PxTDV1&us`$BK- z{Kp^t69=ZMU8C2{P6!fj!yQ$tNU%7{!jt*9>ca7}R$)~zag(2O=pqofw@Ky-K>ms$ z;Rv`0c3q7-&7?Sso6klXUu2X}&(3!?5GbpIw|xsV_WP&sv*fQdv70~3gtjzfIFoix zSz=dc;#TFdUquIniESo&K-J0Pu4-KEx)F?;pP#i8g^O|=mW;b%9-Wp2&n>^uCcFHV zZv;LRo=F;u2_5Q^h4kX*KPH`1r{%n-jE0M# z{*i0I01qXSGRRpx(!_VZ$Vq)m|4!j38Pg<`zp)h%Vq#vg-V-0);lO#f?Hea1>oV(R zyR)u2+n;C>T+P78O0vbSW$}roeQEfx>#_7<9V{FP=Vt0p7FYxrIZ?a~^ z7n*MHA#Dlw8>R894?ZMh=C?;&McE#IB;$vm4|iUyQo8@ggD^E&jG!pC=$kP8`u89c z=|3ZPX&Ly@`&Wo6TF-HR^SxEE@9V)8$>CchbEm?Lz$sO^d^_ccYv+uQv-1ci=jr`~NKER5^N+PHsHe8_E+$0+kUeWw~)aWi{EZN5hlT_3G{jr{~B zT&S$Ui_LoEY+1?Uqut<)COu_S11G;0r_?2p-J$xt_pgc#-3Ty;A!7!lp{7aPsQ?QnMa;my};e~ZsK3jo>ln>=qM ze2}}Q8;p!VjnPY}n-Uf}TsiKp>AD(G*S^XVTbm~^|0*9W-oTsf{Jp1y2qJ03Q zD8jhJZuW9WsjzY}+otsSEtt$V`mJ|1j4V7MA0Us>*_01@X^<@wGRqE*tF~{(9Wyel z9S{pgz4nszst0J)z#73i|!6g#F zFW~Y<*6(T@5x8xC>gNlFt-04MffL76N4q5sCl?Hy3x(Q~XZ{F0 zqfXNQpORkWAja+%BR{QNKEU{+<|_Wj`lC}=NVo&3+g|5`dGPGd+gg)+ezj0H4tEk5 z9DGQ5rvpT((^$@U=&CIF6+|Jp_A(cOXv?%O3lZ6A$kXii#rUVSvClXN=z#5J9! zhPwOBj{Am|%9{&E2Fyf@ZwbWzSXMS-vBgJ_{3c6c-u^Y9SHWF8@VXnzV9WvTh0Av7 zoZHlW4j%ke7mA3o(@Wwj%?Iqcwc%#$|11=fRl;QDmO>f6k^zx8rVKyt(D9O$6{czY z_rXckYJlh11s`Y9E4u_s#1Y|zaC|+%F>i)!YM;>m~-IKKekjeJVGLOqS?_43Mu&l!OFIL)%5HzlCxYe|e#nppk0hEp5wgpOUhd*1{I(D)IO`&o|e{9L?5p7aQR zo^e_xBbU<29as#wiq}5jO5nN2ir<>Ie0WB{0zSO7cx@^o*Ds|~lt7$W%K zwIZ~4Rx&$*fkz*?fUYQKy#Q7>`2p_Dg7f^%4CL_$S&t|+3&w+aV7cVN0$A&j~)9qO8^^dyzemn>c-4A#@ za-%5<&}d9E?loNc#IXT`p2$C(?fE1(GOiCWuPF~_1MWmt#Af5{wNAR(Wy{^udGvn| zR=8bOpE4c*XC>1IfH{2kp9F>j^nc?NUn;q_@4eXe Date: Tue, 15 Oct 2024 00:16:22 +0200 Subject: [PATCH 5/5] fixup --- README.md | 4 +- data/sp-dev-fx-samples.json | 76 +---------------- src/constants/ProjectFileContent.ts | 4 +- src/constants/WebviewCommand.ts | 14 ++-- src/services/actions/Scaffolder.ts | 84 +++++++++---------- src/webview/PnPWebview.ts | 18 ++-- .../forms/spfxProject/AdditionalStep.tsx | 8 +- 7 files changed, 70 insertions(+), 138 deletions(-) diff --git a/README.md b/README.md index e984e49..5f0373e 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,7 @@ Install additional dependencies with a single click straight from the scaffoldin ![Additional dependency step](./assets/images/scaffolding-additional-step.png) -When you can set the additional dependencies it's also possible to automatically create the node version manager file with the version of Node.js used when creating the project. These settings are available in the extensiown settings. +When you can set the additional dependencies it's also possible to automatically create the node version manager file with the version of Node.js used when creating the project. These settings are available in the extension settings. ![Additional dependency step node version](./assets/images/scaffolding-additional-step-node-version.png) @@ -284,7 +284,7 @@ Other than selecting the Node.js version manager you may also select which file ![Settings Node version file](./assets/images/settings-node-version-manager-file.png) -It is also possible to set which is the default behavior when you're about to scaffold a new project. To do so there is a specific setting named `Create Node Version File Default Value`. +It is also possible to set the default behavior when you're about to scaffold a new project. To do so there is a specific setting named `Create Node Version File Default Value`. ![Settings Node version file default value](./assets/images/settings-node-version-manager-file-default-value.png) diff --git a/data/sp-dev-fx-samples.json b/data/sp-dev-fx-samples.json index 0d78cca..8b11f46 100644 --- a/data/sp-dev-fx-samples.json +++ b/data/sp-dev-fx-samples.json @@ -1,3 +1,4 @@ + { "samples": [ { @@ -4790,52 +4791,6 @@ "sampleGalerry": "sp-dev-fx-webparts", "sampleType": "samples" }, - { - "name": "pnp-sp-dev-spfx-web-parts-react-employees-onboarding", - "title": "Employee Onboarding", - "url": "https://github.com/pnp/sp-dev-fx-webparts/tree/main/samples/react-employees-onboarding", - "description": "This project is an SPFx (SharePoint Framework) application designed for employee onboarding.", - "image": "https://github.com/pnp/sp-dev-fx-webparts/raw/main/samples/react-employees-onboarding/assets/D:\\GitHub\\pnp\\sp-dev-fx-webparts\\samples\\react-employees-onboarding\\assets\\demo1.png", - "authors": [ - { - "name": "Ejaz Hussain", - "pictureUrl": "https://github.com/ejazhussain.png" - } - ], - "tags": [ - "SharePoint" - ], - "createDate": "2024-09-01", - "updateDate": "2024-09-01", - "version": "1.19.0", - "componentType": "webpart", - "extensionType": null, - "sampleGalerry": "sp-dev-fx-webparts", - "sampleType": "samples" - }, - { - "name": "pnp-sp-dev-spfx-web-parts-react-enhanced-button", - "title": "Enhanced Button", - "url": "https://github.com/pnp/sp-dev-fx-webparts/tree/main/samples/react-enhanced-button", - "description": "Extends the functionality of the native button web part.", - "image": "https://github.com/pnp/sp-dev-fx-webparts/raw/main/samples/react-enhanced-button/assets/app.jpeg", - "authors": [ - { - "name": "Ari Gunawan", - "pictureUrl": "https://github.com/AriGunawan.png" - } - ], - "tags": [ - "SharePoint" - ], - "createDate": "2024-09-01", - "updateDate": "2024-09-01", - "version": "1.19.0", - "componentType": "webpart", - "extensionType": null, - "sampleGalerry": "sp-dev-fx-webparts", - "sampleType": "samples" - }, { "name": "pnp-sp-dev-spfx-web-parts-react-enhanced-list-formatting", "title": "Enhanced List Formatting Web Part", @@ -5641,8 +5596,8 @@ "SharePoint" ], "createDate": "2020-11-06", - "updateDate": "2024-09-12", - "version": "1.19.0", + "updateDate": "2020-11-06", + "version": "1.9.1", "componentType": "webpart", "extensionType": null, "sampleGalerry": "sp-dev-fx-webparts", @@ -8565,7 +8520,7 @@ "Microsoft Teams" ], "createDate": "2022-09-26", - "updateDate": "2024-09-13", + "updateDate": "2022-11-12", "version": "1.15.2", "componentType": "webpart", "extensionType": null, @@ -9754,29 +9709,6 @@ "sampleGalerry": "sp-dev-fx-webparts", "sampleType": "samples" }, - { - "name": "pnp-sp-dev-spfx-web-parts-react-training-checklist", - "title": "Training Checklist", - "url": "https://github.com/pnp/sp-dev-fx-webparts/tree/main/samples/react-training-checklist", - "description": "YSample web part to display a training checklist in a SharePoint page.", - "image": "https://github.com/pnp/sp-dev-fx-webparts/raw/main/samples/react-training-checklist/assets/trainingchecklist.png", - "authors": [ - { - "name": "Valeras Narbutas", - "pictureUrl": "https://github.com/ValerasNarbutas.png" - } - ], - "tags": [ - "SharePoint" - ], - "createDate": "2024-09-12", - "updateDate": "2024-09-12", - "version": "1.20.0-beta.0", - "componentType": "webpart", - "extensionType": null, - "sampleGalerry": "sp-dev-fx-webparts", - "sampleType": "samples" - }, { "name": "pnp-sp-dev-spfx-web-parts-react-twitter", "title": "Twitter Timeline Web Part", diff --git a/src/constants/ProjectFileContent.ts b/src/constants/ProjectFileContent.ts index f0afe46..c673606 100644 --- a/src/constants/ProjectFileContent.ts +++ b/src/constants/ProjectFileContent.ts @@ -5,6 +5,6 @@ export enum ProjectFileContent { installReusablePropertyPaneControls = 'install-spfx-property-controls', installReusableReactControls = 'install-spfx-controls-react', installPnPJs = 'install-pnpjs', - createNVMRCFile = 'create-nvmrc-file', - createNodeVersionFile = 'create-node-version-file', + createNVMRCFile = 'create-nvmrc-file', + createNodeVersionFile = 'create-node-version-file', } \ No newline at end of file diff --git a/src/constants/WebviewCommand.ts b/src/constants/WebviewCommand.ts index b685971..800e2df 100644 --- a/src/constants/WebviewCommand.ts +++ b/src/constants/WebviewCommand.ts @@ -5,10 +5,10 @@ export const WebviewCommand = { folderPath: 'folder-path', validateSolutionName: 'validate-solution-name', validateComponentName: 'validate-component-name', - createNodeVersionFileDefaultValue: 'should-create-node-version-file', - nodeVersionManager: 'node-version-manager', - nodeVersionManagerFile: 'node-version-manager-file', - createNodeVersionManagerFile: 'node-version-manager-file', + createNodeVersionFileDefaultValue: 'should-create-node-version-file', + nodeVersionManager: 'node-version-manager', + nodeVersionManagerFile: 'node-version-manager-file', + createNodeVersionManagerFile: 'node-version-manager-file', }, toVSCode: { useSample: 'use-sample', @@ -21,8 +21,8 @@ export const WebviewCommand = { validateComponentName: 'validate-component-name', addSpfxComponent: 'add-spfx-component', createAppReg: 'create-app-reg', - createNodeVersionFileDefaultValue: 'should-create-node-version-file', - nodeVersionManager: 'node-version-manager', - nodeVersionManagerFile: 'node-version-manager-file', + createNodeVersionFileDefaultValue: 'should-create-node-version-file', + nodeVersionManager: 'node-version-manager', + nodeVersionManagerFile: 'node-version-manager-file', } }; \ No newline at end of file diff --git a/src/services/actions/Scaffolder.ts b/src/services/actions/Scaffolder.ts index e4b2bed..29bd997 100644 --- a/src/services/actions/Scaffolder.ts +++ b/src/services/actions/Scaffolder.ts @@ -148,43 +148,43 @@ export class Scaffolder { } /** - * Returns the value of the createNodeVersionFileDefaultValue setting and sends it to the webview. - */ - public static async createNodeVersionFileDefaultValue() { - const value = getExtensionSettings( - 'createNodeVersionFileDefaultValue', - false - ); - - PnPWebview.postMessage( - WebviewCommand.toWebview.createNodeVersionFileDefaultValue, - value - ); - } - - /** - * Returns the value of the nodeVersionManagerFile setting and sends it to the webview. - */ - public static async nodeVersionManagerFile() { - const value = getExtensionSettings('nodeVersionManagerFile', '.nvmrc'); - - PnPWebview.postMessage( - WebviewCommand.toWebview.createNodeVersionManagerFile, - value - ); - } - - /** - * Returns the value of the nodeVersionManager setting and sends it to the webview. - */ - public static async nodeVersionManager() { - const value = getExtensionSettings('nodeVersionManager', 'nvm'); - - PnPWebview.postMessage( - WebviewCommand.toWebview.nodeVersionManager, - value - ); - } + * Returns the value of the createNodeVersionFileDefaultValue setting and sends it to the webview. + */ + public static async createNodeVersionFileDefaultValue() { + const value = getExtensionSettings( + 'createNodeVersionFileDefaultValue', + false + ); + + PnPWebview.postMessage( + WebviewCommand.toWebview.createNodeVersionFileDefaultValue, + value + ); + } + + /** + * Returns the value of the nodeVersionManagerFile setting and sends it to the webview. + */ + public static async nodeVersionManagerFile() { + const value = getExtensionSettings('nodeVersionManagerFile', '.nvmrc'); + + PnPWebview.postMessage( + WebviewCommand.toWebview.createNodeVersionManagerFile, + value + ); + } + + /** + * Returns the value of the nodeVersionManager setting and sends it to the webview. + */ + public static async nodeVersionManager() { + const value = getExtensionSettings('nodeVersionManager', 'nvm'); + + PnPWebview.postMessage( + WebviewCommand.toWebview.nodeVersionManager, + value + ); + } /** * Scaffold method for creating a new project. @@ -281,13 +281,13 @@ export class Scaffolder { break; } break; - // If the node version manager is none, do not create any file - case 'none': - // By default, do not create any file - default: + // If the node version manager is none, do not create any file + case 'none': + // By default, do not create any file + default: break; - } } + } Scaffolder.createProjectFileAndOpen(newFolderPath, content); } else { diff --git a/src/webview/PnPWebview.ts b/src/webview/PnPWebview.ts index 408f8c9..0205372 100644 --- a/src/webview/PnPWebview.ts +++ b/src/webview/PnPWebview.ts @@ -156,15 +156,15 @@ export class PnPWebview { case WebviewCommand.toVSCode.createAppReg: EntraAppRegistration.createEntraAppRegistration(); break; - case WebviewCommand.toVSCode.createNodeVersionFileDefaultValue: - Scaffolder.createNodeVersionFileDefaultValue(); - break; - case WebviewCommand.toVSCode.nodeVersionManagerFile: - Scaffolder.nodeVersionManagerFile(); - break; - case WebviewCommand.toVSCode.nodeVersionManager: - Scaffolder.nodeVersionManager(); - break; + case WebviewCommand.toVSCode.createNodeVersionFileDefaultValue: + Scaffolder.createNodeVersionFileDefaultValue(); + break; + case WebviewCommand.toVSCode.nodeVersionManagerFile: + Scaffolder.nodeVersionManagerFile(); + break; + case WebviewCommand.toVSCode.nodeVersionManager: + Scaffolder.nodeVersionManager(); + break; } }); } diff --git a/src/webview/view/components/forms/spfxProject/AdditionalStep.tsx b/src/webview/view/components/forms/spfxProject/AdditionalStep.tsx index 1f8808c..2ba7ce7 100644 --- a/src/webview/view/components/forms/spfxProject/AdditionalStep.tsx +++ b/src/webview/view/components/forms/spfxProject/AdditionalStep.tsx @@ -115,10 +115,10 @@ export const AdditionalStep: React.FunctionComponent = ({ link='https://pnp.github.io/pnpjs/' /> {nodeVersionManager !== 'none' && - } + } );