@lovable.dev/mcp-js 0.9.2 → 0.10.0
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.internal.md +15 -8
- package/README.md +50 -1
- package/dist/chunk-4XJ2R3DD.js +6 -0
- package/dist/{chunk-OXSSMKQE.js → chunk-DF3DD3KD.js} +1 -1
- package/dist/{chunk-YQBOGY7D.js → chunk-LAFJDJRY.js} +1 -0
- package/dist/{chunk-2RGXCDBU.js → chunk-PJXKJNSZ.js} +1 -1
- package/dist/{chunk-6N7B7NZY.js → chunk-SZLSAGDF.js} +1 -1
- package/dist/{chunk-4JO3BZQG.js → chunk-X7V2CL7C.js} +1 -1
- package/dist/chunk-XQWJN6DC.js +14 -0
- package/dist/cli/extract-manifest.cjs +1 -1
- package/dist/cli/extract-manifest.js +6 -6
- package/dist/io-D4srzRKc.d.ts +13 -0
- package/dist/protocols/mcp/index.js +2 -2
- package/dist/protocols/oauth-metadata.js +2 -2
- package/dist/protocols/rest/index.js +4 -4
- package/dist/stacks/supabase/index.cjs +939 -0
- package/dist/stacks/supabase/index.d.cts +39 -0
- package/dist/stacks/supabase/index.d.ts +39 -0
- package/dist/stacks/supabase/index.js +84 -0
- package/dist/stacks/supabase/vite.cjs +263 -0
- package/dist/stacks/supabase/vite.d.cts +47 -0
- package/dist/stacks/supabase/vite.d.ts +47 -0
- package/dist/stacks/supabase/vite.js +229 -0
- package/dist/stacks/tanstack/index.js +6 -6
- package/dist/stacks/tanstack/vite.d.cts +2 -13
- package/dist/stacks/tanstack/vite.d.ts +2 -13
- package/dist/stacks/tanstack/vite.js +3 -3
- package/package.json +26 -11
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import {
|
|
2
|
+
version
|
|
3
|
+
} from "../../chunk-4XJ2R3DD.js";
|
|
4
|
+
import {
|
|
5
|
+
isFileMissing
|
|
6
|
+
} from "../../chunk-Y3ZFPEQH.js";
|
|
7
|
+
import {
|
|
8
|
+
FUNCTIONS_MOUNT_PREFIX,
|
|
9
|
+
assertFunctionName
|
|
10
|
+
} from "../../chunk-XQWJN6DC.js";
|
|
11
|
+
|
|
12
|
+
// src/stacks/supabase/vite.ts
|
|
13
|
+
import { resolve as resolve2, sep as sep2 } from "path";
|
|
14
|
+
|
|
15
|
+
// src/stacks/supabase/emit.ts
|
|
16
|
+
import { lstatSync, mkdirSync, readFileSync, readdirSync, unlinkSync, writeFileSync } from "fs";
|
|
17
|
+
import { dirname, join, relative, resolve, sep } from "path";
|
|
18
|
+
var DEFAULT_MCP_ENTRY = "src/lib/mcp/index.ts";
|
|
19
|
+
var DEFAULT_FUNCTIONS_DIR = "supabase/functions";
|
|
20
|
+
var DEFAULT_FUNCTION_NAME = "mcp";
|
|
21
|
+
var GENERATED_BANNER = "// AUTO-GENERATED by @lovable.dev/mcp-js \u2014 do not edit. Regenerated by the Vite plugin.\n// To take ownership, delete this banner line; the plugin then leaves the file alone.";
|
|
22
|
+
var GENERATED_JSON_MARKER_KEY = "_lovableMcpGenerated";
|
|
23
|
+
var GENERATED_JSON_MARKER_VALUE = "AUTO-GENERATED by @lovable.dev/mcp-js \u2014 do not edit. Regenerated by the Vite plugin. To take ownership, remove this key; the plugin then leaves the file alone.";
|
|
24
|
+
function normalizePath(p) {
|
|
25
|
+
return p.split(sep).join("/");
|
|
26
|
+
}
|
|
27
|
+
function fileExists(path) {
|
|
28
|
+
try {
|
|
29
|
+
lstatSync(path);
|
|
30
|
+
return true;
|
|
31
|
+
} catch (err) {
|
|
32
|
+
if (isFileMissing(err))
|
|
33
|
+
return false;
|
|
34
|
+
throw err;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function hasGeneratedBanner(content) {
|
|
38
|
+
return content.replace(/\r\n/g, "\n").startsWith(GENERATED_BANNER);
|
|
39
|
+
}
|
|
40
|
+
function hasGeneratedJsonMarker(content) {
|
|
41
|
+
try {
|
|
42
|
+
const parsed = JSON.parse(content);
|
|
43
|
+
return typeof parsed === "object" && parsed !== null && GENERATED_JSON_MARKER_KEY in parsed;
|
|
44
|
+
} catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function writeIfChanged(file, content, ownershipCheck) {
|
|
49
|
+
let existing;
|
|
50
|
+
try {
|
|
51
|
+
existing = readFileSync(file, "utf8");
|
|
52
|
+
} catch (err) {
|
|
53
|
+
if (!isFileMissing(err))
|
|
54
|
+
throw err;
|
|
55
|
+
}
|
|
56
|
+
if (existing !== void 0) {
|
|
57
|
+
if (!ownershipCheck(existing)) {
|
|
58
|
+
throw new Error(
|
|
59
|
+
`@lovable.dev/mcp-js: refusing to overwrite user-authored file at ${file}. Delete it or move it first.`
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
if (existing === content)
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
mkdirSync(dirname(file), { recursive: true });
|
|
66
|
+
writeFileSync(file, content, "utf8");
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
function relativeTsSpecifier(fromFile, toFile) {
|
|
70
|
+
const rel = normalizePath(relative(dirname(fromFile), toFile));
|
|
71
|
+
return rel.startsWith(".") ? rel : `./${rel}`;
|
|
72
|
+
}
|
|
73
|
+
function buildFunctionEntry(mcpEntryAbs, functionEntryAbs, functionName) {
|
|
74
|
+
const entryImport = relativeTsSpecifier(functionEntryAbs, mcpEntryAbs);
|
|
75
|
+
return `${GENERATED_BANNER}
|
|
76
|
+
// supabase function: ${functionName}
|
|
77
|
+
// emitted to: supabase/functions/${functionName}/index.ts
|
|
78
|
+
|
|
79
|
+
import { createSupabaseHandler } from "npm:@lovable.dev/mcp-js@${version}/stacks/supabase";
|
|
80
|
+
|
|
81
|
+
import mcp from "${entryImport}";
|
|
82
|
+
|
|
83
|
+
Deno.serve(createSupabaseHandler(mcp, { functionName: ${JSON.stringify(functionName)} }));
|
|
84
|
+
`;
|
|
85
|
+
}
|
|
86
|
+
function buildDenoJson() {
|
|
87
|
+
const config = {
|
|
88
|
+
[GENERATED_JSON_MARKER_KEY]: GENERATED_JSON_MARKER_VALUE,
|
|
89
|
+
imports: {
|
|
90
|
+
"@lovable.dev/mcp-js": `npm:@lovable.dev/mcp-js@${version}`
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
return `${JSON.stringify(config, null, 2)}
|
|
94
|
+
`;
|
|
95
|
+
}
|
|
96
|
+
function resolvePaths(options) {
|
|
97
|
+
const projectRoot = resolve(options.projectRoot);
|
|
98
|
+
const mcpEntry = options.mcpEntry ?? DEFAULT_MCP_ENTRY;
|
|
99
|
+
const functionsDir = options.functionsDir ?? DEFAULT_FUNCTIONS_DIR;
|
|
100
|
+
const functionName = options.functionName ?? DEFAULT_FUNCTION_NAME;
|
|
101
|
+
assertFunctionName(functionName);
|
|
102
|
+
const functionDir = resolve(projectRoot, functionsDir, functionName);
|
|
103
|
+
if (functionDir !== projectRoot && !functionDir.startsWith(projectRoot + sep)) {
|
|
104
|
+
throw new Error(
|
|
105
|
+
`@lovable.dev/mcp-js: functionsDir must resolve within the project root, got ${JSON.stringify(functionsDir)}`
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
functionDir,
|
|
110
|
+
functionEntry: join(functionDir, "index.ts"),
|
|
111
|
+
denoJson: join(functionDir, "deno.json"),
|
|
112
|
+
mcpEntryAbs: resolve(projectRoot, mcpEntry)
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function syncSupabaseFunction(options) {
|
|
116
|
+
const paths = resolvePaths(options);
|
|
117
|
+
const functionName = options.functionName ?? DEFAULT_FUNCTION_NAME;
|
|
118
|
+
const written = [];
|
|
119
|
+
const removed = [];
|
|
120
|
+
if (!fileExists(paths.mcpEntryAbs)) {
|
|
121
|
+
cleanupOrphans(paths.functionDir, /* @__PURE__ */ new Set(), removed);
|
|
122
|
+
return { written, removed };
|
|
123
|
+
}
|
|
124
|
+
if (writeIfChanged(
|
|
125
|
+
paths.functionEntry,
|
|
126
|
+
buildFunctionEntry(paths.mcpEntryAbs, paths.functionEntry, functionName),
|
|
127
|
+
hasGeneratedBanner
|
|
128
|
+
)) {
|
|
129
|
+
written.push(paths.functionEntry);
|
|
130
|
+
}
|
|
131
|
+
if (writeIfChanged(paths.denoJson, buildDenoJson(), hasGeneratedJsonMarker)) {
|
|
132
|
+
written.push(paths.denoJson);
|
|
133
|
+
}
|
|
134
|
+
cleanupOrphans(paths.functionDir, /* @__PURE__ */ new Set([paths.functionEntry, paths.denoJson]), removed);
|
|
135
|
+
return { written, removed };
|
|
136
|
+
}
|
|
137
|
+
function cleanupOrphans(functionDir, expected, removed) {
|
|
138
|
+
let entries;
|
|
139
|
+
try {
|
|
140
|
+
entries = readdirSync(functionDir);
|
|
141
|
+
} catch (err) {
|
|
142
|
+
if (isFileMissing(err))
|
|
143
|
+
return;
|
|
144
|
+
throw err;
|
|
145
|
+
}
|
|
146
|
+
for (const entry of entries) {
|
|
147
|
+
const full = join(functionDir, entry);
|
|
148
|
+
if (expected.has(full))
|
|
149
|
+
continue;
|
|
150
|
+
let content;
|
|
151
|
+
try {
|
|
152
|
+
content = readFileSync(full, "utf8");
|
|
153
|
+
} catch (err) {
|
|
154
|
+
if (isFileMissing(err) || err.code === "EISDIR")
|
|
155
|
+
continue;
|
|
156
|
+
throw err;
|
|
157
|
+
}
|
|
158
|
+
if (hasGeneratedBanner(content) || hasGeneratedJsonMarker(content)) {
|
|
159
|
+
try {
|
|
160
|
+
unlinkSync(full);
|
|
161
|
+
removed.push(full);
|
|
162
|
+
} catch (err) {
|
|
163
|
+
if (!isFileMissing(err))
|
|
164
|
+
throw err;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// src/stacks/supabase/vite.ts
|
|
171
|
+
function normalizePath2(p) {
|
|
172
|
+
return p.split(sep2).join("/");
|
|
173
|
+
}
|
|
174
|
+
function mcpPlugin(options = {}) {
|
|
175
|
+
const mcpEntryOption = options.mcpEntry ?? DEFAULT_MCP_ENTRY;
|
|
176
|
+
const functionsDirOption = options.functionsDir ?? DEFAULT_FUNCTIONS_DIR;
|
|
177
|
+
const functionName = options.functionName ?? DEFAULT_FUNCTION_NAME;
|
|
178
|
+
const urlPath = `${FUNCTIONS_MOUNT_PREFIX}${functionName}`;
|
|
179
|
+
let projectRoot = process.cwd();
|
|
180
|
+
let mcpEntryAbs = resolve2(projectRoot, mcpEntryOption);
|
|
181
|
+
const regenerate = () => {
|
|
182
|
+
syncSupabaseFunction({
|
|
183
|
+
projectRoot,
|
|
184
|
+
mcpEntry: mcpEntryOption,
|
|
185
|
+
functionsDir: functionsDirOption,
|
|
186
|
+
functionName
|
|
187
|
+
});
|
|
188
|
+
};
|
|
189
|
+
return {
|
|
190
|
+
name: "@lovable.dev/mcp-js/supabase",
|
|
191
|
+
// The extract CLI reads these back via `resolveConfig().plugins`. Getter
|
|
192
|
+
// for `mcpEntry` because the absolute path is finalized in `configResolved`;
|
|
193
|
+
// `urlPath` is config-time-final so it's a plain field.
|
|
194
|
+
api: {
|
|
195
|
+
get mcpEntry() {
|
|
196
|
+
return mcpEntryAbs;
|
|
197
|
+
},
|
|
198
|
+
urlPath
|
|
199
|
+
},
|
|
200
|
+
configResolved(config) {
|
|
201
|
+
projectRoot = config.root;
|
|
202
|
+
mcpEntryAbs = resolve2(projectRoot, mcpEntryOption);
|
|
203
|
+
regenerate();
|
|
204
|
+
},
|
|
205
|
+
configureServer(server) {
|
|
206
|
+
const onChange = (file) => {
|
|
207
|
+
if (normalizePath2(file) === normalizePath2(mcpEntryAbs)) {
|
|
208
|
+
regenerate();
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
server.watcher.on("add", onChange);
|
|
212
|
+
server.watcher.on("change", onChange);
|
|
213
|
+
server.watcher.on("unlink", onChange);
|
|
214
|
+
server.watcher.once("close", () => {
|
|
215
|
+
server.watcher.off("add", onChange);
|
|
216
|
+
server.watcher.off("change", onChange);
|
|
217
|
+
server.watcher.off("unlink", onChange);
|
|
218
|
+
});
|
|
219
|
+
},
|
|
220
|
+
buildStart() {
|
|
221
|
+
regenerate();
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
var vite_default = mcpPlugin;
|
|
226
|
+
export {
|
|
227
|
+
vite_default as default,
|
|
228
|
+
mcpPlugin
|
|
229
|
+
};
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createMcpProtocolHandler
|
|
3
|
-
} from "../../chunk-
|
|
3
|
+
} from "../../chunk-DF3DD3KD.js";
|
|
4
4
|
import {
|
|
5
5
|
createOAuthProtectedResourceMetadataHandler
|
|
6
|
-
} from "../../chunk-
|
|
6
|
+
} from "../../chunk-X7V2CL7C.js";
|
|
7
7
|
import {
|
|
8
8
|
createInvokeToolHandler
|
|
9
|
-
} from "../../chunk-
|
|
10
|
-
import "../../chunk-MA5H6PSF.js";
|
|
9
|
+
} from "../../chunk-SZLSAGDF.js";
|
|
11
10
|
import {
|
|
12
11
|
createListToolsHandler
|
|
13
|
-
} from "../../chunk-
|
|
14
|
-
import "../../chunk-
|
|
12
|
+
} from "../../chunk-PJXKJNSZ.js";
|
|
13
|
+
import "../../chunk-MA5H6PSF.js";
|
|
14
|
+
import "../../chunk-LAFJDJRY.js";
|
|
15
15
|
import "../../chunk-QC3DXQTH.js";
|
|
16
16
|
import "../../chunk-6DXGZZA4.js";
|
|
17
17
|
|
|
@@ -1,16 +1,5 @@
|
|
|
1
1
|
import { Plugin } from 'vite';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Shape every MCP Vite plugin exposes on its `api` so `runExtract` can read
|
|
5
|
-
* back the resolved entry path and the URL the stack mounts the MCP server at.
|
|
6
|
-
* TanStack sets `urlPath` to the configured route path (default `/mcp`);
|
|
7
|
-
* Supabase sets it to `/functions/v1/<functionName>` (the public mount under
|
|
8
|
-
* which the function and its companion routes live).
|
|
9
|
-
*/
|
|
10
|
-
interface McpPluginApi {
|
|
11
|
-
readonly mcpEntry: string;
|
|
12
|
-
readonly urlPath: string;
|
|
13
|
-
}
|
|
2
|
+
export { M as McpPluginApi } from '../../io-D4srzRKc.js';
|
|
14
3
|
|
|
15
4
|
interface McpPluginOptions {
|
|
16
5
|
/**
|
|
@@ -94,4 +83,4 @@ declare function assertMetadataPathShape(metadataPath: string): void;
|
|
|
94
83
|
*/
|
|
95
84
|
declare function mcpPlugin(options?: McpPluginOptions): Plugin;
|
|
96
85
|
|
|
97
|
-
export { type
|
|
86
|
+
export { type McpPluginOptions, assertMetadataPathShape, assertUrlPathShape, mcpPlugin as default, deriveRouteFileName, mcpPlugin };
|
|
@@ -1,16 +1,5 @@
|
|
|
1
1
|
import { Plugin } from 'vite';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Shape every MCP Vite plugin exposes on its `api` so `runExtract` can read
|
|
5
|
-
* back the resolved entry path and the URL the stack mounts the MCP server at.
|
|
6
|
-
* TanStack sets `urlPath` to the configured route path (default `/mcp`);
|
|
7
|
-
* Supabase sets it to `/functions/v1/<functionName>` (the public mount under
|
|
8
|
-
* which the function and its companion routes live).
|
|
9
|
-
*/
|
|
10
|
-
interface McpPluginApi {
|
|
11
|
-
readonly mcpEntry: string;
|
|
12
|
-
readonly urlPath: string;
|
|
13
|
-
}
|
|
2
|
+
export { M as McpPluginApi } from '../../io-D4srzRKc.js';
|
|
14
3
|
|
|
15
4
|
interface McpPluginOptions {
|
|
16
5
|
/**
|
|
@@ -94,4 +83,4 @@ declare function assertMetadataPathShape(metadataPath: string): void;
|
|
|
94
83
|
*/
|
|
95
84
|
declare function mcpPlugin(options?: McpPluginOptions): Plugin;
|
|
96
85
|
|
|
97
|
-
export { type
|
|
86
|
+
export { type McpPluginOptions, assertMetadataPathShape, assertUrlPathShape, mcpPlugin as default, deriveRouteFileName, mcpPlugin };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
isFileMissing
|
|
3
|
-
} from "../../chunk-Y3ZFPEQH.js";
|
|
4
1
|
import {
|
|
5
2
|
OAUTH_PROTECTED_RESOURCE_METADATA_PATH
|
|
6
3
|
} from "../../chunk-6DXGZZA4.js";
|
|
4
|
+
import {
|
|
5
|
+
isFileMissing
|
|
6
|
+
} from "../../chunk-Y3ZFPEQH.js";
|
|
7
7
|
|
|
8
8
|
// src/stacks/tanstack/vite.ts
|
|
9
9
|
import { lstatSync, mkdirSync, readFileSync, readdirSync, unlinkSync, writeFileSync } from "fs";
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lovable.dev/mcp-js",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Author MCP servers for Lovable apps. Declare tools with defineTool, register them in defineMcp, and
|
|
3
|
+
"version": "0.10.0",
|
|
4
|
+
"description": "Author MCP servers for Lovable apps. Declare tools with defineTool, register them in defineMcp, and a framework adapter (TanStack or Supabase Edge Functions) emits the route(s) at build time.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -48,6 +48,16 @@
|
|
|
48
48
|
"types": "./dist/stacks/tanstack/vite.d.ts",
|
|
49
49
|
"import": "./dist/stacks/tanstack/vite.js",
|
|
50
50
|
"require": "./dist/stacks/tanstack/vite.cjs"
|
|
51
|
+
},
|
|
52
|
+
"./stacks/supabase": {
|
|
53
|
+
"types": "./dist/stacks/supabase/index.d.ts",
|
|
54
|
+
"import": "./dist/stacks/supabase/index.js",
|
|
55
|
+
"require": "./dist/stacks/supabase/index.cjs"
|
|
56
|
+
},
|
|
57
|
+
"./stacks/supabase/vite": {
|
|
58
|
+
"types": "./dist/stacks/supabase/vite.d.ts",
|
|
59
|
+
"import": "./dist/stacks/supabase/vite.js",
|
|
60
|
+
"require": "./dist/stacks/supabase/vite.cjs"
|
|
51
61
|
}
|
|
52
62
|
},
|
|
53
63
|
"bin": {
|
|
@@ -82,8 +92,8 @@
|
|
|
82
92
|
"zod": "^4.1.13"
|
|
83
93
|
},
|
|
84
94
|
"scripts": {
|
|
85
|
-
"build": "tsup src/index.ts src/protocols/mcp/index.ts src/protocols/oauth-metadata.ts src/protocols/rest/index.ts src/stacks/tanstack/index.ts src/stacks/tanstack/vite.ts src/cli/extract-manifest.ts --format cjs,esm --dts --outDir dist",
|
|
86
|
-
"dev": "tsup src/index.ts src/protocols/mcp/index.ts src/protocols/oauth-metadata.ts src/protocols/rest/index.ts src/stacks/tanstack/index.ts src/stacks/tanstack/vite.ts src/cli/extract-manifest.ts --format cjs,esm --dts --watch",
|
|
95
|
+
"build": "tsup src/index.ts src/protocols/mcp/index.ts src/protocols/oauth-metadata.ts src/protocols/rest/index.ts src/stacks/tanstack/index.ts src/stacks/tanstack/vite.ts src/stacks/supabase/index.ts src/stacks/supabase/vite.ts src/cli/extract-manifest.ts --format cjs,esm --dts --outDir dist",
|
|
96
|
+
"dev": "tsup src/index.ts src/protocols/mcp/index.ts src/protocols/oauth-metadata.ts src/protocols/rest/index.ts src/stacks/tanstack/index.ts src/stacks/tanstack/vite.ts src/stacks/supabase/index.ts src/stacks/supabase/vite.ts src/cli/extract-manifest.ts --format cjs,esm --dts --watch",
|
|
87
97
|
"typecheck": "tsgo --noEmit",
|
|
88
98
|
"format": "oxfmt --write src/ tests/",
|
|
89
99
|
"format:check": "oxfmt --check src/ tests/",
|
|
@@ -91,13 +101,18 @@
|
|
|
91
101
|
"lint:fix": "oxfmt --write src/ tests/ && oxlint -c ../../oxlint.config.ts --fix src/ tests/",
|
|
92
102
|
"test": "vitest run --project unit",
|
|
93
103
|
"test:watch": "vitest --project unit",
|
|
94
|
-
"example:install": "bun link && cd example/tanstack && bun install && bun link @lovable.dev/mcp-js",
|
|
95
|
-
"example:
|
|
96
|
-
"example:
|
|
97
|
-
"example:oauth:
|
|
98
|
-
"example:oauth:
|
|
99
|
-
"
|
|
100
|
-
"
|
|
104
|
+
"example:tanstack:install": "bun link && cd example/tanstack && bun install && bun link @lovable.dev/mcp-js",
|
|
105
|
+
"example:tanstack:dev": "cd example/tanstack && bun --bun run dev",
|
|
106
|
+
"example:tanstack:build": "cd example/tanstack && bun --bun run build",
|
|
107
|
+
"example:tanstack:oauth:install": "bun link && cd example/tanstack-supabase-oauth && bun install && bun link @lovable.dev/mcp-js",
|
|
108
|
+
"example:tanstack:oauth:dev": "cd example/tanstack-supabase-oauth && bun --bun run dev",
|
|
109
|
+
"example:tanstack:oauth:build": "cd example/tanstack-supabase-oauth && bun --bun run build",
|
|
110
|
+
"example:tanstack:oauth:smoke": "node tests/integration/oauth-smoke.mjs",
|
|
111
|
+
"example:supabase:install": "bun link && cd example/supabase && bun install && bun link @lovable.dev/mcp-js",
|
|
112
|
+
"example:supabase:dev": "cd example/supabase && bun --bun run dev",
|
|
113
|
+
"example:supabase:build": "cd example/supabase && bun --bun run build",
|
|
114
|
+
"test:integration:tanstack": "npm run build && npm run example:tanstack:install && vitest run --project integration",
|
|
115
|
+
"test:integration:tanstack:oauth": "npm run build && npm run example:tanstack:oauth:install && vitest run --project integration-oauth",
|
|
101
116
|
"clean": "rimraf dist",
|
|
102
117
|
"pack:local": "npm run build && npm pack --pack-destination /tmp"
|
|
103
118
|
}
|