Skip to content

Commit c5692e0

Browse files
authored
Merge pull request #244 from storybookjs/post-transform-meta
refactor(transform)!: `meta` no longer destructurable from `defineMeta()` call
2 parents 76d00ad + c43b9ea commit c5692e0

18 files changed

+113
-243
lines changed

ERRORS.md

+2-12
Original file line numberDiff line numberDiff line change
@@ -218,30 +218,20 @@ You most likely forgot to destructure the return value.
218218

219219
### `SB_SVELTE_CSF_PARSER_ANALYSE_DEFINE_META_0003`
220220

221-
The addon automatically adds a `meta` identifier to the return value of `defineMeta()` during compilation.
222-
But for some reason, this couldn't be found in the compiled output.
223-
224-
If you see this error, please open a [bug report](https://github.com/storybookjs/addon-svelte-csf/issues/new).
225-
226-
While you create an issue, please provide original code of the stories file that caused this error.
227-
It will help us investigate the occurred issue better.
228-
229-
### `SB_SVELTE_CSF_PARSER_ANALYSE_DEFINE_META_0004`
230-
231221
When analysing the object passed to `defineMeta({ ... })`, invalid properties were found. The following properties must be **static string literals**, but got something else:
232222

233223
- `title`
234224
- `name`
235225

236226
Dynamically generating these properties with functions or with template strings is not supported.
237227

238-
### `SB_SVELTE_CSF_PARSER_ANALYSE_DEFINE_META_0005`
228+
### `SB_SVELTE_CSF_PARSER_ANALYSE_DEFINE_META_0004`
239229

240230
When analysing the object passed to `defineMeta({ ... })`, invalid properties were found. The `tags` property must be a **static array of static string literals**, but got something else
241231

242232
Dynamically generating the array or the entries with functions or with template strings is not supported.
243233

244-
### `SB_SVELTE_CSF_PARSER_ANALYSE_DEFINE_META_0006`
234+
### `SB_SVELTE_CSF_PARSER_ANALYSE_DEFINE_META_0005`
245235

246236
When analysing the object passed to `defineMeta({ ... })`, invalid properties were found. The `tags` property must be a **static array of static string literals**, but got something else
247237

src/compiler/post-transform/appendix/create-export-default.test.ts

-34
This file was deleted.

src/compiler/post-transform/appendix/create-export-default.ts

-16
This file was deleted.

src/compiler/post-transform/appendix/create-named-export-story.test.ts

-4
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@ describe(createNamedExportStory.name, () => {
1212
createNamedExportStory({
1313
exportName: 'Default',
1414
node: createVariableFromRuntimeStoriesCall({
15-
metaIdentifier: {
16-
type: 'Identifier',
17-
name: 'meta',
18-
},
1915
storiesFunctionDeclaration: {
2016
type: 'FunctionDeclaration',
2117
id: {

src/compiler/post-transform/appendix/create-variable-from-runtime-stories-call.test.ts

-4
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,6 @@ describe(createVariableFromRuntimeStoriesCall.name, () => {
77
it('creates a variable correctly', ({ expect }) => {
88
const stringified = print(
99
createVariableFromRuntimeStoriesCall({
10-
metaIdentifier: {
11-
type: 'Identifier',
12-
name: 'meta',
13-
},
1410
storiesFunctionDeclaration: {
1511
type: 'FunctionDeclaration',
1612
id: {

src/compiler/post-transform/appendix/create-variable-from-runtime-stories-call.ts

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
1-
import type { getMetaIdentifier } from '$lib/parser/analyse/define-meta/meta-identifier.js';
2-
import type { ESTreeAST } from '$lib/parser/ast.js';
1+
import { createASTIdentifier, type ESTreeAST } from '$lib/parser/ast.js';
32

43
interface Params {
54
storiesFunctionDeclaration: ESTreeAST.FunctionDeclaration;
6-
metaIdentifier: ReturnType<typeof getMetaIdentifier>;
75
filename?: string;
86
}
97

108
export function createVariableFromRuntimeStoriesCall(
119
params: Params
1210
): ESTreeAST.VariableDeclaration {
13-
const { storiesFunctionDeclaration, metaIdentifier } = params;
11+
const { storiesFunctionDeclaration } = params;
1412

1513
return {
1614
type: 'VariableDeclaration',
@@ -36,7 +34,7 @@ export function createVariableFromRuntimeStoriesCall(
3634
type: 'Identifier',
3735
name: storiesFunctionDeclaration.id.name,
3836
},
39-
metaIdentifier,
37+
createASTIdentifier('meta'),
4038
],
4139
},
4240
},

src/compiler/post-transform/create-appendix.ts

+11-10
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
import { print } from 'esrap';
22
import MagicString from 'magic-string';
33

4-
import { createExportDefaultMeta } from './appendix/create-export-default.js';
54
import { createExportOrderVariable } from './appendix/create-export-order.js';
65
import { createRuntimeStoriesImport } from './appendix/create-import.js';
76
import { createVariableFromRuntimeStoriesCall } from './appendix/create-variable-from-runtime-stories-call.js';
87
import { createNamedExportStory } from './appendix/create-named-export-story.js';
98

10-
import { getMetaIdentifier } from '$lib/parser/analyse/define-meta/meta-identifier.js';
9+
import { createASTIdentifier, type ESTreeAST } from '$lib/parser/ast.js';
10+
import { getStoriesIdentifiers } from '$lib/parser/analyse/story/attributes/identifiers.js';
1111
import type { CompiledASTNodes } from '$lib/parser/extract/compiled/nodes.js';
1212
import type { SvelteASTNodes } from '$lib/parser/extract/svelte/nodes.js';
13-
import { getStoriesIdentifiers } from '$lib/parser/analyse/story/attributes/identifiers.js';
1413

1514
interface Params {
1615
code: MagicString;
@@ -24,19 +23,14 @@ interface Params {
2423
export async function createAppendix(params: Params) {
2524
const { code, nodes, filename } = params;
2625
const { compiled, svelte } = nodes;
27-
const { defineMetaVariableDeclaration, storiesFunctionDeclaration } = compiled;
26+
const { storiesFunctionDeclaration } = compiled;
2827

2928
const storyIdentifiers = getStoriesIdentifiers({
3029
nodes: svelte,
3130
filename,
3231
});
33-
const metaIdentifier = getMetaIdentifier({
34-
node: defineMetaVariableDeclaration,
35-
filename,
36-
});
3732
const variableFromRuntimeStoriesCall = createVariableFromRuntimeStoriesCall({
3833
storiesFunctionDeclaration,
39-
metaIdentifier,
4034
filename,
4135
});
4236
const storiesExports = storyIdentifiers.map(({ exportName }) =>
@@ -53,11 +47,18 @@ export async function createAppendix(params: Params) {
5347
body: [
5448
createRuntimeStoriesImport(),
5549
variableFromRuntimeStoriesCall,
56-
createExportDefaultMeta({ metaIdentifier, filename }),
50+
createExportDefaultMeta(),
5751
createExportOrderVariable({ storyIdentifiers, filename }),
5852
...storiesExports,
5953
],
6054
});
6155

6256
code.append('\n' + appendix.code);
6357
}
58+
59+
function createExportDefaultMeta(): ESTreeAST.ExportDefaultDeclaration {
60+
return {
61+
type: 'ExportDefaultDeclaration',
62+
declaration: createASTIdentifier('meta'),
63+
};
64+
}

src/compiler/post-transform/define-meta/destructure-meta.ts

-61
This file was deleted.

src/compiler/post-transform/define-meta/index.test.ts

+2-20
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import MagicString from 'magic-string';
77
import { parseAst } from 'rollup/parseAst';
88
import { describe, it } from 'vitest';
99

10-
import { transformDefineMeta } from '.';
10+
import { transformDefineMeta } from './index';
1111

1212
import { getSvelteAST } from '$lib/parser/ast.js';
1313
import { extractSvelteASTNodes } from '$lib/parser/extract/svelte/nodes.js';
@@ -51,24 +51,6 @@ describe(transformDefineMeta.name, () => {
5151
ast: parseAst(code.toString()),
5252
});
5353

54-
expect(print(defineMetaVariableDeclaration).code).toMatchInlineSnapshot(`
55-
"const { Story, meta } = defineMeta({
56-
title: 'Example',
57-
component: Example,
58-
tags: ['autodocs'],
59-
args: {
60-
onclick: action('onclick'),
61-
onmouseenter: action('onmouseenter'),
62-
onmouseleave: action('onmouseleave')
63-
},
64-
parameters: {
65-
docs: {
66-
description: {
67-
component: "Description set explicitly in the comment above \`defineMeta\`.\\n\\nMultiline supported. And also Markdown syntax:\\n\\n* **Bold**,\\n* _Italic_,\\n* \`Code\`."
68-
}
69-
}
70-
}
71-
});"
72-
`);
54+
expect(print(defineMetaVariableDeclaration).code).toMatchInlineSnapshot(`"const { Story } = defineMeta(meta);"`);
7355
});
7456
});

src/compiler/post-transform/define-meta/index.ts

+28-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { print } from 'esrap';
22
import type MagicString from 'magic-string';
33

4-
import { destructureMetaFromDefineMeta } from './destructure-meta.js';
4+
import { replaceDefineMetaArgument } from './replace-argument';
55
import { insertDefineMetaJSDocCommentAsDescription } from './insert-description.js';
66

7+
import { createASTIdentifier, type ESTreeAST } from '$lib/parser/ast.js';
78
import type { CompiledASTNodes } from '$lib/parser/extract/compiled/nodes.js';
89
import type { SvelteASTNodes } from '$lib/parser/extract/svelte/nodes.js';
910

@@ -23,18 +24,41 @@ interface Params {
2324
export function transformDefineMeta(params: Params): void {
2425
const { code, nodes, filename } = params;
2526

26-
destructureMetaFromDefineMeta({
27-
nodes: nodes.compiled,
27+
insertDefineMetaJSDocCommentAsDescription({
28+
nodes,
2829
filename,
2930
});
30-
insertDefineMetaJSDocCommentAsDescription({
31+
const metaObjectExpression = replaceDefineMetaArgument({
3132
nodes,
3233
filename,
3334
});
35+
const metaVariableDeclaration = createMetaVariableDeclaration({
36+
init: metaObjectExpression,
37+
});
3438

3539
const { compiled } = nodes;
3640
const { defineMetaVariableDeclaration } = compiled;
3741
const { start, end } = defineMetaVariableDeclaration;
3842

3943
code.update(start as number, end as number, print(defineMetaVariableDeclaration).code);
44+
code.appendLeft(start as number, print(metaVariableDeclaration).code + '\n');
45+
}
46+
47+
export function createMetaVariableDeclaration({
48+
init,
49+
}: {
50+
init: ESTreeAST.ObjectExpression;
51+
}): ESTreeAST.VariableDeclaration {
52+
//
53+
return {
54+
type: 'VariableDeclaration',
55+
kind: 'const',
56+
declarations: [
57+
{
58+
type: 'VariableDeclarator',
59+
id: createASTIdentifier('meta'),
60+
init,
61+
},
62+
],
63+
};
4064
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { createASTIdentifier, type ESTreeAST } from '../../../parser/ast';
2+
import type { CompiledASTNodes } from '../../../parser/extract/compiled/nodes';
3+
import type { SvelteASTNodes } from '../../../parser/extract/svelte/nodes';
4+
import { getDefineMetaFirstArgumentObjectExpression } from '../../../parser/extract/svelte/define-meta';
5+
import { NoDestructuredDefineMetaCallError } from '../../../utils/error/parser/analyse/define-meta';
6+
7+
interface Params {
8+
nodes: {
9+
compiled: CompiledASTNodes;
10+
svelte: SvelteASTNodes;
11+
};
12+
filename?: string;
13+
}
14+
15+
/**
16+
* Replaces `defineMeta({ ... })` with `defineMeta(meta)`,
17+
* and also it returns {@link ESTreeASTAST.ObjectExpression} which was replaced with {@link ESTreeAST.Identifier}
18+
*/
19+
export function replaceDefineMetaArgument(params: Params): ESTreeAST.ObjectExpression {
20+
const defineMetaFirstArgumentObjectExpression = getDefineMetaFirstArgumentObjectExpression({
21+
nodes: params.nodes.compiled,
22+
filename: params.filename,
23+
});
24+
25+
const declaration = params.nodes.compiled.defineMetaVariableDeclaration.declarations[0];
26+
27+
if (
28+
!declaration ||
29+
declaration.init?.type !== 'CallExpression' ||
30+
declaration?.init?.callee.type !== 'Identifier' ||
31+
declaration?.init?.callee.name !== params.nodes.compiled.defineMetaImport.local.name
32+
) {
33+
throw new NoDestructuredDefineMetaCallError({
34+
defineMetaVariableDeclarator: declaration,
35+
filename: params.filename,
36+
});
37+
}
38+
39+
declaration.init.arguments[0] = createASTIdentifier('meta');
40+
params.nodes.compiled.defineMetaVariableDeclaration.declarations[0] = declaration;
41+
42+
return defineMetaFirstArgumentObjectExpression;
43+
}

0 commit comments

Comments
 (0)