From 93dbe62b0adbeee2f4e219efcf58cc705a8d23a2 Mon Sep 17 00:00:00 2001 From: Ian2020 Date: Thu, 24 Jul 2025 15:08:29 +0100 Subject: [PATCH 1/2] node: Correct LocalSource check in npm provider Fix [#377](https://github.com/flatpak/flatpak-builder-tools/issues/377) and simplify the LocalSource check. Don't process the root package as a dependency. Assumes an entry without a resolved is always a local path. --- node/flatpak_node_generator/providers/npm.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/node/flatpak_node_generator/providers/npm.py b/node/flatpak_node_generator/providers/npm.py index 6ff60ebf..236a07e6 100644 --- a/node/flatpak_node_generator/providers/npm.py +++ b/node/flatpak_node_generator/providers/npm.py @@ -106,20 +106,15 @@ def _process_packages_v2( # NOTE We're not interested in symlinks, NPM will create them at install time # but we still could collect package symlinks anyway just for completeness continue + if install_path == '': + # The root project is typically listed with a key of '' + continue name = info.get('name') source: PackageSource - package_json_path = lockfile.parent / install_path / 'package.json' - if ( - 'node_modules' not in install_path.split('/') - and package_json_path.exists() - ): - source = LocalSource(path=install_path) - if name is None: - with package_json_path.open('rb') as fp: - name = json.load(fp)['name'] - elif 'resolved' in info: + + if 'resolved' in info: resolved_url = urllib.parse.urlparse(info['resolved']) if resolved_url.scheme == 'file': source = LocalSource(path=resolved_url.path) From 672b2cb4bb9255cb9a887df39252b6226cd9b99f Mon Sep 17 00:00:00 2001 From: Ian2020 Date: Thu, 24 Jul 2025 11:43:18 +0100 Subject: [PATCH 2/2] node: Add support for git sources Co-authored-by: Danilo Bargen Co-authored-by: Jordan Williams --- node/flatpak_node_generator/package.py | 14 +- .../providers/__init__.py | 11 +- node/flatpak_node_generator/providers/npm.py | 207 ++++++++++----- node/flatpak_node_generator/providers/yarn.py | 27 +- .../data/packages/git/package-lock.v1.json | 94 +++++++ .../data/packages/git/package-lock.v2.json | 250 ++++++++++++++++++ .../data/packages/git/package-lock.v3.json | 156 +++++++++++ node/tests/data/packages/git/package.json | 15 ++ node/tests/data/packages/git/subdir/index.js | 7 + .../data/packages/git/subdir/package.json | 14 + node/tests/data/packages/git/yarn.lock | 98 +++++++ .../packages/minimal-git/package-lock.v3.json | 3 +- node/tests/test_providers.py | 43 ++- node/tests/test_yarn.py | 13 +- 14 files changed, 862 insertions(+), 90 deletions(-) create mode 100644 node/tests/data/packages/git/package-lock.v1.json create mode 100644 node/tests/data/packages/git/package-lock.v2.json create mode 100644 node/tests/data/packages/git/package-lock.v3.json create mode 100644 node/tests/data/packages/git/package.json create mode 100644 node/tests/data/packages/git/subdir/index.js create mode 100644 node/tests/data/packages/git/subdir/package.json create mode 100644 node/tests/data/packages/git/yarn.lock diff --git a/node/flatpak_node_generator/package.py b/node/flatpak_node_generator/package.py index e867fa5e..d2d9cdef 100644 --- a/node/flatpak_node_generator/package.py +++ b/node/flatpak_node_generator/package.py @@ -125,13 +125,25 @@ class GitSource(PackageSource): from_: Optional[str] +@dataclass(frozen=True, eq=True) +class NamedGitSource: + package_name: str + git_source: GitSource + + @dataclass(frozen=True, eq=True) class LocalSource(PackageSource): path: str +@dataclass(frozen=True, eq=True) +class Lockfile: + path: Path + version: int + + class Package(NamedTuple): name: str version: str source: PackageSource - lockfile: Path + lockfile: Lockfile diff --git a/node/flatpak_node_generator/providers/__init__.py b/node/flatpak_node_generator/providers/__init__.py index 638c2bb4..b83cfdba 100644 --- a/node/flatpak_node_generator/providers/__init__.py +++ b/node/flatpak_node_generator/providers/__init__.py @@ -15,6 +15,7 @@ 'git': {}, 'git+http': {'scheme': 'http'}, 'git+https': {'scheme': 'https'}, + 'git+ssh': {'scheme': 'https'}, } @@ -32,6 +33,14 @@ def parse_git_source(self, version: str, from_: Optional[str] = None) -> GitSour if not new_url.netloc: path = new_url.path.split('/') new_url = new_url._replace(netloc=path[0], path='/'.join(path[1:])) + # Replace https://git@github.com:ianstormtaylor/to-camel-case.git + # with https://git@github.com/ianstormtaylor/to-camel-case.git + # for git+ssh URLs + if ':' in new_url.netloc: + netloc_split = new_url.netloc.split(':', 1) + new_url = new_url._replace( + netloc=netloc_split[0], path=f'/{netloc_split[1]}{new_url.path}' + ) return GitSource( original=original_url.geturl(), @@ -40,7 +49,7 @@ def parse_git_source(self, version: str, from_: Optional[str] = None) -> GitSour from_=from_, ) - def process_lockfile(self, lockfile: Path) -> Iterator[Package]: + def process_lockfile(self, lockfile_path: Path) -> Iterator[Package]: raise NotImplementedError() diff --git a/node/flatpak_node_generator/providers/npm.py b/node/flatpak_node_generator/providers/npm.py index 236a07e6..32bf5c74 100644 --- a/node/flatpak_node_generator/providers/npm.py +++ b/node/flatpak_node_generator/providers/npm.py @@ -25,6 +25,8 @@ from ..package import ( GitSource, LocalSource, + Lockfile, + NamedGitSource, Package, PackageSource, PackageURLSource, @@ -52,7 +54,7 @@ def __init__(self, options: Options): self.no_devel = options.no_devel def _process_packages_v1( - self, lockfile: Path, entry: Dict[str, Dict[Any, Any]] + self, lockfile: Lockfile, entry: Dict[str, Dict[Any, Any]] ) -> Iterator[Package]: for pkgname, info in entry.get('dependencies', {}).items(): if info.get('dev') and self.no_devel: @@ -81,23 +83,33 @@ def _process_packages_v1( elif version_url.scheme == 'file': source = LocalSource(path=version_url.path) else: - integrity = Integrity.parse(info['integrity']) + integrity = None + if 'integrity' in info: + integrity = Integrity.parse(info['integrity']) + if 'resolved' in info: - source = ResolvedSource( - resolved=info['resolved'], integrity=integrity - ) + resolved = info['resolved'] + if resolved.startswith('git+'): + source = self.parse_git_source(resolved) + else: + source = ResolvedSource(resolved=resolved, integrity=integrity) elif version_url.scheme in {'http', 'https'}: source = PackageURLSource(resolved=version, integrity=integrity) else: source = RegistrySource(integrity=integrity) - yield Package(name=name, version=version, source=source, lockfile=lockfile) + yield Package( + name=name, + version=version, + source=source, + lockfile=lockfile, + ) if 'dependencies' in info: yield from self._process_packages_v1(lockfile, info) def _process_packages_v2( - self, lockfile: Path, entry: Dict[str, Dict[Any, Any]] + self, lockfile: Lockfile, entry: Dict[str, Dict[Any, Any]] ) -> Iterator[Package]: for install_path, info in entry.get('packages', {}).items(): if (info.get('dev') or info.get('devOptional')) and self.no_devel: @@ -127,14 +139,10 @@ def _process_packages_v2( integrity=integrity, resolved=info['resolved'] ) elif resolved_url.scheme.startswith('git+'): - raise NotImplementedError( - 'Git sources in lockfile v2 format are not supported yet' - f' (package {install_path} in {lockfile})' - ) + source = self.parse_git_source(info['resolved']) else: - raise NotImplementedError( - f"Don't know how to handle package {install_path} in {lockfile}" - ) + source = LocalSource(path=install_path) + name = install_path # NOTE We can't reliably determine the package name from the lockfile v2 syntax, # but we need it for registry queries and special source processing; @@ -151,20 +159,20 @@ def _process_packages_v2( source=source, ) - def process_lockfile(self, lockfile: Path) -> Iterator[Package]: - with open(lockfile, encoding='utf-8') as fp: + def process_lockfile(self, lockfile_path: Path) -> Iterator[Package]: + with open(lockfile_path, encoding='utf-8') as fp: data = json.load(fp) + lockfile = Lockfile(lockfile_path, data['lockfileVersion']) + # TODO Once lockfile v2 syntax support is complete, use _process_packages_v2 # for both v2 and v2 lockfiles - if data['lockfileVersion'] in {1, 2}: + if lockfile.version in {1, 2}: yield from self._process_packages_v1(lockfile, data) - elif data['lockfileVersion'] in {3}: + elif lockfile.version in {3}: yield from self._process_packages_v2(lockfile, data) else: - raise NotImplementedError( - f'Unknown lockfile version {data["lockfileVersion"]}' - ) + raise NotImplementedError(f'Unknown lockfile version {lockfile.version}') class NpmRCFileProvider(RCFileProvider): @@ -202,9 +210,10 @@ def __init__( str, asyncio.Future[NpmModuleProvider.RegistryPackageIndex] ] = {} self.index_entries: Dict[Path, str] = {} - self.all_lockfiles: Set[Path] = set() - # Mapping of lockfiles to a dict of the Git source target paths and GitSource objects. - self.git_sources: DefaultDict[Path, Dict[Path, GitSource]] = ( + self.all_lockfiles: Set[Lockfile] = set() + # Mapping of lockfiles to a dict of the Git source target paths and + # NamedGitSource objects (package name + GitSource) + self.git_sources: DefaultDict[Lockfile, Dict[Path, NamedGitSource]] = ( collections.defaultdict(lambda: {}) ) # FIXME better pass the same provider object we created in main @@ -369,9 +378,54 @@ async def generate_package(self, package: Package) -> None: # Get a unique name to use for the Git repository folder. name = f'{package.name}-{source.commit}' path = self.gen.data_root / 'git-packages' / name - self.git_sources[package.lockfile][path] = source + self.git_sources[package.lockfile][path] = NamedGitSource( + package.name, source + ) self.gen.add_git_source(source.url, source.commit, path) + git_suffix = re.compile(r'\.git$') + url = urllib.parse.urlparse(source.url) + + if url.hostname == 'github.com': + url = url._replace( + netloc='codeload.github.com', + path=git_suffix.sub('', url.path), + ) + tarball_url = url._replace(path=url.path + f'/tar.gz/{source.commit}') + index_url = tarball_url.geturl() + elif url.hostname == 'gitlab.com': + url = url._replace( + netloc='gitlab.com', path=git_suffix.sub('', url.path) + ) + tarball_url = url._replace( + path=url.path + + f'/-/archive/{source.commit}/{package.name}-{source.commit}.tar.gz' + ) + index_url = url._replace( + path=url.path + f'/repository/archive.tar.gz?ref={source.commit}' + ).geturl() + else: + raise NotImplementedError( + f"Don't know how to handle git source with url {url.geturl()}" + ) + + metadata = await RemoteUrlMetadata.get( + tarball_url.geturl(), + cachable=True, + integrity_algorithm='sha512', + ) + + self.gen.add_url_source( + url=tarball_url.geturl(), + integrity=metadata.integrity, + destination=self.get_cacache_content_path(metadata.integrity), + ) + + self.add_index_entry( + url=index_url, + metadata=metadata, + ) + elif isinstance(source, LocalSource): pass @@ -393,7 +447,7 @@ def get_lockfile_rc(self, lockfile: Path) -> Dict[str, str]: def get_package_registry(self, package: Package) -> str: assert isinstance(package.source, RegistrySource) - rc = self.get_lockfile_rc(package.lockfile) + rc = self.get_lockfile_rc(package.lockfile.path) if rc and '/' in package.name: scope, _ = package.name.split('/', maxsplit=1) if f'{scope}:registry' in rc: @@ -432,8 +486,8 @@ def _finalize(self) -> None: if type == "object" then to_entries | map( - if (.value | type == "string") and $data[.value] - then .value = "git+file:\($buildroot)/\($data[.value])" + if (.key | type == "string") and $data[.key] + then .value = "git+file://\($buildroot)/\($data[.key])" else . end ) | from_entries @@ -445,7 +499,7 @@ def _finalize(self) -> None: walk( if type == "object" and (.version | type == "string") and $data[.version] then - .version = "git+file:\($buildroot)/\($data[.version])" + .resolved = "git+file:\($buildroot)/\($data[.version])" else . end ) @@ -453,62 +507,71 @@ def _finalize(self) -> None: } for lockfile, sources in self.git_sources.items(): - prefix = self.relative_lockfile_dir(lockfile) + prefix = self.relative_lockfile_dir(lockfile.path) data: Dict[str, Dict[str, str]] = { 'package.json': {}, 'package-lock.json': {}, } - for path, source in sources.items(): - GIT_URL_PREFIX = 'git+' - - new_version = f'{path}#{source.commit}' - assert source.from_ is not None - data['package.json'][source.from_] = new_version - data['package-lock.json'][source.original] = new_version - - if source.from_.startswith(GIT_URL_PREFIX): - data['package.json'][source.from_[len(GIT_URL_PREFIX) :]] = ( + if lockfile.version == 1: + for path, named_git_source in sources.items(): + GIT_URL_PREFIX = 'git+' + new_version = f'{path}#{named_git_source.git_source.commit}' + data['package.json'][named_git_source.package_name] = ( new_version ) - - if source.original.startswith(GIT_URL_PREFIX): data['package-lock.json'][ - source.original[len(GIT_URL_PREFIX) :] + named_git_source.git_source.original ] = new_version - for filename, script in scripts.items(): - target = Path('$FLATPAK_BUILDER_BUILDDIR') / prefix / filename - processed_script = ( - textwrap.dedent(script.lstrip('\n')).strip().replace('\n', '') - ) - json_data = json.dumps(data[filename]) - patch_commands[lockfile].append( - 'jq' - ' --arg buildroot "$FLATPAK_BUILDER_BUILDDIR"' - f' --argjson data {shlex.quote(json_data)}' - f' {shlex.quote(processed_script)} {target}' - f' > {target}.new' - ) - patch_commands[lockfile].append(f'mv {target}{{.new,}}') - - patch_all_commands: List[str] = [] - for lockfile in self.all_lockfiles: - patch_dest = ( - self.gen.data_root / 'patch' / self.relative_lockfile_dir(lockfile) - ) - # Don't use with_extension to avoid problems if the package has a . in its name. - patch_dest = patch_dest.with_name(patch_dest.name + '.sh') + if named_git_source.git_source.original.startswith( + GIT_URL_PREFIX + ): + data['package-lock.json'][ + named_git_source.git_source.original[ + len(GIT_URL_PREFIX) : + ] + ] = new_version + + for filename, script in scripts.items(): + target = Path('$FLATPAK_BUILDER_BUILDDIR') / prefix / filename + minified_script = ( + textwrap.dedent(script.lstrip('\n')) + .strip() + .replace('\n', '') + ) + json_data = json.dumps(data[filename]) + patch_commands[lockfile.path].append( + 'jq' + ' --arg buildroot "$FLATPAK_BUILDER_BUILDDIR"' + f' --argjson data {shlex.quote(json_data)}' + f' {shlex.quote(minified_script)} {target}' + f' > {target}.new' + ) + patch_commands[lockfile.path].append(f'mv {target}{{.new,}}') + + if len(patch_commands) > 0: + patch_all_commands: List[str] = [] + for lockfile in self.all_lockfiles: + patch_dest = ( + self.gen.data_root + / 'patch' + / self.relative_lockfile_dir(lockfile.path) + ) + # Don't use with_extension to avoid problems if the package has a . in its name. + patch_dest = patch_dest.with_name(patch_dest.name + '.sh') - self.gen.add_script_source(patch_commands[lockfile], patch_dest) - patch_all_commands.append(f'"$FLATPAK_BUILDER_BUILDDIR"/{patch_dest}') + self.gen.add_script_source(patch_commands[lockfile.path], patch_dest) + patch_all_commands.append(f'"$FLATPAK_BUILDER_BUILDDIR"/{patch_dest}') - patch_all_dest = self.gen.data_root / 'patch-all.sh' - self.gen.add_script_source(patch_all_commands, patch_all_dest) + patch_all_dest = self.gen.data_root / 'patch-all.sh' + self.gen.add_script_source(patch_all_commands, patch_all_dest) - if not self.no_autopatch: - # FLATPAK_BUILDER_BUILDDIR isn't defined yet for script sources. - self.gen.add_command(f'FLATPAK_BUILDER_BUILDDIR="$PWD" {patch_all_dest}') + if not self.no_autopatch: + # FLATPAK_BUILDER_BUILDDIR isn't defined yet for script sources. + self.gen.add_command( + f'FLATPAK_BUILDER_BUILDDIR="$PWD" {patch_all_dest}' + ) if self.index_entries: for path, entry in self.index_entries.items(): diff --git a/node/flatpak_node_generator/providers/yarn.py b/node/flatpak_node_generator/providers/yarn.py index e790955f..707b8270 100644 --- a/node/flatpak_node_generator/providers/yarn.py +++ b/node/flatpak_node_generator/providers/yarn.py @@ -8,7 +8,14 @@ from ..integrity import Integrity from ..manifest import ManifestGenerator -from ..package import GitSource, LocalSource, Package, PackageSource, ResolvedSource +from ..package import ( + GitSource, + LocalSource, + Lockfile, + Package, + PackageSource, + ResolvedSource, +) from . import LockfileProvider, ModuleProvider, ProviderFactory, RCFileProvider from .npm import NpmRCFileProvider from .special import SpecialSourceProvider @@ -78,7 +85,7 @@ def unquote(self, string: str) -> str: return string def process_package( - self, lockfile: Path, name_line: str, entry: Dict[str, Any] + self, lockfile: Lockfile, name_line: str, entry: Dict[str, Any] ) -> Package: assert name_line and entry @@ -99,12 +106,16 @@ def process_package( source = ResolvedSource(resolved=entry['resolved'], integrity=integrity) return Package( - name=name, version=entry['version'], source=source, lockfile=lockfile + name=name, + version=entry['version'], + source=source, + lockfile=lockfile, ) - def process_lockfile(self, lockfile: Path) -> Iterator[Package]: - for name_line, package in self.parse_lockfile(lockfile).items(): - yield self.process_package(lockfile, name_line, package) + def process_lockfile(self, lockfile_path: Path) -> Iterator[Package]: + for name_line, package in self.parse_lockfile(lockfile_path).items(): + # only lockfile v1 supported + yield self.process_package(Lockfile(lockfile_path, 1), name_line, package) class YarnRCFileProvider(RCFileProvider): @@ -161,7 +172,9 @@ async def generate_package(self, package: Package) -> None: ) elif isinstance(source, LocalSource): - assert (package.lockfile.parent / source.path / 'package.json').is_file() + assert ( + package.lockfile.path.parent / source.path / 'package.json' + ).is_file() else: raise NotImplementedError( diff --git a/node/tests/data/packages/git/package-lock.v1.json b/node/tests/data/packages/git/package-lock.v1.json new file mode 100644 index 00000000..216c21b6 --- /dev/null +++ b/node/tests/data/packages/git/package-lock.v1.json @@ -0,0 +1,94 @@ +{ + "name": "@flatpak-node-generator-tests/git", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@flatpak-node-generator-tests/subdir": { + "version": "file:subdir", + "requires": { + "arr-diff": "github:jonschlinkert/arr-diff#f39e5f10f55fd0cc38fa686c6ebc11747815850c", + "array.chunk": "git+https://github.com/zhiyelee/array.chunk.git", + "decamelize": "git+https://github.com/sindresorhus/decamelize.git#da8552d335f9067354ca9b93378482eb9f1fb821", + "filled-array": "github:sindresorhus/filled-array#v2.1.0", + "in-array": "git+ssh://git@github.com/jonschlinkert/in-array.git", + "sorted-object": "github:domenic/sorted-object", + "text-encoding-shim": "gitlab:t-affeldt/text-encoding-shim", + "unordered-array-remove": "git+ssh://git@github.com/mafintosh/unordered-array-remove.git#9ecfd7d63da6e5499b3a530574aca2d8c826af93" + } + }, + "arr-diff": { + "version": "github:jonschlinkert/arr-diff#f39e5f10f55fd0cc38fa686c6ebc11747815850c", + "from": "github:jonschlinkert/arr-diff#f39e5f10f55fd0cc38fa686c6ebc11747815850c" + }, + "array-range": { + "version": "github:mattdesl/array-range#d8b6fbdfc29caf846be02229325dfb4967f1dcd6", + "from": "github:mattdesl/array-range#master" + }, + "array.chunk": { + "version": "git+https://github.com/zhiyelee/array.chunk.git#1ba8011a64448210e334a17642e395690a7164c0", + "from": "git+https://github.com/zhiyelee/array.chunk.git" + }, + "decamelize": { + "version": "git+https://github.com/sindresorhus/decamelize.git#da8552d335f9067354ca9b93378482eb9f1fb821", + "from": "git+https://github.com/sindresorhus/decamelize.git#da8552d335f9067354ca9b93378482eb9f1fb821" + }, + "filled-array": { + "version": "github:sindresorhus/filled-array#3529bc985247d0f84db4080fecd8276643838d0c", + "from": "github:sindresorhus/filled-array#v2.1.0" + }, + "in-array": { + "version": "git+ssh://git@github.com/jonschlinkert/in-array.git#47a5e55362098646b56a3ec6775bd5198df1c7ed", + "from": "git+ssh://git@github.com/jonschlinkert/in-array.git" + }, + "is-empty-object": { + "version": "github:gummesson/is-empty-object#7b50c8eb4e14135631f7c94e01c0c8a36e5d75f8", + "from": "github:gummesson/is-empty-object#7b50c8eb4e14135631f7c94e01c0c8a36e5d75f8" + }, + "is-number": { + "version": "github:jonschlinkert/is-number#98e8ff1da1a89f93d1397a24d7413ed15421c139", + "from": "github:jonschlinkert/is-number" + }, + "person-lib": { + "version": "gitlab:volodymyrkr/person-lib#752fd1828b1eb3a9635bf725ae5e1704a375e524", + "from": "gitlab:volodymyrkr/person-lib" + }, + "sorted-object": { + "version": "github:domenic/sorted-object#87105deb13d4f4151b2abd1a78d27a5216e3e79d", + "from": "github:domenic/sorted-object" + }, + "text-encoding-shim": { + "version": "gitlab:t-affeldt/text-encoding-shim#33b05934b4e4e6c65fc06260eaa3b2aa2909e7b5", + "from": "gitlab:t-affeldt/text-encoding-shim" + }, + "to-camel-case": { + "version": "git+ssh://git@github.com/ianstormtaylor/to-camel-case.git#00a20429b600ddb6e4f8ff5b17c52914f40fe67d", + "from": "git+ssh://git@github.com/ianstormtaylor/to-camel-case.git", + "requires": { + "to-space-case": "^1.0.0" + } + }, + "to-capital-case": { + "version": "git+https://git@github.com/ianstormtaylor/to-capital-case.git#b82f61e00e099b01514e25177bb2d56d0f64b157", + "from": "git+https://git@github.com/ianstormtaylor/to-capital-case.git", + "requires": { + "to-space-case": "^1.0.0" + } + }, + "to-no-case": { + "version": "1.0.0", + "resolved": "git+https://git@github.com/ianstormtaylor/to-no-case.git#9078578dcf394e63f34fd7c6666772192e537b90" + }, + "to-space-case": { + "version": "1.0.0", + "resolved": "git+ssh://git@github.com/ianstormtaylor/to-space-case.git#aa68213d1211745ce7c6c725ba072e6b13bef640", + "requires": { + "to-no-case": "^1.0.0" + } + }, + "unordered-array-remove": { + "version": "git+ssh://git@github.com/mafintosh/unordered-array-remove.git#9ecfd7d63da6e5499b3a530574aca2d8c826af93", + "from": "git+ssh://git@github.com/mafintosh/unordered-array-remove.git#9ecfd7d63da6e5499b3a530574aca2d8c826af93" + } + } +} diff --git a/node/tests/data/packages/git/package-lock.v2.json b/node/tests/data/packages/git/package-lock.v2.json new file mode 100644 index 00000000..a036d655 --- /dev/null +++ b/node/tests/data/packages/git/package-lock.v2.json @@ -0,0 +1,250 @@ +{ + "name": "@flatpak-node-generator-tests/git", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@flatpak-node-generator-tests/git", + "version": "1.0.0", + "dependencies": { + "@flatpak-node-generator-tests/subdir": "file:subdir", + "array-range": "github:mattdesl/array-range#master", + "is-empty-object": "github:gummesson/is-empty-object#7b50c8eb4e14135631f7c94e01c0c8a36e5d75f8", + "is-number": "github:jonschlinkert/is-number", + "person-lib": "gitlab:volodymyrkr/person-lib", + "to-camel-case": "git+ssh://git@github.com:ianstormtaylor/to-camel-case.git", + "to-capital-case": "git+https://git@github.com/ianstormtaylor/to-capital-case.git", + "to-no-case": "git+https://git@github.com/ianstormtaylor/to-no-case.git#9078578dcf394e63f34fd7c6666772192e537b90", + "to-space-case": "git+ssh://git@github.com:ianstormtaylor/to-space-case.git#aa68213d1211745ce7c6c725ba072e6b13bef640" + } + }, + "node_modules/@flatpak-node-generator-tests/subdir": { + "resolved": "subdir", + "link": true + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "git+ssh://git@github.com/jonschlinkert/arr-diff.git#f39e5f10f55fd0cc38fa686c6ebc11747815850c", + "integrity": "sha512-a8fZL34mbwOQVmDfWe5D8kNWA8F3YIsQ1PybVXLffJ5WGAnvZTPXfRDzjOURWwsmEOYlm4Rlt1igQNOriZbg1Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-range": { + "version": "1.0.1", + "resolved": "git+ssh://git@github.com/mattdesl/array-range.git#d8b6fbdfc29caf846be02229325dfb4967f1dcd6", + "license": "MIT" + }, + "node_modules/array.chunk": { + "version": "1.1.0", + "resolved": "git+ssh://git@github.com/zhiyelee/array.chunk.git#1ba8011a64448210e334a17642e395690a7164c0", + "license": "ISC" + }, + "node_modules/decamelize": { + "version": "6.0.0", + "resolved": "git+ssh://git@github.com/sindresorhus/decamelize.git#da8552d335f9067354ca9b93378482eb9f1fb821", + "integrity": "sha512-0IW2fkHZxTVTibBGsjJNVYthGdZAKXzIYkGfQ/DPm9j/os+LdqNp6/Q7tlMCOy+j3YNFS+nKnWhtJOEGinH4pg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/filled-array": { + "version": "2.1.0", + "resolved": "git+ssh://git@github.com/sindresorhus/filled-array.git#3529bc985247d0f84db4080fecd8276643838d0c", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/in-array": { + "version": "0.1.2", + "resolved": "git+ssh://git@github.com/jonschlinkert/in-array.git#47a5e55362098646b56a3ec6775bd5198df1c7ed", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-empty-object": { + "version": "1.1.1", + "resolved": "git+ssh://git@github.com/gummesson/is-empty-object.git#7b50c8eb4e14135631f7c94e01c0c8a36e5d75f8", + "integrity": "sha512-OQNk2je1cKQ0Y0AYZ2X9hwapnDsOaKIa9wDdCjtmaU6JsnNHmbk27kPn1HNtgeIuLca3HvrBocDRt6y7+2aHJA==", + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "git+ssh://git@github.com/jonschlinkert/is-number.git#98e8ff1da1a89f93d1397a24d7413ed15421c139", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/person-lib": { + "version": "1.0.1", + "resolved": "git+ssh://git@gitlab.com/volodymyrkr/person-lib.git#752fd1828b1eb3a9635bf725ae5e1704a375e524", + "license": "ISC" + }, + "node_modules/sorted-object": { + "version": "2.0.1", + "resolved": "git+ssh://git@github.com/domenic/sorted-object.git#87105deb13d4f4151b2abd1a78d27a5216e3e79d", + "license": "(WTFPL OR MIT)" + }, + "node_modules/text-encoding-shim": { + "version": "1.0.5", + "resolved": "git+ssh://git@gitlab.com/t-affeldt/text-encoding-shim.git#33b05934b4e4e6c65fc06260eaa3b2aa2909e7b5", + "license": "MIT" + }, + "node_modules/to-camel-case": { + "version": "1.0.0", + "resolved": "git+ssh://git@github.com/ianstormtaylor/to-camel-case.git#00a20429b600ddb6e4f8ff5b17c52914f40fe67d", + "license": "MIT", + "dependencies": { + "to-space-case": "^1.0.0" + } + }, + "node_modules/to-capital-case": { + "version": "1.0.0", + "resolved": "git+https://git@github.com/ianstormtaylor/to-capital-case.git#b82f61e00e099b01514e25177bb2d56d0f64b157", + "license": "MIT", + "dependencies": { + "to-space-case": "^1.0.0" + } + }, + "node_modules/to-no-case": { + "version": "1.0.0", + "resolved": "git+https://git@github.com/ianstormtaylor/to-no-case.git#9078578dcf394e63f34fd7c6666772192e537b90", + "integrity": "sha512-E6uMYyFvmgQWszuxWtCz0NN+BgdVvQjVCU6Nnq0BSxi8q/QKRCBs14pGUWbPQghmpjJbdkKgjICDWihePrJGOQ==", + "license": "MIT" + }, + "node_modules/to-space-case": { + "version": "1.0.0", + "resolved": "git+ssh://git@github.com/ianstormtaylor/to-space-case.git#aa68213d1211745ce7c6c725ba072e6b13bef640", + "integrity": "sha512-i7ZtWv1WzR6xrLpd5wpSU/RZxoEDaoD3uLU5pDgXEZfUZJh0QpPtjJdLf7i+nr24Z80ls8qYCfBeFpZk6RzXKQ==", + "license": "MIT", + "dependencies": { + "to-no-case": "^1.0.0" + } + }, + "node_modules/unordered-array-remove": { + "version": "1.0.1", + "resolved": "git+ssh://git@github.com/mafintosh/unordered-array-remove.git#9ecfd7d63da6e5499b3a530574aca2d8c826af93", + "integrity": "sha512-R03+gWO+/dvNSK2nqgPVM533M+hj/5HaZzv1U7oV8ulo+oWyXWXAWtKGNM8qJA11gPtWML7/WyjOM93HGxV0ag==", + "license": "MIT" + }, + "subdir": { + "version": "1.0.0", + "dependencies": { + "arr-diff": "github:jonschlinkert/arr-diff#f39e5f10f55fd0cc38fa686c6ebc11747815850c", + "array.chunk": "git+https://github.com/zhiyelee/array.chunk.git", + "decamelize": "git+https://github.com/sindresorhus/decamelize.git#da8552d335f9067354ca9b93378482eb9f1fb821", + "filled-array": "github:sindresorhus/filled-array#v2.1.0", + "in-array": "git+ssh://git@github.com:jonschlinkert/in-array.git", + "sorted-object": "github:domenic/sorted-object", + "text-encoding-shim": "gitlab:t-affeldt/text-encoding-shim", + "unordered-array-remove": "git+ssh://git@github.com:mafintosh/unordered-array-remove.git#9ecfd7d63da6e5499b3a530574aca2d8c826af93" + } + } + }, + "dependencies": { + "@flatpak-node-generator-tests/subdir": { + "version": "file:subdir", + "requires": { + "arr-diff": "github:jonschlinkert/arr-diff#f39e5f10f55fd0cc38fa686c6ebc11747815850c", + "array.chunk": "git+https://github.com/zhiyelee/array.chunk.git", + "decamelize": "git+https://github.com/sindresorhus/decamelize.git#da8552d335f9067354ca9b93378482eb9f1fb821", + "filled-array": "github:sindresorhus/filled-array#v2.1.0", + "in-array": "git+ssh://git@github.com:jonschlinkert/in-array.git", + "sorted-object": "github:domenic/sorted-object", + "text-encoding-shim": "gitlab:t-affeldt/text-encoding-shim", + "unordered-array-remove": "git+ssh://git@github.com:mafintosh/unordered-array-remove.git#9ecfd7d63da6e5499b3a530574aca2d8c826af93" + } + }, + "arr-diff": { + "version": "git+ssh://git@github.com/jonschlinkert/arr-diff.git#f39e5f10f55fd0cc38fa686c6ebc11747815850c", + "integrity": "sha512-a8fZL34mbwOQVmDfWe5D8kNWA8F3YIsQ1PybVXLffJ5WGAnvZTPXfRDzjOURWwsmEOYlm4Rlt1igQNOriZbg1Q==", + "from": "arr-diff@github:jonschlinkert/arr-diff#f39e5f10f55fd0cc38fa686c6ebc11747815850c" + }, + "array-range": { + "version": "git+ssh://git@github.com/mattdesl/array-range.git#d8b6fbdfc29caf846be02229325dfb4967f1dcd6", + "from": "array-range@github:mattdesl/array-range#master" + }, + "array.chunk": { + "version": "git+ssh://git@github.com/zhiyelee/array.chunk.git#1ba8011a64448210e334a17642e395690a7164c0", + "from": "array.chunk@git+https://github.com/zhiyelee/array.chunk.git" + }, + "decamelize": { + "version": "git+ssh://git@github.com/sindresorhus/decamelize.git#da8552d335f9067354ca9b93378482eb9f1fb821", + "integrity": "sha512-0IW2fkHZxTVTibBGsjJNVYthGdZAKXzIYkGfQ/DPm9j/os+LdqNp6/Q7tlMCOy+j3YNFS+nKnWhtJOEGinH4pg==", + "from": "decamelize@git+https://github.com/sindresorhus/decamelize.git#da8552d335f9067354ca9b93378482eb9f1fb821" + }, + "filled-array": { + "version": "git+ssh://git@github.com/sindresorhus/filled-array.git#3529bc985247d0f84db4080fecd8276643838d0c", + "from": "filled-array@github:sindresorhus/filled-array#v2.1.0" + }, + "in-array": { + "version": "git+ssh://git@github.com/jonschlinkert/in-array.git#47a5e55362098646b56a3ec6775bd5198df1c7ed", + "from": "in-array@git+ssh://git@github.com:jonschlinkert/in-array.git" + }, + "is-empty-object": { + "version": "git+ssh://git@github.com/gummesson/is-empty-object.git#7b50c8eb4e14135631f7c94e01c0c8a36e5d75f8", + "integrity": "sha512-OQNk2je1cKQ0Y0AYZ2X9hwapnDsOaKIa9wDdCjtmaU6JsnNHmbk27kPn1HNtgeIuLca3HvrBocDRt6y7+2aHJA==", + "from": "is-empty-object@github:gummesson/is-empty-object#7b50c8eb4e14135631f7c94e01c0c8a36e5d75f8" + }, + "is-number": { + "version": "git+ssh://git@github.com/jonschlinkert/is-number.git#98e8ff1da1a89f93d1397a24d7413ed15421c139", + "from": "is-number@github:jonschlinkert/is-number" + }, + "person-lib": { + "version": "git+ssh://git@gitlab.com/volodymyrkr/person-lib.git#752fd1828b1eb3a9635bf725ae5e1704a375e524", + "from": "person-lib@gitlab:volodymyrkr/person-lib" + }, + "sorted-object": { + "version": "git+ssh://git@github.com/domenic/sorted-object.git#87105deb13d4f4151b2abd1a78d27a5216e3e79d", + "from": "sorted-object@github:domenic/sorted-object" + }, + "text-encoding-shim": { + "version": "git+ssh://git@gitlab.com/t-affeldt/text-encoding-shim.git#33b05934b4e4e6c65fc06260eaa3b2aa2909e7b5", + "from": "text-encoding-shim@gitlab:t-affeldt/text-encoding-shim" + }, + "to-camel-case": { + "version": "git+ssh://git@github.com/ianstormtaylor/to-camel-case.git#00a20429b600ddb6e4f8ff5b17c52914f40fe67d", + "from": "to-camel-case@git+ssh://git@github.com:ianstormtaylor/to-camel-case.git", + "requires": { + "to-space-case": "^1.0.0" + } + }, + "to-capital-case": { + "version": "git+https://git@github.com/ianstormtaylor/to-capital-case.git#b82f61e00e099b01514e25177bb2d56d0f64b157", + "from": "to-capital-case@git+https://git@github.com/ianstormtaylor/to-capital-case.git", + "requires": { + "to-space-case": "^1.0.0" + } + }, + "to-no-case": { + "version": "git+https://git@github.com/ianstormtaylor/to-no-case.git#9078578dcf394e63f34fd7c6666772192e537b90", + "integrity": "sha512-E6uMYyFvmgQWszuxWtCz0NN+BgdVvQjVCU6Nnq0BSxi8q/QKRCBs14pGUWbPQghmpjJbdkKgjICDWihePrJGOQ==", + "from": "to-no-case@git+https://git@github.com/ianstormtaylor/to-no-case.git#9078578dcf394e63f34fd7c6666772192e537b90" + }, + "to-space-case": { + "version": "git+ssh://git@github.com/ianstormtaylor/to-space-case.git#aa68213d1211745ce7c6c725ba072e6b13bef640", + "integrity": "sha512-i7ZtWv1WzR6xrLpd5wpSU/RZxoEDaoD3uLU5pDgXEZfUZJh0QpPtjJdLf7i+nr24Z80ls8qYCfBeFpZk6RzXKQ==", + "from": "to-space-case@git+ssh://git@github.com:ianstormtaylor/to-space-case.git#aa68213d1211745ce7c6c725ba072e6b13bef640", + "requires": { + "to-no-case": "^1.0.0" + } + }, + "unordered-array-remove": { + "version": "git+ssh://git@github.com/mafintosh/unordered-array-remove.git#9ecfd7d63da6e5499b3a530574aca2d8c826af93", + "integrity": "sha512-R03+gWO+/dvNSK2nqgPVM533M+hj/5HaZzv1U7oV8ulo+oWyXWXAWtKGNM8qJA11gPtWML7/WyjOM93HGxV0ag==", + "from": "unordered-array-remove@git+ssh://git@github.com:mafintosh/unordered-array-remove.git#9ecfd7d63da6e5499b3a530574aca2d8c826af93" + } + } +} diff --git a/node/tests/data/packages/git/package-lock.v3.json b/node/tests/data/packages/git/package-lock.v3.json new file mode 100644 index 00000000..b5104bd1 --- /dev/null +++ b/node/tests/data/packages/git/package-lock.v3.json @@ -0,0 +1,156 @@ +{ + "name": "@flatpak-node-generator-tests/git", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@flatpak-node-generator-tests/git", + "version": "1.0.0", + "dependencies": { + "@flatpak-node-generator-tests/subdir": "file:subdir", + "array-range": "github:mattdesl/array-range#master", + "is-empty-object": "github:gummesson/is-empty-object#7b50c8eb4e14135631f7c94e01c0c8a36e5d75f8", + "is-number": "github:jonschlinkert/is-number", + "person-lib": "gitlab:volodymyrkr/person-lib", + "to-camel-case": "git+ssh://git@github.com:ianstormtaylor/to-camel-case.git", + "to-capital-case": "git+https://git@github.com/ianstormtaylor/to-capital-case.git", + "to-no-case": "git+https://git@github.com/ianstormtaylor/to-no-case.git#9078578dcf394e63f34fd7c6666772192e537b90", + "to-space-case": "git+ssh://git@github.com:ianstormtaylor/to-space-case.git#aa68213d1211745ce7c6c725ba072e6b13bef640" + } + }, + "node_modules/@flatpak-node-generator-tests/subdir": { + "resolved": "subdir", + "link": true + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "git+ssh://git@github.com/jonschlinkert/arr-diff.git#f39e5f10f55fd0cc38fa686c6ebc11747815850c", + "integrity": "sha512-a8fZL34mbwOQVmDfWe5D8kNWA8F3YIsQ1PybVXLffJ5WGAnvZTPXfRDzjOURWwsmEOYlm4Rlt1igQNOriZbg1Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-range": { + "version": "1.0.1", + "resolved": "git+ssh://git@github.com/mattdesl/array-range.git#d8b6fbdfc29caf846be02229325dfb4967f1dcd6", + "license": "MIT" + }, + "node_modules/array.chunk": { + "version": "1.1.0", + "resolved": "git+ssh://git@github.com/zhiyelee/array.chunk.git#1ba8011a64448210e334a17642e395690a7164c0", + "license": "ISC" + }, + "node_modules/decamelize": { + "version": "6.0.0", + "resolved": "git+ssh://git@github.com/sindresorhus/decamelize.git#da8552d335f9067354ca9b93378482eb9f1fb821", + "integrity": "sha512-0IW2fkHZxTVTibBGsjJNVYthGdZAKXzIYkGfQ/DPm9j/os+LdqNp6/Q7tlMCOy+j3YNFS+nKnWhtJOEGinH4pg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/filled-array": { + "version": "2.1.0", + "resolved": "git+ssh://git@github.com/sindresorhus/filled-array.git#3529bc985247d0f84db4080fecd8276643838d0c", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/in-array": { + "version": "0.1.2", + "resolved": "git+ssh://git@github.com/jonschlinkert/in-array.git#47a5e55362098646b56a3ec6775bd5198df1c7ed", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-empty-object": { + "version": "1.1.1", + "resolved": "git+ssh://git@github.com/gummesson/is-empty-object.git#7b50c8eb4e14135631f7c94e01c0c8a36e5d75f8", + "integrity": "sha512-OQNk2je1cKQ0Y0AYZ2X9hwapnDsOaKIa9wDdCjtmaU6JsnNHmbk27kPn1HNtgeIuLca3HvrBocDRt6y7+2aHJA==", + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "git+ssh://git@github.com/jonschlinkert/is-number.git#98e8ff1da1a89f93d1397a24d7413ed15421c139", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/person-lib": { + "version": "1.0.1", + "resolved": "git+ssh://git@gitlab.com/volodymyrkr/person-lib.git#752fd1828b1eb3a9635bf725ae5e1704a375e524", + "license": "ISC" + }, + "node_modules/sorted-object": { + "version": "2.0.1", + "resolved": "git+ssh://git@github.com/domenic/sorted-object.git#87105deb13d4f4151b2abd1a78d27a5216e3e79d", + "license": "(WTFPL OR MIT)" + }, + "node_modules/text-encoding-shim": { + "version": "1.0.5", + "resolved": "git+ssh://git@gitlab.com/t-affeldt/text-encoding-shim.git#33b05934b4e4e6c65fc06260eaa3b2aa2909e7b5", + "license": "MIT" + }, + "node_modules/to-camel-case": { + "version": "1.0.0", + "resolved": "git+ssh://git@github.com/ianstormtaylor/to-camel-case.git#00a20429b600ddb6e4f8ff5b17c52914f40fe67d", + "license": "MIT", + "dependencies": { + "to-space-case": "^1.0.0" + } + }, + "node_modules/to-capital-case": { + "version": "1.0.0", + "resolved": "git+https://git@github.com/ianstormtaylor/to-capital-case.git#b82f61e00e099b01514e25177bb2d56d0f64b157", + "license": "MIT", + "dependencies": { + "to-space-case": "^1.0.0" + } + }, + "node_modules/to-no-case": { + "version": "1.0.0", + "resolved": "git+https://git@github.com/ianstormtaylor/to-no-case.git#9078578dcf394e63f34fd7c6666772192e537b90", + "integrity": "sha512-E6uMYyFvmgQWszuxWtCz0NN+BgdVvQjVCU6Nnq0BSxi8q/QKRCBs14pGUWbPQghmpjJbdkKgjICDWihePrJGOQ==", + "license": "MIT" + }, + "node_modules/to-space-case": { + "version": "1.0.0", + "resolved": "git+ssh://git@github.com/ianstormtaylor/to-space-case.git#aa68213d1211745ce7c6c725ba072e6b13bef640", + "integrity": "sha512-i7ZtWv1WzR6xrLpd5wpSU/RZxoEDaoD3uLU5pDgXEZfUZJh0QpPtjJdLf7i+nr24Z80ls8qYCfBeFpZk6RzXKQ==", + "license": "MIT", + "dependencies": { + "to-no-case": "^1.0.0" + } + }, + "node_modules/unordered-array-remove": { + "version": "1.0.1", + "resolved": "git+ssh://git@github.com/mafintosh/unordered-array-remove.git#9ecfd7d63da6e5499b3a530574aca2d8c826af93", + "integrity": "sha512-R03+gWO+/dvNSK2nqgPVM533M+hj/5HaZzv1U7oV8ulo+oWyXWXAWtKGNM8qJA11gPtWML7/WyjOM93HGxV0ag==", + "license": "MIT" + }, + "subdir": { + "version": "1.0.0", + "dependencies": { + "arr-diff": "github:jonschlinkert/arr-diff#f39e5f10f55fd0cc38fa686c6ebc11747815850c", + "array.chunk": "git+https://github.com/zhiyelee/array.chunk.git", + "decamelize": "git+https://github.com/sindresorhus/decamelize.git#da8552d335f9067354ca9b93378482eb9f1fb821", + "filled-array": "github:sindresorhus/filled-array#v2.1.0", + "in-array": "git+ssh://git@github.com:jonschlinkert/in-array.git", + "sorted-object": "github:domenic/sorted-object", + "text-encoding-shim": "gitlab:t-affeldt/text-encoding-shim", + "unordered-array-remove": "git+ssh://git@github.com:mafintosh/unordered-array-remove.git#9ecfd7d63da6e5499b3a530574aca2d8c826af93" + } + } + } +} diff --git a/node/tests/data/packages/git/package.json b/node/tests/data/packages/git/package.json new file mode 100644 index 00000000..3bccaf61 --- /dev/null +++ b/node/tests/data/packages/git/package.json @@ -0,0 +1,15 @@ +{ + "name": "@flatpak-node-generator-tests/git", + "version": "1.0.0", + "dependencies": { + "@flatpak-node-generator-tests/subdir": "file:subdir", + "array-range": "github:mattdesl/array-range#master", + "is-empty-object": "github:gummesson/is-empty-object#7b50c8eb4e14135631f7c94e01c0c8a36e5d75f8", + "is-number": "github:jonschlinkert/is-number", + "person-lib": "gitlab:volodymyrkr/person-lib", + "to-camel-case": "git+ssh://git@github.com:ianstormtaylor/to-camel-case.git", + "to-capital-case": "git+https://git@github.com/ianstormtaylor/to-capital-case.git", + "to-no-case": "git+https://git@github.com/ianstormtaylor/to-no-case.git#9078578dcf394e63f34fd7c6666772192e537b90", + "to-space-case": "git+ssh://git@github.com:ianstormtaylor/to-space-case.git#aa68213d1211745ce7c6c725ba072e6b13bef640" + } +} diff --git a/node/tests/data/packages/git/subdir/index.js b/node/tests/data/packages/git/subdir/index.js new file mode 100644 index 00000000..12d6ec24 --- /dev/null +++ b/node/tests/data/packages/git/subdir/index.js @@ -0,0 +1,7 @@ +const fs = require('fs') + +module.exports = { + sayHello: () => { + fs.writeFileSync('hello.txt', 'Hello!') + }, +} diff --git a/node/tests/data/packages/git/subdir/package.json b/node/tests/data/packages/git/subdir/package.json new file mode 100644 index 00000000..9a6dba4e --- /dev/null +++ b/node/tests/data/packages/git/subdir/package.json @@ -0,0 +1,14 @@ +{ + "name": "@flatpak-node-generator-tests/subdir", + "version": "1.0.0", + "dependencies": { + "arr-diff": "github:jonschlinkert/arr-diff#f39e5f10f55fd0cc38fa686c6ebc11747815850c", + "array.chunk": "git+https://github.com/zhiyelee/array.chunk.git", + "decamelize": "git+https://github.com/sindresorhus/decamelize.git#da8552d335f9067354ca9b93378482eb9f1fb821", + "filled-array": "github:sindresorhus/filled-array#v2.1.0", + "sorted-object": "github:domenic/sorted-object", + "in-array": "git+ssh://git@github.com:jonschlinkert/in-array.git", + "text-encoding-shim": "gitlab:t-affeldt/text-encoding-shim", + "unordered-array-remove": "git+ssh://git@github.com:mafintosh/unordered-array-remove.git#9ecfd7d63da6e5499b3a530574aca2d8c826af93" + } +} diff --git a/node/tests/data/packages/git/yarn.lock b/node/tests/data/packages/git/yarn.lock new file mode 100644 index 00000000..4658f8a9 --- /dev/null +++ b/node/tests/data/packages/git/yarn.lock @@ -0,0 +1,98 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@flatpak-node-generator-tests/subdir@file:subdir": + version "1.0.0" + dependencies: + arr-diff "github:jonschlinkert/arr-diff#f39e5f10f55fd0cc38fa686c6ebc11747815850c" + array.chunk "git+https://github.com/zhiyelee/array.chunk.git" + decamelize "git+https://github.com/sindresorhus/decamelize.git#da8552d335f9067354ca9b93378482eb9f1fb821" + filled-array "github:sindresorhus/filled-array#v2.1.0" + in-array "git+ssh://git@github.com:jonschlinkert/in-array.git" + person-lib "gitlab:volodymyrkr/person-lib" + sorted-object "github:domenic/sorted-object" + text-encoding-shim "gitlab:t-affeldt/text-encoding-shim" + unordered-array-remove "git+ssh://git@github.com:mafintosh/unordered-array-remove.git#9ecfd7d63da6e5499b3a530574aca2d8c826af93" + +"arr-diff@github:jonschlinkert/arr-diff#f39e5f10f55fd0cc38fa686c6ebc11747815850c": + version "4.0.0" + resolved "https://codeload.github.com/jonschlinkert/arr-diff/tar.gz/f39e5f10f55fd0cc38fa686c6ebc11747815850c" + +"array-range@github:mattdesl/array-range#master": + version "1.0.1" + resolved "https://codeload.github.com/mattdesl/array-range/tar.gz/d8b6fbdfc29caf846be02229325dfb4967f1dcd6" + +"array.chunk@git+https://github.com/zhiyelee/array.chunk.git": + version "1.1.0" + resolved "git+https://github.com/zhiyelee/array.chunk.git#1ba8011a64448210e334a17642e395690a7164c0" + +"decamelize@git+https://github.com/sindresorhus/decamelize.git#da8552d335f9067354ca9b93378482eb9f1fb821": + version "6.0.0" + resolved "git+https://github.com/sindresorhus/decamelize.git#da8552d335f9067354ca9b93378482eb9f1fb821" + +"filled-array@github:sindresorhus/filled-array#v2.1.0": + version "2.1.0" + resolved "https://codeload.github.com/sindresorhus/filled-array/tar.gz/3529bc985247d0f84db4080fecd8276643838d0c" + +"in-array@git+ssh://git@github.com:jonschlinkert/in-array.git": + version "0.1.2" + resolved "git+ssh://git@github.com:jonschlinkert/in-array.git#47a5e55362098646b56a3ec6775bd5198df1c7ed" + +"is-empty-object@github:gummesson/is-empty-object#7b50c8eb4e14135631f7c94e01c0c8a36e5d75f8": + version "1.1.1" + resolved "https://codeload.github.com/gummesson/is-empty-object/tar.gz/7b50c8eb4e14135631f7c94e01c0c8a36e5d75f8" + +"is-number@github:jonschlinkert/is-number": + version "7.0.0" + resolved "https://codeload.github.com/jonschlinkert/is-number/tar.gz/98e8ff1da1a89f93d1397a24d7413ed15421c139" + +"person-lib@gitlab:volodymyrkr/person-lib": + version "1.0.1" + resolved "git+ssh://git@gitlab.com/volodymyrkr/person-lib.git#752fd1828b1eb3a9635bf725ae5e1704a375e524" + +"sorted-object@github:domenic/sorted-object": + version "2.0.1" + resolved "https://codeload.github.com/domenic/sorted-object/tar.gz/87105deb13d4f4151b2abd1a78d27a5216e3e79d" + +"text-encoding-shim@gitlab:t-affeldt/text-encoding-shim": + version "1.0.5" + resolved "git+ssh://git@gitlab.com/t-affeldt/text-encoding-shim.git#33b05934b4e4e6c65fc06260eaa3b2aa2909e7b5" + +"to-camel-case@git+ssh://git@github.com:ianstormtaylor/to-camel-case.git": + version "1.0.0" + resolved "git+ssh://git@github.com:ianstormtaylor/to-camel-case.git#00a20429b600ddb6e4f8ff5b17c52914f40fe67d" + dependencies: + to-space-case "^1.0.0" + +"to-capital-case@git+https://git@github.com/ianstormtaylor/to-capital-case.git": + version "1.0.0" + resolved "git+https://git@github.com/ianstormtaylor/to-capital-case.git#b82f61e00e099b01514e25177bb2d56d0f64b157" + dependencies: + to-space-case "^1.0.0" + +to-no-case@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-no-case/-/to-no-case-1.0.2.tgz#c722907164ef6b178132c8e69930212d1b4aa16a" + integrity sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg== + +"to-no-case@git+https://git@github.com/ianstormtaylor/to-no-case.git#9078578dcf394e63f34fd7c6666772192e537b90": + version "1.0.0" + resolved "git+https://git@github.com/ianstormtaylor/to-no-case.git#9078578dcf394e63f34fd7c6666772192e537b90" + +to-space-case@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-space-case/-/to-space-case-1.0.0.tgz#b052daafb1b2b29dc770cea0163e5ec0ebc9fc17" + integrity sha512-rLdvwXZ39VOn1IxGL3V6ZstoTbwLRckQmn/U8ZDLuWwIXNpuZDhQ3AiRUlhTbOXFVE9C+dR51wM0CBDhk31VcA== + dependencies: + to-no-case "^1.0.0" + +"to-space-case@git+ssh://git@github.com:ianstormtaylor/to-space-case.git#aa68213d1211745ce7c6c725ba072e6b13bef640": + version "1.0.0" + resolved "git+ssh://git@github.com:ianstormtaylor/to-space-case.git#aa68213d1211745ce7c6c725ba072e6b13bef640" + dependencies: + to-no-case "^1.0.0" + +"unordered-array-remove@git+ssh://git@github.com:mafintosh/unordered-array-remove.git#9ecfd7d63da6e5499b3a530574aca2d8c826af93": + version "1.0.1" + resolved "git+ssh://git@github.com:mafintosh/unordered-array-remove.git#9ecfd7d63da6e5499b3a530574aca2d8c826af93" diff --git a/node/tests/data/packages/minimal-git/package-lock.v3.json b/node/tests/data/packages/minimal-git/package-lock.v3.json index 6e06d6ff..71194442 100644 --- a/node/tests/data/packages/minimal-git/package-lock.v3.json +++ b/node/tests/data/packages/minimal-git/package-lock.v3.json @@ -13,8 +13,7 @@ }, "node_modules/nop": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/supershabam/nop.git#f110e75f62cfe3bf4468ac3b74e3dc72ab9ae4bf", - "integrity": "sha512-xCwdA7C4QIORvTMytKHMlkEN6axJGimR0gv5vgjKpEKRvQrPOwhjJnrZEcd5g0LP+7IY38+TY7MP59HRY6gcwA==", + "resolved": "git+https://git@github.com/supershabam/nop.git#f110e75f62cfe3bf4468ac3b74e3dc72ab9ae4bf", "license": "MIT" } } diff --git a/node/tests/test_providers.py b/node/tests/test_providers.py index c8a49660..e7671bf6 100644 --- a/node/tests/test_providers.py +++ b/node/tests/test_providers.py @@ -7,15 +7,24 @@ from flatpak_node_generator.manifest import ManifestGenerator +TEST_SCRIPT = """ +require("array-range"); +require("is-empty-object"); +require("is-number"); +require("person-lib"); +require("to-camel-case"); +require("to-capital-case"); +require("to-no-case"); +require("to-space-case"); +require("@flatpak-node-generator-tests/subdir").sayHello(); +""" + async def test_minimal_git( flatpak_builder: FlatpakBuilder, provider_factory_spec: ProviderFactorySpec, node_version: int, ) -> None: - if node_version >= 18: - pytest.xfail(reason='Git sources not yet supported for lockfile v2 syntax') - with ManifestGenerator() as gen: await provider_factory_spec.generate_modules('minimal-git', gen, node_version) @@ -29,6 +38,34 @@ async def test_minimal_git( ) +async def test_git( + flatpak_builder: FlatpakBuilder, + provider_factory_spec: ProviderFactorySpec, + node_version: int, + shared_datadir: Path, +) -> None: + with ManifestGenerator() as gen: + await provider_factory_spec.generate_modules('git', gen, node_version) + + flatpak_builder.build( + sources=itertools.chain( + gen.ordered_sources(), + [ + { + 'type': 'dir', + 'path': str(shared_datadir / 'packages' / 'git' / 'subdir'), + 'dest': 'subdir', + } + ], + ), + commands=[ + provider_factory_spec.install_command, + f"""node -e '{TEST_SCRIPT}'""", + ], + use_node=node_version, + ) + + async def test_local( flatpak_builder: FlatpakBuilder, provider_factory_spec: ProviderFactorySpec, diff --git a/node/tests/test_yarn.py b/node/tests/test_yarn.py index 0fba1d58..781a5ab6 100644 --- a/node/tests/test_yarn.py +++ b/node/tests/test_yarn.py @@ -1,7 +1,12 @@ from pathlib import Path from flatpak_node_generator.integrity import Integrity -from flatpak_node_generator.package import GitSource, Package, ResolvedSource +from flatpak_node_generator.package import ( + GitSource, + Lockfile, + Package, + ResolvedSource, +) from flatpak_node_generator.providers.yarn import YarnLockfileProvider TEST_LOCKFILE = """ @@ -36,10 +41,10 @@ def test_lockfile_parsing(tmp_path: Path) -> None: lockfile_provider = YarnLockfileProvider() - yarn_lock = tmp_path / 'yarn.lock' - yarn_lock.write_text(TEST_LOCKFILE) + yarn_lock = Lockfile(tmp_path / 'yarn.lock', 1) + yarn_lock.path.write_text(TEST_LOCKFILE) - packages = list(lockfile_provider.process_lockfile(yarn_lock)) + packages = list(lockfile_provider.process_lockfile(yarn_lock.path)) assert packages == [ Package(