@ts-for-gir/cli 4.0.0-rc.9 → 4.0.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.
Files changed (31) hide show
  1. package/README.md +43 -3
  2. package/bin/ts-for-gir +454 -129
  3. package/bin/ts-for-gir-gjs +1213 -0
  4. package/package.json +194 -83
  5. package/src/commands/create.ts +84 -12
  6. package/src/commands/index.ts +1 -0
  7. package/src/commands/self-update.ts +142 -0
  8. package/src/config/config-loader.ts +6 -2
  9. package/src/config/defaults.ts +14 -0
  10. package/src/config/options.ts +2 -2
  11. package/src/start.ts +20 -6
  12. package/src/types/command-args.ts +8 -1
  13. package/dist-templates/types-locally/.ts-for-girrc.js +0 -6
  14. package/dist-templates/types-locally/README.md +0 -15
  15. package/dist-templates/types-locally/esbuild.ts +0 -10
  16. package/dist-templates/types-locally/main.ts +0 -21
  17. package/dist-templates/types-locally/package.json +0 -18
  18. package/dist-templates/types-locally/tsconfig.json +0 -17
  19. package/dist-templates/types-npm/README.md +0 -14
  20. package/dist-templates/types-npm/esbuild.ts +0 -10
  21. package/dist-templates/types-npm/main.ts +0 -19
  22. package/dist-templates/types-npm/package.json +0 -23
  23. package/dist-templates/types-npm/tsconfig.json +0 -15
  24. package/dist-templates/types-workspace/.ts-for-girrc.js +0 -12
  25. package/dist-templates/types-workspace/README.md +0 -26
  26. package/dist-templates/types-workspace/package.json +0 -22
  27. package/dist-templates/types-workspace/packages/app/esbuild.ts +0 -10
  28. package/dist-templates/types-workspace/packages/app/main.ts +0 -19
  29. package/dist-templates/types-workspace/packages/app/package.json +0 -23
  30. package/dist-templates/types-workspace/packages/app/tsconfig.json +0 -15
  31. package/dist-templates/types-workspace/tsconfig.json +0 -11
package/bin/ts-for-gir CHANGED
@@ -29,9 +29,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
29
29
  mod
30
30
  ));
31
31
 
