-
Notifications
You must be signed in to change notification settings - Fork 39
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(helpers): handle Vite config objects declared as variables in `a…
…ddVitePlugin` (#69)
- Loading branch information
Showing
3 changed files
with
190 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,69 @@ | ||
import type { ProxifiedModule } from "../types"; | ||
import { Program, VariableDeclarator } from "@babel/types"; | ||
import { generateCode, parseExpression } from "../code"; | ||
import { MagicastError } from "../error"; | ||
import type { Proxified, ProxifiedModule, ProxifiedObject } from "../types"; | ||
|
||
export function getDefaultExportOptions(magicast: ProxifiedModule<any>) { | ||
return magicast.exports.default.$type === "function-call" | ||
? magicast.exports.default.$args[0] | ||
: magicast.exports.default; | ||
return configFromNode(magicast.exports.default); | ||
} | ||
|
||
/** | ||
* Returns the vite config object from a variable declaration thats | ||
* exported as the default export. | ||
* | ||
* Example: | ||
* | ||
* ```js | ||
* const config = {}; | ||
* export default config; | ||
* ``` | ||
* | ||
* @param magicast the module | ||
* | ||
* @returns an object containing the proxified config object and the | ||
* declaration "parent" to attach the modified config to later. | ||
* If no config declaration is found, undefined is returned. | ||
*/ | ||
export function getConfigFromVariableDeclaration( | ||
magicast: ProxifiedModule<any> | ||
): { | ||
declaration: VariableDeclarator; | ||
config: ProxifiedObject<any> | undefined; | ||
} { | ||
if (magicast.exports.default.$type !== "identifier") { | ||
throw new MagicastError( | ||
`Not supported: Cannot modify this kind of default export (${magicast.exports.default.$type})` | ||
); | ||
} | ||
|
||
const configDecalarationId = magicast.exports.default.$name; | ||
|
||
for (const node of (magicast.$ast as Program).body) { | ||
if (node.type === "VariableDeclaration") { | ||
for (const declaration of node.declarations) { | ||
if ( | ||
declaration.id.type === "Identifier" && | ||
declaration.id.name === configDecalarationId && | ||
declaration.init | ||
) { | ||
const init = declaration.init; | ||
|
||
const configExpression = parseExpression(generateCode(init).code); | ||
|
||
return { | ||
declaration, | ||
config: configFromNode(configExpression), | ||
}; | ||
} | ||
} | ||
} | ||
} | ||
throw new MagicastError("Couldn't find config declaration"); | ||
} | ||
|
||
function configFromNode(node: Proxified<any>): ProxifiedObject<any> { | ||
if (node.$type === "function-call") { | ||
return node.$args[0]; | ||
} | ||
return node; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters