create-nextly-app 0.0.2-alpha.60 → 0.0.2-alpha.64

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/dist/cli.cjs CHANGED
@@ -6259,7 +6259,7 @@ var require_package = __commonJS({
6259
6259
  "package.json"(exports$1, module) {
6260
6260
  module.exports = {
6261
6261
  name: "create-nextly-app",
6262
- version: "0.0.2-alpha.60",
6262
+ version: "0.0.2-alpha.64",
6263
6263
  description: "CLI to scaffold Nextly in your Next.js project",
6264
6264
  license: "MIT",
6265
6265
  type: "module",
@@ -6301,11 +6301,13 @@ var require_package = __commonJS({
6301
6301
  },
6302
6302
  devDependencies: {
6303
6303
  "@nextlyhq/eslint-config": "workspace:*",
6304
+ "@nextlyhq/eslint-plugin": "workspace:*",
6304
6305
  "@nextlyhq/telemetry": "workspace:*",
6305
6306
  "@nextlyhq/tsconfig": "workspace:*",
6306
6307
  "@types/fs-extra": "^11.0.4",
6307
6308
  "@types/node": "^20.19.17",
6308
6309
  "@types/tar": "^6.1.13",
6310
+ "@typescript-eslint/parser": "^8.59.0",
6309
6311
  "@vitest/coverage-v8": "^4.1.0",
6310
6312
  "@vitest/ui": "^4.1.0",
6311
6313
  eslint: "^9.39.1",
@@ -9448,12 +9450,31 @@ var require_data = __commonJS2({
9448
9450
  }
9449
9451
  });
9450
9452
  var require_utils = __commonJS2({
9451
- "../../node_modules/.pnpm/fast-uri@3.1.5/node_modules/fast-uri/lib/utils.js"(exports$1, module) {
9453
+ "../../node_modules/.pnpm/fast-uri@3.1.7/node_modules/fast-uri/lib/utils.js"(exports$1, module) {
9452
9454
  var isUUID = RegExp.prototype.test.bind(/^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/iu);
9453
9455
  var isIPv4 = RegExp.prototype.test.bind(/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$/u);
9456
+ var isPort = RegExp.prototype.test.bind(/^\d*$/u);
9454
9457
  var isHexPair = RegExp.prototype.test.bind(/^[\da-f]{2}$/iu);
9455
9458
  var isUnreserved = RegExp.prototype.test.bind(/^[\da-z\-._~]$/iu);
9456
- var isPathCharacter = RegExp.prototype.test.bind(/^[\da-z\-._~!$&'()*+,;=:@/]$/iu);
9459
+ var isPathCharacter = RegExp.prototype.test.bind(/^[A-Za-z0-9\-._~!$&'()*+,;=:@/]$/u);
9460
+ var isQueryFragmentCharacter = RegExp.prototype.test.bind(/^[A-Za-z0-9\-._~!$&'()*+,;=:@/?]$/u);
9461
+ var isUserinfoCharacter = RegExp.prototype.test.bind(/^[A-Za-z0-9\-._~!$&'()*+,;=:]$/u);
9462
+ var BYTE_HEX = new Array(256);
9463
+ {
9464
+ const HEX_DIGITS = "0123456789ABCDEF";
9465
+ for (let i2 = 0; i2 < 256; i2++) {
9466
+ BYTE_HEX[i2] = "%" + HEX_DIGITS[i2 >> 4] + HEX_DIGITS[i2 & 15];
9467
+ }
9468
+ }
9469
+ function percentEncodeNonAscii(cp) {
9470
+ if (cp < 2048) {
9471
+ return BYTE_HEX[192 | cp >> 6] + BYTE_HEX[128 | cp & 63];
9472
+ }
9473
+ if (cp < 65536) {
9474
+ return BYTE_HEX[224 | cp >> 12] + BYTE_HEX[128 | cp >> 6 & 63] + BYTE_HEX[128 | cp & 63];
9475
+ }
9476
+ return BYTE_HEX[240 | cp >> 18] + BYTE_HEX[128 | cp >> 12 & 63] + BYTE_HEX[128 | cp >> 6 & 63] + BYTE_HEX[128 | cp & 63];
9477
+ }
9457
9478
  function stringArrayToHexStripped(input) {
9458
9479
  let acc = "";
9459
9480
  let code = 0;
@@ -9478,91 +9499,105 @@ var require_utils = __commonJS2({
9478
9499
  }
9479
9500
  return acc;
9480
9501
  }
9502
+ var isHextet = RegExp.prototype.test.bind(/^[\dA-Fa-f]{1,4}$/);
9503
+ var isIPvFuture = RegExp.prototype.test.bind(/^[vV][\dA-Fa-f]+\.[A-Za-z\d\-._~!$&'()*+,;=:]+$/);
9504
+ var isZoneCharacter = RegExp.prototype.test.bind(/^[A-Za-z\d\-._~]$/);
9481
9505
  var nonSimpleDomain = RegExp.prototype.test.bind(/[^!"$&'()*+,\-.;=_`a-z{}~]/u);
9482
- function consumeIsZone(buffer) {
9483
- buffer.length = 0;
9484
- return true;
9485
- }
9486
- function consumeHextets(buffer, address, output) {
9487
- if (buffer.length) {
9488
- const hex = stringArrayToHexStripped(buffer);
9489
- if (hex !== "") {
9490
- address.push(hex);
9491
- } else {
9492
- output.error = true;
9493
- return false;
9506
+ function isZoneIdentifier(zone) {
9507
+ if (zone.length === 0) return false;
9508
+ for (let i2 = 0; i2 < zone.length; i2++) {
9509
+ if (isZoneCharacter(zone[i2])) continue;
9510
+ if (zone[i2] === "%" && i2 + 2 < zone.length && isHexPair(zone.slice(i2 + 1, i2 + 3))) {
9511
+ i2 += 2;
9512
+ continue;
9494
9513
  }
9495
- buffer.length = 0;
9514
+ return false;
9496
9515
  }
9497
9516
  return true;
9498
9517
  }
9499
- function getIPV6(input) {
9500
- let tokenCount = 0;
9501
- const output = { error: false, address: "", zone: "" };
9502
- const address = [];
9503
- const buffer = [];
9504
- let endipv6Encountered = false;
9505
- let endIpv6 = false;
9506
- let consume = consumeHextets;
9507
- for (let i2 = 0; i2 < input.length; i2++) {
9508
- const cursor = input[i2];
9509
- if (cursor === "[" || cursor === "]") {
9510
- continue;
9511
- }
9512
- if (cursor === ":") {
9513
- if (endipv6Encountered === true) {
9514
- endIpv6 = true;
9515
- }
9516
- if (!consume(buffer, address, output)) {
9517
- break;
9518
- }
9519
- if (++tokenCount > 7) {
9520
- output.error = true;
9521
- break;
9518
+ function compressIPv6ZeroRun(hextets) {
9519
+ let bestStart = -1;
9520
+ let bestLength = 0;
9521
+ let runStart = -1;
9522
+ let runLength = 0;
9523
+ for (let i2 = 0; i2 < hextets.length; i2++) {
9524
+ if (hextets[i2] === "0") {
9525
+ if (runStart === -1) runStart = i2;
9526
+ runLength++;
9527
+ if (runLength > bestLength) {
9528
+ bestLength = runLength;
9529
+ bestStart = runStart;
9522
9530
  }
9523
- if (i2 > 0 && input[i2 - 1] === ":") {
9524
- endipv6Encountered = true;
9525
- }
9526
- address.push(":");
9527
- continue;
9528
- } else if (cursor === "%") {
9529
- if (!consume(buffer, address, output)) {
9530
- break;
9531
- }
9532
- consume = consumeIsZone;
9533
9531
  } else {
9534
- buffer.push(cursor);
9532
+ runStart = -1;
9533
+ runLength = 0;
9534
+ }
9535
+ }
9536
+ if (bestLength < 2) return hextets.join(":");
9537
+ const head = hextets.slice(0, bestStart).join(":");
9538
+ const tail = hextets.slice(bestStart + bestLength).join(":");
9539
+ return head + "::" + tail;
9540
+ }
9541
+ function normalizeIPv6Address(input) {
9542
+ const compression = input.indexOf("::");
9543
+ if (compression !== -1 && input.indexOf("::", compression + 1) !== -1) return void 0;
9544
+ const left = compression === -1 ? input.split(":") : input.slice(0, compression).split(":");
9545
+ const right = compression === -1 ? [] : input.slice(compression + 2).split(":");
9546
+ if (compression !== -1) {
9547
+ if (left.length === 1 && left[0] === "") left.length = 0;
9548
+ if (right.length === 1 && right[0] === "") right.length = 0;
9549
+ }
9550
+ const parts = left.concat(right);
9551
+ let hextetCount = 0;
9552
+ for (let i2 = 0; i2 < parts.length; i2++) {
9553
+ const part = parts[i2];
9554
+ if (part === "") return void 0;
9555
+ if (part.indexOf(".") !== -1) {
9556
+ if (i2 !== parts.length - 1 || compression !== -1 && right.length === 0 || !isIPv4(part)) return void 0;
9557
+ hextetCount += 2;
9535
9558
  continue;
9536
9559
  }
9560
+ if (!isHextet(part)) return void 0;
9561
+ parts[i2] = parseInt(part, 16).toString(16);
9562
+ hextetCount++;
9537
9563
  }
9538
- if (buffer.length) {
9539
- if (consume === consumeIsZone) {
9540
- output.zone = buffer.join("");
9541
- } else if (endIpv6) {
9542
- address.push(buffer.join(""));
9543
- } else {
9544
- address.push(stringArrayToHexStripped(buffer));
9545
- }
9564
+ if (compression === -1) {
9565
+ if (hextetCount !== 8) return void 0;
9566
+ return compressIPv6ZeroRun(parts);
9546
9567
  }
9547
- output.address = address.join("");
9548
- return output;
9568
+ if (hextetCount >= 8) return void 0;
9569
+ const expanded = parts.slice(0, left.length);
9570
+ for (let i2 = hextetCount; i2 < 8; i2++) expanded.push("0");
9571
+ for (let i2 = left.length; i2 < parts.length; i2++) expanded.push(parts[i2]);
9572
+ return compressIPv6ZeroRun(expanded);
9549
9573
  }
9550
9574
  function normalizeIPv6(host) {
9551
- if (findToken(host, ":") < 2) {
9552
- return { host, isIPV6: false };
9553
- }
9554
- const ipv6 = getIPV6(host);
9555
- if (!ipv6.error) {
9556
- let newHost = ipv6.address;
9557
- let escapedHost = ipv6.address;
9558
- if (ipv6.zone) {
9559
- newHost += "%" + ipv6.zone;
9560
- escapedHost += "%25" + ipv6.zone;
9561
- }
9562
- return { host: newHost, isIPV6: true, escapedHost };
9563
- } else {
9564
- return { host, isIPV6: false };
9565
- }
9575
+ const bracketed = host[0] === "[" && host[host.length - 1] === "]";
9576
+ const hasBracket = host[0] === "[" || host[host.length - 1] === "]";
9577
+ if (hasBracket && !bracketed) return { host, isIPV6: false, error: true };
9578
+ let input = bracketed ? host.slice(1, -1) : host;
9579
+ if (bracketed && isIPvFuture(input)) {
9580
+ input = input.toLowerCase();
9581
+ return { host: `[${input}]`, escapedHost: input, isIPV6: false, isIPVFuture: true };
9582
+ }
9583
+ if (findToken(input, ":") < 2) {
9584
+ return { host, isIPV6: false, error: bracketed };
9585
+ }
9586
+ let zoneIdentifier = "";
9587
+ const zoneSeparator = input.indexOf("%");
9588
+ if (zoneSeparator !== -1) {
9589
+ const separatorLength = input.slice(zoneSeparator, zoneSeparator + 3).toLowerCase() === "%25" ? 3 : 1;
9590
+ zoneIdentifier = input.slice(zoneSeparator + separatorLength);
9591
+ if (!isZoneIdentifier(zoneIdentifier)) return { host, isIPV6: false, error: true };
9592
+ input = input.slice(0, zoneSeparator);
9593
+ }
9594
+ const address = normalizeIPv6Address(input);
9595
+ if (address === void 0) return { host, isIPV6: false, error: true };
9596
+ return {
9597
+ host: address + (zoneIdentifier ? "%" + zoneIdentifier : ""),
9598
+ escapedHost: address + (zoneIdentifier ? "%25" + zoneIdentifier : ""),
9599
+ isIPV6: true
9600
+ };
9566
9601
  }
9567
9602
  function findToken(str, token) {
9568
9603
  let ind = 0;
@@ -9681,7 +9716,8 @@ var require_utils = __commonJS2({
9681
9716
  function normalizePathEncoding(input) {
9682
9717
  let output = "";
9683
9718
  for (let i2 = 0; i2 < input.length; i2++) {
9684
- if (input[i2] === "%" && i2 + 2 < input.length) {
9719
+ const ch = input[i2];
9720
+ if (ch === "%" && i2 + 2 < input.length) {
9685
9721
  const hex = input.slice(i2 + 1, i2 + 3);
9686
9722
  if (isHexPair(hex)) {
9687
9723
  const normalizedHex = hex.toUpperCase();
@@ -9695,10 +9731,152 @@ var require_utils = __commonJS2({
9695
9731
  continue;
9696
9732
  }
9697
9733
  }
9698
- if (isPathCharacter(input[i2])) {
9699
- output += input[i2];
9734
+ if (isPathCharacter(ch)) {
9735
+ output += ch;
9736
+ } else {
9737
+ const code = input.charCodeAt(i2);
9738
+ if (code < 128) {
9739
+ output += isEscapeSafe(code) ? ch : BYTE_HEX[code];
9740
+ } else if (code < 55296 || code > 57343) {
9741
+ output += percentEncodeNonAscii(code);
9742
+ } else if (code <= 56319 && i2 + 1 < input.length) {
9743
+ const low = input.charCodeAt(i2 + 1);
9744
+ if (low >= 56320 && low <= 57343) {
9745
+ output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
9746
+ i2++;
9747
+ } else {
9748
+ output += percentEncodeNonAscii(65533);
9749
+ }
9750
+ } else {
9751
+ output += percentEncodeNonAscii(65533);
9752
+ }
9753
+ }
9754
+ }
9755
+ return output;
9756
+ }
9757
+ function serializePathEncoding(input, pathNoScheme = false) {
9758
+ let output = "";
9759
+ let firstSegment = pathNoScheme && input[0] !== "/";
9760
+ for (let i2 = 0; i2 < input.length; i2++) {
9761
+ const ch = input[i2];
9762
+ if (ch === "%" && i2 + 2 < input.length) {
9763
+ const hex = input.slice(i2 + 1, i2 + 3);
9764
+ if (isHexPair(hex)) {
9765
+ output += "%" + hex.toUpperCase();
9766
+ i2 += 2;
9767
+ continue;
9768
+ }
9769
+ }
9770
+ if (ch === "/") {
9771
+ firstSegment = false;
9772
+ }
9773
+ if (isPathCharacter(ch) && (ch !== ":" || !firstSegment)) {
9774
+ output += ch;
9700
9775
  } else {
9701
- output += escape(input[i2]);
9776
+ const code = input.charCodeAt(i2);
9777
+ if (code < 128) {
9778
+ output += BYTE_HEX[code];
9779
+ } else if (code < 55296 || code > 57343) {
9780
+ output += percentEncodeNonAscii(code);
9781
+ } else if (code <= 56319 && i2 + 1 < input.length) {
9782
+ const low = input.charCodeAt(i2 + 1);
9783
+ if (low >= 56320 && low <= 57343) {
9784
+ output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
9785
+ i2++;
9786
+ } else {
9787
+ output += percentEncodeNonAscii(65533);
9788
+ }
9789
+ } else {
9790
+ output += percentEncodeNonAscii(65533);
9791
+ }
9792
+ }
9793
+ }
9794
+ return output;
9795
+ }
9796
+ function encodeComponent(input, isAllowed) {
9797
+ let output = "";
9798
+ for (let i2 = 0; i2 < input.length; i2++) {
9799
+ const ch = input[i2];
9800
+ if (ch === "%" && i2 + 2 < input.length) {
9801
+ const hex = input.slice(i2 + 1, i2 + 3);
9802
+ if (isHexPair(hex)) {
9803
+ output += "%" + hex.toUpperCase();
9804
+ i2 += 2;
9805
+ continue;
9806
+ }
9807
+ }
9808
+ if (isAllowed(ch)) {
9809
+ output += ch;
9810
+ } else {
9811
+ const code = input.charCodeAt(i2);
9812
+ if (code < 128) {
9813
+ output += BYTE_HEX[code];
9814
+ } else if (code < 55296 || code > 57343) {
9815
+ output += percentEncodeNonAscii(code);
9816
+ } else if (code <= 56319 && i2 + 1 < input.length) {
9817
+ const low = input.charCodeAt(i2 + 1);
9818
+ if (low >= 56320 && low <= 57343) {
9819
+ output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
9820
+ i2++;
9821
+ } else {
9822
+ output += percentEncodeNonAscii(65533);
9823
+ }
9824
+ } else {
9825
+ output += percentEncodeNonAscii(65533);
9826
+ }
9827
+ }
9828
+ }
9829
+ return output;
9830
+ }
9831
+ function encodeUserinfo(input) {
9832
+ return encodeComponent(input, isUserinfoCharacter);
9833
+ }
9834
+ function encodeQuery(input) {
9835
+ return encodeComponent(input, isQueryFragmentCharacter);
9836
+ }
9837
+ function encodeFragment(input) {
9838
+ return encodeComponent(input, isQueryFragmentCharacter);
9839
+ }
9840
+ function isEscapeSafe(cp) {
9841
+ return cp >= 48 && cp <= 57 || cp >= 65 && cp <= 90 || cp >= 97 && cp <= 122 || cp === 42 || cp === 43 || cp === 45 || cp === 46 || cp === 47 || cp === 64 || cp === 95;
9842
+ }
9843
+ function normalizeQueryFragmentEncoding(input) {
9844
+ let output = "";
9845
+ for (let i2 = 0; i2 < input.length; i2++) {
9846
+ const ch = input[i2];
9847
+ if (ch === "%" && i2 + 2 < input.length) {
9848
+ const hex = input.slice(i2 + 1, i2 + 3);
9849
+ if (isHexPair(hex)) {
9850
+ const normalizedHex = hex.toUpperCase();
9851
+ const decoded = String.fromCharCode(parseInt(normalizedHex, 16));
9852
+ if (isUnreserved(decoded)) {
9853
+ output += decoded;
9854
+ } else {
9855
+ output += "%" + normalizedHex;
9856
+ }
9857
+ i2 += 2;
9858
+ continue;
9859
+ }
9860
+ }
9861
+ if (isQueryFragmentCharacter(ch)) {
9862
+ output += ch;
9863
+ } else {
9864
+ const code = input.charCodeAt(i2);
9865
+ if (code < 128) {
9866
+ output += isEscapeSafe(code) ? ch : BYTE_HEX[code];
9867
+ } else if (code < 55296 || code > 57343) {
9868
+ output += percentEncodeNonAscii(code);
9869
+ } else if (code <= 56319 && i2 + 1 < input.length) {
9870
+ const low = input.charCodeAt(i2 + 1);
9871
+ if (low >= 56320 && low <= 57343) {
9872
+ output += percentEncodeNonAscii(65536 + (code - 55296 << 10) + (low - 56320));
9873
+ i2++;
9874
+ } else {
9875
+ output += percentEncodeNonAscii(65533);
9876
+ }
9877
+ } else {
9878
+ output += percentEncodeNonAscii(65533);
9879
+ }
9702
9880
  }
9703
9881
  }
9704
9882
  return output;
@@ -9721,14 +9899,18 @@ var require_utils = __commonJS2({
9721
9899
  function recomposeAuthority(component) {
9722
9900
  const uriTokens = [];
9723
9901
  if (component.userinfo !== void 0) {
9724
- uriTokens.push(component.userinfo);
9902
+ uriTokens.push(encodeUserinfo(component.userinfo));
9725
9903
  uriTokens.push("@");
9726
9904
  }
9727
9905
  if (component.host !== void 0) {
9728
- let host = unescape(component.host);
9906
+ let host = component.host;
9729
9907
  if (!isIPv4(host)) {
9730
- const ipV6res = normalizeIPv6(host);
9731
- if (ipV6res.isIPV6 === true) {
9908
+ let ipV6res = normalizeIPv6(host);
9909
+ if (ipV6res.isIPV6 !== true && ipV6res.isIPVFuture !== true) {
9910
+ host = normalizePercentEncoding(host, true);
9911
+ ipV6res = normalizeIPv6(host);
9912
+ }
9913
+ if (ipV6res.isIPV6 === true || ipV6res.isIPVFuture === true) {
9732
9914
  host = `[${ipV6res.escapedHost}]`;
9733
9915
  } else {
9734
9916
  host = reescapeHostDelimiters(host, false);
@@ -9737,8 +9919,12 @@ var require_utils = __commonJS2({
9737
9919
  uriTokens.push(host);
9738
9920
  }
9739
9921
  if (typeof component.port === "number" || typeof component.port === "string") {
9922
+ const port = String(component.port);
9923
+ if (!isPort(port)) {
9924
+ throw new TypeError("URI port is malformed.");
9925
+ }
9740
9926
  uriTokens.push(":");
9741
- uriTokens.push(String(component.port));
9927
+ uriTokens.push(port);
9742
9928
  }
9743
9929
  return uriTokens.length ? uriTokens.join("") : void 0;
9744
9930
  }
@@ -9748,6 +9934,11 @@ var require_utils = __commonJS2({
9748
9934
  reescapeHostDelimiters,
9749
9935
  normalizePercentEncoding,
9750
9936
  normalizePathEncoding,
9937
+ serializePathEncoding,
9938
+ normalizeQueryFragmentEncoding,
9939
+ encodeUserinfo,
9940
+ encodeQuery,
9941
+ encodeFragment,
9751
9942
  escapePreservingEscapes,
9752
9943
  removeDotSegments,
9753
9944
  isIPv4,
@@ -9758,9 +9949,9 @@ var require_utils = __commonJS2({
9758
9949
  }
9759
9950
  });
9760
9951
  var require_schemes = __commonJS2({
9761
- "../../node_modules/.pnpm/fast-uri@3.1.5/node_modules/fast-uri/lib/schemes.js"(exports$1, module) {
9952
+ "../../node_modules/.pnpm/fast-uri@3.1.7/node_modules/fast-uri/lib/schemes.js"(exports$1, module) {
9762
9953
  var { isUUID } = require_utils();
9763
- var URN_REG = /([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-.:;=@]|%[\da-f]{2})+)/iu;
9954
+ var URN_REG = /^([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-./:;=@]|%[\da-f]{2})+)$/iu;
9764
9955
  var supportedSchemeNames = (
9765
9956
  /** @type {const} */
9766
9957
  [
@@ -9821,9 +10012,10 @@ var require_schemes = __commonJS2({
9821
10012
  wsComponent.secure = void 0;
9822
10013
  }
9823
10014
  if (wsComponent.resourceName) {
9824
- const [path52, query] = wsComponent.resourceName.split("?");
10015
+ const queryIndex = wsComponent.resourceName.indexOf("?");
10016
+ const path52 = queryIndex === -1 ? wsComponent.resourceName : wsComponent.resourceName.slice(0, queryIndex);
9825
10017
  wsComponent.path = path52 && path52 !== "/" ? path52 : void 0;
9826
- wsComponent.query = query;
10018
+ wsComponent.query = queryIndex === -1 ? void 0 : wsComponent.resourceName.slice(queryIndex + 1);
9827
10019
  wsComponent.resourceName = void 0;
9828
10020
  }
9829
10021
  wsComponent.fragment = void 0;
@@ -9835,7 +10027,7 @@ var require_schemes = __commonJS2({
9835
10027
  return urnComponent;
9836
10028
  }
9837
10029
  const matches = urnComponent.path.match(URN_REG);
9838
- if (matches) {
10030
+ if (matches && matches[0] === urnComponent.path) {
9839
10031
  const scheme = options.scheme || urnComponent.scheme || "urn";
9840
10032
  urnComponent.nid = matches[1].toLowerCase();
9841
10033
  urnComponent.nss = matches[2];
@@ -9965,9 +10157,18 @@ var require_schemes = __commonJS2({
9965
10157
  }
9966
10158
  });
9967
10159
  var require_fast_uri = __commonJS2({
9968
- "../../node_modules/.pnpm/fast-uri@3.1.5/node_modules/fast-uri/index.js"(exports$1, module) {
9969
- var { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding, escapePreservingEscapes, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require_utils();
10160
+ "../../node_modules/.pnpm/fast-uri@3.1.7/node_modules/fast-uri/index.js"(exports$1, module) {
10161
+ var { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding, serializePathEncoding, normalizeQueryFragmentEncoding, encodeQuery, encodeFragment, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require_utils();
9970
10162
  var { SCHEMES, getSchemeHandler } = require_schemes();
10163
+ var VALID_SCHEME = /^[A-Za-z][A-Za-z0-9+.-]*$/u;
10164
+ var MALFORMED_SCHEME_ERROR = "URI scheme is malformed.";
10165
+ function decodeValidScheme(scheme) {
10166
+ const decodedScheme = unescape(String(scheme));
10167
+ if (!VALID_SCHEME.test(decodedScheme)) {
10168
+ throw new TypeError(MALFORMED_SCHEME_ERROR);
10169
+ }
10170
+ return decodedScheme;
10171
+ }
9971
10172
  function normalize(uri, options) {
9972
10173
  if (typeof uri === "string") {
9973
10174
  uri = /** @type {T} */
@@ -9980,12 +10181,34 @@ var require_fast_uri = __commonJS2({
9980
10181
  }
9981
10182
  function resolve(baseURI, relativeURI, options) {
9982
10183
  const schemelessOptions = options ? Object.assign({ scheme: "null" }, options) : { scheme: "null" };
9983
- const { parsed: baseParsed, malformedAuthorityOrPort: baseMalformed } = parseWithStatus(baseURI, schemelessOptions);
9984
- const { parsed: relativeParsed, malformedAuthorityOrPort: relativeMalformed } = parseWithStatus(relativeURI, schemelessOptions);
9985
- if (baseMalformed || relativeMalformed) {
10184
+ const {
10185
+ parsed: baseParsed,
10186
+ malformedAuthorityOrPort: baseMalformed,
10187
+ malformedPercentEncoding: baseMalformedPercentEncoding,
10188
+ malformedSchemeSpecific: baseMalformedSchemeSpecific,
10189
+ malformedHost: baseMalformedHost,
10190
+ malformedScheme: baseMalformedScheme
10191
+ } = parseWithStatus(baseURI, schemelessOptions);
10192
+ const {
10193
+ parsed: relativeParsed,
10194
+ malformedAuthorityOrPort: relativeMalformed,
10195
+ malformedPercentEncoding: relativeMalformedPercentEncoding,
10196
+ malformedSchemeSpecific: relativeMalformedSchemeSpecific,
10197
+ malformedHost: relativeMalformedHost,
10198
+ malformedScheme: relativeMalformedScheme
10199
+ } = parseWithStatus(relativeURI, schemelessOptions);
10200
+ if (baseMalformed || relativeMalformed || baseMalformedPercentEncoding || relativeMalformedPercentEncoding || baseMalformedSchemeSpecific || relativeMalformedSchemeSpecific || baseMalformedHost || relativeMalformedHost || baseMalformedScheme || relativeMalformedScheme) {
9986
10201
  throw new Error(baseParsed.error || relativeParsed.error || "URI is malformed.");
9987
10202
  }
9988
10203
  const resolved = resolveComponent(baseParsed, relativeParsed, schemelessOptions, true);
10204
+ const resolvedSchemeHandler = getSchemeHandler(options && options.scheme || resolved.scheme);
10205
+ const resolvedHost = resolved.host;
10206
+ const resolvedHostIsIP = resolvedHost !== void 0 && resolvedHost !== "" && (isIPv4(resolvedHost) || normalizeIPv6(resolvedHost).isIPV6);
10207
+ canonicalizeHost(resolved, options || {}, resolvedSchemeHandler, resolvedHostIsIP);
10208
+ const encodedASCIIHost = resolvedHost && resolvedHost.indexOf("%") !== -1 && !new RegExp("\\P{ASCII}", "u").test(resolvedHost);
10209
+ if (resolved.error && !encodedASCIIHost) {
10210
+ throw new Error(resolved.error);
10211
+ }
9989
10212
  schemelessOptions.skipEscape = true;
9990
10213
  return serialize2(resolved, schemelessOptions);
9991
10214
  }
@@ -10045,7 +10268,7 @@ var require_fast_uri = __commonJS2({
10045
10268
  function equal(uriA, uriB, options) {
10046
10269
  const normalizedA = normalizeComparableURI(uriA, options);
10047
10270
  const normalizedB = normalizeComparableURI(uriB, options);
10048
- return normalizedA !== void 0 && normalizedB !== void 0 && normalizedA.toLowerCase() === normalizedB.toLowerCase();
10271
+ return normalizedA !== void 0 && normalizedB !== void 0 && normalizedA === normalizedB;
10049
10272
  }
10050
10273
  function serialize2(cmpts, opts) {
10051
10274
  const component = {
@@ -10066,19 +10289,22 @@ var require_fast_uri = __commonJS2({
10066
10289
  };
10067
10290
  const options = Object.assign({}, opts);
10068
10291
  const uriTokens = [];
10292
+ if (component.scheme) {
10293
+ component.scheme = decodeValidScheme(component.scheme);
10294
+ }
10069
10295
  const schemeHandler = getSchemeHandler(options.scheme || component.scheme);
10070
10296
  if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(component, options);
10297
+ const hasAuthority = component.userinfo !== void 0 || component.host !== void 0 || component.port !== void 0;
10298
+ const pathNoScheme = !options.skipEscape && component.scheme === void 0 && !hasAuthority;
10071
10299
  if (component.path !== void 0) {
10072
10300
  if (!options.skipEscape) {
10073
- component.path = escapePreservingEscapes(component.path);
10074
- if (component.scheme !== void 0) {
10075
- component.path = component.path.split("%3A").join(":");
10076
- }
10301
+ component.path = serializePathEncoding(component.path, pathNoScheme);
10077
10302
  } else {
10078
10303
  component.path = normalizePercentEncoding(component.path);
10079
10304
  }
10080
10305
  }
10081
10306
  if (options.reference !== "suffix" && component.scheme) {
10307
+ component.scheme = decodeValidScheme(component.scheme);
10082
10308
  uriTokens.push(component.scheme, ":");
10083
10309
  }
10084
10310
  const authority = recomposeAuthority(component);
@@ -10096,16 +10322,19 @@ var require_fast_uri = __commonJS2({
10096
10322
  if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {
10097
10323
  s3 = removeDotSegments(s3);
10098
10324
  }
10325
+ if (pathNoScheme) {
10326
+ s3 = serializePathEncoding(s3, true);
10327
+ }
10099
10328
  if (authority === void 0 && s3[0] === "/" && s3[1] === "/") {
10100
10329
  s3 = "/%2F" + s3.slice(2);
10101
10330
  }
10102
10331
  uriTokens.push(s3);
10103
10332
  }
10104
10333
  if (component.query !== void 0) {
10105
- uriTokens.push("?", component.query);
10334
+ uriTokens.push("?", encodeQuery(component.query));
10106
10335
  }
10107
10336
  if (component.fragment !== void 0) {
10108
- uriTokens.push("#", component.fragment);
10337
+ uriTokens.push("#", encodeFragment(component.fragment));
10109
10338
  }
10110
10339
  return uriTokens.join("");
10111
10340
  }
@@ -10121,6 +10350,35 @@ var require_fast_uri = __commonJS2({
10121
10350
  }
10122
10351
  return void 0;
10123
10352
  }
10353
+ function hasMalformedPercentEncoding(component) {
10354
+ if (component === void 0) return false;
10355
+ let percent = component.indexOf("%");
10356
+ while (percent !== -1) {
10357
+ if (percent + 2 >= component.length || !/^[\da-f]{2}$/iu.test(component.slice(percent + 1, percent + 3))) {
10358
+ return true;
10359
+ }
10360
+ percent = component.indexOf("%", percent + 3);
10361
+ }
10362
+ return false;
10363
+ }
10364
+ function isIPLiteral(host) {
10365
+ return host[0] === "[" && host[host.length - 1] === "]";
10366
+ }
10367
+ function hasMalformedComponentPercentEncoding(matches) {
10368
+ const host = matches[4];
10369
+ return hasMalformedPercentEncoding(matches[3]) || host !== void 0 && !isIPLiteral(host) && hasMalformedPercentEncoding(host) || hasMalformedPercentEncoding(matches[6]) || hasMalformedPercentEncoding(matches[7]) || hasMalformedPercentEncoding(matches[8]);
10370
+ }
10371
+ function canonicalizeHost(parsed, options, schemeHandler, isIP) {
10372
+ if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport) && parsed.host && !isIPLiteral(parsed.host) && (options.domainHost || schemeHandler && schemeHandler.domainHost) && isIP === false && nonSimpleDomain(parsed.host)) {
10373
+ try {
10374
+ parsed.host = new URL("http://" + parsed.host).hostname;
10375
+ } catch (e) {
10376
+ parsed.error = parsed.error || "Host's domain name can not be converted to ASCII: " + e;
10377
+ return true;
10378
+ }
10379
+ }
10380
+ return false;
10381
+ }
10124
10382
  function parseWithStatus(uri, opts) {
10125
10383
  const options = Object.assign({}, opts);
10126
10384
  const parsed = {
@@ -10133,6 +10391,11 @@ var require_fast_uri = __commonJS2({
10133
10391
  fragment: void 0
10134
10392
  };
10135
10393
  let malformedAuthorityOrPort = false;
10394
+ let malformedPercentEncoding = false;
10395
+ let malformedSchemeSpecific = false;
10396
+ let malformedHost = false;
10397
+ let malformedIPLiteral = false;
10398
+ let malformedScheme = false;
10136
10399
  let isIP = false;
10137
10400
  if (options.reference === "suffix") {
10138
10401
  if (options.scheme) {
@@ -10169,6 +10432,19 @@ var require_fast_uri = __commonJS2({
10169
10432
  parsed.path = matches[6] || "";
10170
10433
  parsed.query = matches[7];
10171
10434
  parsed.fragment = matches[8];
10435
+ if (parsed.scheme !== void 0) {
10436
+ const decodedScheme = unescape(parsed.scheme);
10437
+ if (VALID_SCHEME.test(decodedScheme)) {
10438
+ parsed.scheme = decodedScheme.toLowerCase();
10439
+ } else {
10440
+ parsed.error = parsed.error || MALFORMED_SCHEME_ERROR;
10441
+ malformedScheme = true;
10442
+ }
10443
+ }
10444
+ malformedPercentEncoding = hasMalformedComponentPercentEncoding(matches);
10445
+ if (malformedPercentEncoding) {
10446
+ parsed.error = parsed.error || "URI contains malformed percent-encoding.";
10447
+ }
10172
10448
  if (isNaN(parsed.port)) {
10173
10449
  parsed.port = matches[5];
10174
10450
  }
@@ -10180,9 +10456,16 @@ var require_fast_uri = __commonJS2({
10180
10456
  if (parsed.host) {
10181
10457
  const ipv4result = isIPv4(parsed.host);
10182
10458
  if (ipv4result === false) {
10459
+ const bracketedIPLiteral = isIPLiteral(parsed.host);
10460
+ const hasIPLiteralBracket = parsed.host.indexOf("[") !== -1 || parsed.host.indexOf("]") !== -1;
10183
10461
  const ipv6result = normalizeIPv6(parsed.host);
10184
- parsed.host = ipv6result.host.toLowerCase();
10185
- isIP = ipv6result.isIPV6;
10462
+ isIP = ipv6result.isIPV6 || ipv6result.isIPVFuture === true;
10463
+ malformedIPLiteral = hasIPLiteralBracket && (!bracketedIPLiteral || ipv6result.error === true);
10464
+ parsed.host = isIP ? ipv6result.host : ipv6result.host.toLowerCase();
10465
+ if (malformedIPLiteral) {
10466
+ parsed.error = parsed.error || "URI host is malformed.";
10467
+ malformedAuthorityOrPort = true;
10468
+ }
10186
10469
  } else {
10187
10470
  isIP = true;
10188
10471
  }
@@ -10200,42 +10483,36 @@ var require_fast_uri = __commonJS2({
10200
10483
  parsed.error = parsed.error || "URI is not a " + options.reference + " reference.";
10201
10484
  }
10202
10485
  const schemeHandler = getSchemeHandler(options.scheme || parsed.scheme);
10203
- if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {
10204
- if (parsed.host && (options.domainHost || schemeHandler && schemeHandler.domainHost) && isIP === false && nonSimpleDomain(parsed.host)) {
10205
- try {
10206
- parsed.host = new URL("http://" + parsed.host).hostname;
10207
- } catch (e) {
10208
- parsed.error = parsed.error || "Host's domain name can not be converted to ASCII: " + e;
10209
- }
10210
- }
10486
+ if (!malformedIPLiteral) {
10487
+ malformedHost = canonicalizeHost(parsed, options, schemeHandler, isIP);
10211
10488
  }
10212
10489
  if (!schemeHandler || schemeHandler && !schemeHandler.skipNormalize) {
10213
10490
  if (uri.indexOf("%") !== -1) {
10214
- if (parsed.scheme !== void 0) {
10215
- parsed.scheme = unescape(parsed.scheme);
10216
- }
10217
- if (parsed.host !== void 0) {
10218
- parsed.host = reescapeHostDelimiters(unescape(parsed.host), isIP);
10491
+ if (parsed.host !== void 0 && !malformedIPLiteral) {
10492
+ const host = isIP ? parsed.host : normalizePercentEncoding(parsed.host, true);
10493
+ parsed.host = reescapeHostDelimiters(host, isIP);
10219
10494
  }
10220
10495
  }
10221
10496
  if (parsed.path) {
10222
10497
  parsed.path = normalizePathEncoding(parsed.path);
10223
10498
  }
10499
+ if (parsed.query) {
10500
+ parsed.query = normalizeQueryFragmentEncoding(parsed.query);
10501
+ }
10224
10502
  if (parsed.fragment) {
10225
- try {
10226
- parsed.fragment = encodeURI(decodeURIComponent(parsed.fragment));
10227
- } catch {
10228
- parsed.error = parsed.error || "URI malformed";
10229
- }
10503
+ parsed.fragment = normalizeQueryFragmentEncoding(parsed.fragment);
10230
10504
  }
10231
10505
  }
10232
10506
  if (schemeHandler && schemeHandler.parse) {
10233
10507
  schemeHandler.parse(parsed, options);
10508
+ if (schemeHandler === SCHEMES.urn && parsed.nid === void 0) {
10509
+ malformedSchemeSpecific = true;
10510
+ }
10234
10511
  }
10235
10512
  } else {
10236
10513
  parsed.error = parsed.error || "URI can not be parsed.";
10237
10514
  }
10238
- return { parsed, malformedAuthorityOrPort };
10515
+ return { parsed, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme };
10239
10516
  }
10240
10517
  function parse(uri, opts) {
10241
10518
  return parseWithStatus(uri, opts).parsed;
@@ -10244,20 +10521,28 @@ var require_fast_uri = __commonJS2({
10244
10521
  return normalizeStringWithStatus(uri, opts).normalized;
10245
10522
  }
10246
10523
  function normalizeStringWithStatus(uri, opts) {
10247
- const { parsed, malformedAuthorityOrPort } = parseWithStatus(uri, opts);
10524
+ const { parsed, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme } = parseWithStatus(uri, opts);
10248
10525
  return {
10249
- normalized: malformedAuthorityOrPort ? uri : serialize2(parsed, opts),
10250
- malformedAuthorityOrPort
10526
+ normalized: malformedAuthorityOrPort || malformedPercentEncoding || malformedSchemeSpecific || malformedHost || malformedScheme ? uri : serialize2(parsed, opts),
10527
+ malformedAuthorityOrPort,
10528
+ malformedPercentEncoding,
10529
+ malformedSchemeSpecific,
10530
+ malformedHost,
10531
+ malformedScheme
10251
10532
  };
10252
10533
  }
10253
10534
  function normalizeComparableURI(uri, opts) {
10254
- if (typeof uri === "string") {
10255
- const { normalized, malformedAuthorityOrPort } = normalizeStringWithStatus(uri, opts);
10256
- return malformedAuthorityOrPort ? void 0 : normalized;
10535
+ if (typeof uri !== "string" && typeof uri !== "object") {
10536
+ return void 0;
10257
10537
  }
10258
- if (typeof uri === "object") {
10259
- return serialize2(uri, opts);
10538
+ let value;
10539
+ try {
10540
+ value = typeof uri === "string" ? uri : serialize2(uri, opts);
10541
+ } catch {
10542
+ return void 0;
10260
10543
  }
10544
+ const { normalized, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme } = normalizeStringWithStatus(value, opts);
10545
+ return malformedAuthorityOrPort || malformedPercentEncoding || malformedSchemeSpecific || malformedHost || malformedScheme ? void 0 : normalized;
10261
10546
  }
10262
10547
  var fastUri = {
10263
10548
  SCHEMES,
@@ -21928,9 +22213,15 @@ DATABASE_URL=${database.envExample}
21928
22213
  # Authentication (auto-generated, change if needed)
21929
22214
  NEXTLY_SECRET=${generateNextlySecret()}
21930
22215
 
21931
- # Application URL
22216
+ # Where the Nextly app itself lives: the admin, the API, and the origin its
22217
+ # emails and preview links point at.
21932
22218
  NEXT_PUBLIC_APP_URL=http://localhost:3000
21933
22219
 
22220
+ # Where READERS find the public site. Used for canonical links, Open Graph
22221
+ # tags, the sitemap and RSS. Set it when the public site is served from a
22222
+ # different origin than the app above; otherwise the app's origin is used.
22223
+ # NEXT_PUBLIC_SITE_URL=https://example.com
22224
+
21934
22225
  ${DIAGNOSTICS_BLOCK}`;
21935
22226
  }
21936
22227
  async function generateEnv(cwd, database) {
@@ -28760,7 +29051,15 @@ async function walkSourceFiles(root) {
28760
29051
  function projectUsesFormBuilder(projectType) {
28761
29052
  return PROJECT_TYPES_WITH_FORM_BUILDER.has(projectType);
28762
29053
  }
28763
- var CONTENT_TEMPLATE_TYPES = /* @__PURE__ */ new Set(["blog"]);
29054
+ var CONTENT_TEMPLATE_TYPES = /* @__PURE__ */ new Set([
29055
+ "blog",
29056
+ // The plugin template installs `@nextlyhq/eslint-plugin` for the design-token
29057
+ // rules, and that package exists on `alpha` only — `latest` is the conservative
29058
+ // tag and lags the active release line. Pinned to `latest` a plugin scaffold
29059
+ // would resolve a version of it that predates the rules, exactly as a content
29060
+ // scaffold would resolve a `nextly` missing the helpers its pages import.
29061
+ "plugin"
29062
+ ]);
28764
29063
  function templateNextlyChannel(projectType) {
28765
29064
  return CONTENT_TEMPLATE_TYPES.has(projectType) ? "alpha" : "latest";
28766
29065
  }
@@ -29048,7 +29347,12 @@ var PINNED_VERSIONS = {
29048
29347
  "@types/react-dom": "^19",
29049
29348
  "@tailwindcss/postcss": "^4",
29050
29349
  tailwindcss: "^4",
29051
- eslint: "^9"
29350
+ eslint: "^9",
29351
+ // Compiles `nextly.config.ts` so the dev server and the CLI can read it.
29352
+ // An optional peer of `nextly` rather than a dependency, because nothing
29353
+ // that serves a request needs it: a production install omitting dev
29354
+ // dependencies never downloads it.
29355
+ esbuild: "^0.28.1"
29052
29356
  };
29053
29357
  var RUNTIME_RESOLVED_PACKAGES = ["next", "eslint-config-next"];
29054
29358
  var NEXTLY_PACKAGES = [
@@ -29060,7 +29364,8 @@ var NEXTLY_PACKAGES = [
29060
29364
  "@nextlyhq/adapter-mysql",
29061
29365
  "@nextlyhq/adapter-sqlite",
29062
29366
  "@nextlyhq/plugin-form-builder",
29063
- "@nextlyhq/plugin-sdk"
29367
+ "@nextlyhq/plugin-sdk",
29368
+ "@nextlyhq/eslint-plugin"
29064
29369
  ];
29065
29370
  var resolvedNextlyVersions = /* @__PURE__ */ new Map();
29066
29371
  async function fetchLatestVersion(pkg2, channel = "latest") {
@@ -29107,7 +29412,11 @@ async function resolveRuntimeVersions() {
29107
29412
  }
29108
29413
  async function generatePackageJson(projectName, database, useYalc = false, projectType = "blank", templateDirs = [], targetDir) {
29109
29414
  if (projectType === "plugin") {
29110
- return generatePluginPackageJson(projectName, useYalc);
29415
+ return generatePluginPackageJson(
29416
+ projectName,
29417
+ useYalc,
29418
+ templateNextlyChannel(projectType)
29419
+ );
29111
29420
  }
29112
29421
  const runtimeVersions = await resolveRuntimeVersions();
29113
29422
  const dependencies = {
@@ -29142,7 +29451,11 @@ async function generatePackageJson(projectName, database, useYalc = false, proje
29142
29451
  "@tailwindcss/postcss": PINNED_VERSIONS["@tailwindcss/postcss"],
29143
29452
  tailwindcss: PINNED_VERSIONS.tailwindcss,
29144
29453
  eslint: PINNED_VERSIONS.eslint,
29145
- "eslint-config-next": runtimeVersions["eslint-config-next"]
29454
+ "eslint-config-next": runtimeVersions["eslint-config-next"],
29455
+ // Declared HERE rather than inherited: `nextly` takes esbuild as an
29456
+ // optional peer, so nothing installs it on a project's behalf. Without it
29457
+ // the dev server cannot read `nextly.config.ts`.
29458
+ esbuild: PINNED_VERSIONS.esbuild
29146
29459
  };
29147
29460
  const shipsSearchIndex = targetDir ? await projectHasSearchIndexScript(targetDir) : false;
29148
29461
  if (shipsSearchIndex) devDependencies.pagefind = "^1.1.0";
@@ -29203,10 +29516,10 @@ async function resolvePluginNextlyRange(useYalc) {
29203
29516
  const v2 = versions["nextly"];
29204
29517
  return v2 && v2 !== "latest" ? v2 : ">=0.0.0";
29205
29518
  }
29206
- async function generatePluginPackageJson(projectName, useYalc) {
29207
- const versions = useYalc ? {} : await resolveNextlyVersions();
29519
+ async function generatePluginPackageJson(projectName, useYalc, channel) {
29520
+ const versions = useYalc ? {} : await resolveNextlyVersions(channel);
29208
29521
  const runtimeVersions = await resolveRuntimeVersions();
29209
- const range = (pkg3) => versions[pkg3] ?? "latest";
29522
+ const range = (pkg3) => versions[pkg3] ?? channel;
29210
29523
  const peerDependencies = {
29211
29524
  nextly: range("nextly"),
29212
29525
  "@nextlyhq/admin": range("@nextlyhq/admin"),
@@ -29238,7 +29551,11 @@ async function generatePluginPackageJson(projectName, useYalc) {
29238
29551
  vitest: "^4.1.0",
29239
29552
  eslint: PINNED_VERSIONS.eslint,
29240
29553
  "@eslint/js": PINNED_VERSIONS.eslint,
29241
- "typescript-eslint": "^8.0.0"
29554
+ "typescript-eslint": "^8.0.0",
29555
+ // The design-token rules the admin holds itself to. Shipped to the author
29556
+ // rather than documented at them: a rule that runs only in Nextly's own
29557
+ // repository governs the first-party plugins and nothing anyone else builds.
29558
+ "@nextlyhq/eslint-plugin": range("@nextlyhq/eslint-plugin")
29242
29559
  };
29243
29560
  const pkg2 = {
29244
29561
  name: projectName,