create.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { tokenize } from '../tokenizer/index.js';
  2. import { createParser } from '../parser/create.js';
  3. import { createGenerator } from '../generator/create.js';
  4. import { createConvertor } from '../convertor/create.js';
  5. import { createWalker } from '../walker/create.js';
  6. import { Lexer } from '../lexer/Lexer.js';
  7. import mix from './config/mix.js';
  8. function createSyntax(config) {
  9. const parse = createParser(config);
  10. const walk = createWalker(config);
  11. const generate = createGenerator(config);
  12. const { fromPlainObject, toPlainObject } = createConvertor(walk);
  13. const syntax = {
  14. lexer: null,
  15. createLexer: config => new Lexer(config, syntax, syntax.lexer.structure),
  16. tokenize,
  17. parse,
  18. generate,
  19. walk,
  20. find: walk.find,
  21. findLast: walk.findLast,
  22. findAll: walk.findAll,
  23. fromPlainObject,
  24. toPlainObject,
  25. fork(extension) {
  26. const base = mix({}, config); // copy of config
  27. return createSyntax(
  28. typeof extension === 'function'
  29. ? extension(base) // TODO: remove Object.assign as second parameter
  30. : mix(base, extension)
  31. );
  32. }
  33. };
  34. syntax.lexer = new Lexer({
  35. generic: config.generic,
  36. cssWideKeywords: config.cssWideKeywords,
  37. units: config.units,
  38. types: config.types,
  39. atrules: config.atrules,
  40. properties: config.properties,
  41. node: config.node
  42. }, syntax);
  43. return syntax;
  44. };
  45. export default config => createSyntax(mix({}, config));