diff --git a/.changeset/big-chefs-return.md b/.changeset/big-chefs-return.md new file mode 100644 index 000000000..d7b2e0d30 --- /dev/null +++ b/.changeset/big-chefs-return.md @@ -0,0 +1,5 @@ +--- +'sv': patch +--- + +fix: insert the `tailwindcss` vite plugin at the start of the plugin array diff --git a/packages/addons/tailwindcss/index.ts b/packages/addons/tailwindcss/index.ts index 18fe640ba..f003ceb42 100644 --- a/packages/addons/tailwindcss/index.ts +++ b/packages/addons/tailwindcss/index.ts @@ -67,7 +67,7 @@ export default defineAddon({ const pluginsArray = object.property(param1, 'plugins', array.createEmpty()); const pluginFunctionCall = functions.call(vitePluginName, []); - array.push(pluginsArray, pluginFunctionCall); + array.unshift(pluginsArray, pluginFunctionCall); return generateCode(); }); diff --git a/packages/core/tests/js/arrays/object-array/output.ts b/packages/core/tests/js/arrays/push-object-array/output.ts similarity index 100% rename from packages/core/tests/js/arrays/object-array/output.ts rename to packages/core/tests/js/arrays/push-object-array/output.ts diff --git a/packages/core/tests/js/arrays/object-array/run.ts b/packages/core/tests/js/arrays/push-object-array/run.ts similarity index 100% rename from packages/core/tests/js/arrays/object-array/run.ts rename to packages/core/tests/js/arrays/push-object-array/run.ts diff --git a/packages/core/tests/js/arrays/string-array/output.ts b/packages/core/tests/js/arrays/push-string-array/output.ts similarity index 100% rename from packages/core/tests/js/arrays/string-array/output.ts rename to packages/core/tests/js/arrays/push-string-array/output.ts diff --git a/packages/core/tests/js/arrays/string-array/run.ts b/packages/core/tests/js/arrays/push-string-array/run.ts similarity index 100% rename from packages/core/tests/js/arrays/string-array/run.ts rename to packages/core/tests/js/arrays/push-string-array/run.ts diff --git a/packages/core/tests/js/arrays/unshift-object-array/output.ts b/packages/core/tests/js/arrays/unshift-object-array/output.ts new file mode 100644 index 000000000..53443163d --- /dev/null +++ b/packages/core/tests/js/arrays/unshift-object-array/output.ts @@ -0,0 +1,8 @@ +const array = [ + { + test2: 'string' + }, + { + test: true + } +]; diff --git a/packages/core/tests/js/arrays/unshift-object-array/run.ts b/packages/core/tests/js/arrays/unshift-object-array/run.ts new file mode 100644 index 000000000..e38203768 --- /dev/null +++ b/packages/core/tests/js/arrays/unshift-object-array/run.ts @@ -0,0 +1,16 @@ +import { array, object, common, variables } from '@sveltejs/cli-core/js'; +import type { ScriptFileEditor } from '@sveltejs/cli-core'; + +export function run({ ast }: ScriptFileEditor): void { + const array1 = array.createEmpty(); + + const object1 = object.create({ test: common.expressionFromString('true') }); + const object2 = object.create({ test2: common.createLiteral('string') }); + array.unshift(array1, object1); + array.unshift(array1, object2); + array.unshift(array1, object2); // avoid duplication + + // create declaration so that we serialize everything + const declaration = variables.declaration(ast, 'const', 'array', array1); + ast.body.push(declaration); +} diff --git a/packages/core/tests/js/arrays/unshift-string-array/output.ts b/packages/core/tests/js/arrays/unshift-string-array/output.ts new file mode 100644 index 000000000..0244d4843 --- /dev/null +++ b/packages/core/tests/js/arrays/unshift-string-array/output.ts @@ -0,0 +1 @@ +const array = ['test2', 'test']; diff --git a/packages/core/tests/js/arrays/unshift-string-array/run.ts b/packages/core/tests/js/arrays/unshift-string-array/run.ts new file mode 100644 index 000000000..c8282f26f --- /dev/null +++ b/packages/core/tests/js/arrays/unshift-string-array/run.ts @@ -0,0 +1,13 @@ +import { array, variables } from '@sveltejs/cli-core/js'; +import type { ScriptFileEditor } from '@sveltejs/cli-core'; + +export function run({ ast }: ScriptFileEditor): void { + const array1 = array.createEmpty(); + array.unshift(array1, 'test'); + array.unshift(array1, 'test2'); + array.unshift(array1, 'test'); // make sure items are not duplicated + + // create declaration so that we serialize everything + const declaration = variables.declaration(ast, 'const', 'array', array1); + ast.body.push(declaration); +} diff --git a/packages/core/tooling/js/array.ts b/packages/core/tooling/js/array.ts index 7b43cd916..947c76f9a 100644 --- a/packages/core/tooling/js/array.ts +++ b/packages/core/tooling/js/array.ts @@ -13,30 +13,36 @@ export function push( ast: AstTypes.ArrayExpression, data: string | AstKinds.ExpressionKind | AstKinds.SpreadElementKind ): void { - if (typeof data === 'string') { - const existingLiterals = ast.elements.filter( - (x): x is AstTypes.StringLiteral => x?.type == 'StringLiteral' - ); - let literal = existingLiterals.find((x) => x.value == data); + insertElement(ast, data, true); +} +export function unshift( + ast: AstTypes.ArrayExpression, + data: string | AstKinds.ExpressionKind | AstKinds.SpreadElementKind +): void { + insertElement(ast, data, false); +} +function insertElement( + ast: AstTypes.ArrayExpression, + data: string | AstKinds.ExpressionKind | AstKinds.SpreadElementKind, + insertEnd: boolean +): void { + if (typeof data === 'string') { + const existingLiterals = ast.elements.filter((x) => x?.type === 'StringLiteral'); + let literal = existingLiterals.find((x) => x.value === data); if (!literal) { - literal = { - type: 'StringLiteral', - value: data - }; - ast.elements.push(literal); + literal = { type: 'StringLiteral', value: data }; + + if (insertEnd) ast.elements.push(literal); + else ast.elements.unshift(literal); } } else { - let anyNodeEquals = false; const elements = ast.elements as AstTypes.ASTNode[]; - for (const node of elements) { - if (areNodesEqual(data, node)) { - anyNodeEquals = true; - } - } + const anyNodeEquals = elements.some((node) => areNodesEqual(data, node)); if (!anyNodeEquals) { - ast.elements.push(data); + if (insertEnd) ast.elements.push(data); + else ast.elements.unshift(data); } } }