{{#each svcTemplateItems}}
import {{namePascal}} from '{{path}}'
{{/each}}
{{#each vcTemplateItems}}
import {{namePascal}} from '{{path}}'
{{/each}}
{{#each viewPluginItems}}
import {{namePascal}} from '{{path}}'
{{/each}}
{{#if appTemplateItem}}
import {{appTemplateItem.namePascal}} from '{{appTemplateItem.path}}'
{{/if}}

import '@sprucelabs/heartwood-view-controllers'

const vcs = {
    {{#each allTemplateItems}}
    {{namePascal}},
    {{/each}}
}

export const pluginsByName = {
	{{#each viewPluginItems}}
	{{nameCamel}}: {{namePascal}},
	{{/each}}
}



{{#if svcTemplateItems}}
type LoadOptions<Args extends Record<string,any>[]> = Args[0]['args'] extends Record<string, any> ? Args[0]['args'] : Record<never, any>
{{/if}}

declare module '@sprucelabs/heartwood-view-controllers/build/types/heartwood.types' {
	interface SkillViewControllerMap {
        {{#each svcTemplateItems}}
		'{{../namespaceKebab}}.{{id}}': {{namePascal}}
        {{/each}}
	}

	interface SkillViewControllerArgsMap {
        {{#each svcTemplateItems}}
		'{{../namespaceKebab}}.{{id}}': LoadOptions<Parameters<{{namePascal}}['load']>>
        {{/each}}
	}

	interface ViewControllerMap {
        {{#each allTemplateItems}}
		'{{../namespaceKebab}}.{{id}}': {{namePascal}}
        {{/each}}
	}

    interface ViewControllerOptionsMap {
		 {{#each vcTemplateItems}}
		'{{../namespaceKebab}}.{{id}}': ConstructorParameters<typeof {{namePascal}}>[0]
        {{/each}}
	}

	interface ViewControllerPlugins {
		{{#each viewPluginItems}}
		{{nameCamel}}: {{namePascal}}
		{{/each}}
	}

	interface AppControllerMap {
	{{#if appTemplateItem}}
		'{{namespaceKebab}}': {{appTemplateItem.namePascal}}
	{{/if}}
	}
}


//@ts-ignore
if(typeof heartwood === 'function') { 
	{{#if appTemplateItem}}
	//@ts-ignore
	heartwood({ vcs, pluginsByName, App: {{appTemplateItem.namePascal}} }) 
	{{else}}
	//@ts-ignore
	heartwood({ vcs, pluginsByName }) 
	{{/if}}
}

export default vcs


export const App = {{#if appTemplateItem}}{{appTemplateItem.namePascal}}{{else}}undefined{{/if}}
