harmonyc 0.16.0 → 0.16.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli/cli.d.ts +2 -0
- package/cli/run.d.ts +2 -0
- package/cli/watch.d.ts +1 -0
- package/code_generator/VitestGenerator.d.ts +31 -0
- package/code_generator/outFile.d.ts +17 -0
- package/code_generator/test_phrases.d.ts +11 -0
- package/compiler/compile.d.ts +9 -0
- package/compiler/compiler.d.ts +9 -0
- package/filenames/filenames.d.ts +3 -0
- package/model/Router.d.ts +22 -0
- package/model/model.d.ts +205 -0
- package/optimizations/autoLabel/autoLabel.d.ts +2 -0
- package/package.json +1 -1
- package/parser/lexer.d.ts +21 -0
- package/parser/lexer_rules.d.ts +33 -0
- package/parser/parser.d.ts +18 -0
- package/util/indent.d.ts +1 -0
- package/util/iterators.d.ts +1 -0
- package/util/xmur3.d.ts +1 -0
- package/vitest/index.d.ts +10 -0
- package/test.d.ts +0 -7
package/cli/cli.d.ts
ADDED
package/cli/run.d.ts
ADDED
package/cli/watch.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function watchFiles(patterns: string[]): Promise<string[]>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Action, CodeGenerator, ErrorResponse, Feature, Phrase, Response, SaveToVariable, SetVariable, Test, TestGroup } from '../model/model.ts';
|
|
2
|
+
import { OutFile } from './outFile.ts';
|
|
3
|
+
export declare class VitestGenerator implements CodeGenerator {
|
|
4
|
+
private tf;
|
|
5
|
+
private sf;
|
|
6
|
+
static error(message: string): string;
|
|
7
|
+
framework: string;
|
|
8
|
+
phraseFns: Map<string, Phrase>;
|
|
9
|
+
currentFeatureName: string;
|
|
10
|
+
constructor(tf: OutFile, sf: OutFile);
|
|
11
|
+
feature(feature: Feature): void;
|
|
12
|
+
testGroup(g: TestGroup): void;
|
|
13
|
+
featureVars: Map<string, string>;
|
|
14
|
+
resultCount: number;
|
|
15
|
+
test(t: Test): void;
|
|
16
|
+
errorStep(action: Action, errorResponse: ErrorResponse): void;
|
|
17
|
+
extraArgs: string[];
|
|
18
|
+
step(action: Action, responses: Response[]): void;
|
|
19
|
+
private declareFeatureVariables;
|
|
20
|
+
phrase(p: Phrase): void;
|
|
21
|
+
setVariable(action: SetVariable): void;
|
|
22
|
+
saveToVariable(s: SaveToVariable, what?: string): void;
|
|
23
|
+
stringLiteral(text: string, { withVariables }: {
|
|
24
|
+
withVariables: boolean;
|
|
25
|
+
}): string;
|
|
26
|
+
codeLiteral(src: string): string;
|
|
27
|
+
private paramName;
|
|
28
|
+
stringParamDeclaration(index: number): string;
|
|
29
|
+
variantParamDeclaration(index: number): string;
|
|
30
|
+
}
|
|
31
|
+
export declare function functionName(phrase: Phrase): string;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Location } from '../model/model.ts';
|
|
2
|
+
import { SourceMapGenerator } from 'source-map-js';
|
|
3
|
+
export declare class OutFile {
|
|
4
|
+
name: string;
|
|
5
|
+
lines: string[];
|
|
6
|
+
level: number;
|
|
7
|
+
sm: SourceMapGenerator;
|
|
8
|
+
indentSpaces: number;
|
|
9
|
+
private currentLoc;
|
|
10
|
+
constructor(name: string);
|
|
11
|
+
indent(fn: () => void): void;
|
|
12
|
+
print(...lines: string[]): this;
|
|
13
|
+
loc({ location }: {
|
|
14
|
+
location?: Location;
|
|
15
|
+
}): this;
|
|
16
|
+
get value(): string;
|
|
17
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class TestPhrases {
|
|
2
|
+
private context;
|
|
3
|
+
constructor(context: any);
|
|
4
|
+
When_goodbye(): void;
|
|
5
|
+
When_hello(): string;
|
|
6
|
+
When_greet_(name: string): void;
|
|
7
|
+
Then__is_(x: string, y: string): Promise<void>;
|
|
8
|
+
Then_last_char(s: string): string;
|
|
9
|
+
Then_last_char_of_greeting(): any;
|
|
10
|
+
Then_(s: string, r: string): void;
|
|
11
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { OutFile } from '../code_generator/outFile.ts';
|
|
2
|
+
export interface CompiledFeature {
|
|
3
|
+
name: string;
|
|
4
|
+
code: Record<string, string>;
|
|
5
|
+
}
|
|
6
|
+
export declare function compileFeature(fileName: string, src: string): {
|
|
7
|
+
outFile: OutFile;
|
|
8
|
+
phrasesFile: OutFile;
|
|
9
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function compileFiles(pattern: string | string[]): Promise<{
|
|
2
|
+
fns: string[];
|
|
3
|
+
outFns: string[];
|
|
4
|
+
}>;
|
|
5
|
+
export declare function compileFile(fn: string): Promise<{
|
|
6
|
+
phrasesFileAction: string;
|
|
7
|
+
outFile: import("../code_generator/outFile.ts").OutFile;
|
|
8
|
+
phrasesFile: import("../code_generator/outFile.ts").OutFile;
|
|
9
|
+
} | undefined>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Branch } from './model.ts';
|
|
2
|
+
export declare class Router<N> {
|
|
3
|
+
outs: N[];
|
|
4
|
+
index: number;
|
|
5
|
+
random: () => number;
|
|
6
|
+
started: Set<N>;
|
|
7
|
+
covered: Set<N>;
|
|
8
|
+
constructor(outs: N[], seed?: string);
|
|
9
|
+
next(): N;
|
|
10
|
+
get incompleteCount(): number;
|
|
11
|
+
}
|
|
12
|
+
type N = Branch;
|
|
13
|
+
export declare class Routers {
|
|
14
|
+
private root;
|
|
15
|
+
routers: Map<Branch, Router<Branch>>;
|
|
16
|
+
constructor(root: N);
|
|
17
|
+
discover(branch: N): void;
|
|
18
|
+
get(branch: N): Router<Branch>;
|
|
19
|
+
nextWalk(): Branch[];
|
|
20
|
+
getIncompleteCount(): number;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
package/model/model.d.ts
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
export interface CodeGenerator {
|
|
2
|
+
feature(feature: Feature): void;
|
|
3
|
+
testGroup(group: TestGroup): void;
|
|
4
|
+
test(test: Test): void;
|
|
5
|
+
phrase(phrase: Phrase): void;
|
|
6
|
+
step(action: Action, responses: Response[]): void;
|
|
7
|
+
errorStep(action: Action, errorResponse: ErrorResponse): void;
|
|
8
|
+
setVariable(action: SetVariable): void;
|
|
9
|
+
saveToVariable(response: SaveToVariable): void;
|
|
10
|
+
stringLiteral(text: string, opts: {
|
|
11
|
+
withVariables: boolean;
|
|
12
|
+
}): string;
|
|
13
|
+
codeLiteral(src: string): string;
|
|
14
|
+
stringParamDeclaration(index: number): string;
|
|
15
|
+
variantParamDeclaration(index: number): string;
|
|
16
|
+
}
|
|
17
|
+
export interface Location {
|
|
18
|
+
line: number;
|
|
19
|
+
column: number;
|
|
20
|
+
fileName: string;
|
|
21
|
+
}
|
|
22
|
+
export declare class Feature {
|
|
23
|
+
name: string;
|
|
24
|
+
root: Section;
|
|
25
|
+
prelude: string;
|
|
26
|
+
constructor(name: string);
|
|
27
|
+
get tests(): Test[];
|
|
28
|
+
get testGroups(): (TestGroup | Test)[];
|
|
29
|
+
toCode(cg: CodeGenerator): void;
|
|
30
|
+
}
|
|
31
|
+
export declare abstract class Branch {
|
|
32
|
+
parent?: Branch;
|
|
33
|
+
children: Branch[];
|
|
34
|
+
isFork: boolean;
|
|
35
|
+
isEnd: boolean;
|
|
36
|
+
location?: Location;
|
|
37
|
+
abstract get isEmpty(): boolean;
|
|
38
|
+
constructor(children?: Branch[]);
|
|
39
|
+
setFork(isFork: boolean): this;
|
|
40
|
+
setFeature(feature: Feature): this;
|
|
41
|
+
addChild<C extends Branch>(child: C, index?: number): C;
|
|
42
|
+
get isLeaf(): boolean;
|
|
43
|
+
get successors(): Branch[];
|
|
44
|
+
get nextNonForkAncestorSibling(): Branch | undefined;
|
|
45
|
+
get nextSibling(): Branch | undefined;
|
|
46
|
+
get siblingIndex(): number;
|
|
47
|
+
toString(): string;
|
|
48
|
+
replaceWith(newBranch: Branch): this;
|
|
49
|
+
switch(_i: number): this;
|
|
50
|
+
}
|
|
51
|
+
export declare class Step extends Branch {
|
|
52
|
+
action: Action;
|
|
53
|
+
responses: Response[];
|
|
54
|
+
state?: State;
|
|
55
|
+
constructor(action: Action, responses?: Response[], children?: Branch[], isFork?: boolean);
|
|
56
|
+
get phrases(): Phrase[];
|
|
57
|
+
toCode(cg: CodeGenerator): void;
|
|
58
|
+
setFeature(feature: Feature): this;
|
|
59
|
+
headToString(): string;
|
|
60
|
+
toString(): string;
|
|
61
|
+
get isEmpty(): boolean;
|
|
62
|
+
switch(i: number): this;
|
|
63
|
+
}
|
|
64
|
+
export declare class State {
|
|
65
|
+
text: string;
|
|
66
|
+
constructor(text?: string);
|
|
67
|
+
}
|
|
68
|
+
export declare class Label {
|
|
69
|
+
text: string;
|
|
70
|
+
constructor(text?: string);
|
|
71
|
+
get isEmpty(): boolean;
|
|
72
|
+
}
|
|
73
|
+
export declare class Section extends Branch {
|
|
74
|
+
label: Label;
|
|
75
|
+
constructor(label?: Label, children?: Branch[], isFork?: boolean);
|
|
76
|
+
toString(): string;
|
|
77
|
+
get isEmpty(): boolean;
|
|
78
|
+
}
|
|
79
|
+
export declare abstract class Part {
|
|
80
|
+
toSingleLineString(): string;
|
|
81
|
+
}
|
|
82
|
+
export declare class DummyKeyword extends Part {
|
|
83
|
+
text: string;
|
|
84
|
+
constructor(text?: string);
|
|
85
|
+
toString(): string;
|
|
86
|
+
}
|
|
87
|
+
export declare class Word extends Part {
|
|
88
|
+
text: string;
|
|
89
|
+
constructor(text?: string);
|
|
90
|
+
toString(): string;
|
|
91
|
+
}
|
|
92
|
+
export declare class Repeater extends Part {
|
|
93
|
+
choices: Part[][];
|
|
94
|
+
constructor(choices: Part[][]);
|
|
95
|
+
toString(): string;
|
|
96
|
+
toSingleLineString(): string;
|
|
97
|
+
}
|
|
98
|
+
export declare class Switch extends Part {
|
|
99
|
+
choices: Part[];
|
|
100
|
+
constructor(choices: Part[]);
|
|
101
|
+
toString(): string;
|
|
102
|
+
toSingleLineString(): string;
|
|
103
|
+
}
|
|
104
|
+
export declare class Router extends Part {
|
|
105
|
+
choices: Repeater[];
|
|
106
|
+
constructor(choices: Repeater[]);
|
|
107
|
+
toString(): string;
|
|
108
|
+
toSingleLineString(): string;
|
|
109
|
+
}
|
|
110
|
+
export declare abstract class Arg extends Part {
|
|
111
|
+
abstract toCode(cg: CodeGenerator): string;
|
|
112
|
+
abstract toDeclaration(cg: CodeGenerator, index: number): string;
|
|
113
|
+
}
|
|
114
|
+
export declare class StringLiteral extends Arg {
|
|
115
|
+
text: string;
|
|
116
|
+
constructor(text?: string);
|
|
117
|
+
toString(): string;
|
|
118
|
+
toSingleLineString(): string;
|
|
119
|
+
toCode(cg: CodeGenerator): string;
|
|
120
|
+
toDeclaration(cg: CodeGenerator, index: number): string;
|
|
121
|
+
}
|
|
122
|
+
export declare class Docstring extends StringLiteral {
|
|
123
|
+
toCode(cg: CodeGenerator): string;
|
|
124
|
+
toString(): string;
|
|
125
|
+
toSingleLineString(): string;
|
|
126
|
+
}
|
|
127
|
+
export declare class CodeLiteral extends Arg {
|
|
128
|
+
src: string;
|
|
129
|
+
constructor(src?: string);
|
|
130
|
+
toString(): string;
|
|
131
|
+
toCode(cg: CodeGenerator): string;
|
|
132
|
+
toDeclaration(cg: CodeGenerator, index: number): string;
|
|
133
|
+
}
|
|
134
|
+
export declare abstract class Phrase {
|
|
135
|
+
parts: Part[];
|
|
136
|
+
feature: Feature;
|
|
137
|
+
location?: Location;
|
|
138
|
+
abstract get kind(): string;
|
|
139
|
+
constructor(parts: Part[]);
|
|
140
|
+
setFeature(feature: Feature): this;
|
|
141
|
+
get keyword(): "When" | "Then";
|
|
142
|
+
get args(): Arg[];
|
|
143
|
+
get isEmpty(): boolean;
|
|
144
|
+
abstract toCode(cg: CodeGenerator): void;
|
|
145
|
+
toString(): string;
|
|
146
|
+
toSingleLineString(): string;
|
|
147
|
+
switch(i: number): Phrase;
|
|
148
|
+
}
|
|
149
|
+
export declare class Action extends Phrase {
|
|
150
|
+
kind: string;
|
|
151
|
+
toCode(cg: CodeGenerator): void;
|
|
152
|
+
}
|
|
153
|
+
export declare class Response extends Phrase {
|
|
154
|
+
saveToVariable?: SaveToVariable | undefined;
|
|
155
|
+
kind: string;
|
|
156
|
+
constructor(parts: Part[], saveToVariable?: SaveToVariable | undefined);
|
|
157
|
+
get isEmpty(): boolean;
|
|
158
|
+
toString(): string;
|
|
159
|
+
toSingleLineString(): string;
|
|
160
|
+
toCode(cg: CodeGenerator): void;
|
|
161
|
+
}
|
|
162
|
+
export declare class ErrorResponse extends Response {
|
|
163
|
+
message: StringLiteral | undefined;
|
|
164
|
+
constructor(message: StringLiteral | undefined);
|
|
165
|
+
toCode(cg: CodeGenerator): void;
|
|
166
|
+
}
|
|
167
|
+
export declare class SetVariable extends Action {
|
|
168
|
+
variableName: string;
|
|
169
|
+
value: Arg;
|
|
170
|
+
constructor(variableName: string, value: Arg);
|
|
171
|
+
toCode(cg: CodeGenerator): void;
|
|
172
|
+
}
|
|
173
|
+
export declare class SaveToVariable extends Part {
|
|
174
|
+
variableName: string;
|
|
175
|
+
constructor(variableName: string);
|
|
176
|
+
toCode(cg: CodeGenerator): void;
|
|
177
|
+
toString(): string;
|
|
178
|
+
get words(): string[];
|
|
179
|
+
}
|
|
180
|
+
export declare class Precondition extends Branch {
|
|
181
|
+
state: State;
|
|
182
|
+
constructor(state?: string);
|
|
183
|
+
get isEmpty(): boolean;
|
|
184
|
+
}
|
|
185
|
+
export declare function makeTests(root: Branch): Test[];
|
|
186
|
+
export declare class Test {
|
|
187
|
+
branches: Branch[];
|
|
188
|
+
testNumber?: string;
|
|
189
|
+
labels: string[];
|
|
190
|
+
constructor(branches: Branch[]);
|
|
191
|
+
get steps(): Step[];
|
|
192
|
+
get last(): Step;
|
|
193
|
+
get name(): string;
|
|
194
|
+
toCode(cg: CodeGenerator): void;
|
|
195
|
+
toString(): string;
|
|
196
|
+
switch(j: number): Test;
|
|
197
|
+
}
|
|
198
|
+
export declare function makeGroups(tests: Test[]): (Test | TestGroup)[];
|
|
199
|
+
export declare class TestGroup {
|
|
200
|
+
name: string;
|
|
201
|
+
items: (Test | TestGroup)[];
|
|
202
|
+
constructor(name: string, items: (Test | TestGroup)[]);
|
|
203
|
+
toString(): string;
|
|
204
|
+
toCode(cg: CodeGenerator): void;
|
|
205
|
+
}
|
package/package.json
CHANGED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Token, Lexer, TokenPosition } from 'typescript-parsec';
|
|
2
|
+
export { T } from './lexer_rules.js';
|
|
3
|
+
declare class TokenImpl<T> implements Token<T> {
|
|
4
|
+
private readonly lexer;
|
|
5
|
+
private readonly input;
|
|
6
|
+
kind: T;
|
|
7
|
+
text: string;
|
|
8
|
+
pos: TokenPosition;
|
|
9
|
+
keep: boolean;
|
|
10
|
+
private nextToken;
|
|
11
|
+
constructor(lexer: LexerImpl<T>, input: string, kind: T, text: string, pos: TokenPosition, keep: boolean);
|
|
12
|
+
get next(): Token<T> | undefined;
|
|
13
|
+
}
|
|
14
|
+
declare class LexerImpl<T> implements Lexer<T> {
|
|
15
|
+
rules: [boolean, RegExp, T][];
|
|
16
|
+
constructor(rules: [boolean, RegExp, T][]);
|
|
17
|
+
parse(input: string): TokenImpl<T> | undefined;
|
|
18
|
+
parseNext(input: string, indexStart: number, rowBegin: number, columnBegin: number): TokenImpl<T> | undefined;
|
|
19
|
+
parseNextAvailable(input: string, index: number, rowBegin: number, columnBegin: number): TokenImpl<T> | undefined;
|
|
20
|
+
}
|
|
21
|
+
export declare const lexer: LexerImpl<import("./lexer_rules.js").T>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export declare enum T {
|
|
2
|
+
Newline = "newline",
|
|
3
|
+
Comment = "comment",
|
|
4
|
+
/** the => */
|
|
5
|
+
ResponseArrow = "=>",
|
|
6
|
+
ErrorMark = "!!",
|
|
7
|
+
Words = "words",
|
|
8
|
+
Minus = "-",
|
|
9
|
+
Plus = "+",
|
|
10
|
+
Colon = ":",
|
|
11
|
+
Space = "space",
|
|
12
|
+
OpeningBracket = "[",
|
|
13
|
+
ClosingBracket = "]",
|
|
14
|
+
OpeningBrace = "{",
|
|
15
|
+
ClosingBrace = "}",
|
|
16
|
+
And = "&",
|
|
17
|
+
Slash = "/",
|
|
18
|
+
Semicolon = ";",
|
|
19
|
+
DoubleQuoteString = "double-quote string",
|
|
20
|
+
UnclosedDoubleQuoteString = "unclosed double-quote string",
|
|
21
|
+
BacktickString = "backtick string",
|
|
22
|
+
UnclosedBacktickString = "unclosed backtick string",
|
|
23
|
+
InvalidEmptyBacktickString = "invalid empty backtick string",
|
|
24
|
+
InvalidWhitespace = "invalid whitespace",
|
|
25
|
+
InvalidTab = "invalid tab",
|
|
26
|
+
MultilineString = "multiline string",
|
|
27
|
+
InvalidMultilineStringMark = "invalid multiline string mark",
|
|
28
|
+
Variable = "variable",
|
|
29
|
+
InvalidEmptyVariable = "invalid empty variable",
|
|
30
|
+
UnclosedVariable = "unclosed variable"
|
|
31
|
+
}
|
|
32
|
+
declare const rules: [boolean, RegExp, T][];
|
|
33
|
+
export default rules;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Parser, ParserOutput, Token } from 'typescript-parsec';
|
|
2
|
+
import { T } from './lexer.ts';
|
|
3
|
+
import { Action, Response, CodeLiteral, StringLiteral, Section, Step, Docstring, Word, Label, ErrorResponse, SetVariable, Switch } from '../model/model.ts';
|
|
4
|
+
export declare function parse(input: string): Section;
|
|
5
|
+
export declare function parse<T>(input: string, production: Parser<any, T>): T;
|
|
6
|
+
export declare const NEWLINES: Parser<T, Token<T>[]>, WORDS: Parser<T, Word>, DOUBLE_QUOTE_STRING: Parser<T, StringLiteral>, BACKTICK_STRING: Parser<T, CodeLiteral>, DOCSTRING: Parser<T, Docstring>, ERROR_MARK: Parser<T, Token<T>>, VARIABLE: Parser<T, string>, SIMPLE_PART: Parser<T, Word | StringLiteral | Docstring | CodeLiteral>, SWITCH: Parser<T, Switch>, BRACES: Parser<T, Switch>, PART: Parser<T, Word | Switch | StringLiteral | Docstring | CodeLiteral>, PHRASE: Parser<T, (Word | Switch | StringLiteral | Docstring | CodeLiteral)[]>, ARG: Parser<T, StringLiteral | Docstring | CodeLiteral>, SET_VARIABLE: Parser<T, SetVariable>, ACTION: Parser<T, Action | SetVariable>, RESPONSE: Parser<T, Response>, ERROR_RESPONSE: Parser<T, ErrorResponse>, SAVE_TO_VARIABLE: Parser<T, Response>, ARROW: Parser<T, Token<T>>, RESPONSE_ITEM: Parser<T, Response | ErrorResponse>, STEP: Parser<T, Step>, LABEL: Parser<T, Label>, SECTION: Parser<T, Section>, BRANCH: Parser<T, Section | Step>, // section first, to make sure there is no colon after step
|
|
7
|
+
DENTS: Parser<T, {
|
|
8
|
+
dent: number;
|
|
9
|
+
isFork: boolean;
|
|
10
|
+
}>, NODE: Parser<T, {
|
|
11
|
+
dent: number;
|
|
12
|
+
branch: Section | Step;
|
|
13
|
+
}>, ANYTHING_BUT_NEWLINE: {
|
|
14
|
+
parse(token: Token<T> | undefined): ParserOutput<T, Token<T>>;
|
|
15
|
+
}, TEXT: Parser<T, undefined>, LINE: Parser<T, {
|
|
16
|
+
dent: number;
|
|
17
|
+
branch: Section | Step;
|
|
18
|
+
} | undefined>, TEST_DESIGN: Parser<T, Section>;
|
package/util/indent.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const Indent: (n: number) => (lines: Iterable<string>) => Generator<string, void, unknown>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function flatMap<T, R>(iterable: Iterable<T>, callback: (value: T) => Iterable<R>): Generator<R, void, undefined>;
|
package/util/xmur3.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function xmur3(str: string): () => number;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Plugin } from 'vite';
|
|
2
|
+
export interface HarmonyPluginOptions {
|
|
3
|
+
watchDir: string;
|
|
4
|
+
}
|
|
5
|
+
export default function harmonyPlugin({ watchDir, }: HarmonyPluginOptions): Plugin;
|
|
6
|
+
declare module 'vitest' {
|
|
7
|
+
interface TaskMeta {
|
|
8
|
+
phrases?: string[];
|
|
9
|
+
}
|
|
10
|
+
}
|
package/test.d.ts
DELETED