Repository: zarf-dev/zarf
Pull request #3744: chore: remove invopop/jsonschema dependency from root go.mod
Author: login: AustinAbro321
Created: 2025-04-28T14:43:21Z | Merged: 2025-04-28T16:49:48Z

## Description

In #2886 the json schema was separated in another directory under hack. However the main zarf go.mod still contained the jsonschema dependency because it was implementing one of the methods to add extra items to the schema outside of what was possible with json/jsonschema tags. 

This was originally added to the schema so users would know that package templates for imports don't work, however since compose runs before the schema checks these schema checks were not reached. By adding explicit validation we can remove the jsonschema dependency and make the error message show up in the relevant workflows.

## Checklist before merging

- [ ] Test, docs, adr added or updated as needed
- [ ] [Contributor Guide Steps](https://github.com/zarf-dev/zarf/blob/main/CONTRIBUTING.md#developer-workflow) followed



Diff:
diff --git a/go.mod b/go.mod
index 6874466fba..e9c010d66e 100644
--- a/go.mod
+++ b/go.mod
@@ -33,7 +33,6 @@ require (
 	github.com/golang-cz/devslog v0.0.12
 	github.com/google/go-containerregistry v0.20.3
 	github.com/gosuri/uitable v0.0.4
-	github.com/invopop/jsonschema v0.13.0
 	github.com/mholt/archiver/v3 v3.5.1
 	github.com/opencontainers/image-spec v1.1.1
 	github.com/phsym/console-slog v0.3.1
@@ -243,7 +242,6 @@ require (
 	github.com/aws/smithy-go v1.22.2 // indirect
 	github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231024185945-8841054dbdb8 // indirect
 	github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
-	github.com/bahlo/generic-list-go v0.2.0 // indirect
 	github.com/becheran/wildmatch-go v1.0.0 // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect
@@ -251,7 +249,6 @@ require (
 	github.com/blang/semver/v4 v4.0.0 // indirect
 	github.com/bmatcuk/doublestar/v2 v2.0.4 // indirect
 	github.com/bmatcuk/doublestar/v4 v4.8.0 // indirect
-	github.com/buger/jsonparser v1.1.1 // indirect
 	github.com/buildkite/agent/v3 v3.81.0 // indirect
 	github.com/buildkite/go-pipeline v0.13.1 // indirect
 	github.com/buildkite/interpolate v0.1.3 // indirect
@@ -520,7 +517,6 @@ require (
 	github.com/wagoodman/go-partybus v0.0.0-20230516145632-8ccac152c651 // indirect
 	github.com/wagoodman/go-presenter v0.0.0-20211015174752-f9c01afc824b // indirect
 	github.com/wagoodman/go-progress v0.0.0-20230925121702-07e42b3cdba0 // indirect
-	github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
 	github.com/xanzy/go-gitlab v0.109.0 // indirect
 	github.com/xanzy/ssh-agent v0.3.3 // indirect
 	github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
diff --git a/go.sum b/go.sum
index f69f1ac61c..421d48da9f 100644
--- a/go.sum
+++ b/go.sum
@@ -494,8 +494,6 @@ github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231024185945-
 github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231024185945-8841054dbdb8/go.mod h1:2JF49jcDOrLStIXN/j/K1EKRq8a8R2qRnlZA6/o/c7c=
 github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
 github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
-github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
-github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
 github.com/becheran/wildmatch-go v1.0.0 h1:mE3dGGkTmpKtT4Z+88t8RStG40yN9T+kFEGj2PZFSzA=
 github.com/becheran/wildmatch-go v1.0.0/go.mod h1:gbMvj0NtVdJ15Mg/mH9uxk2R1QCistMyU7d9KFzroX4=
 github.com/beorn7/perks v0.0.0-20150223135152-b965b613227f/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -527,8 +525,6 @@ github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdb
 github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
 github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
 github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
-github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
-github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
 github.com/bugsnag/bugsnag-go v1.0.5-0.20150529004307-13fd6b8acda0 h1:s7+5BfS4WFJoVF9pnB8kBk03S7pZXRdKamnV0FOl5Sc=
 github.com/bugsnag/bugsnag-go v1.0.5-0.20150529004307-13fd6b8acda0/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
 github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ=
@@ -1171,8 +1167,6 @@ github.com/in-toto/in-toto-golang v0.9.0/go.mod h1:xsBVrVsHNsB61++S6Dy2vWosKhuA3
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
-github.com/invopop/jsonschema v0.13.0 h1:KvpoAJWEjR3uD9Kbm2HWJmqsEaHt8lBUpd0qHcIi21E=
-github.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0=
 github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
 github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
 github.com/jedib0t/go-pretty/v6 v6.6.5 h1:9PgMJOVBedpgYLI56jQRJYqngxYAAzfEUua+3NgSqAo=
@@ -1763,8 +1757,6 @@ github.com/wagoodman/go-presenter v0.0.0-20211015174752-f9c01afc824b h1:uWNQ0khA
 github.com/wagoodman/go-presenter v0.0.0-20211015174752-f9c01afc824b/go.mod h1:ewlIKbKV8l+jCj8rkdXIs361ocR5x3qGyoCSca47Gx8=
 github.com/wagoodman/go-progress v0.0.0-20230925121702-07e42b3cdba0 h1:0KGbf+0SMg+UFy4e1A/CPVvXn21f1qtWdeJwxZFoQG8=
 github.com/wagoodman/go-progress v0.0.0-20230925121702-07e42b3cdba0/go.mod h1:jLXFoL31zFaHKAAyZUh+sxiTDFe1L1ZHrcK2T1itVKA=
-github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc=
-github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw=
 github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
 github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
 github.com/xanzy/go-gitlab v0.109.0 h1:RcRme5w8VpLXTSTTMZdVoQWY37qTJWg+gwdQl4aAttE=
diff --git a/hack/schema/create-zarf-schema.sh b/hack/schema/create-zarf-schema.sh
index 7e55703a8f..71330cb473 100755
--- a/hack/schema/create-zarf-schema.sh
+++ b/hack/schema/create-zarf-schema.sh
@@ -4,6 +4,8 @@ set -euo pipefail
 
 SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
 
+cd $SCRIPT_DIR
+
 add_yaml_extensions() {
   local src=$1
   local dst=$2
@@ -21,8 +23,8 @@ add_yaml_extensions() {
   ' "$src" > "$dst"
 }
 
-go run "$SCRIPT_DIR/main.go" > "zarf_package_v1alpha1.schema.json"
+go run main.go > "zarf_package_v1alpha1.schema.json"
 
-add_yaml_extensions "zarf_package_v1alpha1.schema.json" "$SCRIPT_DIR/../../zarf.schema.json"
+add_yaml_extensions "zarf_package_v1alpha1.schema.json" "../../zarf.schema.json"
 
 rm zarf_package_v1alpha1.schema.json
diff --git a/hack/schema/go.mod b/hack/schema/go.mod
index b2f5ec1785..9df6445d41 100644
--- a/hack/schema/go.mod
+++ b/hack/schema/go.mod
@@ -6,7 +6,7 @@ replace github.com/zarf-dev/zarf => ../..
 
 require (
 	github.com/invopop/jsonschema v0.13.0
-	github.com/zarf-dev/zarf v0.38.2
+	github.com/zarf-dev/zarf v0.0.0-local // grabbed from local
 )
 
 require (
diff --git a/src/api/internal/v1beta1/component.go b/src/api/internal/v1beta1/component.go
index 0dae25fa62..75f69cfded 100644
--- a/src/api/internal/v1beta1/component.go
+++ b/src/api/internal/v1beta1/component.go
@@ -4,7 +4,6 @@
 package v1beta1
 
 import (
-	"github.com/invopop/jsonschema"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
@@ -328,19 +327,6 @@ type ZarfComponentImport struct {
 	URL string `json:"url,omitempty" jsonschema:"pattern=^oci://.*$"`
 }
 
-// JSONSchemaExtend extends the generated json schema during `zarf internal gen-config-schema`
-func (ZarfComponentImport) JSONSchemaExtend(schema *jsonschema.Schema) {
-	path, _ := schema.Properties.Get("path")
-	url, _ := schema.Properties.Get("url")
-
-	notSchema := &jsonschema.Schema{
-		Pattern: ZarfPackageTemplatePrefix,
-	}
-
-	path.Not = notSchema
-	url.Not = notSchema
-}
-
 // Shell represents the desired shell to use for a given command
 type Shell struct {
 	Windows string `json:"windows,omitempty" jsonschema:"description=(default 'powershell') Indicates a preference for the shell to use on Windows systems (note that choosing 'cmd' will turn off migrations like touch -> New-Item),example=powershell,example=cmd,example=pwsh,example=sh,example=bash,example=gsh"`
diff --git a/src/api/v1alpha1/component.go b/src/api/v1alpha1/component.go
index 8948f03f5c..7d8a904daa 100644
--- a/src/api/v1alpha1/component.go
+++ b/src/api/v1alpha1/component.go
@@ -4,10 +4,6 @@
 // Package v1alpha1 holds the definition of the v1alpha1 Zarf Package
 package v1alpha1
 
-import (
-	"github.com/invopop/jsonschema"
-)
-
 // ZarfComponent is the primary functional grouping of assets to deploy by Zarf.
 type ZarfComponent struct {
 	// The name of the component.
@@ -339,19 +335,6 @@ type ZarfComponentImport struct {
 	URL string `json:"url,omitempty" jsonschema:"pattern=^oci://.*$"`
 }
 
-// JSONSchemaExtend extends the generated json schema during `zarf internal gen-config-schema`
-func (ZarfComponentImport) JSONSchemaExtend(schema *jsonschema.Schema) {
-	path, _ := schema.Properties.Get("path")
-	url, _ := schema.Properties.Get("url")
-
-	notSchema := &jsonschema.Schema{
-		Pattern: ZarfPackageTemplatePrefix,
-	}
-
-	path.Not = notSchema
-	url.Not = notSchema
-}
-
 // Shell represents the desired shell to use for a given command
 type Shell struct {
 	Windows string `json:"windows,omitempty" jsonschema:"description=(default 'powershell') Indicates a preference for the shell to use on Windows systems (note that choosing 'cmd' will turn off migrations like touch -> New-Item),example=powershell,example=cmd,example=pwsh,example=sh,example=bash,example=gsh"`
diff --git a/src/internal/packager2/layout/import.go b/src/internal/packager2/layout/import.go
index 699b090392..320fb41ce3 100644
--- a/src/internal/packager2/layout/import.go
+++ b/src/internal/packager2/layout/import.go
@@ -10,6 +10,7 @@ import (
 	"fmt"
 	"os"
 	"path/filepath"
+	"strings"
 	"time"
 
 	"github.com/zarf-dev/zarf/src/pkg/logger"
@@ -175,6 +176,9 @@ func resolveImports(ctx context.Context, pkg v1alpha1.ZarfPackage, packagePath,
 
 func validateComponentCompose(c v1alpha1.ZarfComponent) error {
 	errs := []error{}
+	if strings.Contains(c.Import.Path, v1alpha1.ZarfPackageTemplatePrefix) || strings.Contains(c.Import.URL, v1alpha1.ZarfPackageTemplatePrefix) {
+		errs = append(errs, errors.New("package templates are not supported for import path or URL"))
+	}
 	if c.Import.Path == "" && c.Import.URL == "" {
 		errs = append(errs, errors.New("neither a path nor a URL was provided"))
 	}
diff --git a/src/internal/packager2/layout/import_test.go b/src/internal/packager2/layout/import_test.go
index 71a7c13015..b3b16d6b9c 100644
--- a/src/internal/packager2/layout/import_test.go
+++ b/src/internal/packager2/layout/import_test.go
@@ -159,6 +159,30 @@ func TestValidateComponentCompose(t *testing.T) {
 				"URL is not a valid OCI URL",
 			},
 		},
+		{
+			name: "package template path provided",
+			component: v1alpha1.ZarfComponent{
+				Name: "template",
+				Import: v1alpha1.ZarfComponentImport{
+					Path: "###ZARF_PKG_TMPL_PATH###",
+				},
+			},
+			expectedErrs: []string{
+				"package templates are not supported for import path or URL",
+			},
+		},
+		{
+			name: "package template URL provided",
+			component: v1alpha1.ZarfComponent{
+				Name: "template",
+				Import: v1alpha1.ZarfComponentImport{
+					URL: "oci://registry.com/my-image:###ZARF_PKG_TMPL_TAG###",
+				},
+			},
+			expectedErrs: []string{
+				"package templates are not supported for import path or URL",
+			},
+		},
 	}
 
 	for _, tt := range tests {
diff --git a/src/pkg/lint/schema_test.go b/src/pkg/lint/schema_test.go
index 8ebcdc26bf..667b660649 100644
--- a/src/pkg/lint/schema_test.go
+++ b/src/pkg/lint/schema_test.go
@@ -5,7 +5,6 @@
 package lint
 
 import (
-	"fmt"
 	"os"
 	"path/filepath"
 	"testing"
@@ -69,10 +68,6 @@ func TestZarfSchema(t *testing.T) {
 						Only: v1alpha1.ZarfComponentOnlyTarget{
 							LocalOS: "unsupportedOS",
 						},
-						Import: v1alpha1.ZarfComponentImport{
-							Path: fmt.Sprintf("start%send", v1alpha1.ZarfPackageTemplatePrefix),
-							URL:  fmt.Sprintf("oci://start%send", v1alpha1.ZarfPackageTemplatePrefix),
-						},
 					},
 					{
 						Name: "actions",
@@ -114,8 +109,6 @@ func TestZarfSchema(t *testing.T) {
 				"components.0.only.localOS: components.0.only.localOS must be one of the following: \"linux\", \"darwin\", \"windows\"",
 				"components.1.actions.onCreate.before.0.setVariables.0.name: Does not match pattern '^[A-Z0-9_]+$'",
 				"components.1.actions.onRemove.onSuccess.0.setVariables.0.name: Does not match pattern '^[A-Z0-9_]+$'",
-				"components.0.import.path: Must not validate the schema (not)",
-				"components.0.import.url: Must not validate the schema (not)",
 				"apiVersion: apiVersion must be one of the following: \"zarf.dev/v1alpha1\"",
 			},
 		},
diff --git a/zarf.schema.json b/zarf.schema.json
index b54837d605..f683c6ef12 100644
--- a/zarf.schema.json
+++ b/zarf.schema.json
@@ -792,16 +792,10 @@
           "description": "The name of the component to import from the referenced zarf.yaml."
         },
         "path": {
-          "not": {
-            "pattern": "###ZARF_PKG_TMPL_"
-          },
           "type": "string",
           "description": "The path to the directory containing the zarf.yaml to import."
         },
         "url": {
-          "not": {
-            "pattern": "###ZARF_PKG_TMPL_"
-          },
           "type": "string",
           "pattern": "^oci://.*$",
           "description": "[beta] The URL to a Zarf package to import via OCI."


Reviews:
user: login: AustinAbro321
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-28T15:07:09Z
user: login: brandtkeller
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-28T15:36:23Z
user: login: AustinAbro321
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-28T15:44:09Z
user: login: brandtkeller
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-28T16:21:39Z
user: login: brandtkeller
body: validated locally and traced the workflow to see that this error will be produced prior to linting for added clarity. LGTM. 
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-28T16:22:38Z

Review comments:
diff_hunk: @@ -6,7 +6,7 @@ replace github.com/zarf-dev/zarf => ../..
 
 require (
 	github.com/invopop/jsonschema v0.13.0
-	github.com/zarf-dev/zarf v0.38.2
+	github.com/zarf-dev/zarf v0.0.0-local // grabbed from local
path: hack/schema/go.mod
user: login: AustinAbro321
body: more intuitive this way imo
created_at: 2025-04-28T15:07:09Z
author_association: MEMBER
diff_hunk: @@ -175,6 +176,9 @@ func resolveImports(ctx context.Context, pkg v1alpha1.ZarfPackage, packagePath,
 
 func validateComponentCompose(c v1alpha1.ZarfComponent) error {
 	errs := []error{}
+	if strings.Contains(c.Import.Path, v1alpha1.ZarfPackageTemplatePrefix) || strings.Contains(c.Import.URL, v1alpha1.ZarfPackageTemplatePrefix) {
path: src/internal/packager2/layout/import.go
user: login: brandtkeller
body: As a part of the packager2 SDK I appreciate this. Can I confirm though that you won't actually hit this code from the CLI as linting will always occur before? For `package create` I believe this is true but want to make sure I'm not overlooking a potential workflow. 
created_at: 2025-04-28T15:36:22Z
author_association: MEMBER
diff_hunk: @@ -175,6 +176,9 @@ func resolveImports(ctx context.Context, pkg v1alpha1.ZarfPackage, packagePath,
 
 func validateComponentCompose(c v1alpha1.ZarfComponent) error {
 	errs := []error{}
+	if strings.Contains(c.Import.Path, v1alpha1.ZarfPackageTemplatePrefix) || strings.Contains(c.Import.URL, v1alpha1.ZarfPackageTemplatePrefix) {
path: src/internal/packager2/layout/import.go
user: login: AustinAbro321
body: My original description wasn't very clear, I reworded it. Users can hit this error now as linting happens after compose. This also means that users were not hitting this error before, so the error message wouldn't directly suggest that package templates were not rendered in the workflow
created_at: 2025-04-28T15:44:09Z
author_association: MEMBER
diff_hunk: @@ -175,6 +176,9 @@ func resolveImports(ctx context.Context, pkg v1alpha1.ZarfPackage, packagePath,
 
 func validateComponentCompose(c v1alpha1.ZarfComponent) error {
 	errs := []error{}
+	if strings.Contains(c.Import.Path, v1alpha1.ZarfPackageTemplatePrefix) || strings.Contains(c.Import.URL, v1alpha1.ZarfPackageTemplatePrefix) {
path: src/internal/packager2/layout/import.go
user: login: brandtkeller
body: Thanks for the clarity. Part of my issue was testing locally with `path: ###ZARF_PKG_TMPL_PATH###` instead of having it properly wrapped `path: "###ZARF_PKG_TMPL_PATH###"`
created_at: 2025-04-28T16:21:39Z
author_association: MEMBER

PR comments:
user: login: netlify[bot]
created_at: 2025-04-28T14:43:40Z
body: ### <span aria-hidden="true">✅</span> Deploy Preview for *zarf-docs* canceled.


|  Name | Link |
|:-:|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | e58b0c5604ec1453dc66d8159fdc344f1f8acccc |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/sites/zarf-docs/deploys/680f998bb658470008494929 |
author_association: NONE
user: login: codecov[bot]
created_at: 2025-04-28T15:04:05Z
body: ## [Codecov](https://app.codecov.io/gh/zarf-dev/zarf/pull/3744?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=zarf-dev) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/zarf-dev/zarf/pull/3744?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=zarf-dev) | Coverage Δ | |
|---|---|---|
| [src/api/internal/v1beta1/component.go](https://app.codecov.io/gh/zarf-dev/zarf/pull/3744?src=pr&el=tree&filepath=src%2Fapi%2Finternal%2Fv1beta1%2Fcomponent.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=zarf-dev#diff-c3JjL2FwaS9pbnRlcm5hbC92MWJldGExL2NvbXBvbmVudC5nbw==) | `0.00% <ø> (ø)` | |
| [src/api/v1alpha1/component.go](https://app.codecov.io/gh/zarf-dev/zarf/pull/3744?src=pr&el=tree&filepath=src%2Fapi%2Fv1alpha1%2Fcomponent.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=zarf-dev#diff-c3JjL2FwaS92MWFscGhhMS9jb21wb25lbnQuZ28=) | `0.00% <ø> (ø)` | |
| [src/internal/packager2/layout/import.go](https://app.codecov.io/gh/zarf-dev/zarf/pull/3744?src=pr&el=tree&filepath=src%2Finternal%2Fpackager2%2Flayout%2Fimport.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=zarf-dev#diff-c3JjL2ludGVybmFsL3BhY2thZ2VyMi9sYXlvdXQvaW1wb3J0Lmdv) | `49.74% <100.00%> (+0.39%)` | :arrow_up: |

<details><summary> :rocket: New features to boost your workflow: </summary>

- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
- :package: [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
</details>
author_association: NONE