import { tokenize } from '../tokenizer/index.js'; import { createParser } from '../parser/create.js'; import { createGenerator } from '../generator/create.js'; import { createConvertor } from '../convertor/create.js'; import { createWalker } from '../walker/create.js'; import { Lexer } from '../lexer/Lexer.js'; import mix from './config/mix.js'; function createSyntax(config) { const parse = createParser(config); const walk = createWalker(config); const generate = createGenerator(config); const { fromPlainObject, toPlainObject } = createConvertor(walk); const syntax = { lexer: null, createLexer: config => new Lexer(config, syntax, syntax.lexer.structure), tokenize, parse, generate, walk, find: walk.find, findLast: walk.findLast, findAll: walk.findAll, fromPlainObject, toPlainObject, fork(extension) { const base = mix({}, config); // copy of config return createSyntax( typeof extension === 'function' ? extension(base, Object.assign) : mix(base, extension) ); } }; syntax.lexer = new Lexer({ generic: true, units: config.units, types: config.types, atrules: config.atrules, properties: config.properties, node: config.node }, syntax); return syntax; }; export default config => createSyntax(mix({}, config));