New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@ember-tooling/ember-language-server

Package Overview
Dependencies
Maintainers
0
Versions
4
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@ember-tooling/ember-language-server - npm Package Compare versions

Comparing version

to
2.30.4

ember-language-server.code-workspace

13

CHANGELOG.md

@@ -0,1 +1,14 @@

## [2.30.4](https://github.com/ember-tooling/ember-language-server/compare/v2.30.3...v2.30.4) (2024-11-07)
### Bug Fixes
* performance regression for projects using correct module graphs ([10c6b28](https://github.com/ember-tooling/ember-language-server/commit/10c6b28d0b3e0dc1e087c97fb7f7f9aa9350b8bc))
### Reverts
* Revert "Fix #414" ([bca0a71](https://github.com/ember-tooling/ember-language-server/commit/bca0a7108f3f125061b3968ab58a1d99895d13f4)), closes [#414](https://github.com/ember-tooling/ember-language-server/issues/414)
* Revert "Does CI match my local env?" (it does) ([10685e0](https://github.com/ember-tooling/ember-language-server/commit/10685e09bf3999e4990a7b79a9ee18d821cb40a0))
## [2.30.3](https://github.com/ember-tooling/ember-language-server/compare/v2.30.2...v2.30.3) (2024-05-15)

@@ -2,0 +15,0 @@

8

lib/builtin-addons/core/script-completion-provider.js

@@ -68,3 +68,3 @@ "use strict";

if (!this.meta.projectAddonsInfoInitialized) {
await (0, layout_helpers_1.mGetProjectAddonsInfo)(root);
await (0, layout_helpers_1.mGetProjectAddonsInfo)(root, this.project.dependencyMap);
this.enableRegistryCache('projectAddonsInfoInitialized');

@@ -89,3 +89,3 @@ this.project.invalidateRegistry();

if (!this.meta.projectAddonsInfoInitialized) {
await (0, layout_helpers_1.mGetProjectAddonsInfo)(root);
await (0, layout_helpers_1.mGetProjectAddonsInfo)(root, this.project.dependencyMap);
this.enableRegistryCache('projectAddonsInfoInitialized');

@@ -110,3 +110,3 @@ this.project.invalidateRegistry();

if (!this.meta.projectAddonsInfoInitialized) {
await (0, layout_helpers_1.mGetProjectAddonsInfo)(root);
await (0, layout_helpers_1.mGetProjectAddonsInfo)(root, this.project.dependencyMap);
this.enableRegistryCache('projectAddonsInfoInitialized');

@@ -158,3 +158,3 @@ this.project.invalidateRegistry();

if (!this.meta.projectAddonsInfoInitialized) {
await (0, layout_helpers_1.mGetProjectAddonsInfo)(root);
await (0, layout_helpers_1.mGetProjectAddonsInfo)(root, this.project.dependencyMap);
this.enableRegistryCache('projectAddonsInfoInitialized');

@@ -161,0 +161,0 @@ this.project.invalidateRegistry();

@@ -45,7 +45,7 @@ "use strict";

}
async addonServicePaths(root, serviceName) {
return await (0, definition_helpers_1.getAddonPathsForType)(root, 'services', serviceName);
async addonServicePaths(project, serviceName) {
return await (0, definition_helpers_1.getAddonPathsForType)(project, 'services', serviceName);
}
async addonImportPaths(root, pathName) {
return await (0, definition_helpers_1.getAddonImport)(root, pathName);
async addonImportPaths(project, pathName) {
return await (0, definition_helpers_1.getAddonImport)(project, pathName);
}

@@ -88,3 +88,3 @@ classicImportPaths(root, pathName) {

});
const addonImports = await this.resolvers.addonImportPaths(root, importPath);
const addonImports = await this.resolvers.addonImportPaths(this.project, importPath);
addonImports.forEach((pathLocation) => {

@@ -108,3 +108,3 @@ guessedPaths.push(pathLocation);

if (fnName === 'Service') {
const paths = await this.resolvers.addonServicePaths(root, typeName);
const paths = await this.resolvers.addonServicePaths(this.project, typeName);
paths.forEach((item) => {

@@ -111,0 +111,0 @@ guessedPaths.push(item);

@@ -118,3 +118,3 @@ "use strict";

this.enableRegistryCache('componentsRegistryInitialized');
await (0, layout_helpers_1.mGetProjectAddonsInfo)(project.root);
await (0, layout_helpers_1.mGetProjectAddonsInfo)(project.root, project.dependencyMap);
this.enableRegistryCache('projectAddonsInfoInitialized');

@@ -135,3 +135,3 @@ this.project.invalidateRegistry();

if (!this.meta.projectAddonsInfoInitialized) {
await (0, layout_helpers_1.mGetProjectAddonsInfo)(root);
await (0, layout_helpers_1.mGetProjectAddonsInfo)(root, this.project.dependencyMap);
this.enableRegistryCache('projectAddonsInfoInitialized');

@@ -184,3 +184,3 @@ this.project.invalidateRegistry();

if (!this.meta.projectAddonsInfoInitialized) {
await (0, layout_helpers_1.mGetProjectAddonsInfo)(root);
await (0, layout_helpers_1.mGetProjectAddonsInfo)(root, this.project.dependencyMap);
this.enableRegistryCache('projectAddonsInfoInitialized');

@@ -228,3 +228,3 @@ this.project.invalidateRegistry();

if (!this.meta.projectAddonsInfoInitialized) {
await (0, layout_helpers_1.mGetProjectAddonsInfo)(root);
await (0, layout_helpers_1.mGetProjectAddonsInfo)(root, this.project.dependencyMap);
this.enableRegistryCache('projectAddonsInfoInitialized');

@@ -259,3 +259,3 @@ this.project.invalidateRegistry();

if (!this.meta.projectAddonsInfoInitialized) {
await (0, layout_helpers_1.mGetProjectAddonsInfo)(this.project.root);
await (0, layout_helpers_1.mGetProjectAddonsInfo)(this.project.root, this.project.dependencyMap);
this.enableRegistryCache('projectAddonsInfoInitialized');

@@ -349,3 +349,3 @@ this.project.invalidateRegistry();

if (!this.meta.projectAddonsInfoInitialized) {
await (0, layout_helpers_1.mGetProjectAddonsInfo)(root);
await (0, layout_helpers_1.mGetProjectAddonsInfo)(root, this.project.dependencyMap);
this.enableRegistryCache('projectAddonsInfoInitialized');

@@ -352,0 +352,0 @@ this.project.invalidateRegistry();

@@ -68,2 +68,4 @@ 'use strict';

});
(0, logger_1.logInfo)(`ELS: Found ${roots.length} roots for ${workspaceRoot}`);
const start = Date.now();
for (const rootPath of roots) {

@@ -86,2 +88,3 @@ const filePath = path.join(workspaceRoot, rootPath);

}
(0, logger_1.logInfo)(`ELS: iterating roots took ${Date.now() - start}ms`);
}

@@ -100,2 +103,3 @@ async initialize(workspaceRoot) {

const project = this.projects.get(projectPath);
(0, logger_1.logInfo)(`Project already existed at ${projectPath}`);
return {

@@ -128,6 +132,8 @@ initIssues: project.initIssues,

}
(0, logger_1.logInfo)(`Initializing new project at ${projectPath} with ${this.localAddons.length} ELS addons.`);
const project = new project_1.Project(projectPath, this.localAddons, info);
const start = Date.now();
await project.initialize(this.server);
this.projects.set(projectPath, project);
(0, logger_1.logInfo)(`Ember CLI project added at ${projectPath}`);
(0, logger_1.logInfo)(`Ember CLI project added at ${projectPath}. (took ${Date.now() - start}ms)`);
await project.init(this.server);

@@ -134,0 +140,0 @@ return {

@@ -22,2 +22,5 @@ "use strict";

this.root = root;
// Don't traverse dependencies we've already seen.
// correct package graph can sort of throw us in to cycles if we don't keep track of this.
this.dependencyMap = new Map();
this.addonsMeta = [];

@@ -136,3 +139,3 @@ this.dependenciesMeta = [];

else if (server.options.type === 'node') {
this.providers = await (0, addon_api_1.collectProjectProviders)(this.root, this.addons);
this.providers = await (0, addon_api_1.collectProjectProviders)(this.root, this.addons, this.dependencyMap);
}

@@ -139,0 +142,0 @@ else {

@@ -143,6 +143,8 @@ /* --------------------------------------------------------------------------------------------

async executeInitializers() {
(0, logger_1.logInfo)('UELS: executeInitializers');
(0, logger_1.logInfo)('ELS: executeInitializers');
(0, logger_1.logInfo)(`ELS: ${this.initializers.length} initializers`);
for (const initializer of this.initializers) {
await initializer();
}
(0, logger_1.logInfo)(`ELS: clearing initializers because they've been initialized`);
this.initializers = [];

@@ -185,3 +187,3 @@ }

}
await (0, layout_helpers_1.mGetProjectAddonsInfo)(project.root);
await (0, layout_helpers_1.mGetProjectAddonsInfo)(project.root, project.dependencyMap);
project.invalidateRegistry();

@@ -391,3 +393,5 @@ return {

this.initializers.push(async () => {
var _a;
await this.projectRoots.initialize(rootPath);
(0, logger_1.logInfo)(`Found ${(_a = workspaceFolders === null || workspaceFolders === void 0 ? void 0 : workspaceFolders.length) !== null && _a !== void 0 ? _a : 0} workspace folders for ${rootPath}`);
if (workspaceFolders && Array.isArray(workspaceFolders)) {

@@ -394,0 +398,0 @@ for (const folder of workspaceFolders) {

@@ -47,3 +47,3 @@ import { Location, TextDocumentIdentifier, Command, CodeActionParams, CodeAction, Position, CompletionItem, Hover } from 'vscode-languageserver/node';

export declare function isConstructor(obj: any): boolean;
export declare function collectProjectProviders(root: string, addons: string[]): Promise<ProjectProviders>;
export declare function collectProjectProviders(root: string, addons: string[], dependencyMap: Project['dependencyMap']): Promise<ProjectProviders>;
export declare type AddonMeta = {

@@ -50,0 +50,0 @@ root: string;

@@ -100,4 +100,10 @@ "use strict";

}
async function collectProjectProviders(root, addons) {
const [projectAddonsRoots, projectInRepoAddonsRoots] = await Promise.all([(0, layout_helpers_1.getProjectAddonsRoots)(root), (0, layout_helpers_1.getProjectInRepoAddonsRoots)(root)]);
async function collectProjectProviders(root, addons, dependencyMap) {
const time = (0, logger_1.instrumentTime)(`collectProjectProviders(${root})`);
time.log(`Starting`);
const [projectAddonsRoots, projectInRepoAddonsRoots] = await Promise.all([
(0, layout_helpers_1.getProjectAddonsRoots)(root, dependencyMap),
(0, layout_helpers_1.getProjectInRepoAddonsRoots)(root, dependencyMap),
]);
time.log(`found roots`);
const roots = addons

@@ -134,2 +140,3 @@ .concat([root])

}
time.log(`found ELS addons`);
const result = emptyProjectProviders({

@@ -224,2 +231,3 @@ addonsMeta,

});
time.log(`finished crawling dagMap`);
return result;

@@ -226,0 +234,0 @@ }

import { Location } from 'vscode-languageserver/node';
import { Project } from '..';
export declare function pathsToLocations(...paths: string[]): Location[];

@@ -12,3 +13,3 @@ export declare function getFirstTextPosition(text: string, content: string): number[];

export declare function getPathsForComponentTemplates(root: string, maybeComponentName: string): string[];
export declare function getAddonImport(root: string, importPath: string): Promise<string[]>;
export declare function getAddonPathsForType(root: string, collection: 'services' | 'models' | 'modifiers' | 'helpers' | 'routes', name: string): Promise<string[]>;
export declare function getAddonImport(project: Project, importPath: string): Promise<string[]>;
export declare function getAddonPathsForType(project: Project, collection: 'services' | 'models' | 'modifiers' | 'helpers' | 'routes', name: string): Promise<string[]>;

@@ -144,3 +144,4 @@ "use strict";

exports.getPathsForComponentTemplates = getPathsForComponentTemplates;
async function getAddonImport(root, importPath) {
async function getAddonImport(project, importPath) {
const { root, dependencyMap } = project;
const importParts = importPath.split('/');

@@ -155,3 +156,3 @@ let addonName = importParts.shift();

const items = [];
const [addonRoots, inRepoRoots] = await Promise.all([mProjectAddonsRoots(root), mProjectInRepoAddonsRoots(root)]);
const [addonRoots, inRepoRoots] = await Promise.all([mProjectAddonsRoots(root, dependencyMap), mProjectInRepoAddonsRoots(root, dependencyMap)]);
const roots = items.concat(addonRoots, inRepoRoots);

@@ -194,5 +195,6 @@ let existingPaths = [];

exports.getAddonImport = getAddonImport;
async function getAddonPathsForType(root, collection, name) {
async function getAddonPathsForType(project, collection, name) {
const { root, dependencyMap } = project;
const items = [];
const [addonRoots, inRepoRoots] = await Promise.all([mProjectAddonsRoots(root), mProjectInRepoAddonsRoots(root)]);
const [addonRoots, inRepoRoots] = await Promise.all([mProjectAddonsRoots(root, dependencyMap), mProjectInRepoAddonsRoots(root, dependencyMap)]);
const roots = items.concat(addonRoots, inRepoRoots);

@@ -199,0 +201,0 @@ let existingPaths = [];

import * as memoize from 'memoizee';
import { CompletionItem } from 'vscode-languageserver/node';
import { BaseProject } from '../base-project';
import { Project } from '../project';
export declare const ADDON_CONFIG_KEY = "ember-language-server";

@@ -49,6 +50,6 @@ export declare function asyncFilter<T>(arr: T[], predicate: (value: unknown) => Promise<boolean | undefined>): Promise<T[]>;

};
export declare function getProjectInRepoAddonsRoots(root: string): Promise<string[]>;
export declare function getProjectInRepoAddonsRoots(root: string, dependencyMap: Project['dependencyMap']): Promise<string[]>;
export declare function getDepIfExists(pack: PackageInfo, depName: string): string | null;
export declare function isGlimmerXProject(root: string): Promise<boolean>;
export declare function getProjectAddonsRoots(root: string, resolvedItems?: string[], packageFolderName?: string): Promise<string[]>;
export declare function getProjectAddonsRoots(root: string, dependencyMap: Project['dependencyMap'], resolvedItems?: string[], packageFolderName?: string): Promise<string[]>;
export declare function asyncGetPackageJSON(file: string): Promise<PackageInfo>;

@@ -64,3 +65,3 @@ export declare function asyncGetJSON(filePath: string): Promise<PackageInfo>;

export declare function hasAddonFolderInPath(name: string): boolean;
export declare function getProjectAddonsInfo(root: string): Promise<void>;
export declare function getProjectAddonsInfo(root: string, dependencyMap: Project['dependencyMap']): Promise<void>;
export declare function listPodsComponents(project: BaseProject): Promise<void>;

@@ -67,0 +68,0 @@ export declare function builtinModifiers(): CompletionItem[];

@@ -12,2 +12,3 @@ "use strict";

const walk_async_1 = require("./walk-async");
const logger_1 = require("./logger");
// const GLOBAL_REGISTRY = ['primitive-name'][['relatedFiles']];

@@ -157,4 +158,14 @@ exports.ADDON_CONFIG_KEY = 'ember-language-server';

exports.cached = cached;
async function getRecursiveInRepoAddonRoots(root, roots) {
const packageData = await asyncGetPackageJSON(root);
async function getRecursiveInRepoAddonRoots(root, dependencyMap, roots) {
let fastPackage = null;
for (const dependencyMapItem of dependencyMap) {
if (dependencyMapItem[1].root === root) {
fastPackage = dependencyMapItem[1].package;
break;
}
}
const packageData = fastPackage || (await asyncGetPackageJSON(root));
// names are required for packages
if (!packageData.name)
return [];
const emberAddonPaths = (packageData['ember-addon'] && packageData['ember-addon'].paths) || [];

@@ -170,3 +181,16 @@ if (roots.length) {

for (const validRoot of validPaths) {
const packInfo = await asyncGetPackageJSON(validRoot);
let fastPackage = null;
for (const dependencyMapItem of dependencyMap) {
if (dependencyMapItem[1].root === validRoot) {
fastPackage = dependencyMapItem[1].package;
break;
}
}
const packInfo = fastPackage || (await asyncGetPackageJSON(validRoot));
// names are required for packages
if (!packInfo.name)
continue;
if (!fastPackage) {
dependencyMap.set(packInfo.name, { root: validRoot, package: packInfo });
}
// we don't need to go deeper if package itself not an ember-addon or els-extension

@@ -178,3 +202,3 @@ if (!isEmberAddon(packInfo) && !hasEmberLanguageServerExtension(packInfo)) {

recursiveRoots.push(validRoot);
const items = await getRecursiveInRepoAddonRoots(validRoot, recursiveRoots);
const items = await getRecursiveInRepoAddonRoots(validRoot, dependencyMap, recursiveRoots);
items.forEach((relatedRoot) => {

@@ -189,4 +213,6 @@ if (!recursiveRoots.includes(relatedRoot)) {

}
async function getProjectInRepoAddonsRoots(root) {
const roots = await getRecursiveInRepoAddonRoots(root, []);
async function getProjectInRepoAddonsRoots(root, dependencyMap) {
const time = (0, logger_1.instrumentTime)(`getProjectInRepoAddonsRoots(${root})`);
const roots = await getRecursiveInRepoAddonRoots(root, dependencyMap, []);
time.log(`finished getRecursiveInRepoAddonRoots`);
return Array.from(new Set(roots));

@@ -222,4 +248,16 @@ }

exports.isGlimmerXProject = isGlimmerXProject;
async function getProjectAddonsRoots(root, resolvedItems = [], packageFolderName = 'node_modules') {
const pack = await asyncGetPackageJSON(root);
async function getProjectAddonsRoots(root, dependencyMap, resolvedItems = [], packageFolderName = 'node_modules') {
const time = (0, logger_1.instrumentTime)(`getProjectInRepoAddonsRoots(${root})`);
let fastPackage = null;
for (const dependencyMapItem of dependencyMap) {
if (dependencyMapItem[1].root === root) {
fastPackage = dependencyMapItem[1].package;
break;
}
}
const pack = fastPackage || (await asyncGetPackageJSON(root));
if (!pack.name) {
(0, logger_1.logDebugInfo)('no name', root, JSON.stringify(pack), Array.from(dependencyMap), resolvedItems);
return [];
}
if (resolvedItems.length) {

@@ -235,9 +273,23 @@ if (!isEmberAddon(pack)) {

const rawRoots = await Promise.all(items.map(async (item) => {
return await resolvePackageRoot(root, item, packageFolderName);
var _a;
if (dependencyMap.has(item)) {
return [item, (_a = dependencyMap.get(item).root) !== null && _a !== void 0 ? _a : false];
}
const packageRoot = await resolvePackageRoot(root, item, packageFolderName);
return [item, packageRoot];
}));
const roots = rawRoots.filter((p) => {
const _roots = rawRoots.filter(([, p]) => {
return p !== false;
});
const recursiveRoots = resolvedItems.slice(0);
const packages = await Promise.all(roots.map((root) => asyncGetPackageJSON(root)));
const packages = await Promise.all(_roots.map(async ([packageName, packageRoot]) => {
const mappedValue = dependencyMap.get(packageName);
if (mappedValue) {
return mappedValue.package;
}
const packInfo = await asyncGetPackageJSON(packageRoot);
dependencyMap.set(packageName, { root: packageRoot, package: packInfo });
return packInfo;
}));
const roots = _roots.map(([, p]) => p);
for (const rootItem of roots) {

@@ -251,3 +303,3 @@ const packInfo = packages[roots.indexOf(rootItem)];

recursiveRoots.push(rootItem);
const addonRoots = await getProjectAddonsRoots(rootItem, recursiveRoots, packageFolderName);
const addonRoots = await getProjectAddonsRoots(rootItem, dependencyMap, recursiveRoots, packageFolderName);
addonRoots.forEach((item) => {

@@ -260,2 +312,3 @@ if (!recursiveRoots.includes(item)) {

}
time.log(`Finished looping over ${roots.length} roots`);
return recursiveRoots;

@@ -330,5 +383,8 @@ }

exports.hasAddonFolderInPath = hasAddonFolderInPath;
async function getProjectAddonsInfo(root) {
async function getProjectAddonsInfo(root, dependencyMap) {
var _a, _b;
const [projectAddonsRoots, projectInRepoAddonsRoots] = await Promise.all([getProjectAddonsRoots(root), getProjectInRepoAddonsRoots(root)]);
const [projectAddonsRoots, projectInRepoAddonsRoots] = await Promise.all([
getProjectAddonsRoots(root, dependencyMap),
getProjectInRepoAddonsRoots(root, dependencyMap),
]);
const roots = [].concat(projectAddonsRoots, projectInRepoAddonsRoots).filter((pathItem) => typeof pathItem === 'string');

@@ -335,0 +391,0 @@ for (const packagePath of roots) {

@@ -6,2 +6,6 @@ import { RemoteConsole } from 'vscode-languageserver/node';

export declare function logInfo(str: string): void;
export declare function instrumentTime(label: string): {
reset: () => void;
log: (msg: string) => void;
};
export declare function setConsole(item: RemoteConsole | null): void;

@@ -8,0 +12,0 @@ export declare function safeStringify(obj: unknown, indent?: number): string;

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.log = exports.logDebugInfo = exports.safeStringify = exports.setConsole = exports.logInfo = exports.logError = void 0;
exports.log = exports.logDebugInfo = exports.safeStringify = exports.setConsole = exports.instrumentTime = exports.logInfo = exports.logError = void 0;
const util = require("util");

@@ -38,2 +38,17 @@ const path_1 = require("path");

exports.logInfo = logInfo;
function instrumentTime(label) {
let last = Date.now();
return {
reset: () => {
last = Date.now();
},
log: (msg) => {
const now = Date.now();
const diff = now - last;
last = now;
logInfo(`[${label}] +${diff}ms :: ${msg}`);
},
};
}
exports.instrumentTime = instrumentTime;
function setConsole(item) {

@@ -40,0 +55,0 @@ remoteConsole = item;

@@ -23,3 +23,3 @@ "use strict";

};
this.ignores = ['/tmp/', '/dist/', '/.git/'];
this.ignores = ['/tmp/', '/dist/', '/.git/', '/.embroider/'];
}

@@ -26,0 +26,0 @@ setIgnores(ignores) {

{
"name": "@ember-tooling/ember-language-server",
"description": "A language server implementation for Ember.js projects.",
"version": "2.30.3",
"version": "2.30.4",
"contributors": [

@@ -6,0 +6,0 @@ "Aleksandr Kanunnikov <lifeart92@gmail.com>"

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet