Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
1a06cbe
bring ensureNestedProperty
jycouet Sep 2, 2025
b820e8b
rmv `addProperties`
jycouet Sep 2, 2025
64bdc83
expose less & align more
jycouet Sep 2, 2025
0d99628
update lucia
jycouet Sep 2, 2025
7257898
playwrite
jycouet Sep 2, 2025
7886687
adapter
jycouet Sep 2, 2025
719e117
refacto to use overrideProperty & path
jycouet Sep 2, 2025
dc2fa9c
discard one change that is not part
jycouet Sep 2, 2025
b4f1916
linting friend
jycouet Sep 2, 2025
fb8a23d
changeset
jycouet Sep 2, 2025
27741ef
rmv leading comment
jycouet Sep 2, 2025
620a8cc
have a way to transform property
jycouet Sep 2, 2025
1191b68
fix naming
jycouet Sep 2, 2025
aa7304e
remove unused `removeProperty`
manuel3108 Sep 6, 2025
f2c0507
Merge branch 'main' of github.com:sveltejs/cli into chore/object-stre…
jycouet Sep 6, 2025
e0ce18d
thx types!
jycouet Sep 6, 2025
ebaca7a
use `object.create` like syntax
manuel3108 Sep 6, 2025
dd9c7a6
add transformProperty <3
jycouet Sep 7, 2025
ba12fa9
pos
jycouet Sep 7, 2025
2d741e6
reduce types
jycouet Sep 7, 2025
9e46d99
focus object test of object
jycouet Sep 7, 2025
2ff1cd6
check
jycouet Sep 7, 2025
b75a37f
playwrite using the latest syntax
jycouet Sep 7, 2025
e9cf2a9
adding another test case
jycouet Sep 7, 2025
8c37c74
adding tests for auto adapter
jycouet Sep 7, 2025
7c2c044
let's confirm that only the value is changed. YES
jycouet Sep 7, 2025
4255c67
adapter okay
jycouet Sep 7, 2025
ac620b2
add propertyNode
jycouet Sep 7, 2025
de250f6
simplify api by removing transformProperty! You want to go raw, use o…
jycouet Sep 7, 2025
6dea5a5
Check import & comments
jycouet Sep 7, 2025
de8acd4
;)
jycouet Sep 7, 2025
52961f0
Opti tests, no need preview when page not requested.
jycouet Sep 7, 2025
5518f9c
Revert "Opti tests, no need preview when page not requested."
jycouet Sep 9, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/eighty-deer-bake.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'sv': patch
---

chore(core): streamline object helpers
16 changes: 16 additions & 0 deletions packages/addons/_tests/sveltekit-adapter/test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,20 @@ test.concurrent.for(kitOnly)('core - %s', async (variant, { page, ...ctx }) => {
ctx.onTestFinished(async () => await close());

expect(await readFile(join(cwd, 'svelte.config.js'), 'utf8')).not.toMatch('adapter-auto');
expect(await readFile(join(cwd, 'svelte.config.js'), 'utf8')).not.toMatch(
'adapter-auto only supports some environments'
);
});

