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