-
-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathdirective-analysis.test.ts
More file actions
148 lines (122 loc) · 4.48 KB
/
directive-analysis.test.ts
File metadata and controls
148 lines (122 loc) · 4.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// Copyright 2023-present Eser Ozvataf and other contributors. All rights reserved. Apache-2.0 license.
import * as assert from "@std/assert";
import { extractExports, hasDirective } from "./directive-analysis.ts";
Deno.test("hasDirective - finds use client with double quotes", () => {
const content = `"use client";
export function Button() {}
`;
assert.assertEquals(hasDirective(content, "use client"), true);
});
Deno.test("hasDirective - finds use client with single quotes", () => {
const content = `'use client';
export function Button() {}
`;
assert.assertEquals(hasDirective(content, "use client"), true);
});
Deno.test("hasDirective - finds use server", () => {
const content = `"use server";
export async function submitForm() {}
`;
assert.assertEquals(hasDirective(content, "use server"), true);
});
Deno.test("hasDirective - ignores directive after code", () => {
const content = `import React from "react";
"use client";
export function Button() {}
`;
assert.assertEquals(hasDirective(content, "use client"), false);
});
Deno.test("hasDirective - handles comments before directive", () => {
const content = `// This is a client component
"use client";
export function Button() {}
`;
assert.assertEquals(hasDirective(content, "use client"), true);
});
Deno.test("hasDirective - returns false when directive not present", () => {
const content = `export function Button() {}`;
assert.assertEquals(hasDirective(content, "use client"), false);
});
Deno.test("hasDirective - case insensitive", () => {
const content = `"Use Client";
export function Button() {}
`;
assert.assertEquals(hasDirective(content, "use client"), true);
});
Deno.test("hasDirective - handles multi-line JSDoc comments", () => {
const content = `/**
* Server Actions
* These functions run on the server and can be called from client components.
*
* The bundler automatically:
* 1. Marks these functions with React's server reference symbols
* 2. Generates client stubs that call the server via RSC protocol
* 3. Action IDs are generated as: path/to/file#exportName
*
* Usage in client components:
* import { addComment } from "./actions";
* import { useActionState } from "react";
*
* function Comments() {
* const [state, formAction, isPending] = useActionState(addComment, null);
* return <form action={formAction}>...</form>;
* }
*/
"use server";
import * as logging from "@eserstack/logging";
export async function addComment() {}
`;
assert.assertEquals(hasDirective(content, "use server"), true);
});
Deno.test("extractExports - finds named function exports", () => {
const content = `export function Button() {}
export function Input() {}
`;
const exports = extractExports(content);
assert.assertEquals(exports.includes("Button"), true);
assert.assertEquals(exports.includes("Input"), true);
});
Deno.test("extractExports - finds async function exports", () => {
const content = `export async function fetchData() {}`;
const exports = extractExports(content);
assert.assertEquals(exports.includes("fetchData"), true);
});
Deno.test("extractExports - finds const exports", () => {
const content = `export const Button = () => {};
export const theme = { color: "blue" };
`;
const exports = extractExports(content);
assert.assertEquals(exports.includes("Button"), true);
assert.assertEquals(exports.includes("theme"), true);
});
Deno.test("extractExports - finds class exports", () => {
const content = `export class UserService {}`;
const exports = extractExports(content);
assert.assertEquals(exports.includes("UserService"), true);
});
Deno.test("extractExports - finds default export", () => {
const content = `export default function Button() {}`;
const exports = extractExports(content);
assert.assertEquals(exports.includes("default"), true);
});
Deno.test("extractExports - finds named export block", () => {
const content = `const a = 1;
const b = 2;
export { a, b };
`;
const exports = extractExports(content);
assert.assertEquals(exports.includes("a"), true);
assert.assertEquals(exports.includes("b"), true);
});
Deno.test("extractExports - handles export with alias", () => {
const content = `const internalName = 1;
export { internalName as publicName };
`;
const exports = extractExports(content);
assert.assertEquals(exports.includes("publicName"), true);
});
Deno.test("extractExports - returns empty array for no exports", () => {
const content = `const x = 1;`;
const exports = extractExports(content);
assert.assertEquals(exports.length, 0);
});