Skip to content

Commit bcab628

Browse files
Merge pull request #332 from laravel/vite-env
Ability to quickly add `VITE_` env variables from existing
2 parents 2c7777c + e3f45ad commit bcab628

File tree

4 files changed

+113
-1
lines changed

4 files changed

+113
-1
lines changed

package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,11 @@
113113
"default": true,
114114
"description": "Show popups for errors."
115115
},
116+
"Laravel.env.viteQuickFix": {
117+
"type": "boolean",
118+
"default": true,
119+
"description": "Enable quickfix for adding VITE_ variables from regular env variables."
120+
},
116121
"Laravel.eloquent.generateDocBlocks": {
117122
"type": "boolean",
118123
"default": true,

src/extension.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import Registry from "./completion/Registry";
1515
import ValidationCompletion from "./completion/Validation";
1616
import { updateDiagnostics } from "./diagnostic/diagnostic";
1717
import { completionProvider as bladeComponentCompletion } from "./features/bladeComponent";
18+
import { viteEnvCodeActionProvider } from "./features/env";
1819
import { completionProvider as livewireComponentCompletion } from "./features/livewireComponent";
1920
import { hoverProviders } from "./hover/HoverProvider";
2021
import { linkProviders } from "./link/LinkProvider";
@@ -154,6 +155,16 @@ export function activate(context: vscode.ExtensionContext) {
154155
CodeActionProvider.providedCodeActionKinds,
155156
},
156157
),
158+
vscode.languages.registerCodeActionsProvider(
159+
[
160+
{ scheme: "file", language: "plaintext" },
161+
{ scheme: "file", language: "ini" },
162+
],
163+
viteEnvCodeActionProvider,
164+
{
165+
providedCodeActionKinds: [vscode.CodeActionKind.QuickFix],
166+
},
167+
),
157168
vscode.commands.registerCommand("laravel.open", openFileCommand),
158169
);
159170

src/features/env.ts

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,101 @@ export const diagnosticProvider = (
9696
);
9797
};
9898

99+
export const viteEnvCodeActionProvider: vscode.CodeActionProvider = {
100+
async provideCodeActions(document, range, context, token) {
101+
if (
102+
!config("env.viteQuickFix", true) ||
103+
!document.uri.path.includes(".env")
104+
) {
105+
return [];
106+
}
107+
108+
let envVariables = [];
109+
let start = range.start.line;
110+
const vitePrefix = "VITE_";
111+
112+
while (start <= range.end.line) {
113+
const envVariable = document
114+
.lineAt(start)
115+
.text.split("=")[0]
116+
.trim();
117+
118+
if (
119+
envVariable !== "" &&
120+
!envVariable.startsWith("#") &&
121+
!envVariable.startsWith(vitePrefix)
122+
) {
123+
envVariables.push(envVariable);
124+
}
125+
start++;
126+
}
127+
128+
if (envVariables.length === 0) {
129+
return [];
130+
}
131+
132+
const envContents = document.getText();
133+
const lines = envContents.toString().split("\n");
134+
135+
envVariables = envVariables.filter(
136+
(envVariable) =>
137+
!lines.find((line) =>
138+
line.startsWith(vitePrefix + envVariable + "="),
139+
),
140+
);
141+
142+
if (envVariables.length === 0) {
143+
return [];
144+
}
145+
146+
// Default to the end of the file
147+
let lineNumber = lines.length;
148+
let foundGroup = false;
149+
150+
for (let i = 0; i < lines.length; i++) {
151+
if (lines[i].startsWith(vitePrefix)) {
152+
lineNumber = i + 1;
153+
foundGroup = true;
154+
}
155+
}
156+
157+
const finalValue = envVariables
158+
.map(
159+
(envVariable) =>
160+
`${vitePrefix}${envVariable}="\${${envVariable}}"`,
161+
)
162+
.join("\n");
163+
164+
const edit = new vscode.WorkspaceEdit();
165+
166+
const newLine = (() => {
167+
if (lineNumber === lines.length) {
168+
return true;
169+
}
170+
171+
return !foundGroup;
172+
})();
173+
174+
edit.insert(
175+
document.uri,
176+
new vscode.Position(lineNumber, 0),
177+
`${newLine ? "\n" : ""}${finalValue}`,
178+
);
179+
180+
const action = new vscode.CodeAction(
181+
envVariables.length === 1
182+
? `Create Vite env variable from "${envVariables[0]}"`
183+
: `Create Vite env variables from selection`,
184+
vscode.CodeActionKind.QuickFix,
185+
);
186+
187+
action.edit = edit;
188+
action.command = openFile(document.uri, lineNumber, finalValue.length);
189+
190+
return [action];
191+
},
192+
};
193+
99194
export const codeActionProvider: CodeActionProviderFunction = async (
100195
diagnostic: vscode.Diagnostic,
101196
document: vscode.TextDocument,

src/support/config.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ type ConfigKey =
1111
| "tests.suiteSuffix"
1212
| "showErrorPopups"
1313
| "blade.autoSpaceTags"
14-
| "eloquent.generateDocBlocks";
14+
| "eloquent.generateDocBlocks"
15+
| "env.viteQuickFix";
1516

1617
export const config = <T>(key: ConfigKey, fallback: T): T =>
1718
vscode.workspace.getConfiguration("Laravel").get<T>(key, fallback);

0 commit comments

Comments
 (0)