code-languages 1.42.5 → 1.43.1

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.md CHANGED
@@ -430,6 +430,37 @@ api.related("typescript").langs().get(); // JavaScript
430
430
  api.related("sql").langs().get(); // T-SQL, PL/SQL, PL/pgSQL, PRQL
431
431
  ```
432
432
 
433
+ Filters compose. Every language collection is chainable: call `.category()`, `.paradigm()`, `.runtime()`,
434
+ `.packageManager()`, `.ecosystem()`, `.extension()`, `.status()`, or `.related()` on any
435
+ `langs()`, `languages()`, `search()`, or `detectAll()` result to intersect filters.
436
+ Order does not matter, and `.locale()` can be set at any point in the chain:
437
+
438
+ ```ts
439
+ import { api } from "code-languages/api";
440
+
441
+ // Backend languages that are also functional
442
+ api.category("backend").langs().paradigm("functional").get(); // Elixir, Erlang, ...
443
+
444
+ // Active languages that run on Node.js, localized
445
+ api.languages().runtime("node").status("active").locale("es").get();
446
+
447
+ // Systems languages registering the .h extension
448
+ api.category("systems").langs().extension(".h").get(); // C, C++
449
+
450
+ // Ranked search narrowed by lifecycle status
451
+ api.search("script").status("active").get();
452
+ ```
453
+
454
+ Collections also offer cheap helpers that skip localization: `.slugs()` returns the
455
+ matching catalog slugs, `.count()` the number of matches, and `.first()` the first
456
+ match localized (or `undefined` when the collection is empty):
457
+
458
+ ```ts
459
+ api.category("backend").langs().paradigm("functional").slugs(); // ["clojure", "elixir", ...]
460
+ api.runtime("node").langs().count(); // number of matching languages
461
+ api.search("golang").first()?.slug; // "go"
462
+ ```
463
+
433
464
  ## Supported Languages
434
465
 
435
466
  The catalog currently includes 313 language entries. Each row can be imported directly
@@ -619,7 +650,7 @@ from its package subpath.
619
650
  | <img src="https://upload.wikimedia.org/wikipedia/commons/c/c5/Nginx_logo.svg" alt="nginx logo" width="24" height="24"> | nginx | `nginx` | `nginx.conf`, `.nginx`, `.conf` | `1.30.4` | `code-languages/nginx` |
620
651
  | <img src="https://avatars.githubusercontent.com/u/83021462?v=4" alt="Nickel logo" width="24" height="24"> | Nickel | `nickel` | `.ncl` | `1.17.0` | `code-languages/nickel` |
621
652
  | <img src="https://cdn.simpleicons.org/nim/FFE953" alt="Nim logo" width="24" height="24"> | Nim | `nim` | `.nim`, `.nims`, `.nimble` | `2.2.10` | `code-languages/nim` |
622
- | <img src="https://cdn.simpleicons.org/nixos/5277C3" alt="Nix logo" width="24" height="24"> | Nix | `nix` | `.nix` | `2.34.8` | `code-languages/nix` |
653
+ | <img src="https://cdn.simpleicons.org/nixos/5277C3" alt="Nix logo" width="24" height="24"> | Nix | `nix` | `.nix` | `2.35.2` | `code-languages/nix` |
623
654
  | <img src="https://avatars.githubusercontent.com/u/72610319?v=4" alt="Noir logo" width="24" height="24"> | Noir | `noir` | `.nr` | `1.0.0-beta` | `code-languages/noir` |
624
655
  | <img src="https://cdn.simpleicons.org/nunjucks/1C4A1C" alt="Nunjucks logo" width="24" height="24"> | Nunjucks | `nunjucks` | `.njk`, `.nunjucks` | `3.2.4` | `code-languages/nunjucks` |
625
656
  | <img src="https://cdn.simpleicons.org/nushell/3AA675" alt="Nushell logo" width="24" height="24"> | Nushell | `nushell` | `.nu` | `0.114.1` | `code-languages/nushell` |
@@ -1,7 +1,13 @@
1
1
  import { L as LanguageSlug } from './registry-DftZRMv6.js';
2
- import { f as Locale, g as LocalizedLanguage, c as LanguageStatus } from './types-BRDmsib7.js';
2
+ import { f as Locale, c as LanguageStatus, g as LocalizedLanguage } from './types-BRDmsib7.js';
3
3
 
4
4
  type LanguageCategory = 'frontend' | 'backend' | 'fullstack' | 'systems' | 'data-science' | 'scripting' | 'other';
5
+ interface CategoryInfo {
6
+ slug: LanguageCategory;
7
+ name: string;
8
+ description: string;
9
+ aliases: string[];
10
+ }
5
11
  declare function getCategories(): LanguageCategory[];
6
12
 
7
13
  interface EcosystemInfo {
@@ -79,6 +85,8 @@ interface RuntimeRequest {
79
85
  info(): RuntimeInfo | undefined;
80
86
  /** Languages that run on or target this platform. */
81
87
  langs(): LanguageCollectionRequest;
88
+ /** Package managers available on this runtime platform. */
89
+ packageManagers(): PackageManagerInfo[];
82
90
  }
83
91
  interface PackageManagerRequest {
84
92
  /** Metadata about the matched package manager. Returns undefined for unknown values. */
@@ -89,6 +97,8 @@ interface PackageManagerRequest {
89
97
  runtimes(): RuntimeInfo[];
90
98
  }
91
99
  interface CategoryRequest {
100
+ /** Metadata about the matched category. Returns undefined for unknown values. */
101
+ info(): CategoryInfo | undefined;
92
102
  /** Languages that belong to this category. */
93
103
  langs(): LanguageCollectionRequest;
94
104
  }
@@ -121,6 +131,28 @@ interface LanguageCollectionRequest {
121
131
  * Sets the requested locale for every language returned by this collection lookup.
122
132
  */
123
133
  locale(locale: Locale): LanguageCollectionRequest;
134
+ /** Narrows the collection to languages that belong to the given category. */
135
+ category(value: LanguageCategory): LanguageCollectionRequest;
136
+ /** Narrows the collection to languages that use the given programming paradigm. */
137
+ paradigm(value: string): LanguageCollectionRequest;
138
+ /** Narrows the collection to languages that run on or target the given platform. */
139
+ runtime(value: string): LanguageCollectionRequest;
140
+ /** Narrows the collection to languages that use the given package manager. */
141
+ packageManager(value: string): LanguageCollectionRequest;
142
+ /** Narrows the collection to languages that belong to the given ecosystem. */
143
+ ecosystem(value: string): LanguageCollectionRequest;
144
+ /** Narrows the collection to languages registering the given extension or exact filename. */
145
+ extension(value: string): LanguageCollectionRequest;
146
+ /** Narrows the collection to languages with the given lifecycle status. */
147
+ status(value: LanguageStatus): LanguageCollectionRequest;
148
+ /** Narrows the collection to languages related to the given language through `relations`. */
149
+ related(slug: RuntimeLanguageSlug): LanguageCollectionRequest;
150
+ /** Lists the matching catalog slugs without localizing. */
151
+ slugs(): string[];
152
+ /** Counts the matching languages without localizing. */
153
+ count(): number;
154
+ /** Reads the first matching language from the in-memory catalog and localizes it. */
155
+ first(): LocalizedLanguage | undefined;
124
156
  /**
125
157
  * Reads every language from the in-memory catalog and localizes the result.
126
158
  */
@@ -135,6 +167,14 @@ interface LanguageCollectionRequest {
135
167
  *
136
168
  * Use `.get()` for synchronous catalog access or `.load()` to dynamically import only the
137
169
  * requested language modules.
170
+ *
171
+ * Language collections compose: chain `.category()`, `.paradigm()`, `.runtime()`,
172
+ * `.packageManager()`, `.ecosystem()`, `.extension()`, `.status()`, or `.related()` on any
173
+ * collection to intersect filters.
174
+ *
175
+ * @example
176
+ * api.category('backend').langs().paradigm('functional').get();
177
+ * api.languages().runtime('node').status('active').locale('es').get();
138
178
  */
139
179
  declare const api: {
140
180
  /**
@@ -215,6 +255,7 @@ declare const api: {
215
255
  * @example
216
256
  * api.runtime('node').langs().locale('es').get();
217
257
  * api.runtime('.net').info();
258
+ * api.runtime('node').packageManagers();
218
259
  */
219
260
  runtime(value: string): RuntimeRequest;
220
261
  /**
@@ -244,6 +285,7 @@ declare const api: {
244
285
  *
245
286
  * @example
246
287
  * api.category('backend').langs().locale('es').get();
288
+ * api.category('backend').info();
247
289
  * await api.category('data-science').langs().load();
248
290
  */
249
291
  category(value: LanguageCategory): CategoryRequest;
@@ -279,4 +321,4 @@ declare const api: {
279
321
  /** Lists every lifecycle status usable with `api.status()`. */
280
322
  declare function getStatuses(): LanguageStatus[];
281
323
 
282
- export { type CategoryRequest as C, type EcosystemInfo as E, type LanguageCategory as L, type PackageManagerInfo as P, type RelatedRequest as R, type StatusRequest as S, type EcosystemRequest as a, type ExtensionRequest as b, type ParadigmInfo as c, type ParadigmRequest as d, type ResolvedLanguageRequest as e, type RuntimeInfo as f, api as g, getCategories as h, getEcosystems as i, getPackageManagers as j, getParadigms as k, getRuntimes as l, getStatuses as m, type LanguageCollectionRequest as n, type LanguageRequest as o, type PackageManagerRequest as p, type RuntimeRequest as q };
324
+ export { type CategoryInfo as C, type EcosystemInfo as E, type LanguageCategory as L, type PackageManagerInfo as P, type RelatedRequest as R, type StatusRequest as S, type CategoryRequest as a, type EcosystemRequest as b, type ExtensionRequest as c, type ParadigmInfo as d, type ParadigmRequest as e, type ResolvedLanguageRequest as f, type RuntimeInfo as g, api as h, getCategories as i, getEcosystems as j, getPackageManagers as k, getParadigms as l, getRuntimes as m, getStatuses as n, type LanguageCollectionRequest as o, type LanguageRequest as p, type PackageManagerRequest as q, type RuntimeRequest as r };
@@ -1,7 +1,13 @@
1
1
  import { L as LanguageSlug } from './registry-DftZRMv6.cjs';
2
- import { f as Locale, g as LocalizedLanguage, c as LanguageStatus } from './types-BRDmsib7.cjs';
2
+ import { f as Locale, c as LanguageStatus, g as LocalizedLanguage } from './types-BRDmsib7.cjs';
3
3
 
4
4
  type LanguageCategory = 'frontend' | 'backend' | 'fullstack' | 'systems' | 'data-science' | 'scripting' | 'other';
5
+ interface CategoryInfo {
6
+ slug: LanguageCategory;
7
+ name: string;
8
+ description: string;
9
+ aliases: string[];
10
+ }
5
11
  declare function getCategories(): LanguageCategory[];
6
12
 
7
13
  interface EcosystemInfo {
@@ -79,6 +85,8 @@ interface RuntimeRequest {
79
85
  info(): RuntimeInfo | undefined;
80
86
  /** Languages that run on or target this platform. */
81
87
  langs(): LanguageCollectionRequest;
88
+ /** Package managers available on this runtime platform. */
89
+ packageManagers(): PackageManagerInfo[];
82
90
  }
83
91
  interface PackageManagerRequest {
84
92
  /** Metadata about the matched package manager. Returns undefined for unknown values. */
@@ -89,6 +97,8 @@ interface PackageManagerRequest {
89
97
  runtimes(): RuntimeInfo[];
90
98
  }
91
99
  interface CategoryRequest {
100
+ /** Metadata about the matched category. Returns undefined for unknown values. */
101
+ info(): CategoryInfo | undefined;
92
102
  /** Languages that belong to this category. */
93
103
  langs(): LanguageCollectionRequest;
94
104
  }
@@ -121,6 +131,28 @@ interface LanguageCollectionRequest {
121
131
  * Sets the requested locale for every language returned by this collection lookup.
122
132
  */
123
133
  locale(locale: Locale): LanguageCollectionRequest;
134
+ /** Narrows the collection to languages that belong to the given category. */
135
+ category(value: LanguageCategory): LanguageCollectionRequest;
136
+ /** Narrows the collection to languages that use the given programming paradigm. */
137
+ paradigm(value: string): LanguageCollectionRequest;
138
+ /** Narrows the collection to languages that run on or target the given platform. */
139
+ runtime(value: string): LanguageCollectionRequest;
140
+ /** Narrows the collection to languages that use the given package manager. */
141
+ packageManager(value: string): LanguageCollectionRequest;
142
+ /** Narrows the collection to languages that belong to the given ecosystem. */
143
+ ecosystem(value: string): LanguageCollectionRequest;
144
+ /** Narrows the collection to languages registering the given extension or exact filename. */
145
+ extension(value: string): LanguageCollectionRequest;
146
+ /** Narrows the collection to languages with the given lifecycle status. */
147
+ status(value: LanguageStatus): LanguageCollectionRequest;
148
+ /** Narrows the collection to languages related to the given language through `relations`. */
149
+ related(slug: RuntimeLanguageSlug): LanguageCollectionRequest;
150
+ /** Lists the matching catalog slugs without localizing. */
151
+ slugs(): string[];
152
+ /** Counts the matching languages without localizing. */
153
+ count(): number;
154
+ /** Reads the first matching language from the in-memory catalog and localizes it. */
155
+ first(): LocalizedLanguage | undefined;
124
156
  /**
125
157
  * Reads every language from the in-memory catalog and localizes the result.
126
158
  */
@@ -135,6 +167,14 @@ interface LanguageCollectionRequest {
135
167
  *
136
168
  * Use `.get()` for synchronous catalog access or `.load()` to dynamically import only the
137
169
  * requested language modules.
170
+ *
171
+ * Language collections compose: chain `.category()`, `.paradigm()`, `.runtime()`,
172
+ * `.packageManager()`, `.ecosystem()`, `.extension()`, `.status()`, or `.related()` on any
173
+ * collection to intersect filters.
174
+ *
175
+ * @example
176
+ * api.category('backend').langs().paradigm('functional').get();
177
+ * api.languages().runtime('node').status('active').locale('es').get();
138
178
  */
139
179
  declare const api: {
140
180
  /**
@@ -215,6 +255,7 @@ declare const api: {
215
255
  * @example
216
256
  * api.runtime('node').langs().locale('es').get();
217
257
  * api.runtime('.net').info();
258
+ * api.runtime('node').packageManagers();
218
259
  */
219
260
  runtime(value: string): RuntimeRequest;
220
261
  /**
@@ -244,6 +285,7 @@ declare const api: {
244
285
  *
245
286
  * @example
246
287
  * api.category('backend').langs().locale('es').get();
288
+ * api.category('backend').info();
247
289
  * await api.category('data-science').langs().load();
248
290
  */
249
291
  category(value: LanguageCategory): CategoryRequest;
@@ -279,4 +321,4 @@ declare const api: {
279
321
  /** Lists every lifecycle status usable with `api.status()`. */
280
322
  declare function getStatuses(): LanguageStatus[];
281
323
 
282
- export { type CategoryRequest as C, type EcosystemInfo as E, type LanguageCategory as L, type PackageManagerInfo as P, type RelatedRequest as R, type StatusRequest as S, type EcosystemRequest as a, type ExtensionRequest as b, type ParadigmInfo as c, type ParadigmRequest as d, type ResolvedLanguageRequest as e, type RuntimeInfo as f, api as g, getCategories as h, getEcosystems as i, getPackageManagers as j, getParadigms as k, getRuntimes as l, getStatuses as m, type LanguageCollectionRequest as n, type LanguageRequest as o, type PackageManagerRequest as p, type RuntimeRequest as q };
324
+ export { type CategoryInfo as C, type EcosystemInfo as E, type LanguageCategory as L, type PackageManagerInfo as P, type RelatedRequest as R, type StatusRequest as S, type CategoryRequest as a, type EcosystemRequest as b, type ExtensionRequest as c, type ParadigmInfo as d, type ParadigmRequest as e, type ResolvedLanguageRequest as f, type RuntimeInfo as g, api as h, getCategories as i, getEcosystems as j, getPackageManagers as k, getParadigms as l, getRuntimes as m, getStatuses as n, type LanguageCollectionRequest as o, type LanguageRequest as p, type PackageManagerRequest as q, type RuntimeRequest as r };
package/dist/api.cjs CHANGED
@@ -10756,7 +10756,7 @@ var init_nix = __esm({
10756
10756
  packageManagers: ["nix", "nix flakes"],
10757
10757
  ecosystems: ["Linux", "macOS", "NixOS", "DevOps"]
10758
10758
  },
10759
- version: "2.34.8",
10759
+ version: "2.35.2",
10760
10760
  logo: "https://cdn.simpleicons.org/nixos/5277C3",
10761
10761
  color: "#5277C3",
10762
10762
  i18n: {
@@ -18467,6 +18467,50 @@ var init_zsh = __esm({
18467
18467
  });
18468
18468
 
18469
18469
  // src/domain/category/registry.ts
18470
+ var CATEGORY_REGISTRY = [
18471
+ {
18472
+ slug: "frontend",
18473
+ name: "Frontend",
18474
+ description: "Languages that target the browser only.",
18475
+ aliases: ["frontend", "front-end"]
18476
+ },
18477
+ {
18478
+ slug: "backend",
18479
+ name: "Backend",
18480
+ description: "Languages that run on a server runtime.",
18481
+ aliases: ["backend", "back-end", "server"]
18482
+ },
18483
+ {
18484
+ slug: "fullstack",
18485
+ name: "Fullstack",
18486
+ description: "Languages that target both the browser and a server runtime.",
18487
+ aliases: ["fullstack", "full-stack"]
18488
+ },
18489
+ {
18490
+ slug: "systems",
18491
+ name: "Systems",
18492
+ description: "Low-level, native, and embedded programming languages.",
18493
+ aliases: ["systems", "systems-programming", "low-level"]
18494
+ },
18495
+ {
18496
+ slug: "data-science",
18497
+ name: "Data Science",
18498
+ description: "Languages for data analysis, machine learning, and scientific computing.",
18499
+ aliases: ["data-science", "datascience", "data"]
18500
+ },
18501
+ {
18502
+ slug: "scripting",
18503
+ name: "Scripting",
18504
+ description: "Shell and scripting languages.",
18505
+ aliases: ["scripting", "shell"]
18506
+ },
18507
+ {
18508
+ slug: "other",
18509
+ name: "Other",
18510
+ description: "Languages that do not match any other category.",
18511
+ aliases: ["other"]
18512
+ }
18513
+ ];
18470
18514
  var BROWSER_TARGETS = ["Browser"];
18471
18515
  var SERVER_TARGETS = [
18472
18516
  "Node.js",
@@ -18536,6 +18580,18 @@ function matchesCategory(lang, category) {
18536
18580
  return !browser && !server && !poolMatches(pool, SYSTEMS_TARGETS) && !poolMatches(pool, DATA_TARGETS) && !poolMatches(pool, SCRIPT_TARGETS);
18537
18581
  }
18538
18582
  }
18583
+ function findCategory(value) {
18584
+ const key = value.trim().toLowerCase();
18585
+ return CATEGORY_REGISTRY.find((c2) => c2.aliases.includes(key));
18586
+ }
18587
+ function categoryInfoFromDefinition(def) {
18588
+ return {
18589
+ slug: def.slug,
18590
+ name: def.name,
18591
+ description: def.description,
18592
+ aliases: def.aliases
18593
+ };
18594
+ }
18539
18595
 
18540
18596
  // src/domain/detection/match.ts
18541
18597
  var pathSegmentPattern = /[/\\]/;
@@ -20411,6 +20467,14 @@ function packageManagerInfoFromDefinition(def) {
20411
20467
  aliases: def.aliases
20412
20468
  };
20413
20469
  }
20470
+ function packageManagersForRuntime(names) {
20471
+ const keys = names.map((name) => name.trim().toLowerCase());
20472
+ return PACKAGE_MANAGER_REGISTRY.filter(
20473
+ (pm) => keys.some(
20474
+ (key) => pm.name.toLowerCase() === key || pm.aliases.includes(key) || pm.targets.some((target) => target.toLowerCase() === key)
20475
+ )
20476
+ ).map(packageManagerInfoFromDefinition);
20477
+ }
20414
20478
 
20415
20479
  // src/domain/paradigm/registry.ts
20416
20480
  var PARADIGM_REGISTRY = [
@@ -21079,13 +21143,93 @@ var createLanguageRequest = (getLanguage, loadLanguageModule) => {
21079
21143
  };
21080
21144
  return request;
21081
21145
  };
21146
+ var getLanguageBySlug = (slug) => languageMap.get(slug);
21147
+ var getRelationSlugs = (language) => {
21148
+ const { supersetOf = [], dialectOf = [], compilesTo = [] } = language.relations ?? {};
21149
+ return [...supersetOf, ...dialectOf, ...compilesTo];
21150
+ };
21151
+ var categoryPredicate = (value) => {
21152
+ const resolvedCategory = findCategory(value)?.slug ?? value;
21153
+ return (language) => matchesCategory(language, resolvedCategory);
21154
+ };
21155
+ var paradigmPredicate = (value) => {
21156
+ const targets = findParadigm(value)?.targets ?? [value];
21157
+ return (language) => matchesParadigm(language, targets);
21158
+ };
21159
+ var runtimePredicate = (value) => {
21160
+ const targets = findRuntime(value)?.targets ?? [value];
21161
+ return (language) => matchesRuntime(language, targets);
21162
+ };
21163
+ var packageManagerPredicate = (value) => {
21164
+ const targets = findPackageManager(value)?.targets ?? [value];
21165
+ return (language) => matchesPackageManager(language, targets);
21166
+ };
21167
+ var ecosystemPredicate = (value) => {
21168
+ const targets = findEcosystem(value)?.targets ?? [value];
21169
+ return (language) => matchesEcosystem(language, targets);
21170
+ };
21171
+ var extensionPredicate = (value) => {
21172
+ const normalized = value.trim().toLowerCase();
21173
+ return (language) => language.extensions.some((extension) => {
21174
+ const normalizedExtension = extension.toLowerCase();
21175
+ return normalizedExtension === normalized || normalizedExtension === `.${normalized}`;
21176
+ });
21177
+ };
21178
+ var statusPredicate = (value) => (language) => (language.status ?? "active") === value;
21179
+ var relatedPredicate = (slug) => {
21180
+ const resolvedSlug = resolveLanguageLookup(slug);
21181
+ const source = getLanguageBySlug(resolvedSlug);
21182
+ const outgoing = new Set(source ? getRelationSlugs(source) : []);
21183
+ return (language) => language.slug !== resolvedSlug && (outgoing.has(language.slug) || getRelationSlugs(language).includes(resolvedSlug));
21184
+ };
21082
21185
  var createLanguageCollectionRequest = (getLanguageList, loadLanguageList) => {
21083
21186
  let requestedLocale = defaultLocale;
21187
+ const narrow = (predicate) => {
21188
+ const filtered = () => getLanguageList().filter(predicate);
21189
+ const next = createLanguageCollectionRequest(filtered, async () => {
21190
+ const loaded = await Promise.all(filtered().map((language) => loadLanguage(language.slug)));
21191
+ return loaded.filter((language) => Boolean(language));
21192
+ });
21193
+ return next.locale(requestedLocale);
21194
+ };
21084
21195
  const request = {
21085
21196
  locale(locale) {
21086
21197
  requestedLocale = locale;
21087
21198
  return request;
21088
21199
  },
21200
+ category(value) {
21201
+ return narrow(categoryPredicate(value));
21202
+ },
21203
+ paradigm(value) {
21204
+ return narrow(paradigmPredicate(value));
21205
+ },
21206
+ runtime(value) {
21207
+ return narrow(runtimePredicate(value));
21208
+ },
21209
+ packageManager(value) {
21210
+ return narrow(packageManagerPredicate(value));
21211
+ },
21212
+ ecosystem(value) {
21213
+ return narrow(ecosystemPredicate(value));
21214
+ },
21215
+ extension(value) {
21216
+ return narrow(extensionPredicate(value));
21217
+ },
21218
+ status(value) {
21219
+ return narrow(statusPredicate(value));
21220
+ },
21221
+ related(slug) {
21222
+ return narrow(relatedPredicate(slug));
21223
+ },
21224
+ slugs() {
21225
+ return getLanguageList().map((language) => language.slug);
21226
+ },
21227
+ count() {
21228
+ return getLanguageList().length;
21229
+ },
21230
+ first() {
21231
+ return localizeOptionalLanguage(getLanguageList().at(0), requestedLocale);
21232
+ },
21089
21233
  get() {
21090
21234
  return getLanguageList().map((language) => localizeLanguage(language, requestedLocale));
21091
21235
  },
@@ -21103,17 +21247,20 @@ var createFilteredLanguageCollection = (predicate) => {
21103
21247
  return loaded.filter((language) => Boolean(language));
21104
21248
  });
21105
21249
  };
21250
+ var createGroupSelection = (definition, toInfo, predicate) => ({
21251
+ info() {
21252
+ return definition ? toInfo(definition) : void 0;
21253
+ },
21254
+ langs() {
21255
+ return createFilteredLanguageCollection(predicate);
21256
+ }
21257
+ });
21106
21258
  var loadDetectedLanguages = async (filename) => {
21107
21259
  const detectedLanguages = await Promise.all(
21108
21260
  detectLanguageSlugs(filename).map((slug) => loadLanguage(slug))
21109
21261
  );
21110
21262
  return detectedLanguages.filter((language) => Boolean(language));
21111
21263
  };
21112
- var getLanguageBySlug = (slug) => languageMap.get(slug);
21113
- var getRelationSlugs = (language) => {
21114
- const { supersetOf = [], dialectOf = [], compilesTo = [] } = language.relations ?? {};
21115
- return [...supersetOf, ...dialectOf, ...compilesTo];
21116
- };
21117
21264
  var getDetectedLanguages = (filename) => detectLanguageSlugs(filename).map((slug) => getLanguageBySlug(slug)).filter((language) => Boolean(language));
21118
21265
  var api = {
21119
21266
  /**
@@ -21177,15 +21324,9 @@ var api = {
21177
21324
  * api.extension('ts').langs().locale('es').get();
21178
21325
  */
21179
21326
  extension(value) {
21180
- const normalized = value.trim().toLowerCase();
21181
21327
  return {
21182
21328
  langs() {
21183
- return createFilteredLanguageCollection(
21184
- (language) => language.extensions.some((extension) => {
21185
- const normalizedExtension = extension.toLowerCase();
21186
- return normalizedExtension === normalized || normalizedExtension === `.${normalized}`;
21187
- })
21188
- );
21329
+ return createFilteredLanguageCollection(extensionPredicate(value));
21189
21330
  }
21190
21331
  };
21191
21332
  },
@@ -21241,9 +21382,7 @@ var api = {
21241
21382
  status(value) {
21242
21383
  return {
21243
21384
  langs() {
21244
- return createFilteredLanguageCollection(
21245
- (language) => (language.status ?? "active") === value
21246
- );
21385
+ return createFilteredLanguageCollection(statusPredicate(value));
21247
21386
  }
21248
21387
  };
21249
21388
  },
@@ -21256,14 +21395,9 @@ var api = {
21256
21395
  * api.related('typescript').langs().get(); // JavaScript
21257
21396
  */
21258
21397
  related(slug) {
21259
- const resolvedSlug = resolveLanguageLookup(slug);
21260
21398
  return {
21261
21399
  langs() {
21262
- const source = getLanguageBySlug(resolvedSlug);
21263
- const outgoing = new Set(source ? getRelationSlugs(source) : []);
21264
- return createFilteredLanguageCollection(
21265
- (language) => language.slug !== resolvedSlug && (outgoing.has(language.slug) || getRelationSlugs(language).includes(resolvedSlug))
21266
- );
21400
+ return createFilteredLanguageCollection(relatedPredicate(slug));
21267
21401
  }
21268
21402
  };
21269
21403
  },
@@ -21276,16 +21410,14 @@ var api = {
21276
21410
  * @example
21277
21411
  * api.runtime('node').langs().locale('es').get();
21278
21412
  * api.runtime('.net').info();
21413
+ * api.runtime('node').packageManagers();
21279
21414
  */
21280
21415
  runtime(value) {
21281
21416
  const definition = findRuntime(value);
21282
- const targets = definition?.targets ?? [value];
21283
21417
  return {
21284
- info() {
21285
- return definition ? runtimeInfoFromDefinition(definition) : void 0;
21286
- },
21287
- langs() {
21288
- return createFilteredLanguageCollection((language) => matchesRuntime(language, targets));
21418
+ ...createGroupSelection(definition, runtimeInfoFromDefinition, runtimePredicate(value)),
21419
+ packageManagers() {
21420
+ return definition ? packageManagersForRuntime(definition.packageManagers) : [];
21289
21421
  }
21290
21422
  };
21291
21423
  },
@@ -21303,14 +21435,11 @@ var api = {
21303
21435
  const definition = findPackageManager(value);
21304
21436
  const targets = definition?.targets ?? [value];
21305
21437
  return {
21306
- info() {
21307
- return definition ? packageManagerInfoFromDefinition(definition) : void 0;
21308
- },
21309
- langs() {
21310
- return createFilteredLanguageCollection(
21311
- (language) => matchesPackageManager(language, targets)
21312
- );
21313
- },
21438
+ ...createGroupSelection(
21439
+ definition,
21440
+ packageManagerInfoFromDefinition,
21441
+ packageManagerPredicate(value)
21442
+ ),
21314
21443
  runtimes() {
21315
21444
  return runtimesForPackageManager(targets);
21316
21445
  }
@@ -21332,14 +21461,15 @@ var api = {
21332
21461
  *
21333
21462
  * @example
21334
21463
  * api.category('backend').langs().locale('es').get();
21464
+ * api.category('backend').info();
21335
21465
  * await api.category('data-science').langs().load();
21336
21466
  */
21337
21467
  category(value) {
21338
- return {
21339
- langs() {
21340
- return createFilteredLanguageCollection((language) => matchesCategory(language, value));
21341
- }
21342
- };
21468
+ return createGroupSelection(
21469
+ findCategory(value),
21470
+ categoryInfoFromDefinition,
21471
+ categoryPredicate(value)
21472
+ );
21343
21473
  },
21344
21474
  /**
21345
21475
  * Selects every language that uses the given programming paradigm.
@@ -21352,16 +21482,11 @@ var api = {
21352
21482
  * api.paradigm('oop').info();
21353
21483
  */
21354
21484
  paradigm(value) {
21355
- const definition = findParadigm(value);
21356
- const targets = definition?.targets ?? [value];
21357
- return {
21358
- info() {
21359
- return definition ? paradigmInfoFromDefinition(definition) : void 0;
21360
- },
21361
- langs() {
21362
- return createFilteredLanguageCollection((language) => matchesParadigm(language, targets));
21363
- }
21364
- };
21485
+ return createGroupSelection(
21486
+ findParadigm(value),
21487
+ paradigmInfoFromDefinition,
21488
+ paradigmPredicate(value)
21489
+ );
21365
21490
  },
21366
21491
  /**
21367
21492
  * Selects every language that belongs to the given ecosystem.
@@ -21374,16 +21499,11 @@ var api = {
21374
21499
  * api.ecosystem('blockchain').info();
21375
21500
  */
21376
21501
  ecosystem(value) {
21377
- const definition = findEcosystem(value);
21378
- const targets = definition?.targets ?? [value];
21379
- return {
21380
- info() {
21381
- return definition ? ecosystemInfoFromDefinition(definition) : void 0;
21382
- },
21383
- langs() {
21384
- return createFilteredLanguageCollection((language) => matchesEcosystem(language, targets));
21385
- }
21386
- };
21502
+ return createGroupSelection(
21503
+ findEcosystem(value),
21504
+ ecosystemInfoFromDefinition,
21505
+ ecosystemPredicate(value)
21506
+ );
21387
21507
  },
21388
21508
  /**
21389
21509
  * Detects every matching language for a filename or path.
package/dist/api.d.cts CHANGED
@@ -1,3 +1,3 @@
1
- export { C as CategoryRequest, E as EcosystemInfo, a as EcosystemRequest, b as ExtensionRequest, L as LanguageCategory, n as LanguageCollectionRequest, o as LanguageRequest, p as PackageManagerRequest, c as ParadigmInfo, d as ParadigmRequest, R as RelatedRequest, e as ResolvedLanguageRequest, q as RuntimeRequest, S as StatusRequest, g as api, m as getStatuses } from './api-D10hZgSz.cjs';
1
+ export { C as CategoryInfo, a as CategoryRequest, E as EcosystemInfo, b as EcosystemRequest, c as ExtensionRequest, L as LanguageCategory, o as LanguageCollectionRequest, p as LanguageRequest, q as PackageManagerRequest, d as ParadigmInfo, e as ParadigmRequest, R as RelatedRequest, f as ResolvedLanguageRequest, r as RuntimeRequest, S as StatusRequest, h as api, n as getStatuses } from './api-jHE_4U3C.cjs';
2
2
  export { L as LanguageSlug } from './registry-DftZRMv6.cjs';
3
3
  import './types-BRDmsib7.cjs';
package/dist/api.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { C as CategoryRequest, E as EcosystemInfo, a as EcosystemRequest, b as ExtensionRequest, L as LanguageCategory, n as LanguageCollectionRequest, o as LanguageRequest, p as PackageManagerRequest, c as ParadigmInfo, d as ParadigmRequest, R as RelatedRequest, e as ResolvedLanguageRequest, q as RuntimeRequest, S as StatusRequest, g as api, m as getStatuses } from './api-DfKZeygA.js';
1
+ export { C as CategoryInfo, a as CategoryRequest, E as EcosystemInfo, b as EcosystemRequest, c as ExtensionRequest, L as LanguageCategory, o as LanguageCollectionRequest, p as LanguageRequest, q as PackageManagerRequest, d as ParadigmInfo, e as ParadigmRequest, R as RelatedRequest, f as ResolvedLanguageRequest, r as RuntimeRequest, S as StatusRequest, h as api, n as getStatuses } from './api-CiSr3n5R.js';
2
2
  export { L as LanguageSlug } from './registry-DftZRMv6.js';
3
3
  import './types-BRDmsib7.js';