{
	# generic parameters
	name:: $.chart,
	namespace:: $.name,

	syncOptions:: ["CreateNamespace=true"],
	retryLimit:: 5,
	sync_wave:: 0,

	# source parameters
	repo:: error "repository must be defined",
	version:: error "version must be defined",

	# helm chart parameters
	chart:: "",
	skipCrds:: false,
	values:: "",

	# directory parameters
	path:: "",
	recursive:: true,


	apiVersion: "argoproj.io/v1alpha1",
	kind: "Application",
	metadata: {
		name: $.name,
		namespace: "argocd",
		annotations: { "argocd.argoproj.io/sync-wave": std.toString($.sync_wave) },
		finalizers: ["resources-finalizer.argocd.argoproj.io"],
	},
	spec: {
		project: "baseline",
		destination: {
			server: "https://kubernetes.default.svc",
			namespace: $.namespace,
		},
		source: {
			repoURL: $.repo,
			targetRevision: $.version,
		},
		syncPolicy: {
			automated: {
				selfHeal: true,
				prune: true,
			},
			retry: {
				limit: $.retryLimit,
				backoff: {
					duration: "5s",
					factor: 2,
					maxDuration: "5m",
				},
			},
			syncOptions: $.syncOptions,
		}
	}

	+ (	# append chart name if defined
			if std.length($.chart) > 0 then
			{ source+: { chart: $.chart, } } else {}
		)

	+ (	# set helm values
			if std.length($.values) > 0 then
			{ source+: { helm+: { values: $.values } } } else {}
		)

	+ (	# set skipCRDs if defined
			if $.skipCrds then
			{ source+: { helm+: { skipCrds: true } } } else {}
		)

	+ (	# append generic directory path and recurse option
			if std.length($.path) > 0 then
			{ source+: { path: $.path, directory: { recurse: $.recursive } } } else {}
	)

}