yuku-ast 0.1.2 → 0.1.3

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/README.md CHANGED
@@ -6,6 +6,7 @@ node builders, type guards, a walker, and identifier validators. No runtime depe
6
6
  | Import | Provides |
7
7
  | --------------------- | ------------------------------------------------------------ |
8
8
  | `yuku-ast` | `walk`, `walkAsync`, `b` (node builders), `is` (type guards) |
9
+ | `yuku-ast/utils` | node utilities such as `nameOf` |
9
10
  | `yuku-ast/identifier` | identifier and reserved-word validators |
10
11
 
11
12
  ```ts
@@ -114,6 +115,9 @@ is.StringLiteral(node); // Literal variants
114
115
  is.StaticMemberExpression(node); // MemberExpression variants
115
116
  is.BindingIdentifier(node); // Identifier roles, via `kind`
116
117
 
118
+ is.Identifier(node, "this"); // an Identifier with that exact name
119
+ is.oneOf(node, ["CallExpression", "NewExpression"]); // any of these types
120
+
117
121
  walk(program, {
118
122
  Literal(node, path) {
119
123
  if (is.ArrayExpression(path.parent)) {
@@ -123,6 +127,32 @@ walk(program, {
123
127
  });
124
128
  ```
125
129
 
130
+ `is.oneOf(node, types)` narrows to the union of the listed types, and
131
+ `is.Identifier(node, name?)` narrows to `Identifier`. Both accept `null` or
132
+ `undefined`.
133
+
134
+ ## Reading names (`nameOf`)
135
+
136
+ `nameOf(node)` returns the static name a node denotes, an `Identifier`'s `name`
137
+ or a string `Literal`'s `value`, and `null` for anything else (including `null`
138
+ or `undefined`). It reads the common `Identifier | StringLiteral` slots, such as
139
+ a `ModuleExportName` or a static property or member key, in one call.
140
+
141
+ ```ts
142
+ import { walk } from "yuku-ast";
143
+ import { nameOf } from "yuku-ast/utils";
144
+
145
+ walk(program, {
146
+ ExportSpecifier(node) {
147
+ // `export { x as y }` and `export { x as "z" }` both resolve.
148
+ nameOf(node.exported); // "y", "z"
149
+ },
150
+ Property(node) {
151
+ if (!node.computed) nameOf(node.key); // static key name, else null
152
+ },
153
+ });
154
+ ```
155
+
126
156
  ## Builders (`b`)
127
157
 
128
158
  A builder for every node type. Required fields are positional, the rest go in a
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as t from "yuku-parser";
2
- import { BigIntLiteral, BindingIdentifier, BooleanLiteral, ComputedMemberExpression, Directive, IdentifierName, IdentifierReference, LabelIdentifier, Node, NullLiteral, NumericLiteral, PrivateFieldExpression, RegExpLiteral, StaticMemberExpression, StringLiteral } from "yuku-parser";
2
+ import { BigIntLiteral, BindingIdentifier, BooleanLiteral, ComputedMemberExpression, Directive, Identifier, IdentifierName, IdentifierReference, LabelIdentifier, Node, NullLiteral, NumericLiteral, PrivateFieldExpression, RegExpLiteral, StaticMemberExpression, StringLiteral } from "yuku-parser";
3
3
 
4
4
  //#region src/types.d.ts
5
5
  /** Discriminant `type` string of every AST node. */
