(addOnsDirectories: Array<string>)
| 47 | } |
| 48 | |
| 49 | export function scanAddOnDirectories(addOnsDirectories: Array<string>) { |
| 50 | const addOns: Array<AddOn> = [] |
| 51 | |
| 52 | for (const addOnsBase of addOnsDirectories) { |
| 53 | for (const dir of readdirSync(addOnsBase).filter((file) => |
| 54 | isDirectory(resolve(addOnsBase, file)), |
| 55 | )) { |
| 56 | const filePath = resolve(addOnsBase, dir, 'info.json') |
| 57 | const fileContent = readFileSync(filePath, 'utf-8') |
| 58 | const info = JSON.parse(fileContent) |
| 59 | |
| 60 | let packageAdditions: Record<string, any> = {} |
| 61 | let packageTemplate: string | undefined = undefined |
| 62 | |
| 63 | if (existsSync(resolve(addOnsBase, dir, 'package.json'))) { |
| 64 | packageAdditions = JSON.parse( |
| 65 | readFileSync(resolve(addOnsBase, dir, 'package.json'), 'utf-8'), |
| 66 | ) |
| 67 | } else if (existsSync(resolve(addOnsBase, dir, 'package.json.ejs'))) { |
| 68 | packageTemplate = readFileSync( |
| 69 | resolve(addOnsBase, dir, 'package.json.ejs'), |
| 70 | 'utf-8', |
| 71 | ) |
| 72 | } |
| 73 | |
| 74 | let readme: string | undefined |
| 75 | let readmeIsEjs = false |
| 76 | if (existsSync(resolve(addOnsBase, dir, 'README.md'))) { |
| 77 | readme = readFileSync(resolve(addOnsBase, dir, 'README.md'), 'utf-8') |
| 78 | } else if (existsSync(resolve(addOnsBase, dir, 'README.md.ejs'))) { |
| 79 | readme = readFileSync( |
| 80 | resolve(addOnsBase, dir, 'README.md.ejs'), |
| 81 | 'utf-8', |
| 82 | ) |
| 83 | readmeIsEjs = true |
| 84 | } |
| 85 | |
| 86 | let smallLogo: string | undefined |
| 87 | if (existsSync(resolve(addOnsBase, dir, 'small-logo.svg'))) { |
| 88 | smallLogo = readFileSync( |
| 89 | resolve(addOnsBase, dir, 'small-logo.svg'), |
| 90 | 'utf-8', |
| 91 | ) |
| 92 | } |
| 93 | |
| 94 | const absoluteFiles: Record<string, string> = {} |
| 95 | const assetsDir = resolve(addOnsBase, dir, 'assets') |
| 96 | if (existsSync(assetsDir)) { |
| 97 | findFilesRecursively(assetsDir, absoluteFiles) |
| 98 | } |
| 99 | const files: Record<string, string> = {} |
| 100 | for (const file of Object.keys(absoluteFiles)) { |
| 101 | files[toCleanPath(file, assetsDir)] = readFileHelper(file) |
| 102 | } |
| 103 | |
| 104 | const getFiles = () => { |
| 105 | return Promise.resolve(Object.keys(files)) |
| 106 | } |
no test coverage detected