diff --git a/docs/experimental-features.md b/docs/experimental-features.md index 712fc13cde2..e01a1139499 100644 --- a/docs/experimental-features.md +++ b/docs/experimental-features.md @@ -12,14 +12,14 @@ The following features can be optionally enabled through your `bicepconfig.json` Should be enabled in tandem with `testFramework` experimental feature flag for expected functionality. Allows you to author boolean assertions using the `assert` keyword comparing the actual value of a parameter, variable, or resource name to an expected value. Assert statements can only be written directly within the Bicep file whose resources they reference. For more information, see [Bicep Experimental Test Framework](https://github.com/Azure/bicep/issues/11967). ### `dynamicTypeLoading` -Requires `extensibility` to be enabled. If enabled, users are able to fetch the azure resource type definitions from an OCI Registry as a runtime dependency. To fetch the type definitions the following syntax can be used. For example `provider 'br:mcr.microsoft.com/bicep/providers/az@1.0.0' as az`. -The provider definitions also support aliasing via `bicepconfig.json` similar to [`moduleAliases`](https://learn.microsoft.com/azure/azure-resource-manager/bicep/bicep-config-modules#aliases-for-modules). For example `provider 'br/public:az@1.0.0' as az`. +Requires `extensibility` to be enabled. If enabled, users are able to fetch the azure resource type definitions from an OCI Registry as a runtime dependency. To fetch the type definitions the following syntax can be used. For example `extension 'br:mcr.microsoft.com/bicep/extensions/az@1.0.0' as az`. +The extension definitions also support aliasing via `bicepconfig.json` similar to [`moduleAliases`](https://learn.microsoft.com/azure/azure-resource-manager/bicep/bicep-config-modules#aliases-for-modules). For example `extension 'br/public:az@1.0.0' as az`. ### `extendableParamFiles` Enables the ability to extend bicepparam files from other bicepparam files. ### `extensibility` -Allows Bicep to use a provider model to deploy non-ARM resources. Currently, we support Kubernetes provider ([Bicep extensibility Kubernetes provider](https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/bicep-extensibility-kubernetes-provider)) and Microsoft Graph provider ([Bicep templates for Microsoft Graph](https://aka.ms/graphbicep)). +Allows Bicep to use an extensibility model to deploy non-ARM resources. Currently, we support Kubernetes extension ([Bicep Kubernetes extension](https://learn.microsoft.com/en-us/azure/azure-resource-manager/bicep/bicep-extensibility-kubernetes-provider)) and Microsoft Graph extension ([Bicep templates for Microsoft Graph](https://aka.ms/graphbicep)). ### `extensionRegistry` Requires `dynamicTypeLoading` and `extensibility` to be enabled. If enabled, users are able to fetch the third party resource type definitions from an OCI Registry as a runtime dependency. To fetch the type definitions the following syntax can be used. For example `extension 'br:thirdpartyregistry.azurecr.io/bicep/extension/thirdparty@1.0.0' as thirdparty`. @@ -54,8 +54,8 @@ Should be enabled in tandem with `assertions` experimental feature flag for expe ## Other experimental functionality -### `publish-provider` CLI Command -Command that allows the publishing of providers to container registries. For more information, see [Using the Publish Provider Command](./experimental/publish-provider-command.md). +### `publish-extension` CLI Command +Command that allows the publishing of extensions to container registries. For more information, see [Using the Publish Extension Command](./experimental/publish-extension-command.md). ### Deployment Pane The Deployment Pane is a UI panel in VSCode that allows you to connect to your Azure subscription and execute validate, deploy & whatif operations and get instant feedback without leaving the editor. For more information, see [Using the Deployment Pane](./experimental/deploy-ui.md). diff --git a/docs/experimental/publish-extension-command.md b/docs/experimental/publish-extension-command.md new file mode 100644 index 00000000000..374db0fbeab --- /dev/null +++ b/docs/experimental/publish-extension-command.md @@ -0,0 +1,21 @@ +# Using the `publish-extension` command (Experimental!) + +## What is it? +The `publish-extension` command allows you to **publish** extensions to a registry of your choice. Simply specify a file and the registry extension reference. + +## Using +`bicep publish-extension --target ` + +### Arguments +`` Path to the input file (index JSON file)\ +`` The extension reference + +### Options +`force` Overwrite existing published extension + +### Examples +`bicep publish-extension` ./index.json --target br:example.azurecr.io/hello/world:v1\ +`bicep publish-extension` ./index.json --target br:example.azurecr.io/hello/world:v1 --force + +## Raising bugs or feature requests +Please raise bug reports or feature requests under [Bicep Issues](https://github.com/Azure/bicep/issues) as usual. diff --git a/docs/experimental/publish-provider-command.md b/docs/experimental/publish-provider-command.md deleted file mode 100644 index 7b96eb6499a..00000000000 --- a/docs/experimental/publish-provider-command.md +++ /dev/null @@ -1,21 +0,0 @@ -# Using the `publish-provider` command (Experimental!) - -## What is it? -The publish provider command allows you to **publish** providers to a registry of your choice. Simply specify a file and the registry provider reference. - -## Using -`bicep publish-provider --target ` - -### Arguments -`` Path to the input file (index JSON file)\ -`` The provider reference - -### Options -`force` Overwrite existing published provider - -### Examples -`bicep publish-provider` ./index.json --target br:example.azurecr.io/hello/world:v1\ -`bicep publish-provider` ./index.json --target br:example.azurecr.io/hello/world:v1 --force - -## Raising bugs or feature requests -Please raise bug reports or feature requests under [Bicep Issues](https://github.com/Azure/bicep/issues) as usual. diff --git a/docs/grammar.md b/docs/grammar.md index 7b89b0ff0df..3d87438d1f8 100644 --- a/docs/grammar.md +++ b/docs/grammar.md @@ -4,7 +4,7 @@ The following is the active pseudo-grammar of the bicep language. program -> statement* EOF statement -> targetScopeDecl | - providerDecl | + extensionDecl | compileTimeImportDecl | metadataDecl | parameterDecl | @@ -20,11 +20,11 @@ statement -> targetScopeDecl -> "targetScope" "=" expression -providerDecl -> decorator* "provider" interpString(specification) providerWithClause? providerAsClause? NL +extensionDecl -> decorator* "extension" interpString(specification) extensionWithClause? extensionAsClause? NL -providerWithClause -> "with" object +extensionWithClause -> "with" object -providerAsClause -> "as" IDENTIFIER(alias) +extensionAsClause -> "as" IDENTIFIER(alias) compileTimeImportDecl -> decorator* "import" compileTimeImportTarget compileTimeImportFromClause @@ -34,9 +34,9 @@ compileTimeImportTarget -> importedSymbolsList -> "{" ( NL+ ( importedSymbolsListItem NL+ )* )? "}" -importedSymbolsListItem -> IDENTIFIER(originalSymbolName) providerAsClause? +importedSymbolsListItem -> IDENTIFIER(originalSymbolName) extensionAsClause? -wildcardImport -> "*" providerAsClause +wildcardImport -> "*" extensionAsClause compileTimeImportFromClause -> "from" interpString(path) diff --git a/src/Bicep.Cli.E2eTests/src/examples/providers.ff/bicepconfig.json b/src/Bicep.Cli.E2eTests/src/examples/extensions.ff/bicepconfig.json similarity index 100% rename from src/Bicep.Cli.E2eTests/src/examples/providers.ff/bicepconfig.json rename to src/Bicep.Cli.E2eTests/src/examples/extensions.ff/bicepconfig.json diff --git a/src/Bicep.Cli.E2eTests/src/examples/providers.ff/main.bicep b/src/Bicep.Cli.E2eTests/src/examples/extensions.ff/main.bicep similarity index 100% rename from src/Bicep.Cli.E2eTests/src/examples/providers.ff/main.bicep rename to src/Bicep.Cli.E2eTests/src/examples/extensions.ff/main.bicep diff --git a/src/Bicep.Cli.E2eTests/src/examples/providers.ff/types/http/index.json b/src/Bicep.Cli.E2eTests/src/examples/extensions.ff/types/http/index.json similarity index 84% rename from src/Bicep.Cli.E2eTests/src/examples/providers.ff/types/http/index.json rename to src/Bicep.Cli.E2eTests/src/examples/extensions.ff/types/http/index.json index 5d7715b97f6..01227c73a67 100644 --- a/src/Bicep.Cli.E2eTests/src/examples/providers.ff/types/http/index.json +++ b/src/Bicep.Cli.E2eTests/src/examples/extensions.ff/types/http/index.json @@ -6,7 +6,7 @@ }, "resourceFunctions": {}, "settings": { - "name": "thirdpartyprovider", + "name": "thirdpartyextension", "version": "1.2.3", "isSingleton": false } diff --git a/src/Bicep.Cli.E2eTests/src/examples/providers.ff/types/http/v1/types.json b/src/Bicep.Cli.E2eTests/src/examples/extensions.ff/types/http/v1/types.json similarity index 100% rename from src/Bicep.Cli.E2eTests/src/examples/providers.ff/types/http/v1/types.json rename to src/Bicep.Cli.E2eTests/src/examples/extensions.ff/types/http/v1/types.json diff --git a/src/Bicep.Cli.E2eTests/src/examples/providers.prod/bicepconfig.json b/src/Bicep.Cli.E2eTests/src/examples/extensions.prod/bicepconfig.json similarity index 100% rename from src/Bicep.Cli.E2eTests/src/examples/providers.prod/bicepconfig.json rename to src/Bicep.Cli.E2eTests/src/examples/extensions.prod/bicepconfig.json diff --git a/src/Bicep.Cli.E2eTests/src/examples/providers.prod/main.bicep b/src/Bicep.Cli.E2eTests/src/examples/extensions.prod/main.bicep similarity index 100% rename from src/Bicep.Cli.E2eTests/src/examples/providers.prod/main.bicep rename to src/Bicep.Cli.E2eTests/src/examples/extensions.prod/main.bicep diff --git a/src/Bicep.Cli.E2eTests/src/examples/providers.prod/types/http/index.json b/src/Bicep.Cli.E2eTests/src/examples/extensions.prod/types/http/index.json similarity index 84% rename from src/Bicep.Cli.E2eTests/src/examples/providers.prod/types/http/index.json rename to src/Bicep.Cli.E2eTests/src/examples/extensions.prod/types/http/index.json index 5d7715b97f6..01227c73a67 100644 --- a/src/Bicep.Cli.E2eTests/src/examples/providers.prod/types/http/index.json +++ b/src/Bicep.Cli.E2eTests/src/examples/extensions.prod/types/http/index.json @@ -6,7 +6,7 @@ }, "resourceFunctions": {}, "settings": { - "name": "thirdpartyprovider", + "name": "thirdpartyextension", "version": "1.2.3", "isSingleton": false } diff --git a/src/Bicep.Cli.E2eTests/src/examples/providers.prod/types/http/v1/types.json b/src/Bicep.Cli.E2eTests/src/examples/extensions.prod/types/http/v1/types.json similarity index 100% rename from src/Bicep.Cli.E2eTests/src/examples/providers.prod/types/http/v1/types.json rename to src/Bicep.Cli.E2eTests/src/examples/extensions.prod/types/http/v1/types.json diff --git a/src/Bicep.Cli.E2eTests/src/publishProvider.test.live.ts b/src/Bicep.Cli.E2eTests/src/publishExtension.test.live.ts similarity index 73% rename from src/Bicep.Cli.E2eTests/src/publishProvider.test.live.ts rename to src/Bicep.Cli.E2eTests/src/publishExtension.test.live.ts index 15dd48c6337..208970af35e 100644 --- a/src/Bicep.Cli.E2eTests/src/publishProvider.test.live.ts +++ b/src/Bicep.Cli.E2eTests/src/publishExtension.test.live.ts @@ -2,7 +2,7 @@ // Licensed under the MIT License. /** - * Live tests for "bicep publish-provider". + * Live tests for "bicep publish-extension". * * @group live */ @@ -13,20 +13,20 @@ import { invokingBicepCommand } from "./utils/command"; import { pathToExampleFile, readFileSync, writeTempFile } from "./utils/fs"; import { getEnvironment } from "./utils/liveTestEnvironments"; -describe("bicep publish-provider live", () => { - const testArea = "publish-provider"; +describe("bicep publish-extension live", () => { + const testArea = "publish-extension"; const environment = getEnvironment(); - it("should publish provider", () => { + it("should publish extension", () => { const builder = new BicepRegistryReferenceBuilder( environment.registryUri, testArea, ); - const baseFolder = pathToExampleFile("providers" + environment.suffix); + const baseFolder = pathToExampleFile("extensions" + environment.suffix); const indexJsonPath = path.join(baseFolder, "types/http/index.json"); const target = builder.getBicepReference("http", "0.0.1"); - invokingBicepCommand("publish-provider", indexJsonPath, "--target", target) + invokingBicepCommand("publish-extension", indexJsonPath, "--target", target) .withEnvironmentOverrides(environment.environmentOverrides) .shouldSucceed(); }); @@ -36,11 +36,11 @@ describe("bicep publish-provider live", () => { environment.registryUri, testArea, ); - const baseFolder = pathToExampleFile("providers" + environment.suffix); + const baseFolder = pathToExampleFile("extensions" + environment.suffix); const indexJsonPath = path.join(baseFolder, "types/http/index.json"); const target = builder.getBicepReference("http", "0.0.1"); - invokingBicepCommand("publish-provider", indexJsonPath, "--target", target) + invokingBicepCommand("publish-extension", indexJsonPath, "--target", target) .withEnvironmentOverrides(environment.environmentOverrides) .shouldSucceed(); @@ -48,7 +48,7 @@ describe("bicep publish-provider live", () => { path.join(baseFolder, "main.bicep"), ).replace("$TARGET_REFERENCE", target); const bicepPath = writeTempFile( - "restore-provider", + "restore-extension", "main.bicep", bicepContents, ); @@ -56,7 +56,7 @@ describe("bicep publish-provider live", () => { const configContents = readFileSync( path.join(baseFolder, "bicepconfig.json"), ); - writeTempFile("restore-provider", "bicepconfig.json", configContents); + writeTempFile("restore-extension", "bicepconfig.json", configContents); // Building with --stdout should emit a valid result. invokingBicepCommand("build", "--stdout", bicepPath) diff --git a/src/Bicep.Cli.E2eTests/src/publishProvider.test.ts b/src/Bicep.Cli.E2eTests/src/publishExtension.test.ts similarity index 63% rename from src/Bicep.Cli.E2eTests/src/publishProvider.test.ts rename to src/Bicep.Cli.E2eTests/src/publishExtension.test.ts index 8c3bc291625..c41032cdd07 100644 --- a/src/Bicep.Cli.E2eTests/src/publishProvider.test.ts +++ b/src/Bicep.Cli.E2eTests/src/publishExtension.test.ts @@ -2,7 +2,7 @@ // Licensed under the MIT License. /** - * Tests for "bicep publish-provider". + * Tests for "bicep publish-extension". * * @group CI */ @@ -17,19 +17,19 @@ import { writeTempFile, } from "./utils/fs"; -describe("bicep publish-provider", () => { - it("should publish provider to the file system", () => { +describe("bicep publish-extension", () => { + it("should publish extension to the file system", () => { const indexJsonPath = pathToExampleFile( - "providers.prod", + "extensions.prod", "types", "http", "index.json", ); - const targetPath = pathToTempFile("publish-provider", "provider.tgz"); + const targetPath = pathToTempFile("publish-extension", "extension.tgz"); ensureParentDirExists(targetPath); invokingBicepCommand( - "publish-provider", + "publish-extension", "--target", targetPath, indexJsonPath, @@ -40,18 +40,18 @@ describe("bicep publish-provider", () => { expectFileExists(targetPath); const bicepContents = readFileSync( - pathToExampleFile("providers.prod", "main.bicep"), - ).replace("$TARGET_REFERENCE", "./provider.tgz"); + pathToExampleFile("extensions.prod", "main.bicep"), + ).replace("$TARGET_REFERENCE", "./extension.tgz"); const bicepPath = writeTempFile( - "publish-provider", + "publish-extension", "main.bicep", bicepContents, ); const configContents = readFileSync( - pathToExampleFile("providers.prod", "bicepconfig.json"), + pathToExampleFile("extensions.prod", "bicepconfig.json"), ); - writeTempFile("publish-provider", "bicepconfig.json", configContents); + writeTempFile("publish-extension", "bicepconfig.json", configContents); // Building with --stdout should emit a valid result. invokingBicepCommand("build", "--stdout", bicepPath) diff --git a/src/Bicep.Cli.IntegrationTests/BuildCommandTests.cs b/src/Bicep.Cli.IntegrationTests/BuildCommandTests.cs index 84c4c623107..5e960591c47 100644 --- a/src/Bicep.Cli.IntegrationTests/BuildCommandTests.cs +++ b/src/Bicep.Cli.IntegrationTests/BuildCommandTests.cs @@ -112,7 +112,7 @@ public async Task Build_Valid_SingleFile_WithTemplateSpecReference_ShouldSucceed //[DataRow("br:invalid.azureacr.io/bicep/extensions/az", false)] //[DataRow("br/unknown:az", false)] public async Task Build_Valid_SingleFile_WithExtensionDeclarationStatement( - string providerDeclarationSyntax, + string extensionDeclarationSyntax, bool shouldSucceed, string containingFolder = "") { @@ -132,12 +132,12 @@ public async Task Build_Valid_SingleFile_WithExtensionDeclarationStatement( if (uri.Host.Contains("invalid")) { continue; } var layer = await client.UploadBlobAsync(BinaryData.FromString("")); var config = await client.UploadBlobAsync(BinaryData.FromString("{}")); - await client.SetManifestAsync(BicepTestConstants.GetBicepProviderManifest(layer, config), "2.0.0"); + await client.SetManifestAsync(BicepTestConstants.GetBicepExtensionManifest(layer, config), "2.0.0"); } // 3. create a main.bicep and save it to a output directory var bicepFile = $""" - extension '{providerDeclarationSyntax}:2.0.0' + extension '{extensionDeclarationSyntax}:2.0.0' """; var tempDirectory = FileHelper.GetUniqueTestOutputPath(TestContext); Directory.CreateDirectory(tempDirectory); @@ -198,10 +198,10 @@ public async Task Build_Valid_SingleFile_WithExtensionDeclarationStatement( } if (shouldSucceed) { - // 7. assert the provider files were restored to the cache directory + // 7. assert the extension files were restored to the cache directory Directory.Exists(settings.FeatureOverrides!.CacheRootDirectory).Should().BeTrue(); - var providerDir = Path.Combine(settings.FeatureOverrides.CacheRootDirectory!, ArtifactReferenceSchemes.Oci, containingFolder, "bicep$extensions$az", "2.0.0$"); - Directory.EnumerateFiles(providerDir).ToList().Select(Path.GetFileName).Should().BeEquivalentTo(new List { "types.tgz", "lock", "manifest", "metadata" }); + var extensionDir = Path.Combine(settings.FeatureOverrides.CacheRootDirectory!, ArtifactReferenceSchemes.Oci, containingFolder, "bicep$extensions$az", "2.0.0$"); + Directory.EnumerateFiles(extensionDir).ToList().Select(Path.GetFileName).Should().BeEquivalentTo(new List { "types.tgz", "lock", "manifest", "metadata" }); } } diff --git a/src/Bicep.Cli.IntegrationTests/Files/PublishProviderCommandTests/TestProvider/index.json b/src/Bicep.Cli.IntegrationTests/Files/PublishExtensionCommandTests/TestExtension/index.json similarity index 100% rename from src/Bicep.Cli.IntegrationTests/Files/PublishProviderCommandTests/TestProvider/index.json rename to src/Bicep.Cli.IntegrationTests/Files/PublishExtensionCommandTests/TestExtension/index.json diff --git a/src/Bicep.Cli.IntegrationTests/Files/PublishProviderCommandTests/TestProvider/v1/types.json b/src/Bicep.Cli.IntegrationTests/Files/PublishExtensionCommandTests/TestExtension/v1/types.json similarity index 100% rename from src/Bicep.Cli.IntegrationTests/Files/PublishProviderCommandTests/TestProvider/v1/types.json rename to src/Bicep.Cli.IntegrationTests/Files/PublishExtensionCommandTests/TestExtension/v1/types.json diff --git a/src/Bicep.Cli.IntegrationTests/PublishProviderCommandTests.cs b/src/Bicep.Cli.IntegrationTests/PublishProviderCommandTests.cs index eaf8d6a5719..7090b7ed0ba 100644 --- a/src/Bicep.Cli.IntegrationTests/PublishProviderCommandTests.cs +++ b/src/Bicep.Cli.IntegrationTests/PublishProviderCommandTests.cs @@ -16,19 +16,19 @@ namespace Bicep.Cli.IntegrationTests; [TestClass] -public class PublishProviderCommandTests : TestBase +public class PublishExtensionCommandTests : TestBase { [TestMethod] public async Task Publish_provider_prints_deprecation_warning() { var outputDirectory = FileHelper.SaveEmbeddedResourcesWithPathPrefix( TestContext, - typeof(PublishProviderCommandTests).Assembly, - "Files/PublishProviderCommandTests/TestProvider"); + typeof(PublishExtensionCommandTests).Assembly, + "Files/PublishExtensionCommandTests/TestExtension"); var registryStr = "example.com"; var registryUri = new Uri($"https://{registryStr}"); - var repository = $"test/provider"; + var repository = $"test/extension"; var version = "0.0.1"; var (clientFactory, blobClientMocks) = RegistryHelper.CreateMockRegistryClients((registryStr, repository)); @@ -51,12 +51,12 @@ public async Task Publish_extension_should_succeed() { var outputDirectory = FileHelper.SaveEmbeddedResourcesWithPathPrefix( TestContext, - typeof(PublishProviderCommandTests).Assembly, - "Files/PublishProviderCommandTests/TestProvider"); + typeof(PublishExtensionCommandTests).Assembly, + "Files/PublishExtensionCommandTests/TestExtension"); var registryStr = "example.com"; var registryUri = new Uri($"https://{registryStr}"); - var repository = $"test/provider"; + var repository = $"test/extension"; var version = "0.0.1"; var (clientFactory, blobClientMocks) = RegistryHelper.CreateMockRegistryClients((registryStr, repository)); @@ -75,8 +75,8 @@ public async Task Publish_extension_should_succeed() // this command should output an experimental warning result.Stderr.Should().Match("WARNING: The 'publish-extension' CLI command group is an experimental feature.*"); - // verify the provider was published - mockBlobClient.Should().HaveProvider(version, out var tgzStream); + // verify the extension was published + mockBlobClient.Should().HaveExtension(version, out var tgzStream); var typeLoader = OciTypeLoader.FromStream(tgzStream); var azTypeLoader = new AzResourceTypeLoader(typeLoader); @@ -99,8 +99,8 @@ public async Task Publish_extension_should_succeed() var result2 = await Bicep(settings, [.. requiredArgs]); result2.Should().Succeed().And.NotHaveStdout(); - // verify the provider was published - mockBlobClient.Should().HaveProvider(version, out var tgzStream2); + // verify the extension was published + mockBlobClient.Should().HaveExtension(version, out var tgzStream2); var typeLoader2 = OciTypeLoader.FromStream(tgzStream2); var azTypeLoader2 = new AzResourceTypeLoader(typeLoader2); @@ -150,7 +150,7 @@ public async Task Publish_extension_should_fail_for_malformed_target() var outputDirectory = FileHelper.GetUniqueTestOutputPath(TestContext); var indexPath = Path.Combine(outputDirectory, "index.json"); - var result = await Bicep(InvocationSettings.Default, "publish-provider", indexPath, "--target", $"asdf:123"); + var result = await Bicep(InvocationSettings.Default, "publish-extension", indexPath, "--target", $"asdf:123"); result.Should().Fail().And.HaveStderrMatch("*The specified module reference scheme \"asdf\" is not recognized.*"); } @@ -160,7 +160,7 @@ public async Task Publish_extension_should_fail_for_missing_index_path() var outputDirectory = FileHelper.GetUniqueTestOutputPath(TestContext); var indexPath = Path.Combine(outputDirectory, "index.json"); - var result = await Bicep(InvocationSettings.Default, "publish-provider", indexPath, "--target", $"br:example.com/test/provider:0.0.1"); + var result = await Bicep(InvocationSettings.Default, "publish-extension", indexPath, "--target", $"br:example.com/test/extension:0.0.1"); result.Should().Fail().And.HaveStderrMatch("*Extension package creation failed: Could not find a part of the path '*'.*"); } @@ -170,7 +170,7 @@ public async Task Publish_extension_should_fail_for_malformed_index() var outputDirectory = FileHelper.GetUniqueTestOutputPath(TestContext); var indexPath = FileHelper.SaveResultFile(TestContext, "index.json", "malformed", outputDirectory); - var result = await Bicep(InvocationSettings.Default, "publish-provider", indexPath, "--target", $"br:example.com/test/provider:0.0.1"); + var result = await Bicep(InvocationSettings.Default, "publish-extension", indexPath, "--target", $"br:example.com/test/extension:0.0.1"); result.Should().Fail().And.HaveStderrMatch("*Extension package creation failed: 'm' is an invalid start of a value.*"); } @@ -189,7 +189,7 @@ public async Task Publish_extension_should_fail_for_missing_referenced_types_jso } """, outputDirectory); - var result = await Bicep(InvocationSettings.Default, "publish-provider", indexPath, "--target", $"br:example.com/test/provider:0.0.1"); + var result = await Bicep(InvocationSettings.Default, "publish-extension", indexPath, "--target", $"br:example.com/test/extension:0.0.1"); result.Should().Fail().And.HaveStderrMatch("*Extension package creation failed: Could not find file '*types.json'.*"); } @@ -209,7 +209,7 @@ public async Task Publish_extension_should_fail_for_malformed_types_json() """, outputDirectory); FileHelper.SaveResultFile(TestContext, "v1/types.json", "malformed", outputDirectory); - var result = await Bicep(InvocationSettings.Default, "publish-provider", indexPath, "--target", $"br:example.com/test/provider:0.0.1"); + var result = await Bicep(InvocationSettings.Default, "publish-extension", indexPath, "--target", $"br:example.com/test/extension:0.0.1"); result.Should().Fail().And.HaveStderrMatch("*Extension package creation failed: 'm' is an invalid start of a value.*"); } @@ -241,7 +241,7 @@ public async Task Publish_extension_should_fail_for_bad_type_location() ] """, outputDirectory); - var result = await Bicep(InvocationSettings.Default, "publish-extension", indexPath, "--target", $"br:example.com/test/provider:0.0.1"); + var result = await Bicep(InvocationSettings.Default, "publish-extension", indexPath, "--target", $"br:example.com/test/extension:0.0.1"); result.Should().Fail().And.HaveStderrMatch("*Extension package creation failed: Index was outside the bounds of the array.*"); } } diff --git a/src/Bicep.Cli.IntegrationTests/RestoreCommandTests.cs b/src/Bicep.Cli.IntegrationTests/RestoreCommandTests.cs index 6c0c5b12b27..ac70e2a0204 100644 --- a/src/Bicep.Cli.IntegrationTests/RestoreCommandTests.cs +++ b/src/Bicep.Cli.IntegrationTests/RestoreCommandTests.cs @@ -221,16 +221,16 @@ public async Task Restore_Artifacts_BackwardsAndForwardsCompatibility(string? me [DataRow(new string[] { "unknown1", BicepMediaTypes.BicepModuleLayerV1Json, "unknown2" }, null)] [DataRow(new string[] { BicepMediaTypes.BicepModuleLayerV1Json, "unknown1", "unknown2" }, null)] [DataRow(new string[] { BicepMediaTypes.BicepModuleLayerV1Json, "unknown1", "unknown1", "unknown2", "unknown2" }, null)] - [DataRow(new string[] { BicepMediaTypes.BicepModuleLayerV1Json, BicepMediaTypes.BicepProviderArtifactLayerV1TarGzip }, null)] + [DataRow(new string[] { BicepMediaTypes.BicepModuleLayerV1Json, BicepMediaTypes.BicepExtensionArtifactLayerV1TarGzip }, null)] // *** Negative Cases *** [DataRow( - new string[] { BicepMediaTypes.BicepProviderArtifactLayerV1TarGzip }, + new string[] { BicepMediaTypes.BicepExtensionArtifactLayerV1TarGzip }, ".*Expected to find a layer with media type application\\/vnd.ms.bicep.module.layer.v1\\+json, but found none.*")] [DataRow( new string[] { }, ".*Expected to find a layer with media type application\\/vnd.ms.bicep.module.layer.v1\\+json, but found none.*")] [DataRow( - new string[] { "unknown", BicepMediaTypes.BicepProviderArtifactLayerV1TarGzip }, + new string[] { "unknown", BicepMediaTypes.BicepExtensionArtifactLayerV1TarGzip }, ".*Expected to find a layer with media type application\\/vnd.ms.bicep.module.layer.v1\\+json, but found none.*")] [DataRow( new string[] { "unknown2", "unknown1" }, @@ -238,9 +238,9 @@ public async Task Restore_Artifacts_BackwardsAndForwardsCompatibility(string? me [DataRow( new string[] { BicepMediaTypes.BicepModuleLayerV1Json, BicepMediaTypes.BicepModuleLayerV1Json }, $".*Did not expect to find multiple layer media types of application\\/vnd.ms.bicep.module.layer.v1\\+json")] - // TODO: doesn't work because provider error handling is still coupled with module error handling. + // TODO: doesn't work because extension error handling is still coupled with module error handling. [DataRow( - new string[] { BicepMediaTypes.BicepProviderArtifactLayerV1TarGzip, BicepMediaTypes.BicepProviderArtifactLayerV1TarGzip }, + new string[] { BicepMediaTypes.BicepExtensionArtifactLayerV1TarGzip, BicepMediaTypes.BicepExtensionArtifactLayerV1TarGzip }, ".*Expected to find a layer with media type application\\/vnd.ms.bicep.module.layer.v1\\+json, but found none.*")] public async Task Restore_Artifacts_LayerMediaTypes(string[] layerMediaTypes, string expectedErrorRegex) { diff --git a/src/Bicep.Cli/Arguments/PublishProviderArguments.cs b/src/Bicep.Cli/Arguments/PublishExtensionArguments.cs similarity index 85% rename from src/Bicep.Cli/Arguments/PublishProviderArguments.cs rename to src/Bicep.Cli/Arguments/PublishExtensionArguments.cs index 06503b6ff11..4413de63753 100644 --- a/src/Bicep.Cli/Arguments/PublishProviderArguments.cs +++ b/src/Bicep.Cli/Arguments/PublishExtensionArguments.cs @@ -5,9 +5,9 @@ namespace Bicep.Cli.Arguments { - public class PublishProviderArguments : ArgumentsBase + public class PublishExtensionArguments : ArgumentsBase { - public PublishProviderArguments(string[] args, string commandName, IOContext io) : base(commandName) + public PublishExtensionArguments(string[] args, string commandName, IOContext io) : base(commandName) { if (commandName.Equals(Constants.Command.PublishProvider, StringComparison.Ordinal)) { @@ -25,12 +25,12 @@ public PublishProviderArguments(string[] args, string commandName, IOContext io) throw new CommandLineException("The --target parameter expects an argument."); } - if (this.TargetProviderReference is not null) + if (this.TargetExtensionReference is not null) { throw new CommandLineException("The --target parameter cannot be specified twice."); } - TargetProviderReference = args[i + 1]; + TargetExtensionReference = args[i + 1]; i++; break; @@ -76,9 +76,9 @@ public PublishProviderArguments(string[] args, string commandName, IOContext io) throw new CommandLineException($"The input file path was not specified."); } - if (TargetProviderReference is null) + if (TargetExtensionReference is null) { - throw new CommandLineException("The target provider was not specified."); + throw new CommandLineException("The target extension was not specified."); } } @@ -86,7 +86,7 @@ public PublishProviderArguments(string[] args, string commandName, IOContext io) public string IndexFile { get; } - public string TargetProviderReference { get; } + public string TargetExtensionReference { get; } public bool Force { get; } } diff --git a/src/Bicep.Cli/Commands/PublishProviderCommand.cs b/src/Bicep.Cli/Commands/PublishExtensionCommand.cs similarity index 70% rename from src/Bicep.Cli/Commands/PublishProviderCommand.cs rename to src/Bicep.Cli/Commands/PublishExtensionCommand.cs index dfa81905987..5726edae6c3 100644 --- a/src/Bicep.Cli/Commands/PublishProviderCommand.cs +++ b/src/Bicep.Cli/Commands/PublishExtensionCommand.cs @@ -12,18 +12,18 @@ using Bicep.Core.Modules; using Bicep.Core.Registry; using Bicep.Core.Registry.Oci; -using Bicep.Core.Registry.Providers; +using Bicep.Core.Registry.Extensions; using Bicep.Core.TypeSystem; using Microsoft.Extensions.Logging; namespace Bicep.Cli.Commands { - public class PublishProviderCommand : ICommand + public class PublishExtensionCommand : ICommand { private readonly IModuleDispatcher moduleDispatcher; private readonly IFileSystem fileSystem; private readonly IOContext ioContext; - public PublishProviderCommand( + public PublishExtensionCommand( IOContext ioContext, IModuleDispatcher moduleDispatcher, IFileSystem fileSystem) @@ -33,9 +33,9 @@ public PublishProviderCommand( this.ioContext = ioContext; } - public async Task RunAsync(PublishProviderArguments args) + public async Task RunAsync(PublishExtensionArguments args) { - ProviderBinary? TryGetBinary(SupportedArchitecture architecture) + ExtensionBinary? TryGetBinary(SupportedArchitecture architecture) { if (args.Binaries.TryGetValue(architecture.Name) is not { } binaryPath) { @@ -50,14 +50,14 @@ public async Task RunAsync(PublishProviderArguments args) var indexPath = PathHelper.ResolvePath(args.IndexFile); var indexUri = PathHelper.FilePathToFileUrl(indexPath); - var providerReference = ValidateReference(args.TargetProviderReference, indexUri); + var reference = ValidateReference(args.TargetExtensionReference, indexUri); var overwriteIfExists = args.Force; BinaryData tarPayload; try { - tarPayload = await TypesV1Archive.GenerateProviderTarStream(this.fileSystem, indexPath); - ValidateProvider(tarPayload); + tarPayload = await TypesV1Archive.GenerateExtensionTarStream(this.fileSystem, indexPath); + ValidateExtension(tarPayload); } catch (Exception exception) { @@ -66,25 +66,25 @@ public async Task RunAsync(PublishProviderArguments args) var binaries = SupportedArchitectures.All.Select(TryGetBinary).WhereNotNull().ToImmutableArray(); - var package = new ProviderPackage( + var package = new ExtensionPackage( Types: tarPayload, LocalDeployEnabled: binaries.Any(), Binaries: binaries); - await this.PublishProviderAsync(providerReference, package, overwriteIfExists); + await this.PublishExtensionAsync(reference, package, overwriteIfExists); return 0; } - private async Task PublishProviderAsync(ArtifactReference target, ProviderPackage package, bool overwriteIfExists) + private async Task PublishExtensionAsync(ArtifactReference target, ExtensionPackage package, bool overwriteIfExists) { try { - // If we don't want to overwrite, ensure provider doesn't exist - if (!overwriteIfExists && await this.moduleDispatcher.CheckProviderExists(target)) + // If we don't want to overwrite, ensure extension doesn't exist + if (!overwriteIfExists && await this.moduleDispatcher.CheckExtensionExists(target)) { throw new BicepException($"The extension \"{target.FullyQualifiedReference}\" already exists. Use --force to overwrite the existing extension."); } - await this.moduleDispatcher.PublishProvider(target, package); + await this.moduleDispatcher.PublishExtension(target, package); } catch (ExternalArtifactException exception) { @@ -92,16 +92,16 @@ private async Task PublishProviderAsync(ArtifactReference target, ProviderPackag } } - private ArtifactReference ValidateReference(string targetProviderReference, Uri targetProviderUri) + private ArtifactReference ValidateReference(string targetReference, Uri targetUri) { - if (!targetProviderReference.StartsWith("br:")) + if (!targetReference.StartsWith("br:")) { // convert to a relative path, as this is the only format supported for the local filesystem - targetProviderUri = PathHelper.FilePathToFileUrl(PathHelper.ResolvePath(targetProviderReference)); - targetProviderReference = Path.GetFileName(targetProviderUri.LocalPath); + targetUri = PathHelper.FilePathToFileUrl(PathHelper.ResolvePath(targetReference)); + targetReference = Path.GetFileName(targetUri.LocalPath); } - if (!this.moduleDispatcher.TryGetArtifactReference(ArtifactType.Provider, targetProviderReference, targetProviderUri).IsSuccess(out var providerReference, out var failureBuilder)) + if (!this.moduleDispatcher.TryGetArtifactReference(ArtifactType.Extension, targetReference, targetUri).IsSuccess(out var extensionReference, out var failureBuilder)) { // TODO: We should probably clean up the dispatcher contract so this sort of thing isn't necessary (unless we change how target module is set in this command) var message = failureBuilder(DiagnosticBuilder.ForDocumentStart()).Message; @@ -109,17 +109,17 @@ private ArtifactReference ValidateReference(string targetProviderReference, Uri throw new BicepException(message); } - if (!this.moduleDispatcher.GetRegistryCapabilities(ArtifactType.Provider, providerReference).HasFlag(RegistryCapabilities.Publish)) + if (!this.moduleDispatcher.GetRegistryCapabilities(ArtifactType.Extension, extensionReference).HasFlag(RegistryCapabilities.Publish)) { - throw new BicepException($"The specified extension target \"{targetProviderReference}\" is not supported."); + throw new BicepException($"The specified extension target \"{targetReference}\" is not supported."); } - return providerReference; + return extensionReference; } - private static void ValidateProvider(BinaryData provider) + private static void ValidateExtension(BinaryData extension) { - using var tempStream = provider.ToStream(); + using var tempStream = extension.ToStream(); var typeLoader = OciTypeLoader.FromStream(tempStream); var index = typeLoader.LoadTypeIndex(); diff --git a/src/Bicep.Cli/Helpers/ServiceCollectionExtensions.cs b/src/Bicep.Cli/Helpers/ServiceCollectionExtensions.cs index eb578dd9fef..8e74c0f0f55 100644 --- a/src/Bicep.Cli/Helpers/ServiceCollectionExtensions.cs +++ b/src/Bicep.Cli/Helpers/ServiceCollectionExtensions.cs @@ -50,7 +50,7 @@ public static IServiceCollection AddCommands(this IServiceCollection services) = .AddSingleton() .AddSingleton() .AddSingleton() - .AddSingleton() + .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() diff --git a/src/Bicep.Cli/Program.cs b/src/Bicep.Cli/Program.cs index a0d9da8c3c6..3327768f1b6 100644 --- a/src/Bicep.Cli/Program.cs +++ b/src/Bicep.Cli/Program.cs @@ -92,11 +92,11 @@ public async Task RunAsync(string[] args, CancellationToken cancellationTok case PublishArguments publishArguments when publishArguments.CommandName == Constants.Command.Publish: // bicep publish [options] return await services.GetRequiredService().RunAsync(publishArguments); - case PublishProviderArguments publishProviderArguments when publishProviderArguments.CommandName == Constants.Command.PublishProvider: // bicep publish-provider [options] - return await services.GetRequiredService().RunAsync(publishProviderArguments); + case PublishExtensionArguments publishProviderArguments when publishProviderArguments.CommandName == Constants.Command.PublishProvider: // bicep publish-provider [options] + return await services.GetRequiredService().RunAsync(publishProviderArguments); - case PublishProviderArguments publishProviderArguments when publishProviderArguments.CommandName == Constants.Command.PublishExtension: // bicep publish-extension [options] - return await services.GetRequiredService().RunAsync(publishProviderArguments); + case PublishExtensionArguments publishProviderArguments when publishProviderArguments.CommandName == Constants.Command.PublishExtension: // bicep publish-extension [options] + return await services.GetRequiredService().RunAsync(publishProviderArguments); case RestoreArguments restoreArguments when restoreArguments.CommandName == Constants.Command.Restore: // bicep restore return await services.GetRequiredService().RunAsync(restoreArguments); diff --git a/src/Bicep.Cli/Services/ArgumentParser.cs b/src/Bicep.Cli/Services/ArgumentParser.cs index 688e9ae7eb5..cbb95be721b 100644 --- a/src/Bicep.Cli/Services/ArgumentParser.cs +++ b/src/Bicep.Cli/Services/ArgumentParser.cs @@ -35,8 +35,8 @@ public static class ArgumentParser Constants.Command.GenerateParamsFile => new GenerateParametersFileArguments(args[1..]), Constants.Command.Decompile => new DecompileArguments(args[1..]), Constants.Command.DecompileParams => new DecompileParamsArguments(args[1..]), - Constants.Command.PublishProvider => new PublishProviderArguments(args[1..], Constants.Command.PublishProvider, io), - Constants.Command.PublishExtension => new PublishProviderArguments(args[1..], Constants.Command.PublishExtension, io), + Constants.Command.PublishProvider => new PublishExtensionArguments(args[1..], Constants.Command.PublishProvider, io), + Constants.Command.PublishExtension => new PublishExtensionArguments(args[1..], Constants.Command.PublishExtension, io), Constants.Command.Publish => new PublishArguments(args[1..], io), Constants.Command.Restore => new RestoreArguments(args[1..]), Constants.Command.Lint => new LintArguments(args[1..]), diff --git a/src/Bicep.Core.IntegrationTests/CentralizedProviderVersionManagementTests.cs b/src/Bicep.Core.IntegrationTests/CentralizedProviderVersionManagementTests.cs index 936d6d8f42e..abcc7357ea4 100644 --- a/src/Bicep.Core.IntegrationTests/CentralizedProviderVersionManagementTests.cs +++ b/src/Bicep.Core.IntegrationTests/CentralizedProviderVersionManagementTests.cs @@ -11,7 +11,7 @@ namespace Bicep.Core.IntegrationTests { [TestClass] - public class CentralizedProviderVersionManagementTests : TestBase + public class CentralizedExtensionVersionManagementTests : TestBase { private ServiceBuilder Services => new ServiceBuilder() .WithFeatureOverrides(new( @@ -19,11 +19,11 @@ public class CentralizedProviderVersionManagementTests : TestBase DynamicTypeLoadingEnabled: true)); [TestMethod] - [DynamicData(nameof(ProvidersConfig_SupportForConfigManagedProviderDeclarationSyntax_When_ProviderIsBuiltIn_TestCases))] - public void ProvidersConfig_SupportForConfigManagedProviderDeclarationSyntax_When_ProviderIsBuiltIn(string providerIdentifier, bool shouldSucceed, (string code, DiagnosticLevel level, string message)[] expectedDiagnostics) + [DynamicData(nameof(ExtensionsConfig_SupportForConfigManagedExtensionDeclarationSyntax_When_ExtensionIsBuiltIn_TestCases))] + public void ExtensionsConfig_SupportForConfigManagedExtensionDeclarationSyntax_When_ExtensionIsBuiltIn(string identifier, bool shouldSucceed, (string code, DiagnosticLevel level, string message)[] expectedDiagnostics) { var result = CompilationHelper.Compile(Services, @$" - extension {providerIdentifier} + extension {identifier} "); if (shouldSucceed) @@ -34,7 +34,7 @@ public void ProvidersConfig_SupportForConfigManagedProviderDeclarationSyntax_Whe result.Should().HaveDiagnostics(expectedDiagnostics); } - public static IEnumerable ProvidersConfig_SupportForConfigManagedProviderDeclarationSyntax_When_ProviderIsBuiltIn_TestCases + public static IEnumerable ExtensionsConfig_SupportForConfigManagedExtensionDeclarationSyntax_When_ExtensionIsBuiltIn_TestCases { get { diff --git a/src/Bicep.Core.IntegrationTests/DynamicAzTypesTests.cs b/src/Bicep.Core.IntegrationTests/DynamicAzTypesTests.cs index 62ec7925722..19cf6153bc2 100644 --- a/src/Bicep.Core.IntegrationTests/DynamicAzTypesTests.cs +++ b/src/Bicep.Core.IntegrationTests/DynamicAzTypesTests.cs @@ -38,15 +38,15 @@ private async Task GetServices() return services; } - private async Task ServicesWithTestProviderArtifact(ArtifactRegistryAddress artifactRegistryAddress, BinaryData artifactPayload) + private async Task ServicesWithTestExtensionArtifact(ArtifactRegistryAddress artifactRegistryAddress, BinaryData artifactPayload) { (var clientFactory, var blobClients) = RegistryUtils.CreateMockRegistryClients(artifactRegistryAddress.ClientDescriptor()); (_, var client) = blobClients.First(); var configResult = await client.UploadBlobAsync(BinaryData.FromString("{}")); var blobResult = await client.UploadBlobAsync(artifactPayload); - var manifest = BicepTestConstants.GetBicepProviderManifest(blobResult.Value, configResult.Value); - await client.SetManifestAsync(manifest, artifactRegistryAddress.ProviderVersion); + var manifest = BicepTestConstants.GetBicepExtensionManifest(blobResult.Value, configResult.Value); + await client.SetManifestAsync(manifest, artifactRegistryAddress.ExtensionVersion); var cacheRoot = FileHelper.GetUniqueTestOutputPath(TestContext); Directory.CreateDirectory(cacheRoot); @@ -94,7 +94,7 @@ public async Task Az_namespace_can_be_used_with_alias() "); result.Should().GenerateATemplate(); - result.Compilation.GetEntrypointSemanticModel().Root.ProviderDeclarations.Should().Contain(x => x.Name.Equals("testAlias")); + result.Compilation.GetEntrypointSemanticModel().Root.ExtensionDeclarations.Should().Contain(x => x.Name.Equals("testAlias")); } [TestMethod] @@ -118,7 +118,7 @@ public async Task Az_namespace_can_be_used_with_bicepconfig_extension_alias() "); result.Should().GenerateATemplate(); - result.Compilation.GetEntrypointSemanticModel().Root.ProviderDeclarations.Should().Contain(x => x.Name.Equals("az")); + result.Compilation.GetEntrypointSemanticModel().Root.ExtensionDeclarations.Should().Contain(x => x.Name.Equals("az")); } [TestMethod] @@ -138,11 +138,11 @@ public async Task Inlined_Az_namespace_alias_is_not_specified_in_config_yields_d } [TestMethod] - public async Task Bicep_module_artifact_specified_in_provider_declaration_syntax_yields_diagnostic() + public async Task Bicep_module_artifact_specified_in_extension_declaration_syntax_yields_diagnostic() { // ARRANGE var fsMock = new MockFileSystem(); - var testArtifact = new ArtifactRegistryAddress(LanguageConstants.BicepPublicMcrRegistry, "bicep/providers/az", "0.2.661"); + var testArtifact = new ArtifactRegistryAddress(LanguageConstants.BicepPublicMcrRegistry, "bicep/extensions/az", "0.2.661"); var clientFactory = RegistryHelper.CreateMockRegistryClients((testArtifact.RegistryAddress, testArtifact.RepositoryPath)).factoryMock; var services = new ServiceBuilder() .WithFileSystem(fsMock) @@ -167,20 +167,20 @@ await RegistryHelper.PublishModuleToRegistryAsync( result.Should().NotGenerateATemplate(); result.Should().HaveDiagnostics( new[] { - ("BCP192", DiagnosticLevel.Error, """Unable to restore the artifact with reference "br:mcr.microsoft.com/bicep/providers/az:0.2.661": The OCI artifact is not a valid Bicep artifact. Expected a provider, but retrieved a module."""), + ("BCP192", DiagnosticLevel.Error, """Unable to restore the artifact with reference "br:mcr.microsoft.com/bicep/extensions/az:0.2.661": The OCI artifact is not a valid Bicep artifact. Expected an extension, but retrieved a module."""), }); } [TestMethod] [DynamicData(nameof(ArtifactRegistryCorruptedPackageNegativeTestScenarios), DynamicDataSourceType.Method)] - public async Task Bicep_compiler_handles_corrupted_provider_package_gracefully( + public async Task Bicep_compiler_handles_corrupted_extension_package_gracefully( BinaryData payload, string innerErrorMessage) { // ARRANGE - var testArtifactAddress = new ArtifactRegistryAddress("biceptestdf.azurecr.io", "bicep/providers/az", "0.0.0-corruptpng"); + var testArtifactAddress = new ArtifactRegistryAddress("biceptestdf.azurecr.io", "bicep/extensions/az", "0.0.0-corruptpng"); - var services = await ServicesWithTestProviderArtifact(testArtifactAddress, payload); + var services = await ServicesWithTestExtensionArtifact(testArtifactAddress, payload); // ACT var result = await CompilationHelper.RestoreAndCompile(services, @$" @@ -190,13 +190,13 @@ public async Task Bicep_compiler_handles_corrupted_provider_package_gracefully( // ASSERT result.Should().NotGenerateATemplate(); result.Should().HaveDiagnostics([ - ("BCP396", DiagnosticLevel.Error, """The referenced provider types artifact has been published with malformed content.""") + ("BCP396", DiagnosticLevel.Error, """The referenced extension types artifact has been published with malformed content.""") ]); } - public record ArtifactRegistryAddress(string RegistryAddress, string RepositoryPath, string ProviderVersion) + public record ArtifactRegistryAddress(string RegistryAddress, string RepositoryPath, string ExtensionVersion) { - public string ToSpecificationString(char delim) => $"br:{RegistryAddress}/{RepositoryPath}{delim}{ProviderVersion}"; + public string ToSpecificationString(char delim) => $"br:{RegistryAddress}/{RepositoryPath}{delim}{ExtensionVersion}"; public (string, string) ClientDescriptor() => (RegistryAddress, RepositoryPath); } @@ -237,13 +237,13 @@ public async Task Repository_not_found_in_registry( public static IEnumerable ArtifactRegistryAddressNegativeTestScenarios() { // constants - const string placeholderProviderVersion = "0.0.0-placeholder"; + const string placeholderExtensionVersion = "0.0.0-placeholder"; // unresolvable host registry. For example if DNS is down or unresponsive const string unreachableRegistryAddress = "unknown.registry.azurecr.io"; const string NoSuchHostMessage = $" (No such host is known. ({unreachableRegistryAddress}:443))"; var AggregateExceptionMessage = $"Retry failed after 4 tries. Retry settings can be adjusted in ClientOptions.Retry or by configuring a custom retry policy in ClientOptions.RetryPolicy.{string.Concat(Enumerable.Repeat(NoSuchHostMessage, 4))}"; - var unreachable = new ArtifactRegistryAddress(unreachableRegistryAddress, "bicep/providers/az", placeholderProviderVersion); + var unreachable = new ArtifactRegistryAddress(unreachableRegistryAddress, "bicep/extensions/az", placeholderExtensionVersion); yield return new object[] { unreachable, new AggregateException(AggregateExceptionMessage), @@ -254,7 +254,7 @@ public static IEnumerable ArtifactRegistryAddressNegativeTestScenarios // manifest not found is thrown when the repository address is not registered and/or the version doesn't exist in the registry const string NotFoundMessage = "The artifact does not exist in the registry."; - var withoutRepo = new ArtifactRegistryAddress(LanguageConstants.BicepPublicMcrRegistry, "unknown/path/az", placeholderProviderVersion); + var withoutRepo = new ArtifactRegistryAddress(LanguageConstants.BicepPublicMcrRegistry, "unknown/path/az", placeholderExtensionVersion); yield return new object[] { withoutRepo, new RequestFailedException(404, NotFoundMessage), @@ -307,7 +307,7 @@ public async Task External_Az_namespace_can_be_loaded_from_configuration() var services = await GetServices(); // Built-In Config contains the following entry: // { - // "implicitProviders": ["az"] + // "implicitExtensions": ["az"] // } services = services.WithConfigurationPatch(c => c.WithExtensions($$""" { @@ -327,10 +327,10 @@ public async Task BuiltIn_Az_namespace_can_be_loaded_from_configuration() var services = await GetServices(); // Built-In Config contains the following entries: // { - // "providers": { + // "extensions": { // "az": "builtin:" // }, - // "implicitProviders": ["az"] + // "implicitExtensions": ["az"] // } var result = await CompilationHelper.RestoreAndCompile(services, ("main.bicep", @$" extension az @@ -340,14 +340,14 @@ extension az } [TestMethod] - public async Task Az_namespace_can_be_loaded_dynamically_using_provider_configuration() + public async Task Az_namespace_can_be_loaded_dynamically_using_extension_configuration() { //ARRANGE var artifactRegistryAddress = new ArtifactRegistryAddress( "fake.azurecr.io", "fake/path/az", "1.0.0-fake"); - var services = await ServicesWithTestProviderArtifact( + var services = await ServicesWithTestExtensionArtifact( artifactRegistryAddress, ThirdPartyTypeHelper.GetTypesTgzBytesFromFiles(("index.json", """{"resources": {}, "resourceFunctions": {}}"""))); services = services.WithConfigurationPatch(c => c.WithExtensions($$""" @@ -362,7 +362,7 @@ extension az //ASSERT result.Should().GenerateATemplate(); result.Template.Should().NotBeNull(); - result.Template.Should().HaveValueAtPath("$.imports.az.version", AzNamespaceType.EmbeddedAzProviderVersion); + result.Template.Should().HaveValueAtPath("$.imports.az.version", AzNamespaceType.EmbeddedAzExtensionVersion); } } } diff --git a/src/Bicep.Core.IntegrationTests/Extensibility/BarNamespaceType.cs b/src/Bicep.Core.IntegrationTests/Extensibility/BarNamespaceType.cs index 5dc4ab6fa7f..e312f8ad1d6 100644 --- a/src/Bicep.Core.IntegrationTests/Extensibility/BarNamespaceType.cs +++ b/src/Bicep.Core.IntegrationTests/Extensibility/BarNamespaceType.cs @@ -21,10 +21,10 @@ public static class BarNamespaceType public static NamespaceSettings Settings { get; } = new( IsSingleton: false, - BicepProviderName: BuiltInName, + BicepExtensionName: BuiltInName, ConfigurationType: GetConfigurationType(), - ArmTemplateProviderName: "Bar", - ArmTemplateProviderVersion: "0.0.1"); + TemplateExtensionName: "Bar", + TemplateExtensionVersion: "0.0.1"); private static ObjectType GetConfigurationType() { diff --git a/src/Bicep.Core.IntegrationTests/Extensibility/FooNamespaceType.cs b/src/Bicep.Core.IntegrationTests/Extensibility/FooNamespaceType.cs index b813ae3497f..b41863acca1 100644 --- a/src/Bicep.Core.IntegrationTests/Extensibility/FooNamespaceType.cs +++ b/src/Bicep.Core.IntegrationTests/Extensibility/FooNamespaceType.cs @@ -21,10 +21,10 @@ public static class FooNamespaceType public static NamespaceSettings Settings { get; } = new( IsSingleton: true, - BicepProviderName: BuiltInName, + BicepExtensionName: BuiltInName, ConfigurationType: null, - ArmTemplateProviderName: "Foo", - ArmTemplateProviderVersion: "1.2.3"); + TemplateExtensionName: "Foo", + TemplateExtensionVersion: "1.2.3"); private class FooTypeProvider : ResourceTypeProviderBase, IResourceTypeProvider { diff --git a/src/Bicep.Core.IntegrationTests/Extensibility/RadiusCompatibilityTests.cs b/src/Bicep.Core.IntegrationTests/Extensibility/RadiusCompatibilityTests.cs index fc0e2efd64f..f42f057d7d7 100644 --- a/src/Bicep.Core.IntegrationTests/Extensibility/RadiusCompatibilityTests.cs +++ b/src/Bicep.Core.IntegrationTests/Extensibility/RadiusCompatibilityTests.cs @@ -31,7 +31,7 @@ private static async Task GetServicesWithPrepublishedTypes() var services = GetServiceBuilder(new MockFileSystem(), registry, repository); var tgzData = ThirdPartyTypeHelper.GetMockRadiusTypesTgz(); - await RegistryHelper.PublishProviderToRegistryAsync(services.Build(), $"br:{registry}/{repository}:1.0.0", tgzData); + await RegistryHelper.PublishExtensionToRegistryAsync(services.Build(), $"br:{registry}/{repository}:1.0.0", tgzData); return services; } diff --git a/src/Bicep.Core.IntegrationTests/Extensibility/TestExtensibilityNamespaceProvider.cs b/src/Bicep.Core.IntegrationTests/Extensibility/TestExtensibilityNamespaceProvider.cs index 21f7457d711..c50fea7fa22 100644 --- a/src/Bicep.Core.IntegrationTests/Extensibility/TestExtensibilityNamespaceProvider.cs +++ b/src/Bicep.Core.IntegrationTests/Extensibility/TestExtensibilityNamespaceProvider.cs @@ -15,10 +15,10 @@ namespace Bicep.Core.IntegrationTests.Extensibility; public class TestExtensibilityNamespaceProvider : NamespaceProvider { - public delegate NamespaceType? NamespaceTypeCreator(string providerName, string aliasName); + public delegate NamespaceType? NamespaceTypeCreator(string extensionName, string aliasName); public static INamespaceProvider CreateWithDefaults() - => Create((providerName, aliasName) => providerName switch + => Create((extensionName, aliasName) => extensionName switch { FooNamespaceType.BuiltInName => FooNamespaceType.Create(aliasName), BarNamespaceType.BuiltInName => BarNamespaceType.Create(aliasName), @@ -38,14 +38,14 @@ public TestExtensibilityNamespaceProvider( private readonly NamespaceTypeCreator namespaceCreatorFunc; - protected override TypeSymbol GetNamespaceTypeForConfigManagedProvider(RootConfiguration rootConfig, IFeatureProvider features, BicepSourceFile sourceFile, ResourceScope targetScope, ArtifactResolutionInfo? artifact, ProviderDeclarationSyntax? syntax, string providerName) + protected override TypeSymbol GetNamespaceTypeForConfigManagedExtension(RootConfiguration rootConfig, IFeatureProvider features, BicepSourceFile sourceFile, ResourceScope targetScope, ArtifactResolutionInfo? artifact, ExtensionDeclarationSyntax? syntax, string extensionName) { - var aliasName = syntax?.Alias?.IdentifierName ?? providerName; - if (namespaceCreatorFunc(providerName, aliasName) is { } namespaceType) + var aliasName = syntax?.Alias?.IdentifierName ?? extensionName; + if (namespaceCreatorFunc(extensionName, aliasName) is { } namespaceType) { return namespaceType; } - return base.GetNamespaceTypeForConfigManagedProvider(rootConfig, features, sourceFile, targetScope, artifact, syntax, providerName); + return base.GetNamespaceTypeForConfigManagedExtension(rootConfig, features, sourceFile, targetScope, artifact, syntax, extensionName); } } diff --git a/src/Bicep.Core.IntegrationTests/RegistryProviderTests.cs b/src/Bicep.Core.IntegrationTests/ExtensionRegistryTests.cs similarity index 70% rename from src/Bicep.Core.IntegrationTests/RegistryProviderTests.cs rename to src/Bicep.Core.IntegrationTests/ExtensionRegistryTests.cs index ec946018255..aeb5cf3f8cf 100644 --- a/src/Bicep.Core.IntegrationTests/RegistryProviderTests.cs +++ b/src/Bicep.Core.IntegrationTests/ExtensionRegistryTests.cs @@ -4,7 +4,7 @@ using System.IO.Abstractions.TestingHelpers; using Bicep.Core.Diagnostics; using Bicep.Core.FileSystem; -using Bicep.Core.Registry.Providers; +using Bicep.Core.Registry.Extensions; using Bicep.Core.UnitTests; using Bicep.Core.UnitTests.Assertions; using Bicep.Core.UnitTests.Baselines; @@ -19,18 +19,18 @@ namespace Bicep.Core.IntegrationTests; [TestClass] -public class RegistryProviderTests : TestBase +public class ExtensionRegistryTests : TestBase { private static readonly FeatureProviderOverrides AllFeaturesEnabled = new(ExtensibilityEnabled: true, ExtensionRegistry: true, DynamicTypeLoadingEnabled: true); private static readonly FeatureProviderOverrides AllFeaturesEnabledForLocalDeploy = new(ExtensibilityEnabled: true, LocalDeployEnabled: true, ExtensionRegistry: true, DynamicTypeLoadingEnabled: true); [TestMethod] [TestCategory(BaselineHelper.BaselineTestCategory)] - [EmbeddedFilesTestData(@"Files/RegistryProviderTests/HttpProvider/types/index.json")] - public void Http_provider_can_be_generated(EmbeddedFile indexJson) + [EmbeddedFilesTestData(@"Files/ExtensionRegistryTests/http/types/index.json")] + public void Http_extension_can_be_generated(EmbeddedFile indexJson) { var baselineFolder = BaselineFolder.BuildOutputFolder(TestContext, indexJson); - var httpTypes = ThirdPartyTypeHelper.GetHttpProviderTypes(); + var httpTypes = ThirdPartyTypeHelper.GetHttpExtensionTypes(); using (new AssertionScope()) { @@ -45,22 +45,22 @@ public void Http_provider_can_be_generated(EmbeddedFile indexJson) } [TestMethod] - public async Task Providers_published_to_a_registry_can_be_compiled() + public async Task Extensions_published_to_a_registry_can_be_compiled() { // types taken from https://github.com/Azure/bicep-registry-providers/tree/21aadf24cd6e8c9c5da2db0d1438df9def548b09/providers/http var fileSystem = FileHelper.CreateMockFileSystemForEmbeddedFiles( - typeof(RegistryProviderTests).Assembly, - "Files/RegistryProviderTests/HttpProvider"); + typeof(ExtensionRegistryTests).Assembly, + "Files/ExtensionRegistryTests/http"); var registry = "example.azurecr.io"; - var repository = $"test/provider/http"; + var repository = $"test/extension/http"; - var services = ProviderTestHelper.GetServiceBuilder(fileSystem, registry, repository, AllFeaturesEnabled); + var services = ExtensionTestHelper.GetServiceBuilder(fileSystem, registry, repository, AllFeaturesEnabled); - await RegistryHelper.PublishProviderToRegistryAsync(services.Build(), "/types/index.json", $"br:{registry}/{repository}:1.2.3"); + await RegistryHelper.PublishExtensionToRegistryAsync(services.Build(), "/types/index.json", $"br:{registry}/{repository}:1.2.3"); var result = await CompilationHelper.RestoreAndCompile(services, """ -extension 'br:example.azurecr.io/test/provider/http:1.2.3' +extension 'br:example.azurecr.io/test/extension/http:1.2.3' resource dadJoke 'request@v1' = { uri: 'https://icanhazdadjoke.com' @@ -76,7 +76,7 @@ public async Task Providers_published_to_a_registry_can_be_compiled() } [TestMethod] - public async Task Providers_published_to_filesystem_can_be_compiled() + public async Task Extensions_published_to_filesystem_can_be_compiled() { var cacheDirectory = FileHelper.GetCacheRootPath(TestContext); Directory.CreateDirectory(cacheDirectory); @@ -86,12 +86,12 @@ public async Task Providers_published_to_filesystem_can_be_compiled() var tempDirectory = FileHelper.GetUniqueTestOutputPath(TestContext); Directory.CreateDirectory(tempDirectory); - var extensionPath = Path.Combine(tempDirectory, "provider.tgz"); - await RegistryHelper.PublishProviderToRegistryAsync(services.Build(), Path.Combine(tempDirectory, extensionPath), typesTgz); + var extensionPath = Path.Combine(tempDirectory, "extension.tgz"); + await RegistryHelper.PublishExtensionToRegistryAsync(services.Build(), Path.Combine(tempDirectory, extensionPath), typesTgz); var bicepPath = Path.Combine(tempDirectory, "main.bicep"); await File.WriteAllTextAsync(bicepPath, """ -extension './provider.tgz' +extension './extension.tgz' resource fooRes 'fooType@v1' = { identifier: 'foo' @@ -117,11 +117,11 @@ public async Task Filesystem_extensions_can_be_compiled() { // See https://github.com/Azure/bicep/issues/14770 for context var typesTgz = ThirdPartyTypeHelper.GetTestTypesTgz(); - var providerTgz = await ProviderV1Archive.Build(new(typesTgz, false, [])); + var extensionTgz = await ExtensionV1Archive.Build(new(typesTgz, false, [])); var result = await CompilationHelper.RestoreAndCompile( ("main.bicep", new(""" -extension '../provider.tgz' +extension '../extension.tgz' resource fooRes 'fooType@v1' = { identifier: 'foo' @@ -136,7 +136,7 @@ public async Task Filesystem_extensions_can_be_compiled() "extensionRegistry": true } } -""")), ("../provider.tgz", providerTgz)); +""")), ("../extension.tgz", extensionTgz)); result.Should().NotHaveAnyDiagnostics(); } @@ -146,11 +146,11 @@ public async Task Filesystem_extensions_can_be_compiled_bicepconfig() { // See https://github.com/Azure/bicep/issues/14770 for context var typesTgz = ThirdPartyTypeHelper.GetTestTypesTgz(); - var providerTgz = await ProviderV1Archive.Build(new(typesTgz, false, [])); + var extensionTgz = await ExtensionV1Archive.Build(new(typesTgz, false, [])); var result = await CompilationHelper.RestoreAndCompile( ("main.bicep", new(""" -extension myProvider +extension myExtension resource fooRes 'fooType@v1' = { identifier: 'foo' @@ -161,14 +161,14 @@ extension myProvider """)), ("../bicepconfig.json", new(""" { "extensions": { - "myProvider": "./provider.tgz" + "myExtension": "./extension.tgz" }, "experimentalFeaturesEnabled": { "extensibility": true, "extensionRegistry": true } } -""")), ("../provider.tgz", providerTgz)); +""")), ("../extension.tgz", extensionTgz)); result.Should().NotHaveAnyDiagnostics(); } @@ -223,10 +223,10 @@ extension nonExistent [TestMethod] public async Task Existing_resources_are_permitted_through_3p_type_registry() { - var services = await ProviderTestHelper.GetServiceBuilderWithPublishedProvider(ThirdPartyTypeHelper.GetTestTypesTgz(), AllFeaturesEnabled); + var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetTestTypesTgz(), AllFeaturesEnabled); var result = await CompilationHelper.RestoreAndCompile(services, """ -extension 'br:example.azurecr.io/providers/foo:1.2.3' +extension 'br:example.azurecr.io/extensions/foo:1.2.3' resource fooRes 'fooType@v1' existing = { } @@ -238,7 +238,7 @@ public async Task Existing_resources_are_permitted_through_3p_type_registry() }); result = await CompilationHelper.RestoreAndCompile(services, """ -extension 'br:example.azurecr.io/providers/foo:1.2.3' +extension 'br:example.azurecr.io/extensions/foo:1.2.3' resource fooRes 'fooType@v1' existing = { identifier: 'foo' @@ -253,18 +253,18 @@ public async Task Third_party_namespace_errors_with_configuration() { // types taken from https://github.com/Azure/bicep-registry-providers/tree/21aadf24cd6e8c9c5da2db0d1438df9def548b09/providers/http var fileSystem = FileHelper.CreateMockFileSystemForEmbeddedFiles( - typeof(RegistryProviderTests).Assembly, - "Files/RegistryProviderTests/HttpProvider"); + typeof(ExtensionRegistryTests).Assembly, + "Files/ExtensionRegistryTests/http"); var registry = "example.azurecr.io"; - var repository = $"test/provider/http"; + var repository = $"test/extension/http"; - var services = ProviderTestHelper.GetServiceBuilder(fileSystem, registry, repository, AllFeaturesEnabled); + var services = ExtensionTestHelper.GetServiceBuilder(fileSystem, registry, repository, AllFeaturesEnabled); - await RegistryHelper.PublishProviderToRegistryAsync(services.Build(), "/types/index.json", $"br:{registry}/{repository}:1.2.3"); + await RegistryHelper.PublishExtensionToRegistryAsync(services.Build(), "/types/index.json", $"br:{registry}/{repository}:1.2.3"); var result = await CompilationHelper.RestoreAndCompile(services, """ -extension 'br:example.azurecr.io/test/provider/http:1.2.3' with {} +extension 'br:example.azurecr.io/test/extension/http:1.2.3' with {} resource dadJoke 'request@v1' = { uri: 'https://icanhazdadjoke.com' @@ -284,10 +284,10 @@ public async Task Third_party_namespace_errors_with_configuration() [TestMethod] public async Task Resource_function_types_are_permitted_through_3p_type_registry() { - var services = await ProviderTestHelper.GetServiceBuilderWithPublishedProvider(ThirdPartyTypeHelper.GetTestTypesTgz(), AllFeaturesEnabled); + var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetTestTypesTgz(), AllFeaturesEnabled); var result = await CompilationHelper.RestoreAndCompile(services, """ -extension 'br:example.azurecr.io/providers/foo:1.2.3' +extension 'br:example.azurecr.io/extensions/foo:1.2.3' resource fooRes 'fooType@v1' existing = { identifier: 'foo' @@ -301,15 +301,15 @@ public async Task Resource_function_types_are_permitted_through_3p_type_registry } [TestMethod] - public async Task Implicit_providers_are_permitted_through_3p_type_registry() + public async Task Implicit_extensions_are_permitted_through_3p_type_registry() { var fileSystem = new MockFileSystem(); - var services = await ProviderTestHelper.GetServiceBuilderWithPublishedProvider(ThirdPartyTypeHelper.GetTestTypesTgz(), AllFeaturesEnabled, fileSystem); + var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetTestTypesTgz(), AllFeaturesEnabled, fileSystem); fileSystem.File.WriteAllText("/bicepconfig.json", """ { "extensions": { - "foo": "br:example.azurecr.io/providers/foo:1.2.3" + "foo": "br:example.azurecr.io/extensions/foo:1.2.3" }, "implicitExtensions": ["foo"], "experimentalFeaturesEnabled": { @@ -335,18 +335,18 @@ public async Task Implicit_providers_are_permitted_through_3p_type_registry() public async Task Third_party_imports_are_enabled_when_feature_is_enabled() { var fileSystem = FileHelper.CreateMockFileSystemForEmbeddedFiles( - typeof(RegistryProviderTests).Assembly, - "Files/RegistryProviderTests/HttpProvider"); + typeof(ExtensionRegistryTests).Assembly, + "Files/ExtensionRegistryTests/http"); var registry = "example.azurecr.io"; - var repository = $"test/provider/http"; + var repository = $"test/extension/http"; - var services = ProviderTestHelper.GetServiceBuilder(fileSystem, registry, repository, AllFeaturesEnabled); + var services = ExtensionTestHelper.GetServiceBuilder(fileSystem, registry, repository, AllFeaturesEnabled); - await RegistryHelper.PublishProviderToRegistryAsync(services.Build(), "/types/index.json", $"br:{registry}/{repository}:1.2.3"); + await RegistryHelper.PublishExtensionToRegistryAsync(services.Build(), "/types/index.json", $"br:{registry}/{repository}:1.2.3"); var result = await CompilationHelper.RestoreAndCompile(services, @$" -extension 'br:example.azurecr.io/test/provider/http:1.2.3' +extension 'br:example.azurecr.io/test/extension/http:1.2.3' "); result.Should().NotHaveAnyDiagnostics(); result.Template.Should().NotBeNull(); @@ -381,28 +381,28 @@ public async Task Third_party_imports_are_enabled_when_feature_is_enabled() public async Task Third_party_imports_are_disabled_unless_feature_is_enabled() { var fileSystem = FileHelper.CreateMockFileSystemForEmbeddedFiles( - typeof(RegistryProviderTests).Assembly, - "Files/RegistryProviderTests/HttpProvider"); + typeof(ExtensionRegistryTests).Assembly, + "Files/ExtensionRegistryTests/http"); var registry = "example.azurecr.io"; - var repository = $"test/provider/http"; + var repository = $"test/extension/http"; - var services = ProviderTestHelper.GetServiceBuilder(fileSystem, registry, repository, new()); + var services = ExtensionTestHelper.GetServiceBuilder(fileSystem, registry, repository, new()); - await RegistryHelper.PublishProviderToRegistryAsync(services.Build(), "/types/index.json", $"br:{registry}/{repository}:1.2.3"); + await RegistryHelper.PublishExtensionToRegistryAsync(services.Build(), "/types/index.json", $"br:{registry}/{repository}:1.2.3"); var result = await CompilationHelper.RestoreAndCompile(services, @$" -extension 'br:example.azurecr.io/test/provider/http:1.2.3' +extension 'br:example.azurecr.io/test/extension/http:1.2.3' "); result.Should().HaveDiagnostics([ ("BCP203", DiagnosticLevel.Error, "Using extension declaration requires enabling EXPERIMENTAL feature \"Extensibility\"."), ]); - services = ProviderTestHelper.GetServiceBuilder(fileSystem, registry, repository, new(ExtensibilityEnabled: true)); + services = ExtensionTestHelper.GetServiceBuilder(fileSystem, registry, repository, new(ExtensibilityEnabled: true)); var result2 = await CompilationHelper.RestoreAndCompile(services, @$" -extension 'br:example.azurecr.io/test/provider/http:1.2.3' +extension 'br:example.azurecr.io/test/extension/http:1.2.3' "); result2.Should().HaveDiagnostics([ ("BCP400", DiagnosticLevel.Error, """Fetching types from the registry requires enabling EXPERIMENTAL feature "ExtensionRegistry"."""), @@ -410,27 +410,27 @@ public async Task Third_party_imports_are_disabled_unless_feature_is_enabled() } [TestMethod] - public async Task Using_interpolated_strings_in_provider_declaration_syntax_results_in_diagnostic() + public async Task Using_interpolated_strings_in_extension_declaration_syntax_results_in_diagnostic() { var services = new ServiceBuilder() .WithFeatureOverrides(AllFeaturesEnabled); var result = await CompilationHelper.RestoreAndCompile(services, """ var registryHost = 'example.azurecr.io' -extension 'br:${registryHost}/test/provider/http:1.2.3' +extension 'br:${registryHost}/test/extension/http:1.2.3' """); result.Should().NotGenerateATemplate(); - result.Should().ContainDiagnostic("BCP303", DiagnosticLevel.Error, "String interpolation is unsupported for specifying the provider."); + result.Should().ContainDiagnostic("BCP303", DiagnosticLevel.Error, "String interpolation is unsupported for specifying the extension."); } [TestMethod] public async Task Cannot_import_az_without_dynamic_type_loading_enabled() { - var services = await ProviderTestHelper.GetServiceBuilderWithPublishedProvider(ThirdPartyTypeHelper.GetTestTypesTgz(), "mcr.microsoft.com/bicep/provider/az:1.2.3", AllFeaturesEnabled); + var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetTestTypesTgz(), "mcr.microsoft.com/bicep/extension/az:1.2.3", AllFeaturesEnabled); services = services.WithFeatureOverrides(new(ExtensibilityEnabled: true, DynamicTypeLoadingEnabled: false)); var result = await CompilationHelper.RestoreAndCompile(services, @" -extension 'br:mcr.microsoft.com/bicep/provider/az:1.2.3' +extension 'br:mcr.microsoft.com/bicep/extension/az:1.2.3' "); result.Should().NotGenerateATemplate(); result.Should().HaveDiagnostics([ @@ -439,12 +439,12 @@ public async Task Cannot_import_az_without_dynamic_type_loading_enabled() } [TestMethod] - public async Task Missing_required_provider_configuration_blocks_compilation() + public async Task Missing_required_extension_configuration_blocks_compilation() { - var services = await ProviderTestHelper.GetServiceBuilderWithPublishedProvider(ThirdPartyTypeHelper.GetTestTypesTgzWithFallbackAndConfiguration(), AllFeaturesEnabled); + var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetTestTypesTgzWithFallbackAndConfiguration(), AllFeaturesEnabled); var result = await CompilationHelper.RestoreAndCompile(services, """ -extension 'br:example.azurecr.io/providers/foo:1.2.3' +extension 'br:example.azurecr.io/extensions/foo:1.2.3' resource dadJoke 'fooType@v1' = { identifier: 'foo' @@ -456,18 +456,18 @@ public async Task Missing_required_provider_configuration_blocks_compilation() result.Should().NotGenerateATemplate(); result.Should().HaveDiagnostics(new[]{ - ("BCP206", DiagnosticLevel.Error, "Extension \"ThirdPartyProvider\" requires configuration, but none was provided.") + ("BCP206", DiagnosticLevel.Error, "Extension \"ThirdPartyExtension\" requires configuration, but none was provided.") }); } [TestMethod] - public async Task Correct_local_deploy_provider_configuration_result_in_successful_compilation() + public async Task Correct_local_deploy_extension_configuration_result_in_successful_compilation() { // tgzData provideds configType with the properties namespace, config, and context - var services = await ProviderTestHelper.GetServiceBuilderWithPublishedProvider(ThirdPartyTypeHelper.GetTestTypesTgzWithFallbackAndConfiguration(), AllFeaturesEnabledForLocalDeploy); + var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetTestTypesTgzWithFallbackAndConfiguration(), AllFeaturesEnabledForLocalDeploy); var result = await CompilationHelper.RestoreAndCompile(services, """ -extension 'br:example.azurecr.io/providers/foo:1.2.3' with { +extension 'br:example.azurecr.io/extensions/foo:1.2.3' with { namespace: 'ThirdPartyNamespace' config: 'Some path to config file' context: 'Some ThirdParty context' @@ -483,27 +483,27 @@ public async Task Correct_local_deploy_provider_configuration_result_in_successf result.Template.Should().NotBeNull(); - result.Template.Should().HaveValueAtPath("$.extensions['ThirdPartyProvider']['name']", "ThirdPartyProvider"); - result.Template.Should().HaveValueAtPath("$.extensions['ThirdPartyProvider']['version']", "1.0.0"); + result.Template.Should().HaveValueAtPath("$.extensions['ThirdPartyExtension']['name']", "ThirdPartyExtension"); + result.Template.Should().HaveValueAtPath("$.extensions['ThirdPartyExtension']['version']", "1.0.0"); - result.Template.Should().HaveValueAtPath("$.extensions['ThirdPartyProvider']['config']['namespace']['type']", "string"); - result.Template.Should().HaveValueAtPath("$.extensions['ThirdPartyProvider']['config']['namespace']['defaultValue']", "ThirdPartyNamespace"); - result.Template.Should().HaveValueAtPath("$.extensions['ThirdPartyProvider']['config']['config']['type']", "string"); - result.Template.Should().HaveValueAtPath("$.extensions['ThirdPartyProvider']['config']['config']['defaultValue']", "Some path to config file"); - result.Template.Should().HaveValueAtPath("$.extensions['ThirdPartyProvider']['config']['context']['type']", "string"); - result.Template.Should().HaveValueAtPath("$.extensions['ThirdPartyProvider']['config']['context']['defaultValue']", "Some ThirdParty context"); + result.Template.Should().HaveValueAtPath("$.extensions['ThirdPartyExtension']['config']['namespace']['type']", "string"); + result.Template.Should().HaveValueAtPath("$.extensions['ThirdPartyExtension']['config']['namespace']['defaultValue']", "ThirdPartyNamespace"); + result.Template.Should().HaveValueAtPath("$.extensions['ThirdPartyExtension']['config']['config']['type']", "string"); + result.Template.Should().HaveValueAtPath("$.extensions['ThirdPartyExtension']['config']['config']['defaultValue']", "Some path to config file"); + result.Template.Should().HaveValueAtPath("$.extensions['ThirdPartyExtension']['config']['context']['type']", "string"); + result.Template.Should().HaveValueAtPath("$.extensions['ThirdPartyExtension']['config']['context']['defaultValue']", "Some ThirdParty context"); result.Should().NotHaveAnyDiagnostics(); } [TestMethod] - public async Task Local_deploy_provider_with_configuration_defined_and_empty_configuration_provided_throws_errors() + public async Task Local_deploy_extension_with_configuration_defined_and_empty_configuration_provided_throws_errors() { // tgzData provideds configType with the properties namespace, config, and context - var services = await ProviderTestHelper.GetServiceBuilderWithPublishedProvider(ThirdPartyTypeHelper.GetTestTypesTgzWithFallbackAndConfiguration(), AllFeaturesEnabledForLocalDeploy); + var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetTestTypesTgzWithFallbackAndConfiguration(), AllFeaturesEnabledForLocalDeploy); var result = await CompilationHelper.RestoreAndCompile(services, """ -extension 'br:example.azurecr.io/providers/foo:1.2.3' with { } +extension 'br:example.azurecr.io/extensions/foo:1.2.3' with { } resource dadJoke 'fooType@v1' = { identifier: 'foo' @@ -515,16 +515,16 @@ public async Task Local_deploy_provider_with_configuration_defined_and_empty_con result.Template.Should().BeNull(); - result.Should().HaveDiagnostics([("BCP035", DiagnosticLevel.Error, "The specified \"object\" declaration is missing the following required properties: \"config\", \"namespace\".")], because: "Type checking should block the template compilation because required provider config properties hasn't been supplied."); + result.Should().HaveDiagnostics([("BCP035", DiagnosticLevel.Error, "The specified \"object\" declaration is missing the following required properties: \"config\", \"namespace\".")], because: "Type checking should block the template compilation because required extension config properties hasn't been supplied."); } [TestMethod] - public async Task Local_deploy_provider_without_configuration_defined_but_configuration_provided_throws_errors() + public async Task Local_deploy_extension_without_configuration_defined_but_configuration_provided_throws_errors() { - var services = await ProviderTestHelper.GetServiceBuilderWithPublishedProvider(ThirdPartyTypeHelper.GetTestTypesTgz(), AllFeaturesEnabledForLocalDeploy); + var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetTestTypesTgz(), AllFeaturesEnabledForLocalDeploy); var result = await CompilationHelper.RestoreAndCompile(services, """ -extension 'br:example.azurecr.io/providers/foo:1.2.3' with { +extension 'br:example.azurecr.io/extensions/foo:1.2.3' with { namespace: 'ThirdPartyNamespace' config: 'Some path to config file' context: 'Some ThirdParty context' @@ -540,17 +540,17 @@ public async Task Local_deploy_provider_without_configuration_defined_but_config result.Template.Should().BeNull(); - result.Should().HaveDiagnostics([("BCP205", DiagnosticLevel.Error, "Extension \"ThirdPartyProvider\" does not support configuration.")], because: "Type checking should block the template compilation because provider does not support configuration but one has been provided."); + result.Should().HaveDiagnostics([("BCP205", DiagnosticLevel.Error, "Extension \"ThirdPartyExtension\" does not support configuration.")], because: "Type checking should block the template compilation because extension does not support configuration but one has been provided."); } [TestMethod] - public async Task Correct_provider_configuration_result_in_successful_compilation() + public async Task Correct_extension_configuration_result_in_successful_compilation() { // tgzData provideds configType with the properties namespace, config, and context - var services = await ProviderTestHelper.GetServiceBuilderWithPublishedProvider(ThirdPartyTypeHelper.GetTestTypesTgzWithFallbackAndConfiguration(), AllFeaturesEnabled); + var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetTestTypesTgzWithFallbackAndConfiguration(), AllFeaturesEnabled); var result = await CompilationHelper.RestoreAndCompile(services, """ -extension 'br:example.azurecr.io/providers/foo:1.2.3' with { +extension 'br:example.azurecr.io/extensions/foo:1.2.3' with { namespace: 'ThirdPartyNamespace' config: 'Some path to config file' context: 'Some ThirdParty context' @@ -566,12 +566,12 @@ public async Task Correct_provider_configuration_result_in_successful_compilatio result.Template.Should().NotBeNull(); - result.Template.Should().HaveValueAtPath("$.imports['ThirdPartyProvider']['provider']", "ThirdPartyProvider"); - result.Template.Should().HaveValueAtPath("$.imports['ThirdPartyProvider']['version']", "1.0.0"); + result.Template.Should().HaveValueAtPath("$.imports['ThirdPartyExtension']['provider']", "ThirdPartyExtension"); + result.Template.Should().HaveValueAtPath("$.imports['ThirdPartyExtension']['version']", "1.0.0"); - result.Template.Should().HaveValueAtPath("$.imports['ThirdPartyProvider']['config']['namespace']", "ThirdPartyNamespace"); - result.Template.Should().HaveValueAtPath("$.imports['ThirdPartyProvider']['config']['config']", "Some path to config file"); - result.Template.Should().HaveValueAtPath("$.imports['ThirdPartyProvider']['config']['context']", "Some ThirdParty context"); + result.Template.Should().HaveValueAtPath("$.imports['ThirdPartyExtension']['config']['namespace']", "ThirdPartyNamespace"); + result.Template.Should().HaveValueAtPath("$.imports['ThirdPartyExtension']['config']['config']", "Some path to config file"); + result.Template.Should().HaveValueAtPath("$.imports['ThirdPartyExtension']['config']['context']", "Some ThirdParty context"); result.Should().NotHaveAnyDiagnostics(); } @@ -579,11 +579,11 @@ public async Task Correct_provider_configuration_result_in_successful_compilatio [TestMethod] public async Task Missing_configuration_property_throws_errors() { - var services = await ProviderTestHelper.GetServiceBuilderWithPublishedProvider(ThirdPartyTypeHelper.GetTestTypesTgzWithFallbackAndConfiguration(), AllFeaturesEnabled); + var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetTestTypesTgzWithFallbackAndConfiguration(), AllFeaturesEnabled); // Missing the required configuration property: namespace var result = await CompilationHelper.RestoreAndCompile(services, """ -extension 'br:example.azurecr.io/providers/foo:1.2.3' with { +extension 'br:example.azurecr.io/extensions/foo:1.2.3' with { config: 'Some path to config file' context: 'Some ThirdParty context' } @@ -605,11 +605,11 @@ public async Task Missing_configuration_property_throws_errors() [TestMethod] public async Task Misspelled_required_configuration_property_throws_error() { - var services = await ProviderTestHelper.GetServiceBuilderWithPublishedProvider(ThirdPartyTypeHelper.GetTestTypesTgzWithFallbackAndConfiguration(), AllFeaturesEnabled); + var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetTestTypesTgzWithFallbackAndConfiguration(), AllFeaturesEnabled); // Misspelled the required configuration property: namespace var result = await CompilationHelper.RestoreAndCompile(services, """ -extension 'br:example.azurecr.io/providers/foo:1.2.3' with { +extension 'br:example.azurecr.io/extensions/foo:1.2.3' with { namespac: 'ThirdPartyNamespace' config: 'Some path to config file' context: 'Some ThirdParty context' @@ -633,11 +633,11 @@ public async Task Misspelled_required_configuration_property_throws_error() [TestMethod] public async Task Misspelled_optional_configuration_property_throws_error() { - var services = await ProviderTestHelper.GetServiceBuilderWithPublishedProvider(ThirdPartyTypeHelper.GetTestTypesTgzWithFallbackAndConfiguration(), AllFeaturesEnabled); + var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetTestTypesTgzWithFallbackAndConfiguration(), AllFeaturesEnabled); // Misspelled the optional configuration property: context var result = await CompilationHelper.RestoreAndCompile(services, """ -extension 'br:example.azurecr.io/providers/foo:1.2.3' with { +extension 'br:example.azurecr.io/extensions/foo:1.2.3' with { namespace: 'ThirdPartyNamespace' config: 'Some path to config file' contex: 'Some ThirdParty context' @@ -660,10 +660,10 @@ public async Task Misspelled_optional_configuration_property_throws_error() [TestMethod] public async Task Warning_generated_and_fallback_type_type_accepted() { - var services = await ProviderTestHelper.GetServiceBuilderWithPublishedProvider(ThirdPartyTypeHelper.GetTestTypesTgzWithFallbackAndConfiguration(), AllFeaturesEnabled); + var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetTestTypesTgzWithFallbackAndConfiguration(), AllFeaturesEnabled); var result = await CompilationHelper.RestoreAndCompile(services, """ -extension 'br:example.azurecr.io/providers/foo:1.2.3' with { +extension 'br:example.azurecr.io/extensions/foo:1.2.3' with { namespace: 'ThirdPartyNamespace' config: 'Some path to config file' } @@ -686,10 +686,10 @@ public async Task Warning_generated_and_fallback_type_type_accepted() public async Task Fallback_not_provided_in_json() { // tgzData does have fallback type - var services = await ProviderTestHelper.GetServiceBuilderWithPublishedProvider(ThirdPartyTypeHelper.GetTestTypesTgz(), AllFeaturesEnabled); + var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetTestTypesTgz(), AllFeaturesEnabled); var result = await CompilationHelper.RestoreAndCompile(services, """ -extension 'br:example.azurecr.io/providers/foo:1.2.3' +extension 'br:example.azurecr.io/extensions/foo:1.2.3' resource test 'test@v1' = { bodyProp: 'fallback body' @@ -703,16 +703,16 @@ public async Task Fallback_not_provided_in_json() } [TestMethod] - public async Task Provider_imports_can_be_defined_in_config() + public async Task Extension_imports_can_be_defined_in_config() { var fileSystem = new MockFileSystem(); - var services = await ProviderTestHelper.GetServiceBuilderWithPublishedProvider(ThirdPartyTypeHelper.GetTestTypesTgz(), AllFeaturesEnabled, fileSystem); + var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetTestTypesTgz(), AllFeaturesEnabled, fileSystem); // incorrect extension version - verify it returns an error fileSystem.File.WriteAllText("/bicepconfig.json", """ { "extensions": { - "foo": "br:example.azurecr.io/providers/foo:1.2.4" + "foo": "br:example.azurecr.io/extensions/foo:1.2.4" }, "experimentalFeaturesEnabled": { "extensibility": true, @@ -726,14 +726,14 @@ extension foo result.Should().NotGenerateATemplate(); result.ExcludingLinterDiagnostics().Should().HaveDiagnostics(new[] { - ("BCP192", DiagnosticLevel.Error, """Unable to restore the artifact with reference "br:example.azurecr.io/providers/foo:1.2.4": The artifact does not exist in the registry.""") + ("BCP192", DiagnosticLevel.Error, """Unable to restore the artifact with reference "br:example.azurecr.io/extensions/foo:1.2.4": The artifact does not exist in the registry.""") }); // correct extension version fileSystem.File.WriteAllText("/bicepconfig.json", """ { "extensions": { - "foo": "br:example.azurecr.io/providers/foo:1.2.3" + "foo": "br:example.azurecr.io/extensions/foo:1.2.3" }, "experimentalFeaturesEnabled": { "extensibility": true, @@ -758,7 +758,7 @@ extension foo fileSystem.File.WriteAllText("/bicepconfig.json", """ { "extensions": { - "foo": "br:example.azurecr.io/providers/foo:1.2.3" + "foo": "br:example.azurecr.io/extensions/foo:1.2.3" }, "implicitExtensions": ["foo"], "experimentalFeaturesEnabled": { diff --git a/src/Bicep.Core.IntegrationTests/Files/RegistryProviderTests/HttpProvider/types/index.json b/src/Bicep.Core.IntegrationTests/Files/ExtensionRegistryTests/http/types/index.json similarity index 100% rename from src/Bicep.Core.IntegrationTests/Files/RegistryProviderTests/HttpProvider/types/index.json rename to src/Bicep.Core.IntegrationTests/Files/ExtensionRegistryTests/http/types/index.json diff --git a/src/Bicep.Core.IntegrationTests/Files/RegistryProviderTests/HttpProvider/types/v1/types.json b/src/Bicep.Core.IntegrationTests/Files/ExtensionRegistryTests/http/types/v1/types.json similarity index 100% rename from src/Bicep.Core.IntegrationTests/Files/RegistryProviderTests/HttpProvider/types/v1/types.json rename to src/Bicep.Core.IntegrationTests/Files/ExtensionRegistryTests/http/types/v1/types.json diff --git a/src/Bicep.Core.IntegrationTests/ProviderImportTests.cs b/src/Bicep.Core.IntegrationTests/ProviderImportTests.cs index 60487a0d37b..5064f4ff258 100644 --- a/src/Bicep.Core.IntegrationTests/ProviderImportTests.cs +++ b/src/Bicep.Core.IntegrationTests/ProviderImportTests.cs @@ -257,10 +257,10 @@ public async Task Ambiguous_function_references_must_be_qualified() "ns1", new NamespaceSettings( IsSingleton: true, - BicepProviderName: "ns1", + BicepExtensionName: "ns1", ConfigurationType: null, - ArmTemplateProviderName: "Ns1-Unused", - ArmTemplateProviderVersion: "1.0"), + TemplateExtensionName: "Ns1-Unused", + TemplateExtensionVersion: "1.0"), ImmutableArray.Empty, new[] { new FunctionOverloadBuilder("ns1Func").Build(), @@ -274,10 +274,10 @@ public async Task Ambiguous_function_references_must_be_qualified() "ns2", new NamespaceSettings( IsSingleton: true, - BicepProviderName: "ns2", + BicepExtensionName: "ns2", ConfigurationType: null, - ArmTemplateProviderName: "Ns2-Unused", - ArmTemplateProviderVersion: "1.0"), + TemplateExtensionName: "Ns2-Unused", + TemplateExtensionVersion: "1.0"), ImmutableArray.Empty, new[] { new FunctionOverloadBuilder("ns2Func").Build(), @@ -287,7 +287,7 @@ public async Task Ambiguous_function_references_must_be_qualified() ImmutableArray.Empty, new EmptyResourceTypeProvider()); - var nsProvider = TestExtensibilityNamespaceProvider.Create((providerName, aliasName) => providerName switch + var nsProvider = TestExtensibilityNamespaceProvider.Create((extensionName, aliasName) => extensionName switch { "ns1" => ns1, "ns2" => ns2, @@ -337,7 +337,7 @@ public async Task Config_with_optional_properties_can_be_skipped() "mockNs", new( IsSingleton: false, - BicepProviderName: "mockNs", + BicepExtensionName: "mockNs", ConfigurationType: new ObjectType( "mockNs", TypeSymbolValidationFlags.Default, @@ -346,15 +346,15 @@ public async Task Config_with_optional_properties_can_be_skipped() new TypeProperty("optionalConfig", LanguageConstants.String, TypePropertyFlags.DeployTimeConstant), }, null), - ArmTemplateProviderName: "Unused", - ArmTemplateProviderVersion: "1.0.0"), + TemplateExtensionName: "Unused", + TemplateExtensionVersion: "1.0.0"), ImmutableArray.Empty, ImmutableArray.Empty, ImmutableArray.Empty, ImmutableArray.Empty, new EmptyResourceTypeProvider()); - var nsProvider = TestExtensibilityNamespaceProvider.Create((providerName, aliasName) => providerName switch + var nsProvider = TestExtensibilityNamespaceProvider.Create((extensionName, aliasName) => extensionName switch { "mockNs" => mockNs, _ => null, diff --git a/src/Bicep.Core.IntegrationTests/Semantics/SemanticModelTests.cs b/src/Bicep.Core.IntegrationTests/Semantics/SemanticModelTests.cs index 34fbf5e8eab..62b79f8f153 100644 --- a/src/Bicep.Core.IntegrationTests/Semantics/SemanticModelTests.cs +++ b/src/Bicep.Core.IntegrationTests/Semantics/SemanticModelTests.cs @@ -130,7 +130,7 @@ s is ModuleSymbol || s is OutputSymbol || s is FunctionSymbol || s is DeclaredFunctionSymbol || - s is ProviderNamespaceSymbol || + s is ExtensionNamespaceSymbol || s is BuiltInNamespaceSymbol || s is LocalVariableSymbol || s is TestSymbol || @@ -154,7 +154,7 @@ s is ModuleSymbol || s is OutputSymbol || s is FunctionSymbol || s is DeclaredFunctionSymbol || - s is ProviderNamespaceSymbol || + s is ExtensionNamespaceSymbol || s is BuiltInNamespaceSymbol || s is LocalVariableSymbol || s is TestSymbol || diff --git a/src/Bicep.Core.IntegrationTests/TypeSystem/Providers/ResourceTypeProviderFactoryTests.cs b/src/Bicep.Core.IntegrationTests/TypeSystem/Providers/ResourceTypeProviderFactoryTests.cs index 7cce56382b5..2dc67ce3c18 100644 --- a/src/Bicep.Core.IntegrationTests/TypeSystem/Providers/ResourceTypeProviderFactoryTests.cs +++ b/src/Bicep.Core.IntegrationTests/TypeSystem/Providers/ResourceTypeProviderFactoryTests.cs @@ -17,15 +17,15 @@ public class ResourceTypeProviderFactoryTests public TestContext? TestContext { get; set; } [TestMethod] - public async Task ProviderNameAndVersionAreUsedAsCacheKeys() + public async Task ExtensionNameAndVersionAreUsedAsCacheKeys() { var outputDirectory = FileHelper.SaveEmbeddedResourcesWithPathPrefix( TestContext, - typeof(RegistryProviderTests).Assembly, - "Files/RegistryProviderTests/HttpProvider"); + typeof(ExtensionRegistryTests).Assembly, + "Files/ExtensionRegistryTests/http"); var registry = "example.azurecr.io"; - var repositoryPath = $"test/provider"; + var repositoryPath = $"test/extension"; var repositoryNames = new[] { "foo", "bar" }; var (clientFactory, _) = RegistryHelper.CreateMockRegistryClients(repositoryNames.Select(name => (registry, $"{repositoryPath}/{name}")).ToArray()); @@ -37,7 +37,7 @@ public async Task ProviderNameAndVersionAreUsedAsCacheKeys() foreach (var repoName in repositoryNames) { var indexJsonPath = Path.Combine(outputDirectory, "types", "index.json"); - await RegistryHelper.PublishProviderToRegistryAsync(services.Build(), indexJsonPath, $"br:{registry}/{repositoryPath}/{repoName}:1.2.3"); + await RegistryHelper.PublishExtensionToRegistryAsync(services.Build(), indexJsonPath, $"br:{registry}/{repositoryPath}/{repoName}:1.2.3"); } var result = await CompilationHelper.RestoreAndCompile( @@ -45,7 +45,7 @@ public async Task ProviderNameAndVersionAreUsedAsCacheKeys() ( "main.bicep", @$" - extension 'br:example.azurecr.io/test/provider/foo:1.2.3' as foo + extension 'br:example.azurecr.io/test/extension/foo:1.2.3' as foo module mod './mod.bicep' = {{ name: 'mod' @@ -56,7 +56,7 @@ public async Task ProviderNameAndVersionAreUsedAsCacheKeys() ( "mod.bicep", @$" - extension 'br:example.azurecr.io/test/provider/bar:1.2.3' as foo + extension 'br:example.azurecr.io/test/extension/bar:1.2.3' as foo " )); diff --git a/src/Bicep.Core.UnitTests/Assertions/MockRegistryAssertions.cs b/src/Bicep.Core.UnitTests/Assertions/MockRegistryAssertions.cs index fe137ff7149..fc3876d030e 100644 --- a/src/Bicep.Core.UnitTests/Assertions/MockRegistryAssertions.cs +++ b/src/Bicep.Core.UnitTests/Assertions/MockRegistryAssertions.cs @@ -125,7 +125,7 @@ private AndConstraint HaveModuleCore(string tag, BinaryD return new(this); } - public AndConstraint HaveProvider(string tag, out Stream tgzStream) + public AndConstraint HaveExtension(string tag, out Stream tgzStream) { this.Subject.ManifestTags.Should().ContainKey(tag, $"tag '{tag}' should exist"); string digest = this.Subject.ManifestTags[tag]; @@ -134,10 +134,10 @@ public AndConstraint HaveProvider(string tag, out Stream var manifest = this.Subject.ManifestObjects[digest]; manifest.Should().NotBeNull(); manifest.MediaType.Should().Be("application/vnd.oci.image.manifest.v1+json", "media type should be explicit for new versions of Bicep, and not null"); - manifest.ArtifactType.Should().Be(BicepMediaTypes.BicepProviderArtifactType, "artifact type should be correct"); + manifest.ArtifactType.Should().Be(BicepMediaTypes.BicepExtensionArtifactType, "artifact type should be correct"); var config = manifest.Config; - config.MediaType.Should().Be(BicepMediaTypes.BicepProviderConfigV1, "config media type should be correct"); + config.MediaType.Should().Be(BicepMediaTypes.BicepExtensionConfigV1, "config media type should be correct"); this.Subject.Blobs.Should().ContainKey(config.Digest, "config digest should exist"); var configBytes = this.Subject.Blobs[config.Digest]; @@ -152,7 +152,7 @@ public AndConstraint HaveProvider(string tag, out Stream // types.tgz var tgzLayer = manifest.Layers.First(); - tgzLayer.MediaType.Should().Be(BicepMediaTypes.BicepProviderArtifactLayerV1TarGzip, "layer media type should be correct"); + tgzLayer.MediaType.Should().Be(BicepMediaTypes.BicepExtensionArtifactLayerV1TarGzip, "layer media type should be correct"); this.Subject.Blobs.Should().ContainKey(tgzLayer.Digest, "layer blob should exist"); var layerBytes = this.Subject.Blobs[tgzLayer.Digest]; diff --git a/src/Bicep.Core.UnitTests/BicepTestConstants.cs b/src/Bicep.Core.UnitTests/BicepTestConstants.cs index 9dcb95c77f8..a0c6b95153a 100644 --- a/src/Bicep.Core.UnitTests/BicepTestConstants.cs +++ b/src/Bicep.Core.UnitTests/BicepTestConstants.cs @@ -140,20 +140,20 @@ public static Mock CreateMockTelemetryProvider() return telemetryProvider; } - public static BinaryData GetBicepProviderManifest(UploadRegistryBlobResult layer, UploadRegistryBlobResult config) => + public static BinaryData GetBicepExtensionManifest(UploadRegistryBlobResult layer, UploadRegistryBlobResult config) => BinaryData.FromString($$""" { "schemaVersion": 2, "mediaType": "application/vnd.oci.image.manifest.v1+json", - "artifactType": "{{BicepMediaTypes.BicepProviderArtifactType}}", + "artifactType": "{{BicepMediaTypes.BicepExtensionArtifactType}}", "config": { - "mediaType": "{{BicepMediaTypes.BicepProviderConfigV1}}", + "mediaType": "{{BicepMediaTypes.BicepExtensionConfigV1}}", "digest": "{{config.Digest}}", "size": {{config.SizeInBytes}} }, "layers": [ { - "mediaType": "{{BicepMediaTypes.BicepProviderArtifactLayerV1TarGzip}}", + "mediaType": "{{BicepMediaTypes.BicepExtensionArtifactLayerV1TarGzip}}", "digest": "{{layer.Digest}}", "size": {{layer.SizeInBytes}} } @@ -165,6 +165,6 @@ public static BinaryData GetBicepProviderManifest(UploadRegistryBlobResult layer } """); - public static string BuiltinAzExtensionVersion = AzNamespaceType.Settings.ArmTemplateProviderVersion; + public static string BuiltinAzExtensionVersion = AzNamespaceType.Settings.TemplateExtensionVersion; } } diff --git a/src/Bicep.Core.UnitTests/Configuration/ImplicitProvidersConfigurationTests.cs b/src/Bicep.Core.UnitTests/Configuration/ImplicitExtensionsTests.cs similarity index 50% rename from src/Bicep.Core.UnitTests/Configuration/ImplicitProvidersConfigurationTests.cs rename to src/Bicep.Core.UnitTests/Configuration/ImplicitExtensionsTests.cs index 455de613f5f..9d3c0dc29e9 100644 --- a/src/Bicep.Core.UnitTests/Configuration/ImplicitProvidersConfigurationTests.cs +++ b/src/Bicep.Core.UnitTests/Configuration/ImplicitExtensionsTests.cs @@ -8,23 +8,23 @@ namespace Bicep.Core.UnitTests.Configuration { [TestClass] - public class ImplicitProvidersTests + public class ImplicitExtensionsTests { [DataTestMethod] - [DataRow(new string[] { "provider1", "provider2" }, 2)] - [DataRow(new string[] { "provider1" }, 1)] + [DataRow(new string[] { "extension1", "extension2" }, 2)] + [DataRow(new string[] { "extension1" }, 1)] [DataRow(new string[] { }, 0)] - public void ImplicitProvidersConfiguration_deserialization_happy_path_succeeds(string[] providers, int expectedCount) + public void ImplicitExtensionsConfiguration_deserialization_happy_path_succeeds(string[] extensions, int expectedCount) { var json = $$""" { - "implicitExtensions": [{{string.Join(", ", providers.Select(p => $"\"{p}\""))}}] + "implicitExtensions": [{{string.Join(", ", extensions.Select(p => $"\"{p}\""))}}] } """; var element = JsonElementFactory.CreateElement(json); - var configuration = ImplicitProvidersConfiguration.Bind(element.GetProperty(RootConfiguration.ImplicitExtensionsKey)); + var configuration = ImplicitExtensionsConfiguration.Bind(element.GetProperty(RootConfiguration.ImplicitExtensionsKey)); - Assert.AreEqual(expectedCount, configuration.GetImplicitProviderNames().Count()); + Assert.AreEqual(expectedCount, configuration.GetImplicitExtensionNames().Count()); } } } diff --git a/src/Bicep.Core.UnitTests/Configuration/ProviderConfigurationTests.cs b/src/Bicep.Core.UnitTests/Configuration/ProviderConfigurationTests.cs index ebc7855ced7..b51e9c3a273 100644 --- a/src/Bicep.Core.UnitTests/Configuration/ProviderConfigurationTests.cs +++ b/src/Bicep.Core.UnitTests/Configuration/ProviderConfigurationTests.cs @@ -12,10 +12,10 @@ namespace Bicep.Core.UnitTests.Configuration; [TestClass] -public class ProvidersConfigurationTests +public class ExtensionsConfigurationTests { [TestMethod] - public void ProviderConfiguration_deserialization() + public void ExtensionConfiguration_deserialization() { var data = JsonElementFactory.CreateElement(""" { @@ -26,43 +26,43 @@ public void ProviderConfiguration_deserialization() } """); - var providers = ProvidersConfiguration.Bind(data.GetProperty(RootConfiguration.ExtensionsKey)); - providers.Should().NotBeNull(); + var extensions = ExtensionsConfiguration.Bind(data.GetProperty(RootConfiguration.ExtensionsKey)); + extensions.Should().NotBeNull(); - providers.TryGetProviderSource("az").IsSuccess(out var azProvider).Should().BeTrue(); - azProvider!.Value.Should().Be("br:mcr.microsoft.com/bicep/extensions/az:0.2.3"); + extensions.TryGetExtensionSource("az").IsSuccess(out var azExtension).Should().BeTrue(); + azExtension!.Value.Should().Be("br:mcr.microsoft.com/bicep/extensions/az:0.2.3"); - providers.TryGetProviderSource("kubernetes").IsSuccess(out var k8sProvider).Should().BeTrue(); - k8sProvider.Should().NotBeNull(); - k8sProvider!.Value.Should().Be("builtin:"); + extensions.TryGetExtensionSource("kubernetes").IsSuccess(out var k8sExtension).Should().BeTrue(); + k8sExtension.Should().NotBeNull(); + k8sExtension!.Value.Should().Be("builtin:"); - providers.TryGetProviderSource("unspecified").IsSuccess(out var provider, out var errorBuilder).Should().BeFalse(); - provider.Should().BeNull(); + extensions.TryGetExtensionSource("unspecified").IsSuccess(out var extension, out var errorBuilder).Should().BeFalse(); + extension.Should().BeNull(); errorBuilder!.Should().NotBeNull(); errorBuilder!.Should().HaveCode("BCP204"); errorBuilder!.Should().HaveMessage($"Extension \"unspecified\" is not recognized."); } [TestMethod] - public void ProviderConfiguration_default_configuration_returns_known_list_of_built_in_providers_with_expected_default_values() + public void ExtensionConfiguration_default_configuration_returns_known_list_of_built_in_extensions_with_expected_default_values() { var config = IConfigurationManager.GetBuiltInConfiguration(); config.Should().NotBeNull(); config!.Extensions.Should().NotBeNull(); - foreach (var providerName in new[] { "az", "kubernetes", "microsoftGraph" }) + foreach (var extensionName in new[] { "az", "kubernetes", "microsoftGraph" }) { - config.Extensions!.TryGetProviderSource(providerName).IsSuccess(out var provider).Should().BeTrue(); - provider!.Value.Should().Be("builtin:"); + config.Extensions!.TryGetExtensionSource(extensionName).IsSuccess(out var extension).Should().BeTrue(); + extension!.Value.Should().Be("builtin:"); } // assert that 'sys' is not present in the default configuration - config.Extensions!.TryGetProviderSource("sys").IsSuccess().Should().BeFalse(); + config.Extensions!.TryGetExtensionSource("sys").IsSuccess().Should().BeFalse(); } [TestMethod] - public void ProviderConfiguration_user_provided_configuration_overrides_default_configuration() + public void ExtensionConfiguration_user_provided_configuration_overrides_default_configuration() { var bicepConfigFileName = "bicepconfig.json"; var fs = new MockFileSystem(new Dictionary @@ -84,18 +84,18 @@ public void ProviderConfiguration_user_provided_configuration_overrides_default_ config.Should().NotBeNull(); config!.Extensions.Should().NotBeNull(); - var providers = config.Extensions!; + var extensions = config.Extensions!; // assert 'source' and 'version' are valid properties for 'foo' - providers.TryGetProviderSource("foo").IsSuccess(out var fooProvider).Should().BeTrue(); - fooProvider!.Value.Should().Be("br:example.azurecr.io/some/fake/path:1.0.0"); + extensions.TryGetExtensionSource("foo").IsSuccess(out var fooExtension).Should().BeTrue(); + fooExtension!.Value.Should().Be("br:example.azurecr.io/some/fake/path:1.0.0"); - // assert 'az' provider properties are overridden by the user provided configuration - providers.TryGetProviderSource("az").IsSuccess(out var azProvider).Should().BeTrue(); - azProvider!.Value.Should().Be("br:mcr.microsoft.com/bicep/extensions/az:0.2.3"); + // assert 'az' extension properties are overridden by the user provided configuration + extensions.TryGetExtensionSource("az").IsSuccess(out var azExtension).Should().BeTrue(); + azExtension!.Value.Should().Be("br:mcr.microsoft.com/bicep/extensions/az:0.2.3"); // assert that 'sys' is not present in the merged configuration - providers.TryGetProviderSource("sys").IsSuccess(out var provider, out var errorBuilder).Should().BeFalse(); - provider.Should().BeNull(); + extensions.TryGetExtensionSource("sys").IsSuccess(out var extension, out var errorBuilder).Should().BeFalse(); + extension.Should().BeNull(); errorBuilder!.Should().NotBeNull(); errorBuilder!.Should().HaveCode("BCP204"); errorBuilder!.Should().HaveMessage($"Extension \"sys\" is not recognized."); diff --git a/src/Bicep.Core.UnitTests/Diagnostics/ErrorBuilderTests.cs b/src/Bicep.Core.UnitTests/Diagnostics/ErrorBuilderTests.cs index 8f86d422f44..9afc4f6fbad 100644 --- a/src/Bicep.Core.UnitTests/Diagnostics/ErrorBuilderTests.cs +++ b/src/Bicep.Core.UnitTests/Diagnostics/ErrorBuilderTests.cs @@ -183,9 +183,9 @@ private static object CreateMockParameter(ParameterInfo parameter, int index) return TestSyntaxFactory.CreatePropertyAccess(TestSyntaxFactory.CreateVariableAccess("identifier"), "propertyName"); } - if (parameter.ParameterType == typeof(ProviderDeclarationSyntax)) + if (parameter.ParameterType == typeof(ExtensionDeclarationSyntax)) { - return new ProviderDeclarationSyntax( + return new ExtensionDeclarationSyntax( [], SyntaxFactory.ImportKeywordToken, SyntaxFactory.CreateStringLiteralWithTextSpan("kubernetes@1.0.0"), diff --git a/src/Bicep.Core.UnitTests/Registry/OciManifestTests.cs b/src/Bicep.Core.UnitTests/Registry/OciManifestTests.cs index ab5eb2863bb..7f2c767ce06 100644 --- a/src/Bicep.Core.UnitTests/Registry/OciManifestTests.cs +++ b/src/Bicep.Core.UnitTests/Registry/OciManifestTests.cs @@ -46,12 +46,12 @@ public void FromBinaryData_ValidInput_DeserializesSuccessfully() var got = OciManifest.FromBinaryData(binaryData).Should().BeOfType().Subject; got.SchemaVersion.Should().Be(2); - got.ArtifactType.Should().Be(BicepMediaTypes.BicepProviderArtifactType); - got.Config.MediaType.Should().Be(BicepMediaTypes.BicepProviderConfigV1); + got.ArtifactType.Should().Be(BicepMediaTypes.BicepExtensionArtifactType); + got.Config.MediaType.Should().Be(BicepMediaTypes.BicepExtensionConfigV1); got.Config.Digest.Should().Be("sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a"); got.Config.Size.Should().Be(2); got.Layers.Should().HaveCount(1); - got.Layers[0].MediaType.Should().Be(BicepMediaTypes.BicepProviderArtifactLayerV1TarGzip); + got.Layers[0].MediaType.Should().Be(BicepMediaTypes.BicepExtensionArtifactLayerV1TarGzip); got.Annotations.Should().HaveCount(2); } } diff --git a/src/Bicep.Core.UnitTests/SourceCode/SourceCodePathHelperTests.cs b/src/Bicep.Core.UnitTests/SourceCode/SourceCodePathHelperTests.cs index 73bc01d62a8..d7fd95bb964 100644 --- a/src/Bicep.Core.UnitTests/SourceCode/SourceCodePathHelperTests.cs +++ b/src/Bicep.Core.UnitTests/SourceCode/SourceCodePathHelperTests.cs @@ -189,12 +189,12 @@ public static IEnumerable GetGetUniquePathRootsTestcases() RootC("users/username/repos/deployment/src/modules/module1.bicep"), RootC("users/username/repos/deployment/src/modules/module2.bicep"), RootC("users/username/repos/deployment/shared/shared1.bicep"), - RootD("bicepcacheroot/br/example.azurecr.io/test$provider$http/1.2.3$/main.json"), + RootD("bicepcacheroot/br/example.azurecr.io/test$extension$http/1.2.3$/main.json"), ], [ RootC("users/username/repos/deployment/src"), RootC("users/username/repos/deployment/shared"), - RootD("bicepcacheroot/br/example.azurecr.io/test$provider$http/1.2.3$"), + RootD("bicepcacheroot/br/example.azurecr.io/test$extension$http/1.2.3$"), ]); yield return data( diff --git a/src/Bicep.Core.UnitTests/TypeSystem/MicrosoftGraph/MicrosoftGraphResourceTypeProviderTests.cs b/src/Bicep.Core.UnitTests/TypeSystem/MicrosoftGraph/MicrosoftGraphResourceTypeProviderTests.cs index ee3bf178492..7b0727f98d1 100644 --- a/src/Bicep.Core.UnitTests/TypeSystem/MicrosoftGraph/MicrosoftGraphResourceTypeProviderTests.cs +++ b/src/Bicep.Core.UnitTests/TypeSystem/MicrosoftGraph/MicrosoftGraphResourceTypeProviderTests.cs @@ -17,7 +17,7 @@ public class MicrosoftGraphResourceTypeProviderTests [TestMethod] public void MicrosoftGraphResourceTypeProvider_can_list_all_types_without_throwing() { - var availableTypes = MicrosoftGraphNamespaceType.Create(MicrosoftGraphNamespaceType.Settings.BicepProviderName).ResourceTypeProvider.GetAvailableTypes(); + var availableTypes = MicrosoftGraphNamespaceType.Create(MicrosoftGraphNamespaceType.Settings.BicepExtensionName).ResourceTypeProvider.GetAvailableTypes(); // sanity check - we know there should be a lot of types available var minExpectedTypes = 5; diff --git a/src/Bicep.Core.UnitTests/Utils/ProviderTestHelper.cs b/src/Bicep.Core.UnitTests/Utils/ExtensionTestHelper.cs similarity index 70% rename from src/Bicep.Core.UnitTests/Utils/ProviderTestHelper.cs rename to src/Bicep.Core.UnitTests/Utils/ExtensionTestHelper.cs index 2d18c14105b..a5e47f44568 100644 --- a/src/Bicep.Core.UnitTests/Utils/ProviderTestHelper.cs +++ b/src/Bicep.Core.UnitTests/Utils/ExtensionTestHelper.cs @@ -10,7 +10,7 @@ namespace Bicep.Core.UnitTests.Utils; -public static class ProviderTestHelper +public static class ExtensionTestHelper { public static ServiceBuilder GetServiceBuilder( IFileSystem fileSystem, @@ -26,17 +26,17 @@ public static ServiceBuilder GetServiceBuilder( .WithContainerRegistryClientFactory(clientFactory); } - public static Task GetServiceBuilderWithPublishedProvider(BinaryData tgzData, FeatureProviderOverrides features, IFileSystem? fileSystem = null) - => GetServiceBuilderWithPublishedProvider(tgzData, "example.azurecr.io/providers/foo:1.2.3", features, fileSystem); + public static Task GetServiceBuilderWithPublishedExtension(BinaryData tgzData, FeatureProviderOverrides features, IFileSystem? fileSystem = null) + => GetServiceBuilderWithPublishedExtension(tgzData, "example.azurecr.io/extensions/foo:1.2.3", features, fileSystem); - public static async Task GetServiceBuilderWithPublishedProvider(BinaryData tgzData, string target, FeatureProviderOverrides features, IFileSystem? fileSystem = null) + public static async Task GetServiceBuilderWithPublishedExtension(BinaryData tgzData, string target, FeatureProviderOverrides features, IFileSystem? fileSystem = null) { var reference = OciArtifactReference.TryParseModule(target).Unwrap(); fileSystem ??= new MockFileSystem(); var services = GetServiceBuilder(fileSystem, reference.Registry, reference.Repository, features); - await RegistryHelper.PublishProviderToRegistryAsync(services.Build(), reference.FullyQualifiedReference, tgzData); + await RegistryHelper.PublishExtensionToRegistryAsync(services.Build(), reference.FullyQualifiedReference, tgzData); return services; } diff --git a/src/Bicep.Core.UnitTests/Utils/RegistryHelper.cs b/src/Bicep.Core.UnitTests/Utils/RegistryHelper.cs index 6ec6cca21cb..e67ebce491d 100644 --- a/src/Bicep.Core.UnitTests/Utils/RegistryHelper.cs +++ b/src/Bicep.Core.UnitTests/Utils/RegistryHelper.cs @@ -8,7 +8,7 @@ using Bicep.Core.Extensions; using Bicep.Core.FileSystem; using Bicep.Core.Registry; -using Bicep.Core.Registry.Providers; +using Bicep.Core.Registry.Extensions; using Bicep.Core.SourceCode; using Bicep.Core.UnitTests.Extensions; using Bicep.Core.UnitTests.Features; @@ -126,33 +126,33 @@ await PublishModuleToRegistryAsync( return clientFactory; } - public static async Task PublishProviderToRegistryAsync(IDependencyHelper services, string pathToIndexJson, string target) + public static async Task PublishExtensionToRegistryAsync(IDependencyHelper services, string pathToIndexJson, string target) { var fileSystem = services.Construct(); - var tgzData = await TypesV1Archive.GenerateProviderTarStream(fileSystem, pathToIndexJson); + var tgzData = await TypesV1Archive.GenerateExtensionTarStream(fileSystem, pathToIndexJson); - await PublishProviderToRegistryAsync(services, target, tgzData); + await PublishExtensionToRegistryAsync(services, target, tgzData); } - public static async Task PublishProviderToRegistryAsync(IDependencyHelper services, string target, BinaryData tgzData) + public static async Task PublishExtensionToRegistryAsync(IDependencyHelper services, string target, BinaryData tgzData) { var dispatcher = services.Construct(); - var targetProviderUri = PathHelper.FilePathToFileUrl(PathHelper.ResolvePath("dummy")); + var targetUri = PathHelper.FilePathToFileUrl(PathHelper.ResolvePath("dummy")); if (!target.StartsWith("br:")) { // convert to a relative path, as this is the only format supported for the local filesystem - targetProviderUri = PathHelper.FilePathToFileUrl(PathHelper.ResolvePath(target)); - target = Path.GetFileName(targetProviderUri.LocalPath); + targetUri = PathHelper.FilePathToFileUrl(PathHelper.ResolvePath(target)); + target = Path.GetFileName(targetUri.LocalPath); } - if (!dispatcher.TryGetArtifactReference(ArtifactType.Provider, target, targetProviderUri).IsSuccess(out var targetReference, out var errorBuilder)) + if (!dispatcher.TryGetArtifactReference(ArtifactType.Extension, target, targetUri).IsSuccess(out var targetReference, out var errorBuilder)) { throw new InvalidOperationException($"Failed to get reference '{errorBuilder(DiagnosticBuilder.ForDocumentStart()).Message}'."); } - await dispatcher.PublishProvider(targetReference, new(tgzData, false, [])); + await dispatcher.PublishExtension(targetReference, new(tgzData, false, [])); } private static Uri RandomFileUri() => PathHelper.FilePathToFileUrl(Path.GetTempFileName()); @@ -161,7 +161,7 @@ public static async Task PublishAzExtension(IDependencyHelper services, string p { var version = BicepTestConstants.BuiltinAzExtensionVersion; var repository = "bicep/extensions/az"; - await PublishProviderToRegistryAsync(services, pathToIndexJson, $"br:{LanguageConstants.BicepPublicMcrRegistry}/{repository}:{version}"); + await PublishExtensionToRegistryAsync(services, pathToIndexJson, $"br:{LanguageConstants.BicepPublicMcrRegistry}/{repository}:{version}"); } public static IContainerRegistryClientFactory CreateOciClientForAzExtension() diff --git a/src/Bicep.Core.UnitTests/Utils/ThirdPartyTypeHelper.cs b/src/Bicep.Core.UnitTests/Utils/ThirdPartyTypeHelper.cs index d4286c2cbb0..5083462ecb1 100644 --- a/src/Bicep.Core.UnitTests/Utils/ThirdPartyTypeHelper.cs +++ b/src/Bicep.Core.UnitTests/Utils/ThirdPartyTypeHelper.cs @@ -14,7 +14,7 @@ namespace Bicep.Core.UnitTests.Utils; public static class ThirdPartyTypeHelper { - public static IReadOnlyDictionary GetHttpProviderTypes() + public static IReadOnlyDictionary GetHttpExtensionTypes() { var factory = new TypeFactory([]); @@ -66,8 +66,8 @@ public static IReadOnlyDictionary GetHttpProviderTypes() }; } - public static BinaryData GetHttpProviderTypesTgz() - => GetTypesTgzBytesFromFiles(GetHttpProviderTypes().Select(x => (x.Key, x.Value)).ToArray()); + public static BinaryData GetHttpExtensionTypesTgz() + => GetTypesTgzBytesFromFiles(GetHttpExtensionTypes().Select(x => (x.Key, x.Value)).ToArray()); /// /// Returns a .tgz file containing a set of pre-defined types for testing purposes. @@ -108,7 +108,7 @@ public static BinaryData GetTestTypesTgz() ["convertBarToBaz"] = new(factory.GetReference(barFunctionType), "Converts a bar into a baz!") })); - var settings = new TypeSettings(name: "ThirdPartyProvider", version: "1.0.0", isSingleton: false, configurationType: null!); + var settings = new TypeSettings(name: "ThirdPartyExtension", version: "1.0.0", isSingleton: false, configurationType: null!); var index = new TypeIndex(new Dictionary { @@ -175,7 +175,7 @@ public static BinaryData GetTestTypesTgzWithFallbackAndConfiguration() ["context"] = new(rootFactory.GetReference(stringTypeRoot), ObjectTypePropertyFlags.None, "Not required context property.") }, null)); - var settings = new TypeSettings(name: "ThirdPartyProvider", version: "1.0.0", isSingleton: false, configurationType: new CrossFileTypeReference("types.json", rootFactory.GetIndex(configurationType))); + var settings = new TypeSettings(name: "ThirdPartyExtension", version: "1.0.0", isSingleton: false, configurationType: new CrossFileTypeReference("types.json", rootFactory.GetIndex(configurationType))); var index = new TypeIndex(new Dictionary { diff --git a/src/Bicep.Core/CodeAction/Fixes/DecoratorCodeFixProvider.cs b/src/Bicep.Core/CodeAction/Fixes/DecoratorCodeFixProvider.cs index f3057f85f70..0656c2794c0 100644 --- a/src/Bicep.Core/CodeAction/Fixes/DecoratorCodeFixProvider.cs +++ b/src/Bicep.Core/CodeAction/Fixes/DecoratorCodeFixProvider.cs @@ -61,7 +61,7 @@ private bool IsTargetDecorator(DecoratorSyntax decoratorSyntax) ResourceDeclarationSyntax => FunctionFlags.ResourceDecorator, ModuleDeclarationSyntax => FunctionFlags.ModuleDecorator, OutputDeclarationSyntax => FunctionFlags.OutputDecorator, - ProviderDeclarationSyntax => FunctionFlags.ProviderDecorator, + ExtensionDeclarationSyntax => FunctionFlags.ExtensionDecorator, MetadataDeclarationSyntax => FunctionFlags.MetadataDecorator, TypeDeclarationSyntax or ObjectTypePropertySyntax => FunctionFlags.TypeDecorator, _ => FunctionFlags.AnyDecorator, diff --git a/src/Bicep.Core/Configuration/ProviderAliasesConfiguration.cs b/src/Bicep.Core/Configuration/ExtensionAliasesConfiguration.cs similarity index 54% rename from src/Bicep.Core/Configuration/ProviderAliasesConfiguration.cs rename to src/Bicep.Core/Configuration/ExtensionAliasesConfiguration.cs index 33cd67cdeb4..8fb9e61d727 100644 --- a/src/Bicep.Core/Configuration/ProviderAliasesConfiguration.cs +++ b/src/Bicep.Core/Configuration/ExtensionAliasesConfiguration.cs @@ -12,13 +12,13 @@ namespace Bicep.Core.Configuration { - public record ProviderAliases + public record ExtensionAliases { [JsonPropertyName("br")] - public ImmutableSortedDictionary OciArtifactExtensionAliases { get; init; } = ImmutableSortedDictionary.Empty; + public ImmutableSortedDictionary OciArtifactExtensionAliases { get; init; } = ImmutableSortedDictionary.Empty; } - public record OciArtifactProviderAlias + public record OciArtifactExtensionAlias { public string? Registry { get; init; } @@ -29,20 +29,20 @@ public override string ToString() => this.ExtensionPath is not null : $"{Registry}"; } - public partial class ProviderAliasesConfiguration : ConfigurationSection + public partial class ExtensionAliasesConfiguration : ConfigurationSection { private readonly Uri? configFileUri; - private ProviderAliasesConfiguration(ProviderAliases data, Uri? configFileUri) + private ExtensionAliasesConfiguration(ExtensionAliases data, Uri? configFileUri) : base(data) { this.configFileUri = configFileUri; } - public static ProviderAliasesConfiguration Bind(JsonElement element, Uri? configFileUri) => new(element.ToNonNullObject(), configFileUri); + public static ExtensionAliasesConfiguration Bind(JsonElement element, Uri? configFileUri) => new(element.ToNonNullObject(), configFileUri); - public ImmutableSortedDictionary OciArtifactExtensionAliases => this.Data.OciArtifactExtensionAliases; + public ImmutableSortedDictionary OciArtifactExtensionAliases => this.Data.OciArtifactExtensionAliases; - public ResultWithDiagnostic TryGetOciArtifactExtensionAlias(string aliasName) + public ResultWithDiagnostic TryGetOciArtifactExtensionAlias(string aliasName) { if (!ValidateAliasName(aliasName, out var errorBuilder)) { @@ -51,12 +51,12 @@ public ResultWithDiagnostic TryGetOciArtifactExtension if (!this.Data.OciArtifactExtensionAliases.TryGetValue(aliasName, out var alias)) { - return new(x => x.OciArtifactProviderAliasNameDoesNotExistInConfiguration(aliasName, configFileUri)); + return new(x => x.OciArtifactExtensionAliasNameDoesNotExistInConfiguration(aliasName, configFileUri)); } if (alias.Registry is null) { - return new(x => x.InvalidOciArtifactProviderAliasRegistryNullOrUndefined(aliasName, configFileUri)); + return new(x => x.InvalidOciArtifactExtensionAliasRegistryNullOrUndefined(aliasName, configFileUri)); } return new(alias); @@ -64,9 +64,9 @@ public ResultWithDiagnostic TryGetOciArtifactExtension private static bool ValidateAliasName(string aliasName, [NotNullWhen(false)] out ErrorBuilderDelegate? errorBuilder) { - if (!ProviderAliasNameRegex().IsMatch(aliasName)) + if (!ExtensionAliasNameRegex().IsMatch(aliasName)) { - errorBuilder = x => x.InvalidProviderAliasName(aliasName); + errorBuilder = x => x.InvalidExtensionAliasName(aliasName); return false; } @@ -75,7 +75,7 @@ private static bool ValidateAliasName(string aliasName, [NotNullWhen(false)] out } [GeneratedRegex("^[a-zA-Z0-9-_]+$", RegexOptions.CultureInvariant)] - private static partial Regex ProviderAliasNameRegex(); + private static partial Regex ExtensionAliasNameRegex(); } diff --git a/src/Bicep.Core/Configuration/ProviderAliasesConfigurationExtensions.cs b/src/Bicep.Core/Configuration/ExtensionAliasesConfigurationExtensions.cs similarity index 76% rename from src/Bicep.Core/Configuration/ProviderAliasesConfigurationExtensions.cs rename to src/Bicep.Core/Configuration/ExtensionAliasesConfigurationExtensions.cs index 43e613ba62a..8fff9a7e620 100644 --- a/src/Bicep.Core/Configuration/ProviderAliasesConfigurationExtensions.cs +++ b/src/Bicep.Core/Configuration/ExtensionAliasesConfigurationExtensions.cs @@ -5,18 +5,18 @@ namespace Bicep.Core.Configuration; -public static class ProviderAliasesConfigurationExtensions +public static class ExtensionAliasesConfigurationExtensions { - public static ProviderAliasesConfiguration WithExtensionAlias(this ProviderAliasesConfiguration c, string extensionAliasJsonString) - => ProviderAliasesConfiguration.Bind( + public static ExtensionAliasesConfiguration WithExtensionAlias(this ExtensionAliasesConfiguration c, string extensionAliasJsonString) + => ExtensionAliasesConfiguration.Bind( JsonDocument.Parse(extensionAliasJsonString).RootElement, null); - public static ProvidersConfiguration WithExtensions(this ProvidersConfiguration c, string providersJsonString) - => ProvidersConfiguration.Bind(JsonDocument.Parse(providersJsonString).RootElement); + public static ExtensionsConfiguration WithExtensions(this ExtensionsConfiguration c, string extensionsJsonString) + => ExtensionsConfiguration.Bind(JsonDocument.Parse(extensionsJsonString).RootElement); - public static ImplicitProvidersConfiguration WithImplicitExtensions(this ImplicitProvidersConfiguration c, string implicitExtensionsJsonString) - => ImplicitProvidersConfiguration.Bind(JsonDocument.Parse(implicitExtensionsJsonString).RootElement); + public static ImplicitExtensionsConfiguration WithImplicitExtensions(this ImplicitExtensionsConfiguration c, string implicitExtensionsJsonString) + => ImplicitExtensionsConfiguration.Bind(JsonDocument.Parse(implicitExtensionsJsonString).RootElement); public static RootConfiguration WithExtensionAliases(this RootConfiguration rootConfiguration, string payload) diff --git a/src/Bicep.Core/Configuration/ImplicitExtensionsConfiguration.cs b/src/Bicep.Core/Configuration/ImplicitExtensionsConfiguration.cs new file mode 100644 index 00000000000..23bdc401102 --- /dev/null +++ b/src/Bicep.Core/Configuration/ImplicitExtensionsConfiguration.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System.Collections.Immutable; +using System.Text.Json; +using Bicep.Core.Extensions; + +namespace Bicep.Core.Configuration; + +public partial class ImplicitExtensionsConfiguration : ConfigurationSection> +{ + private ImplicitExtensionsConfiguration(ImmutableArray data) : base(data) { } + + public static ImplicitExtensionsConfiguration Bind(JsonElement element) + => new(element.TryGetStringArray() ?? []); + + public IEnumerable GetImplicitExtensionNames() => this.Data; +} diff --git a/src/Bicep.Core/Configuration/ImplicitProvidersConfiguration.cs b/src/Bicep.Core/Configuration/ImplicitProvidersConfiguration.cs deleted file mode 100644 index 5f45f1917d8..00000000000 --- a/src/Bicep.Core/Configuration/ImplicitProvidersConfiguration.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System.Collections.Immutable; -using System.Text.Json; -using Bicep.Core.Extensions; - -namespace Bicep.Core.Configuration; - -public partial class ImplicitProvidersConfiguration : ConfigurationSection> -{ - private ImplicitProvidersConfiguration(ImmutableArray data) : base(data) { } - - public static ImplicitProvidersConfiguration Bind(JsonElement element) - => new(element.TryGetStringArray() ?? []); - - public IEnumerable GetImplicitProviderNames() => this.Data; -} diff --git a/src/Bicep.Core/Configuration/ProvidersConfiguration.cs b/src/Bicep.Core/Configuration/ProvidersConfiguration.cs index e743d2fd341..b6e1a84990c 100644 --- a/src/Bicep.Core/Configuration/ProvidersConfiguration.cs +++ b/src/Bicep.Core/Configuration/ProvidersConfiguration.cs @@ -10,13 +10,13 @@ namespace Bicep.Core.Configuration; -public record ProviderConfigEntry +public record ExtensionConfigEntry { public bool BuiltIn => this.Value == "builtin:"; public string Value { get; } - public ProviderConfigEntry(string value) + public ExtensionConfigEntry(string value) { Value = value; } @@ -25,24 +25,24 @@ public override string ToString() => Value; } -public partial class ProvidersConfiguration : ConfigurationSection> +public partial class ExtensionsConfiguration : ConfigurationSection> { - private ProvidersConfiguration(ImmutableDictionary data) : base(data) { } + private ExtensionsConfiguration(ImmutableDictionary data) : base(data) { } - public static ProvidersConfiguration Bind(JsonElement element) + public static ExtensionsConfiguration Bind(JsonElement element) => new(element.ToNonNullObject>() .ToImmutableDictionary( pair => pair.Key, - pair => new ProviderConfigEntry(pair.Value)) + pair => new ExtensionConfigEntry(pair.Value)) ); - public ResultWithDiagnostic TryGetProviderSource(string providerName) + public ResultWithDiagnostic TryGetExtensionSource(string extensionName) { - if (!this.Data.TryGetValue(providerName, out var providerConfigEntry)) + if (!this.Data.TryGetValue(extensionName, out var extensionConfigEntry)) { - return new(x => x.UnrecognizedProvider(providerName)); + return new(x => x.UnrecognizedExtension(extensionName)); } - return new(providerConfigEntry); + return new(extensionConfigEntry); } public override void WriteTo(Utf8JsonWriter writer) @@ -56,6 +56,6 @@ public override void WriteTo(Utf8JsonWriter writer) writer.WriteEndObject(); } - public bool IsSysOrBuiltIn(string providerName) - => providerName == SystemNamespaceType.BuiltInName || this.Data.TryGetValue(providerName)?.BuiltIn == true; + public bool IsSysOrBuiltIn(string extensionName) + => extensionName == SystemNamespaceType.BuiltInName || this.Data.TryGetValue(extensionName)?.BuiltIn == true; } diff --git a/src/Bicep.Core/Configuration/RootConfiguration.cs b/src/Bicep.Core/Configuration/RootConfiguration.cs index b8bac8cf558..e431994f113 100644 --- a/src/Bicep.Core/Configuration/RootConfiguration.cs +++ b/src/Bicep.Core/Configuration/RootConfiguration.cs @@ -33,9 +33,9 @@ public class RootConfiguration public RootConfiguration( CloudConfiguration cloud, ModuleAliasesConfiguration moduleAliases, - ProviderAliasesConfiguration extensionAliases, - ProvidersConfiguration extensions, - ImplicitProvidersConfiguration implicitExtensions, + ExtensionAliasesConfiguration extensionAliases, + ExtensionsConfiguration extensions, + ImplicitExtensionsConfiguration implicitExtensions, AnalyzersConfiguration analyzers, string? cacheRootDirectory, ExperimentalFeaturesEnabled experimentalFeaturesEnabled, @@ -65,9 +65,9 @@ public static RootConfiguration Bind(JsonElement element, Uri? configFileUri = n var experimentalFeaturesEnabled = ExperimentalFeaturesEnabled.Bind(element.GetProperty(ExperimentalFeaturesEnabledKey)); var formatting = FormattingConfiguration.Bind(element.GetProperty(FormattingKey)); - var extensionAliases = ProviderAliasesConfiguration.Bind(element.GetProperty(ExtensionAliasesKey), configFileUri); - var extensions = ProvidersConfiguration.Bind(element.GetProperty(ExtensionsKey)); - var implicitExtensions = ImplicitProvidersConfiguration.Bind(element.GetProperty(ImplicitExtensionsKey)); + var extensionAliases = ExtensionAliasesConfiguration.Bind(element.GetProperty(ExtensionAliasesKey), configFileUri); + var extensions = ExtensionsConfiguration.Bind(element.GetProperty(ExtensionsKey)); + var implicitExtensions = ImplicitExtensionsConfiguration.Bind(element.GetProperty(ImplicitExtensionsKey)); return new(cloud, moduleAliases, extensionAliases, extensions, implicitExtensions, analyzers, cacheRootDirectory, experimentalFeaturesEnabled, formatting, configFileUri, diagnosticBuilders); } @@ -76,11 +76,11 @@ public static RootConfiguration Bind(JsonElement element, Uri? configFileUri = n public ModuleAliasesConfiguration ModuleAliases { get; } - public ProviderAliasesConfiguration ExtensionAliases { get; } + public ExtensionAliasesConfiguration ExtensionAliases { get; } - public ProvidersConfiguration Extensions { get; } + public ExtensionsConfiguration Extensions { get; } - public ImplicitProvidersConfiguration ImplicitExtensions { get; } + public ImplicitExtensionsConfiguration ImplicitExtensions { get; } public AnalyzersConfiguration Analyzers { get; } diff --git a/src/Bicep.Core/Diagnostics/DiagnosticBuilder.cs b/src/Bicep.Core/Diagnostics/DiagnosticBuilder.cs index 2dd5f9009ed..3dec2548503 100644 --- a/src/Bicep.Core/Diagnostics/DiagnosticBuilder.cs +++ b/src/Bicep.Core/Diagnostics/DiagnosticBuilder.cs @@ -1216,7 +1216,7 @@ public ErrorDiagnostic UnknownModuleReferenceScheme(string badScheme, ImmutableA "BCP200", $"{BuildInvalidOciArtifactReferenceClause(aliasName, badRef)} The registry \"{badRegistry}\" exceeds the maximum length of {maxLength} characters."); - public ErrorDiagnostic ExpectedProviderSpecification() + public ErrorDiagnostic ExpectedExtensionSpecification() { var message = """ Expected an extension specification string with a valid format at this location. Valid formats: @@ -1226,27 +1226,27 @@ public ErrorDiagnostic ExpectedProviderSpecification() return new(TextSpan, "BCP201", message); } - public ErrorDiagnostic ExpectedProviderAliasName() => new( + public ErrorDiagnostic ExpectedExtensionAliasName() => new( TextSpan, "BCP202", "Expected an extension alias name at this location."); - public ErrorDiagnostic ProvidersAreDisabled() => new( + public ErrorDiagnostic ExtensionsAreDisabled() => new( TextSpan, "BCP203", $@"Using extension declaration requires enabling EXPERIMENTAL feature ""{nameof(ExperimentalFeaturesEnabled.Extensibility)}""."); - public ErrorDiagnostic UnrecognizedProvider(string identifier) => new( + public ErrorDiagnostic UnrecognizedExtension(string identifier) => new( TextSpan, "BCP204", $"Extension \"{identifier}\" is not recognized."); - public ErrorDiagnostic ProviderDoesNotSupportConfiguration(string identifier) => new( + public ErrorDiagnostic ExtensionDoesNotSupportConfiguration(string identifier) => new( TextSpan, "BCP205", $"Extension \"{identifier}\" does not support configuration."); - public ErrorDiagnostic ProviderRequiresConfiguration(string identifier) => new( + public ErrorDiagnostic ExtensionRequiresConfiguration(string identifier) => new( TextSpan, "BCP206", $"Extension \"{identifier}\" requires configuration, but none was provided."); @@ -1696,15 +1696,10 @@ public IDiagnostic MissingParameterAssignment(IEnumerable identifiers, C "BCP302", $@"The name ""{name}"" is not a valid type. Please specify one of the following types: {ToQuotedString(validTypes)}."); - public ErrorDiagnostic ProviderSpecificationInterpolationUnsupported() => new( + public ErrorDiagnostic ExtensionSpecificationInterpolationUnsupported() => new( TextSpan, "BCP303", - "String interpolation is unsupported for specifying the provider."); - - public ErrorDiagnostic InvalidProviderSpecification() => new( - TextSpan, - "BCP304", - "Invalid provider specifier string. Specify a valid provider of format \"@\"."); + "String interpolation is unsupported for specifying the extension."); public ErrorDiagnostic ExpectedWithOrAsKeywordOrNewLine() => new( TextSpan, @@ -2055,17 +2050,17 @@ public ErrorDiagnostic RuntimeValueNotAllowedInFunctionDeclaration(string? acces "BCP376", $"The \"{name}\" symbol cannot be imported because imports of kind {exportMetadataKind} are not supported in files of kind {sourceFileKind}."); - public ErrorDiagnostic InvalidProviderAliasName(string aliasName) => new( + public ErrorDiagnostic InvalidExtensionAliasName(string aliasName) => new( TextSpan, "BCP377", $"The extension alias name \"{aliasName}\" is invalid. Valid characters are alphanumeric, \"_\", or \"-\"."); - public ErrorDiagnostic InvalidOciArtifactProviderAliasRegistryNullOrUndefined(string aliasName, Uri? configFileUri) => new( + public ErrorDiagnostic InvalidOciArtifactExtensionAliasRegistryNullOrUndefined(string aliasName, Uri? configFileUri) => new( TextSpan, "BCP378", $"The OCI artifact extension alias \"{aliasName}\" in the {BuildBicepConfigurationClause(configFileUri)} is invalid. The \"registry\" property cannot be null or undefined."); - public ErrorDiagnostic OciArtifactProviderAliasNameDoesNotExistInConfiguration(string aliasName, Uri? configFileUri) => new( + public ErrorDiagnostic OciArtifactExtensionAliasNameDoesNotExistInConfiguration(string aliasName, Uri? configFileUri) => new( TextSpan, "BCP379", $"The OCI artifact extension alias name \"{aliasName}\" does not exist in the {BuildBicepConfigurationClause(configFileUri)}."); @@ -2076,7 +2071,7 @@ public ErrorDiagnostic RuntimeValueNotAllowedInFunctionDeclaration(string? acces $"Artifacts of type: \"{artifactType}\" are not supported." ); - public FixableDiagnostic ExtensionDeclarationKeywordIsDeprecated(ProviderDeclarationSyntax syntax) + public FixableDiagnostic ExtensionDeclarationKeywordIsDeprecated(ExtensionDeclarationSyntax syntax) { var codeFix = new CodeFix( $"Replace the {syntax.Keyword.Text} keyword with the extension keyword", @@ -2159,17 +2154,17 @@ public FixableDiagnostic ExtensionDeclarationKeywordIsDeprecated(ProviderDeclara public ErrorDiagnostic InvalidTypesTgzPackage_DeserializationFailed() => new( TextSpan, "BCP396", - "The referenced provider types artifact has been published with malformed content."); + "The referenced extension types artifact has been published with malformed content."); - public ErrorDiagnostic InvalidProvider_ImplicitProviderMissingConfig(Uri? configFileUri, string name) => new( + public ErrorDiagnostic InvalidExtension_ImplicitExtensionMissingConfig(Uri? configFileUri, string name) => new( TextSpan, "BCP397", $"""Extension {name} is incorrectly configured in the {BuildBicepConfigurationClause(configFileUri)}. It is referenced in the "{RootConfiguration.ImplicitExtensionsKey}" section, but is missing corresponding configuration in the "{RootConfiguration.ExtensionsKey}" section."""); - public ErrorDiagnostic InvalidProvider_NotABuiltInProvider(Uri? configFileUri, string name) => new( + public ErrorDiagnostic InvalidExtension_NotABuiltInExtension(Uri? configFileUri, string name) => new( TextSpan, "BCP398", - $"""Extension {name} is incorrectly configured in the {BuildBicepConfigurationClause(configFileUri)}. It is configured as built-in in the "{RootConfiguration.ExtensionsKey}" section, but no built-in provider exists."""); + $"""Extension {name} is incorrectly configured in the {BuildBicepConfigurationClause(configFileUri)}. It is configured as built-in in the "{RootConfiguration.ExtensionsKey}" section, but no built-in extension exists."""); public ErrorDiagnostic FetchingAzTypesRequiresExperimentalFeature() => new( TextSpan, diff --git a/src/Bicep.Core/Emit/CompileTimeImports/ImportClosureInfo.cs b/src/Bicep.Core/Emit/CompileTimeImports/ImportClosureInfo.cs index 3305f97db25..9fbceb18183 100644 --- a/src/Bicep.Core/Emit/CompileTimeImports/ImportClosureInfo.cs +++ b/src/Bicep.Core/Emit/CompileTimeImports/ImportClosureInfo.cs @@ -271,7 +271,7 @@ private static IEnumerable CollectReferences(BicepSymbolicRef => typeReference.SourceBicepModel.Binder.GetSymbolsReferencedInDeclarationOf(typeReference.Symbol) .Select(symbol => symbol switch { - ProviderNamespaceSymbol => null, // this was the base expression of a fully qualified ambient type reference (e.g., sys.string) + ExtensionNamespaceSymbol => null, // this was the base expression of a fully qualified ambient type reference (e.g., sys.string) LocalVariableSymbol => null, // local variables are contained within the expression and are not external references TypeAliasSymbol typeAlias => IntraTemplateSymbolicReferenceFactory.SymbolFor(typeAlias, typeReference), VariableSymbol variable => IntraTemplateSymbolicReferenceFactory.SymbolFor(variable, typeReference), diff --git a/src/Bicep.Core/Emit/TemplateWriter.cs b/src/Bicep.Core/Emit/TemplateWriter.cs index a7ce5da0070..251d842ac5d 100644 --- a/src/Bicep.Core/Emit/TemplateWriter.cs +++ b/src/Bicep.Core/Emit/TemplateWriter.cs @@ -135,7 +135,7 @@ public void Write(SourceAwareJsonTextWriter writer) this.EmitVariablesIfPresent(emitter, program.Variables.Concat(Context.ImportClosureInfo.ImportedVariablesInClosure)); - this.EmitExtensionsIfPresent(emitter, program.Providers); + this.EmitExtensionsIfPresent(emitter, program.Extensions); this.EmitResources(jsonWriter, emitter, program.Resources, program.Modules); @@ -994,9 +994,9 @@ private void EmitVariablesIfPresent(ExpressionEmitter emitter, IEnumerable providers) + private void EmitExtensionsIfPresent(ExpressionEmitter emitter, ImmutableArray extensions) { - if (!providers.Any()) + if (!extensions.Any()) { return; } @@ -1004,75 +1004,75 @@ private void EmitExtensionsIfPresent(ExpressionEmitter emitter, ImmutableArray providers) + private static void EmitProviders(ExpressionEmitter emitter, ImmutableArray extensions) { emitter.EmitObjectProperty("imports", () => { - foreach (var provider in providers) + foreach (var extension in extensions) { - var settings = provider.Settings; + var settings = extension.Settings; - emitter.EmitObjectProperty(provider.Name, () => + emitter.EmitObjectProperty(extension.Name, () => { - emitter.EmitProperty("provider", settings.ArmTemplateProviderName); - emitter.EmitProperty("version", settings.ArmTemplateProviderVersion); - if (provider.Config is not null) + emitter.EmitProperty("provider", settings.TemplateExtensionName); + emitter.EmitProperty("version", settings.TemplateExtensionVersion); + if (extension.Config is not null) { - emitter.EmitProperty("config", provider.Config); + emitter.EmitProperty("config", extension.Config); } - }, provider.SourceSyntax); + }, extension.SourceSyntax); } }); } - private void EmitExtensions(ExpressionEmitter emitter, ImmutableArray providers) + private void EmitExtensions(ExpressionEmitter emitter, ImmutableArray extensions) { emitter.EmitObjectProperty("extensions", () => { - foreach (var provider in providers) + foreach (var extension in extensions) { - var settings = provider.Settings; + var settings = extension.Settings; - emitter.EmitObjectProperty(provider.Name, () => + emitter.EmitObjectProperty(extension.Name, () => { - emitter.EmitProperty("name", settings.ArmTemplateProviderName); - emitter.EmitProperty("version", settings.ArmTemplateProviderVersion); + emitter.EmitProperty("name", settings.TemplateExtensionName); + emitter.EmitProperty("version", settings.TemplateExtensionVersion); - EmitExtensionConfig(provider, emitter); + EmitExtensionConfig(extension, emitter); }, - provider.SourceSyntax); + extension.SourceSyntax); } }); } - private void EmitExtensionConfig(DeclaredProviderExpression provider, ExpressionEmitter emitter) + private void EmitExtensionConfig(DeclaredExtensionExpression extension, ExpressionEmitter emitter) { - if (provider.Config is null) + if (extension.Config is null) { return; } - if (provider.Config is not ObjectExpression providerConfig) + if (extension.Config is not ObjectExpression config) { - throw new UnreachableException($"Provider config type expected to be of type: '{nameof(ObjectExpression)}' but received: '{provider.Config.GetType()}'"); + throw new UnreachableException($"Extension config type expected to be of type: '{nameof(ObjectExpression)}' but received: '{extension.Config.GetType()}'"); } emitter.EmitObjectProperty("config", () => { - foreach (var providerConfigProperty in providerConfig.Properties) + foreach (var configProperty in config.Properties) { // Type checking should have validated that the config name is not an expression (e.g. string interpolation), if we get a null value it means something // was wrong with type checking validation. - var extensionConfigName = providerConfigProperty.TryGetKeyText() ?? throw new UnreachableException("Expressions are not allowed as config names."); - var configType = provider.Settings.ConfigurationType ?? throw new UnreachableException("Config type must be specified."); + var extensionConfigName = configProperty.TryGetKeyText() ?? throw new UnreachableException("Expressions are not allowed as config names."); + var configType = extension.Settings.ConfigurationType ?? throw new UnreachableException("Config type must be specified."); var extensionConfigType = GetExtensionConfigType(extensionConfigName, configType); emitter.EmitObjectProperty(extensionConfigName, () => @@ -1112,7 +1112,7 @@ private void EmitExtensionConfig(DeclaredProviderExpression provider, Expression throw new ArgumentException($"Config name: '{extensionConfigName}' specified an unsupported type: '{extensionConfigType}'. Supported types are: 'string', 'secureString', 'int', 'bool', 'array', 'secureObject', 'object'."); } - emitter.EmitProperty("defaultValue", providerConfigProperty.Value); + emitter.EmitProperty("defaultValue", configProperty.Value); }); } }); @@ -1125,10 +1125,10 @@ private TypeSymbol GetExtensionConfigType(string configName, ObjectType configTy return configItem.TypeReference.Type; } - throw new UnreachableException($"Configuration name: '{configName}' does not exist as part of provider configuration."); + throw new UnreachableException($"Configuration name: '{configName}' does not exist as part of extension configuration."); } - private DeclaredProviderExpression GetExtensionForLocalDeploy() + private DeclaredExtensionExpression GetExtensionForLocalDeploy() { return new( null, @@ -1210,7 +1210,7 @@ private void EmitResource(ExpressionEmitter emitter, DeclaredResourceExpression emitter.EmitProperty("existing", new BooleanLiteralExpression(null, true)); } - var importSymbol = Context.SemanticModel.Root.ProviderDeclarations.FirstOrDefault(i => metadata.Type.DeclaringNamespace.AliasNameEquals(i.Name)); + var importSymbol = Context.SemanticModel.Root.ExtensionDeclarations.FirstOrDefault(i => metadata.Type.DeclaringNamespace.AliasNameEquals(i.Name)); if (importSymbol is not null) { if (this.Context.SemanticModel.Features.LocalDeployEnabled) diff --git a/src/Bicep.Core/Intermediate/Expression.cs b/src/Bicep.Core/Intermediate/Expression.cs index 3800eabaf99..6bcb6f674f4 100644 --- a/src/Bicep.Core/Intermediate/Expression.cs +++ b/src/Bicep.Core/Intermediate/Expression.cs @@ -387,7 +387,7 @@ public override void Accept(IExpressionVisitor visitor) protected override object? GetDebugAttributes() => new { Name }; } -public record DeclaredProviderExpression( +public record DeclaredExtensionExpression( SyntaxBase? SourceSyntax, string Name, NamespaceSettings Settings, @@ -396,7 +396,7 @@ public record DeclaredProviderExpression( ) : DescribableExpression(SourceSyntax, Description) { public override void Accept(IExpressionVisitor visitor) - => visitor.VisitDeclaredProviderExpression(this); + => visitor.VisitDeclaredExtensionExpression(this); protected override object? GetDebugAttributes() => new { Name }; } @@ -525,7 +525,7 @@ public override void Accept(IExpressionVisitor visitor) public record ProgramExpression( SyntaxBase? SourceSyntax, ImmutableArray Metadata, - ImmutableArray Providers, + ImmutableArray Extensions, ImmutableArray Types, ImmutableArray Parameters, ImmutableArray Variables, diff --git a/src/Bicep.Core/Intermediate/ExpressionBuilder.cs b/src/Bicep.Core/Intermediate/ExpressionBuilder.cs index 2a67350c5b6..aa80282b5af 100644 --- a/src/Bicep.Core/Intermediate/ExpressionBuilder.cs +++ b/src/Bicep.Core/Intermediate/ExpressionBuilder.cs @@ -169,13 +169,13 @@ private Expression ConvertWithoutLowering(SyntaxBase syntax) metadata.Name.IdentifierName, ConvertWithoutLowering(metadata.Value))); - case ProviderDeclarationSyntax provider: - var symbol = GetDeclaredSymbol(provider); - return EvaluateDecorators(provider, new DeclaredProviderExpression( - provider, + case ExtensionDeclarationSyntax extension: + var symbol = GetDeclaredSymbol(extension); + return EvaluateDecorators(extension, new DeclaredExtensionExpression( + extension, symbol.Name, - GetTypeInfo(provider).Settings, - provider.Config is not null ? ConvertWithoutLowering(provider.Config) : null)); + GetTypeInfo(extension).Settings, + extension.Config is not null ? ConvertWithoutLowering(extension.Config) : null)); case ParameterDeclarationSyntax parameter: return EvaluateDecorators(parameter, new DeclaredParameterExpression( @@ -319,7 +319,7 @@ private TypeExpression ConvertTypePropertyAccess(SyntaxBase syntax, SyntaxBase b { BuiltInNamespaceSymbol builtIn => TryGetPropertyType(builtIn, propertyName) switch { - TypeType typeType when builtIn is { Type: NamespaceType nsType } => new FullyQualifiedAmbientTypeReferenceExpression(syntax, nsType.ProviderName, propertyName, typeType.Unwrapped), + TypeType typeType when builtIn is { Type: NamespaceType nsType } => new FullyQualifiedAmbientTypeReferenceExpression(syntax, nsType.ExtensionName, propertyName, typeType.Unwrapped), _ => throw new ArgumentException($"Property '{propertyName}' of symbol '{builtIn.Name}' was not found or was not valid."), }, WildcardImportSymbol wildcardImport => TryGetPropertyType(wildcardImport, propertyName) switch @@ -450,9 +450,9 @@ private ProgramExpression ConvertProgram(ProgramSyntax syntax) .OfType() .ToImmutableArray(); - var providers = Context.SemanticModel.Root.ProviderDeclarations + var extensions = Context.SemanticModel.Root.ExtensionDeclarations .Select(x => ConvertWithoutLowering(x.DeclaringSyntax)) - .OfType() + .OfType() .ToImmutableArray(); var typeDefinitions = Context.SemanticModel.Root.TypeDeclarations @@ -504,7 +504,7 @@ private ProgramExpression ConvertProgram(ProgramSyntax syntax) return new ProgramExpression( syntax, metadataArray, - providers, + extensions, typeDefinitions, parameters, functionVariables.AddRange(variables), diff --git a/src/Bicep.Core/Intermediate/ExpressionRewriteVisitor.cs b/src/Bicep.Core/Intermediate/ExpressionRewriteVisitor.cs index ce09de82295..8cc4bb570cf 100644 --- a/src/Bicep.Core/Intermediate/ExpressionRewriteVisitor.cs +++ b/src/Bicep.Core/Intermediate/ExpressionRewriteVisitor.cs @@ -246,8 +246,8 @@ public virtual Expression ReplaceDeclaredMetadataExpression(DeclaredMetadataExpr return hasChanges ? expression with { Value = value, Description = description } : expression; } - void IExpressionVisitor.VisitDeclaredProviderExpression(DeclaredProviderExpression expression) => ReplaceCurrent(expression, ReplaceDeclaredProviderExpression); - public virtual Expression ReplaceDeclaredProviderExpression(DeclaredProviderExpression expression) + void IExpressionVisitor.VisitDeclaredExtensionExpression(DeclaredExtensionExpression expression) => ReplaceCurrent(expression, ReplaceDeclaredExtensionExpression); + public virtual Expression ReplaceDeclaredExtensionExpression(DeclaredExtensionExpression expression) { var hasChanges = TryRewrite(expression.Config, out var config) | @@ -697,7 +697,7 @@ public virtual Expression ReplaceProgramExpression(ProgramExpression expression) { var hasChanges = TryRewriteStrict(expression.Metadata, out var metadata) | - TryRewriteStrict(expression.Providers, out var providers) | + TryRewriteStrict(expression.Extensions, out var extensions) | TryRewriteStrict(expression.Parameters, out var parameters) | TryRewriteStrict(expression.Types, out var types) | TryRewriteStrict(expression.Variables, out var variables) | @@ -706,7 +706,7 @@ public virtual Expression ReplaceProgramExpression(ProgramExpression expression) TryRewriteStrict(expression.Modules, out var modules) | TryRewriteStrict(expression.Outputs, out var outputs); - return hasChanges ? expression with { Metadata = metadata, Providers = providers, Parameters = parameters, Types = types, Variables = variables, Functions = functions, Resources = resources, Modules = modules, Outputs = outputs } : expression; + return hasChanges ? expression with { Metadata = metadata, Extensions = extensions, Parameters = parameters, Types = types, Variables = variables, Functions = functions, Resources = resources, Modules = modules, Outputs = outputs } : expression; } protected virtual Expression Replace(Expression expression) => ReplaceInternal(expression); diff --git a/src/Bicep.Core/Intermediate/ExpressionVisitor.cs b/src/Bicep.Core/Intermediate/ExpressionVisitor.cs index c33da0e787f..7d5db747f78 100644 --- a/src/Bicep.Core/Intermediate/ExpressionVisitor.cs +++ b/src/Bicep.Core/Intermediate/ExpressionVisitor.cs @@ -157,7 +157,7 @@ private void VisitDescribableExpression(DescribableExpression expression) Visit(expression.Description); } - public virtual void VisitDeclaredProviderExpression(DeclaredProviderExpression expression) + public virtual void VisitDeclaredExtensionExpression(DeclaredExtensionExpression expression) { VisitDescribableExpression(expression); Visit(expression.Config); @@ -393,7 +393,7 @@ public virtual void VisitTypeReferenceItemsAccessExpression(TypeReferenceItemsAc public virtual void VisitProgramExpression(ProgramExpression expression) { Visit(expression.Metadata); - Visit(expression.Providers); + Visit(expression.Extensions); Visit(expression.Types); Visit(expression.Parameters); Visit(expression.Variables); diff --git a/src/Bicep.Core/Intermediate/IExpressionVisitor.cs b/src/Bicep.Core/Intermediate/IExpressionVisitor.cs index e53415b7e04..c108a8ace1b 100644 --- a/src/Bicep.Core/Intermediate/IExpressionVisitor.cs +++ b/src/Bicep.Core/Intermediate/IExpressionVisitor.cs @@ -61,7 +61,7 @@ public interface IExpressionVisitor void VisitDeclaredMetadataExpression(DeclaredMetadataExpression expression); - void VisitDeclaredProviderExpression(DeclaredProviderExpression expression); + void VisitDeclaredExtensionExpression(DeclaredExtensionExpression expression); void VisitDeclaredParameterExpression(DeclaredParameterExpression expression); diff --git a/src/Bicep.Core/Parsing/Parser.cs b/src/Bicep.Core/Parsing/Parser.cs index fb90015190f..c347ef9c646 100644 --- a/src/Bicep.Core/Parsing/Parser.cs +++ b/src/Bicep.Core/Parsing/Parser.cs @@ -281,14 +281,14 @@ TokenType.StringLeftPiece or }; } - private ProviderDeclarationSyntax ExtensionDeclaration(Token keyword, IEnumerable leadingNodes) + private ExtensionDeclarationSyntax ExtensionDeclaration(Token keyword, IEnumerable leadingNodes) { - var providerSpecificationSyntax = reader.Peek().Type switch + var specificationSyntax = reader.Peek().Type switch { TokenType.Identifier => new IdentifierSyntax(reader.Read()), _ => this.WithRecovery( - () => ThrowIfSkipped(this.InterpolableString, b => b.ExpectedProviderSpecification()), + () => ThrowIfSkipped(this.InterpolableString, b => b.ExpectedExtensionSpecification()), RecoveryFlags.None, TokenType.NewLine) }; @@ -300,7 +300,7 @@ TokenType.EndOfFile or TokenType.NewLine => this.SkipEmpty(), TokenType.Identifier when current.Text == LanguageConstants.AsKeyword => this.SkipEmpty(), - _ => this.WithRecovery(() => this.ExtensionWithClause(), GetSuppressionFlag(providerSpecificationSyntax), TokenType.NewLine), + _ => this.WithRecovery(() => this.ExtensionWithClause(), GetSuppressionFlag(specificationSyntax), TokenType.NewLine), }; current = this.reader.Peek(); @@ -312,10 +312,10 @@ TokenType.EndOfFile or _ => this.WithRecovery(() => this.ExtensionAsClause(), GetSuppressionFlag(withClause), TokenType.NewLine), }; - return new(leadingNodes, keyword, providerSpecificationSyntax, withClause, asClause); + return new(leadingNodes, keyword, specificationSyntax, withClause, asClause); } - private ProviderWithClauseSyntax ExtensionWithClause() + private ExtensionWithClauseSyntax ExtensionWithClause() { var keyword = this.ExpectKeyword(LanguageConstants.WithKeyword, b => b.ExpectedWithOrAsKeywordOrNewLine()); var config = this.WithRecovery(() => this.Object(ExpressionFlags.AllowComplexLiterals), RecoveryFlags.None, TokenType.NewLine); @@ -326,7 +326,7 @@ private ProviderWithClauseSyntax ExtensionWithClause() private AliasAsClauseSyntax ExtensionAsClause() { var keyword = this.ExpectKeyword(LanguageConstants.AsKeyword, b => b.ExpectedWithOrAsKeywordOrNewLine()); - var modifier = this.IdentifierWithRecovery(b => b.ExpectedProviderAliasName(), RecoveryFlags.None, TokenType.NewLine); + var modifier = this.IdentifierWithRecovery(b => b.ExpectedExtensionAliasName(), RecoveryFlags.None, TokenType.NewLine); return new(keyword, modifier); } diff --git a/src/Bicep.Core/PrettyPrint/DocumentBuildVisitor.cs b/src/Bicep.Core/PrettyPrint/DocumentBuildVisitor.cs index d42d0941c11..57cb934c88a 100644 --- a/src/Bicep.Core/PrettyPrint/DocumentBuildVisitor.cs +++ b/src/Bicep.Core/PrettyPrint/DocumentBuildVisitor.cs @@ -94,7 +94,7 @@ public override void VisitTargetScopeSyntax(TargetScopeSyntax syntax) => this.Visit(syntax.Value); }); - public override void VisitProviderDeclarationSyntax(ProviderDeclarationSyntax syntax) => + public override void VisitExtensionDeclarationSyntax(ExtensionDeclarationSyntax syntax) => this.BuildStatement(syntax, () => { this.VisitNodes(syntax.LeadingNodes); diff --git a/src/Bicep.Core/PrettyPrintV2/SyntaxLayouts.SyntaxVisitor.cs b/src/Bicep.Core/PrettyPrintV2/SyntaxLayouts.SyntaxVisitor.cs index fb662519284..aa6fcace16b 100644 --- a/src/Bicep.Core/PrettyPrintV2/SyntaxLayouts.SyntaxVisitor.cs +++ b/src/Bicep.Core/PrettyPrintV2/SyntaxLayouts.SyntaxVisitor.cs @@ -50,9 +50,9 @@ public SyntaxLayouts(PrettyPrinterV2Context context) public void VisitAliasAsClauseSyntax(AliasAsClauseSyntax syntax) => this.Apply(syntax, this.LayoutAliasAsClauseSyntax); - public void VisitProviderDeclarationSyntax(ProviderDeclarationSyntax syntax) => this.Apply(syntax, this.LayoutProviderDeclarationSyntax); + public void VisitExtensionDeclarationSyntax(ExtensionDeclarationSyntax syntax) => this.Apply(syntax, this.LayoutExtensionDeclarationSyntax); - public void VisitProviderWithClauseSyntax(ProviderWithClauseSyntax syntax) => this.Apply(syntax, this.LayoutProviderWithClauseSyntax); + public void VisitExtensionWithClauseSyntax(ExtensionWithClauseSyntax syntax) => this.Apply(syntax, this.LayoutExtensionWithClauseSyntax); public void VisitInstanceFunctionCallSyntax(InstanceFunctionCallSyntax syntax) => this.Apply(syntax, this.LayoutInstanceFunctionCallSyntax); diff --git a/src/Bicep.Core/PrettyPrintV2/SyntaxLayouts.cs b/src/Bicep.Core/PrettyPrintV2/SyntaxLayouts.cs index 67fd6636869..1babb05e5a8 100644 --- a/src/Bicep.Core/PrettyPrintV2/SyntaxLayouts.cs +++ b/src/Bicep.Core/PrettyPrintV2/SyntaxLayouts.cs @@ -113,7 +113,7 @@ private IEnumerable LayoutAliasAsClauseSyntax(AliasAsClauseSyntax synt syntax.Keyword, syntax.Alias); - private IEnumerable LayoutProviderDeclarationSyntax(ProviderDeclarationSyntax syntax) => + private IEnumerable LayoutExtensionDeclarationSyntax(ExtensionDeclarationSyntax syntax) => this.LayoutLeadingNodes(syntax.LeadingNodes) .Concat(this.Spread( syntax.Keyword, @@ -121,7 +121,7 @@ private IEnumerable LayoutProviderDeclarationSyntax(ProviderDeclaratio syntax.WithClause, syntax.AsClause)); - private IEnumerable LayoutProviderWithClauseSyntax(ProviderWithClauseSyntax syntax) => + private IEnumerable LayoutExtensionWithClauseSyntax(ExtensionWithClauseSyntax syntax) => this.Spread( syntax.Keyword, syntax.Config); diff --git a/src/Bicep.Core/Registry/ArtifactRegistry.cs b/src/Bicep.Core/Registry/ArtifactRegistry.cs index b90b5060118..9220a9f55b2 100644 --- a/src/Bicep.Core/Registry/ArtifactRegistry.cs +++ b/src/Bicep.Core/Registry/ArtifactRegistry.cs @@ -22,7 +22,7 @@ public RegistryCapabilities GetCapabilities(ArtifactType artifactType, ArtifactR public abstract Task PublishModule(T reference, BinaryData compiled, BinaryData? bicepSources, string? documentationUri, string? description); - public abstract Task PublishProvider(T reference, ProviderPackage provider); + public abstract Task PublishExtension(T reference, ExtensionPackage package); public virtual Task OnRestoreArtifacts(bool forceRestore) { @@ -51,8 +51,8 @@ public Task CheckArtifactExists(ArtifactType artifactType, ArtifactReferen public Task PublishModule(ArtifactReference artifactReference, BinaryData compiled, BinaryData? bicepSources, string? documentationUri, string? description) => this.PublishModule(ConvertReference(artifactReference), compiled, bicepSources, documentationUri, description); - public Task PublishProvider(ArtifactReference reference, ProviderPackage provider) - => this.PublishProvider(ConvertReference(reference), provider); + public Task PublishExtension(ArtifactReference reference, ExtensionPackage package) + => this.PublishExtension(ConvertReference(reference), package); public Task> RestoreArtifacts(IEnumerable references) => this.RestoreArtifacts(references.Select(ConvertReference)); @@ -70,9 +70,9 @@ public ResultWithDiagnostic TryGetLocalArtifactEntryPointUri(ArtifactRefere public ResultWithException TryGetSource(ArtifactReference reference) => this.TryGetSource(ConvertReference(reference)); - public abstract Uri? TryGetProviderBinary(T reference); + public abstract Uri? TryGetExtensionBinary(T reference); - public Uri? TryGetProviderBinary(ArtifactReference reference) => this.TryGetProviderBinary(ConvertReference(reference)); + public Uri? TryGetExtensionBinary(ArtifactReference reference) => this.TryGetExtensionBinary(ConvertReference(reference)); public abstract RegistryCapabilities GetCapabilities(ArtifactType artifactType, T reference); diff --git a/src/Bicep.Core/Registry/ArtifactType.cs b/src/Bicep.Core/Registry/ArtifactType.cs index bc79e2c87a0..293c5c1ed23 100644 --- a/src/Bicep.Core/Registry/ArtifactType.cs +++ b/src/Bicep.Core/Registry/ArtifactType.cs @@ -6,6 +6,6 @@ namespace Bicep.Core.Registry public enum ArtifactType { Module, - Provider + Extension, } } diff --git a/src/Bicep.Core/Registry/AzureContainerRegistryManager.cs b/src/Bicep.Core/Registry/AzureContainerRegistryManager.cs index d24a2a3f94b..c0cfe74b9ca 100644 --- a/src/Bicep.Core/Registry/AzureContainerRegistryManager.cs +++ b/src/Bicep.Core/Registry/AzureContainerRegistryManager.cs @@ -162,7 +162,7 @@ private static async Task DownloadManifestAndLayersAsync(IOci return deserializedManifest.ArtifactType switch { BicepMediaTypes.BicepModuleArtifactType or null => new OciModuleArtifactResult(manifestResponse.Value.Manifest, manifestResponse.Value.Digest, layers), - BicepMediaTypes.BicepProviderArtifactType => new OciProviderArtifactResult(manifestResponse.Value.Manifest, manifestResponse.Value.Digest, layers, config), + BicepMediaTypes.BicepExtensionArtifactType => new OciExtensionArtifactResult(manifestResponse.Value.Manifest, manifestResponse.Value.Digest, layers, config), _ => throw new InvalidArtifactException($"artifacts of type: \'{deserializedManifest.ArtifactType}\' are not supported by this Bicep version. {OciModuleArtifactResult.NewerVersionMightBeRequired}") }; } diff --git a/src/Bicep.Core/Registry/IArtifactDispatcher.cs b/src/Bicep.Core/Registry/IArtifactDispatcher.cs index 72b55304af8..ba9c54d8901 100644 --- a/src/Bicep.Core/Registry/IArtifactDispatcher.cs +++ b/src/Bicep.Core/Registry/IArtifactDispatcher.cs @@ -9,14 +9,14 @@ namespace Bicep.Core.Registry { - public record ProviderBinary( + public record ExtensionBinary( SupportedArchitecture Architecture, BinaryData Data); - public record ProviderPackage( + public record ExtensionPackage( BinaryData Types, bool LocalDeployEnabled, - ImmutableArray Binaries); + ImmutableArray Binaries); public interface IModuleDispatcher : IArtifactReferenceFactory { @@ -30,17 +30,17 @@ public interface IModuleDispatcher : IArtifactReferenceFactory Task CheckModuleExists(ArtifactReference reference); - Task CheckProviderExists(ArtifactReference reference); + Task CheckExtensionExists(ArtifactReference reference); Task PublishModule(ArtifactReference reference, BinaryData compiledArmTemplate, BinaryData? bicepSources, string? documentationUri); - Task PublishProvider(ArtifactReference reference, ProviderPackage provider); + Task PublishExtension(ArtifactReference reference, ExtensionPackage package); void PruneRestoreStatuses(); // Retrieves the sources that have been restored along with the module into the cache (if available) ResultWithException TryGetModuleSources(ArtifactReference reference); - Uri? TryGetProviderBinary(ArtifactReference reference); + Uri? TryGetExtensionBinary(ArtifactReference reference); } } diff --git a/src/Bicep.Core/Registry/IArtifactRegistry.cs b/src/Bicep.Core/Registry/IArtifactRegistry.cs index 88765f80f57..be117357c02 100644 --- a/src/Bicep.Core/Registry/IArtifactRegistry.cs +++ b/src/Bicep.Core/Registry/IArtifactRegistry.cs @@ -29,7 +29,7 @@ public interface IArtifactRegistry /// /// The alias name /// The unqualified artifact reference - /// The artifact type. Either "module" or "provider" + /// The artifact type. ResultWithDiagnostic TryParseArtifactReference(ArtifactType artifactType, string? aliasName, string reference); /// @@ -80,10 +80,10 @@ public interface IArtifactRegistry Task PublishModule(ArtifactReference reference, BinaryData compiled, BinaryData? bicepSources, string? documentationUri, string? description); /// - /// Publishes a provider types package to the registry. + /// Publishes an extension types package to the registry. /// - /// The provider reference - Task PublishProvider(ArtifactReference reference, ProviderPackage provider); + /// The extension reference + Task PublishExtension(ArtifactReference reference, ExtensionPackage package); /// /// Returns documentationUri for the module. @@ -103,6 +103,6 @@ public interface IArtifactRegistry /// A source archive ResultWithException TryGetSource(ArtifactReference reference); - Uri? TryGetProviderBinary(ArtifactReference reference); + Uri? TryGetExtensionBinary(ArtifactReference reference); } } diff --git a/src/Bicep.Core/Registry/LocalModuleRegistry.cs b/src/Bicep.Core/Registry/LocalModuleRegistry.cs index 661b3515474..3646f37011b 100644 --- a/src/Bicep.Core/Registry/LocalModuleRegistry.cs +++ b/src/Bicep.Core/Registry/LocalModuleRegistry.cs @@ -9,14 +9,14 @@ using Bicep.Core.FileSystem; using Bicep.Core.Modules; using Bicep.Core.Registry.Oci; -using Bicep.Core.Registry.Providers; +using Bicep.Core.Registry.Extensions; using Bicep.Core.Semantics; using Bicep.Core.SourceCode; using Bicep.Core.Utils; namespace Bicep.Core.Registry { - public record LocalModuleEntity(ProviderPackage Provider); + public record LocalModuleEntity(ExtensionPackage Package); public class LocalModuleRegistry : ExternalArtifactRegistry { @@ -36,13 +36,13 @@ public override RegistryCapabilities GetCapabilities(ArtifactType artifactType, => artifactType switch { ArtifactType.Module => RegistryCapabilities.Default, - ArtifactType.Provider => RegistryCapabilities.Publish, + ArtifactType.Extension => RegistryCapabilities.Publish, _ => throw new UnreachableException(), }; public override ResultWithDiagnostic TryParseArtifactReference(ArtifactType artifactType, string? alias, string reference) { - if (artifactType != ArtifactType.Module && artifactType != ArtifactType.Provider) + if (artifactType != ArtifactType.Module && artifactType != ArtifactType.Extension) { return new(x => x.UnsupportedArtifactType(artifactType)); } @@ -64,7 +64,7 @@ public override ResultWithDiagnostic TryGetLocalArtifactEntryPointUri(Local return new(x => x.FilePathCouldNotBeResolved(reference.Path, reference.ParentModuleUri.LocalPath)); } - if (reference.ArtifactType == ArtifactType.Provider) + if (reference.ArtifactType == ArtifactType.Extension) { if (TryGetTypesTgzUri(reference) is null) { @@ -83,7 +83,7 @@ public override ResultWithDiagnostic TryGetLocalArtifactEntryPointUri(Local foreach (var reference in references) { - if (reference.ArtifactType == ArtifactType.Provider) + if (reference.ArtifactType == ArtifactType.Extension) { if (TryReadContent(reference) is not { } binaryData) { @@ -91,7 +91,7 @@ public override ResultWithDiagnostic TryGetLocalArtifactEntryPointUri(Local continue; } - var package = ProviderV1Archive.Read(binaryData); + var package = ExtensionV1Archive.Read(binaryData); await this.WriteArtifactContentToCacheAsync(reference, new(package)); } } @@ -106,7 +106,7 @@ public override ResultWithDiagnostic TryGetLocalArtifactEntryPointUri(Local public override bool IsArtifactRestoreRequired(LocalModuleReference reference) { - if (reference.ArtifactType != ArtifactType.Provider) + if (reference.ArtifactType != ArtifactType.Extension) { return false; } @@ -117,9 +117,9 @@ public override bool IsArtifactRestoreRequired(LocalModuleReference reference) public override Task PublishModule(LocalModuleReference moduleReference, BinaryData compiledArmTemplate, BinaryData? bicepSources, string? documentationUri, string? description) => throw new NotSupportedException("Local modules cannot be published."); - public override async Task PublishProvider(LocalModuleReference reference, ProviderPackage provider) + public override async Task PublishExtension(LocalModuleReference reference, ExtensionPackage package) { - var archive = await ProviderV1Archive.Build(provider); + var archive = await ExtensionV1Archive.Build(package); var fileUri = PathHelper.TryResolveFilePath(reference.ParentModuleUri, reference.Path)!; FileResolver.Write(fileUri, archive.ToStream()); @@ -129,7 +129,7 @@ public override Task CheckArtifactExists(ArtifactType artifactType, LocalM => artifactType switch { ArtifactType.Module => throw new NotSupportedException("Local modules cannot be published."), - ArtifactType.Provider => Task.FromResult(false), + ArtifactType.Extension => Task.FromResult(false), _ => throw new UnreachableException(), }; @@ -150,24 +150,24 @@ public override ResultWithException TryGetSource(LocalModuleRefer return new(new SourceNotAvailableException()); } - public override Uri? TryGetProviderBinary(LocalModuleReference reference) - => GetProviderBinUri(reference); + public override Uri? TryGetExtensionBinary(LocalModuleReference reference) + => GetExtensionBinaryUri(reference); protected override void WriteArtifactContentToCache(LocalModuleReference reference, LocalModuleEntity entity) { - if (entity.Provider.LocalDeployEnabled) + if (entity.Package.LocalDeployEnabled) { if (SupportedArchitectures.TryGetCurrent() is not { } architecture) { - throw new InvalidOperationException($"Failed to determine the system OS or architecture to execute provider extension \"{reference}\"."); + throw new InvalidOperationException($"Failed to determine the system OS or architecture to execute extension \"{reference}\"."); } - if (entity.Provider.Binaries.SingleOrDefault(x => x.Architecture.Name == architecture.Name) is not { } binary) + if (entity.Package.Binaries.SingleOrDefault(x => x.Architecture.Name == architecture.Name) is not { } binary) { - throw new InvalidOperationException($"The provider extension \"{reference}\" does not support architecture {architecture.Name}."); + throw new InvalidOperationException($"The extension \"{reference}\" does not support architecture {architecture.Name}."); } - var binaryUri = GetProviderBinUri(reference); + var binaryUri = GetExtensionBinaryUri(reference); this.FileResolver.Write(binaryUri, binary.Data.ToStream()); if (!OperatingSystem.IsWindows()) { @@ -176,7 +176,7 @@ protected override void WriteArtifactContentToCache(LocalModuleReference referen } var typesUri = this.GetTypesTgzUri(reference); - this.FileResolver.Write(typesUri, entity.Provider.Types.ToStream()); + this.FileResolver.Write(typesUri, entity.Package.Types.ToStream()); } private string? TryGetArtifactDirectoryPath(LocalModuleReference reference) @@ -186,7 +186,7 @@ protected override void WriteArtifactContentToCache(LocalModuleReference referen return null; } - // Provider packages are unpacked to '~/.bicep/local/sha256_'. + // Extension packages are unpacked to '~/.bicep/local/sha256_'. // We must use '_' as a separator here because Windows does not allow ':' in file paths. var digest = OciDescriptor.ComputeDigest(OciDescriptor.AlgorithmIdentifierSha256, binaryData, separator: '_'); @@ -221,7 +221,7 @@ protected override string GetArtifactDirectoryPath(LocalModuleReference referenc private Uri? TryGetTypesTgzUri(LocalModuleReference reference) => TryGetFileUri(reference, "types.tgz"); - private Uri GetProviderBinUri(LocalModuleReference reference) => GetFileUri(reference, "provider.bin"); + private Uri GetExtensionBinaryUri(LocalModuleReference reference) => GetFileUri(reference, "extension.bin"); protected override Uri GetArtifactLockFileUri(LocalModuleReference reference) => GetFileUri(reference, "lock"); diff --git a/src/Bicep.Core/Registry/ModuleDispatcher.cs b/src/Bicep.Core/Registry/ModuleDispatcher.cs index de87f73bf35..913d31e71d7 100644 --- a/src/Bicep.Core/Registry/ModuleDispatcher.cs +++ b/src/Bicep.Core/Registry/ModuleDispatcher.cs @@ -88,12 +88,12 @@ public ResultWithDiagnostic TryGetArtifactReference(ArtifactT public ResultWithDiagnostic TryGetArtifactReference(IArtifactReferenceSyntax artifactReferenceSyntax, Uri parentModuleUri) { - if (artifactReferenceSyntax is ProviderDeclarationSyntax providerDeclarationSyntax) + if (artifactReferenceSyntax is ExtensionDeclarationSyntax extensionSyntax) { - var artifactAddressResult = TryGetArtifactAddress(providerDeclarationSyntax, parentModuleUri); - if (!artifactAddressResult.IsSuccess(out var result, out var providerDeclarationPathFailureBuilder)) + var artifactAddressResult = TryGetArtifactAddress(extensionSyntax, parentModuleUri); + if (!artifactAddressResult.IsSuccess(out var result, out var pathFailureBuilder)) { - return new(providerDeclarationPathFailureBuilder); + return new(pathFailureBuilder); } var sourceUri = result.ConfigSource?.ConfigFileUri ?? parentModuleUri; @@ -122,23 +122,23 @@ private record ArtifactAddressResult( string PathValue, RootConfiguration? ConfigSource); - private ResultWithDiagnostic TryGetArtifactAddress(ProviderDeclarationSyntax providerDeclarationSyntax, Uri parentModuleUri) + private ResultWithDiagnostic TryGetArtifactAddress(ExtensionDeclarationSyntax extensionSyntax, Uri parentModuleUri) { - switch (providerDeclarationSyntax.SpecificationString) + switch (extensionSyntax.SpecificationString) { case StringSyntax inlinedSpec: if (inlinedSpec.TryGetLiteralValue() is not string pathValue) { - return new(x => x.ProviderSpecificationInterpolationUnsupported()); + return new(x => x.ExtensionSpecificationInterpolationUnsupported()); } return new(new ArtifactAddressResult(pathValue, null)); case IdentifierSyntax configSpec: var config = configurationManager.GetConfiguration(parentModuleUri); - return config.Extensions.TryGetProviderSource(configSpec.IdentifierName).Transform(x => new ArtifactAddressResult(x.Value, config)); + return config.Extensions.TryGetExtensionSource(configSpec.IdentifierName).Transform(x => new ArtifactAddressResult(x.Value, config)); default: - return new(x => x.ExpectedProviderSpecification()); + return new(x => x.ExpectedExtensionSpecification()); } } @@ -262,11 +262,11 @@ public async Task PublishModule(ArtifactReference reference, BinaryData compiled await registry.PublishModule(reference, compiledArmTemplate, bicepSources, documentationUri, description); } - public async Task PublishProvider(ArtifactReference reference, ProviderPackage provider) + public async Task PublishExtension(ArtifactReference reference, ExtensionPackage package) { var registry = this.GetRegistry(reference); - await registry.PublishProvider(reference, provider); + await registry.PublishExtension(reference, package); } public async Task CheckModuleExists(ArtifactReference reference) @@ -275,10 +275,10 @@ public async Task CheckModuleExists(ArtifactReference reference) return await registry.CheckArtifactExists(ArtifactType.Module, reference); } - public async Task CheckProviderExists(ArtifactReference reference) + public async Task CheckExtensionExists(ArtifactReference reference) { var registry = this.GetRegistry(reference); - return await registry.CheckArtifactExists(ArtifactType.Provider, reference); + return await registry.CheckArtifactExists(ArtifactType.Extension, reference); } public void PruneRestoreStatuses() @@ -305,10 +305,10 @@ public ResultWithException TryGetModuleSources(ArtifactReference return registry.TryGetSource(reference); } - public Uri? TryGetProviderBinary(ArtifactReference reference) + public Uri? TryGetExtensionBinary(ArtifactReference reference) { var registry = this.GetRegistry(reference); - return registry.TryGetProviderBinary(reference); + return registry.TryGetExtensionBinary(reference); } private bool HasRestoreFailed(ArtifactReference reference, RootConfiguration configuration, [NotNullWhen(true)] out DiagnosticBuilder.ErrorBuilderDelegate? failureBuilder) diff --git a/src/Bicep.Core/Registry/Oci/BicepMediaTypes.cs b/src/Bicep.Core/Registry/Oci/BicepMediaTypes.cs index bf97897c6d4..1be6744fddd 100644 --- a/src/Bicep.Core/Registry/Oci/BicepMediaTypes.cs +++ b/src/Bicep.Core/Registry/Oci/BicepMediaTypes.cs @@ -10,11 +10,11 @@ public static class BicepMediaTypes // Media types format - see https://github.com/opencontainers/image-spec/blob/main/manifest.md - // Provider Media Types - public const string BicepProviderArtifactType = "application/vnd.ms.bicep.provider.artifact"; - public const string BicepProviderConfigV1 = "application/vnd.ms.bicep.provider.config.v1+json"; - public const string BicepProviderArtifactLayerV1TarGzip = "application/vnd.ms.bicep.provider.layer.v1.tar+gzip"; - public static string GetProviderArtifactLayerV1Binary(SupportedArchitecture architecture) + // Extension Media Types + public const string BicepExtensionArtifactType = "application/vnd.ms.bicep.provider.artifact"; + public const string BicepExtensionConfigV1 = "application/vnd.ms.bicep.provider.config.v1+json"; + public const string BicepExtensionArtifactLayerV1TarGzip = "application/vnd.ms.bicep.provider.layer.v1.tar+gzip"; + public static string GetExtensionArtifactLayerV1Binary(SupportedArchitecture architecture) => $"application/vnd.ms.bicep.provider.layer.v1.{architecture.Name}.binary"; // Module Media Types diff --git a/src/Bicep.Core/Registry/Oci/OciArtifactReference.cs b/src/Bicep.Core/Registry/Oci/OciArtifactReference.cs index cf254ebb2b6..8b153025403 100644 --- a/src/Bicep.Core/Registry/Oci/OciArtifactReference.cs +++ b/src/Bicep.Core/Registry/Oci/OciArtifactReference.cs @@ -8,7 +8,6 @@ namespace Bicep.Core.Registry.Oci { - // Currently this can be a module or a provider. public class OciArtifactReference : ArtifactReference, IOciArtifactReference { public OciArtifactReference(ArtifactType type, IArtifactAddressComponents artifactIdParts, Uri parentModuleUri) : @@ -36,7 +35,7 @@ public OciArtifactReference(ArtifactType type, string registry, string repositor public IArtifactAddressComponents AddressComponents { get; } /// - /// Gets the type of artifact reference. Either module or provider. + /// Gets the type of artifact reference. /// public ArtifactType Type { get; } @@ -113,12 +112,12 @@ private static ResultWithDiagnostic TryParseParts(Ar } unqualifiedReference = $"{moduleAlias}/{unqualifiedReference}"; break; - case ArtifactType.Provider: - if (!configuration.ExtensionAliases.TryGetOciArtifactExtensionAlias(aliasName).IsSuccess(out var providerAlias, out var providerFailureBuilder)) + case ArtifactType.Extension: + if (!configuration.ExtensionAliases.TryGetOciArtifactExtensionAlias(aliasName).IsSuccess(out var extensionAlias, out var extensionFailureBuilder)) { - return new(providerFailureBuilder); + return new(extensionFailureBuilder); } - unqualifiedReference = $"{providerAlias}/{unqualifiedReference}"; + unqualifiedReference = $"{extensionAlias}/{unqualifiedReference}"; break; default: return new(x => x.UnsupportedArtifactType(type)); diff --git a/src/Bicep.Core/Registry/Oci/OciProviderArtifactResult.cs b/src/Bicep.Core/Registry/Oci/OciExtensionArtifactResult.cs similarity index 70% rename from src/Bicep.Core/Registry/Oci/OciProviderArtifactResult.cs rename to src/Bicep.Core/Registry/Oci/OciExtensionArtifactResult.cs index febee76cee5..ce9b5248429 100644 --- a/src/Bicep.Core/Registry/Oci/OciProviderArtifactResult.cs +++ b/src/Bicep.Core/Registry/Oci/OciExtensionArtifactResult.cs @@ -3,24 +3,24 @@ namespace Bicep.Core.Registry.Oci { - public class OciProviderArtifactResult : OciArtifactResult + public class OciExtensionArtifactResult : OciArtifactResult { private readonly OciArtifactLayer mainLayer; - public OciProviderArtifactResult(BinaryData manifestBits, string manifestDigest, IEnumerable layers, OciArtifactLayer? config) : + public OciExtensionArtifactResult(BinaryData manifestBits, string manifestDigest, IEnumerable layers, OciArtifactLayer? config) : base(manifestBits, manifestDigest, layers) { var manifest = this.Manifest; - if (manifest.ArtifactType is null || !manifest.ArtifactType.Equals(BicepMediaTypes.BicepProviderArtifactType, MediaTypeComparison)) + if (manifest.ArtifactType is null || !manifest.ArtifactType.Equals(BicepMediaTypes.BicepExtensionArtifactType, MediaTypeComparison)) { throw new InvalidArtifactException($"Unknown artifactType: '{manifest.ArtifactType}'.", InvalidArtifactExceptionKind.WrongArtifactType); } - if (!manifest.Config.MediaType.Equals(BicepMediaTypes.BicepProviderConfigV1, MediaTypeComparison)) + if (!manifest.Config.MediaType.Equals(BicepMediaTypes.BicepExtensionConfigV1, MediaTypeComparison)) { throw new InvalidArtifactException($"Unknown config.mediaType: '{manifest.Config.MediaType}'.", InvalidArtifactExceptionKind.WrongArtifactType); } - var expectedLayerMediaType = BicepMediaTypes.BicepProviderArtifactLayerV1TarGzip; + var expectedLayerMediaType = BicepMediaTypes.BicepExtensionArtifactLayerV1TarGzip; this.mainLayer = this.Layers.Where(l => l.MediaType.Equals(expectedLayerMediaType, MediaTypeComparison)).Single(); Config = config; } diff --git a/src/Bicep.Core/Registry/Oci/OciProvidersV1Config.cs b/src/Bicep.Core/Registry/Oci/OciExtensionV1Config.cs similarity index 92% rename from src/Bicep.Core/Registry/Oci/OciProvidersV1Config.cs rename to src/Bicep.Core/Registry/Oci/OciExtensionV1Config.cs index cd82efae816..030b6b2ab9f 100644 --- a/src/Bicep.Core/Registry/Oci/OciProvidersV1Config.cs +++ b/src/Bicep.Core/Registry/Oci/OciExtensionV1Config.cs @@ -7,11 +7,11 @@ namespace Bicep.Core.Registry.Oci; -[JsonSerializable(typeof(OciProvidersV1Config))] +[JsonSerializable(typeof(OciExtensionV1Config))] [JsonSourceGenerationOptions(PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase)] -public partial class OciProvidersV1ConfigSerializationContext : JsonSerializerContext { } +public partial class OciExtensionV1ConfigSerializationContext : JsonSerializerContext { } -public class OciProvidersV1Config +public class OciExtensionV1Config { // Avoid writing null properties for backwards compatibility [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] @@ -22,7 +22,7 @@ public class OciProvidersV1Config public ImmutableArray? SupportedArchitectures { get; } [JsonConstructor] - public OciProvidersV1Config(bool? localDeployEnabled, ImmutableArray? supportedArchitectures) + public OciExtensionV1Config(bool? localDeployEnabled, ImmutableArray? supportedArchitectures) { LocalDeployEnabled = localDeployEnabled; SupportedArchitectures = supportedArchitectures; diff --git a/src/Bicep.Core/Registry/OciArtifactRegistry.cs b/src/Bicep.Core/Registry/OciArtifactRegistry.cs index c7b711a1df9..f5431a9582a 100644 --- a/src/Bicep.Core/Registry/OciArtifactRegistry.cs +++ b/src/Bicep.Core/Registry/OciArtifactRegistry.cs @@ -91,7 +91,7 @@ public override bool IsArtifactRestoreRequired(OciArtifactReference reference) var artifactFilesNotFound = reference.Type switch { ArtifactType.Module => !this.FileResolver.FileExists(this.GetArtifactFileUri(reference, ArtifactFileType.ModuleMain)), - ArtifactType.Provider => !this.FileResolver.FileExists(this.GetArtifactFileUri(reference, ArtifactFileType.Provider)), + ArtifactType.Extension => !this.FileResolver.FileExists(this.GetArtifactFileUri(reference, ArtifactFileType.Extension)), _ => throw new UnreachableException() }; @@ -142,7 +142,7 @@ public override ResultWithDiagnostic TryGetLocalArtifactEntryPointUri(OciAr var artifactFileType = reference.Type switch { ArtifactType.Module => ArtifactFileType.ModuleMain, - ArtifactType.Provider => ArtifactFileType.Provider, + ArtifactType.Extension => ArtifactFileType.Extension, _ => throw new UnreachableException() }; @@ -304,30 +304,30 @@ await this.client.PushArtifactAsync( } } - public override async Task PublishProvider(OciArtifactReference reference, ProviderPackage provider) + public override async Task PublishExtension(OciArtifactReference reference, ExtensionPackage package) { - OciProvidersV1Config configData = provider.LocalDeployEnabled ? new( + OciExtensionV1Config configData = package.LocalDeployEnabled ? new( localDeployEnabled: true, - supportedArchitectures: provider.Binaries.Select(x => x.Architecture.Name).ToImmutableArray()) : + supportedArchitectures: package.Binaries.Select(x => x.Architecture.Name).ToImmutableArray()) : // avoid writing properties to the config - localDeploy is a preview feature, so // there should be no detectable impact to 'mainline' functionality when disabled. new(null, null); var config = new Oci.OciDescriptor( - JsonSerializer.Serialize(configData, OciProvidersV1ConfigSerializationContext.Default.OciProvidersV1Config), - BicepMediaTypes.BicepProviderConfigV1); + JsonSerializer.Serialize(configData, OciExtensionV1ConfigSerializationContext.Default.OciExtensionV1Config), + BicepMediaTypes.BicepExtensionConfigV1); List layers = new() { - new(provider.Types, BicepMediaTypes.BicepProviderArtifactLayerV1TarGzip, new OciManifestAnnotationsBuilder().WithTitle("types.tgz").Build()) + new(package.Types, BicepMediaTypes.BicepExtensionArtifactLayerV1TarGzip, new OciManifestAnnotationsBuilder().WithTitle("types.tgz").Build()) }; if (configData.LocalDeployEnabled == true) { - foreach (var binary in provider.Binaries) + foreach (var binary in package.Binaries) { - var layerName = BicepMediaTypes.GetProviderArtifactLayerV1Binary(binary.Architecture); - layers.Add(new(binary.Data, layerName, new OciManifestAnnotationsBuilder().WithTitle($"provider.bin").Build())); + var layerName = BicepMediaTypes.GetExtensionArtifactLayerV1Binary(binary.Architecture); + layers.Add(new(binary.Data, layerName, new OciManifestAnnotationsBuilder().WithTitle($"extension.bin").Build())); } } @@ -342,7 +342,7 @@ await this.client.PushArtifactAsync( reference, // Technically null should be fine for mediaType, but ACR guys recommend OciImageManifest for safer compatibility ManifestMediaType.OciImageManifest.ToString(), - BicepMediaTypes.BicepProviderArtifactType, + BicepMediaTypes.BicepExtensionArtifactType, config, layers, annotations); @@ -380,17 +380,15 @@ protected override void WriteArtifactContentToCache(OciArtifactReference referen // write data file var mainLayer = result.GetMainLayer(); - // NOTE(asilverman): currently the only difference in the processing is the filename written to disk - // but this may change in the future if we chose to publish providers in multiple layers. - // TODO: IsArtifactRestoreRequired assumes there must be a ModuleMain file, which isn't true for provider artifacts + // TODO: IsArtifactRestoreRequired assumes there must be a ModuleMain file, which isn't true for extension artifacts // NOTE(stephenWeatherford): That can be solved by only writing layer data files only (see below CONSIDER) // and not main.json directly (https://github.com/Azure/bicep/issues/11900) var moduleFileType = (reference.Type, result) switch { (ArtifactType.Module, OciModuleArtifactResult) => ArtifactFileType.ModuleMain, - (ArtifactType.Module, OciProviderArtifactResult) => throw new InvalidArtifactException($"Expected a module, but retrieved a provider."), - (ArtifactType.Provider, OciProviderArtifactResult) => ArtifactFileType.Provider, - (ArtifactType.Provider, OciModuleArtifactResult) => throw new InvalidArtifactException($"Expected a provider, but retrieved a module."), + (ArtifactType.Module, OciExtensionArtifactResult) => throw new InvalidArtifactException($"Expected a module, but retrieved an extension."), + (ArtifactType.Extension, OciExtensionArtifactResult) => ArtifactFileType.Extension, + (ArtifactType.Extension, OciModuleArtifactResult) => throw new InvalidArtifactException($"Expected an extension, but retrieved a module."), _ => throw new InvalidOperationException($"Unexpected artifact type \"{result.GetType().Name}\"."), }; @@ -402,7 +400,7 @@ protected override void WriteArtifactContentToCache(OciArtifactReference referen // write source archive file if (result.TryGetSingleLayerByMediaType(BicepMediaTypes.BicepSourceV1Layer) is BinaryData sourceData) { - // CONSIDER: Write all layers as separate binary files instead of separate files for source.tgz and provider files. + // CONSIDER: Write all layers as separate binary files instead of separate files for source.tgz and extension files. // We should do this rather than writing individual files we know about, // (e.g. "source.tgz") because this way we can restore all layers even if we don't know what they're for. // If an optional layer is added, we don't need to version the cache because all versions have the same complete @@ -413,29 +411,29 @@ protected override void WriteArtifactContentToCache(OciArtifactReference referen } } - if (result is OciProviderArtifactResult providerArtifact) + if (result is OciExtensionArtifactResult extension) { - var config = providerArtifact.Config is { } ? - JsonSerializer.Deserialize(providerArtifact.Config.Data, OciProvidersV1ConfigSerializationContext.Default.OciProvidersV1Config) : + var config = extension.Config is { } ? + JsonSerializer.Deserialize(extension.Config.Data, OciExtensionV1ConfigSerializationContext.Default.OciExtensionV1Config) : null; - // if the artifact supports local deployment, fetch the provider binary + // if the artifact supports local deployment, fetch the extension binary if (config?.LocalDeployEnabled == true && config?.SupportedArchitectures is { } binaryArchitectures) { if (SupportedArchitectures.TryGetCurrent() is not { } architecture) { - throw new InvalidOperationException($"Failed to determine the system OS or architecture to execute provider extension \"{reference}\"."); + throw new InvalidOperationException($"Failed to determine the system OS or architecture to execute extension \"{reference}\"."); } if (!binaryArchitectures.Contains(architecture.Name) || - result.TryGetSingleLayerByMediaType(BicepMediaTypes.GetProviderArtifactLayerV1Binary(architecture)) is not { } sourceData) + result.TryGetSingleLayerByMediaType(BicepMediaTypes.GetExtensionArtifactLayerV1Binary(architecture)) is not { } sourceData) { - throw new InvalidOperationException($"The provider extension \"{reference}\" does not support architecture {architecture.Name}."); + throw new InvalidOperationException($"The extension \"{reference}\" does not support architecture {architecture.Name}."); } using var binaryStream = sourceData.ToStream(); - var binaryUri = this.GetArtifactFileUri(reference, ArtifactFileType.ProviderBinary); + var binaryUri = this.GetArtifactFileUri(reference, ArtifactFileType.ExtensionBinary); this.FileResolver.Write(binaryUri, binaryStream); if (!OperatingSystem.IsWindows()) { @@ -548,9 +546,9 @@ private string GetArtifactFilePath(OciArtifactReference reference, ArtifactFileT ArtifactFileType.Lock => "lock", ArtifactFileType.Manifest => "manifest", ArtifactFileType.Metadata => "metadata", - ArtifactFileType.Provider => "types.tgz", + ArtifactFileType.Extension => "types.tgz", ArtifactFileType.Source => "source.tgz", - ArtifactFileType.ProviderBinary => "provider.bin", + ArtifactFileType.ExtensionBinary => "extension.bin", _ => throw new NotImplementedException($"Unexpected artifact file type '{fileType}'.") }; @@ -569,8 +567,8 @@ public override ResultWithException TryGetSource(OciArtifactRefer return new(new SourceNotAvailableException()); } - public override Uri? TryGetProviderBinary(OciArtifactReference reference) - => GetArtifactFileUri(reference, ArtifactFileType.ProviderBinary); + public override Uri? TryGetExtensionBinary(OciArtifactReference reference) + => GetArtifactFileUri(reference, ArtifactFileType.ExtensionBinary); private enum ArtifactFileType { @@ -578,9 +576,9 @@ private enum ArtifactFileType Manifest, Lock, Metadata, - Provider, + Extension, Source, - ProviderBinary, + ExtensionBinary, }; } } diff --git a/src/Bicep.Core/Registry/Providers/ProviderV1Archive.cs b/src/Bicep.Core/Registry/Providers/ExtensionV1Archive.cs similarity index 82% rename from src/Bicep.Core/Registry/Providers/ProviderV1Archive.cs rename to src/Bicep.Core/Registry/Providers/ExtensionV1Archive.cs index 0b5e1c3b6d1..f994b774d10 100644 --- a/src/Bicep.Core/Registry/Providers/ProviderV1Archive.cs +++ b/src/Bicep.Core/Registry/Providers/ExtensionV1Archive.cs @@ -6,11 +6,11 @@ using Bicep.Core.Extensions; using Bicep.Core.Registry.Oci; -namespace Bicep.Core.Registry.Providers; +namespace Bicep.Core.Registry.Extensions; -public static class ProviderV1Archive +public static class ExtensionV1Archive { - public static async Task Build(ProviderPackage provider) + public static async Task Build(ExtensionPackage package) { using var stream = new MemoryStream(); @@ -18,9 +18,9 @@ public static async Task Build(ProviderPackage provider) { using var tarWriter = new TarWriter(gzStream, leaveOpen: true); - await AddFileToTar(tarWriter, "types.tgz", provider.Types); + await AddFileToTar(tarWriter, "types.tgz", package.Types); - foreach (var binary in provider.Binaries) + foreach (var binary in package.Binaries) { await AddFileToTar(tarWriter, $"{binary.Architecture.Name}.bin", binary.Data); } @@ -31,7 +31,7 @@ public static async Task Build(ProviderPackage provider) return BinaryData.FromStream(stream); } - public static ProviderPackage Read(BinaryData binaryData) + public static ExtensionPackage Read(BinaryData binaryData) { using var gzipStream = new GZipStream(binaryData.ToStream(), CompressionMode.Decompress); using var tarReader = new TarReader(gzipStream); @@ -44,7 +44,7 @@ public static ProviderPackage Read(BinaryData binaryData) dataDict[entry.Name] = BinaryData.FromStream(stream); } - var binaries = new List(); + var binaries = new List(); foreach (var architecture in SupportedArchitectures.All) { if (dataDict.TryGetValue($"{architecture.Name}.bin") is { } binary) diff --git a/src/Bicep.Core/Registry/Providers/TypesV1Archive.cs b/src/Bicep.Core/Registry/Providers/TypesV1Archive.cs index 330757f40f4..48642a90c84 100644 --- a/src/Bicep.Core/Registry/Providers/TypesV1Archive.cs +++ b/src/Bicep.Core/Registry/Providers/TypesV1Archive.cs @@ -13,11 +13,11 @@ using Bicep.Core.Extensions; using Bicep.Core.Intermediate; -namespace Bicep.Core.Registry.Providers; +namespace Bicep.Core.Registry.Extensions; public static class TypesV1Archive { - public static async Task GenerateProviderTarStream(IFileSystem fileSystem, string indexJsonPath) + public static async Task GenerateExtensionTarStream(IFileSystem fileSystem, string indexJsonPath) { using var stream = new MemoryStream(); diff --git a/src/Bicep.Core/Registry/TemplateSpecModuleRegistry.cs b/src/Bicep.Core/Registry/TemplateSpecModuleRegistry.cs index c12f3c8a92e..e069b61dbb4 100644 --- a/src/Bicep.Core/Registry/TemplateSpecModuleRegistry.cs +++ b/src/Bicep.Core/Registry/TemplateSpecModuleRegistry.cs @@ -59,8 +59,8 @@ public override bool IsArtifactRestoreRequired(TemplateSpecModuleReference refer public override Task PublishModule(TemplateSpecModuleReference reference, BinaryData compiled, BinaryData? bicepSources, string? documentationUri, string? description) => throw new NotSupportedException("Template Spec modules cannot be published."); - public override Task PublishProvider(TemplateSpecModuleReference reference, ProviderPackage provider) - => throw new NotSupportedException("Template Spec providers cannot be published."); + public override Task PublishExtension(TemplateSpecModuleReference reference, ExtensionPackage package) + => throw new NotSupportedException("Template Spec extensions cannot be published."); public override Task CheckArtifactExists(ArtifactType artifactType, TemplateSpecModuleReference reference) => throw new NotSupportedException("Template Spec modules cannot be published."); @@ -147,7 +147,7 @@ public override ResultWithException TryGetSource(TemplateSpecModu return new(new SourceNotAvailableException()); } - public override Uri? TryGetProviderBinary(TemplateSpecModuleReference reference) + public override Uri? TryGetExtensionBinary(TemplateSpecModuleReference reference) => null; } } diff --git a/src/Bicep.Core/Semantics/DeclarationVisitor.cs b/src/Bicep.Core/Semantics/DeclarationVisitor.cs index d238efc9d11..3a8179bdc33 100644 --- a/src/Bicep.Core/Semantics/DeclarationVisitor.cs +++ b/src/Bicep.Core/Semantics/DeclarationVisitor.cs @@ -20,7 +20,7 @@ namespace Bicep.Core.Semantics { public sealed class DeclarationVisitor : AstVisitor { - private readonly ImmutableDictionary namespaceResults; + private readonly ImmutableDictionary namespaceResults; private readonly IArtifactFileLookup artifactFileLookup; private readonly ISemanticModelLookup modelLookup; private readonly ISymbolContext context; @@ -29,7 +29,7 @@ public sealed class DeclarationVisitor : AstVisitor private readonly Stack activeScopes = new(); private DeclarationVisitor( - ImmutableDictionary namespaceResults, + ImmutableDictionary namespaceResults, IArtifactFileLookup sourceFileLookup, ISemanticModelLookup modelLookup, ISymbolContext context, @@ -175,11 +175,11 @@ public override void VisitAssertDeclarationSyntax(AssertDeclarationSyntax syntax DeclareSymbol(symbol); } - public override void VisitProviderDeclarationSyntax(ProviderDeclarationSyntax syntax) + public override void VisitExtensionDeclarationSyntax(ExtensionDeclarationSyntax syntax) { - base.VisitProviderDeclarationSyntax(syntax); + base.VisitExtensionDeclarationSyntax(syntax); - DeclareSymbol(new ProviderNamespaceSymbol(this.context, syntax, namespaceResults[syntax].Type)); + DeclareSymbol(new ExtensionNamespaceSymbol(this.context, syntax, namespaceResults[syntax].Type)); } public override void VisitParameterAssignmentSyntax(ParameterAssignmentSyntax syntax) diff --git a/src/Bicep.Core/Semantics/Decorator.cs b/src/Bicep.Core/Semantics/Decorator.cs index 1e90bd12e5c..2ae74e1960c 100644 --- a/src/Bicep.Core/Semantics/Decorator.cs +++ b/src/Bicep.Core/Semantics/Decorator.cs @@ -46,7 +46,7 @@ public void Validate(DecoratorSyntax decoratorSyntax, TypeSymbol targetType, ITy { // The following line makes the simplifying assumption that nullability does not impact decorator validity. This assumption is true at the moment // because aside from @metadata and @description (which are attachable to targets of any type), all decorators represent validation constraints - // (which are no-ops on null values within the ARM runtime). This assumption may or may not hold when 3P extensibility providers define their own + // (which are no-ops on null values within the ARM runtime). This assumption may or may not hold when 3P extensions define their own // decorators, at which point we'll probably want a .AllowsNullableTargets property on decorators or the like. targetType = RemoveImplicitNull(targetType); diff --git a/src/Bicep.Core/Semantics/ProviderNamespaceSymbol.cs b/src/Bicep.Core/Semantics/ExtensionNamespaceSymbol.cs similarity index 56% rename from src/Bicep.Core/Semantics/ProviderNamespaceSymbol.cs rename to src/Bicep.Core/Semantics/ExtensionNamespaceSymbol.cs index 7bf2a6d4814..77b121ecc74 100644 --- a/src/Bicep.Core/Semantics/ProviderNamespaceSymbol.cs +++ b/src/Bicep.Core/Semantics/ExtensionNamespaceSymbol.cs @@ -8,39 +8,39 @@ namespace Bicep.Core.Semantics { - public class ProviderNamespaceSymbol : DeclaredSymbol, INamespaceSymbol + public class ExtensionNamespaceSymbol : DeclaredSymbol, INamespaceSymbol { - private class ProviderNameSource : ISymbolNameSource + private class ExtensionNameSource : ISymbolNameSource { - private readonly ProviderDeclarationSyntax provider; + private readonly ExtensionDeclarationSyntax extension; - public ProviderNameSource(ProviderDeclarationSyntax provider) + public ExtensionNameSource(ExtensionDeclarationSyntax extension) { - this.provider = provider; + this.extension = extension; } public bool IsValid => true; - public TextSpan Span => provider.Alias?.Span ?? provider.SpecificationString.Span; + public TextSpan Span => extension.Alias?.Span ?? extension.SpecificationString.Span; } - public ProviderNamespaceSymbol(ISymbolContext context, ProviderDeclarationSyntax declaringSyntax, TypeSymbol declaredType) + public ExtensionNamespaceSymbol(ISymbolContext context, ExtensionDeclarationSyntax declaringSyntax, TypeSymbol declaredType) : base( context, declaringSyntax.Alias?.IdentifierName ?? declaredType.Name, declaringSyntax, - new ProviderNameSource(declaringSyntax)) + new ExtensionNameSource(declaringSyntax)) { this.DeclaredType = declaredType; } public TypeSymbol DeclaredType { get; } - public ProviderDeclarationSyntax DeclaringProvider => (ProviderDeclarationSyntax)this.DeclaringSyntax; + public ExtensionDeclarationSyntax DeclaringExtension => (ExtensionDeclarationSyntax)this.DeclaringSyntax; public override void Accept(SymbolVisitor visitor) { - visitor.VisitProviderNamespaceSymbol(this); + visitor.VisitExtensionNamespaceSymbol(this); } public override SymbolKind Kind => SymbolKind.ImportedNamespace; diff --git a/src/Bicep.Core/Semantics/FileSymbol.cs b/src/Bicep.Core/Semantics/FileSymbol.cs index 45c7a31d391..27ca28844fb 100644 --- a/src/Bicep.Core/Semantics/FileSymbol.cs +++ b/src/Bicep.Core/Semantics/FileSymbol.cs @@ -31,7 +31,7 @@ public FileSymbol( this.LocalScopes = fileScope.ChildScopes; var declarationsBySyntax = ImmutableDictionary.CreateBuilder(); - var providerDeclarations = ImmutableArray.CreateBuilder(); + var extensionDeclarations = ImmutableArray.CreateBuilder(); var metadataDeclarations = ImmutableArray.CreateBuilder(); var parameterDeclarations = ImmutableArray.CreateBuilder(); var typeDeclarations = ImmutableArray.CreateBuilder(); @@ -55,8 +55,8 @@ public FileSymbol( switch (declaration) { - case ProviderNamespaceSymbol providerNamespace: - providerDeclarations.Add(providerNamespace); + case ExtensionNamespaceSymbol extensionNamespace: + extensionDeclarations.Add(extensionNamespace); break; case MetadataSymbol metadata: metadataDeclarations.Add(metadata); @@ -110,7 +110,7 @@ public FileSymbol( } DeclarationsBySyntax = declarationsBySyntax.ToImmutable(); - ProviderDeclarations = providerDeclarations.ToImmutable(); + ExtensionDeclarations = extensionDeclarations.ToImmutable(); MetadataDeclarations = metadataDeclarations.ToImmutable(); ParameterDeclarations = parameterDeclarations.ToImmutable(); TypeDeclarations = typeDeclarations.ToImmutable(); @@ -135,7 +135,7 @@ public FileSymbol( public override IEnumerable Descendants => this.NamespaceResolver.ImplicitNamespaces.Values - .Concat(this.ProviderDeclarations) + .Concat(this.ExtensionDeclarations) .Concat(this.LocalScopes) .Concat(this.MetadataDeclarations) .Concat(this.ParameterDeclarations) @@ -156,7 +156,7 @@ public FileSymbol( public IEnumerable Namespaces => this.NamespaceResolver.ImplicitNamespaces.Values - .Concat(this.ProviderDeclarations); + .Concat(this.ExtensionDeclarations); public override SymbolKind Kind => SymbolKind.File; @@ -172,7 +172,7 @@ public FileSymbol( public ImmutableDictionary DeclarationsBySyntax { get; } - public ImmutableArray ProviderDeclarations { get; } + public ImmutableArray ExtensionDeclarations { get; } public ImmutableArray MetadataDeclarations { get; } @@ -296,7 +296,7 @@ private void ValidateScope(ILanguageScope scope) // so we don't need to look at other levels var outputDeclarations = scope.Declarations.OfType(); var metadataDeclarations = scope.Declarations.OfType(); - var namespaceDeclarations = scope.Declarations.OfType(); + var namespaceDeclarations = scope.Declarations.OfType(); var referenceableDeclarations = scope.Declarations.Where(decl => decl.CanBeReferenced()); // all symbols apart from outputs are in the same namespace, so check for uniqueness. @@ -327,7 +327,7 @@ private void ValidateScope(ILanguageScope scope) // TODO: validation for alias x name. this.Diagnostics.AddRange( FindDuplicateNamespaceImports(namespaceDeclarations) - .Select(kvp => DiagnosticBuilder.ForPosition(kvp.Key.DeclaringProvider.SpecificationString).NamespaceMultipleDeclarations(kvp.Value.ProviderName))); + .Select(kvp => DiagnosticBuilder.ForPosition(kvp.Key.DeclaringExtension.SpecificationString).NamespaceMultipleDeclarations(kvp.Value.ExtensionName))); } private static IEnumerable FindDuplicateNamedSymbols(IEnumerable symbols) @@ -337,9 +337,9 @@ private static IEnumerable FindDuplicateNamedSymbols(IEnumerable .Where(group => group.Count() > 1) .SelectMany(group => group); - private static IEnumerable> FindDuplicateNamespaceImports(IEnumerable symbols) + private static IEnumerable> FindDuplicateNamespaceImports(IEnumerable symbols) { - var typeBySymbol = new Dictionary(); + var typeBySymbol = new Dictionary(); foreach (var symbol in symbols) { @@ -351,7 +351,7 @@ private static IEnumerable> return typeBySymbol .Where(kvp => kvp.Value.Settings.IsSingleton) - .GroupBy(kvp => kvp.Value.ProviderName, LanguageConstants.IdentifierComparer) + .GroupBy(kvp => kvp.Value.ExtensionName, LanguageConstants.IdentifierComparer) .Where(group => group.Count() > 1) .SelectMany(group => group); } diff --git a/src/Bicep.Core/Semantics/NameBindingVisitor.cs b/src/Bicep.Core/Semantics/NameBindingVisitor.cs index 2dfbb4d337e..d128dcfd815 100644 --- a/src/Bicep.Core/Semantics/NameBindingVisitor.cs +++ b/src/Bicep.Core/Semantics/NameBindingVisitor.cs @@ -223,9 +223,9 @@ public override void VisitOutputDeclarationSyntax(OutputDeclarationSyntax syntax allowedFlags = FunctionFlags.Default; } - public override void VisitProviderDeclarationSyntax(ProviderDeclarationSyntax syntax) + public override void VisitExtensionDeclarationSyntax(ExtensionDeclarationSyntax syntax) { - allowedFlags = FunctionFlags.ProviderDecorator; + allowedFlags = FunctionFlags.ExtensionDecorator; this.VisitNodes(syntax.LeadingNodes); this.Visit(syntax.Keyword); this.Visit(syntax.SpecificationString); diff --git a/src/Bicep.Core/Semantics/Namespaces/AzNamespaceType.cs b/src/Bicep.Core/Semantics/Namespaces/AzNamespaceType.cs index 250530ef9f5..fe603d85b40 100644 --- a/src/Bicep.Core/Semantics/Namespaces/AzNamespaceType.cs +++ b/src/Bicep.Core/Semantics/Namespaces/AzNamespaceType.cs @@ -21,7 +21,7 @@ public static class AzNamespaceType { public const string BuiltInName = "az"; public const string GetSecretFunctionName = "getSecret"; - public static readonly string EmbeddedAzProviderVersion = typeof(AzTypeLoader).Assembly.GetCustomAttribute()?.Version + public static readonly string EmbeddedAzExtensionVersion = typeof(AzTypeLoader).Assembly.GetCustomAttribute()?.Version ?? throw new UnreachableException("The 'Azure.Bicep.Types.Az' assembly should always have a file version attribute."); private static readonly Lazy TypeProviderLazy @@ -31,10 +31,10 @@ private static readonly Lazy TypeProviderLazy public static NamespaceSettings Settings { get; } = new( IsSingleton: true, - BicepProviderName: BuiltInName, + BicepExtensionName: BuiltInName, ConfigurationType: null, - ArmTemplateProviderName: "AzureResourceManager", - ArmTemplateProviderVersion: new Version(EmbeddedAzProviderVersion).ToString(3)); + TemplateExtensionName: "AzureResourceManager", + TemplateExtensionVersion: new Version(EmbeddedAzExtensionVersion).ToString(3)); private delegate bool VisibilityDelegate(ResourceScope scope, BicepSourceFileKind sourceFileKind); private record NamespaceValue(T Value, VisibilityDelegate IsVisible); @@ -527,10 +527,10 @@ public static NamespaceType Create(string? aliasName, ResourceScope scope, IReso aliasName ?? BuiltInName, new NamespaceSettings( IsSingleton: true, - BicepProviderName: BuiltInName, + BicepExtensionName: BuiltInName, ConfigurationType: null, - ArmTemplateProviderName: "AzureResourceManager", - ArmTemplateProviderVersion: EmbeddedAzProviderVersion), + TemplateExtensionName: "AzureResourceManager", + TemplateExtensionVersion: EmbeddedAzExtensionVersion), ImmutableArray.Empty, Overloads.Where(x => x.IsVisible(scope, sourceFileKind)).Select(x => x.Value), ImmutableArray.Empty, diff --git a/src/Bicep.Core/Semantics/Namespaces/K8sNamespaceType.cs b/src/Bicep.Core/Semantics/Namespaces/K8sNamespaceType.cs index cd540d9d09d..5b05e2ef508 100644 --- a/src/Bicep.Core/Semantics/Namespaces/K8sNamespaceType.cs +++ b/src/Bicep.Core/Semantics/Namespaces/K8sNamespaceType.cs @@ -18,10 +18,10 @@ private static readonly Lazy TypeProviderLazy public static NamespaceSettings Settings { get; } = new( IsSingleton: true, - BicepProviderName: BuiltInName, + BicepExtensionName: BuiltInName, ConfigurationType: GetConfigurationType(), - ArmTemplateProviderName: "Kubernetes", - ArmTemplateProviderVersion: BuiltInVersion); + TemplateExtensionName: "Kubernetes", + TemplateExtensionVersion: BuiltInVersion); private static ObjectType GetConfigurationType() { diff --git a/src/Bicep.Core/Semantics/Namespaces/MicrosoftGraphNamespaceType.cs b/src/Bicep.Core/Semantics/Namespaces/MicrosoftGraphNamespaceType.cs index 6efa9dfb87d..ab9b459731a 100644 --- a/src/Bicep.Core/Semantics/Namespaces/MicrosoftGraphNamespaceType.cs +++ b/src/Bicep.Core/Semantics/Namespaces/MicrosoftGraphNamespaceType.cs @@ -16,10 +16,10 @@ private static readonly Lazy TypeProviderLazy public static NamespaceSettings Settings { get; } = new( IsSingleton: true, - BicepProviderName: BuiltInName, + BicepExtensionName: BuiltInName, ConfigurationType: null, - ArmTemplateProviderName: "MicrosoftGraph", - ArmTemplateProviderVersion: "1.0.0"); + TemplateExtensionName: "MicrosoftGraph", + TemplateExtensionVersion: "1.0.0"); public static NamespaceType Create(string aliasName) { diff --git a/src/Bicep.Core/Semantics/Namespaces/NamespaceProvider.cs b/src/Bicep.Core/Semantics/Namespaces/NamespaceProvider.cs index 28bd49bc8a7..8aea7d478ff 100644 --- a/src/Bicep.Core/Semantics/Namespaces/NamespaceProvider.cs +++ b/src/Bicep.Core/Semantics/Namespaces/NamespaceProvider.cs @@ -21,7 +21,7 @@ namespace Bicep.Core.Semantics.Namespaces; public record NamespaceResult( string Name, TypeSymbol Type, - ProviderDeclarationSyntax? Origin); + ExtensionDeclarationSyntax? Origin); public class NamespaceProvider : INamespaceProvider { @@ -39,60 +39,60 @@ public IEnumerable GetNamespaces( BicepSourceFile sourceFile, ResourceScope targetScope) { - var providerDeclarations = SyntaxAggregator.AggregateByType(sourceFile.ProgramSyntax).ToImmutableArray(); - var implicitProviders = artifactFileLookup.ImplicitProviders[sourceFile].ToDictionary(x => x.Name, LanguageConstants.IdentifierComparer); + var extensions = SyntaxAggregator.AggregateByType(sourceFile.ProgramSyntax).ToImmutableArray(); + var implicitExtensions = artifactFileLookup.ImplicitExtensions[sourceFile].ToDictionary(x => x.Name, LanguageConstants.IdentifierComparer); - if (implicitProviders.TryGetValue(SystemNamespaceType.BuiltInName, out var sysProvider)) + if (implicitExtensions.TryGetValue(SystemNamespaceType.BuiltInName, out var sysProvider)) { // TODO proper diag here - var nsType = ErrorType.Create(DiagnosticBuilder.ForDocumentStart().ProvidersAreDisabled()); + var nsType = ErrorType.Create(DiagnosticBuilder.ForDocumentStart().ExtensionsAreDisabled()); yield return new(sysProvider.Name, nsType, null); } var assignedProviders = new HashSet(LanguageConstants.IdentifierComparer); - foreach (var provider in providerDeclarations) + foreach (var extension in extensions) { - var type = GetNamespaceType(rootConfig, features, artifactFileLookup, sourceFile, targetScope, provider); + var type = GetNamespaceType(rootConfig, features, artifactFileLookup, sourceFile, targetScope, extension); if (type is NamespaceType validType) { - assignedProviders.Add(validType.ProviderName); + assignedProviders.Add(validType.ExtensionName); } - var name = provider.Alias?.IdentifierName ?? type.Name; - yield return new(name, type, provider); + var name = extension.Alias?.IdentifierName ?? type.Name; + yield return new(name, type, extension); } - // sys isn't included in the implicit providers config, because we don't want users to customize it. + // sys isn't included in the implicit extensions config, because we don't want users to customize it. // for the purposes of this logic, it's simpler to treat it as if it is. - implicitProviders[SystemNamespaceType.BuiltInName] = new ImplicitProvider(SystemNamespaceType.BuiltInName, new("builtin:"), null); + implicitExtensions[SystemNamespaceType.BuiltInName] = new ImplicitExtension(SystemNamespaceType.BuiltInName, new("builtin:"), null); - foreach (var (providerName, implicitProvider) in implicitProviders) + foreach (var (extensionName, implicitExtension) in implicitExtensions) { - if (assignedProviders.Contains(providerName)) + if (assignedProviders.Contains(extensionName)) { - // if an implicit provider has been explicitly registered in a file, it shouldn't also be registered as implicit + // if an implicit extension has been explicitly registered in a file, it shouldn't also be registered as implicit continue; } - var nsType = GetNamespaceTypeForImplicitProvider(rootConfig, features, sourceFile, targetScope, implicitProvider, null); - yield return new(providerName, nsType, null); + var nsType = GetNamespaceTypeForImplicitExtension(rootConfig, features, sourceFile, targetScope, implicitExtension, null); + yield return new(extensionName, nsType, null); } } - private TypeSymbol GetNamespaceTypeForImplicitProvider( + private TypeSymbol GetNamespaceTypeForImplicitExtension( RootConfiguration rootConfig, IFeatureProvider features, BicepSourceFile sourceFile, ResourceScope targetScope, - ImplicitProvider implicitProvider, - ProviderDeclarationSyntax? syntax) + ImplicitExtension extension, + ExtensionDeclarationSyntax? syntax) { - if (implicitProvider.Config is null) + if (extension.Config is null) { - return ErrorType.Create(DiagnosticBuilder.ForDocumentStart().InvalidProvider_ImplicitProviderMissingConfig(rootConfig.ConfigFileUri, implicitProvider.Name)); + return ErrorType.Create(DiagnosticBuilder.ForDocumentStart().InvalidExtension_ImplicitExtensionMissingConfig(rootConfig.ConfigFileUri, extension.Name)); } - return GetNamespaceTypeForConfigManagedProvider(rootConfig, features, sourceFile, targetScope, implicitProvider.Artifact, syntax, implicitProvider.Name); + return GetNamespaceTypeForConfigManagedExtension(rootConfig, features, sourceFile, targetScope, extension.Artifact, syntax, extension.Name); } private TypeSymbol GetNamespaceType( @@ -101,11 +101,11 @@ private TypeSymbol GetNamespaceType( IArtifactFileLookup artifactFileLookup, BicepSourceFile sourceFile, ResourceScope targetScope, - ProviderDeclarationSyntax syntax) + ExtensionDeclarationSyntax syntax) { if (!features.ExtensibilityEnabled) { - return ErrorType.Create(DiagnosticBuilder.ForPosition(syntax).ProvidersAreDisabled()); + return ErrorType.Create(DiagnosticBuilder.ForPosition(syntax).ExtensionsAreDisabled()); } if (syntax.SpecificationString.IsSkipped) @@ -131,24 +131,24 @@ private TypeSymbol GetNamespaceType( return ErrorType.Empty(); } - return GetNamespaceTypeForConfigManagedProvider(rootConfig, features, sourceFile, targetScope, null, syntax, identifier.IdentifierName); + return GetNamespaceTypeForConfigManagedExtension(rootConfig, features, sourceFile, targetScope, null, syntax, identifier.IdentifierName); } - protected virtual TypeSymbol GetNamespaceTypeForConfigManagedProvider( + protected virtual TypeSymbol GetNamespaceTypeForConfigManagedExtension( RootConfiguration rootConfig, IFeatureProvider features, BicepSourceFile sourceFile, ResourceScope targetScope, ArtifactResolutionInfo? artifact, - ProviderDeclarationSyntax? syntax, - string providerName) + ExtensionDeclarationSyntax? syntax, + string extensionName) { - var aliasName = syntax?.Alias?.IdentifierName ?? providerName; + var aliasName = syntax?.Alias?.IdentifierName ?? extensionName; var diagBuilder = syntax is { } ? DiagnosticBuilder.ForPosition(syntax) : DiagnosticBuilder.ForDocumentStart(); if (artifact is { }) { - // not a built-in provider + // not a built-in extension if (GetNamespaceTypeForArtifact(features, artifact, sourceFile, targetScope, aliasName).IsSuccess(out var namespaceType, out var errorBuilder)) { return namespaceType; @@ -157,28 +157,28 @@ protected virtual TypeSymbol GetNamespaceTypeForConfigManagedProvider( return ErrorType.Create(errorBuilder(diagBuilder)); } - // built-in provider - if (LanguageConstants.IdentifierComparer.Equals(providerName, SystemNamespaceType.BuiltInName)) + // built-in extension + if (LanguageConstants.IdentifierComparer.Equals(extensionName, SystemNamespaceType.BuiltInName)) { return SystemNamespaceType.Create(aliasName, features, sourceFile.FileKind); } - if (LanguageConstants.IdentifierComparer.Equals(providerName, AzNamespaceType.BuiltInName)) + if (LanguageConstants.IdentifierComparer.Equals(extensionName, AzNamespaceType.BuiltInName)) { return AzNamespaceType.Create(aliasName, targetScope, resourceTypeProviderFactory.GetBuiltInAzResourceTypesProvider(), sourceFile.FileKind); } - if (LanguageConstants.IdentifierComparer.Equals(providerName, MicrosoftGraphNamespaceType.BuiltInName)) + if (LanguageConstants.IdentifierComparer.Equals(extensionName, MicrosoftGraphNamespaceType.BuiltInName)) { return MicrosoftGraphNamespaceType.Create(aliasName); } - if (LanguageConstants.IdentifierComparer.Equals(providerName, K8sNamespaceType.BuiltInName)) + if (LanguageConstants.IdentifierComparer.Equals(extensionName, K8sNamespaceType.BuiltInName)) { return K8sNamespaceType.Create(aliasName); } - return ErrorType.Create(diagBuilder.InvalidProvider_NotABuiltInProvider(rootConfig.ConfigFileUri, providerName)); + return ErrorType.Create(diagBuilder.InvalidExtension_NotABuiltInExtension(rootConfig.ConfigFileUri, extensionName)); } private ResultWithDiagnostic GetNamespaceTypeForArtifact(IFeatureProvider features, ArtifactResolutionInfo artifact, BicepSourceFile sourceFile, ResourceScope targetScope, string? aliasName) diff --git a/src/Bicep.Core/Semantics/Namespaces/SystemNamespaceType.cs b/src/Bicep.Core/Semantics/Namespaces/SystemNamespaceType.cs index 91cda9c0183..22005025e38 100644 --- a/src/Bicep.Core/Semantics/Namespaces/SystemNamespaceType.cs +++ b/src/Bicep.Core/Semantics/Namespaces/SystemNamespaceType.cs @@ -48,10 +48,10 @@ public static class SystemNamespaceType public static NamespaceSettings Settings { get; } = new( IsSingleton: true, - BicepProviderName: BuiltInName, + BicepExtensionName: BuiltInName, ConfigurationType: null, - ArmTemplateProviderName: "System", - ArmTemplateProviderVersion: "1.0.0"); + TemplateExtensionName: "System", + TemplateExtensionVersion: "1.0.0"); private delegate bool VisibilityDelegate(IFeatureProvider featureProvider, BicepSourceFileKind sourceFileKind); diff --git a/src/Bicep.Core/Semantics/Namespaces/ThirdPartyNamespaceType.cs b/src/Bicep.Core/Semantics/Namespaces/ThirdPartyNamespaceType.cs index 0e590326df7..ef09d53b473 100644 --- a/src/Bicep.Core/Semantics/Namespaces/ThirdPartyNamespaceType.cs +++ b/src/Bicep.Core/Semantics/Namespaces/ThirdPartyNamespaceType.cs @@ -13,10 +13,10 @@ public static class ThirdPartyNamespaceType { public static NamespaceSettings Settings { get; } = new( IsSingleton: true, - BicepProviderName: string.Empty, + BicepExtensionName: string.Empty, ConfigurationType: null, - ArmTemplateProviderName: string.Empty, - ArmTemplateProviderVersion: string.Empty); + TemplateExtensionName: string.Empty, + TemplateExtensionVersion: string.Empty); public static NamespaceType Create(string? aliasName, IResourceTypeProvider resourceTypeProvider, ArtifactReference? artifact) { @@ -27,10 +27,10 @@ public static NamespaceType Create(string? aliasName, IResourceTypeProvider reso aliasName ?? namespaceConfig.Name, new NamespaceSettings( IsSingleton: namespaceConfig.IsSingleton, - BicepProviderName: namespaceConfig.Name, + BicepExtensionName: namespaceConfig.Name, ConfigurationType: namespaceConfig.ConfigurationObject, - ArmTemplateProviderName: namespaceConfig.Name, - ArmTemplateProviderVersion: namespaceConfig.Version), + TemplateExtensionName: namespaceConfig.Name, + TemplateExtensionVersion: namespaceConfig.Version), ImmutableArray.Empty, ImmutableArray.Empty, ImmutableArray.Empty, diff --git a/src/Bicep.Core/Semantics/SemanticDiagnosticVisitor.cs b/src/Bicep.Core/Semantics/SemanticDiagnosticVisitor.cs index b06393ec0c7..6d1834c4ab4 100644 --- a/src/Bicep.Core/Semantics/SemanticDiagnosticVisitor.cs +++ b/src/Bicep.Core/Semantics/SemanticDiagnosticVisitor.cs @@ -141,9 +141,9 @@ public override void VisitBuiltInNamespaceSymbol(BuiltInNamespaceSymbol symbol) this.CollectDiagnostics(symbol); } - public override void VisitProviderNamespaceSymbol(ProviderNamespaceSymbol symbol) + public override void VisitExtensionNamespaceSymbol(ExtensionNamespaceSymbol symbol) { - base.VisitProviderNamespaceSymbol(symbol); + base.VisitExtensionNamespaceSymbol(symbol); this.CollectDiagnostics(symbol); } diff --git a/src/Bicep.Core/Semantics/SemanticModelHelper.cs b/src/Bicep.Core/Semantics/SemanticModelHelper.cs index ac9ec8a61cb..6029ba6fb21 100644 --- a/src/Bicep.Core/Semantics/SemanticModelHelper.cs +++ b/src/Bicep.Core/Semantics/SemanticModelHelper.cs @@ -37,7 +37,7 @@ public static IEnumerable GetFunctionsByName(SemanticMod { if (semanticModel.GetSymbolInfo(syntax) is FunctionSymbol function && function.DeclaringObject is NamespaceType namespaceType && - LanguageConstants.IdentifierComparer.Equals(namespaceType.ProviderName, @namespace)) + LanguageConstants.IdentifierComparer.Equals(namespaceType.ExtensionName, @namespace)) { return syntax as FunctionCallSyntaxBase; } @@ -58,7 +58,7 @@ function.DeclaringObject is NamespaceType namespaceType && return false; } - return LanguageConstants.IdentifierComparer.Equals(namespaceType.ProviderName, @namespace) && + return LanguageConstants.IdentifierComparer.Equals(namespaceType.ExtensionName, @namespace) && LanguageConstants.IdentifierComparer.Equals(functionSymbol.Name, decoratorName); }); } diff --git a/src/Bicep.Core/Semantics/SymbolVisitor.cs b/src/Bicep.Core/Semantics/SymbolVisitor.cs index d9148b64e7e..859804b964e 100644 --- a/src/Bicep.Core/Semantics/SymbolVisitor.cs +++ b/src/Bicep.Core/Semantics/SymbolVisitor.cs @@ -91,7 +91,7 @@ public virtual void VisitBuiltInNamespaceSymbol(BuiltInNamespaceSymbol symbol) VisitDescendants(symbol); } - public virtual void VisitProviderNamespaceSymbol(ProviderNamespaceSymbol symbol) + public virtual void VisitExtensionNamespaceSymbol(ExtensionNamespaceSymbol symbol) { VisitDescendants(symbol); } diff --git a/src/Bicep.Core/Syntax/AstVisitor.cs b/src/Bicep.Core/Syntax/AstVisitor.cs index 64d617118b2..dde038581f8 100644 --- a/src/Bicep.Core/Syntax/AstVisitor.cs +++ b/src/Bicep.Core/Syntax/AstVisitor.cs @@ -324,7 +324,7 @@ public override void VisitMissingDeclarationSyntax(MissingDeclarationSyntax synt this.VisitNodes(syntax.LeadingNodes); } - public override void VisitProviderDeclarationSyntax(ProviderDeclarationSyntax syntax) + public override void VisitExtensionDeclarationSyntax(ExtensionDeclarationSyntax syntax) { this.VisitNodes(syntax.LeadingNodes); this.Visit(syntax.SpecificationString); @@ -332,7 +332,7 @@ public override void VisitProviderDeclarationSyntax(ProviderDeclarationSyntax sy this.Visit(syntax.AsClause); } - public override void VisitProviderWithClauseSyntax(ProviderWithClauseSyntax syntax) + public override void VisitExtensionWithClauseSyntax(ExtensionWithClauseSyntax syntax) { this.Visit(syntax.Config); } diff --git a/src/Bicep.Core/Syntax/CstVisitor.cs b/src/Bicep.Core/Syntax/CstVisitor.cs index 495d6aa8845..9fcd454e3b2 100644 --- a/src/Bicep.Core/Syntax/CstVisitor.cs +++ b/src/Bicep.Core/Syntax/CstVisitor.cs @@ -408,7 +408,7 @@ public override void VisitMissingDeclarationSyntax(MissingDeclarationSyntax synt this.VisitNodes(syntax.LeadingNodes); } - public override void VisitProviderDeclarationSyntax(ProviderDeclarationSyntax syntax) + public override void VisitExtensionDeclarationSyntax(ExtensionDeclarationSyntax syntax) { this.VisitNodes(syntax.LeadingNodes); this.Visit(syntax.Keyword); @@ -417,7 +417,7 @@ public override void VisitProviderDeclarationSyntax(ProviderDeclarationSyntax sy this.Visit(syntax.AsClause); } - public override void VisitProviderWithClauseSyntax(ProviderWithClauseSyntax syntax) + public override void VisitExtensionWithClauseSyntax(ExtensionWithClauseSyntax syntax) { this.Visit(syntax.Keyword); this.Visit(syntax.Config); diff --git a/src/Bicep.Core/Syntax/ProviderDeclarationSyntax.cs b/src/Bicep.Core/Syntax/ExtensionDeclarationSyntax.cs similarity index 70% rename from src/Bicep.Core/Syntax/ProviderDeclarationSyntax.cs rename to src/Bicep.Core/Syntax/ExtensionDeclarationSyntax.cs index 2941b577f79..8c4a2ec8888 100644 --- a/src/Bicep.Core/Syntax/ProviderDeclarationSyntax.cs +++ b/src/Bicep.Core/Syntax/ExtensionDeclarationSyntax.cs @@ -8,9 +8,9 @@ namespace Bicep.Core.Syntax { - public class ProviderDeclarationSyntax : StatementSyntax, ITopLevelDeclarationSyntax, IArtifactReferenceSyntax + public class ExtensionDeclarationSyntax : StatementSyntax, ITopLevelDeclarationSyntax, IArtifactReferenceSyntax { - public ProviderDeclarationSyntax(IEnumerable leadingNodes, Token keyword, SyntaxBase specificationString, SyntaxBase withClause, SyntaxBase asClause) + public ExtensionDeclarationSyntax(IEnumerable leadingNodes, Token keyword, SyntaxBase specificationString, SyntaxBase withClause, SyntaxBase asClause) : base(leadingNodes) { AssertKeyword(keyword, nameof(keyword), LanguageConstants.ImportKeyword, LanguageConstants.ProviderKeyword, LanguageConstants.ExtensionKeyword); @@ -30,7 +30,7 @@ public ProviderDeclarationSyntax(IEnumerable leadingNodes, Token key public SyntaxBase AsClause { get; } - public ObjectSyntax? Config => (this.WithClause as ProviderWithClauseSyntax)?.Config as ObjectSyntax; + public ObjectSyntax? Config => (this.WithClause as ExtensionWithClauseSyntax)?.Config as ObjectSyntax; public IdentifierSyntax? Alias => (this.AsClause as AliasAsClauseSyntax)?.Alias; @@ -38,11 +38,11 @@ public ProviderDeclarationSyntax(IEnumerable leadingNodes, Token key public SyntaxBase SourceSyntax => SpecificationString; - public override void Accept(ISyntaxVisitor visitor) => visitor.VisitProviderDeclarationSyntax(this); + public override void Accept(ISyntaxVisitor visitor) => visitor.VisitExtensionDeclarationSyntax(this); - public ArtifactType GetArtifactType() => ArtifactType.Provider; + public ArtifactType GetArtifactType() => ArtifactType.Extension; - // if the provider specification is inlined return a value otherwise return null + // if the extension specification is inlined return a value otherwise return null public SyntaxBase? Path => this.SpecificationString as StringSyntax; } } diff --git a/src/Bicep.Core/Syntax/ProviderWithClauseSyntax.cs b/src/Bicep.Core/Syntax/ExtensionWithClauseSyntax.cs similarity index 78% rename from src/Bicep.Core/Syntax/ProviderWithClauseSyntax.cs rename to src/Bicep.Core/Syntax/ExtensionWithClauseSyntax.cs index f34a37a952d..279998de0d6 100644 --- a/src/Bicep.Core/Syntax/ProviderWithClauseSyntax.cs +++ b/src/Bicep.Core/Syntax/ExtensionWithClauseSyntax.cs @@ -5,9 +5,9 @@ namespace Bicep.Core.Syntax { - public class ProviderWithClauseSyntax : SyntaxBase + public class ExtensionWithClauseSyntax : SyntaxBase { - public ProviderWithClauseSyntax(Token keyword, SyntaxBase config) + public ExtensionWithClauseSyntax(Token keyword, SyntaxBase config) { AssertKeyword(keyword, nameof(keyword), LanguageConstants.WithKeyword); AssertSyntaxType(config, nameof(config), typeof(ObjectSyntax), typeof(SkippedTriviaSyntax)); @@ -22,6 +22,6 @@ public ProviderWithClauseSyntax(Token keyword, SyntaxBase config) public override TextSpan Span => TextSpan.Between(this.Keyword, this.Config); - public override void Accept(ISyntaxVisitor visitor) => visitor.VisitProviderWithClauseSyntax(this); + public override void Accept(ISyntaxVisitor visitor) => visitor.VisitExtensionWithClauseSyntax(this); } } diff --git a/src/Bicep.Core/Syntax/ISyntaxVisitor.cs b/src/Bicep.Core/Syntax/ISyntaxVisitor.cs index 9f9452579bf..586272d75cc 100644 --- a/src/Bicep.Core/Syntax/ISyntaxVisitor.cs +++ b/src/Bicep.Core/Syntax/ISyntaxVisitor.cs @@ -114,9 +114,9 @@ public interface ISyntaxVisitor void VisitMissingDeclarationSyntax(MissingDeclarationSyntax syntax); - void VisitProviderDeclarationSyntax(ProviderDeclarationSyntax syntax); + void VisitExtensionDeclarationSyntax(ExtensionDeclarationSyntax syntax); - void VisitProviderWithClauseSyntax(ProviderWithClauseSyntax syntax); + void VisitExtensionWithClauseSyntax(ExtensionWithClauseSyntax syntax); void VisitAliasAsClauseSyntax(AliasAsClauseSyntax syntax); diff --git a/src/Bicep.Core/Syntax/SyntaxFactory.cs b/src/Bicep.Core/Syntax/SyntaxFactory.cs index 62c5a77e9fc..7126ba5f4a9 100644 --- a/src/Bicep.Core/Syntax/SyntaxFactory.cs +++ b/src/Bicep.Core/Syntax/SyntaxFactory.cs @@ -95,7 +95,7 @@ public static Token GetCommaToken(IEnumerable? leadingTrivia = nul public static Token TargetScopeKeywordToken => CreateIdentifierTokenWithTrailingSpace(LanguageConstants.TargetScopeKeyword); public static Token ImportKeywordToken => CreateIdentifierTokenWithTrailingSpace(LanguageConstants.ImportKeyword); - public static Token ProviderKeywordToken => CreateIdentifierTokenWithTrailingSpace(LanguageConstants.ProviderKeyword); + public static Token ExtensionKeywordToken => CreateIdentifierTokenWithTrailingSpace(LanguageConstants.ExtensionKeyword); public static Token UsingKeywordToken => CreateIdentifierTokenWithTrailingSpace(LanguageConstants.UsingKeyword); public static Token MetadataKeywordToken => CreateIdentifierTokenWithTrailingSpace(LanguageConstants.MetadataKeyword); public static Token ParameterKeywordToken => CreateIdentifierTokenWithTrailingSpace(LanguageConstants.ParameterKeyword); diff --git a/src/Bicep.Core/Syntax/SyntaxRewriteVisitor.cs b/src/Bicep.Core/Syntax/SyntaxRewriteVisitor.cs index 03e241c524b..9b454811687 100644 --- a/src/Bicep.Core/Syntax/SyntaxRewriteVisitor.cs +++ b/src/Bicep.Core/Syntax/SyntaxRewriteVisitor.cs @@ -345,7 +345,7 @@ protected virtual SyntaxBase ReplaceOutputDeclarationSyntax(OutputDeclarationSyn } void ISyntaxVisitor.VisitOutputDeclarationSyntax(OutputDeclarationSyntax syntax) => ReplaceCurrent(syntax, ReplaceOutputDeclarationSyntax); - protected virtual SyntaxBase ReplaceProviderDeclarationSyntax(ProviderDeclarationSyntax syntax) + protected virtual SyntaxBase ReplaceExtensionDeclarationSyntax(ExtensionDeclarationSyntax syntax) { var hasChanges = TryRewrite(syntax.LeadingNodes, out var leadingNodes); hasChanges |= TryRewriteStrict(syntax.Keyword, out var keyword); @@ -358,11 +358,11 @@ protected virtual SyntaxBase ReplaceProviderDeclarationSyntax(ProviderDeclaratio return syntax; } - return new ProviderDeclarationSyntax(leadingNodes, keyword, specification, withClause, asClause); + return new ExtensionDeclarationSyntax(leadingNodes, keyword, specification, withClause, asClause); } - void ISyntaxVisitor.VisitProviderDeclarationSyntax(ProviderDeclarationSyntax syntax) => ReplaceCurrent(syntax, ReplaceProviderDeclarationSyntax); + void ISyntaxVisitor.VisitExtensionDeclarationSyntax(ExtensionDeclarationSyntax syntax) => ReplaceCurrent(syntax, ReplaceExtensionDeclarationSyntax); - protected virtual SyntaxBase ReplaceProviderWithClauseSyntax(ProviderWithClauseSyntax syntax) + protected virtual SyntaxBase ReplaceExtensionWithClauseSyntax(ExtensionWithClauseSyntax syntax) { var hasChanges = TryRewriteStrict(syntax.Keyword, out var keyword); hasChanges |= TryRewriteStrict(syntax.Config, out var config); @@ -372,9 +372,9 @@ protected virtual SyntaxBase ReplaceProviderWithClauseSyntax(ProviderWithClauseS return syntax; } - return new ProviderWithClauseSyntax(keyword, config); + return new ExtensionWithClauseSyntax(keyword, config); } - void ISyntaxVisitor.VisitProviderWithClauseSyntax(ProviderWithClauseSyntax syntax) => ReplaceCurrent(syntax, ReplaceProviderWithClauseSyntax); + void ISyntaxVisitor.VisitExtensionWithClauseSyntax(ExtensionWithClauseSyntax syntax) => ReplaceCurrent(syntax, ReplaceExtensionWithClauseSyntax); protected virtual SyntaxBase ReplaceAliasAsClauseSyntax(AliasAsClauseSyntax syntax) { diff --git a/src/Bicep.Core/Syntax/SyntaxVisitor.cs b/src/Bicep.Core/Syntax/SyntaxVisitor.cs index 054ecc27978..435458a2c31 100644 --- a/src/Bicep.Core/Syntax/SyntaxVisitor.cs +++ b/src/Bicep.Core/Syntax/SyntaxVisitor.cs @@ -38,9 +38,9 @@ public abstract class SyntaxVisitor : ISyntaxVisitor public abstract void VisitAliasAsClauseSyntax(AliasAsClauseSyntax syntax); - public abstract void VisitProviderDeclarationSyntax(ProviderDeclarationSyntax syntax); + public abstract void VisitExtensionDeclarationSyntax(ExtensionDeclarationSyntax syntax); - public abstract void VisitProviderWithClauseSyntax(ProviderWithClauseSyntax syntax); + public abstract void VisitExtensionWithClauseSyntax(ExtensionWithClauseSyntax syntax); public abstract void VisitInstanceFunctionCallSyntax(InstanceFunctionCallSyntax syntax); diff --git a/src/Bicep.Core/TypeSystem/DeclaredTypeManager.cs b/src/Bicep.Core/TypeSystem/DeclaredTypeManager.cs index a99aa543761..11380ba109c 100644 --- a/src/Bicep.Core/TypeSystem/DeclaredTypeManager.cs +++ b/src/Bicep.Core/TypeSystem/DeclaredTypeManager.cs @@ -59,8 +59,8 @@ public DeclaredTypeManager(ITypeManager typeManager, IBinder binder, IFeaturePro switch (syntax) { - case ProviderDeclarationSyntax provider: - return GetProviderType(provider); + case ExtensionDeclarationSyntax extension: + return GetExtensionType(extension); case MetadataDeclarationSyntax metadata: return new DeclaredTypeAssignment(this.typeManager.GetTypeInfo(metadata.Value), metadata); @@ -503,7 +503,7 @@ private TypeSymbol GetTypeReferenceForResourceType(ResourceTypeSyntax syntax) private static bool IsExtensibilityType(ResourceType resourceType) { - return resourceType.DeclaringNamespace.ProviderName != AzNamespaceType.BuiltInName; + return resourceType.DeclaringNamespace.ExtensionName != AzNamespaceType.BuiltInName; } private TypeSymbol? GetOutputValueType(SyntaxBase syntax) => binder.GetParent(syntax) switch @@ -517,7 +517,7 @@ private ITypeReference ConvertTypeExpressionToType(TypeVariableAccessSyntax synt => binder.GetSymbolInfo(syntax) switch { BuiltInNamespaceSymbol builtInNamespace => builtInNamespace.Type, - ProviderNamespaceSymbol providerNamespace => providerNamespace.Type, + ExtensionNamespaceSymbol extensionNamespace => extensionNamespace.Type, WildcardImportSymbol wildcardImport => wildcardImport.Type, AmbientTypeSymbol ambientType => UnwrapType(syntax, ambientType.Type), ImportedTypeSymbol importedType => UnwrapType(syntax, importedType.Type), @@ -925,11 +925,11 @@ TypeArrayAccessSyntax or // as is accessing elements of a resource-derived type ParameterizedTypeInstantiationSyntax parameterized when binder.GetSymbolInfo(parameterized) is AmbientTypeSymbol ambient && - ambient.DeclaringNamespace.ProviderNameEquals(SystemNamespaceType.BuiltInName) && + ambient.DeclaringNamespace.ExtensionNameEquals(SystemNamespaceType.BuiltInName) && LanguageConstants.IdentifierComparer.Equals(ambient.Name, LanguageConstants.TypeNameResource) => true, InstanceParameterizedTypeInstantiationSyntax parameterized when binder.GetSymbolInfo(parameterized.BaseExpression) is BuiltInNamespaceSymbol ns && - ns.TryGetNamespaceType()?.ProviderNameEquals(SystemNamespaceType.BuiltInName) is true && + ns.TryGetNamespaceType()?.ExtensionNameEquals(SystemNamespaceType.BuiltInName) is true && LanguageConstants.IdentifierComparer.Equals(parameterized.Name.IdentifierName, LanguageConstants.TypeNameResource) => true, _ => false, }; @@ -1127,9 +1127,9 @@ TypeSymbol maybeNullable when TypeHelper.TryRemoveNullability(maybeNullable) is TypeSymbol otherwise => otherwise, }; - private DeclaredTypeAssignment? GetProviderType(ProviderDeclarationSyntax syntax) + private DeclaredTypeAssignment? GetExtensionType(ExtensionDeclarationSyntax syntax) { - if (this.binder.GetSymbolInfo(syntax) is ProviderNamespaceSymbol importedNamespace) + if (this.binder.GetSymbolInfo(syntax) is ExtensionNamespaceSymbol importedNamespace) { return new(importedNamespace.DeclaredType, syntax); } @@ -1686,7 +1686,7 @@ AccessExpressionSyntax access when access.BaseExpression is ForSyntax // use the item's type and propagate flags return TryCreateAssignment(ResolveDiscriminatedObjects(arrayParent, syntax), syntax, arrayItemAssignment.Flags); - case ProviderWithClauseSyntax: + case ExtensionWithClauseSyntax: parent = this.binder.GetParent(parent); if (parent is null) @@ -1694,8 +1694,8 @@ AccessExpressionSyntax access when access.BaseExpression is ForSyntax throw new InvalidOperationException("Expected ImportWithClauseSyntax to have a parent."); } - if (GetDeclaredTypeAssignment(parent) is not { } providerAssignment || - providerAssignment.Reference.Type is not NamespaceType namespaceType) + if (GetDeclaredTypeAssignment(parent) is not { } extensionAssignment || + extensionAssignment.Reference.Type is not NamespaceType namespaceType) { return null; } @@ -1709,7 +1709,7 @@ AccessExpressionSyntax access when access.BaseExpression is ForSyntax // the object is an item in an array // use the item's type and propagate flags - return TryCreateAssignment(ResolveDiscriminatedObjects(namespaceType.ConfigurationType.Type, syntax), syntax, providerAssignment.Flags); + return TryCreateAssignment(ResolveDiscriminatedObjects(namespaceType.ConfigurationType.Type, syntax), syntax, extensionAssignment.Flags); case FunctionArgumentSyntax: case OutputDeclarationSyntax parentOutput when syntax == parentOutput.Value: if (GetNonNullableTypeAssignment(parent) is not { } parentAssignment) diff --git a/src/Bicep.Core/TypeSystem/FunctionFlags.cs b/src/Bicep.Core/TypeSystem/FunctionFlags.cs index 031f9d37716..ee25ccb4527 100644 --- a/src/Bicep.Core/TypeSystem/FunctionFlags.cs +++ b/src/Bicep.Core/TypeSystem/FunctionFlags.cs @@ -49,9 +49,9 @@ public enum FunctionFlags OutputDecorator = 1 << 6, /// - /// The function can be used as a provider decorator. + /// The function can be used as an extension decorator. /// - ProviderDecorator = 1 << 7, + ExtensionDecorator = 1 << 7, /// /// The function can be used in direct assignment to a module parameter with @secure decorator @@ -105,6 +105,6 @@ public enum FunctionFlags /// /// The function can be used as a decorator anywhere. /// - AnyDecorator = ParameterDecorator | VariableDecorator | FunctionDecorator | ResourceDecorator | ModuleDecorator | OutputDecorator | ProviderDecorator | MetadataDecorator | TypeDecorator, + AnyDecorator = ParameterDecorator | VariableDecorator | FunctionDecorator | ResourceDecorator | ModuleDecorator | OutputDecorator | ExtensionDecorator | MetadataDecorator | TypeDecorator, } } diff --git a/src/Bicep.Core/TypeSystem/Providers/IResourceTypeProvider.cs b/src/Bicep.Core/TypeSystem/Providers/IResourceTypeProvider.cs index 29c226acc9b..6db036b84f5 100644 --- a/src/Bicep.Core/TypeSystem/Providers/IResourceTypeProvider.cs +++ b/src/Bicep.Core/TypeSystem/Providers/IResourceTypeProvider.cs @@ -24,7 +24,7 @@ public interface IResourceTypeProvider bool HasDefinedType(ResourceTypeReference typeReference); /// - /// Returns the full list of available types defined by this provider. + /// Returns the full list of available types defined by this extension. /// IEnumerable GetAvailableTypes(); diff --git a/src/Bicep.Core/TypeSystem/Providers/ResourceTypeResolver.cs b/src/Bicep.Core/TypeSystem/Providers/ResourceTypeResolver.cs index 78ac877a1c3..c28c9512737 100644 --- a/src/Bicep.Core/TypeSystem/Providers/ResourceTypeResolver.cs +++ b/src/Bicep.Core/TypeSystem/Providers/ResourceTypeResolver.cs @@ -35,7 +35,7 @@ public static ResourceTypeResolver Create(SemanticModel semanticModel) if (resolved is (ResourceSymbol resourceSymbol, { } bodyType) && resourceSymbol.TryGetResourceType() is { } resourceType && - // this validation only applies to resources under the "az" provider + // this validation only applies to resources under the "az" extension resourceType.IsAzResource() && resourceSymbol.DeclaringResource.IsExistingResource()) { diff --git a/src/Bicep.Core/TypeSystem/ResourceDerivedTypeDiagnosticReporter.cs b/src/Bicep.Core/TypeSystem/ResourceDerivedTypeDiagnosticReporter.cs index 66088967a03..31e618796af 100644 --- a/src/Bicep.Core/TypeSystem/ResourceDerivedTypeDiagnosticReporter.cs +++ b/src/Bicep.Core/TypeSystem/ResourceDerivedTypeDiagnosticReporter.cs @@ -67,9 +67,9 @@ public ResourceDerivedTypeDiagnosticReporter(IFeatureProvider features, IBinder yield return x => x.ResourceDerivedTypesUnsupported(); } - // TODO support types derived from resources other than the `az` provider. This will require some refactoring of how provider artifacts are restored + // TODO support types derived from resources other than the `az` extension. This will require some refactoring of how extension artifacts are restored var bound = binder.NamespaceResolver.GetMatchingResourceTypes(unbound.TypeReference, ResourceTypeGenerationFlags.None) - .Where(resourceType => LanguageConstants.IdentifierComparer.Equals(resourceType.DeclaringNamespace.ProviderName, AzNamespaceType.BuiltInName)) + .Where(resourceType => LanguageConstants.IdentifierComparer.Equals(resourceType.DeclaringNamespace.ExtensionName, AzNamespaceType.BuiltInName)) .FirstOrDefault(); if (bound is null || !bound.DeclaringNamespace.ResourceTypeProvider.HasDefinedType(unbound.TypeReference)) diff --git a/src/Bicep.Core/TypeSystem/ResourceDerivedTypeResolver.cs b/src/Bicep.Core/TypeSystem/ResourceDerivedTypeResolver.cs index 0fc746af555..c9cf8b5c95c 100644 --- a/src/Bicep.Core/TypeSystem/ResourceDerivedTypeResolver.cs +++ b/src/Bicep.Core/TypeSystem/ResourceDerivedTypeResolver.cs @@ -59,9 +59,9 @@ _ when IsPrimitiveType(potentiallyUnresolved) => potentiallyUnresolved, private TypeSymbol ResolveType(IUnresolvedResourceDerivedType unresolved) { - // TODO support types derived from resources other than the `az` provider. This will require some refactoring of how provider artifacts are restored + // TODO support types derived from resources other than the `az` extension. This will require some refactoring of how extension artifacts are restored if (binder.NamespaceResolver.GetMatchingResourceTypes(unresolved.TypeReference, ResourceTypeGenerationFlags.None) - .Where(resourceType => LanguageConstants.IdentifierComparer.Equals(resourceType.DeclaringNamespace.ProviderName, AzNamespaceType.BuiltInName)) + .Where(resourceType => LanguageConstants.IdentifierComparer.Equals(resourceType.DeclaringNamespace.ExtensionName, AzNamespaceType.BuiltInName)) .FirstOrDefault() ?.Body.Type is TypeSymbol bodyType) { diff --git a/src/Bicep.Core/TypeSystem/TypeAssignmentVisitor.cs b/src/Bicep.Core/TypeSystem/TypeAssignmentVisitor.cs index 3448b24f846..4d7ffb01768 100644 --- a/src/Bicep.Core/TypeSystem/TypeAssignmentVisitor.cs +++ b/src/Bicep.Core/TypeSystem/TypeAssignmentVisitor.cs @@ -302,7 +302,7 @@ public override void VisitResourceDeclarationSyntax(ResourceDeclarationSyntax sy // TODO move into Az extension var typeSegments = resourceType.TypeReference.TypeSegments; - if (resourceType.DeclaringNamespace.ProviderName == AzNamespaceType.BuiltInName && + if (resourceType.DeclaringNamespace.ExtensionName == AzNamespaceType.BuiltInName && typeSegments.Length > 2 && typeSegments.Where((type, i) => i > 1 && i < (typeSegments.Length - 1) && StringComparer.OrdinalIgnoreCase.Equals(type, "providers")).Any()) { @@ -871,10 +871,10 @@ private TypeSymbol GetDeclaredTypeAndValidateDecorators(DecorableSyntax targetSy return declaredType; } - public override void VisitProviderDeclarationSyntax(ProviderDeclarationSyntax syntax) + public override void VisitExtensionDeclarationSyntax(ExtensionDeclarationSyntax syntax) => AssignTypeWithDiagnostics(syntax, diagnostics => { - if (binder.GetSymbolInfo(syntax) is not ProviderNamespaceSymbol namespaceSymbol) + if (binder.GetSymbolInfo(syntax) is not ExtensionNamespaceSymbol namespaceSymbol) { // We have syntax or binding errors, which should have already been handled. return ErrorType.Empty(); @@ -898,7 +898,7 @@ public override void VisitProviderDeclarationSyntax(ProviderDeclarationSyntax sy { if (namespaceType.ConfigurationType is null) { - diagnostics.Write(syntax.Config, x => x.ProviderDoesNotSupportConfiguration(namespaceType.ProviderName)); + diagnostics.Write(syntax.Config, x => x.ExtensionDoesNotSupportConfiguration(namespaceType.ExtensionName)); } else { @@ -912,7 +912,7 @@ public override void VisitProviderDeclarationSyntax(ProviderDeclarationSyntax sy namespaceType.ConfigurationType is not null && namespaceType.ConfigurationType.Properties.Values.Any(x => x.Flags.HasFlag(TypePropertyFlags.Required))) { - diagnostics.Write(syntax, x => x.ProviderRequiresConfiguration(namespaceType.ProviderName)); + diagnostics.Write(syntax, x => x.ExtensionRequiresConfiguration(namespaceType.ExtensionName)); } } @@ -1123,10 +1123,10 @@ public override void VisitWildcardImportSyntax(WildcardImportSyntax syntax) return new NamespaceType(syntax.Name.IdentifierName, new(IsSingleton: true, - BicepProviderName: syntax.Name.IdentifierName, + BicepExtensionName: syntax.Name.IdentifierName, ConfigurationType: null, - ArmTemplateProviderName: syntax.Name.IdentifierName, - ArmTemplateProviderVersion: "1.0.0"), + TemplateExtensionName: syntax.Name.IdentifierName, + TemplateExtensionVersion: "1.0.0"), nsProperties, nsFunctions, ImmutableArray.Empty, @@ -2155,7 +2155,7 @@ public override void VisitVariableAccessSyntax(VariableAccessSyntax syntax) case ImportedSymbol imported: return imported.Type; - case ProviderNamespaceSymbol provider: + case ExtensionNamespaceSymbol provider: return new DeferredTypeReference(() => VisitDeclaredSymbol(syntax, provider)); case BuiltInNamespaceSymbol @namespace: diff --git a/src/Bicep.Core/TypeSystem/TypeHelper.cs b/src/Bicep.Core/TypeSystem/TypeHelper.cs index 8b80aed6d92..f1abaecf288 100644 --- a/src/Bicep.Core/TypeSystem/TypeHelper.cs +++ b/src/Bicep.Core/TypeSystem/TypeHelper.cs @@ -536,7 +536,7 @@ public static ResultWithDiagnostic GetResourceTypeFromString(IBind return new(defaultResource); } - return new(span => span.FailedToFindResourceTypeInNamespace(namespaceType.ProviderName, typeReference.FormatName())); + return new(span => span.FailedToFindResourceTypeInNamespace(namespaceType.ExtensionName, typeReference.FormatName())); } if (!GetCombinedTypeReference(typeGenerationFlags, parentResourceType, stringContent).IsSuccess(out var typeRef, out var errorBuilder)) diff --git a/src/Bicep.Core/TypeSystem/TypeSymbolExtensions.cs b/src/Bicep.Core/TypeSystem/TypeSymbolExtensions.cs index e7c35f0fae2..184e3e24bb3 100644 --- a/src/Bicep.Core/TypeSystem/TypeSymbolExtensions.cs +++ b/src/Bicep.Core/TypeSystem/TypeSymbolExtensions.cs @@ -17,8 +17,8 @@ public static TypeSymbol UnwrapArrayType(this TypeSymbol type) => public static bool IsIntegerOrIntegerLiteral(this TypeSymbol type) => type is IntegerType or IntegerLiteralType; - public static bool ProviderNameEquals(this NamespaceType namespaceType, string providerName) - => StringComparer.Ordinal.Equals(namespaceType.ProviderName, providerName); + public static bool ExtensionNameEquals(this NamespaceType namespaceType, string extensionName) + => StringComparer.Ordinal.Equals(namespaceType.ExtensionName, extensionName); public static bool AliasNameEquals(this NamespaceType namespaceType, string aliasName) => LanguageConstants.IdentifierComparer.Equals(namespaceType.Name, aliasName); diff --git a/src/Bicep.Core/TypeSystem/TypeValidator.cs b/src/Bicep.Core/TypeSystem/TypeValidator.cs index cca68a10210..bcabae0d9ca 100644 --- a/src/Bicep.Core/TypeSystem/TypeValidator.cs +++ b/src/Bicep.Core/TypeSystem/TypeValidator.cs @@ -1252,8 +1252,8 @@ static TypeSymbol RemoveImplicitNull(TypeSymbol type, bool typeWasPreserved) // for properties, put it on the property name in the parent object ObjectPropertySyntax objectPropertyParent => (objectPropertyParent.Key, "object"), - // for provider declarations, mark the entire configuration object - ProviderWithClauseSyntax providerParent => (expression, "object"), + // for extension declarations, mark the entire configuration object + ExtensionWithClauseSyntax _ => (expression, "object"), // for declaration bodies, put it on the declaration identifier ITopLevelNamedDeclarationSyntax declarationParent => (declarationParent.Name, declarationParent.Keyword.Text), diff --git a/src/Bicep.Core/TypeSystem/Types/IUnresolvedResourceDerivedType.cs b/src/Bicep.Core/TypeSystem/Types/IUnresolvedResourceDerivedType.cs index ecd9d8158c8..dcd376d23bc 100644 --- a/src/Bicep.Core/TypeSystem/Types/IUnresolvedResourceDerivedType.cs +++ b/src/Bicep.Core/TypeSystem/Types/IUnresolvedResourceDerivedType.cs @@ -10,11 +10,11 @@ namespace Bicep.Core.TypeSystem.Types; /// IUnresolvedResourceDerivedType represents a type expressed via a reference to a resource type or partial body thereof /// (e.g., Microsoft.KeyVault/vaults@2022-07-01#/properties/accessPolicies/items). This type is "unresolved" because it /// was used in the type of a parameter, output, or exported type definition in an ARM JSON template and must be matched -/// by name to a concrete resource definition based on the configured providers of the consuming Bicep module. +/// by name to a concrete resource definition based on the configured extensions of the consuming Bicep module. /// public interface IUnresolvedResourceDerivedType { - // TODO This type needs to capture a provider identifier (built-in name or OCI reference) in order to support providers other than `az` + // TODO This type needs to capture an extension identifier (built-in name or OCI reference) in order to support extensions other than `az` public ResourceTypeReference TypeReference { get; } diff --git a/src/Bicep.Core/TypeSystem/Types/NamespaceType.cs b/src/Bicep.Core/TypeSystem/Types/NamespaceType.cs index 01e54a0464f..f0e19ae8562 100644 --- a/src/Bicep.Core/TypeSystem/Types/NamespaceType.cs +++ b/src/Bicep.Core/TypeSystem/Types/NamespaceType.cs @@ -9,10 +9,10 @@ namespace Bicep.Core.TypeSystem.Types { public record NamespaceSettings( bool IsSingleton, - string BicepProviderName, + string BicepExtensionName, ObjectType? ConfigurationType, - string ArmTemplateProviderName, - string ArmTemplateProviderVersion); + string TemplateExtensionName, + string TemplateExtensionVersion); public sealed class NamespaceType : ObjectType { @@ -43,7 +43,7 @@ public NamespaceType( public ArtifactReference? Artifact { get; } - public string ProviderName => Settings.BicepProviderName; + public string ExtensionName => Settings.BicepExtensionName; public ObjectType? ConfigurationType => Settings.ConfigurationType; } diff --git a/src/Bicep.Core/TypeSystem/Types/ResourceTypeExtensions.cs b/src/Bicep.Core/TypeSystem/Types/ResourceTypeExtensions.cs index dee9a89d238..8e25468902a 100644 --- a/src/Bicep.Core/TypeSystem/Types/ResourceTypeExtensions.cs +++ b/src/Bicep.Core/TypeSystem/Types/ResourceTypeExtensions.cs @@ -8,5 +8,5 @@ namespace Bicep.Core.TypeSystem.Types; public static class ResourceTypeExtensions { public static bool IsAzResource(this ResourceType resourceType) - => resourceType.DeclaringNamespace.ProviderNameEquals(AzNamespaceType.BuiltInName); + => resourceType.DeclaringNamespace.ExtensionNameEquals(AzNamespaceType.BuiltInName); } diff --git a/src/Bicep.Core/Workspaces/IArtifactFileLookup.cs b/src/Bicep.Core/Workspaces/IArtifactFileLookup.cs index bfee58666e2..707bbf59eef 100644 --- a/src/Bicep.Core/Workspaces/IArtifactFileLookup.cs +++ b/src/Bicep.Core/Workspaces/IArtifactFileLookup.cs @@ -15,5 +15,5 @@ public interface IArtifactFileLookup ImmutableDictionary ArtifactLookup { get; } - ImmutableDictionary> ImplicitProviders { get; } + ImmutableDictionary> ImplicitExtensions { get; } } diff --git a/src/Bicep.Core/Workspaces/SourceFileGrouping.cs b/src/Bicep.Core/Workspaces/SourceFileGrouping.cs index 6a088c6683d..7716af2ea1d 100644 --- a/src/Bicep.Core/Workspaces/SourceFileGrouping.cs +++ b/src/Bicep.Core/Workspaces/SourceFileGrouping.cs @@ -11,9 +11,9 @@ namespace Bicep.Core.Workspaces; -public record ImplicitProvider( +public record ImplicitExtension( string Name, - ProviderConfigEntry? Config, + ExtensionConfigEntry? Config, ArtifactResolutionInfo? Artifact); public record ArtifactResolutionInfo( @@ -28,21 +28,21 @@ public record SourceFileGrouping( ImmutableArray SourceFiles, ImmutableDictionary> SourceFileParentLookup, ImmutableDictionary ArtifactLookup, - ImmutableDictionary> ImplicitProviders, + ImmutableDictionary> ImplicitExtensions, ImmutableDictionary> SourceFileLookup) : IArtifactFileLookup { public IEnumerable GetArtifactsToRestore(bool force = false) { - var artifacts = ArtifactLookup.Values.Concat(ImplicitProviders.Values.SelectMany(x => x).Select(x => x.Artifact)); + var artifacts = ArtifactLookup.Values.Concat(ImplicitExtensions.Values.SelectMany(x => x).Select(x => x.Artifact)); foreach (var (_, artifact) in ArtifactLookup.Where(x => ShouldRestore(x.Value, force))) { yield return artifact; } - foreach (var (file, providers) in ImplicitProviders) + foreach (var (file, extensions) in ImplicitExtensions) { - foreach (var artifact in providers.Select(x => x.Artifact).WhereNotNull().Where(artifact => ShouldRestore(artifact, force))) + foreach (var artifact in extensions.Select(x => x.Artifact).WhereNotNull().Where(artifact => ShouldRestore(artifact, force))) { yield return artifact; } diff --git a/src/Bicep.Core/Workspaces/SourceFileGroupingBuilder.cs b/src/Bicep.Core/Workspaces/SourceFileGroupingBuilder.cs index a2fa3e6e5e8..9f7a2d50a03 100644 --- a/src/Bicep.Core/Workspaces/SourceFileGroupingBuilder.cs +++ b/src/Bicep.Core/Workspaces/SourceFileGroupingBuilder.cs @@ -25,7 +25,7 @@ public class SourceFileGroupingBuilder private readonly Dictionary> fileResultByUri; private readonly Dictionary artifactLookup; - private readonly Dictionary> implicitProviders; + private readonly Dictionary> implicitExtensions; private readonly bool forceRestore; private SourceFileGroupingBuilder( @@ -38,7 +38,7 @@ private SourceFileGroupingBuilder( this.dispatcher = moduleDispatcher; this.workspace = workspace; this.artifactLookup = new(); - this.implicitProviders = new(); + this.implicitExtensions = new(); this.fileResultByUri = new(); this.forceRestore = forceModulesRestore; } @@ -54,7 +54,7 @@ private SourceFileGroupingBuilder( this.dispatcher = moduleDispatcher; this.workspace = workspace; this.artifactLookup = current.ArtifactLookup.Where(x => x.Value.Result.IsSuccess()).ToDictionary(); - this.implicitProviders = current.ImplicitProviders.ToDictionary(x => x.Key, x => x.Value.ToHashSet()); + this.implicitExtensions = current.ImplicitExtensions.ToDictionary(x => x.Key, x => x.Value.ToHashSet()); this.fileResultByUri = current.SourceFileLookup.ToDictionary(); this.forceRestore = forceArtifactRestore; } @@ -77,11 +77,11 @@ public static SourceFileGrouping Rebuild(IFileResolver fileResolver, IFeaturePro sourceFilesRequiringRestore.Add(artifact.Origin); } - foreach (var (file, providers) in current.ImplicitProviders) + foreach (var (file, extensions) in current.ImplicitExtensions) { - foreach (var provider in providers.Where(x => x.Artifact is { } artifact && SourceFileGrouping.ShouldRestore(artifact))) + foreach (var extension in extensions.Where(x => x.Artifact is { } artifact && SourceFileGrouping.ShouldRestore(artifact))) { - builder.implicitProviders[file].Remove(provider); + builder.implicitExtensions[file].Remove(extension); sourceFilesRequiringRestore.Add(file); } } @@ -117,7 +117,7 @@ private SourceFileGrouping Build(Uri entryFileUri, IFeatureProviderFactory featu fileResultByUri.Values.Select(x => x.TryUnwrap()).WhereNotNull().ToImmutableArray(), sourceFileGraph.InvertLookup().ToImmutableDictionary(), artifactLookup.ToImmutableDictionary(), - implicitProviders.ToImmutableDictionary(x => x.Key, x => x.Value.ToImmutableHashSet()), + implicitExtensions.ToImmutableDictionary(x => x.Key, x => x.Value.ToImmutableHashSet()), fileResultByUri.ToImmutableDictionary()); } @@ -163,16 +163,16 @@ private ResultWithDiagnostic PopulateRecursive(Uri fileUri, Artifac private void PopulateRecursive(BicepSourceFile file, IFeatureProviderFactory featureProviderFactory, IConfigurationManager configurationManager, ImmutableHashSet? sourceFilesToRebuild) { var config = configurationManager.GetConfiguration(file.FileUri); - implicitProviders[file] = []; + implicitExtensions[file] = []; - // process "implicit" providers (providers defined in bicepconfig.json) - foreach (var providerName in config.ImplicitExtensions.GetImplicitProviderNames()) + // process "implicit" extensions (extensions defined in bicepconfig.json) + foreach (var extensionName in config.ImplicitExtensions.GetImplicitExtensionNames()) { - var implicitProvider = GetImplicitProvider(providerName, file, config); - implicitProviders[file].Add(implicitProvider); + var implicitExtension = GetImplicitExtension(extensionName, file, config); + implicitExtensions[file].Add(implicitExtension); } - // process all artifact references - modules & providers + // process all artifact references foreach (var restorable in GetArtifactReferences(file.ProgramSyntax)) { if (restorable.Path is NoneLiteralSyntax) @@ -180,23 +180,23 @@ private void PopulateRecursive(BicepSourceFile file, IFeatureProviderFactory fea continue; } - if (restorable is ProviderDeclarationSyntax providerDeclaration) + if (restorable is ExtensionDeclarationSyntax extensionDeclaration) { - var isBuiltInProvider = providerDeclaration.SpecificationString switch + var isBuiltInExtension = extensionDeclaration.SpecificationString switch { IdentifierSyntax identifier => config.Extensions.IsSysOrBuiltIn(identifier.IdentifierName), _ => false, }; - if (isBuiltInProvider) + if (isBuiltInExtension) { - // built-in provider - no restoration required + // built-in extension - no restoration required continue; } artifactLookup[restorable] = GetArtifactRestoreResult(file, restorable); - // recursion not needed for provider declarations + // recursion not needed for extension declarations continue; } @@ -219,26 +219,26 @@ private void PopulateRecursive(BicepSourceFile file, IFeatureProviderFactory fea } } - private ImplicitProvider GetImplicitProvider(string providerName, BicepSourceFile file, RootConfiguration config) + private ImplicitExtension GetImplicitExtension(string extensionName, BicepSourceFile file, RootConfiguration config) { - if (!config.Extensions.TryGetProviderSource(providerName).IsSuccess(out var providerEntry, out var errorBuilder)) + if (!config.Extensions.TryGetExtensionSource(extensionName).IsSuccess(out var extensionEntry, out var errorBuilder)) { - return new(providerName, null, new(file, null, null, new(errorBuilder), RequiresRestore: false)); + return new(extensionName, null, new(file, null, null, new(errorBuilder), RequiresRestore: false)); } - if (providerEntry.BuiltIn) + if (extensionEntry.BuiltIn) { - return new(providerName, providerEntry, null); + return new(extensionName, extensionEntry, null); } - if (!dispatcher.TryGetArtifactReference(ArtifactType.Provider, providerEntry.Value, file.FileUri).IsSuccess(out var artifactReference, out errorBuilder)) + if (!dispatcher.TryGetArtifactReference(ArtifactType.Extension, extensionEntry.Value, file.FileUri).IsSuccess(out var artifactReference, out errorBuilder)) { // reference is not valid - return new(providerName, providerEntry, new(file, null, null, new(errorBuilder), RequiresRestore: false)); + return new(extensionName, extensionEntry, new(file, null, null, new(errorBuilder), RequiresRestore: false)); } var (result, requiresRestore) = GetArtifactRestoreResult(artifactReference); - return new(providerName, providerEntry, new(file, null, artifactReference, result, RequiresRestore: requiresRestore)); + return new(extensionName, extensionEntry, new(file, null, artifactReference, result, RequiresRestore: requiresRestore)); } private ArtifactResolutionInfo GetArtifactRestoreResult(BicepSourceFile sourceFile, IArtifactReferenceSyntax referenceSyntax) diff --git a/src/Bicep.LangServer.IntegrationTests/CompletionTests.cs b/src/Bicep.LangServer.IntegrationTests/CompletionTests.cs index 0866289ff36..2cd5b158e92 100644 --- a/src/Bicep.LangServer.IntegrationTests/CompletionTests.cs +++ b/src/Bicep.LangServer.IntegrationTests/CompletionTests.cs @@ -1872,20 +1872,20 @@ await RunCompletionScenarioTest( } [TestMethod] - public async Task Provider_completions_work_if_feature_enabled() + public async Task Extension_completions_work_if_feature_enabled() { var fileWithCursors = @" | - provider ns1 | - provider ns2 a| - provider ns3 as| - provider | - provider a| + extension ns1 | + extension ns2 a| + extension ns3 as| + extension | + extension a| "; await RunCompletionScenarioTest(this.TestContext, ServerWithExtensibilityEnabled, fileWithCursors, completions => completions.Should().SatisfyRespectively( - c => c!.Select(x => x.Label).Should().Contain("provider"), + c => c!.Select(x => x.Label).Should().Contain("extension"), c => c!.Select(x => x.Label).Should().Equal("with", "as"), c => c!.Select(x => x.Label).Should().Equal("with", "as"), c => c!.Select(x => x.Label).Should().BeEmpty(), @@ -1896,7 +1896,7 @@ await RunCompletionScenarioTest(this.TestContext, ServerWithExtensibilityEnabled await RunCompletionScenarioTest(this.TestContext, ServerWithBuiltInTypes, fileWithCursors, completions => completions.Should().SatisfyRespectively( - c => c!.Select(x => x.Label).Should().NotContain("provider"), + c => c!.Select(x => x.Label).Should().NotContain("extension"), c => c!.Select(x => x.Label).Should().BeEmpty(), c => c!.Select(x => x.Label).Should().BeEmpty(), c => c!.Select(x => x.Label).Should().BeEmpty(), @@ -1911,7 +1911,7 @@ public async Task Provider_configuration_completions_work() { { var fileWithCursors = @" -provider kubernetes with | as k8s +extension kubernetes with | as k8s "; var (text, cursor) = ParserHelper.GetFileWithSingleCursor(fileWithCursors, '|'); @@ -1923,7 +1923,7 @@ provider kubernetes with | as k8s var updatedFile = file.ApplyCompletion(completions, "required-properties"); updatedFile.Should().HaveSourceText(@" -provider kubernetes with { +extension kubernetes with { kubeConfig: $1 namespace: $2 }| as k8s @@ -1932,7 +1932,7 @@ provider kubernetes with { { var fileWithCursors = @" -provider kubernetes with { +extension kubernetes with { | } "; @@ -1946,7 +1946,7 @@ provider kubernetes with { var updatedFile = file.ApplyCompletion(completions, "kubeConfig"); updatedFile.Should().HaveSourceText(@" -provider kubernetes with { +extension kubernetes with { kubeConfig:| } "); diff --git a/src/Bicep.LangServer.IntegrationTests/Files/ImportKubernetesManifest/azure-vote-all-in-one-redis/manifest.bicep b/src/Bicep.LangServer.IntegrationTests/Files/ImportKubernetesManifest/azure-vote-all-in-one-redis/manifest.bicep index ce925bed795..e8a2d744a5e 100644 --- a/src/Bicep.LangServer.IntegrationTests/Files/ImportKubernetesManifest/azure-vote-all-in-one-redis/manifest.bicep +++ b/src/Bicep.LangServer.IntegrationTests/Files/ImportKubernetesManifest/azure-vote-all-in-one-redis/manifest.bicep @@ -1,7 +1,7 @@ @secure() param kubeConfig string -provider kubernetes with { +extension kubernetes with { namespace: 'default' kubeConfig: kubeConfig } diff --git a/src/Bicep.LangServer.IntegrationTests/Files/ImportKubernetesManifest/wordpress/manifest.bicep b/src/Bicep.LangServer.IntegrationTests/Files/ImportKubernetesManifest/wordpress/manifest.bicep index b564930ff5c..5d5ee564557 100644 --- a/src/Bicep.LangServer.IntegrationTests/Files/ImportKubernetesManifest/wordpress/manifest.bicep +++ b/src/Bicep.LangServer.IntegrationTests/Files/ImportKubernetesManifest/wordpress/manifest.bicep @@ -1,7 +1,7 @@ @secure() param kubeConfig string -provider kubernetes with { +extension kubernetes with { namespace: 'default' kubeConfig: kubeConfig } diff --git a/src/Bicep.LangServer.IntegrationTests/HoverTests.cs b/src/Bicep.LangServer.IntegrationTests/HoverTests.cs index ed701815f07..6a5721a1a11 100644 --- a/src/Bicep.LangServer.IntegrationTests/HoverTests.cs +++ b/src/Bicep.LangServer.IntegrationTests/HoverTests.cs @@ -1289,8 +1289,8 @@ private static void ValidateHover(Hover? hover, Symbol symbol) tooltip.Should().Contain($"{local.Name}: {local.Type}"); break; - case ProviderNamespaceSymbol provider: - tooltip.Should().Contain($"{provider.Name} namespace"); + case ExtensionNamespaceSymbol extension: + tooltip.Should().Contain($"{extension.Name} namespace"); break; case BuiltInNamespaceSymbol @namespace: diff --git a/src/Bicep.LangServer.IntegrationTests/Registry/ModuleRestoreSchedulerTests.cs b/src/Bicep.LangServer.IntegrationTests/Registry/ModuleRestoreSchedulerTests.cs index 4d97649a6a4..19bf8c55c49 100644 --- a/src/Bicep.LangServer.IntegrationTests/Registry/ModuleRestoreSchedulerTests.cs +++ b/src/Bicep.LangServer.IntegrationTests/Registry/ModuleRestoreSchedulerTests.cs @@ -172,7 +172,7 @@ private class MockRegistry : IArtifactRegistry public Task PublishModule(ArtifactReference _, BinaryData __, BinaryData? ___, string? ____, string? _____) => throw new NotImplementedException(); - public Task PublishProvider(ArtifactReference _, ProviderPackage __) + public Task PublishExtension(ArtifactReference _, ExtensionPackage __) => throw new NotImplementedException(); public Task CheckArtifactExists(ArtifactType artifactType, ArtifactReference reference) => throw new NotImplementedException(); @@ -204,7 +204,7 @@ public ResultWithDiagnostic TryParseArtifactReference(Artifac public ResultWithException TryGetSource(ArtifactReference artifactReference) => new(new SourceNotAvailableException()); - public Uri? TryGetProviderBinary(ArtifactReference reference) => null; + public Uri? TryGetExtensionBinary(ArtifactReference reference) => null; public Task OnRestoreArtifacts(bool forceRestore) => Task.CompletedTask; } diff --git a/src/Bicep.LangServer.UnitTests/BicepCompletionProviderTests.cs b/src/Bicep.LangServer.UnitTests/BicepCompletionProviderTests.cs index 7bfc0340474..afaf4ef492c 100644 --- a/src/Bicep.LangServer.UnitTests/BicepCompletionProviderTests.cs +++ b/src/Bicep.LangServer.UnitTests/BicepCompletionProviderTests.cs @@ -417,7 +417,7 @@ public async Task CommentShouldNotGiveAnyCompletions(string codeFragment) [TestMethod] public async Task CompletionsShouldContainMicrosoftGraphWhenPreviewFeatureEnabled() { - var (contents, cursor) = ParserHelper.GetFileWithSingleCursor("provider m| as graph"); + var (contents, cursor) = ParserHelper.GetFileWithSingleCursor("extension m| as graph"); var completionProvider = CreateProvider(); var featureOverrides = new FeatureProviderOverrides(ExtensibilityEnabled: true); diff --git a/src/Bicep.LangServer/Completions/BicepCompletionProvider.cs b/src/Bicep.LangServer/Completions/BicepCompletionProvider.cs index 27007bbdd8a..b6d2c413c23 100644 --- a/src/Bicep.LangServer/Completions/BicepCompletionProvider.cs +++ b/src/Bicep.LangServer/Completions/BicepCompletionProvider.cs @@ -149,7 +149,7 @@ private IEnumerable GetDeclarationCompletions(SemanticModel mode if (model.Features.ExtensibilityEnabled) { - yield return CreateKeywordCompletion(LanguageConstants.ProviderKeyword, "Provider keyword", context.ReplacementRange); + yield return CreateKeywordCompletion(LanguageConstants.ExtensionKeyword, "Extension keyword", context.ReplacementRange); } if (model.Features.TestFrameworkEnabled) @@ -2001,13 +2001,13 @@ private IEnumerable GetExtensionCompletions(SemanticModel model, { if (context.Kind.HasFlag(BicepCompletionContextKind.ExpectingExtensionSpecification)) { - var providerNames = model.Configuration.Extensions.Data.Keys + var extensionNames = model.Configuration.Extensions.Data.Keys .Concat(SystemNamespaceType.BuiltInName) .ToHashSet(); - foreach (var providerName in providerNames.OrderBy(x => x, LanguageConstants.IdentifierComparer)) + foreach (var extensionName in extensionNames.OrderBy(x => x, LanguageConstants.IdentifierComparer)) { - var completionText = providerName; + var completionText = extensionName; yield return CompletionItemBuilder.Create(CompletionItemKind.Folder, completionText) .WithSortText(GetSortText(completionText, CompletionPriority.High)) .WithDetail(completionText) @@ -2024,9 +2024,9 @@ private IEnumerable GetExtensionCompletions(SemanticModel model, if (context.Kind.HasFlag(BicepCompletionContextKind.ExpectingExtensionConfig)) { - if (context.EnclosingDeclaration is ProviderDeclarationSyntax importSyntax && - model.GetSymbolInfo(importSyntax) is ProviderNamespaceSymbol providerSymbol && - providerSymbol.TryGetNamespaceType() is { } namespaceType) + if (context.EnclosingDeclaration is ExtensionDeclarationSyntax importSyntax && + model.GetSymbolInfo(importSyntax) is ExtensionNamespaceSymbol extensionSymbol && + extensionSymbol.TryGetNamespaceType() is { } namespaceType) { foreach (var completion in GetValueCompletionsForType(model, context, namespaceType.ConfigurationType, importSyntax.Config, loopsAllowed: false)) { diff --git a/src/Bicep.LangServer/Completions/SyntaxPatterns/LeftSiblingsCollector.cs b/src/Bicep.LangServer/Completions/SyntaxPatterns/LeftSiblingsCollector.cs index eb2c2fdb7b2..0bc72c17772 100644 --- a/src/Bicep.LangServer/Completions/SyntaxPatterns/LeftSiblingsCollector.cs +++ b/src/Bicep.LangServer/Completions/SyntaxPatterns/LeftSiblingsCollector.cs @@ -28,10 +28,10 @@ public static (IList LeftSiblings, SyntaxBase? overlappingNode) Coll return (collector.leftSiblings, collector.overlappingNode); } - public override void VisitProviderDeclarationSyntax(ProviderDeclarationSyntax syntax) => + public override void VisitExtensionDeclarationSyntax(ExtensionDeclarationSyntax syntax) => this.AddLeftSiblings(syntax.Keyword, syntax.SpecificationString, syntax.WithClause); - public override void VisitProviderWithClauseSyntax(ProviderWithClauseSyntax syntax) => + public override void VisitExtensionWithClauseSyntax(ExtensionWithClauseSyntax syntax) => this.AddLeftSiblings(syntax.Keyword, syntax.Config); public override void VisitAliasAsClauseSyntax(AliasAsClauseSyntax syntax) => diff --git a/src/Bicep.LangServer/Handlers/BicepDocumentSymbolHandler.cs b/src/Bicep.LangServer/Handlers/BicepDocumentSymbolHandler.cs index f9ea767c8d9..66193fc77bb 100644 --- a/src/Bicep.LangServer/Handlers/BicepDocumentSymbolHandler.cs +++ b/src/Bicep.LangServer/Handlers/BicepDocumentSymbolHandler.cs @@ -78,7 +78,7 @@ private DocumentSymbol CreateDocumentSymbol(SemanticModel model, DeclaredSymbol private static SymbolKind SelectSymbolKind(DeclaredSymbol symbol) => symbol switch { - ProviderNamespaceSymbol => SymbolKind.Namespace, + ExtensionNamespaceSymbol => SymbolKind.Namespace, ParameterSymbol => SymbolKind.Field, TypeAliasSymbol => SymbolKind.Field, VariableSymbol => SymbolKind.Variable, diff --git a/src/Bicep.LangServer/Handlers/BicepHoverHandler.cs b/src/Bicep.LangServer/Handlers/BicepHoverHandler.cs index 4adf0af367b..b137872d2e2 100644 --- a/src/Bicep.LangServer/Handlers/BicepHoverHandler.cs +++ b/src/Bicep.LangServer/Handlers/BicepHoverHandler.cs @@ -83,9 +83,9 @@ public BicepHoverHandler( // with multiple borders switch (result.Symbol) { - case ProviderNamespaceSymbol provider: + case ExtensionNamespaceSymbol extension: return AsMarkdown(MarkdownHelper.CodeBlockWithDescription( - $"{LanguageConstants.ProviderKeyword} {provider.Name}", TryGetDescription(result, provider))); + $"{LanguageConstants.ExtensionKeyword} {extension.Name}", TryGetDescription(result, extension))); case MetadataSymbol metadata: return AsMarkdown(MarkdownHelper.CodeBlockWithDescription( @@ -321,7 +321,7 @@ private static string GetFunctionOverloadMarkdown(FunctionOverload overload) private static string? TryGetTypeDocumentationLink(ResourceSymbol resource) { if (resource.TryGetResourceType() is { } resourceType && - resourceType.DeclaringNamespace.ProviderNameEquals(AzNamespaceType.BuiltInName) && + resourceType.DeclaringNamespace.ExtensionNameEquals(AzNamespaceType.BuiltInName) && resourceType.DeclaringNamespace.ResourceTypeProvider.HasDefinedType(resourceType.TypeReference)) { var provider = resourceType.TypeReference.TypeSegments.First().ToLowerInvariant(); diff --git a/src/Bicep.LangServer/Handlers/ExternalSourceReference.cs b/src/Bicep.LangServer/Handlers/ExternalSourceReference.cs index 995bd013322..fb15ba5da40 100644 --- a/src/Bicep.LangServer/Handlers/ExternalSourceReference.cs +++ b/src/Bicep.LangServer/Handlers/ExternalSourceReference.cs @@ -90,7 +90,7 @@ public ExternalSourceReference WithRequestForSourceFile(string? requestedSourceF public ExternalSourceReference(OciArtifactReference moduleReference, SourceArchive? sourceArchive) { - Debug.Assert(moduleReference.Type == ArtifactType.Module && moduleReference.Scheme == OciArtifactReferenceFacts.Scheme, "Expecting a module reference, not a provider reference"); + Debug.Assert(moduleReference.Type == ArtifactType.Module && moduleReference.Scheme == OciArtifactReferenceFacts.Scheme, "Expecting a module reference"); Components = moduleReference.AddressComponents; if (sourceArchive is { }) diff --git a/src/Bicep.LangServer/Handlers/ImportKubernetesManifestHandler.cs b/src/Bicep.LangServer/Handlers/ImportKubernetesManifestHandler.cs index 43dfc189df2..16f83f5c722 100644 --- a/src/Bicep.LangServer/Handlers/ImportKubernetesManifestHandler.cs +++ b/src/Bicep.LangServer/Handlers/ImportKubernetesManifestHandler.cs @@ -60,11 +60,11 @@ public string Decompile(string bicepFilePath, string manifestContents, Telemetry new VariableAccessSyntax(new(SyntaxFactory.CreateIdentifierToken("string"))), null), - new ProviderDeclarationSyntax( + new ExtensionDeclarationSyntax( [], - SyntaxFactory.ProviderKeywordToken, + SyntaxFactory.ExtensionKeywordToken, SyntaxFactory.CreateIdentifierWithTrailingSpace(K8sNamespaceType.BuiltInName), - new ProviderWithClauseSyntax( + new ExtensionWithClauseSyntax( SyntaxFactory.CreateIdentifierToken(LanguageConstants.WithKeyword), SyntaxFactory.CreateObject( [ diff --git a/src/Bicep.LangServer/Handlers/InsertResourceHandler.cs b/src/Bicep.LangServer/Handlers/InsertResourceHandler.cs index 90fa342cae4..98d0fe8cd51 100644 --- a/src/Bicep.LangServer/Handlers/InsertResourceHandler.cs +++ b/src/Bicep.LangServer/Handlers/InsertResourceHandler.cs @@ -82,7 +82,7 @@ public Task Handle(InsertResourceParams request, CancellationToken cancell var nsResolver = model.Binder.NamespaceResolver; var namespaces = nsResolver.GetNamespaceNames().Select(nsResolver.TryGetNamespace).WhereNotNull(); - var azResourceTypeProvider = namespaces.First(ns => ns?.ProviderName == AzNamespaceType.BuiltInName).ResourceTypeProvider; + var azResourceTypeProvider = namespaces.First(ns => ns?.ExtensionName == AzNamespaceType.BuiltInName).ResourceTypeProvider; var matchedType = azResourceTypeProvider.GetAvailableTypes() .Where(x => StringComparer.OrdinalIgnoreCase.Equals(resourceId.FullyQualifiedType, x.FormatType())) .OrderByDescending(x => x.ApiVersion ?? "", ApiVersionComparer.Instance) diff --git a/src/Bicep.LangServer/SemanticTokenVisitor.cs b/src/Bicep.LangServer/SemanticTokenVisitor.cs index 3c27d1ec623..6b7d3ea15cd 100644 --- a/src/Bicep.LangServer/SemanticTokenVisitor.cs +++ b/src/Bicep.LangServer/SemanticTokenVisitor.cs @@ -344,7 +344,7 @@ public override void VisitTargetScopeSyntax(TargetScopeSyntax syntax) base.VisitTargetScopeSyntax(syntax); } - public override void VisitProviderDeclarationSyntax(ProviderDeclarationSyntax syntax) + public override void VisitExtensionDeclarationSyntax(ExtensionDeclarationSyntax syntax) { AddTokenType(syntax.Keyword, SemanticTokenType.Keyword); this.Visit(syntax.SpecificationString); @@ -352,7 +352,7 @@ public override void VisitProviderDeclarationSyntax(ProviderDeclarationSyntax sy this.Visit(syntax.AsClause); } - public override void VisitProviderWithClauseSyntax(ProviderWithClauseSyntax syntax) + public override void VisitExtensionWithClauseSyntax(ExtensionWithClauseSyntax syntax) { AddTokenType(syntax.Keyword, SemanticTokenType.Keyword); this.Visit(syntax.Config); diff --git a/src/Bicep.Local.Deploy.IntegrationTests/EndToEndDeploymentTests.cs b/src/Bicep.Local.Deploy.IntegrationTests/EndToEndDeploymentTests.cs index 30cb68fb197..a647364e267 100644 --- a/src/Bicep.Local.Deploy.IntegrationTests/EndToEndDeploymentTests.cs +++ b/src/Bicep.Local.Deploy.IntegrationTests/EndToEndDeploymentTests.cs @@ -34,13 +34,13 @@ public class EndToEndDeploymentTests : TestBase [TestMethod] public async Task End_to_end_deployment_basic() { - var services = await ProviderTestHelper.GetServiceBuilderWithPublishedProvider(ThirdPartyTypeHelper.GetHttpProviderTypesTgz(), new(ExtensibilityEnabled: true, ExtensionRegistry: true, LocalDeployEnabled: true)); + var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetHttpProviderTypesTgz(), new(ExtensibilityEnabled: true, ExtensionRegistry: true, LocalDeployEnabled: true)); var result = await CompilationHelper.RestoreAndCompileParams(services, ("bicepconfig.json", """ { "extensions": { - "http": "br:example.azurecr.io/providers/foo:1.2.3" + "http": "br:example.azurecr.io/extensions/foo:1.2.3" }, "experimentalFeaturesEnabled": { "extensibility": true, @@ -165,13 +165,13 @@ param coords { [TestMethod] public async Task Provider_returning_resource_and_error_data_should_fail() { - var services = await ProviderTestHelper.GetServiceBuilderWithPublishedProvider(ThirdPartyTypeHelper.GetHttpProviderTypesTgz(), new(ExtensibilityEnabled: true, ExtensionRegistry: true, LocalDeployEnabled: true)); + var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetHttpProviderTypesTgz(), new(ExtensibilityEnabled: true, ExtensionRegistry: true, LocalDeployEnabled: true)); var result = await CompilationHelper.RestoreAndCompileParams(services, ("bicepconfig.json", """ { "extensions": { - "http": "br:example.azurecr.io/providers/foo:1.2.3" + "http": "br:example.azurecr.io/extensions/foo:1.2.3" }, "experimentalFeaturesEnabled": { "extensibility": true, @@ -266,13 +266,13 @@ param coords { [TestMethod] public async Task Provider_not_returning_resource_or_error_data_should_fail() { - var services = await ProviderTestHelper.GetServiceBuilderWithPublishedProvider(ThirdPartyTypeHelper.GetHttpProviderTypesTgz(), new(ExtensibilityEnabled: true, ExtensionRegistry: true, LocalDeployEnabled: true)); + var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetHttpProviderTypesTgz(), new(ExtensibilityEnabled: true, ExtensionRegistry: true, LocalDeployEnabled: true)); var result = await CompilationHelper.RestoreAndCompileParams(services, ("bicepconfig.json", """ { "extensions": { - "http": "br:example.azurecr.io/providers/foo:1.2.3" + "http": "br:example.azurecr.io/extensions/foo:1.2.3" }, "experimentalFeaturesEnabled": { "extensibility": true, @@ -367,13 +367,13 @@ param coords { [TestMethod] public async Task Provider_returning_error_data_should_fail() { - var services = await ProviderTestHelper.GetServiceBuilderWithPublishedProvider(ThirdPartyTypeHelper.GetHttpProviderTypesTgz(), new(ExtensibilityEnabled: true, ExtensionRegistry: true, LocalDeployEnabled: true)); + var services = await ExtensionTestHelper.GetServiceBuilderWithPublishedExtension(ThirdPartyTypeHelper.GetHttpProviderTypesTgz(), new(ExtensibilityEnabled: true, ExtensionRegistry: true, LocalDeployEnabled: true)); var result = await CompilationHelper.RestoreAndCompileParams(services, ("bicepconfig.json", """ { "extensions": { - "http": "br:example.azurecr.io/providers/foo:1.2.3" + "http": "br:example.azurecr.io/extensions/foo:1.2.3" }, "experimentalFeaturesEnabled": { "extensibility": true, diff --git a/src/Bicep.Local.Deploy/Extensibility/GrpcBuiltInLocalExtension.cs b/src/Bicep.Local.Deploy/Extensibility/GrpcBuiltInLocalExtension.cs index c56d6e1650f..13e52c5672a 100644 --- a/src/Bicep.Local.Deploy/Extensibility/GrpcBuiltInLocalExtension.cs +++ b/src/Bicep.Local.Deploy/Extensibility/GrpcBuiltInLocalExtension.cs @@ -72,7 +72,7 @@ public static async Task Start(Uri pathToBinary) catch (Exception ex) { await TerminateProcess(process); - throw new InvalidOperationException($"Failed to connect to provider {pathToBinary.LocalPath}", ex); + throw new InvalidOperationException($"Failed to connect to extension {pathToBinary.LocalPath}", ex); } } diff --git a/src/Bicep.Local.Deploy/Extensibility/LocalExtensibilityHostManager.cs b/src/Bicep.Local.Deploy/Extensibility/LocalExtensibilityHostManager.cs index cc2c145bea4..660638ae56b 100644 --- a/src/Bicep.Local.Deploy/Extensibility/LocalExtensibilityHostManager.cs +++ b/src/Bicep.Local.Deploy/Extensibility/LocalExtensibilityHostManager.cs @@ -35,7 +35,7 @@ public LocalExtensibilityHostManager(IModuleDispatcher moduleDispatcher, Func CallExtensibilityHost( private async Task CallExtension( string method, - LocalExtensibilityHost provider, + LocalExtensibilityHost extensibilityHost, HttpContent content, CancellationToken cancellationToken) { @@ -66,28 +66,28 @@ private async Task CallExtension( case "createOrUpdate": { var resourceSpecification = await GetResourceSpecificationAsync(await content.ReadAsStreamAsync(cancellationToken), cancellationToken); - var extensionResponse = await provider.CreateOrUpdate(resourceSpecification, cancellationToken); + var extensionResponse = await extensibilityHost.CreateOrUpdate(resourceSpecification, cancellationToken); return await GetHttpResponseMessageAsync(extensionResponse, cancellationToken); } case "delete": { var resourceReference = await GetResourceReferenceAsync(await content.ReadAsStreamAsync(cancellationToken), cancellationToken); - var extensionResponse = await provider.Delete(resourceReference, cancellationToken); + var extensionResponse = await extensibilityHost.Delete(resourceReference, cancellationToken); return await GetHttpResponseMessageAsync(extensionResponse, cancellationToken); } case "get": { var resourceReference = await GetResourceReferenceAsync(await content.ReadAsStreamAsync(cancellationToken), cancellationToken); - var extensionResponse = await provider.Get(resourceReference, cancellationToken); + var extensionResponse = await extensibilityHost.Get(resourceReference, cancellationToken); return await GetHttpResponseMessageAsync(extensionResponse, cancellationToken); } case "preview": { var resourceSpecification = await GetResourceSpecificationAsync(await content.ReadAsStreamAsync(cancellationToken), cancellationToken); - var extensionResponse = await provider.Preview(resourceSpecification, cancellationToken); + var extensionResponse = await extensibilityHost.Preview(resourceSpecification, cancellationToken); return await GetHttpResponseMessageAsync(extensionResponse, cancellationToken); } @@ -164,7 +164,7 @@ private async Task GetHttpResponseMessageAsync(LocalExtensi foreach (var namespaceType in namespaceTypes) { if (namespaceType.Artifact is { } artifact && - moduleDispatcher.TryGetProviderBinary(artifact) is { } binaryUri) + moduleDispatcher.TryGetExtensionBinary(artifact) is { } binaryUri) { yield return (namespaceType, binaryUri); } @@ -177,18 +177,18 @@ public async Task InitializeExtensions(Compilation compilation) foreach (var (namespaceType, binaryUri) in binaryExtensions) { - ExtensionKey providerKey = new(namespaceType.Settings.ArmTemplateProviderName, namespaceType.Settings.ArmTemplateProviderVersion); - RegisteredExtensions[providerKey] = await extensionFactory(binaryUri); + ExtensionKey extensionKey = new(namespaceType.Settings.TemplateExtensionName, namespaceType.Settings.TemplateExtensionVersion); + RegisteredExtensions[extensionKey] = await extensionFactory(binaryUri); } } public async ValueTask DisposeAsync() { - await Task.WhenAll(RegisteredExtensions.Values.Select(async provider => + await Task.WhenAll(RegisteredExtensions.Values.Select(async extension => { try { - await provider.DisposeAsync(); + await extension.DisposeAsync(); } catch { diff --git a/src/Bicep.Wasm/LanguageHelpers/SemanticTokenVisitor.cs b/src/Bicep.Wasm/LanguageHelpers/SemanticTokenVisitor.cs index 0de0a7be36b..6f56e618a99 100644 --- a/src/Bicep.Wasm/LanguageHelpers/SemanticTokenVisitor.cs +++ b/src/Bicep.Wasm/LanguageHelpers/SemanticTokenVisitor.cs @@ -292,7 +292,7 @@ public override void VisitTargetScopeSyntax(TargetScopeSyntax syntax) base.VisitTargetScopeSyntax(syntax); } - public override void VisitProviderDeclarationSyntax(ProviderDeclarationSyntax syntax) + public override void VisitExtensionDeclarationSyntax(ExtensionDeclarationSyntax syntax) { AddTokenType(syntax.Keyword, SemanticTokenType.Keyword); this.Visit(syntax.SpecificationString); @@ -300,7 +300,7 @@ public override void VisitProviderDeclarationSyntax(ProviderDeclarationSyntax sy this.Visit(syntax.AsClause); } - public override void VisitProviderWithClauseSyntax(ProviderWithClauseSyntax syntax) + public override void VisitExtensionWithClauseSyntax(ExtensionWithClauseSyntax syntax) { AddTokenType(syntax.Keyword, SemanticTokenType.Keyword); this.Visit(syntax.Config); diff --git a/src/highlightjs/dist/bicep.min.js b/src/highlightjs/dist/bicep.min.js index 2632aa59e38..ce0d4b6ac47 100644 --- a/src/highlightjs/dist/bicep.min.js +++ b/src/highlightjs/dist/bicep.min.js @@ -1 +1 @@ -(()=>{"use strict";var e={239:(e,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.default=function(e){return{aliases:["bicep"],case_insensitive:!0,keywords:o,contains:$([u])}};const n=e=>`\\b${e}\\b`,t=e=>`(?=${e})`,s=e=>`(?!${e})`,r=n("[_a-zA-Z][_a-zA-Z0-9]*"),i=n("[_a-zA-Z-0-9]+"),c="(?:[ \\t\\r\\n]|\\/\\*(?:\\*(?!\\/)|[^*])*\\*\\/)*",o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:["metadata","targetScope","resource","module","param","var","output","for","in","if","existing","import","as","type","with","using","extends","func","assert","provider"],literal:["true","false","null"],built_in:["az","sys"]},l={variants:[{className:"comment",match:`//.*${t("$")}`},{className:"comment",begin:"/\\*",end:"\\*/"}]};function $(e){return[...e,l]}const u={variants:[]},m={className:"string",begin:"'''",end:`'''${s("'")}`},d={className:"subst",begin:("\\\\","(?`)}`,returnBegin:!0,end:`${c}=>`,contains:$([p])},x={begin:`${(e=>`(?<=${e})`)(`^${c}`)}#${i}`,end:"$",className:"meta",contains:$([{className:"variable",match:i}])};u.variants=[b,m,{className:"number",match:"[0-9]+"},f,g,v,p,_,N,h,x]},719:function(e,a,n){var t=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(a,"__esModule",{value:!0});const s=t(n(912)),r=t(n(239));s.default.registerLanguage("bicep",r.default)},912:e=>{e.exports=hljs}},a={};!function n(t){var s=a[t];if(void 0!==s)return s.exports;var r=a[t]={exports:{}};return e[t].call(r.exports,r,r.exports,n),r.exports}(719)})(); \ No newline at end of file +(()=>{"use strict";var e={239:(e,a)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.default=function(e){return{aliases:["bicep"],case_insensitive:!0,keywords:o,contains:$([u])}};const n=e=>`\\b${e}\\b`,t=e=>`(?=${e})`,s=e=>`(?!${e})`,r=n("[_a-zA-Z][_a-zA-Z0-9]*"),i=n("[_a-zA-Z-0-9]+"),c="(?:[ \\t\\r\\n]|\\/\\*(?:\\*(?!\\/)|[^*])*\\*\\/)*",o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:["metadata","targetScope","resource","module","param","var","output","for","in","if","existing","import","as","type","with","using","extends","func","assert","extension"],literal:["true","false","null"],built_in:["az","sys"]},l={variants:[{className:"comment",match:`//.*${t("$")}`},{className:"comment",begin:"/\\*",end:"\\*/"}]};function $(e){return[...e,l]}const u={variants:[]},m={className:"string",begin:"'''",end:`'''${s("'")}`},d={className:"subst",begin:("\\\\","(?`)}`,returnBegin:!0,end:`${c}=>`,contains:$([g])},x={begin:`${(e=>`(?<=${e})`)(`^${c}`)}#${i}`,end:"$",className:"meta",contains:$([{className:"variable",match:i}])};u.variants=[b,m,{className:"number",match:"[0-9]+"},f,p,v,g,_,N,h,x]},719:function(e,a,n){var t=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(a,"__esModule",{value:!0});const s=t(n(912)),r=t(n(239));s.default.registerLanguage("bicep",r.default)},912:e=>{e.exports=hljs}},a={};!function n(t){var s=a[t];if(void 0!==s)return s.exports;var r=a[t]={exports:{}};return e[t].call(r.exports,r,r.exports,n),r.exports}(719)})(); \ No newline at end of file diff --git a/src/highlightjs/src/bicep.ts b/src/highlightjs/src/bicep.ts index 9f12af004f8..4beefb3b6e7 100644 --- a/src/highlightjs/src/bicep.ts +++ b/src/highlightjs/src/bicep.ts @@ -39,7 +39,7 @@ const KEYWORDS = { 'extends', 'func', 'assert', - 'provider', + 'extension', ], literal: [ "true", diff --git a/src/monarch/src/bicep.ts b/src/monarch/src/bicep.ts index 208eb9861c5..8b5baf59d7f 100644 --- a/src/monarch/src/bicep.ts +++ b/src/monarch/src/bicep.ts @@ -31,7 +31,7 @@ const keywords = [ 'extends', 'func', 'assert', - 'provider', + 'extension', ]; const namedLiterals = [ diff --git a/src/textmate/bicep.tmlanguage b/src/textmate/bicep.tmlanguage index 4b8b95d6346..4c610c4ccc9 100644 --- a/src/textmate/bicep.tmlanguage +++ b/src/textmate/bicep.tmlanguage @@ -216,7 +216,7 @@ name keyword.control.declaration.bicep match - \b(metadata|targetScope|resource|module|param|var|output|for|in|if|existing|import|as|type|with|using|extends|func|assert|provider)\b + \b(metadata|targetScope|resource|module|param|var|output|for|in|if|existing|import|as|type|with|using|extends|func|assert|extension)\b lambda-start diff --git a/src/textmate/src/bicep.ts b/src/textmate/src/bicep.ts index c6ef6d42657..bc139af2e48 100644 --- a/src/textmate/src/bicep.ts +++ b/src/textmate/src/bicep.ts @@ -64,7 +64,7 @@ const keywords = [ 'extends', 'func', 'assert', - 'provider', + 'extension', ]; const keywordExpression: MatchRule = {