@@ -95,6 +95,8 @@ type AliasMap = { [K in AliasName]: NodeOfType<(typeof ALIAS_GROUPS)[K][number]>
95
95
  //#region src/predicates.d.ts
96
96
  type MaybeNode = Node | null | undefined;
97
97
  declare const is: {
98
+ /** True when `node`'s `type` is one of `types`, narrowing to that union. */oneOf: <const K extends NodeType>(node: MaybeNode, types: readonly K[]) => node is NodeOfType<K>; /** An `Identifier`, optionally with the exact `name` (e.g. `is.Identifier(node, "this")`). */
99
+ Identifier: (node: MaybeNode, name?: string) => node is Identifier;
98
100
  Expression: (node: MaybeNode) => node is NodeOfType<"Identifier" | "Literal" | "ThisExpression" | "Super" | "ArrayExpression" | "ObjectExpression" | "FunctionExpression" | "ArrowFunctionExpression" | "ClassExpression" | "TaggedTemplateExpression" | "TemplateLiteral" | "MemberExpression" | "CallExpression" | "NewExpression" | "ChainExpression" | "SequenceExpression" | "ParenthesizedExpression" | "BinaryExpression" | "LogicalExpression" | "ConditionalExpression" | "UnaryExpression" | "UpdateExpression" | "AssignmentExpression" | "YieldExpression" | "AwaitExpression" | "ImportExpression" | "MetaProperty" | "TSAsExpression" | "TSSatisfiesExpression" | "TSTypeAssertion" | "TSNonNullExpression" | "TSInstantiationExpression" | "JSXElement" | "JSXFragment">;
99
101
  Statement: (node: MaybeNode) => node is AliasMap["Statement"];
100
102
  Declaration: (node: MaybeNode) => node is AliasMap["Declaration"];
@@ -120,37 +122,11 @@ declare const is: {
120
122
  StaticMemberExpression: (node: MaybeNode) => node is StaticMemberExpression;
121
123
  PrivateFieldExpression: (node: MaybeNode) => node is PrivateFieldExpression;
122
124
  Directive: (node: MaybeNode) => node is Directive;
123
- Program: (node: MaybeNode) => node is import("yuku-parser").Program;
124
- Hashbang: (node: MaybeNode) => node is import("yuku-parser").Hashbang;
125
- ExpressionStatement: (node: MaybeNode) => node is NodeOfType<"ExpressionStatement">;
126
- BlockStatement: (node: MaybeNode) => node is import("yuku-parser").BlockStatement;
127
- EmptyStatement: (node: MaybeNode) => node is import("yuku-parser").EmptyStatement;
128
- DebuggerStatement: (node: MaybeNode) => node is import("yuku-parser").DebuggerStatement;
129
- ReturnStatement: (node: MaybeNode) => node is import("yuku-parser").ReturnStatement;
130
- LabeledStatement: (node: MaybeNode) => node is import("yuku-parser").LabeledStatement;
131
- BreakStatement: (node: MaybeNode) => node is import("yuku-parser").BreakStatement;
132
- ContinueStatement: (node: MaybeNode) => node is import("yuku-parser").ContinueStatement;
133
- IfStatement: (node: MaybeNode) => node is import("yuku-parser").IfStatement;
134
- SwitchStatement: (node: MaybeNode) => node is import("yuku-parser").SwitchStatement;
135
- ThrowStatement: (node: MaybeNode) => node is import("yuku-parser").ThrowStatement;
136
- TryStatement: (node: MaybeNode) => node is import("yuku-parser").TryStatement;
137
- WhileStatement: (node: MaybeNode) => node is import("yuku-parser").WhileStatement;
138
- DoWhileStatement: (node: MaybeNode) => node is import("yuku-parser").DoWhileStatement;
139
- ForStatement: (node: MaybeNode) => node is import("yuku-parser").ForStatement;
140
- ForInStatement: (node: MaybeNode) => node is import("yuku-parser").ForInStatement;
141
- ForOfStatement: (node: MaybeNode) => node is import("yuku-parser").ForOfStatement;
142
- WithStatement: (node: MaybeNode) => node is import("yuku-parser").WithStatement;
143
- FunctionDeclaration: (node: MaybeNode) => node is import("yuku-parser").FunctionDeclaration;
144
- ClassDeclaration: (node: MaybeNode) => node is import("yuku-parser").ClassDeclaration;
145
- VariableDeclaration: (node: MaybeNode) => node is import("yuku-parser").VariableDeclaration;
146
- TSDeclareFunction: (node: MaybeNode) => node is import("yuku-parser").TSDeclareFunction;
147
- TSTypeAliasDeclaration: (node: MaybeNode) => node is import("yuku-parser").TSTypeAliasDeclaration;
148
- TSInterfaceDeclaration: (node: MaybeNode) => node is import("yuku-parser").TSInterfaceDeclaration;
149
- TSEnumDeclaration: (node: MaybeNode) => node is import("yuku-parser").TSEnumDeclaration;
150
- TSModuleDeclaration: (node: MaybeNode) => node is import("yuku-parser").TSModuleDeclaration;
151
- TSImportEqualsDeclaration: (node: MaybeNode) => node is import("yuku-parser").TSImportEqualsDeclaration;
152
- Identifier: (node: MaybeNode) => node is import("yuku-parser").Identifier;
125
+ TSTypeAnnotation: (node: MaybeNode) => node is import("yuku-parser").TSTypeAnnotation;
126
+ Decorator: (node: MaybeNode) => node is import("yuku-parser").Decorator;
127
+ PrivateIdentifier: (node: MaybeNode) => node is import("yuku-parser").PrivateIdentifier;
153
128
  Literal: (node: MaybeNode) => node is NodeOfType<"Literal">;
129
+ TemplateElement: (node: MaybeNode) => node is import("yuku-parser").TemplateElement;
154
130
  ThisExpression: (node: MaybeNode) => node is import("yuku-parser").ThisExpression;
155
131
  Super: (node: MaybeNode) => node is import("yuku-parser").Super;
156
132
  ArrayExpression: (node: MaybeNode) => node is import("yuku-parser").ArrayExpression;
@@ -183,24 +159,19 @@ declare const is: {
183
159
  TSInstantiationExpression: (node: MaybeNode) => node is import("yuku-parser").TSInstantiationExpression;
184
160
  JSXElement: (node: MaybeNode) => node is import("yuku-parser").JSXElement;
185
161
  JSXFragment: (node: MaybeNode) => node is import("yuku-parser").JSXFragment;
186
- ImportDeclaration: (node: MaybeNode) => node is import("yuku-parser").ImportDeclaration;
187
- ExportNamedDeclaration: (node: MaybeNode) => node is import("yuku-parser").ExportNamedDeclaration;
188
- ExportDefaultDeclaration: (node: MaybeNode) => node is import("yuku-parser").ExportDefaultDeclaration;
189
- ExportAllDeclaration: (node: MaybeNode) => node is import("yuku-parser").ExportAllDeclaration;
190
- TSExportAssignment: (node: MaybeNode) => node is import("yuku-parser").TSExportAssignment;
191
- TSNamespaceExportDeclaration: (node: MaybeNode) => node is import("yuku-parser").TSNamespaceExportDeclaration;
192
- Property: (node: MaybeNode) => node is NodeOfType<"Property">;
193
- SpreadElement: (node: MaybeNode) => node is import("yuku-parser").SpreadElement;
194
- PrivateIdentifier: (node: MaybeNode) => node is import("yuku-parser").PrivateIdentifier;
195
- TemplateElement: (node: MaybeNode) => node is import("yuku-parser").TemplateElement;
196
- VariableDeclarator: (node: MaybeNode) => node is import("yuku-parser").VariableDeclarator;
197
- CatchClause: (node: MaybeNode) => node is import("yuku-parser").CatchClause;
198
- SwitchCase: (node: MaybeNode) => node is import("yuku-parser").SwitchCase;
199
- RestElement: (node: MaybeNode) => node is import("yuku-parser").RestElement;
200
162
  ArrayPattern: (node: MaybeNode) => node is import("yuku-parser").ArrayPattern;
201
163
  ObjectPattern: (node: MaybeNode) => node is import("yuku-parser").ObjectPattern;
202
164
  AssignmentPattern: (node: MaybeNode) => node is import("yuku-parser").AssignmentPattern;
165
+ RestElement: (node: MaybeNode) => node is import("yuku-parser").RestElement;
166
+ Property: (node: MaybeNode) => node is NodeOfType<"Property">;
167
+ SpreadElement: (node: MaybeNode) => node is import("yuku-parser").SpreadElement;
168
+ TSTypeParameterInstantiation: (node: MaybeNode) => node is import("yuku-parser").TSTypeParameterInstantiation;
169
+ TSParameterProperty: (node: MaybeNode) => node is import("yuku-parser").TSParameterProperty;
170
+ BlockStatement: (node: MaybeNode) => node is import("yuku-parser").BlockStatement;
171
+ TSTypeParameterDeclaration: (node: MaybeNode) => node is import("yuku-parser").TSTypeParameterDeclaration;
172
+ FunctionDeclaration: (node: MaybeNode) => node is import("yuku-parser").FunctionDeclaration;
203
173
  ClassBody: (node: MaybeNode) => node is import("yuku-parser").ClassBody;
174
+ ClassDeclaration: (node: MaybeNode) => node is import("yuku-parser").ClassDeclaration;
204
175
  MethodDefinition: (node: MaybeNode) => node is import("yuku-parser").MethodDefinition;
205
176
  TSAbstractMethodDefinition: (node: MaybeNode) => node is import("yuku-parser").TSAbstractMethodDefinition;
206
177
  PropertyDefinition: (node: MaybeNode) => node is import("yuku-parser").PropertyDefinition;
@@ -208,27 +179,57 @@ declare const is: {
208
179
  AccessorProperty: (node: MaybeNode) => node is import("yuku-parser").AccessorProperty;
209
180
  TSAbstractAccessorProperty: (node: MaybeNode) => node is import("yuku-parser").TSAbstractAccessorProperty;
210
181
  StaticBlock: (node: MaybeNode) => node is import("yuku-parser").StaticBlock;
211
- Decorator: (node: MaybeNode) => node is import("yuku-parser").Decorator;
182
+ TSIndexSignature: (node: MaybeNode) => node is import("yuku-parser").TSIndexSignature;
212
183
  TSEmptyBodyFunctionExpression: (node: MaybeNode) => node is import("yuku-parser").TSEmptyBodyFunctionExpression;
184
+ ExpressionStatement: (node: MaybeNode) => node is NodeOfType<"ExpressionStatement">;
185
+ EmptyStatement: (node: MaybeNode) => node is import("yuku-parser").EmptyStatement;
186
+ DebuggerStatement: (node: MaybeNode) => node is import("yuku-parser").DebuggerStatement;
187
+ ReturnStatement: (node: MaybeNode) => node is import("yuku-parser").ReturnStatement;
188
+ LabeledStatement: (node: MaybeNode) => node is import("yuku-parser").LabeledStatement;
189
+ BreakStatement: (node: MaybeNode) => node is import("yuku-parser").BreakStatement;
190
+ ContinueStatement: (node: MaybeNode) => node is import("yuku-parser").ContinueStatement;
191
+ IfStatement: (node: MaybeNode) => node is import("yuku-parser").IfStatement;
192
+ SwitchStatement: (node: MaybeNode) => node is import("yuku-parser").SwitchStatement;
193
+ ThrowStatement: (node: MaybeNode) => node is import("yuku-parser").ThrowStatement;
194
+ TryStatement: (node: MaybeNode) => node is import("yuku-parser").TryStatement;
195
+ WhileStatement: (node: MaybeNode) => node is import("yuku-parser").WhileStatement;
196
+ DoWhileStatement: (node: MaybeNode) => node is import("yuku-parser").DoWhileStatement;
197
+ ForStatement: (node: MaybeNode) => node is import("yuku-parser").ForStatement;
198
+ ForInStatement: (node: MaybeNode) => node is import("yuku-parser").ForInStatement;
199
+ ForOfStatement: (node: MaybeNode) => node is import("yuku-parser").ForOfStatement;
200
+ WithStatement: (node: MaybeNode) => node is import("yuku-parser").WithStatement;
201
+ VariableDeclaration: (node: MaybeNode) => node is import("yuku-parser").VariableDeclaration;
202
+ TSDeclareFunction: (node: MaybeNode) => node is import("yuku-parser").TSDeclareFunction;
203
+ TSTypeAliasDeclaration: (node: MaybeNode) => node is import("yuku-parser").TSTypeAliasDeclaration;
204
+ TSInterfaceDeclaration: (node: MaybeNode) => node is import("yuku-parser").TSInterfaceDeclaration;
205
+ TSEnumDeclaration: (node: MaybeNode) => node is import("yuku-parser").TSEnumDeclaration;
206
+ TSModuleDeclaration: (node: MaybeNode) => node is import("yuku-parser").TSModuleDeclaration;
207
+ TSImportEqualsDeclaration: (node: MaybeNode) => node is import("yuku-parser").TSImportEqualsDeclaration;
208
+ SwitchCase: (node: MaybeNode) => node is import("yuku-parser").SwitchCase;
209
+ CatchClause: (node: MaybeNode) => node is import("yuku-parser").CatchClause;
210
+ VariableDeclarator: (node: MaybeNode) => node is import("yuku-parser").VariableDeclarator;
213
211
  ImportSpecifier: (node: MaybeNode) => node is import("yuku-parser").ImportSpecifier;
214
212
  ImportDefaultSpecifier: (node: MaybeNode) => node is import("yuku-parser").ImportDefaultSpecifier;
215
213
  ImportNamespaceSpecifier: (node: MaybeNode) => node is import("yuku-parser").ImportNamespaceSpecifier;
216
214
  ImportAttribute: (node: MaybeNode) => node is import("yuku-parser").ImportAttribute;
215
+ ImportDeclaration: (node: MaybeNode) => node is import("yuku-parser").ImportDeclaration;
217
216
  ExportSpecifier: (node: MaybeNode) => node is import("yuku-parser").ExportSpecifier;
218
- JSXOpeningElement: (node: MaybeNode) => node is import("yuku-parser").JSXOpeningElement;
219
- JSXClosingElement: (node: MaybeNode) => node is import("yuku-parser").JSXClosingElement;
220
- JSXOpeningFragment: (node: MaybeNode) => node is import("yuku-parser").JSXOpeningFragment;
221
- JSXClosingFragment: (node: MaybeNode) => node is import("yuku-parser").JSXClosingFragment;
217
+ ExportNamedDeclaration: (node: MaybeNode) => node is import("yuku-parser").ExportNamedDeclaration;
218
+ ExportDefaultDeclaration: (node: MaybeNode) => node is import("yuku-parser").ExportDefaultDeclaration;
219
+ ExportAllDeclaration: (node: MaybeNode) => node is import("yuku-parser").ExportAllDeclaration;
222
220
  JSXIdentifier: (node: MaybeNode) => node is import("yuku-parser").JSXIdentifier;
223
221
  JSXNamespacedName: (node: MaybeNode) => node is import("yuku-parser").JSXNamespacedName;
224
222
  JSXMemberExpression: (node: MaybeNode) => node is import("yuku-parser").JSXMemberExpression;
223
+ JSXOpeningElement: (node: MaybeNode) => node is import("yuku-parser").JSXOpeningElement;
224
+ JSXText: (node: MaybeNode) => node is import("yuku-parser").JSXText;
225
+ JSXExpressionContainer: (node: MaybeNode) => node is import("yuku-parser").JSXExpressionContainer;
226
+ JSXSpreadChild: (node: MaybeNode) => node is import("yuku-parser").JSXSpreadChild;
227
+ JSXClosingElement: (node: MaybeNode) => node is import("yuku-parser").JSXClosingElement;
225
228
  JSXAttribute: (node: MaybeNode) => node is import("yuku-parser").JSXAttribute;
226
229
  JSXSpreadAttribute: (node: MaybeNode) => node is import("yuku-parser").JSXSpreadAttribute;
227
- JSXExpressionContainer: (node: MaybeNode) => node is import("yuku-parser").JSXExpressionContainer;
230
+ JSXOpeningFragment: (node: MaybeNode) => node is import("yuku-parser").JSXOpeningFragment;
231
+ JSXClosingFragment: (node: MaybeNode) => node is import("yuku-parser").JSXClosingFragment;
228
232
  JSXEmptyExpression: (node: MaybeNode) => node is import("yuku-parser").JSXEmptyExpression;
229
- JSXText: (node: MaybeNode) => node is import("yuku-parser").JSXText;
230
- JSXSpreadChild: (node: MaybeNode) => node is import("yuku-parser").JSXSpreadChild;
231
- TSTypeAnnotation: (node: MaybeNode) => node is import("yuku-parser").TSTypeAnnotation;
232
233
  TSAnyKeyword: (node: MaybeNode) => node is import("yuku-parser").TSAnyKeyword;
233
234
  TSUnknownKeyword: (node: MaybeNode) => node is import("yuku-parser").TSUnknownKeyword;
234
235
  TSNeverKeyword: (node: MaybeNode) => node is import("yuku-parser").TSNeverKeyword;
@@ -266,25 +267,25 @@ declare const is: {
266
267
  TSTypePredicate: (node: MaybeNode) => node is import("yuku-parser").TSTypePredicate;
267
268
  TSTypeLiteral: (node: MaybeNode) => node is import("yuku-parser").TSTypeLiteral;
268
269
  TSMappedType: (node: MaybeNode) => node is import("yuku-parser").TSMappedType;
269
- TSTypeParameter: (node: MaybeNode) => node is import("yuku-parser").TSTypeParameter;
270
- TSTypeParameterDeclaration: (node: MaybeNode) => node is import("yuku-parser").TSTypeParameterDeclaration;
271
- TSTypeParameterInstantiation: (node: MaybeNode) => node is import("yuku-parser").TSTypeParameterInstantiation;
272
270
  TSQualifiedName: (node: MaybeNode) => node is import("yuku-parser").TSQualifiedName;
271
+ TSTypeParameter: (node: MaybeNode) => node is import("yuku-parser").TSTypeParameter;
272
+ TSOptionalType: (node: MaybeNode) => node is import("yuku-parser").TSOptionalType;
273
+ TSRestType: (node: MaybeNode) => node is import("yuku-parser").TSRestType;
273
274
  TSPropertySignature: (node: MaybeNode) => node is import("yuku-parser").TSPropertySignature;
274
275
  TSMethodSignature: (node: MaybeNode) => node is import("yuku-parser").TSMethodSignature;
275
276
  TSCallSignatureDeclaration: (node: MaybeNode) => node is import("yuku-parser").TSCallSignatureDeclaration;
276
277
  TSConstructSignatureDeclaration: (node: MaybeNode) => node is import("yuku-parser").TSConstructSignatureDeclaration;
277
- TSIndexSignature: (node: MaybeNode) => node is import("yuku-parser").TSIndexSignature;
278
278
  TSInterfaceBody: (node: MaybeNode) => node is import("yuku-parser").TSInterfaceBody;
279
279
  TSInterfaceHeritage: (node: MaybeNode) => node is import("yuku-parser").TSInterfaceHeritage;
280
280
  TSClassImplements: (node: MaybeNode) => node is import("yuku-parser").TSClassImplements;
281
281
  TSEnumBody: (node: MaybeNode) => node is import("yuku-parser").TSEnumBody;
282
282
  TSEnumMember: (node: MaybeNode) => node is import("yuku-parser").TSEnumMember;
283
283
  TSModuleBlock: (node: MaybeNode) => node is import("yuku-parser").TSModuleBlock;
284
- TSParameterProperty: (node: MaybeNode) => node is import("yuku-parser").TSParameterProperty;
284
+ TSExportAssignment: (node: MaybeNode) => node is import("yuku-parser").TSExportAssignment;
285
+ TSNamespaceExportDeclaration: (node: MaybeNode) => node is import("yuku-parser").TSNamespaceExportDeclaration;
285
286
  TSExternalModuleReference: (node: MaybeNode) => node is import("yuku-parser").TSExternalModuleReference;
286
- TSOptionalType: (node: MaybeNode) => node is import("yuku-parser").TSOptionalType;
287
- TSRestType: (node: MaybeNode) => node is import("yuku-parser").TSRestType;
287
+ Hashbang: (node: MaybeNode) => node is import("yuku-parser").Hashbang;
288
+ Program: (node: MaybeNode) => node is import("yuku-parser").Program;
288
289
  };
289
290
  //#endregion
290
291
  //#region src/builders.d.ts
package/dist/index.mjs CHANGED
@@ -548,6 +548,10 @@ function aliasGuard(name) {
548
548
  }
549
549
  const is = {
550
550
  ...Object.fromEntries(Object.keys(VISITOR_KEYS).map((type) => [type, (node) => node != null && node.type === type])),
551
+ /** True when `node`'s `type` is one of `types`, narrowing to that union. */
552
+ oneOf: (node, types) => node != null && types.includes(node.type),
553
+ /** An `Identifier`, optionally with the exact `name` (e.g. `is.Identifier(node, "this")`). */
554
+ Identifier: (node, name) => node?.type === "Identifier" && (name === void 0 || node.name === name),
551
555
  Expression: aliasGuard("Expression"),
552
556
  Statement: aliasGuard("Statement"),
553
557
  Declaration: aliasGuard("Declaration"),
@@ -0,0 +1,18 @@
1
+ import { Node } from "yuku-parser";
2
+
3
+ //#region src/utils/index.d.ts
4
+ type MaybeNode = Node | null | undefined;
5
+ /**
6
+ * The static name a node denotes: an `Identifier`'s `name`, or a string
7
+ * `Literal`'s `value`. Returns `null` for anything else, and for `null` or
8
+ * `undefined`, so the common `Identifier | StringLiteral` name slots (a
9
+ * `ModuleExportName`, or a static property or member key) read in one call.
10
+ *
11
+ * @example
12
+ * nameOf(b.identifier("x")) // "x"
13
+ * nameOf(b.stringLiteral("y")) // "y"
14
+ * nameOf(b.numericLiteral(1)) // null
15
+ */
16
+ declare function nameOf(node: MaybeNode): string | null;
17
+ //#endregion
18
+ export { nameOf };
package/dist/utils.mjs ADDED
@@ -0,0 +1,20 @@
1
+ //#region src/utils/index.ts
2
+ /**
3
+ * The static name a node denotes: an `Identifier`'s `name`, or a string
4
+ * `Literal`'s `value`. Returns `null` for anything else, and for `null` or
5
+ * `undefined`, so the common `Identifier | StringLiteral` name slots (a
6
+ * `ModuleExportName`, or a static property or member key) read in one call.
7
+ *
8
+ * @example
9
+ * nameOf(b.identifier("x")) // "x"
10
+ * nameOf(b.stringLiteral("y")) // "y"
11
+ * nameOf(b.numericLiteral(1)) // null
12
+ */
13
+ function nameOf(node) {
14
+ if (node == null) return null;
15
+ if (node.type === "Identifier") return node.name;
16
+ if (node.type === "Literal" && typeof node.value === "string") return node.value;
17
+ return null;
18
+ }
19
+ //#endregion
20
+ export { nameOf };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yuku-ast",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "A fast, typed AST toolkit for yuku-parser's ESTree / TypeScript-ESTree AST: node builders, type guards, a walker, and identifier validators.",
5
5
  "keywords": [
6
6
  "ast",
@@ -30,6 +30,7 @@
30
30
  "exports": {
31
31
  ".": "./dist/index.mjs",
32
32
  "./identifier": "./dist/identifier.mjs",
33
+ "./utils": "./dist/utils.mjs",
33
34
  "./package.json": "./package.json"
34
35
  },
35
36
  "scripts": {