test.concurrent.for(kitOnly)('core - %s', async (variant, { page, ...ctx }) => {
const cwd = await ctx.run(variant, { [addonId]: { adapter: 'auto' } });

const { close } = await prepareServer({ cwd, page });
// kill server process when we're done
ctx.onTestFinished(async () => await close());

expect(await readFile(join(cwd, 'svelte.config.js'), 'utf8')).toMatch('adapter-auto');
expect(await readFile(join(cwd, 'svelte.config.js'), 'utf8')).toMatch(
'adapter-auto only supports some environments'
);
});
78 changes: 28 additions & 50 deletions packages/addons/lucia/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -145,28 +145,20 @@ export default defineAddon({
imports: ['sqliteTable', 'text', 'integer']
});
js.object.overrideProperties(userAttributes, {
properties: {
id: js.common.parseExpression("text('id').primaryKey()")
}
id: js.common.parseExpression("text('id').primaryKey()")
});
if (options.demo) {
js.object.overrideProperties(userAttributes, {
properties: {
username: js.common.parseExpression("text('username').notNull().unique()"),
passwordHash: js.common.parseExpression("text('password_hash').notNull()")
}
username: js.common.parseExpression("text('username').notNull().unique()"),
passwordHash: js.common.parseExpression("text('password_hash').notNull()")
});
}
js.object.overrideProperties(sessionAttributes, {
properties: {
id: js.common.parseExpression("text('id').primaryKey()"),
userId: js.common.parseExpression(
"text('user_id').notNull().references(() => user.id)"
),
expiresAt: js.common.parseExpression(
"integer('expires_at', { mode: 'timestamp' }).notNull()"
)
}
id: js.common.parseExpression("text('id').primaryKey()"),
userId: js.common.parseExpression("text('user_id').notNull().references(() => user.id)"),
expiresAt: js.common.parseExpression(
"integer('expires_at', { mode: 'timestamp' }).notNull()"
)
});
}
if (drizzleDialect === 'mysql') {
Expand All @@ -175,30 +167,24 @@ export default defineAddon({
imports: ['mysqlTable', 'varchar', 'datetime']
});
js.object.overrideProperties(userAttributes, {
properties: {
id: js.common.parseExpression("varchar('id', { length: 255 }).primaryKey()")
}
id: js.common.parseExpression("varchar('id', { length: 255 }).primaryKey()")
});
if (options.demo) {
js.object.overrideProperties(userAttributes, {
properties: {
username: js.common.parseExpression(
"varchar('username', { length: 32 }).notNull().unique()"
),
passwordHash: js.common.parseExpression(
"varchar('password_hash', { length: 255 }).notNull()"
)
}
username: js.common.parseExpression(
"varchar('username', { length: 32 }).notNull().unique()"
),
passwordHash: js.common.parseExpression(
"varchar('password_hash', { length: 255 }).notNull()"
)
});
}
js.object.overrideProperties(sessionAttributes, {
properties: {
id: js.common.parseExpression("varchar('id', { length: 255 }).primaryKey()"),
userId: js.common.parseExpression(
"varchar('user_id', { length: 255 }).notNull().references(() => user.id)"
),
expiresAt: js.common.parseExpression("datetime('expires_at').notNull()")
}
id: js.common.parseExpression("varchar('id', { length: 255 }).primaryKey()"),
userId: js.common.parseExpression(
"varchar('user_id', { length: 255 }).notNull().references(() => user.id)"
),
expiresAt: js.common.parseExpression("datetime('expires_at').notNull()")
});
}
if (drizzleDialect === 'postgresql') {
Expand All @@ -207,28 +193,20 @@ export default defineAddon({
imports: ['pgTable', 'text', 'timestamp']
});
js.object.overrideProperties(userAttributes, {
properties: {
id: js.common.parseExpression("text('id').primaryKey()")
}
id: js.common.parseExpression("text('id').primaryKey()")
});
if (options.demo) {
js.object.overrideProperties(userAttributes, {
properties: {
username: js.common.parseExpression("text('username').notNull().unique()"),
passwordHash: js.common.parseExpression("text('password_hash').notNull()")
}
username: js.common.parseExpression("text('username').notNull().unique()"),
passwordHash: js.common.parseExpression("text('password_hash').notNull()")
});
}
js.object.overrideProperties(sessionAttributes, {
properties: {
id: js.common.parseExpression("text('id').primaryKey()"),
userId: js.common.parseExpression(
"text('user_id').notNull().references(() => user.id)"
),
expiresAt: js.common.parseExpression(
"timestamp('expires_at', { withTimezone: true, mode: 'date' }).notNull()"
)
}
id: js.common.parseExpression("text('id').primaryKey()"),
userId: js.common.parseExpression("text('user_id').notNull().references(() => user.id)"),
expiresAt: js.common.parseExpression(
"timestamp('expires_at', { withTimezone: true, mode: 'date' }).notNull()"
)
});
}

