zenstack 2.18.1 → 2.19.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/LICENSE +1 -1
- package/cli/config.d.ts +1 -1
- package/cli/config.js +1 -2
- package/cli/config.js.map +1 -1
- package/documentation-cache.d.ts +48 -0
- package/documentation-cache.js +141 -0
- package/documentation-cache.js.map +1 -0
- package/extension.d.ts +4 -0
- package/extension.js +135 -0
- package/extension.js.map +1 -0
- package/language-server/main.js +49 -0
- package/language-server/main.js.map +1 -1
- package/package.json +68 -13
- package/plugins/enhancer/enhance/index.js +4 -3
- package/plugins/enhancer/enhance/index.js.map +1 -1
- package/plugins/zod/generator.d.ts +1 -0
- package/plugins/zod/generator.js +42 -28
- package/plugins/zod/generator.js.map +1 -1
- package/plugins/zod/transformer.js +14 -3
- package/plugins/zod/transformer.js.map +1 -1
- package/plugins/zod/utils/schema-gen.d.ts +1 -1
- package/plugins/zod/utils/schema-gen.js +15 -11
- package/plugins/zod/utils/schema-gen.js.map +1 -1
- package/release-notes-manager.d.ts +25 -0
- package/release-notes-manager.js +111 -0
- package/release-notes-manager.js.map +1 -0
- package/res/zmodel-preview-release-notes.html +91 -0
- package/zenstack-auth-provider.d.ts +32 -0
- package/zenstack-auth-provider.js +281 -0
- package/zenstack-auth-provider.js.map +1 -0
- package/zmodel-preview.d.ts +44 -0
- package/zmodel-preview.js +289 -0
- package/zmodel-preview.js.map +1 -0
package/LICENSE
CHANGED
package/cli/config.d.ts
CHANGED
package/cli/config.js
CHANGED
|
@@ -40,7 +40,6 @@ exports.config = void 0;
|
|
|
40
40
|
exports.loadConfig = loadConfig;
|
|
41
41
|
const fs_1 = __importDefault(require("fs"));
|
|
42
42
|
const zod_1 = __importStar(require("zod"));
|
|
43
|
-
const v3_1 = require("zod-validation-error/v3");
|
|
44
43
|
const cli_error_1 = require("./cli-error");
|
|
45
44
|
// TODO: future use
|
|
46
45
|
const schema = zod_1.default.object({});
|
|
@@ -64,7 +63,7 @@ function loadConfig(filename) {
|
|
|
64
63
|
throw new cli_error_1.CliError(`Config is not a valid JSON file: ${filename}`);
|
|
65
64
|
}
|
|
66
65
|
if (err instanceof zod_1.ZodError) {
|
|
67
|
-
throw new cli_error_1.CliError(`Config file ${filename} is not valid: ${
|
|
66
|
+
throw new cli_error_1.CliError(`Config file ${filename} is not valid: ${err}`);
|
|
68
67
|
}
|
|
69
68
|
throw new cli_error_1.CliError(`Error loading config: ${filename}`);
|
|
70
69
|
}
|
package/cli/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,gCAkBC;AAjCD,4CAAoB;AACpB,2CAAkC;AAClC,2CAAuC;AAEvC,mBAAmB;AACnB,MAAM,MAAM,GAAG,aAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAIjB,QAAA,MAAM,GAAe,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAEjD;;;GAGG;AACH,SAAgB,UAAU,CAAC,QAAgB;IACvC,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrC,cAAM,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,8DAA8D;IAClE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,IAAI,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,MAAK,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,oBAAQ,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;YAC7B,MAAM,IAAI,oBAAQ,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,GAAG,YAAY,cAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,oBAAQ,CAAC,eAAe,QAAQ,kBAAkB,GAAG,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,IAAI,oBAAQ,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;IAC5D,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as vscode from 'vscode';
|
|
2
|
+
/**
|
|
3
|
+
* DocumentationCache class handles persistent caching of ZModel documentation
|
|
4
|
+
* using VS Code's globalState for cross-session persistence
|
|
5
|
+
*/
|
|
6
|
+
export declare class DocumentationCache implements vscode.Disposable {
|
|
7
|
+
private static readonly CACHE_DURATION_MS;
|
|
8
|
+
private static readonly CACHE_PREFIX;
|
|
9
|
+
private extensionContext;
|
|
10
|
+
private extensionVersion;
|
|
11
|
+
constructor(context: vscode.ExtensionContext);
|
|
12
|
+
/**
|
|
13
|
+
* Dispose of the cache resources (implements vscode.Disposable)
|
|
14
|
+
*/
|
|
15
|
+
dispose(): void;
|
|
16
|
+
/**
|
|
17
|
+
* Get the cache prefix used for keys
|
|
18
|
+
*/
|
|
19
|
+
getCachePrefix(): string;
|
|
20
|
+
/**
|
|
21
|
+
* Enable cache synchronization across machines via VS Code Settings Sync
|
|
22
|
+
*/
|
|
23
|
+
private enableCacheSync;
|
|
24
|
+
/**
|
|
25
|
+
* Generate a cache key from request body with normalized content
|
|
26
|
+
*/
|
|
27
|
+
private generateCacheKey;
|
|
28
|
+
/**
|
|
29
|
+
* Check if cache entry is still valid (not expired)
|
|
30
|
+
*/
|
|
31
|
+
private isCacheValid;
|
|
32
|
+
/**
|
|
33
|
+
* Get cached response if available and valid
|
|
34
|
+
*/
|
|
35
|
+
getCachedResponse(models: string[]): Promise<string | null>;
|
|
36
|
+
/**
|
|
37
|
+
* Cache a response for future use
|
|
38
|
+
*/
|
|
39
|
+
setCachedResponse(models: string[], data: string): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Clear expired cache entries from persistent storage
|
|
42
|
+
*/
|
|
43
|
+
clearExpiredCache(): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Clear all cache entries from persistent storage
|
|
46
|
+
*/
|
|
47
|
+
clearAllCache(): Promise<void>;
|
|
48
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.DocumentationCache = void 0;
|
|
13
|
+
const crypto_1 = require("crypto");
|
|
14
|
+
/**
|
|
15
|
+
* DocumentationCache class handles persistent caching of ZModel documentation
|
|
16
|
+
* using VS Code's globalState for cross-session persistence
|
|
17
|
+
*/
|
|
18
|
+
class DocumentationCache {
|
|
19
|
+
constructor(context) {
|
|
20
|
+
this.extensionContext = context;
|
|
21
|
+
this.extensionVersion = context.extension.packageJSON.version;
|
|
22
|
+
// clear expired cache entries on initialization
|
|
23
|
+
this.clearExpiredCache();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Dispose of the cache resources (implements vscode.Disposable)
|
|
27
|
+
*/
|
|
28
|
+
dispose() { }
|
|
29
|
+
/**
|
|
30
|
+
* Get the cache prefix used for keys
|
|
31
|
+
*/
|
|
32
|
+
getCachePrefix() {
|
|
33
|
+
return DocumentationCache.CACHE_PREFIX;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Enable cache synchronization across machines via VS Code Settings Sync
|
|
37
|
+
*/
|
|
38
|
+
enableCacheSync() {
|
|
39
|
+
const cacheKeys = this.extensionContext.globalState
|
|
40
|
+
.keys()
|
|
41
|
+
.filter((key) => key.startsWith(DocumentationCache.CACHE_PREFIX));
|
|
42
|
+
if (cacheKeys.length > 0) {
|
|
43
|
+
this.extensionContext.globalState.setKeysForSync(cacheKeys);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Generate a cache key from request body with normalized content
|
|
48
|
+
*/
|
|
49
|
+
generateCacheKey(models) {
|
|
50
|
+
// Remove ALL whitespace characters from each model string for cache key generation
|
|
51
|
+
// This ensures identical content with different formatting uses the same cache
|
|
52
|
+
const normalizedModels = models.map((model) => model.replace(/\s/g, '')).sort();
|
|
53
|
+
const hash = (0, crypto_1.createHash)('sha512')
|
|
54
|
+
.update(JSON.stringify({ models: normalizedModels }))
|
|
55
|
+
.digest('hex');
|
|
56
|
+
return `${DocumentationCache.CACHE_PREFIX}${hash}`;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check if cache entry is still valid (not expired)
|
|
60
|
+
*/
|
|
61
|
+
isCacheValid(entry) {
|
|
62
|
+
return Date.now() - entry.timestamp < DocumentationCache.CACHE_DURATION_MS;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get cached response if available and valid
|
|
66
|
+
*/
|
|
67
|
+
getCachedResponse(models) {
|
|
68
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
69
|
+
const cacheKey = this.generateCacheKey(models);
|
|
70
|
+
const entry = this.extensionContext.globalState.get(cacheKey);
|
|
71
|
+
if (entry && this.isCacheValid(entry)) {
|
|
72
|
+
console.log('Using cached documentation response from persistent storage');
|
|
73
|
+
return entry.data;
|
|
74
|
+
}
|
|
75
|
+
// Clean up expired entry if it exists
|
|
76
|
+
if (entry) {
|
|
77
|
+
yield this.extensionContext.globalState.update(cacheKey, undefined);
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Cache a response for future use
|
|
84
|
+
*/
|
|
85
|
+
setCachedResponse(models, data) {
|
|
86
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
87
|
+
const cacheKey = this.generateCacheKey(models);
|
|
88
|
+
const cacheEntry = {
|
|
89
|
+
data,
|
|
90
|
+
timestamp: Date.now(),
|
|
91
|
+
extensionVersion: this.extensionVersion,
|
|
92
|
+
};
|
|
93
|
+
yield this.extensionContext.globalState.update(cacheKey, cacheEntry);
|
|
94
|
+
// Update sync keys to include new cache entry
|
|
95
|
+
this.enableCacheSync();
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Clear expired cache entries from persistent storage
|
|
100
|
+
*/
|
|
101
|
+
clearExpiredCache() {
|
|
102
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
103
|
+
const now = Date.now();
|
|
104
|
+
let clearedCount = 0;
|
|
105
|
+
const allKeys = this.extensionContext.globalState.keys();
|
|
106
|
+
for (const key of allKeys) {
|
|
107
|
+
if (key.startsWith(DocumentationCache.CACHE_PREFIX)) {
|
|
108
|
+
const entry = this.extensionContext.globalState.get(key);
|
|
109
|
+
if ((entry === null || entry === void 0 ? void 0 : entry.extensionVersion) !== this.extensionVersion ||
|
|
110
|
+
now - entry.timestamp >= DocumentationCache.CACHE_DURATION_MS) {
|
|
111
|
+
yield this.extensionContext.globalState.update(key, undefined);
|
|
112
|
+
clearedCount++;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (clearedCount > 0) {
|
|
117
|
+
console.log(`Cleared ${clearedCount} expired cache entries from persistent storage`);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Clear all cache entries from persistent storage
|
|
123
|
+
*/
|
|
124
|
+
clearAllCache() {
|
|
125
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
126
|
+
const allKeys = this.extensionContext.globalState.keys();
|
|
127
|
+
let clearedCount = 0;
|
|
128
|
+
for (const key of allKeys) {
|
|
129
|
+
if (key.startsWith(DocumentationCache.CACHE_PREFIX)) {
|
|
130
|
+
yield this.extensionContext.globalState.update(key, undefined);
|
|
131
|
+
clearedCount++;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
console.log(`Cleared all cache entries from persistent storage (${clearedCount} items)`);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.DocumentationCache = DocumentationCache;
|
|
139
|
+
DocumentationCache.CACHE_DURATION_MS = 30 * 24 * 60 * 60 * 1000; // 30 days cache duration
|
|
140
|
+
DocumentationCache.CACHE_PREFIX = 'doc-cache.';
|
|
141
|
+
//# sourceMappingURL=documentation-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentation-cache.js","sourceRoot":"","sources":["../src/documentation-cache.ts"],"names":[],"mappings":"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"}
|
package/extension.d.ts
ADDED
package/extension.js
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
38
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
39
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
40
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
41
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.requireAuth = requireAuth;
|
|
46
|
+
exports.activate = activate;
|
|
47
|
+
exports.deactivate = deactivate;
|
|
48
|
+
const vscode = __importStar(require("vscode"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
const node_1 = require("vscode-languageclient/node");
|
|
51
|
+
const zenstack_auth_provider_1 = require("./zenstack-auth-provider");
|
|
52
|
+
const documentation_cache_1 = require("./documentation-cache");
|
|
53
|
+
const zmodel_preview_1 = require("./zmodel-preview");
|
|
54
|
+
const release_notes_manager_1 = require("./release-notes-manager");
|
|
55
|
+
// Global variables
|
|
56
|
+
let client;
|
|
57
|
+
// Utility to require authentication when needed
|
|
58
|
+
function requireAuth() {
|
|
59
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
60
|
+
let session;
|
|
61
|
+
session = yield vscode.authentication.getSession(zenstack_auth_provider_1.AUTH_PROVIDER_ID, [], { createIfNone: false });
|
|
62
|
+
if (!session) {
|
|
63
|
+
const signIn = 'Sign in';
|
|
64
|
+
const selection = yield vscode.window.showWarningMessage('Please sign in to use this feature', signIn);
|
|
65
|
+
if (selection === signIn) {
|
|
66
|
+
try {
|
|
67
|
+
session = yield vscode.authentication.getSession(zenstack_auth_provider_1.AUTH_PROVIDER_ID, [], { createIfNone: true });
|
|
68
|
+
if (session) {
|
|
69
|
+
vscode.window.showInformationMessage('ZenStack sign-in successful!');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
vscode.window.showErrorMessage('ZenStack sign-in failed: ' + (e instanceof Error ? e.message : String(e)));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return session;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
// This function is called when the extension is activated.
|
|
81
|
+
function activate(context) {
|
|
82
|
+
// Initialize and register the ZenStack authentication provider
|
|
83
|
+
context.subscriptions.push(new zenstack_auth_provider_1.ZenStackAuthenticationProvider(context));
|
|
84
|
+
// Start language client
|
|
85
|
+
client = startLanguageClient(context);
|
|
86
|
+
const documentationCache = new documentation_cache_1.DocumentationCache(context);
|
|
87
|
+
context.subscriptions.push(documentationCache);
|
|
88
|
+
context.subscriptions.push(new zmodel_preview_1.ZModelPreview(context, client, documentationCache));
|
|
89
|
+
context.subscriptions.push(new release_notes_manager_1.ReleaseNotesManager(context));
|
|
90
|
+
}
|
|
91
|
+
// This function is called when the extension is deactivated.
|
|
92
|
+
function deactivate() {
|
|
93
|
+
if (client) {
|
|
94
|
+
return client.stop();
|
|
95
|
+
}
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
function startLanguageClient(context) {
|
|
99
|
+
const serverModule = context.asAbsolutePath(path.join('bundle', 'language-server', 'main'));
|
|
100
|
+
// The debug options for the server
|
|
101
|
+
// --inspect=6009: runs the server in Node's Inspector mode so VS Code can attach to the server for debugging.
|
|
102
|
+
// By setting `process.env.DEBUG_BREAK` to a truthy value, the language server will wait until a debugger is attached.
|
|
103
|
+
const debugOptions = {
|
|
104
|
+
execArgv: [
|
|
105
|
+
'--nolazy',
|
|
106
|
+
`--inspect${process.env.DEBUG_BREAK ? '-brk' : ''}=${process.env.DEBUG_SOCKET || '6009'}`,
|
|
107
|
+
],
|
|
108
|
+
};
|
|
109
|
+
// If the extension is launched in debug mode then the debug server options are used
|
|
110
|
+
// Otherwise the run options are used
|
|
111
|
+
const serverOptions = {
|
|
112
|
+
run: { module: serverModule, transport: node_1.TransportKind.ipc },
|
|
113
|
+
debug: {
|
|
114
|
+
module: serverModule,
|
|
115
|
+
transport: node_1.TransportKind.ipc,
|
|
116
|
+
options: debugOptions,
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
const fileSystemWatcher = vscode.workspace.createFileSystemWatcher('**/*.zmodel');
|
|
120
|
+
context.subscriptions.push(fileSystemWatcher);
|
|
121
|
+
// Options to control the language client
|
|
122
|
+
const clientOptions = {
|
|
123
|
+
documentSelector: [{ scheme: 'file', language: 'zmodel' }],
|
|
124
|
+
synchronize: {
|
|
125
|
+
// Notify the server about file changes to files contained in the workspace
|
|
126
|
+
fileEvents: fileSystemWatcher,
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
// Create the language client and start the client.
|
|
130
|
+
const client = new node_1.LanguageClient('zmodel', 'ZenStack Model', serverOptions, clientOptions);
|
|
131
|
+
// Start the client. This will also launch the server
|
|
132
|
+
void client.start();
|
|
133
|
+
return client;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=extension.js.map
|
package/extension.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
|
package/language-server/main.js
CHANGED
|
@@ -1,13 +1,62 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
2
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
12
|
const langium_1 = require("langium");
|
|
4
13
|
const node_1 = require("langium/node");
|
|
5
14
|
const node_2 = require("vscode-languageserver/node");
|
|
15
|
+
const vscode_uri_1 = require("vscode-uri");
|
|
6
16
|
const zmodel_module_1 = require("./zmodel-module");
|
|
17
|
+
const cli_util_1 = require("../cli/cli-util");
|
|
7
18
|
// Create a connection to the client
|
|
8
19
|
const connection = (0, node_2.createConnection)(node_2.ProposedFeatures.all);
|
|
9
20
|
// Inject the shared services and language-specific services
|
|
10
21
|
const { shared } = (0, zmodel_module_1.createZModelServices)(Object.assign({ connection }, node_1.NodeFileSystem));
|
|
22
|
+
// Add custom LSP request handlers
|
|
23
|
+
connection.onRequest('zenstack/getAllImportedZModelURIs', (params) => __awaiter(void 0, void 0, void 0, function* () {
|
|
24
|
+
try {
|
|
25
|
+
const uri = vscode_uri_1.URI.parse(params.textDocument.uri);
|
|
26
|
+
const document = shared.workspace.LangiumDocuments.getOrCreateDocument(uri);
|
|
27
|
+
// Ensure the document is parsed and built
|
|
28
|
+
if (!document.parseResult) {
|
|
29
|
+
yield shared.workspace.DocumentBuilder.build([document]);
|
|
30
|
+
}
|
|
31
|
+
// #region merge imported documents
|
|
32
|
+
const langiumDocuments = shared.workspace.LangiumDocuments;
|
|
33
|
+
// load all imports
|
|
34
|
+
const importedURIs = (0, cli_util_1.eagerLoadAllImports)(document, langiumDocuments);
|
|
35
|
+
const importedDocuments = importedURIs.map((uri) => langiumDocuments.getOrCreateDocument(uri));
|
|
36
|
+
// build the document together with standard library, plugin modules, and imported documents
|
|
37
|
+
yield shared.workspace.DocumentBuilder.build([document, ...importedDocuments], {
|
|
38
|
+
validationChecks: 'all',
|
|
39
|
+
});
|
|
40
|
+
const hasSyntaxErrors = [uri, ...importedURIs].some((uri) => {
|
|
41
|
+
var _a;
|
|
42
|
+
const doc = langiumDocuments.getOrCreateDocument(uri);
|
|
43
|
+
return (doc.parseResult.lexerErrors.length > 0 ||
|
|
44
|
+
doc.parseResult.parserErrors.length > 0 ||
|
|
45
|
+
((_a = doc.diagnostics) === null || _a === void 0 ? void 0 : _a.some((e) => e.severity === 1)));
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
hasSyntaxErrors,
|
|
49
|
+
importedURIs,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.error('Error getting imported ZModel file:', error);
|
|
54
|
+
return {
|
|
55
|
+
hasSyntaxErrors: true,
|
|
56
|
+
importedURIs: [],
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}));
|
|
11
60
|
// Start the language server with the shared services
|
|
12
61
|
(0, langium_1.startLanguageServer)(shared);
|
|
13
62
|
//# sourceMappingURL=main.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/language-server/main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/language-server/main.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,qCAA8C;AAC9C,uCAA8C;AAC9C,qDAAgF;AAChF,2CAAiC;AACjC,mDAAuD;AACvD,8CAAsD;AAEtD,oCAAoC;AACpC,MAAM,UAAU,GAAG,IAAA,uBAAgB,EAAC,uBAAgB,CAAC,GAAG,CAAC,CAAC;AAE1D,4DAA4D;AAC5D,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,oCAAoB,kBAAG,UAAU,IAAK,qBAAc,EAAG,CAAC;AAE3E,kCAAkC;AAClC,UAAU,CAAC,SAAS,CAAC,mCAAmC,EAAE,CAAO,MAAyC,EAAE,EAAE;IAC1G,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,gBAAG,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAE5E,0CAA0C;QAC1C,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YACxB,MAAM,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7D,CAAC;QAED,mCAAmC;QACnC,MAAM,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC;QAE3D,mBAAmB;QACnB,MAAM,YAAY,GAAG,IAAA,8BAAmB,EAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QAErE,MAAM,iBAAiB,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;QAE/F,4FAA4F;QAC5F,MAAM,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,GAAG,iBAAiB,CAAC,EAAE;YAC3E,gBAAgB,EAAE,KAAK;SAC1B,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;;YACxD,MAAM,GAAG,GAAG,gBAAgB,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;YACtD,OAAO,CACH,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;gBACtC,GAAG,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;iBACvC,MAAA,GAAG,CAAC,WAAW,0CAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAA,CACjD,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,OAAO;YACH,eAAe;YACf,YAAY;SACf,CAAC;IACN,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;QAC5D,OAAO;YACH,eAAe,EAAE,IAAI;YACrB,YAAY,EAAE,EAAE;SACnB,CAAC;IACN,CAAC;AACL,CAAC,CAAA,CAAC,CAAC;AAEH,qDAAqD;AACrD,IAAA,6BAAmB,EAAC,MAAM,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publisher": "zenstack",
|
|
4
4
|
"displayName": "ZenStack Language Tools",
|
|
5
5
|
"description": "FullStack enhancement for Prisma ORM: seamless integration from database to UI",
|
|
6
|
-
"version": "2.
|
|
6
|
+
"version": "2.19.0",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "ZenStack Team"
|
|
9
9
|
},
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"linkDirectory": true
|
|
28
28
|
},
|
|
29
29
|
"engines": {
|
|
30
|
-
"vscode": "^1.
|
|
30
|
+
"vscode": "^1.99.3"
|
|
31
31
|
},
|
|
32
32
|
"categories": [
|
|
33
33
|
"Programming Languages"
|
|
@@ -64,13 +64,68 @@
|
|
|
64
64
|
"type": "boolean",
|
|
65
65
|
"default": true,
|
|
66
66
|
"description": "Use Prisma style indentation."
|
|
67
|
+
},
|
|
68
|
+
"zenstack.searchForExtensions": {
|
|
69
|
+
"type": "boolean",
|
|
70
|
+
"default": true,
|
|
71
|
+
"description": "Search for Mermaid extensions when viewing Mermaid source."
|
|
67
72
|
}
|
|
68
73
|
}
|
|
69
|
-
}
|
|
74
|
+
},
|
|
75
|
+
"menus": {
|
|
76
|
+
"editor/title": [
|
|
77
|
+
{
|
|
78
|
+
"command": "zenstack.preview-zmodel",
|
|
79
|
+
"when": "editorLangId == zmodel",
|
|
80
|
+
"group": "navigation"
|
|
81
|
+
}
|
|
82
|
+
],
|
|
83
|
+
"commandPalette": [
|
|
84
|
+
{
|
|
85
|
+
"command": "zenstack.preview-zmodel",
|
|
86
|
+
"when": "editorLangId == zmodel"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"command": "zenstack.clear-documentation-cache"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"command": "zenstack.logout"
|
|
93
|
+
}
|
|
94
|
+
]
|
|
95
|
+
},
|
|
96
|
+
"commands": [
|
|
97
|
+
{
|
|
98
|
+
"command": "zenstack.preview-zmodel",
|
|
99
|
+
"title": "ZenStack: Preview ZModel Documentation",
|
|
100
|
+
"icon": "$(preview)"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"command": "zenstack.clear-documentation-cache",
|
|
104
|
+
"title": "ZenStack: Clear Documentation Cache",
|
|
105
|
+
"icon": "$(trash)"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"command": "zenstack.logout",
|
|
109
|
+
"title": "ZenStack: Logout",
|
|
110
|
+
"icon": "$(log-out)"
|
|
111
|
+
}
|
|
112
|
+
],
|
|
113
|
+
"keybindings": [
|
|
114
|
+
{
|
|
115
|
+
"command": "zenstack.preview-zmodel",
|
|
116
|
+
"key": "ctrl+shift+v",
|
|
117
|
+
"mac": "cmd+shift+v",
|
|
118
|
+
"when": "editorLangId == zmodel"
|
|
119
|
+
}
|
|
120
|
+
]
|
|
121
|
+
},
|
|
122
|
+
"activationEvents": [],
|
|
123
|
+
"capabilities": {
|
|
124
|
+
"untrustedWorkspaces": {
|
|
125
|
+
"supported": true
|
|
126
|
+
},
|
|
127
|
+
"virtualWorkspaces": true
|
|
70
128
|
},
|
|
71
|
-
"activationEvents": [
|
|
72
|
-
"onLanguage:zmodel"
|
|
73
|
-
],
|
|
74
129
|
"bin": {
|
|
75
130
|
"zenstack": "bin/cli"
|
|
76
131
|
},
|
|
@@ -98,22 +153,22 @@
|
|
|
98
153
|
"vscode-languageserver-textdocument": "^1.0.7",
|
|
99
154
|
"vscode-uri": "^3.0.6",
|
|
100
155
|
"zod-validation-error": "^4.0.0",
|
|
101
|
-
"@zenstackhq/
|
|
102
|
-
"@zenstackhq/
|
|
156
|
+
"@zenstackhq/sdk": "2.19.0",
|
|
157
|
+
"@zenstackhq/language": "2.19.0"
|
|
103
158
|
},
|
|
104
159
|
"peerDependencies": {
|
|
105
|
-
"prisma": "5.0.0 - 6.
|
|
106
|
-
"zod": "^3.25.0"
|
|
160
|
+
"prisma": "5.0.0 - 6.16.x",
|
|
161
|
+
"zod": "^3.25.0 || ^4.0.0"
|
|
107
162
|
},
|
|
108
163
|
"devDependencies": {
|
|
109
|
-
"@prisma/client": "6.
|
|
164
|
+
"@prisma/client": "6.16.x",
|
|
110
165
|
"@types/async-exit-hook": "^2.0.0",
|
|
111
166
|
"@types/pluralize": "^0.0.29",
|
|
112
167
|
"@types/semver": "^7.3.13",
|
|
113
168
|
"@types/strip-color": "^0.1.0",
|
|
114
169
|
"@types/tmp": "^0.2.3",
|
|
115
170
|
"@types/uuid": "^8.3.4",
|
|
116
|
-
"@types/vscode": "^1.
|
|
171
|
+
"@types/vscode": "^1.99.3",
|
|
117
172
|
"@vscode/vsce": "^3.5.0",
|
|
118
173
|
"dotenv": "^16.0.3",
|
|
119
174
|
"esbuild": "^0.24.0",
|
|
@@ -121,7 +176,7 @@
|
|
|
121
176
|
"tmp": "^0.2.1",
|
|
122
177
|
"tsc-alias": "^1.7.0",
|
|
123
178
|
"vitest": "^0.29.7",
|
|
124
|
-
"@zenstackhq/runtime": "2.
|
|
179
|
+
"@zenstackhq/runtime": "2.19.0"
|
|
125
180
|
},
|
|
126
181
|
"scripts": {
|
|
127
182
|
"vscode:publish": "vsce publish --no-dependencies",
|
|
@@ -350,13 +350,14 @@ export type Enhanced<Client> =
|
|
|
350
350
|
}
|
|
351
351
|
getLogicalDMMF(logicalPrismaFile) {
|
|
352
352
|
return __awaiter(this, void 0, void 0, function* () {
|
|
353
|
+
var _a;
|
|
353
354
|
const dmmf = yield (0, prisma_1.getDMMF)({ datamodel: fs_1.default.readFileSync(logicalPrismaFile, { encoding: 'utf-8' }) });
|
|
354
355
|
// make necessary fixes
|
|
355
356
|
// fields that use `auth()` in `@default` are not handled by Prisma so in the DMMF
|
|
356
357
|
// they may be incorrectly represented as required, we need to fix that for input types
|
|
357
358
|
// also, if a FK field is of such case, its corresponding relation field should be optional
|
|
358
359
|
const createInputPattern = new RegExp(`^(.+?)(Unchecked)?Create.*Input$`);
|
|
359
|
-
for (const inputType of dmmf.schema.inputObjectTypes.prisma) {
|
|
360
|
+
for (const inputType of (_a = dmmf.schema.inputObjectTypes.prisma) !== null && _a !== void 0 ? _a : []) {
|
|
360
361
|
const match = inputType.name.match(createInputPattern);
|
|
361
362
|
const modelName = this.resolveName(match === null || match === void 0 ? void 0 : match[1]);
|
|
362
363
|
if (modelName) {
|
|
@@ -475,7 +476,7 @@ export type Enhanced<Client> =
|
|
|
475
476
|
if (!ts_morph_1.Node.isSyntaxList(syntaxList)) {
|
|
476
477
|
throw new sdk_1.PluginError(__1.name, `Unexpected syntax list structure in ${fileName}`);
|
|
477
478
|
}
|
|
478
|
-
const statements = [
|
|
479
|
+
const statements = [];
|
|
479
480
|
// Add import for json-types if this model has JSON type fields
|
|
480
481
|
const modelWithJsonFields = this.modelsWithJsonTypeFields.find((m) => m.name === d.name);
|
|
481
482
|
if (modelWithJsonFields) {
|
|
@@ -791,7 +792,7 @@ export type Enhanced<Client> =
|
|
|
791
792
|
// Check if the field in the source is optional (has a `?`)
|
|
792
793
|
const isOptionalInSource = new RegExp(`(${field.name}\\?\\s*):`).test(source);
|
|
793
794
|
if (isOptionalInSource) {
|
|
794
|
-
replaceValue += ' |
|
|
795
|
+
replaceValue += ' | runtime.Types.Skip';
|
|
795
796
|
}
|
|
796
797
|
return source.replace(new RegExp(`(${field.name}\\??\\s*):[^\\n]+`), replaceValue);
|
|
797
798
|
};
|