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.js CHANGED
@@ -1,22 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
  /*!
3
3
  * name: screw-up
4
- * version: 1.18.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: 104b6e6ab47e8c328ae5d6883f7931b0eea4f5cd
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 { d as resolveRawPackageJsonObject, f as findWorkspaceRoot, h as collectWorkspaceSiblings, i as replacePeerDependenciesWildcards, g as getFetchGitMetadata, r as resolvePackageMetadata, b as generateMetadataFileContent, w as writeFileIfChanged, e as ensureMetadataGitignore, c as createConsoleLogger, n as name } from "./packageMetadata-BtM7pxOK.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,7 +982,8 @@ const defaultInheritableFields = /* @__PURE__ */ new Set([
846
982
  "keywords",
847
983
  "homepage",
848
984
  "bugs",
849
- "readme"
985
+ "readme",
986
+ "files"
850
987
  ]);
851
988
  const defaultOutputMetadataKeys = [
852
989
  "name",
@@ -1048,6 +1185,7 @@ Options:
1048
1185
  --inheritable-fields <list> Comma-separated list of fields to inherit from parent
1049
1186
  --no-wds Do not check working directory status to increase version
1050
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
1051
1189
  -f, --force Allow dumping even if package.json does not exist
1052
1190
  -h, --help Show help for dump command
1053
1191
  `);
@@ -1061,6 +1199,7 @@ const dumpCommand = async (args, logger2) => {
1061
1199
  const inheritableFieldsOption = args.options["inheritable-fields"];
1062
1200
  const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
1063
1201
  const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
1202
+ const mergeFiles = !args.options["no-merge-files"];
1064
1203
  const ignorePackageJsonNotExist = args.options["force"] || args.options["f"] ? true : false;
1065
1204
  const inheritableFields = parseInheritableFields(inheritableFieldsOption);
1066
1205
  const targetDir = resolve(directory != null ? directory : process.cwd());
@@ -1088,6 +1227,15 @@ const dumpCommand = async (args, logger2) => {
1088
1227
  ignorePackageJsonNotExist
1089
1228
  );
1090
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
+ }
1091
1239
  console.info(JSON.stringify(computedPackageJson, null, 2));
1092
1240
  } else {
1093
1241
  _logger.error(`dump: Unable to read package.json from: ${targetDir}`);
@@ -1199,6 +1347,7 @@ Options:
1199
1347
  --inheritable-fields <list> Comma-separated list of fields to inherit from parent
1200
1348
  --no-wds Do not check working directory status to increase version
1201
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
1202
1351
  --no-replace-peer-deps Disable replacing "*" in peerDependencies with actual versions
1203
1352
  --peer-deps-prefix <prefix> Version prefix for replaced peerDependencies (default: "^")
1204
1353
  --verbose Print verbose log
@@ -1217,6 +1366,7 @@ const packCommand = async (args, logger2) => {
1217
1366
  const inheritableFieldsOption = args.options["inheritable-fields"];
1218
1367
  const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
1219
1368
  const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
1369
+ const mergeFiles = !args.options["no-merge-files"];
1220
1370
  const replacePeerDepsWildcards = !args.options["no-replace-peer-deps"];
1221
1371
  const peerDepsVersionPrefix = (_a = args.options["peer-deps-prefix"]) != null ? _a : "^";
1222
1372
  const verbose = args.options["verbose"] ? true : false;
@@ -1237,7 +1387,8 @@ const packCommand = async (args, logger2) => {
1237
1387
  readmeReplacementPath,
1238
1388
  replacePeerDepsWildcards,
1239
1389
  peerDepsVersionPrefix,
1240
- logger2
1390
+ logger2,
1391
+ mergeFiles
1241
1392
  );
1242
1393
  if (result) {
1243
1394
  if (verbose) {
@@ -1319,6 +1470,7 @@ const publishCommand = async (args, logger2) => {
1319
1470
  const inheritableFieldsOption = args.options["inheritable-fields"];
1320
1471
  const checkWorkingDirectoryStatus = args.options["no-wds"] ? false : true;
1321
1472
  const alwaysOverrideVersionFromGit = !args.options["no-git-version-override"];
1473
+ const mergeFiles = !args.options["no-merge-files"];
1322
1474
  const replacePeerDepsWildcards = !args.options["no-replace-peer-deps"];
1323
1475
  const peerDepsVersionPrefix = (_a = args.options["peer-deps-prefix"]) != null ? _a : "^";
1324
1476
  const verbose = args.options["verbose"] ? true : false;
@@ -1328,7 +1480,7 @@ const publishCommand = async (args, logger2) => {
1328
1480
  for (let i = 0; i < args.argv.length; i++) {
1329
1481
  const arg = args.argv[i];
1330
1482
  if (arg === "publish") ;
1331
- 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") ;
1332
1484
  else if (arg === "--readme" || arg === "--inheritable-fields" || arg === "--peer-deps-prefix") {
1333
1485
  i++;
1334
1486
  } else {
@@ -1352,7 +1504,8 @@ const publishCommand = async (args, logger2) => {
1352
1504
  readmeReplacementPath,
1353
1505
  replacePeerDepsWildcards,
1354
1506
  peerDepsVersionPrefix,
1355
- logger2
1507
+ logger2,
1508
+ mergeFiles
1356
1509
  );
1357
1510
  if (result == null ? void 0 : result.metadata) {
1358
1511
  if (verbose) {
@@ -1391,7 +1544,8 @@ const publishCommand = async (args, logger2) => {
1391
1544
  readmeReplacementPath,
1392
1545
  replacePeerDepsWildcards,
1393
1546
  peerDepsVersionPrefix,
1394
- logger2
1547
+ logger2,
1548
+ mergeFiles
1395
1549
  );
1396
1550
  if (result == null ? void 0 : result.metadata) {
1397
1551
  if (verbose) {
@@ -1431,7 +1585,7 @@ const publishCommand = async (args, logger2) => {
1431
1585
  }
1432
1586
  };
1433
1587
  const showHelp = async () => {
1434
- const { author, license, repository_url, version, git_commit_hash } = await import("./packageMetadata-BtM7pxOK.js").then((n) => n.p);
1588
+ const { author, license, repository_url, version, git_commit_hash } = await import("./packageMetadata-DlkAQe0j.js").then((n) => n.p);
1435
1589
  console.info(`screw-up [${version}-${git_commit_hash}]
1436
1590
  Easy package metadata inserter CLI
1437
1591
  Copyright (c) ${author}