Expand Down
5 changes: 2 additions & 3 deletions packages/addons/mdsvex/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,8 @@ export default defineAddon({
const previousElement = preprocessorArray;
preprocessorArray = array.create();
array.append(preprocessorArray, previousElement);
object.overrideProperty(exportDefault, {
name: 'preprocess',
value: preprocessorArray
object.overrideProperties(exportDefault, {
preprocess: preprocessorArray
});
}

Expand Down
17 changes: 7 additions & 10 deletions packages/addons/playwright/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,26 +49,23 @@ export default defineAddon({
const { value: defaultExport } = exports.createDefault(ast, { fallback: defineConfig });

const config = {
webServer: object.create({
webServer: {
command: 'npm run build && npm run preview',
port: 4173
}),
testDir: common.createLiteral('e2e')
},
testDir: 'e2e'
};

if (
defaultExport.type === 'CallExpression' &&
defaultExport.arguments[0]?.type === 'ObjectExpression'
) {
// uses the `defineConfig` helper
imports.addNamed(ast, {
from: '@playwright/test',
imports: ['defineConfig']
});
object.addProperties(defaultExport.arguments[0], { properties: config });
imports.addNamed(ast, { imports: ['defineConfig'], from: '@playwright/test' });
object.overrideProperties(defaultExport.arguments[0], config);
} else if (defaultExport.type === 'ObjectExpression') {
// if the config is just an object expression, just add the property
object.addProperties(defaultExport, { properties: config });
// if the config is just an object expression, just add the properties
object.overrideProperties(defaultExport, config);
} else {
// unexpected config shape
log.warn('Unexpected playwright config for playwright add-on. Could not update.');
Expand Down
37 changes: 12 additions & 25 deletions packages/addons/sveltekit-adapter/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { defineAddon, defineAddonOptions } from '@sveltejs/cli-core';
import { exports, functions, imports, object, type AstTypes } from '@sveltejs/cli-core/js';
import { exports, functions, imports, object } from '@sveltejs/cli-core/js';
import { parseJson, parseScript } from '@sveltejs/cli-core/parsers';

const adapters = [
Expand Down Expand Up @@ -74,33 +74,20 @@ export default defineAddon({
}

const { value: config } = exports.createDefault(ast, { fallback: object.create({}) });
const kitConfig = config.properties.find(
(p) => p.type === 'Property' && p.key.type === 'Identifier' && p.key.name === 'kit'
) as AstTypes.Property | undefined;

if (kitConfig && kitConfig.value.type === 'ObjectExpression') {
const adapterProp = kitConfig.value.properties.find(
(p) => p.type === 'Property' && p.key.type === 'Identifier' && p.key.name === 'adapter'
);
if (adapterProp) {
adapterProp.leadingComments = [];
// override the adapter property
object.overrideProperties(config, {
kit: {
adapter: functions.createCall({ name: adapterName, args: [], useIdentifiers: true })
}
});

// only overrides the `adapter` property so we can reset it's args
object.overrideProperties(kitConfig.value, {
properties: {
adapter: functions.createCall({ name: adapterName, args: [], useIdentifiers: true })
}
});
} else {
// creates the `kit` property when absent
object.addProperties(config, {
properties: {
kit: object.create({
adapter: functions.createCall({ name: adapterName, args: [], useIdentifiers: true })
})
}
});
// reset the comment for non-auto adapters
if (adapter.package !== '@sveltejs/adapter-auto') {
const fallback = object.create({});
const cfgKitValue = object.property(config, { name: 'kit', fallback });
const cfgAdapter = object.propertyNode(cfgKitValue, { name: 'adapter', fallback });
cfgAdapter.leadingComments = [];
}

return generateCode();
Expand Down
6 changes: 6 additions & 0 deletions packages/core/tests/js/object/ensure-nested-property/input.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
const test = {
a: {
/** a comment */
keep: 'me'
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
const test = { a: { /** a comment */ keep: 'you', b: { c: '007' } } };
14 changes: 14 additions & 0 deletions packages/core/tests/js/object/ensure-nested-property/run.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { object, type AstTypes } from '@sveltejs/cli-core/js';
import { getTestObjectExpression } from '../objectTestHelper.ts';

export function run(ast: AstTypes.Program): void {
const obj = getTestObjectExpression(ast);

object.overrideProperties(obj, {
a: { b: { c: '007' } }
});

object.overrideProperties(obj, {
a: { keep: 'you' }
});
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import { variables, object, type AstTypes } from '@sveltejs/cli-core/js';

export function run(ast: AstTypes.Program): void {
export const getTestObjectExpression = (ast: AstTypes.Program): AstTypes.ObjectExpression => {
const variable = variables.declaration(ast, {
kind: 'const',
name: 'test',
value: object.create({})
});

const objectDeclarator = variable.declarations[0] as AstTypes.VariableDeclarator;
const objectExpression = objectDeclarator.init as AstTypes.ObjectExpression;
object.removeProperty(objectExpression, { name: 'foo' });
object.removeProperty(objectExpression, { name: 'bar' });
}

return objectExpression;
};
1 change: 1 addition & 0 deletions packages/core/tests/js/object/override-property/input.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const test = {
/** a comment */
foo: 1,
bar: 'string',
lorem: true
Expand Down
2 changes: 1 addition & 1 deletion packages/core/tests/js/object/override-property/output.ts
Original file line number Diff line number Diff line change
@@ -1 +1 @@
const test = { foo: 2, bar: 'string2', lorem: false };
const test = { /** a comment */ foo: 2, bar: 'string2', lorem: false };
24 changes: 6 additions & 18 deletions packages/core/tests/js/object/override-property/run.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,9 @@
import { variables, object, common, type AstTypes } from '@sveltejs/cli-core/js';
import { object, type AstTypes } from '@sveltejs/cli-core/js';
import { getTestObjectExpression } from '../objectTestHelper.ts';

export function run(ast: AstTypes.Program): void {
const variable = variables.declaration(ast, {
kind: 'const',
name: 'test',
value: object.create({})
});
const objectDeclarator = variable.declarations[0] as AstTypes.VariableDeclarator;
const objectExpression = objectDeclarator.init as AstTypes.ObjectExpression;
object.overrideProperty(objectExpression, {
name: 'foo',
value: common.createLiteral(2)
});
object.overrideProperties(objectExpression, {
properties: {
bar: common.createLiteral('string2'),
lorem: common.createLiteral(false)
}
});
const obj = getTestObjectExpression(ast);

object.overrideProperties(obj, { foo: 2 });
object.overrideProperties(obj, { bar: 'string2', lorem: false });
}
4 changes: 4 additions & 0 deletions packages/core/tests/js/object/property-node/input.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
const test = {
/** a comment */
foo: 1
};
1 change: 1 addition & 0 deletions packages/core/tests/js/object/property-node/output.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
const test = { /*a comment updated*/ foo: 1, /*aka: bond, james bond*/ james: '007' };
18 changes: 18 additions & 0 deletions packages/core/tests/js/object/property-node/run.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { object, common, type AstTypes } from '@sveltejs/cli-core/js';
import { getTestObjectExpression } from '../objectTestHelper.ts';

export function run(ast: AstTypes.Program): void {
const obj = getTestObjectExpression(ast);

const p1 = object.propertyNode(obj, {
name: 'foo',
fallback: object.create({})
});
p1.leadingComments = [{ type: 'Block', value: 'a comment updated' }];

const p2 = object.propertyNode(obj, {
name: 'james',
fallback: common.createLiteral('007')
});
p2.leadingComments = [{ type: 'Block', value: 'aka: bond, james bond' }];
}
13 changes: 4 additions & 9 deletions packages/core/tests/js/object/property/run.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
import { variables, object, common, type AstTypes } from '@sveltejs/cli-core/js';
import { object, common, type AstTypes } from '@sveltejs/cli-core/js';
import { getTestObjectExpression } from '../objectTestHelper.ts';

export function run(ast: AstTypes.Program): void {
const variable = variables.declaration(ast, {
kind: 'const',
name: 'test',
value: object.create({})
});
const objectDeclarator = variable.declarations[0] as AstTypes.VariableDeclarator;
const objectExpression = objectDeclarator.init as AstTypes.ObjectExpression;
const obj = getTestObjectExpression(ast);

object.property(objectExpression, {
object.property(obj, {
name: 'bar',
fallback: common.createLiteral('string')
});
Expand Down
4 changes: 0 additions & 4 deletions packages/core/tests/js/object/remove-property/input.ts

This file was deleted.

1 change: 0 additions & 1 deletion packages/core/tests/js/object/remove-property/output.ts

This file was deleted.

Loading
Loading