32
- // ../../.yarn/cache/lodash-npm-4.18.1-a64c3070ac-306fea53df.zip/node_modules/lodash/lodash.js
32
+ // ../../node_modules/lodash/lodash.js
33
33
  var require_lodash = __commonJS({
34
- "../../.yarn/cache/lodash-npm-4.18.1-a64c3070ac-306fea53df.zip/node_modules/lodash/lodash.js"(exports2, module) {
34
+ "../../node_modules/lodash/lodash.js"(exports2, module) {
35
35
  (function() {
36
36
  var undefined2;
37
37
  var VERSION = "4.18.1";
@@ -3346,7 +3346,7 @@ var require_lodash = __commonJS({
3346
3346
  }
3347
3347
  return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, undefined2, comparator) : [];
3348
3348
  });
3349
- function join17(array, separator) {
3349
+ function join18(array, separator) {
3350
3350
  return array == null ? "" : nativeJoin.call(array, separator);
3351
3351
  }
3352
3352
  function last(array) {
@@ -5270,7 +5270,7 @@ var require_lodash = __commonJS({
5270
5270
  lodash2.isUndefined = isUndefined;
5271
5271
  lodash2.isWeakMap = isWeakMap;
5272
5272
  lodash2.isWeakSet = isWeakSet;
5273
- lodash2.join = join17;
5273
+ lodash2.join = join18;
5274
5274
  lodash2.kebabCase = kebabCase;
5275
5275
  lodash2.last = last;
5276
5276
  lodash2.lastIndexOf = lastIndexOf;
@@ -5527,22 +5527,22 @@ var require_lodash = __commonJS({
5527
5527
  }
5528
5528
  });
5529
5529
 
5530
- // ../../.yarn/cache/lunr-npm-2.3.9-fa3aa9c2d6-f2f6db34c0.zip/node_modules/lunr/lunr.js
5530
+ // ../../node_modules/lunr/lunr.js
5531
5531
  var require_lunr = __commonJS({
5532
- "../../.yarn/cache/lunr-npm-2.3.9-fa3aa9c2d6-f2f6db34c0.zip/node_modules/lunr/lunr.js"(exports2, module) {
5532
+ "../../node_modules/lunr/lunr.js"(exports2, module) {
5533
5533
  (function() {
5534
5534
  var lunr2 = function(config) {
5535
- var builder8 = new lunr2.Builder();
5536
- builder8.pipeline.add(
5535
+ var builder9 = new lunr2.Builder();
5536
+ builder9.pipeline.add(
5537
5537
  lunr2.trimmer,
5538
5538
  lunr2.stopWordFilter,
5539
5539
  lunr2.stemmer
5540
5540
  );
5541
- builder8.searchPipeline.add(
5541
+ builder9.searchPipeline.add(
5542
5542
  lunr2.stemmer
5543
5543
  );
5544
- config.call(builder8, builder8);
5545
- return builder8.build();
5544
+ config.call(builder9, builder9);
5545
+ return builder9.build();
5546
5546
  };
5547
5547
  lunr2.version = "2.3.9";
5548
5548
  lunr2.utils = {};
@@ -6218,12 +6218,12 @@ var require_lunr = __commonJS({
6218
6218
  };
6219
6219
  lunr2.TokenSet._nextId = 1;
6220
6220
  lunr2.TokenSet.fromArray = function(arr) {
6221
- var builder8 = new lunr2.TokenSet.Builder();
6221
+ var builder9 = new lunr2.TokenSet.Builder();
6222
6222
  for (var i = 0, len = arr.length; i < len; i++) {
6223
- builder8.insert(arr[i]);
6223
+ builder9.insert(arr[i]);
6224
6224
  }
6225
- builder8.finish();
6226
- return builder8.root;
6225
+ builder9.finish();
6226
+ return builder9.root;
6227
6227
  };
6228
6228
  lunr2.TokenSet.fromClause = function(clause) {
6229
6229
  if ("editDistance" in clause) {
@@ -7268,7 +7268,7 @@ import { dirname, join } from "node:path";
7268
7268
  import { fileURLToPath } from "node:url";
7269
7269
  function getPackageVersion() {
7270
7270
  if (true) {
7271
- return "4.0.0-rc.9";
7271
+ return "4.0.0";
7272
7272
  }
7273
7273
  const currentModulePath = fileURLToPath(import.meta.url);
7274
7274
  const currentDir = dirname(currentModulePath);
@@ -7879,10 +7879,10 @@ ${"=".repeat(50)}`);
7879
7879
  if (statistics.typeStatistics.commonTypeConflicts.length > 0) {
7880
7880
  console.log(`
7881
7881
  \u2694\uFE0F Type Conflicts:`);
7882
- statistics.typeStatistics.commonTypeConflicts.forEach(({ conflictType, count, examples: examples8 }) => {
7882
+ statistics.typeStatistics.commonTypeConflicts.forEach(({ conflictType, count, examples: examples9 }) => {
7883
7883
  console.log(` ${yellow(conflictType)}: ${count} conflicts`);
7884
- if (examples8.length > 0) {
7885
- console.log(` \u2514\u2500 Examples: ${gray(examples8.join(", "))}`);
7884
+ if (examples9.length > 0) {
7885
+ console.log(` \u2514\u2500 Examples: ${gray(examples9.join(", "))}`);
7886
7886
  }
7887
7887
  });
7888
7888
  }
@@ -8165,7 +8165,7 @@ import { fileURLToPath as fileURLToPath2 } from "node:url";
8165
8165
  var NEW_LINE_REG_EXP = /[\n\r]+/g;
8166
8166
  function getPackageVersion2() {
8167
8167
  if (true) {
8168
- return "4.0.0-rc.9";
8168
+ return "4.0.0";
8169
8169
  }
8170
8170
  try {
8171
8171
  const currentModulePath = fileURLToPath2(import.meta.url);
@@ -8201,7 +8201,7 @@ __export(parser_exports, {
8201
8201
  parseGir: () => parseGir
8202
8202
  });
8203
8203
 
8204
- // ../../.yarn/cache/fast-xml-parser-npm-5.7.2-960de42682-7f32d77127.zip/node_modules/fast-xml-parser/src/util.js
8204
+ // ../../node_modules/fast-xml-parser/src/util.js
8205
8205
  var nameStartChar = ":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
8206
8206
  var nameChar = nameStartChar + "\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
8207
8207
  var nameRegexp = "[" + nameStartChar + "][" + nameChar + "]*";
@@ -8242,7 +8242,7 @@ var DANGEROUS_PROPERTY_NAMES = [
8242
8242
  ];
8243
8243
  var criticalProperties = ["__proto__", "constructor", "prototype"];
8244
8244
 
8245
- // ../../.yarn/cache/fast-xml-parser-npm-5.7.2-960de42682-7f32d77127.zip/node_modules/fast-xml-parser/src/validator.js
8245
+ // ../../node_modules/fast-xml-parser/src/validator.js
8246
8246
  var defaultOptions = {
8247
8247
  allowBooleanAttributes: false,
8248
8248
  //A tag can have attributes without any value
@@ -8548,7 +8548,7 @@ function getPositionFromMatch(match) {
8548
8548
  return match.startIndex + match[1].length;
8549
8549
  }
8550
8550
 
8551
- // ../../.yarn/cache/@nodable-entities-npm-2.1.0-6eb9f06ac0-355c55e82a.zip/node_modules/@nodable/entities/src/entities.js
8551
+ // ../../node_modules/@nodable/entities/src/entities.js
8552
8552
  var BASIC_LATIN = {
8553
8553
  amp: "&",
8554
8554
  AMP: "&",
@@ -9648,7 +9648,7 @@ var COMMON_HTML = {
9648
9648
  frac34: "\xBE"
9649
9649
  };
9650
9650
 
9651
- // ../../.yarn/cache/@nodable-entities-npm-2.1.0-6eb9f06ac0-355c55e82a.zip/node_modules/@nodable/entities/src/EntityDecoder.js
9651
+ // ../../node_modules/@nodable/entities/src/EntityDecoder.js
9652
9652
  var SPECIAL_CHARS = new Set("!?\\\\/[]$%{}^&*()<>|+");
9653
9653
  function validateEntityName(name) {
9654
9654
  if (name[0] === "#") {
@@ -10017,7 +10017,7 @@ var EntityDecoder = class {
10017
10017
  }
10018
10018
  };
10019
10019
 
10020
- // ../../.yarn/cache/fast-xml-parser-npm-5.7.2-960de42682-7f32d77127.zip/node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js
10020
+ // ../../node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js
10021
10021
  var defaultOnDangerousProperty = (name) => {
10022
10022
  if (DANGEROUS_PROPERTY_NAMES.includes(name)) {
10023
10023
  return "__" + name;
@@ -10151,7 +10151,7 @@ var buildOptions = function(options2) {
10151
10151
  return built;
10152
10152
  };
10153
10153
 
10154
- // ../../.yarn/cache/fast-xml-parser-npm-5.7.2-960de42682-7f32d77127.zip/node_modules/fast-xml-parser/src/xmlparser/xmlNode.js
10154
+ // ../../node_modules/fast-xml-parser/src/xmlparser/xmlNode.js
10155
10155
  var METADATA_SYMBOL;
10156
10156
  if (typeof Symbol !== "function") {
10157
10157
  METADATA_SYMBOL = "@@xmlMetadata";
@@ -10185,11 +10185,37 @@ var XmlNode = class {
10185
10185
  }
10186
10186
  };
10187
10187
 
10188
- // ../../.yarn/cache/fast-xml-parser-npm-5.7.2-960de42682-7f32d77127.zip/node_modules/fast-xml-parser/src/xmlparser/DocTypeReader.js
10188
+ // ../../node_modules/xml-naming/src/index.js
10189
+ var nameStartChar10 = ":A-Za-z_\xC0-\xD6\xD8-\xF6\xF8-\u02FF\u0370-\u037D\u037F-\u0486\u0488-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD";
10190
+ var nameChar10 = nameStartChar10 + "\\-\\.\\d\xB7\u0300-\u036F\u203F-\u2040";
10191
+ var nameStartChar11 = ":A-Za-z_\xC0-\u02FF\u0370-\u037D\u037F-\u0486\u0488-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u{10000}-\u{EFFFF}";
10192
+ var nameChar11 = nameStartChar11 + "\\-\\.\\d\xB7\u0300-\u036F\u0487\u203F-\u2040";
10193
+ var buildRegexes = (startChar, char, flags = "") => {
10194
+ const ncStart = startChar.replace(":", "");
10195
+ const ncChar = char.replace(":", "");
10196
+ const ncNamePat = `[${ncStart}][${ncChar}]*`;
10197
+ return {
10198
+ name: new RegExp(`^[${startChar}][${char}]*$`, flags),
10199
+ ncName: new RegExp(`^${ncNamePat}$`, flags),
10200
+ qName: new RegExp(`^${ncNamePat}(?::${ncNamePat})?$`, flags),
10201
+ nmToken: new RegExp(`^[${char}]+$`, flags),
10202
+ nmTokens: new RegExp(`^[${char}]+(?:\\s+[${char}]+)*$`, flags)
10203
+ };
10204
+ };
10205
+ var regexes10 = buildRegexes(nameStartChar10, nameChar10);
10206
+ var regexes11 = buildRegexes(nameStartChar11, nameChar11, "u");
10207
+ var getRegexes = (xmlVersion = "1.0") => xmlVersion === "1.1" ? regexes11 : regexes10;
10208
+ var qName = (str, { xmlVersion = "1.0" } = {}) => getRegexes(xmlVersion).qName.test(str);
10209
+
10210
+ // ../../node_modules/fast-xml-parser/src/xmlparser/DocTypeReader.js
10189
10211
  var DocTypeReader = class {
10190
- constructor(options2) {
10212
+ constructor(options2, xmlVersion) {
10191
10213
  this.suppressValidationErr = !options2;
10192
10214
  this.options = options2;
10215
+ this.xmlVersion = xmlVersion || 1;
10216
+ }
10217
+ setXmlVersion(xmlVersion = 1) {
10218
+ this.xmlVersion = xmlVersion;
10193
10219
  }
10194
10220
  readDocType(xmlData, i) {
10195
10221
  const entities = /* @__PURE__ */ Object.create(null);
@@ -10261,7 +10287,7 @@ var DocTypeReader = class {
10261
10287
  i++;
10262
10288
  }
10263
10289
  let entityName = xmlData.substring(startIndex, i);
10264
- validateEntityName2(entityName);
10290
+ validateEntityName2(entityName, { xmlVersion: this.xmlVersion });
10265
10291
  i = skipWhitespace(xmlData, i);
10266
10292
  if (!this.suppressValidationErr) {
10267
10293
  if (xmlData.substring(i, i + 6).toUpperCase() === "SYSTEM") {
@@ -10287,7 +10313,7 @@ var DocTypeReader = class {
10287
10313
  i++;
10288
10314
  }
10289
10315
  let notationName = xmlData.substring(startIndex, i);
10290
- !this.suppressValidationErr && validateEntityName2(notationName);
10316
+ !this.suppressValidationErr && validateEntityName2(notationName, { xmlVersion: this.xmlVersion });
10291
10317
  i = skipWhitespace(xmlData, i);
10292
10318
  const identifierType = xmlData.substring(i, i + 6).toUpperCase();
10293
10319
  if (!this.suppressValidationErr && identifierType !== "SYSTEM" && identifierType !== "PUBLIC") {
@@ -10336,7 +10362,7 @@ var DocTypeReader = class {
10336
10362
  i++;
10337
10363
  }
10338
10364
  let elementName = xmlData.substring(startIndex, i);
10339
- if (!this.suppressValidationErr && !isName(elementName)) {
10365
+ if (!this.suppressValidationErr && !qName(elementName, { xmlVersion: this.xmlVersion })) {
10340
10366
  throw new Error(`Invalid element name: "${elementName}"`);
10341
10367
  }
10342
10368
  i = skipWhitespace(xmlData, i);
@@ -10369,14 +10395,14 @@ var DocTypeReader = class {
10369
10395
  i++;
10370
10396
  }
10371
10397
  let elementName = xmlData.substring(startIndex, i);
10372
- validateEntityName2(elementName);
10398
+ validateEntityName2(elementName, { xmlVersion: this.xmlVersion });
10373
10399
  i = skipWhitespace(xmlData, i);
10374
10400
  startIndex = i;
10375
10401
  while (i < xmlData.length && !/\s/.test(xmlData[i])) {
10376
10402
  i++;
10377
10403
  }
10378
10404
  let attributeName = xmlData.substring(startIndex, i);
10379
- if (!validateEntityName2(attributeName)) {
10405
+ if (!validateEntityName2(attributeName, { xmlVersion: this.xmlVersion })) {
10380
10406
  throw new Error(`Invalid attribute name: "${attributeName}"`);
10381
10407
  }
10382
10408
  i = skipWhitespace(xmlData, i);
@@ -10397,7 +10423,7 @@ var DocTypeReader = class {
10397
10423
  }
10398
10424
  let notation = xmlData.substring(startIndex2, i);
10399
10425
  notation = notation.trim();
10400
- if (!validateEntityName2(notation)) {
10426
+ if (!validateEntityName2(notation, { xmlVersion: this.xmlVersion })) {
10401
10427
  throw new Error(`Invalid notation name: "${notation}"`);
10402
10428
  }
10403
10429
  allowedNotations.push(notation);
@@ -10454,19 +10480,22 @@ function hasSeq(data, seq, i) {
10454
10480
  }
10455
10481
  return true;
10456
10482
  }
10457
- function validateEntityName2(name) {
10458
- if (isName(name))
10483
+ function validateEntityName2(name, xmlVersion) {
10484
+ if (qName(name, { xmlVersion }))
10459
10485
  return name;
10460
10486
  else
10461
10487
  throw new Error(`Invalid entity name ${name}`);
10462
10488
  }
10463
10489
 
10464
- // ../../.yarn/cache/strnum-npm-2.2.3-3aa06fd3c4-fb70206301.zip/node_modules/strnum/strnum.js
10490
+ // ../../node_modules/strnum/strnum.js
10465
10491
  var hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;
10492
+ var binRegex = /^0b[01]+$/;
10493
+ var octRegex = /^0o[0-7]+$/;
10466
10494
  var numRegex = /^([\-\+])?(0*)([0-9]*(\.[0-9]*)?)$/;
10467
10495
  var consider = {
10468
10496
  hex: true,
10469
- // oct: false,
10497
+ binary: false,
10498
+ octal: false,
10470
10499
  leadingZeros: true,
10471
10500
  decimalPoint: ".",
10472
10501
  eNotation: true,
@@ -10483,6 +10512,10 @@ function toNumber(str, options2 = {}) {
10483
10512
  else if (trimmedStr === "0") return 0;
10484
10513
  else if (options2.hex && hexRegex.test(trimmedStr)) {
10485
10514
  return parse_int(trimmedStr, 16);
10515
+ } else if (options2.binary && binRegex.test(trimmedStr)) {
10516
+ return parse_int(trimmedStr, 2);
10517
+ } else if (options2.octal && octRegex.test(trimmedStr)) {
10518
+ return parse_int(trimmedStr, 8);
10486
10519
  } else if (!isFinite(trimmedStr)) {
10487
10520
  return handleInfinity(str, Number(trimmedStr), options2);
10488
10521
  } else if (trimmedStr.includes("e") || trimmedStr.includes("E")) {
@@ -10562,6 +10595,8 @@ function trimZeros(numStr) {
10562
10595
  return numStr;
10563
10596
  }
10564
10597
  function parse_int(numStr, base) {
10598
+ const str = numStr.trim();
10599
+ if (base === 2 || base === 8) numStr = str.substring(2);
10565
10600
  if (parseInt) return parseInt(numStr, base);
10566
10601
  else if (Number.parseInt) return Number.parseInt(numStr, base);
10567
10602
  else if (window && window.parseInt) return window.parseInt(numStr, base);
@@ -10583,7 +10618,7 @@ function handleInfinity(str, num, options2) {
10583
10618
  }
10584
10619
  }
10585
10620
 
10586
- // ../../.yarn/cache/fast-xml-parser-npm-5.7.2-960de42682-7f32d77127.zip/node_modules/fast-xml-parser/src/ignoreAttributes.js
10621
+ // ../../node_modules/fast-xml-parser/src/ignoreAttributes.js
10587
10622
  function getIgnoreAttributesFn(ignoreAttributes) {
10588
10623
  if (typeof ignoreAttributes === "function") {
10589
10624
  return ignoreAttributes;
@@ -10603,7 +10638,7 @@ function getIgnoreAttributesFn(ignoreAttributes) {
10603
10638
  return () => false;
10604
10639
  }
10605
10640
 
10606
- // ../../.yarn/cache/path-expression-matcher-npm-1.5.0-73d258a112-28303bb9ee.zip/node_modules/path-expression-matcher/src/Expression.js
10641
+ // ../../node_modules/path-expression-matcher/src/Expression.js
10607
10642
  var Expression = class {
10608
10643
  /**
10609
10644
  * Create a new Expression
@@ -10766,7 +10801,7 @@ var Expression = class {
10766
10801
  }
10767
10802
  };
10768
10803
 
10769
- // ../../.yarn/cache/path-expression-matcher-npm-1.5.0-73d258a112-28303bb9ee.zip/node_modules/path-expression-matcher/src/ExpressionSet.js
10804
+ // ../../node_modules/path-expression-matcher/src/ExpressionSet.js
10770
10805
  var ExpressionSet = class {
10771
10806
  constructor() {
10772
10807
  this._byDepthAndTag = /* @__PURE__ */ new Map();
@@ -10921,7 +10956,7 @@ var ExpressionSet = class {
10921
10956
  }
10922
10957
  };
10923
10958
 
10924
- // ../../.yarn/cache/path-expression-matcher-npm-1.5.0-73d258a112-28303bb9ee.zip/node_modules/path-expression-matcher/src/Matcher.js
10959
+ // ../../node_modules/path-expression-matcher/src/Matcher.js
10925
10960
  var MatcherView = class {
10926
10961
  /**
10927
10962
  * @param {Matcher} matcher - The parent Matcher instance to read from.
@@ -11371,7 +11406,7 @@ var Matcher = class {
11371
11406
  }
11372
11407
  };
11373
11408
 
11374
- // ../../.yarn/cache/fast-xml-parser-npm-5.7.2-960de42682-7f32d77127.zip/node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js
11409
+ // ../../node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js
11375
11410
  function extractRawAttributes(prefixedAttrs, options2) {
11376
11411
  if (!prefixedAttrs) return {};
11377
11412
  const attrs = options2.attributesGroupName ? prefixedAttrs[options2.attributesGroupName] : prefixedAttrs;
@@ -11602,6 +11637,7 @@ var parseXml = function(xmlData) {
11602
11637
  if (attsMap) {
11603
11638
  const ver = attsMap[this.options.attributeNamePrefix + "version"];
11604
11639
  this.entityDecoder.setXmlVersion(Number(ver) || 1);
11640
+ docTypeReader.setXmlVersion(Number(ver) || 1);
11605
11641
  }
11606
11642
  if (options2.ignoreDeclaration && tagData.tagName === "?xml" || options2.ignorePiTags) {
11607
11643
  } else {
@@ -11905,7 +11941,7 @@ function readStopNodeData(xmlData, tagName, i) {
11905
11941
  const closeIndex = findClosingIndex(xmlData, "]]>", i, "StopNode is not closed.") - 2;
11906
11942
  i = closeIndex;
11907
11943
  } else {
11908
- const tagData = readTagExp(xmlData, i, ">");
11944
+ const tagData = readTagExp(xmlData, i, false);
11909
11945
  if (tagData) {
11910
11946
  const openTagName = tagData && tagData.tagName;
11911
11947
  if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length - 1] !== "/") {
@@ -11951,7 +11987,7 @@ function sanitizeName(name, options2) {
11951
11987
  return name;
11952
11988
  }
11953
11989
 
11954
- // ../../.yarn/cache/fast-xml-parser-npm-5.7.2-960de42682-7f32d77127.zip/node_modules/fast-xml-parser/src/xmlparser/node2json.js
11990
+ // ../../node_modules/fast-xml-parser/src/xmlparser/node2json.js
11955
11991
  var METADATA_SYMBOL2 = XmlNode.getMetaDataSymbol();
11956
11992
  function stripAttributePrefix(attrs, prefix) {
11957
11993
  if (!attrs || typeof attrs !== "object") return {};
@@ -11991,6 +12027,9 @@ function compress(arr, options2, matcher, readonlyMatcher) {
11991
12027
  } else if (tagObj[property]) {
11992
12028
  let val = compress(tagObj[property], options2, matcher, readonlyMatcher);
11993
12029
  const isLeaf = isLeafTag(val, options2);
12030
+ if (Object.keys(val).length === 0 && options2.alwaysCreateTextNode) {
12031
+ val[options2.textNodeName] = "";
12032
+ }
11994
12033
  if (tagObj[":@"]) {
11995
12034
  assignAttributes(val, tagObj[":@"], readonlyMatcher, options2);
11996
12035
  } else if (Object.keys(val).length === 1 && val[options2.textNodeName] !== void 0 && !options2.alwaysCreateTextNode) {
@@ -12060,7 +12099,7 @@ function isLeafTag(obj, options2) {
12060
12099
  return false;
12061
12100
  }
12062
12101
 
12063
- // ../../.yarn/cache/fast-xml-parser-npm-5.7.2-960de42682-7f32d77127.zip/node_modules/fast-xml-parser/src/xmlparser/XMLParser.js
12102
+ // ../../node_modules/fast-xml-parser/src/xmlparser/XMLParser.js
12064
12103
  var XMLParser = class {
12065
12104
  constructor(options2) {
12066
12105
  this.externalEntities = {};
@@ -13244,9 +13283,9 @@ var NativeType = class _NativeType extends TypeExpression {
13244
13283
  };
13245
13284
  var OrType = class _OrType extends TypeExpression {
13246
13285
  types;
13247
- constructor(type, ...types) {
13286
+ constructor(...types) {
13248
13287
  super();
13249
- this.types = [type, ...types];
13288
+ this.types = [...types];
13250
13289
  }
13251
13290
  rewrap(type) {
13252
13291
  return type;
@@ -13255,14 +13294,13 @@ var OrType = class _OrType extends TypeExpression {
13255
13294
  return this;
13256
13295
  }
13257
13296
  resolve(namespace, options2) {
13258
- const [type, ...types] = this.types;
13259
- return new _OrType(type.resolve(namespace, options2), ...types.map((t) => t.resolve(namespace, options2)));
13297
+ return makeUnion(...this.types.map((t) => t.resolve(namespace, options2)));
13260
13298
  }
13261
13299
  print(namespace, options2) {
13262
- return `(${this.types.map((t) => t.print(namespace, options2)).join(" | ")})`;
13300
+ return `${this.types.map((t) => t.print(namespace, options2)).join(" | ")}`;
13263
13301
  }
13264
13302
  rootPrint(namespace, options2) {
13265
- return `${this.types.map((t) => t.print(namespace, options2)).join(" | ")}`;
13303
+ return this.print(namespace, options2);
13266
13304
  }
13267
13305
  equals(type) {
13268
13306
  if (type instanceof _OrType) {
@@ -13272,6 +13310,35 @@ var OrType = class _OrType extends TypeExpression {
13272
13310
  }
13273
13311
  }
13274
13312
  };
13313
+ function makeUnion(...inputTypes) {
13314
+ const types = /* @__PURE__ */ new Set();
13315
+ for (const type of inputTypes) {
13316
+ if (type instanceof BinaryType) {
13317
+ types.add(type.a);
13318
+ types.add(type.b);
13319
+ } else if (type instanceof OrType && !(type instanceof TupleType)) {
13320
+ for (const t of type.types) {
13321
+ types.add(t);
13322
+ }
13323
+ } else {
13324
+ types.add(type);
13325
+ }
13326
+ }
13327
+ if (types.size === 1) {
13328
+ return [...types][0];
13329
+ }
13330
+ if (types.size === 2) {
13331
+ const typesArray = [...types];
13332
+ if (typesArray[0] === NullType) {
13333
+ return new NullableType(typesArray[1]);
13334
+ }
13335
+ if (typesArray[1] === NullType) {
13336
+ return new NullableType(typesArray[0]);
13337
+ }
13338
+ return new BinaryType(...typesArray);
13339
+ }
13340
+ return new OrType(...types);
13341
+ }
13275
13342
  var TupleType = class _TupleType extends OrType {
13276
13343
  print(namespace, options2) {
13277
13344
  return `[${this.types.map((t) => t.print(namespace, options2)).join(", ")}]`;
@@ -13442,7 +13509,7 @@ var GenericType = class _GenericType extends TypeExpression {
13442
13509
  return this.identifier;
13443
13510
  }
13444
13511
  };
13445
- var NullableType = class _NullableType extends BinaryType {
13512
+ var NullableType = class extends BinaryType {
13446
13513
  constructor(type) {
13447
13514
  super(type, NullType);
13448
13515
  }
@@ -13450,12 +13517,18 @@ var NullableType = class _NullableType extends BinaryType {
13450
13517
  return this.a;
13451
13518
  }
13452
13519
  rewrap(type) {
13453
- return new _NullableType(this.a.rewrap(type));
13520
+ return makeNullable(this.a.rewrap(type));
13454
13521
  }
13455
13522
  get type() {
13456
13523
  return this.a;
13457
13524
  }
13458
13525
  };
13526
+ function makeNullable(type) {
13527
+ if (type instanceof NullableType) return type;
13528
+ if (type === RawPointerType) return NullType;
13529
+ if (type === AnyType) return AnyType;
13530
+ return makeUnion(type, NullType);
13531
+ }
13459
13532
  var PromiseType = class _PromiseType extends TypeExpression {
13460
13533
  type;
13461
13534
  constructor(type) {
@@ -13599,6 +13672,8 @@ var ArrayType = class _ArrayType extends TypeExpression {
13599
13672
  } else {
13600
13673
  typeSuffix = "".padStart(2 * depth, "[]");
13601
13674
  }
13675
+ if (this.type instanceof OrType && !(this.type instanceof TupleType))
13676
+ return `(${this.type.print(namespace, options2)})${typeSuffix}`;
13602
13677
  return `${this.type.print(namespace, options2)}${typeSuffix}`;
13603
13678
  }
13604
13679
  static new({
@@ -13625,6 +13700,7 @@ var NullType = new NativeType("null");
13625
13700
  var VoidType = new NativeType("void");
13626
13701
  var UnknownType = new NativeType("unknown");
13627
13702
  var AnyFunctionType = new NativeType("(...args: any[]) => any");
13703
+ var RawPointerType = new NativeType("never");
13628
13704
 
13629
13705
  // ../lib/src/utils/types.ts
13630
13706
  function getAliasType(namespace, _ns, parameter) {
@@ -13753,7 +13829,7 @@ function resolvePrimitiveType(name) {
13753
13829
  case "gboolean":
13754
13830
  return BooleanType;
13755
13831
  case "gpointer":
13756
- return AnyType;
13832
+ return RawPointerType;
13757
13833
  case "object":
13758
13834
  return ObjectType;
13759
13835
  case "va_list":
@@ -13779,42 +13855,99 @@ function resolvePrimitiveType(name) {
13779
13855
  function resolveDirectedType(type, direction) {
13780
13856
  if (type instanceof ArrayType) {
13781
13857
  if ((direction === "in" /* In */ || direction === "inout" /* Inout */) && type.type.equals(Uint8ArrayType) && type.arrayDepth === 0) {
13782
- return new BinaryType(type, StringType);
13858
+ return makeUnion(type, StringType);
13783
13859
  } else {
13784
13860
  return type.rewrap(resolveDirectedType(type.type, direction) ?? type.type);
13785
13861
  }
13786
13862
  } else if (type instanceof TypeIdentifier) {
13787
13863
  if ((direction === "in" /* In */ || direction === "inout" /* Inout */) && type.is("GLib", "Bytes")) {
13788
- return new BinaryType(type, Uint8ArrayType);
13864
+ return makeUnion(type, Uint8ArrayType);
13789
13865
  } else if (type.is("GObject", "Value")) {
13790
13866
  if (direction === "in" /* In */ || direction === "inout" /* Inout */) {
13791
- return new BinaryType(type, AnyType);
13867
+ return makeUnion(type, AnyType);
13792
13868
  } else {
13793
13869
  return UnknownType;
13794
13870
  }
13795
13871
  } else if (type.is("GLib", "HashTable")) {
13796
- if (direction === "in" /* In */) {
13797
- return new BinaryType(new NativeType("{ [key: string]: any }"), type);
13798
- } else {
13799
- return type;
13800
- }
13872
+ return hashTableToJsDict(type);
13801
13873
  }
13802
13874
  } else if (type === BigintOrNumberType && direction === "out" /* Out */) {
13803
13875
  return NumberType;
13876
+ } else if (type === RawPointerType && direction === "out" /* Out */) {
13877
+ return NullType;
13804
13878
  } else if (type instanceof PromiseType) {
13805
13879
  const resolvedInner = resolveDirectedType(type.type, direction);
13806
13880
  if (resolvedInner) return new PromiseType(resolvedInner);
13807
- } else if (type instanceof BinaryType && !(type instanceof NullableType)) {
13881
+ } else if (type instanceof NullableType) {
13882
+ const inner = resolveDirectedType(type.a, direction);
13883
+ if (inner !== null) return makeNullable(inner);
13884
+ } else if (type instanceof TupleType) {
13885
+ let changed = false;
13886
+ const inner = type.types.map((t) => {
13887
+ const resolved = resolveDirectedType(t, direction);
13888
+ if (resolved !== null) {
13889
+ changed = true;
13890
+ return resolved;
13891
+ }
13892
+ return t;
13893
+ });
13894
+ if (changed) {
13895
+ const [first, ...rest2] = inner;
13896
+ return new TupleType(first, ...rest2);
13897
+ }
13898
+ } else if (type instanceof BinaryType) {
13808
13899
  const a = resolveDirectedType(type.a, direction) ?? type.a;
13809
13900
  const b = resolveDirectedType(type.b, direction) ?? type.b;
13810
- if (a !== type.a || b !== type.b) return new BinaryType(a, b);
13811
- } else if (type instanceof OrType && !(type instanceof BinaryType || type instanceof TupleType)) {
13812
- const types = type.types.map((t) => resolveDirectedType(t, direction) ?? t);
13813
- if (types.length === 1) return types[0];
13814
- return new OrType(types[0], ...types.slice(1));
13901
+ if (a !== type.a || b !== type.b) return makeUnion(a, b);
13815
13902
  }
13816
13903
  return null;
13817
13904
  }
13905
+ function hashTableToJsDict(type) {
13906
+ if (!(type instanceof GenerifiedTypeIdentifier) || type.generics.length === 0) {
13907
+ return new NativeType("{ [key: string]: any }");
13908
+ }
13909
+ const [keyType, valueType] = type.generics;
13910
+ const keyShape = jsKeyShapeFor(keyType);
13911
+ if (keyShape === null) {
13912
+ return NeverType;
13913
+ }
13914
+ return new HashTableDictType(keyShape, valueType ?? AnyType);
13915
+ }
13916
+ function jsKeyShapeFor(keyType) {
13917
+ if (keyType === StringType) return "string";
13918
+ if (keyType instanceof TypeIdentifier && keyType.is("GLib", "filename")) return "string";
13919
+ if (keyType === NumberType) return "number";
13920
+ if (keyType === BooleanType) return "number";
13921
+ if (keyType === BigintOrNumberType) return "number";
13922
+ return null;
13923
+ }
13924
+ var HashTableDictType = class _HashTableDictType extends TypeExpression {
13925
+ constructor(keyShape, valueType) {
13926
+ super();
13927
+ this.keyShape = keyShape;
13928
+ this.valueType = valueType;
13929
+ }
13930
+ keyShape;
13931
+ valueType;
13932
+ print(namespace, options2) {
13933
+ return `{ [key: ${this.keyShape}]: ${this.valueType.rootPrint(namespace, options2)} }`;
13934
+ }
13935
+ resolve(_namespace, _options) {
13936
+ return this;
13937
+ }
13938
+ equals(type) {
13939
+ return type instanceof _HashTableDictType && this.keyShape === type.keyShape && this.valueType.equals(type.valueType);
13940
+ }
13941
+ rewrap(_type) {
13942
+ return this;
13943
+ }
13944
+ unwrap() {
13945
+ return this;
13946
+ }
13947
+ deepUnwrap() {
13948
+ return this.valueType.deepUnwrap();
13949
+ }
13950
+ };
13818
13951
 
13819
13952
  // ../lib/src/utils/gir-parsing.ts
13820
13953
  var girParsingReporter = new LazyReporter("GirParsing");
@@ -13965,10 +14098,10 @@ function getType(ns, param) {
13965
14098
  variableType = ClosureType.new({ type: variableType, user_data: closure });
13966
14099
  }
13967
14100
  if (parameter.$ && (parameter.$.direction === "inout" /* Inout */ || parameter.$.direction === "out" /* Out */) && (nullable || allowNone) && !(variableType instanceof NativeType) && variableType !== BigintOrNumberType) {
13968
- return new NullableType(variableType);
14101
+ return makeNullable(variableType);
13969
14102
  }
13970
14103
  if ((!parameter.$?.direction || parameter.$.direction === "in" /* In */) && nullable) {
13971
- return new NullableType(variableType);
14104
+ return makeNullable(variableType);
13972
14105
  }
13973
14106
  variableType.isPointer = isPointer;
13974
14107
  return variableType;
@@ -14477,7 +14610,7 @@ var IntrospectedProperty = class _IntrospectedProperty extends IntrospectedBase
14477
14610
  property.defaultValue = element.$["default-value"];
14478
14611
  property.getter = element.$.getter;
14479
14612
  if (element.$.nullable === "1" || element.$["allow-none"] === "1") {
14480
- property.type = new NullableType(property.type);
14613
+ property.type = makeNullable(property.type);
14481
14614
  }
14482
14615
  return property;
14483
14616
  }
@@ -14585,7 +14718,7 @@ var IntrospectedSignal = class _IntrospectedSignal extends IntrospectedClassMemb
14585
14718
  }
14586
14719
  } else {
14587
14720
  if (isOptional) {
14588
- params.push(p.copy({ type: new NullableType(type), isOptional: false }));
14721
+ params.push(p.copy({ type: makeNullable(type), isOptional: false }));
14589
14722
  } else {
14590
14723
  params.push(p);
14591
14724
  }
@@ -14689,7 +14822,7 @@ function resolveNullableProperties(cls) {
14689
14822
  const getterName = prop.getter ?? `get_${prop.name}`;
14690
14823
  const getter = cls.members.find((m) => m.name === getterName && !(m instanceof IntrospectedStaticClassFunction));
14691
14824
  if (getter instanceof IntrospectedClassFunction && getter.return() instanceof NullableType) {
14692
- prop.type = new NullableType(prop.type);
14825
+ prop.type = makeNullable(prop.type);
14693
14826
  }
14694
14827
  }
14695
14828
  }
@@ -16006,7 +16139,7 @@ var IntrospectedFunction = class _IntrospectedFunction extends IntrospectedNames
16006
16139
  }
16007
16140
  } else {
16008
16141
  if (isOptional) {
16009
- params.push(p.copy({ type: new NullableType(type), isOptional: false }));
16142
+ params.push(p.copy({ type: makeNullable(type), isOptional: false }));
16010
16143
  } else {
16011
16144
  params.push(p);
16012
16145
  }
@@ -16889,16 +17022,16 @@ function transformBacktickTypeRefs(text, ctx) {
16889
17022
  });
16890
17023
  return text;
16891
17024
  }
16892
- function transformGirDocHighlights(description8) {
16893
- return description8.replace(/(?<!\{)(?<!\w)@([A-Za-z_][A-Za-z0-9_]*)/g, "`$1`");
17025
+ function transformGirDocHighlights(description9) {
17026
+ return description9.replace(/(?<!\{)(?<!\w)@([A-Za-z_][A-Za-z0-9_]*)/g, "`$1`");
16894
17027
  }
16895
- function transformGirDocCodeBlocks(description8) {
16896
- description8 = description8.replaceAll(/```\s*\{\s*\.(\w+)[^}]*\}/gm, "```$1").replaceAll(/\|\[<!-- language="([^"]+)" -->/gm, (_match, lang) => {
17028
+ function transformGirDocCodeBlocks(description9) {
17029
+ description9 = description9.replaceAll(/```\s*\{\s*\.(\w+)[^}]*\}/gm, "```$1").replaceAll(/\|\[<!-- language="([^"]+)" -->/gm, (_match, lang) => {
16897
17030
  if (lang === "plain" || lang === "text") return "\n```";
16898
17031
  return `
16899
17032
  \`\`\`${lang.toLowerCase()}`;
16900
17033
  }).replaceAll(/\|\[/gm, "\n```").replaceAll(/\]\|/gm, "```\n");
16901
- return description8;
17034
+ return description9;
16902
17035
  }
16903
17036
 
16904
17037
  // ../lib/src/utils/objects.ts
@@ -17483,7 +17616,7 @@ function promisifyNamespaceFunctions(namespace) {
17483
17616
  parameters: sync_parameters
17484
17617
  }),
17485
17618
  node.copy({
17486
- return_type: new BinaryType(async_return, node.return())
17619
+ return_type: makeUnion(async_return, node.return())
17487
17620
  })
17488
17621
  ]);
17489
17622
  }
@@ -17503,7 +17636,7 @@ function generatePromisifyOverloadedSignatures(node, async_parameters, sync_para
17503
17636
  });
17504
17637
  const unionOverload = node.copy({
17505
17638
  parameters: [...async_parameters, sync_parameters[sync_parameters.length - 1].copy({ isOptional: true })],
17506
- returnType: new BinaryType(async_return, VoidType)
17639
+ returnType: makeUnion(async_return, VoidType)
17507
17640
  });
17508
17641
  return [promiseOverload, callbackOverload, unionOverload];
17509
17642
  }
@@ -20088,8 +20221,10 @@ var shellTemplate = (version) => ({
20088
20221
  const addGlslSnippet = GLSLEffect.members.find((m) => m.name === "add_glsl_snippet");
20089
20222
  if (addGlslSnippet) {
20090
20223
  const updatedParameter = addGlslSnippet.parameters[0].copy({
20091
- type: new NullableType(
20092
- new OrType(new TypeIdentifier("SnippetHook", "Shell"), new TypeIdentifier("SnippetHook", "Cogl"))
20224
+ type: makeUnion(
20225
+ new TypeIdentifier("SnippetHook", "Shell"),
20226
+ new TypeIdentifier("SnippetHook", "Cogl"),
20227
+ NullType
20093
20228
  )
20094
20229
  });
20095
20230
  addGlslSnippet.parameters[0] = updatedParameter;
@@ -21061,6 +21196,7 @@ import { existsSync as existsSync2, readFileSync as readFileSync3, writeFileSync
21061
21196
 
21062
21197
  // src/config/config-loader.ts
21063
21198
  import { dirname as dirname5, resolve as resolve4 } from "node:path";
21199
+ import { pathToFileURL } from "node:url";
21064
21200
  import { cosmiconfig } from "cosmiconfig";
21065
21201
 
21066
21202
  // src/config/config-writer.ts
@@ -21110,6 +21246,14 @@ function getDefaultGirDirectories() {
21110
21246
  "/usr/lib/mutter-*",
21111
21247
  "/usr/lib/x86_64-linux-gnu/mutter-*"
21112
21248
  ];
21249
+ if (process.env.FLATPAK_ID || existsSync("/.flatpak-info")) {
21250
+ girDirectories.unshift(
21251
+ "/run/host/usr/local/share/gir-1.0",
21252
+ "/run/host/usr/share/gir-1.0",
21253
+ "/run/host/usr/share/*/gir-1.0",
21254
+ "/run/host/usr/lib/x86_64-linux-gnu/mutter-*"
21255
+ );
21256
+ }
21113
21257
  const dataDirs = process.env.XDG_DATA_DIRS?.split(":") || [];
21114
21258
  for (let dataDir of dataDirs) {
21115
21259
  dataDir = join5(dataDir, "gir-1.0");
@@ -21381,8 +21525,8 @@ var createOptions = {
21381
21525
  template: {
21382
21526
  type: "string",
21383
21527
  alias: "t",
21384
- description: "Template to scaffold (types-locally, types-npm, types-workspace)",
21385
- choices: ["types-locally", "types-npm", "types-workspace"]
21528
+ description: "Template to scaffold (types-locally, types-npm, types-workspace, types-gjsify)",
21529
+ choices: ["types-locally", "types-npm", "types-workspace", "types-gjsify"]
21386
21530
  },
21387
21531
  install: {
21388
21532
  type: "boolean",
@@ -21491,9 +21635,12 @@ var analyzeOptions = {
21491
21635
  async function loadConfigFile(configName) {
21492
21636
  const configSearchOptions = {
21493
21637
  loaders: {
21494
- // ESM loader
21638
+ // ESM loader. cosmiconfig hands us an absolute filesystem path; Node's import()
21639
+ // tolerates that as a non-spec extension, but spec-compliant runtimes (GJS /
21640
+ // SpiderMonkey) reject it with "Module not found: <abs-path>". Convert to a
21641
+ // file:// URL so the loader works in both runtimes.
21495
21642
  ".js": async (filepath) => {
21496
- const file = await import(filepath);
21643
+ const file = await import(pathToFileURL(filepath).href);
21497
21644
  if (file?.default?.default) {
21498
21645
  return file.default.default;
21499
21646
  }
@@ -21631,13 +21778,13 @@ async function load(cliOptions) {
21631
21778
  }
21632
21779
 
21633
21780
  // src/commands/command-builder.ts
21634
- function createBuilder(options2, examples8) {
21781
+ function createBuilder(options2, examples9) {
21635
21782
  return (yargs2) => {
21636
21783
  const optionNames = Object.keys(options2);
21637
21784
  for (const optionName of optionNames) {
21638
21785
  yargs2 = yargs2.option(optionName, options2[optionName]);
21639
21786
  }
21640
- return yargs2.example(examples8);
21787
+ return yargs2.example(examples9);
21641
21788
  };
21642
21789
  }
21643
21790
 
@@ -22477,14 +22624,15 @@ var copy = {
22477
22624
 
22478
22625
  // src/commands/create.ts
22479
22626
  import { spawnSync } from "node:child_process";
22480
- import { cpSync, existsSync as existsSync3, mkdirSync, readdirSync, readFileSync as readFileSync4, writeFileSync as writeFileSync2 } from "node:fs";
22627
+ import { cpSync, existsSync as existsSync3, mkdirSync, readdirSync, readFileSync as readFileSync4, realpathSync, writeFileSync as writeFileSync2 } from "node:fs";
22481
22628
  import { dirname as dirname6, join as join9, resolve as resolve5 } from "node:path";
22482
22629
  import { fileURLToPath as fileURLToPath4 } from "node:url";
22483
22630
  import { input, select as select2 } from "@inquirer/prompts";
22484
22631
  var command3 = "create [name]";
22485
22632
  var description3 = "Scaffold a new GJS TypeScript project from a template";
22486
22633
  var examples3 = [
22487
- [`${APP_NAME} create my-app --template types-npm`, "Scaffold using the @girs/* NPM types"],
22634
+ [`${APP_NAME} create my-app --template types-gjsify`, "Scaffold a Node-free GJS app via gjsify (recommended)"],
22635
+ [`${APP_NAME} create my-app --template types-npm`, "Scaffold using the @girs/* NPM types + node/esbuild"],
22488
22636
  [`${APP_NAME} create my-app --template types-locally`, "Scaffold and generate types into ./@types/ locally"],
22489
22637
  [
22490
22638
  `${APP_NAME} create my-app --template types-workspace`,
@@ -22494,15 +22642,20 @@ var examples3 = [
22494
22642
  ];
22495
22643
  var TEMPLATE_CHOICES = [
22496
22644
  {
22497
- value: "types-locally",
22498
- name: "types-locally",
22499
- description: "Generate GIR types directly into ./@types/ (no package format, no @girs/* deps)"
22645
+ value: "types-gjsify",
22646
+ name: "types-gjsify",
22647
+ description: "Node-free: @girs/* from NPM, all dev scripts (install/build/run/format) routed through gjsify"
22500
22648
  },
22501
22649
  {
22502
22650
  value: "types-npm",
22503
22651
  name: "types-npm",
22504
22652
  description: "Use pre-generated types from the @girs/* NPM packages"
22505
22653
  },
22654
+ {
22655
+ value: "types-locally",
22656
+ name: "types-locally",
22657
+ description: "Generate GIR types directly into ./@types/ (no package format, no @girs/* deps)"
22658
+ },
22506
22659
  {
22507
22660
  value: "types-workspace",
22508
22661
  name: "types-workspace",
@@ -22515,19 +22668,34 @@ var builder3 = createBuilder(createOptions, examples3);
22515
22668
  function findTemplatesRoot() {
22516
22669
  const __filename = fileURLToPath4(import.meta.url);
22517
22670
  const __dirname3 = dirname6(__filename);
22671
+ let realDirname = __dirname3;
22672
+ try {
22673
+ realDirname = dirname6(realpathSync(__filename));
22674
+ } catch {
22675
+ }
22518
22676
  const candidates = [
22519
- // Bundled production binary (bin/ts-for-gir): ../dist-templates
22677
+ // Symlink-resolved binary (`npm i -g` / `gjsify install -g`): the
22678
+ // realpath-aware candidate is required when the CLI is launched via a
22679
+ // `~/.local/bin/<name>` symlink that points at the real package's
22680
+ // `bin/<name>`. Try it first so the success path is symmetric across
22681
+ // install modes.
22682
+ resolve5(realDirname, "..", "dist-templates"),
22683
+ // Bundled production binary invoked at its real path (no symlink),
22684
+ // or a tarball extracted into a flat `bin/` + `dist-templates/` layout.
22520
22685
  resolve5(__dirname3, "..", "dist-templates"),
22521
22686
  // Source layout (src/commands/create.ts): ../../dist-templates then ../../templates
22522
22687
  resolve5(__dirname3, "..", "..", "dist-templates"),
22523
22688
  resolve5(__dirname3, "..", "..", "templates")
22524
22689
  ];
22690
+ const seen = /* @__PURE__ */ new Set();
22525
22691
  for (const path of candidates) {
22692
+ if (seen.has(path)) continue;
22693
+ seen.add(path);
22526
22694
  if (existsSync3(path)) return path;
22527
22695
  }
22528
22696
  throw new Error(
22529
22697
  `Could not locate templates directory. Looked in:
22530
- ${candidates.join("\n ")}
22698
+ ${[...seen].join("\n ")}
22531
22699
  If you are running from source, make sure packages/cli/templates/ exists. If you are running the published CLI, make sure dist-templates/ was packed.`
22532
22700
  );
22533
22701
  }
@@ -22568,7 +22736,19 @@ function walkAndSubstitute(rootDir, projectName) {
22568
22736
  var handler3 = async (args) => {
22569
22737
  const opts = args;
22570
22738
  const log3 = new Logger(opts.verbose ?? false, "CreateCommand");
22571
- const templatesRoot = findTemplatesRoot();
22739
+ let templatesRoot;
22740
+ try {
22741
+ templatesRoot = findTemplatesRoot();
22742
+ } catch (err) {
22743
+ if (typeof __GJS_BUNDLE__ !== "undefined") {
22744
+ process.stderr.write(
22745
+ "The 'create' command needs templates that aren't shipped alongside this binary.\nInstall the full package instead so `dist-templates/` lives next to the bin:\n gjsify install -g @ts-for-gir/cli\n npm install -g @ts-for-gir/cli\n npx @ts-for-gir/cli create ... # one-shot, no install\n"
22746
+ );
22747
+ process.exitCode = 1;
22748
+ return;
22749
+ }
22750
+ throw err;
22751
+ }
22572
22752
  const available = listTemplates(templatesRoot);
22573
22753
  if (available.length === 0) {
22574
22754
  throw new Error(`No templates found in ${templatesRoot}`);
@@ -22614,18 +22794,26 @@ var handler3 = async (args) => {
22614
22794
  walkAndSubstitute(targetDir, projectName);
22615
22795
  log3.success(`Scaffolded ${template2} into ${targetDir}`);
22616
22796
  if (opts.install) {
22617
- log3.info("Running npm install...");
22618
- const result = spawnSync("npm", ["install", "--no-audit", "--no-fund"], {
22797
+ const installer = template2 === "types-gjsify" ? "gjsify" : "npm";
22798
+ const installerArgs = template2 === "types-gjsify" ? ["install"] : ["install", "--no-audit", "--no-fund"];
22799
+ log3.info(`Running ${installer} install...`);
22800
+ const result = spawnSync(installer, installerArgs, {
22619
22801
  cwd: targetDir,
22620
22802
  stdio: "inherit"
22621
22803
  });
22622
22804
  if (result.status !== 0) {
22623
- log3.warn("npm install failed; you can re-run it manually in the project directory.");
22805
+ log3.warn(`${installer} install failed; you can re-run it manually in the project directory.`);
22624
22806
  }
22625
22807
  }
22626
22808
  log3.info("\nNext steps:");
22627
22809
  log3.white(` cd ${projectName}`);
22628
- if (!opts.install) log3.white(" npm install");
22810
+ if (!opts.install) {
22811
+ if (template2 === "types-gjsify") {
22812
+ log3.white(" gjsify install");
22813
+ } else {
22814
+ log3.white(" npm install");
22815
+ }
22816
+ }
22629
22817
  switch (template2) {
22630
22818
  case "types-locally":
22631
22819
  log3.white(" npm run generate");
@@ -22640,6 +22828,10 @@ var handler3 = async (args) => {
22640
22828
  log3.white(" npm run build:types && npm install");
22641
22829
  log3.white(" npm run build:app && npm start");
22642
22830
  break;
22831
+ case "types-gjsify":
22832
+ log3.white(" gjsify run check");
22833
+ log3.white(" gjsify run build && gjsify run start");
22834
+ break;
22643
22835
  }
22644
22836
  };
22645
22837
  var create = {
@@ -23035,23 +23227,27 @@ var SignalGenerator = class {
23035
23227
  return interfaceTypeIdentifier ? `${interfaceTypeIdentifier}.SignalSignatures` : null;
23036
23228
  }).filter((sig) => !!sig);
23037
23229
  parentSignatures.push(...interfaceSignatures);
23038
- let signatureHead;
23230
+ let signatureDecl;
23039
23231
  if (parentSignatures.length > 0) {
23040
- signatureHead = `${indent}interface SignalSignatures extends ${parentSignatures.join(", ")} {`;
23232
+ signatureDecl = `interface SignalSignatures extends ${parentSignatures.join(", ")}`;
23041
23233
  } else {
23042
23234
  const isGObjectObject = girClass.name === "Object" && girClass.namespace.namespace === "GObject";
23043
23235
  if (isGObjectObject) {
23044
- signatureHead = `${indent}interface SignalSignatures {`;
23236
+ signatureDecl = `interface SignalSignatures`;
23045
23237
  } else {
23046
23238
  const gobjectNamespace = this.namespace.assertInstalledImport("GObject");
23047
23239
  const gobjectObjectClass = gobjectNamespace.assertClass("Object");
23048
23240
  const gobjectRef = gobjectObjectClass.getType().resolveIdentifier(this.namespace, this.config)?.print(this.namespace, this.config);
23049
23241
  const fallbackRef = gobjectRef ? `${gobjectRef}.SignalSignatures` : "GObject.Object.SignalSignatures";
23050
- signatureHead = `${indent}interface SignalSignatures extends ${fallbackRef} {`;
23242
+ signatureDecl = `interface SignalSignatures extends ${fallbackRef}`;
23051
23243
  }
23052
23244
  }
23053
- def.push(signatureHead);
23054
23245
  const allSignals = girClass.getAllSignals();
23246
+ if (allSignals.length === 0) {
23247
+ def.push(`${indent}${signatureDecl} {}`);
23248
+ return def;
23249
+ }
23250
+ def.push(`${indent}${signatureDecl} {`);
23055
23251
  allSignals.forEach((signalInfo) => {
23056
23252
  let cbType;
23057
23253
  if (signalInfo.isNotifySignal) {
@@ -23392,6 +23588,9 @@ var ModuleGenerator = class _ModuleGenerator extends FormatGenerator {
23392
23588
  }
23393
23589
  generateDirectAllocationConstructor(node, indentCount = 1) {
23394
23590
  const indent = generateIndent(indentCount);
23591
+ if (node.parameters.length === 0) {
23592
+ return [`${indent}constructor(properties?: Partial<{}>);`];
23593
+ }
23395
23594
  const fieldIndent = generateIndent(indentCount + 1);
23396
23595
  const constructorFields = node.parameters.flatMap((param) => param.asField().asString(this)).flatMap((line) => line.split("\n")).map((line) => line.replace(/^\s+/, "")).filter((line) => line.length > 0).map((line) => `${fieldIndent}${line}`).join("\n");
23397
23596
  return ["", `${indent}constructor(properties?: Partial<{`, constructorFields, `${indent}}>);`];
@@ -23500,7 +23699,7 @@ var ModuleGenerator = class _ModuleGenerator extends FormatGenerator {
23500
23699
  parameters: [
23501
23700
  new IntrospectedFunctionParameter({
23502
23701
  name: "options",
23503
- type: NativeType.of("{ message: string, code: number }"),
23702
+ type: NativeType.of("{ message: string; code: number }"),
23504
23703
  direction: "in" /* In */
23505
23704
  })
23506
23705
  ],
@@ -23568,24 +23767,24 @@ var ModuleGenerator = class _ModuleGenerator extends FormatGenerator {
23568
23767
  case 3 /* FUNCTION_NAME_CONFLICT */:
23569
23768
  case 2 /* FIELD_NAME_CONFLICT */:
23570
23769
  getterSetterAnnotation = setterAnnotation = "// This accessor conflicts with a field or function name in a parent class or interface.\n";
23571
- type = new BinaryType(type.unwrap(), AnyType);
23770
+ type = makeUnion(type.unwrap(), AnyType);
23572
23771
  printAsProperty = true;
23573
23772
  break;
23574
23773
  case 4 /* ACCESSOR_PROPERTY_CONFLICT */:
23575
23774
  getterSetterAnnotation = getterAnnotation = "// This accessor conflicts with a property or field in a parent class or interface.\n";
23576
- type = new BinaryType(type.unwrap(), AnyType);
23775
+ type = makeUnion(type.unwrap(), AnyType);
23577
23776
  printAsProperty = true;
23578
23777
  break;
23579
23778
  case 5 /* PROPERTY_ACCESSOR_CONFLICT */:
23580
- type = new BinaryType(type.unwrap(), AnyType);
23779
+ type = makeUnion(type.unwrap(), AnyType);
23581
23780
  break;
23582
23781
  case 1 /* PROPERTY_NAME_CONFLICT */:
23583
23782
  getterSetterAnnotation = setterAnnotation = getterAnnotation = "// This accessor conflicts with another accessor's type in a parent class or interface.\n";
23584
- type = new BinaryType(type.unwrap(), AnyType);
23783
+ type = makeUnion(type.unwrap(), AnyType);
23585
23784
  break;
23586
23785
  }
23587
23786
  if (construct && !(type instanceof BinaryType)) {
23588
- type = new BinaryType(type instanceof TypeConflict ? type.unwrap() : type, AnyType);
23787
+ type = makeUnion(type instanceof TypeConflict ? type.unwrap() : type, AnyType);
23589
23788
  }
23590
23789
  }
23591
23790
  const Type = type.resolve(this.namespace, this.options).rootPrint(this.namespace, this.options) || "any";
@@ -23632,7 +23831,7 @@ var ModuleGenerator = class _ModuleGenerator extends FormatGenerator {
23632
23831
  type = type.unwrap();
23633
23832
  } else if (type.conflictType === 3 /* FUNCTION_NAME_CONFLICT */) {
23634
23833
  commentOut = "\n// This field conflicts with a function in a parent class or interface.\n";
23635
- type = new BinaryType(type.unwrap(), AnyType);
23834
+ type = makeUnion(type.unwrap(), AnyType);
23636
23835
  } else {
23637
23836
  type = type.unwrap();
23638
23837
  }
@@ -24059,6 +24258,10 @@ var ModuleGenerator = class _ModuleGenerator extends FormatGenerator {
24059
24258
  const { props } = girClass;
24060
24259
  const memberIndent = generateIndent(indentCount + 1);
24061
24260
  const constructorPropMembers = filterConflicts(girClass.namespace, girClass, props, 1 /* PRESERVE */).flatMap((v) => v.asString(this, true)).map((m) => `${memberIndent}${m}`).join("\n");
24261
+ if (constructorPropMembers.length === 0) {
24262
+ def.push(`${indent}${exp}interface ${constructPropInterfaceName}${genericTypes} ${ext} {}`);
24263
+ return def;
24264
+ }
24062
24265
  def.push(`${indent}${exp}interface ${constructPropInterfaceName}${genericTypes} ${ext} {`);
24063
24266
  def.push(constructorPropMembers);
24064
24267
  def.push(`${indent}}`);
@@ -26102,9 +26305,9 @@ var GirMetadataSerializer = class _GirMetadataSerializer {
26102
26305
  [IntrospectedAlias, (s, o) => s.buildBaseMetadata(o, "alias")]
26103
26306
  ];
26104
26307
  buildMetadata(girObj) {
26105
- for (const [ctor, handler8] of _GirMetadataSerializer.METADATA_DISPATCH) {
26308
+ for (const [ctor, handler9] of _GirMetadataSerializer.METADATA_DISPATCH) {
26106
26309
  if (girObj instanceof ctor) {
26107
- return handler8(this, girObj);
26310
+ return handler9(this, girObj);
26108
26311
  }
26109
26312
  }
26110
26313
  return null;
@@ -27162,14 +27365,14 @@ function getModuleName(row, moduleNames) {
27162
27365
  return void 0;
27163
27366
  }
27164
27367
  function buildChunk(rows) {
27165
- const builder8 = new import_lunr.default.Builder();
27166
- builder8.pipeline.add(import_lunr.default.trimmer);
27167
- builder8.ref("id");
27168
- builder8.field("name", { boost: 10 });
27368
+ const builder9 = new import_lunr.default.Builder();
27369
+ builder9.pipeline.add(import_lunr.default.trimmer);
27370
+ builder9.ref("id");
27371
+ builder9.field("name", { boost: 10 });
27169
27372
  for (let i = 0; i < rows.length; i++) {
27170
- builder8.add({ id: i, name: rows[i].name });
27373
+ builder9.add({ id: i, name: rows[i].name });
27171
27374
  }
27172
- const index = builder8.build();
27375
+ const index = builder9.build();
27173
27376
  const data = { rows, index };
27174
27377
  const compressed = deflateSync(Buffer.from(JSON.stringify(data)));
27175
27378
  return compressed.toString("base64");
@@ -27626,7 +27829,7 @@ function giDocgenModuleMemberSummary(context, member) {
27626
27829
  }
27627
27830
  const nsMeta = member.girNamespaceMetadata;
27628
27831
  const commentSummary = context.commentShortSummary(member);
27629
- const description8 = commentSummary || (nsMeta?.description ? JSX4.createElement("p", null, nsMeta.description) : null);
27832
+ const description9 = commentSummary || (nsMeta?.description ? JSX4.createElement("p", null, nsMeta.description) : null);
27630
27833
  return JSX4.createElement(
27631
27834
  JSX4.Fragment,
27632
27835
  null,
@@ -27638,7 +27841,7 @@ function giDocgenModuleMemberSummary(context, member) {
27638
27841
  JSX4.createElement(
27639
27842
  "dd",
27640
27843
  { class: classNames({ "tsd-member-summary": true }, context.getReflectionClasses(member)) },
27641
- description8
27844
+ description9
27642
27845
  )
27643
27846
  );
27644
27847
  }
@@ -27753,10 +27956,14 @@ import { fileURLToPath as fileURLToPath5 } from "node:url";
27753
27956
  import { i18n, JSX as JSX8, ReflectionKind as ReflectionKind5 } from "typedoc";
27754
27957
  function getTsForGirVersion() {
27755
27958
  if (true) {
27756
- return "4.0.0-rc.9";
27959
+ return "4.0.0";
27960
+ }
27961
+ try {
27962
+ const __dirname3 = dirname8(fileURLToPath5(import.meta.url));
27963
+ return JSON.parse(readFileSync7(join14(__dirname3, "..", "..", "package.json"), "utf8")).version;
27964
+ } catch {
27965
+ return "";
27757
27966
  }
27758
- const __dirname3 = dirname8(fileURLToPath5(import.meta.url));
27759
- return JSON.parse(readFileSync7(join14(__dirname3, "..", "..", "package.json"), "utf8")).version;
27760
27967
  }
27761
27968
  var TSFOR_GIR_VERSION = getTsForGirVersion();
27762
27969
  function giDocgenModuleInfo(context, mod, nsMeta) {
@@ -28625,14 +28832,132 @@ var list = {
28625
28832
  examples: examples7
28626
28833
  };
28627
28834
 
28835
+ // src/commands/self-update.ts
28836
+ import { chmodSync, existsSync as existsSync5, renameSync, writeFileSync as writeFileSync5 } from "node:fs";
28837
+ import { tmpdir as tmpdir2 } from "node:os";
28838
+ import { join as join17 } from "node:path";
28839
+ var REPO = "gjsify/ts-for-gir";
28840
+ var GITHUB_API = "https://api.github.com";
28841
+ var GJS_ASSET_NAME = "ts-for-gir-gjs";
28842
+ function getCurrentBinaryPath() {
28843
+ const p = process.argv[1] ?? null;
28844
+ if (!p) return null;
28845
+ if (p.endsWith(".ts") || p.includes("node_modules")) return null;
28846
+ return p;
28847
+ }
28848
+ async function fetchJson(url) {
28849
+ const headers = {
28850
+ Accept: "application/vnd.github.v3+json",
28851
+ "User-Agent": `ts-for-gir/${APP_VERSION}`
28852
+ };
28853
+ const token = process.env.GITHUB_TOKEN;
28854
+ if (token) headers.Authorization = `token ${token}`;
28855
+ const response = await fetch(url, { headers });
28856
+ if (!response.ok) {
28857
+ throw new Error(`HTTP ${response.status} from ${url}`);
28858
+ }
28859
+ return response.json();
28860
+ }
28861
+ async function downloadBinary(url, destPath) {
28862
+ const response = await fetch(url, {
28863
+ headers: { "User-Agent": `ts-for-gir/${APP_VERSION}` }
28864
+ });
28865
+ if (!response.ok) {
28866
+ throw new Error(`HTTP ${response.status} downloading binary`);
28867
+ }
28868
+ const buffer = await response.arrayBuffer();
28869
+ const tmpPath = join17(tmpdir2(), `ts-for-gir-update-${Date.now()}`);
28870
+ writeFileSync5(tmpPath, Buffer.from(buffer));
28871
+ chmodSync(tmpPath, 493);
28872
+ renameSync(tmpPath, destPath);
28873
+ }
28874
+ var command8 = "self-update";
28875
+ var description8 = "Update ts-for-gir to the latest version from GitHub releases";
28876
+ var examples8 = [
28877
+ [`${APP_NAME} self-update`, "Check for updates and install the latest version"],
28878
+ [`${APP_NAME} self-update --check`, "Only check for a newer version, do not install"],
28879
+ [`${APP_NAME} self-update --force`, "Force reinstall even if already on the latest version"]
28880
+ ];
28881
+ var builder8 = (yargs2) => yargs2.option("check", {
28882
+ description: "Only check for a newer version, do not install",
28883
+ type: "boolean",
28884
+ default: false
28885
+ }).option("force", {
28886
+ description: "Force reinstall even if already on the latest version",
28887
+ type: "boolean",
28888
+ default: false
28889
+ }).example(examples8);
28890
+ var handler8 = async (args) => {
28891
+ console.log(`Checking for updates... (current: v${APP_VERSION})`);
28892
+ let release;
28893
+ try {
28894
+ release = await fetchJson(`${GITHUB_API}/repos/${REPO}/releases/latest`);
28895
+ } catch (err) {
28896
+ const msg = err instanceof Error ? err.message : String(err);
28897
+ process.stderr.write(`Failed to fetch release information: ${msg}
28898
+ `);
28899
+ process.exitCode = 1;
28900
+ return;
28901
+ }
28902
+ const latestVersion = release.tag_name.replace(/^v/, "");
28903
+ if (latestVersion === APP_VERSION && !args.force) {
28904
+ console.log(`Already up to date (v${APP_VERSION})`);
28905
+ return;
28906
+ }
28907
+ if (args.check) {
28908
+ console.log(`New version available: v${latestVersion} (current: v${APP_VERSION})`);
28909
+ console.log(`Run \`${APP_NAME} self-update\` to install it.`);
28910
+ return;
28911
+ }
28912
+ console.log(`Updating to v${latestVersion}...`);
28913
+ const assets = release.assets;
28914
+ const asset = assets.find((a) => a.name === GJS_ASSET_NAME);
28915
+ if (!asset) {
28916
+ process.stderr.write(
28917
+ `No GJS binary found in release ${release.tag_name}.
28918
+ self-update requires the GJS bundle to be installed via install.js.
28919
+ For npm installations use: npm update -g @ts-for-gir/cli
28920
+ `
28921
+ );
28922
+ process.exitCode = 1;
28923
+ return;
28924
+ }
28925
+ const currentPath = getCurrentBinaryPath();
28926
+ if (!currentPath || !existsSync5(currentPath)) {
28927
+ process.stderr.write(
28928
+ "Cannot determine current binary path for update.\nself-update only works when running the installed GJS binary.\n"
28929
+ );
28930
+ process.exitCode = 1;
28931
+ return;
28932
+ }
28933
+ try {
28934
+ await downloadBinary(asset.browser_download_url, currentPath);
28935
+ console.log(`Successfully updated to v${latestVersion}`);
28936
+ } catch (err) {
28937
+ const msg = err instanceof Error ? err.message : String(err);
28938
+ process.stderr.write(`Update failed: ${msg}
28939
+ `);
28940
+ process.exitCode = 1;
28941
+ }
28942
+ };
28943
+ var selfUpdate = {
28944
+ command: command8,
28945
+ description: description8,
28946
+ builder: builder8,
28947
+ handler: handler8,
28948
+ examples: examples8
28949
+ };
28950
+
28628
28951
  // src/start.ts
28629
28952
  try {
28630
- await yargs(hideBin(process.argv)).scriptName(APP_NAME).strict().usage(APP_USAGE).version(APP_VERSION).exitProcess(false).fail(false).command(analyze).command(create).command(generate).command(json2).command(list).command(copy).command(doc).demandCommand(1).help().parseAsync();
28953
+ const cli = yargs(hideBin(process.argv));
28954
+ await cli.scriptName(APP_NAME).strict().usage(APP_USAGE).version(APP_VERSION).wrap(cli.terminalWidth()).exitProcess(false).fail(false).command(analyze).command(create).command(generate).command(json2).command(list).command(copy).command(doc).command(selfUpdate).demandCommand(1).help().parseAsync();
28955
+ process.exit(0);
28631
28956
  } catch (err) {
28632
28957
  const message = err instanceof Error ? err.message : String(err);
28633
28958
  process.stderr.write(`${message}
28634
28959
  `);
28635
- process.exitCode = 1;
28960
+ process.exit(1);
28636
28961
  }
28637
28962
  /*! Bundled license information:
28638
28963