Update records publishing script to support YAML records (#68)

Part of [Define record schemas for entities](https://www.notion.so/Define-record-schemas-for-entities-e13e84d7cf7c4087aae69035733faff0)

Reviewed-on: cerc-io/laconic-registry-cli#68
Co-authored-by: Prathamesh Musale <prathamesh.musale0@gmail.com>
Co-committed-by: Prathamesh Musale <prathamesh.musale0@gmail.com>
This commit is contained in:
Prathamesh Musale 2024-06-25 06:36:46 +00:00 committed by ashwin
parent ed06cc05a6
commit e6b747fb48

View File

@ -1,6 +1,7 @@
import yargs from 'yargs';
import fs from 'fs';
import path from 'path';
import yaml from 'js-yaml';
import assert from 'assert';
import { hideBin } from 'yargs/helpers';
@ -54,10 +55,8 @@ async function main () {
async function processDir (directoryPath: string): Promise<void> {
const files = fs.readdirSync(directoryPath);
// Check if any JSON record file exists in the directory
if (files.some(file => file.endsWith('.json'))) {
await publishRecordsFromDir(directoryPath);
const dirHasRecords = await publishRecordsFromDir(directoryPath);
if (dirHasRecords) {
// Skip further recursion in the current dir
return;
}
@ -73,21 +72,25 @@ async function processDir (directoryPath: string): Promise<void> {
}
}
async function publishRecordsFromDir (recordsDir: string): Promise<void> {
async function publishRecordsFromDir (recordsDir: string): Promise<boolean> {
// List record files
const files = fs.readdirSync(recordsDir);
const jsonFiles = files.filter(file => path.extname(file).toLowerCase() === '.json');
const recordFiles = files.filter(file => ['.json', '.yaml', '.yml'].includes(path.extname(file).toLowerCase()));
if (recordFiles.length === 0) {
return false;
}
// Read record from each JSON file
console.log('**************************************');
console.log(`Publishing records from ${recordsDir}`);
let recordType;
for (let i = 0; i < jsonFiles.length; i++) {
const file = jsonFiles[i];
for (let i = 0; i < recordFiles.length; i++) {
const file = recordFiles[i];
const filePath = path.resolve(recordsDir, file);
const record = readRecord(filePath);
const record = await readRecord(filePath);
// Publish record
const result = await publishRecord(userKey, bondId, fee, record);
@ -101,7 +104,7 @@ async function publishRecordsFromDir (recordsDir: string): Promise<void> {
// Check if deployment record files exist
const deploymentRecordsDir = path.resolve(recordsDir, 'deployments');
if (!fs.existsSync(deploymentRecordsDir) || !fs.statSync(deploymentRecordsDir).isDirectory()) {
return;
return true;
}
console.log('--------------------------------------');
console.log(`Publishing deployment records from ${deploymentRecordsDir}`);
@ -114,7 +117,7 @@ async function publishRecordsFromDir (recordsDir: string): Promise<void> {
const file = deploymentJsonFiles[i];
const filePath = path.resolve(deploymentRecordsDir, file);
const deploymentRecord = readRecord(filePath);
const deploymentRecord = await readRecord(filePath);
// Find record using name and given type
const recordName = deploymentRecord.name;
@ -137,13 +140,30 @@ async function publishRecordsFromDir (recordsDir: string): Promise<void> {
console.log(`Published record ${file}`);
txOutput(deploymentResult, JSON.stringify(deploymentResult, undefined, 2), '', false);
}
return true;
}
function readRecord (filePath: string): any {
async function readRecord (filePath: string): Promise<any> {
let record;
try {
const fileExt = path.extname(filePath).toLowerCase();
const data = fs.readFileSync(filePath, 'utf8');
if (fileExt === '.json') {
// JSON file
record = JSON.parse(data);
} else {
// YAML file
({ record } = await yaml.load(data) as any);
// Convert sub-objects (other than arrays) to a JSON automatically.
for (const [k, v] of Object.entries(record)) {
if (v && typeof v === 'object' && !Array.isArray(v)) {
record[k] = JSON.stringify(v);
}
}
}
} catch (err) {
console.error(`Error reading file ${filePath}:`, err);
}
@ -152,7 +172,8 @@ function readRecord (filePath: string): any {
}
async function publishRecord (userKey: string, bondId: string, fee: StdFee, record: any): Promise<any> {
if (record.repository) {
// Replace repository URL with record id (if type is one of RecordType)
if (record.repository && Object.values(RecordType).includes(record.type)) {
const repoUrl = record.repository;
const queryResult = await registry.queryRecords({ type: RecordType.RepositoryRecord, url: repoUrl }, true);