From e50a063df5bb09c4f24939e9c249b5f7e563b41e Mon Sep 17 00:00:00 2001 From: Bart Veneman <1536852+bartveneman@users.noreply.github.com> Date: Tue, 3 Jun 2025 21:26:26 +0200 Subject: [PATCH] at least I tried --- src/index.js | 34 ++++++++++++++++++++++++---------- test/layer.spec.js | 26 ++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/src/index.js b/src/index.js index d3b124e..619ef09 100644 --- a/src/index.js +++ b/src/index.js @@ -16,11 +16,12 @@ import { TreeNode } from './TreeNode.js' function get_location(node) { let loc = node.loc if (!loc) return + let { start, end } = loc return { - line: loc.start.line, - column: loc.start.column, - start: loc.start.offset, - end: loc.end.offset, + line: start.line, + column: start.column, + start: start.offset, + end: end.offset, } } @@ -63,17 +64,29 @@ export function layer_tree_from_ast(ast) { let location = get_location(node) if (node.prelude === null) { + // @layer {} let layer_name = get_anonymous_id() root.add_child(current_stack, layer_name, location) current_stack.push(layer_name) } else if (node.prelude.type === 'AtrulePrelude') { if (node.block === null) { + // @layer test; + // @layer test.nested; + // @layer first, second; + // @layer core.reset, core.tokens; // @ts-expect-error CSSTree types are not updated yet in @types/css-tree - let prelude = csstree.findAll(node.prelude, n => n.type === 'Layer').map(n => n.name) - for (let name of prelude) { - root.add_child(current_stack, name, location) + let layers = csstree.findAll(node.prelude, n => n.type === 'Layer') + for (let layer of layers) { + // console.log('enter', layer.name) + for (let layer_name of get_layer_names(layer)) { + root.add_child(current_stack, layer_name, location) + current_stack.push(layer_name) + } + current_stack = [] } } else { + // @layer test { ... } + // @layer test.nested { ... } for (let layer_name of get_layer_names(node.prelude)) { root.add_child(current_stack, layer_name, location) current_stack.push(layer_name) @@ -109,9 +122,10 @@ export function layer_tree_from_ast(ast) { leave(node) { if (is_layer(node)) { if (node.prelude !== null && node.prelude.type === 'AtrulePrelude') { - let layer_names = get_layer_names(node.prelude) - for (let i = 0; i < layer_names.length; i++) { - current_stack.pop() + let layers = csstree.findAll(node.prelude, n => n.type === 'Layer') + for (let layer of layers) { + // console.log('leave', layer.name) + current_stack = [] } } else { // pop the anonymous layer diff --git a/test/layer.spec.js b/test/layer.spec.js index 1930bab..13d9725 100644 --- a/test/layer.spec.js +++ b/test/layer.spec.js @@ -73,6 +73,32 @@ test('multiple named layers in one line', () => { assert.equal(actual, expected) }) +test('multiple named + nested layers without body', () => { + let actual = layer_tree(`@layer core.reset, core.tokens;`) + let expected = [ + { + name: 'core', + is_anonymous: false, + children: [ + { + name: 'reset', + is_anonymous: false, + children: [], + locations: [{ line: 1, column: 1, start: 0, end: 31 }] + }, + { + name: 'tokens', + is_anonymous: false, + children: [], + locations: [{ line: 1, column: 1, start: 0, end: 31 }] + } + ], + locations: [{ line: 1, column: 1, start: 0, end: 31 }] + } + ] + assert.equal(actual, expected) +}) + test('repeated use of the same layer name', () => { let actual = layer_tree(` @layer first {}