Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/core/package.nls.json
Original file line number Diff line number Diff line change
Expand Up @@ -437,5 +437,5 @@
"AWS.toolkit.lambda.walkthrough.step1.description": "Locally test and debug your code.",
"AWS.toolkit.lambda.walkthrough.step2.title": "Deploy to the cloud",
"AWS.toolkit.lambda.walkthrough.step2.description": "Test your application in the cloud from within VS Code. \n\nNote: The AWS CLI and the SAM CLI require AWS Credentials to interact with the cloud. For information on setting up your credentials, see [Authentication and access credentials](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html). \n\n[Configure credentials](command:aws.toolkit.lambda.walkthrough.credential)",
"AWS.toolkit.lambda.serverlessLand.quickpickTitle": "Create Lambda Application from template"
"AWS.toolkit.lambda.serverlessLand.quickpickTitle": "Create application with Serverless template"
}
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,8 @@ async function openReadmeFile(config: CreateServerlessLandWizardForm): Promise<v
getLogger().warn('README.md file not found in the project directory')
return
}

await vscode.commands.executeCommand('workbench.action.focusFirstEditorGroup')
await vscode.window.showTextDocument(readmeUri)
await vscode.commands.executeCommand('markdown.showPreview', readmeUri)
} catch (err) {
getLogger().error(`Error in openReadmeFile: ${err}`)
throw new ToolkitError('Error processing README file')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
*/
import * as nodefs from 'fs' // eslint-disable-line no-restricted-imports
import { ToolkitError } from '../../../shared/errors'
import path from 'path'
import globals from '../../../shared/extensionGlobals'

interface Implementation {
iac: string
Expand All @@ -28,14 +28,6 @@ export interface ProjectMetadata {
export class MetadataManager {
private static instance: MetadataManager
private metadata: ProjectMetadata | undefined
private static readonly metadataPath = path.join(
path.resolve(__dirname, '../../../../../'),
'src',
'awsService',
'appBuilder',
'serverlessLand',
'metadata.json'
)

private constructor() {}

Expand All @@ -48,12 +40,17 @@ export class MetadataManager {

public static initialize(): MetadataManager {
const instance = MetadataManager.getInstance()
instance.loadMetadata(MetadataManager.metadataPath).catch((err) => {
const metadataPath = instance.getMetadataPath()
instance.loadMetadata(metadataPath).catch((err) => {
throw new ToolkitError(`Failed to load metadata: ${err}`)
})
return instance
}

public getMetadataPath(): string {
return globals.context.asAbsolutePath('dist/src/serverlessLand/metadata.json')
}

/**
* Loads metadata from a JSON file
* @param metadataPath Path to the metadata JSON file
Expand Down Expand Up @@ -117,6 +114,16 @@ export class MetadataManager {
}))
}

public getUrl(pattern: string): string {
const patternData = this.metadata?.patterns?.[pattern]
if (!patternData || !patternData.implementation) {
return ''
}
const asset = patternData.implementation[0].assetName

return `https://serverlessland.com/patterns/${asset}`
}

/**
* Gets available Infrastructure as Code options for a specific pattern
* @param pattern The pattern name to get IaC options for
Expand Down
24 changes: 11 additions & 13 deletions packages/core/src/awsService/appBuilder/serverlessLand/wizard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ export interface CreateServerlessLandWizardForm {
pattern: string
runtime: string
iac: string
assetName: string
}

function promptPattern(metadataManager: MetadataManager) {
Expand All @@ -37,11 +38,7 @@ function promptPattern(metadataManager: MetadataManager) {
data: p.label,
buttons: [
{
iconPath: new vscode.ThemeIcon('github'),
tooltip: 'Open in GitHub',
},
{
iconPath: new vscode.ThemeIcon('open-preview'),
iconPath: new vscode.ThemeIcon('link-external'),
tooltip: 'Open in Serverless Land',
},
],
Expand Down Expand Up @@ -74,7 +71,7 @@ function promptRuntime(metadataManager: MetadataManager, pattern: string | undef
{
title: localize('AWS.serverlessLand.initWizard.runtime.prompt', 'Select Runtime'),
placeholder: 'Choose a runtime for your project',
buttons: [vscode.QuickInputButtons.Back],
buttons: createCommonButtons(),
}
)
}
Expand All @@ -97,24 +94,25 @@ function promptIac(metadataManager: MetadataManager, pattern: string | undefined
{
title: localize('AWS.serverlessLand.initWizard.iac.prompt', 'Select IaC'),
placeholder: 'Choose an IaC option for your project',
buttons: [vscode.QuickInputButtons.Back],
buttons: createCommonButtons(),
}
)
}

function promptLocation() {
return createFolderPrompt(vscode.workspace.workspaceFolders ?? [], {
title: localize('AWS.serverlessLand.initWizard.location.prompt', 'Select Project Location'),
buttons: [vscode.QuickInputButtons.Back],
browseFolderDetail: 'Select a folder for your project',
buttons: createCommonButtons(),
browseFolderDetail: 'Select a parent folder for your project',
})
}

function promptName() {
function promptName(location: vscode.Uri | undefined) {
const folderName = location ? path.basename(location.fsPath) : ''
return createInputBox({
title: localize('AWS.serverlessLand.initWizard.name.prompt', 'Enter Project Name'),
placeholder: 'Enter a name for your new application',
buttons: [vscode.QuickInputButtons.Back],
placeholder: ` ${folderName}/: Enter a name for your new application`,
buttons: createCommonButtons(),
validateInput: (value: string): string | undefined => {
if (!value) {
return 'Application name cannot be empty'
Expand Down Expand Up @@ -143,6 +141,6 @@ export class CreateServerlessLandWizard extends Wizard<CreateServerlessLandWizar
this.form.runtime.bindPrompter((state) => promptRuntime(this.metadataManager, state.pattern))
this.form.iac.bindPrompter((state) => promptIac(this.metadataManager, state.pattern))
this.form.location.bindPrompter(() => promptLocation())
this.form.name.bindPrompter(() => promptName())
this.form.name.bindPrompter((state) => promptName(state.location))
}
}
18 changes: 18 additions & 0 deletions packages/core/src/shared/ui/pickerPrompter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import { Prompter, PromptResult, Transform } from './prompter'
import { assign, isAsyncIterable } from '../utilities/collectionUtils'
import { recentlyUsed } from '../localizedText'
import { getLogger } from '../logger/logger'
import { openUrl } from '../utilities/vsCodeUtils'
import { MetadataManager } from '../../awsService/appBuilder/serverlessLand/metadataManager'

const localize = nls.loadMessageBundle()

Expand Down Expand Up @@ -143,6 +145,22 @@ export function createQuickPick<T>(
assign(mergedOptions, picker)
picker.buttons = mergedOptions.buttons ?? []

picker.onDidTriggerItemButton(async (event) => {
const metadataManager = MetadataManager.getInstance()
if (event.button.tooltip !== 'Open in Serverless Land') {
return
}
const selectedPattern = event.item
if (!selectedPattern) {
return
}
const patternUrl = metadataManager.getUrl(selectedPattern.label)
if (!patternUrl) {
return
}
await openUrl(vscode.Uri.parse(patternUrl))
})

const prompter =
mergedOptions.filterBoxInputSettings !== undefined
? new FilterBoxQuickPickPrompter<T>(picker, mergedOptions)
Expand Down
13 changes: 9 additions & 4 deletions packages/toolkit/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -1327,24 +1327,29 @@
"group": "1_account@3"
},
{
"command": "aws.lambda.createNewSamApp",
"command": "aws.toolkit.lambda.createServerlessLandProject",
"when": "view == aws.explorer",
"group": "3_lambda@1"
},
{
"command": "aws.launchConfigForm",
"command": "aws.lambda.createNewSamApp",
"when": "view == aws.explorer",
"group": "3_lambda@2"
},
{
"command": "aws.launchConfigForm",
"when": "view == aws.explorer",
"group": "3_lambda@3"
},
{
"command": "aws.deploySamApplication",
"when": "config.aws.samcli.legacyDeploy && view == aws.explorer",
"group": "3_lambda@3"
"group": "3_lambda@4"
},
{
"command": "aws.samcli.sync",
"when": "!config.aws.samcli.legacyDeploy && view == aws.explorer",
"group": "3_lambda@3"
"group": "3_lambda@4"
},
{
"submenu": "aws.toolkit.submenu.feedback",
Expand Down
13 changes: 13 additions & 0 deletions packages/toolkit/scripts/build/copyFiles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,19 @@ const tasks: CopyTask[] = [
destination: path.join('src', 'stepFunctions', 'asl', 'aslServer.js'),
},

// Serverless Land
{
target: path.join(
'../../node_modules/aws-core-vscode',
'src',
'awsService',
'appBuilder',
Comment on lines +74 to +78
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

join() isn't needed here either. I see that you are following the existing pattern of this file, but this file really should be updated.

'serverlessLand',
'metadata.json'
),
destination: path.join('src', 'serverlessLand', 'metadata.json'),
},

// Vue
{
target: path.join('../core', 'resources', 'js', 'vscode.js'),
Expand Down
Loading