screw-up 1.18.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.18.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: 104b6e6ab47e8c328ae5d6883f7931b0eea4f5cd
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-B-eWBZ6y.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,7 +983,8 @@ const defaultInheritableFields = /* @__PURE__ */ new Set([
847
983
  "keywords",
848
984
  "homepage",
849
985
  "bugs",
850
- "readme"
986
+ "readme",
987
+ "files"
851
988
  ]);
852
989
  const defaultOutputMetadataKeys = [
853
990
  "name",
@@ -1049,6 +1186,7 @@ Options:
1049
1186
  --inheritable-fields <list> Comma-separated list of fields to inherit from parent
1050
1187
  --no-wds Do not check working directory status to increase version
1051
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
1052
1190
  -f, --force Allow dumping even if package.json does not exist
1053
1191
  -h, --help Show help for dump command
1054
1192
  `);
@@ -1062,6 +1200,7 @@ const dumpCommand = async (args, logger2) => {
1062
1200
  const inheritableFieldsOption = args.options["inheritable-fields"];
1063
1201
  const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
1064
1202
  const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
1203
+ const mergeFiles = !args.options["no-merge-files"];
1065
1204
  const ignorePackageJsonNotExist = args.options["force"] || args.options["f"] ? true : false;
1066
1205
  const inheritableFields = parseInheritableFields(inheritableFieldsOption);
1067
1206
  const targetDir = path.resolve(directory != null ? directory : process.cwd());
@@ -1089,6 +1228,15 @@ const dumpCommand = async (args, logger2) => {
1089
1228
  ignorePackageJsonNotExist
1090
1229
  );
1091
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
+ }
1092
1240
  console.info(JSON.stringify(computedPackageJson, null, 2));
1093
1241
  } else {
1094
1242
  _logger.error(`dump: Unable to read package.json from: ${targetDir}`);
@@ -1200,6 +1348,7 @@ Options:
1200
1348
  --inheritable-fields <list> Comma-separated list of fields to inherit from parent
1201
1349
  --no-wds Do not check working directory status to increase version
1202
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
1203
1352
  --no-replace-peer-deps Disable replacing "*" in peerDependencies with actual versions
1204
1353
  --peer-deps-prefix <prefix> Version prefix for replaced peerDependencies (default: "^")
1205
1354
  --verbose Print verbose log
@@ -1218,6 +1367,7 @@ const packCommand = async (args, logger2) => {
1218
1367
  const inheritableFieldsOption = args.options["inheritable-fields"];
1219
1368
  const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
1220
1369
  const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
1370
+ const mergeFiles = !args.options["no-merge-files"];
1221
1371
  const replacePeerDepsWildcards = !args.options["no-replace-peer-deps"];
1222
1372
  const peerDepsVersionPrefix = (_a = args.options["peer-deps-prefix"]) != null ? _a : "^";
1223
1373
  const verbose = args.options["verbose"] ? true : false;
@@ -1238,7 +1388,8 @@ const packCommand = async (args, logger2) => {
1238
1388
  readmeReplacementPath,
1239
1389
  replacePeerDepsWildcards,
1240
1390
  peerDepsVersionPrefix,
1241
- logger2
1391
+ logger2,
1392
+ mergeFiles
1242
1393
  );
1243
1394
  if (result) {
1244
1395
  if (verbose) {
@@ -1320,6 +1471,7 @@ const publishCommand = async (args, logger2) => {
1320
1471
  const inheritableFieldsOption = args.options["inheritable-fields"];
1321
1472
  const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
1322
1473
  const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
1474
+ const mergeFiles = !args.options["no-merge-files"];
1323
1475
  const replacePeerDepsWildcards = !args.options["no-replace-peer-deps"];
1324
1476
  const peerDepsVersionPrefix = (_a = args.options["peer-deps-prefix"]) != null ? _a : "^";
1325
1477
  const verbose = args.options["verbose"] ? true : false;
@@ -1329,7 +1481,7 @@ const publishCommand = async (args, logger2) => {
1329
1481
  for (let i = 0; i < args.argv.length; i++) {
1330
1482
  const arg = args.argv[i];
1331
1483
  if (arg === "publish") ;
1332
- 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") ;
1333
1485
  else if (arg === "--readme" || arg === "--inheritable-fields" || arg === "--peer-deps-prefix") {
1334
1486
  i++;
1335
1487
  } else {
@@ -1353,7 +1505,8 @@ const publishCommand = async (args, logger2) => {
1353
1505
  readmeReplacementPath,
1354
1506
  replacePeerDepsWildcards,
1355
1507
  peerDepsVersionPrefix,
1356
- logger2
1508
+ logger2,
1509
+ mergeFiles
1357
1510
  );
1358
1511
  if (result == null ? void 0 : result.metadata) {
1359
1512
  if (verbose) {
@@ -1392,7 +1545,8 @@ const publishCommand = async (args, logger2) => {
1392
1545
  readmeReplacementPath,
1393
1546
  replacePeerDepsWildcards,
1394
1547
  peerDepsVersionPrefix,
1395
- logger2
1548
+ logger2,
1549
+ mergeFiles
1396
1550
  );
1397
1551
  if (result == null ? void 0 : result.metadata) {
1398
1552
  if (verbose) {
@@ -1432,7 +1586,7 @@ const publishCommand = async (args, logger2) => {
1432
1586
  }
1433
1587
  };
1434
1588
  const showHelp = async () => {
1435
- const { author, license, repository_url, version, git_commit_hash } = await Promise.resolve().then(() => require("./packageMetadata-B-eWBZ6y.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);
1436
1590
  console.info(`screw-up [${version}-${git_commit_hash}]
1437
1591
  Easy package metadata inserter CLI
1438
1592
  Copyright (c) ${author}