screw-up 1.17.0 → 1.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.cjs CHANGED
@@ -2,12 +2,12 @@
2
2
  "use strict";
3
3
  /*!
4
4
  * name: screw-up
5
- * version: 1.17.0
5
+ * version: 1.19.0
6
6
  * description: Simply package metadata inserter on Vite plugin
7
7
  * author: Kouji Matsui (@kekyo@mi.kekyo.net)
8
8
  * license: MIT
9
9
  * repository.url: https://github.com/kekyo/screw-up.git
10
- * git.commit.hash: 05a9f2e0dec5249126f020eee1d57f6ff8767096
10
+ * git.commit.hash: b86321865390ff8dc11c118f46a8e0ba8b67aa9c
11
11
  */
12
12
  const path = require("path");
13
13
  const fs$1 = require("fs");
@@ -17,7 +17,8 @@ const os = require("os");
17
17
  const stream = require("stream");
18
18
  const zlib = require("zlib");
19
19
  const promises = require("stream/promises");
20
- const packageMetadata = require("./packageMetadata-DdvLnmBC.cjs");
20
+ const glob = require("glob");
21
+ const packageMetadata = require("./packageMetadata-DXwK6bb8.cjs");
21
22
  /*!
22
23
  * name: tar-vern
23
24
  * version: 1.3.0
@@ -643,6 +644,118 @@ const createTarExtractor = async function* (readable, compressionType, signal) {
643
644
  }
644
645
  }
645
646
  };
647
+ const readPackageJsonFile = async (packageJsonPath) => {
648
+ const content = await fs.readFile(packageJsonPath, "utf-8");
649
+ return packageMetadata.lib.parse(content);
650
+ };
651
+ const getFilesArray = (packageJson) => {
652
+ if (!packageJson || !Array.isArray(packageJson.files)) {
653
+ return void 0;
654
+ }
655
+ const entries = packageJson.files.filter(
656
+ (entry) => typeof entry === "string"
657
+ );
658
+ return entries.length > 0 ? entries : void 0;
659
+ };
660
+ const isGlobPattern = (pattern) => /[*?[\]{}()]/.test(pattern);
661
+ const normalizeFilesPattern = (pattern, cwd) => {
662
+ const trimmed = pattern.trim();
663
+ if (!trimmed) {
664
+ return void 0;
665
+ }
666
+ const isNegated = trimmed.startsWith("!");
667
+ const raw = isNegated ? trimmed.slice(1) : trimmed;
668
+ if (!raw) {
669
+ return void 0;
670
+ }
671
+ if (isGlobPattern(raw)) {
672
+ return trimmed;
673
+ }
674
+ const fullPath = path.join(cwd, raw);
675
+ if (fs$1.existsSync(fullPath) && fs$1.statSync(fullPath).isDirectory()) {
676
+ const dirPattern = `${raw.replace(/\/+$/, "")}/**`;
677
+ return isNegated ? `!${dirPattern}` : dirPattern;
678
+ }
679
+ return trimmed;
680
+ };
681
+ const isSafeRelativePath = (value) => {
682
+ if (path.isAbsolute(value)) {
683
+ return false;
684
+ }
685
+ const segments = value.split(/[\\/]+/);
686
+ if (segments.some((segment) => segment === "..")) {
687
+ return false;
688
+ }
689
+ return true;
690
+ };
691
+ const expandFilesPatterns = async (patterns, cwd) => {
692
+ const includePatterns = [];
693
+ const excludePatterns = [];
694
+ for (const pattern of patterns) {
695
+ const normalized = normalizeFilesPattern(pattern, cwd);
696
+ if (!normalized) {
697
+ continue;
698
+ }
699
+ if (normalized.startsWith("!")) {
700
+ excludePatterns.push(normalized.slice(1));
701
+ } else {
702
+ includePatterns.push(normalized);
703
+ }
704
+ }
705
+ const result = /* @__PURE__ */ new Set();
706
+ for (const pattern of includePatterns) {
707
+ const matches = await glob.glob(pattern, { cwd, nodir: true });
708
+ for (const match of matches) {
709
+ if (isSafeRelativePath(match)) {
710
+ result.add(match);
711
+ }
712
+ }
713
+ }
714
+ for (const pattern of excludePatterns) {
715
+ const matches = await glob.glob(pattern, { cwd, nodir: true });
716
+ for (const match of matches) {
717
+ result.delete(match);
718
+ }
719
+ }
720
+ return result;
721
+ };
722
+ const mergeFilesPatterns = (parentFiles, childFiles) => {
723
+ const merged = [];
724
+ if (parentFiles == null ? void 0 : parentFiles.length) {
725
+ merged.push(...parentFiles);
726
+ }
727
+ if (childFiles == null ? void 0 : childFiles.length) {
728
+ merged.push(...childFiles);
729
+ }
730
+ return merged.length > 0 ? merged : void 0;
731
+ };
732
+ const resolveWorkspaceFilesMerge = async (targetDir, logger2) => {
733
+ const workspaceRoot = await packageMetadata.findWorkspaceRoot(targetDir, logger2);
734
+ if (!workspaceRoot) {
735
+ return void 0;
736
+ }
737
+ const rootPackagePath = path.join(workspaceRoot, "package.json");
738
+ const targetPackagePath = path.join(targetDir, "package.json");
739
+ if (path.resolve(rootPackagePath) === path.resolve(targetPackagePath)) {
740
+ return void 0;
741
+ }
742
+ const [rootPackageJson, childPackageJson] = await Promise.all([
743
+ readPackageJsonFile(rootPackagePath),
744
+ readPackageJsonFile(targetPackagePath)
745
+ ]);
746
+ const parentFiles = getFilesArray(rootPackageJson);
747
+ const childFiles = getFilesArray(childPackageJson);
748
+ const mergedFiles = mergeFilesPatterns(parentFiles, childFiles);
749
+ if (!parentFiles && !childFiles) {
750
+ return void 0;
751
+ }
752
+ return {
753
+ workspaceRoot,
754
+ parentFiles,
755
+ childFiles,
756
+ mergedFiles
757
+ };
758
+ };
646
759
  const runNpmPack = async (targetDir, packDestDir) => {
647
760
  return new Promise((res, rej) => {
648
761
  const npmProcess = child_process.spawn(
@@ -688,8 +801,8 @@ stdout: ${stdout}`));
688
801
  });
689
802
  });
690
803
  };
691
- const packAssets = async (targetDir, outputDir, checkWorkingDirectoryStatus, alwaysOverrideVersionFromGit, inheritableFields, readmeReplacementPath, replacePeerDepsWildcards, peerDepsVersionPrefix, logger2) => {
692
- var _a, _b, _c;
804
+ const packAssets = async (targetDir, outputDir, checkWorkingDirectoryStatus, alwaysOverrideVersionFromGit, inheritableFields, readmeReplacementPath, replacePeerDepsWildcards, peerDepsVersionPrefix, logger2, mergeFiles = true) => {
805
+ var _a, _b, _c, _d;
693
806
  if (!fs$1.existsSync(targetDir)) {
694
807
  throw new Error(`Target directory is not found: ${targetDir}`);
695
808
  }
@@ -751,6 +864,11 @@ const packAssets = async (targetDir, outputDir, checkWorkingDirectoryStatus, alw
751
864
  }
752
865
  }
753
866
  }
867
+ const filesMergeEnabled = mergeFiles && inheritableFields.has("files");
868
+ const workspaceFilesMerge = filesMergeEnabled ? await resolveWorkspaceFilesMerge(targetDir, logger2) : void 0;
869
+ if (filesMergeEnabled && (workspaceFilesMerge == null ? void 0 : workspaceFilesMerge.mergedFiles)) {
870
+ resolvedPackageJson.files = workspaceFilesMerge.mergedFiles;
871
+ }
754
872
  const baseTempDir = await fs.mkdtemp(path.join(os.tmpdir(), "screw-up-npm-pack-"));
755
873
  await fs.mkdir(baseTempDir, { recursive: true });
756
874
  try {
@@ -759,7 +877,25 @@ const packAssets = async (targetDir, outputDir, checkWorkingDirectoryStatus, alw
759
877
  await fs.mkdir(stagingDir, { recursive: true });
760
878
  const stream2 = fs$1.createReadStream(npmTarballPath);
761
879
  await extractTo(createTarExtractor(stream2, "gzip"), stagingDir);
762
- const packageJsonPath = path.join(stagingDir, "package", "package.json");
880
+ const packageRoot = path.join(stagingDir, "package");
881
+ if (filesMergeEnabled && ((_a = workspaceFilesMerge == null ? void 0 : workspaceFilesMerge.parentFiles) == null ? void 0 : _a.length)) {
882
+ const parentFiles = await expandFilesPatterns(
883
+ workspaceFilesMerge.parentFiles,
884
+ workspaceFilesMerge.workspaceRoot
885
+ );
886
+ for (const parentFile of parentFiles) {
887
+ const destPath = path.join(packageRoot, parentFile);
888
+ if (fs$1.existsSync(destPath)) {
889
+ continue;
890
+ }
891
+ await fs.mkdir(path.dirname(destPath), { recursive: true });
892
+ await fs.copyFile(
893
+ path.join(workspaceFilesMerge.workspaceRoot, parentFile),
894
+ destPath
895
+ );
896
+ }
897
+ }
898
+ const packageJsonPath = path.join(packageRoot, "package.json");
763
899
  if (fs$1.existsSync(packageJsonPath)) {
764
900
  await fs.writeFile(
765
901
  packageJsonPath,
@@ -767,10 +903,10 @@ const packAssets = async (targetDir, outputDir, checkWorkingDirectoryStatus, alw
767
903
  );
768
904
  }
769
905
  if (readmeReplacementCandidatePath) {
770
- const readmeDestPath = path.join(stagingDir, "package", "README.md");
906
+ const readmeDestPath = path.join(packageRoot, "README.md");
771
907
  await fs.copyFile(readmeReplacementCandidatePath, readmeDestPath);
772
908
  }
773
- const outputFileName = `${(_b = (_a = resolvedPackageJson == null ? void 0 : resolvedPackageJson.name) == null ? void 0 : _a.replace("/", "-")) != null ? _b : "package"}-${(_c = resolvedPackageJson == null ? void 0 : resolvedPackageJson.version) != null ? _c : "0.0.0"}.tgz`;
909
+ const outputFileName = `${(_c = (_b = resolvedPackageJson == null ? void 0 : resolvedPackageJson.name) == null ? void 0 : _b.replace("/", "-")) != null ? _c : "package"}-${(_d = resolvedPackageJson == null ? void 0 : resolvedPackageJson.version) != null ? _d : "0.0.0"}.tgz`;
774
910
  await fs.mkdir(outputDir, { recursive: true });
775
911
  const outputFile = path.join(outputDir, outputFileName);
776
912
  const itemGenerator = createEntryItemGenerator(stagingDir);
@@ -847,8 +983,18 @@ const defaultInheritableFields = /* @__PURE__ */ new Set([
847
983
  "keywords",
848
984
  "homepage",
849
985
  "bugs",
850
- "readme"
986
+ "readme",
987
+ "files"
851
988
  ]);
989
+ const defaultOutputMetadataKeys = [
990
+ "name",
991
+ "version",
992
+ "description",
993
+ "author",
994
+ "license",
995
+ "repository.url",
996
+ "git.commit.hash"
997
+ ];
852
998
  const parseInheritableFields = (inheritableFieldsOption) => {
853
999
  if (typeof inheritableFieldsOption !== "string") {
854
1000
  return defaultInheritableFields;
@@ -860,6 +1006,15 @@ const parseInheritableFields = (inheritableFieldsOption) => {
860
1006
  inheritableFieldsOption.split(",").map((field) => field.trim()).filter((field) => field.length > 0)
861
1007
  );
862
1008
  };
1009
+ const parseOutputMetadataKeys = (outputMetadataKeysOption) => {
1010
+ if (typeof outputMetadataKeysOption !== "string") {
1011
+ return defaultOutputMetadataKeys;
1012
+ }
1013
+ if (!outputMetadataKeysOption.trim()) {
1014
+ return [];
1015
+ }
1016
+ return outputMetadataKeysOption.split(",").map((key) => key.trim()).filter((key) => key.length > 0);
1017
+ };
863
1018
  const readInputText = async (inputPath) => {
864
1019
  if (inputPath) {
865
1020
  const resolvedPath = path.resolve(inputPath);
@@ -1031,6 +1186,7 @@ Options:
1031
1186
  --inheritable-fields <list> Comma-separated list of fields to inherit from parent
1032
1187
  --no-wds Do not check working directory status to increase version
1033
1188
  --no-git-version-override Do not override version from Git (use package.json version)
1189
+ --no-merge-files Do not merge files from parent package.json
1034
1190
  -f, --force Allow dumping even if package.json does not exist
1035
1191
  -h, --help Show help for dump command
1036
1192
  `);
@@ -1044,6 +1200,7 @@ const dumpCommand = async (args, logger2) => {
1044
1200
  const inheritableFieldsOption = args.options["inheritable-fields"];
1045
1201
  const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
1046
1202
  const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
1203
+ const mergeFiles = !args.options["no-merge-files"];
1047
1204
  const ignorePackageJsonNotExist = args.options["force"] || args.options["f"] ? true : false;
1048
1205
  const inheritableFields = parseInheritableFields(inheritableFieldsOption);
1049
1206
  const targetDir = path.resolve(directory != null ? directory : process.cwd());
@@ -1071,6 +1228,15 @@ const dumpCommand = async (args, logger2) => {
1071
1228
  ignorePackageJsonNotExist
1072
1229
  );
1073
1230
  if (computedPackageJson) {
1231
+ if (mergeFiles && inheritableFields.has("files") && fs$1.existsSync(path.join(targetDir, "package.json"))) {
1232
+ const workspaceFilesMerge = await resolveWorkspaceFilesMerge(
1233
+ targetDir,
1234
+ _logger
1235
+ );
1236
+ if (workspaceFilesMerge == null ? void 0 : workspaceFilesMerge.mergedFiles) {
1237
+ computedPackageJson.files = workspaceFilesMerge.mergedFiles;
1238
+ }
1239
+ }
1074
1240
  console.info(JSON.stringify(computedPackageJson, null, 2));
1075
1241
  } else {
1076
1242
  _logger.error(`dump: Unable to read package.json from: ${targetDir}`);
@@ -1082,6 +1248,92 @@ const dumpCommand = async (args, logger2) => {
1082
1248
  }
1083
1249
  return 0;
1084
1250
  };
1251
+ const showMetadataHelp = () => {
1252
+ console.info(`Usage: screw-up metadata [options] [directory]
1253
+
1254
+ Generate TypeScript metadata file from package metadata
1255
+
1256
+ Arguments:
1257
+ directory Directory to resolve metadata from (default: current directory)
1258
+
1259
+ Options:
1260
+ --output-metadata-file-path <path> Output path for metadata file (default: src/generated/packageMetadata.ts)
1261
+ --output-metadata-keys <list> Comma-separated list of metadata keys to include
1262
+ --no-wds Do not check working directory status to increase version
1263
+ --no-git-version-override Do not override version from Git (use package.json version)
1264
+ -h, --help Show help for metadata command
1265
+ `);
1266
+ };
1267
+ const metadataCommand = async (args, logger2) => {
1268
+ if (args.options.help || args.options.h) {
1269
+ showMetadataHelp();
1270
+ return 1;
1271
+ }
1272
+ const directory = args.positional[0];
1273
+ const outputMetadataFilePathOption = args.options["output-metadata-file-path"];
1274
+ const outputMetadataKeysOption = args.options["output-metadata-keys"];
1275
+ const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
1276
+ const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
1277
+ const outputMetadataFilePath = typeof outputMetadataFilePathOption === "string" && outputMetadataFilePathOption.trim() ? outputMetadataFilePathOption : "src/generated/packageMetadata.ts";
1278
+ const outputMetadataKeys = parseOutputMetadataKeys(outputMetadataKeysOption);
1279
+ const targetDir = path.resolve(directory != null ? directory : process.cwd());
1280
+ try {
1281
+ const fetchGitMetadata = packageMetadata.getFetchGitMetadata(
1282
+ targetDir,
1283
+ checkWorkingDirectoryStatus,
1284
+ logger2
1285
+ );
1286
+ const result = await packageMetadata.resolvePackageMetadata(
1287
+ targetDir,
1288
+ fetchGitMetadata,
1289
+ alwaysOverrideVersionFromGit,
1290
+ logger2
1291
+ );
1292
+ const metadataSourceContent = packageMetadata.generateMetadataFileContent(
1293
+ result.metadata,
1294
+ outputMetadataKeys
1295
+ );
1296
+ const metadataSourcePath = path.join(targetDir, outputMetadataFilePath);
1297
+ const metadataWritten = await packageMetadata.writeFileIfChanged(
1298
+ metadataSourcePath,
1299
+ metadataSourceContent,
1300
+ "metadata source file",
1301
+ logger2
1302
+ );
1303
+ if (fs$1.existsSync(metadataSourcePath)) {
1304
+ const gitignoreWritten = await packageMetadata.ensureMetadataGitignore(
1305
+ metadataSourcePath,
1306
+ logger2
1307
+ );
1308
+ if (gitignoreWritten) {
1309
+ logger2.info(
1310
+ `metadata: .gitignore is generated: ${path.join(
1311
+ path.dirname(outputMetadataFilePath),
1312
+ ".gitignore"
1313
+ )}`
1314
+ );
1315
+ }
1316
+ }
1317
+ if (metadataWritten) {
1318
+ logger2.info(
1319
+ `metadata: Metadata source file is generated: ${outputMetadataFilePath}`
1320
+ );
1321
+ } else if (fs$1.existsSync(metadataSourcePath)) {
1322
+ logger2.info(
1323
+ `metadata: Metadata source file is unchanged: ${outputMetadataFilePath}`
1324
+ );
1325
+ } else {
1326
+ logger2.error(
1327
+ `metadata: Failed to write metadata file: ${outputMetadataFilePath}`
1328
+ );
1329
+ return 1;
1330
+ }
1331
+ } catch (error) {
1332
+ logger2.error(`metadata: Failed to generate metadata file: ${error}`);
1333
+ return 1;
1334
+ }
1335
+ return 0;
1336
+ };
1085
1337
  const showPackHelp = () => {
1086
1338
  console.info(`Usage: screw-up pack [options] [directory]
1087
1339
 
@@ -1096,6 +1348,7 @@ Options:
1096
1348
  --inheritable-fields <list> Comma-separated list of fields to inherit from parent
1097
1349
  --no-wds Do not check working directory status to increase version
1098
1350
  --no-git-version-override Do not override version from Git (use package.json version)
1351
+ --no-merge-files Do not merge files from parent package.json
1099
1352
  --no-replace-peer-deps Disable replacing "*" in peerDependencies with actual versions
1100
1353
  --peer-deps-prefix <prefix> Version prefix for replaced peerDependencies (default: "^")
1101
1354
  --verbose Print verbose log
@@ -1114,6 +1367,7 @@ const packCommand = async (args, logger2) => {
1114
1367
  const inheritableFieldsOption = args.options["inheritable-fields"];
1115
1368
  const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
1116
1369
  const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
1370
+ const mergeFiles = !args.options["no-merge-files"];
1117
1371
  const replacePeerDepsWildcards = !args.options["no-replace-peer-deps"];
1118
1372
  const peerDepsVersionPrefix = (_a = args.options["peer-deps-prefix"]) != null ? _a : "^";
1119
1373
  const verbose = args.options["verbose"] ? true : false;
@@ -1134,7 +1388,8 @@ const packCommand = async (args, logger2) => {
1134
1388
  readmeReplacementPath,
1135
1389
  replacePeerDepsWildcards,
1136
1390
  peerDepsVersionPrefix,
1137
- logger2
1391
+ logger2,
1392
+ mergeFiles
1138
1393
  );
1139
1394
  if (result) {
1140
1395
  if (verbose) {
@@ -1216,6 +1471,7 @@ const publishCommand = async (args, logger2) => {
1216
1471
  const inheritableFieldsOption = args.options["inheritable-fields"];
1217
1472
  const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
1218
1473
  const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
1474
+ const mergeFiles = !args.options["no-merge-files"];
1219
1475
  const replacePeerDepsWildcards = !args.options["no-replace-peer-deps"];
1220
1476
  const peerDepsVersionPrefix = (_a = args.options["peer-deps-prefix"]) != null ? _a : "^";
1221
1477
  const verbose = args.options["verbose"] ? true : false;
@@ -1225,7 +1481,7 @@ const publishCommand = async (args, logger2) => {
1225
1481
  for (let i = 0; i < args.argv.length; i++) {
1226
1482
  const arg = args.argv[i];
1227
1483
  if (arg === "publish") ;
1228
- else if (arg === "--help" || arg === "--verbose" || arg === "-h" || arg === "--no-wds" || arg === "--no-git-version-override" || arg === "--no-replace-peer-deps") ;
1484
+ else if (arg === "--help" || arg === "--verbose" || arg === "-h" || arg === "--no-wds" || arg === "--no-git-version-override" || arg === "--no-merge-files" || arg === "--no-replace-peer-deps") ;
1229
1485
  else if (arg === "--readme" || arg === "--inheritable-fields" || arg === "--peer-deps-prefix") {
1230
1486
  i++;
1231
1487
  } else {
@@ -1249,7 +1505,8 @@ const publishCommand = async (args, logger2) => {
1249
1505
  readmeReplacementPath,
1250
1506
  replacePeerDepsWildcards,
1251
1507
  peerDepsVersionPrefix,
1252
- logger2
1508
+ logger2,
1509
+ mergeFiles
1253
1510
  );
1254
1511
  if (result == null ? void 0 : result.metadata) {
1255
1512
  if (verbose) {
@@ -1288,7 +1545,8 @@ const publishCommand = async (args, logger2) => {
1288
1545
  readmeReplacementPath,
1289
1546
  replacePeerDepsWildcards,
1290
1547
  peerDepsVersionPrefix,
1291
- logger2
1548
+ logger2,
1549
+ mergeFiles
1292
1550
  );
1293
1551
  if (result == null ? void 0 : result.metadata) {
1294
1552
  if (verbose) {
@@ -1328,7 +1586,7 @@ const publishCommand = async (args, logger2) => {
1328
1586
  }
1329
1587
  };
1330
1588
  const showHelp = async () => {
1331
- const { author, license, repository_url, version, git_commit_hash } = await Promise.resolve().then(() => require("./packageMetadata-DdvLnmBC.cjs")).then((n) => n.packageMetadata);
1589
+ const { author, license, repository_url, version, git_commit_hash } = await Promise.resolve().then(() => require("./packageMetadata-DXwK6bb8.cjs")).then((n) => n.packageMetadata);
1332
1590
  console.info(`screw-up [${version}-${git_commit_hash}]
1333
1591
  Easy package metadata inserter CLI
1334
1592
  Copyright (c) ${author}
@@ -1340,6 +1598,7 @@ Usage: screw-up <command> [options]
1340
1598
  Commands:
1341
1599
  format [output] Format text by replacing metadata placeholders
1342
1600
  dump [directory] Dump computed package.json as JSON
1601
+ metadata [directory] Generate TypeScript metadata file
1343
1602
  pack [directory] Pack the project into a tar archive
1344
1603
  publish [directory|package.tgz] Publish the project
1345
1604
 
@@ -1349,6 +1608,7 @@ Options:
1349
1608
  Examples:
1350
1609
  screw-up format output.txt # Format stdin template and write to file
1351
1610
  screw-up dump # Dump computed package.json as JSON
1611
+ screw-up metadata # Generate metadata file
1352
1612
  screw-up pack # Pack current directory
1353
1613
  screw-up pack --pack-destination ./dist # Pack to specific output directory
1354
1614
  screw-up publish # Publish current directory
@@ -1357,6 +1617,7 @@ Examples:
1357
1617
  };
1358
1618
  const argOptionMap = /* @__PURE__ */ new Map([
1359
1619
  ["dump", /* @__PURE__ */ new Set(["inheritable-fields"])],
1620
+ ["metadata", /* @__PURE__ */ new Set(["output-metadata-file-path", "output-metadata-keys"])],
1360
1621
  [
1361
1622
  "pack",
1362
1623
  /* @__PURE__ */ new Set([
@@ -1380,6 +1641,8 @@ const cliMain = async (args, logger2) => {
1380
1641
  return await formatCommand(parsedArgs, logger2);
1381
1642
  case "dump":
1382
1643
  return await dumpCommand(parsedArgs, logger2);
1644
+ case "metadata":
1645
+ return await metadataCommand(parsedArgs, logger2);
1383
1646
  case "pack":
1384
1647
  return await packCommand(parsedArgs, logger2);
1385
1648
  case "publish":