Skip to content

Commit

Permalink
feat: add method to get list of known templates across all disks
Browse files Browse the repository at this point in the history
  • Loading branch information
thetutlage committed Nov 7, 2023
1 parent f577463 commit 8796e86
Show file tree
Hide file tree
Showing 2 changed files with 147 additions and 9 deletions.
66 changes: 57 additions & 9 deletions src/loader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,17 +55,34 @@ export class Loader implements LoaderContract {
#getDiskComponents(diskName: string): ComponentsTree[0]['components'] {
const componentsDirName = 'components'
const diskBasePath = this.#mountedDirs.get(diskName)!
if (!existsSync(join(diskBasePath, componentsDirName))) {
return []
}
let files =
diskName === 'default'
? Array.from(this.#preRegistered.keys()).map((template) => {
return {
fileName: template,
componentPath: template,
}
})
: []

const files = readdirSync(join(diskBasePath, componentsDirName)).filter((file) =>
file.endsWith('.edge')
)
/**
* Read disk files
*/
if (existsSync(join(diskBasePath, componentsDirName))) {
files = files.concat(
readdirSync(join(diskBasePath, componentsDirName))
.filter((file) => file.endsWith('.edge'))
.map((template) => {
const fileName = slash(template).replace(/\.edge$/, '')
return {
fileName,
componentPath: `${componentsDirName}/${fileName}`,
}
})
)
}

return files.map((file) => {
const fileName = slash(file).replace(/\.edge$/, '')
const componentPath = `${componentsDirName}/${fileName}`
return files.map(({ fileName, componentPath }) => {
const tagName = fileName
.split('/')
.filter((segment, index) => {
Expand All @@ -81,6 +98,23 @@ export class Loader implements LoaderContract {
})
}

/**
* Returns a list of templates for a given disk
*/
#getDiskTemplates(diskName: string): string[] {
const diskBasePath = this.#mountedDirs.get(diskName)!
let files = diskName === 'default' ? Array.from(this.#preRegistered.keys()) : []

if (existsSync(diskBasePath)) {
files = files.concat(readdirSync(join(diskBasePath)).filter((file) => file.endsWith('.edge')))
}

return files.map((file) => {
const fileName = slash(file).replace(/\.edge$/, '')
return diskName !== 'default' ? `${diskName}::${fileName}` : fileName
})
}

/**
* Extracts the disk name and the template name from the template
* path expression.
Expand Down Expand Up @@ -314,4 +348,18 @@ export class Loader implements LoaderContract {
}
})
}

/**
* Returns a list of templates from all the disks and in-memory
* templates as well
*/
listTemplates(): { diskName: string; templates: string[] }[] {
const diskNames = [...this.#mountedDirs.keys()]
return diskNames.map((diskName) => {
return {
diskName,
templates: this.#getDiskTemplates(diskName),
}
})
}
}
90 changes: 90 additions & 0 deletions tests/loader.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,9 @@ test.group('Loader', () => {

assert.throws(fn, 'Cannot override previously registered "my-view" template')
})
})

test.group('Loader | listComponents', () => {
test('get components for the default disk', async ({ assert, fs }) => {
await fs.create('components/foo.edge', 'Hello world')

Expand Down Expand Up @@ -261,4 +263,92 @@ test.group('Loader', () => {
},
])
})

test('get in-memory templates as components', async ({ assert, fs }) => {
await fs.create('components/foo.edge', 'Hello world')

const loader = new Loader()
loader.mount('default', fs.basePath)
loader.register('uikit/button', {
template: ``,
})

const componentsList = loader.listComponents()
assert.deepEqual(componentsList, [
{
diskName: 'default',
components: [
{
componentName: 'uikit/button',
tagName: 'uikit.button',
},
{
componentName: 'components/foo',
tagName: 'foo',
},
],
},
])
})
})

test.group('Loader | listComponents', () => {
test('get templates for the default disk', async ({ assert, fs }) => {
await fs.create('components/foo.edge', 'Hello world')
await fs.create('header.edge', 'Hello world')
await fs.create('footer.edge', 'Hello world')

const loader = new Loader()
loader.mount('default', fs.basePath)

const componentsList = loader.listTemplates()
assert.deepEqual(componentsList, [
{
diskName: 'default',
templates: ['components/foo', 'footer', 'header'],
},
])
})

test('get templates for the named disk', async ({ assert, fs }) => {
await fs.create('components/foo.edge', 'Hello world')
await fs.create('header.edge', 'Hello world')
await fs.create('footer.edge', 'Hello world')

const loader = new Loader()
loader.mount('elegant', fs.basePath)

const componentsList = loader.listTemplates()
assert.deepEqual(componentsList, [
{
diskName: 'elegant',
templates: ['elegant::components/foo', 'elegant::footer', 'elegant::header'],
},
])
})

test('get in-memory templates', async ({ assert, fs }) => {
await fs.create('components/foo.edge', 'Hello world')
await fs.create('header.edge', 'Hello world')
await fs.create('footer.edge', 'Hello world')

const loader = new Loader()
loader.mount('elegant', fs.basePath)
loader.mount('default', join(fs.basePath, 'foo'))
loader.register('uibutton', {
template: '',
})

const componentsList = loader.listTemplates()
assert.deepEqual(componentsList, [
{
diskName: 'elegant',
templates: ['elegant::components/foo', 'elegant::footer', 'elegant::header'],
},
{
diskName: 'default',
templates: ['uibutton'],
},
])
})
})

0 comments on commit 8796e86

Please sign in to comment.