a3s-acl 0.2.0

Agent Configuration Language - A configuration language similar to HCL
Documentation
/**
 * ACL SDK Tests
 */

const { parse, generate, string, number, boolean, call, BlockBuilder, DocumentBuilder } = require('./index.js');

// Helper to convert Map to Object for display
function mapToObj(m) {
  if (!m || typeof m !== 'object' || m.constructor !== Map) return m;
  return Object.fromEntries([...m].map(([k, v]) => [k, mapToObj(v)]));
}

function docToObj(doc) {
  return {
    blocks: doc.blocks.map(b => ({
      name: b.name,
      labels: b.labels,
      blocks: b.blocks.map(b2 => ({
        name: b2.name,
        labels: b2.labels,
        blocks: [],
        attributes: mapToObj(b2.attributes)
      })),
      attributes: mapToObj(b.attributes)
    }))
  };
}

// Test basic parsing
console.log('=== Test Basic Parsing ===');
const doc1 = parse('name = "test"');
console.log('Parsed:', JSON.stringify(docToObj(doc1), null, 2));

// Test generate
console.log('\n=== Test Generate ===');
const output = generate(doc1);
console.log('Generated:\n' + output);

// Test function calls
console.log('\n=== Test Function Calls ===');
const doc2 = parse('api_key = env("API_KEY")');
console.log('Function call parsed:', JSON.stringify(docToObj(doc2), null, 2));
console.log('Generated:', generate(doc2));

// Test complex config
console.log('\n=== Test Complex Config ===');
const config = `
providers "openai" {
    api_key = env("OPENAI_API_KEY")
    base_url = "https://api.openai.com/v1"
}

default_model = "gpt-4"

settings {
    temperature = 0.7
    max_tokens = 2000
}
`;
const doc3 = parse(config);
console.log('Parsed complex config');
console.log('Blocks:', doc3.blocks.length);
console.log('Generated:\n' + generate(doc3));

// Test builder
console.log('\n=== Test Builder ===');
const block = new BlockBuilder('config')
    .attr('name', string('test'))
    .attr('count', number(42))
    .attr('enabled', boolean(true))
    .build();

const doc = new DocumentBuilder()
    .block(block)
    .build();

console.log('Built document:', JSON.stringify(docToObj(doc), null, 2));
console.log('Generated:\n' + generate(doc));

// Test nested blocks
console.log('\n=== Test Nested Blocks ===');
const nested = parse(`
providers "aws" {
    regions "us-east-1" {
        endpoint = "https://east.example.com"
    }
    regions "us-west-2" {
        endpoint = "https://west.example.com"
    }
}
`);
console.log('Nested parsed, blocks:', nested.blocks.length);
console.log('Generated:\n' + generate(nested));

console.log('\n=== All tests passed! ===');

// Test list of objects
console.log('\n=== Test List of Objects ===');
const listObjInput = `knowledge_bases = [
  { id = "WThXBKfN21eAxJOl3n1PA", name = "" },
  { id = "another_id", name = "another_name" }
]`;
const docList = parse(listObjInput);
const kb = docList.blocks[0].attributes.get('knowledge_bases');
console.log('Is List:', kb.kind === 'List');
console.log('Items count:', kb.items.length);
console.log('First item kind:', kb.items[0].kind);
console.log('First item pairs:', kb.items[0].pairs.length);
console.log('First id value:', kb.items[0].pairs.find(p => p[0] === 'id')[1].value);
console.log('Generated:\n' + generate(docList));

// Test single object in list
console.log('\n=== Test Single Object in List ===');
const singleObjInput = `items = [{ id = "1", name = "test" }]`;
const docSingle = parse(singleObjInput);
const items = docSingle.blocks[0].attributes.get('items');
console.log('Is List:', items.kind === 'List');
console.log('Items count:', items.items.length);
console.log('First item kind:', items.items[0].kind);