@knapsack/app
Version:
Build Design Systems on top of knapsack, by Basalt
100 lines (84 loc) • 2.93 kB
text/typescript
/**
* Copyright (C) 2018 Basalt
This file is part of Knapsack.
Knapsack is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your option)
any later version.
Knapsack is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
You should have received a copy of the GNU General Public License along
with Knapsack; if not, see <https://www.gnu.org/licenses>.
*/
import globby from 'globby';
import { join } from 'path';
import { KnapsackFile } from '@knapsack/core';
import { FileDb2 } from './dbs/file-db';
import {
KnapsackCustomPagesData,
KnapsackCustomPage,
} from '../schemas/custom-pages';
import { KnapsackDb } from '../schemas/misc';
export class CustomPages implements KnapsackDb<KnapsackCustomPagesData> {
private dataDir: string;
constructor({ dataDir }: { dataDir: string }) {
this.dataDir = dataDir;
}
async getData(): Promise<KnapsackCustomPagesData> {
const data: KnapsackCustomPagesData = {
pages: {},
};
await globby(join(this.dataDir, 'knapsack.custom-page.*.yml')).then(
async configFilePaths => {
if (!configFilePaths) return;
return Promise.all(
configFilePaths.map(async configFilePath => {
const db = new FileDb2<KnapsackCustomPage>({
filePath: configFilePath,
type: 'yml',
watch: false,
writeFileIfAbsent: false,
});
const config = await db.getData();
data.pages[config.id] = config;
return {
db,
config: await db.getData(),
};
}),
);
},
);
return data;
}
async savePrep(data: KnapsackCustomPagesData): Promise<KnapsackFile[]> {
const ogData = await this.getData();
const idsToDelete = new Set(Object.keys(ogData.pages));
const allFiles: KnapsackFile[] = [];
await Promise.all(
Object.keys(data.pages).map(async id => {
idsToDelete.delete(id);
const page = data.pages[id];
const db = new FileDb2<KnapsackCustomPage>({
filePath: join(this.dataDir, `knapsack.custom-page.${id}.yml`),
type: 'yml',
watch: false,
writeFileIfAbsent: false,
});
const files = await db.savePrep(page);
files.forEach(file => allFiles.push(file));
}),
);
idsToDelete.forEach(id => {
allFiles.push({
isDeleted: true,
contents: '',
encoding: 'utf8',
path: join(this.dataDir, 'knapsack.custom-page.*.yml'),
});
});
return allFiles;
}
}