Skip to content

Commit 474f0f0

Browse files
committed
feat: Closes #163 .npmrc support
1 parent 8f342b4 commit 474f0f0

File tree

8 files changed

+71
-16
lines changed

8 files changed

+71
-16
lines changed

npm-publish-docs/src/docs/user-guide/configuration/extension.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ npmPublish {
2222
| [`npmBin`](#npmBin) | RegularFile | `$nodeHome/bin/npm` | |
2323
| [`readme`](#readme) | RegularFile | | |
2424
| [`npmIgnore`](#npmignore) | RegularFile | `$projectDir/.npmignore` | |
25+
| [`npmrc`](#npmrc) | RegularFile | `$projectDir/.npmrc` | |
2526
| [`organization`](#organization) | String | | |
2627
| [`version`](#version) | String | `Project::version` | |
2728
| [`access`](#access) | NpmAccess | `NpmAccess.PUBLIC` | |
@@ -38,6 +39,7 @@ npmPublish {
3839
| [`npmBin`](#npmBin) | | `npm.publish.npmBin` | `NPM_PUBLISH_NPMBIN` |
3940
| [`readme`](#readme) | | `npm.publish.readme` | `NPM_PUBLISH_README` |
4041
| [`npmIgnore`](#npmignore) | | `npm.publish.npmIgnore` | `NPM_PUBLISH_NPMIGNORE` |
42+
| [`npmrc`](#npmrc) | | `npm.publish.npmrc` | `NPM_PUBLISH_NPMRC` |
4143
| [`organization`](#organization) | | `npm.publish.organization` | `NPM_PUBLISH_ORGANIZATION` |
4244
| [`version`](#version) | | `npm.publish.version` | `NPM_PUBLISH_VERSION` |
4345
| [`access`](#access) | | `npm.publish.access` | `NPM_PUBLISH_ACCESS` |
@@ -54,6 +56,7 @@ npmPublish {
5456
npmBin.set(File("/path/to/node/bin/npm"))
5557
readme.set(rootDir.resolve("README.md"))
5658
npmIgnore.set(projectDir.resolve(".npmIgnore"))
59+
npmrc.set(projectDir.resolve(".npmrc"))
5760
organization.set("${project.group}")
5861
version.set("${project.version}")
5962
access.set(RESTRICTED)
@@ -95,6 +98,11 @@ explicitly. The file name is ignored and renamed to `README.md` when assembling.
9598
A location of the default `.npmignore` file. If set, it will be used as a default for all packages that do not have one
9699
set explicitly.
97100

101+
### `npmrc`
102+
103+
A location of the default `.npmrc` file. If set, it will be used as a default for all registries that do not have one
104+
set explicitly.
105+
98106
### `organization`
99107

100108
Default package scope. If set, it will be used as a default for all packages that do not have one set explicitly.

npm-publish-docs/src/docs/user-guide/configuration/registry.md

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,17 @@ npmPublish {
3838

3939
=== "Properties"
4040

41-
| Property | Type | Default | When Kotlin plugin is present |
42-
|:--------------------------|-----------|:-----------------------------------------------------|-------------------------------|
43-
| [`access`](#access) | NpmAccess | [`NpmPublishExtension::access`](extension.md#access) | |
44-
| [`dry`](#dry) | NpmAccess | [`NpmPublishExtension::dry`](extension.md#dry) | |
45-
| [`uri`](#uri) | URI | | |
46-
| [`otp`](#otp) | String | | |
47-
| [`authToken`](#authtoken) | String | | |
48-
| [`auth`](#auth) | String | | |
49-
| [`username`](#username) | String | | |
50-
| [`password`](#password) | String | | |
41+
| Property | Type | Default | When Kotlin plugin is present |
42+
|:--------------------------|-------------|:-----------------------------------------------------|-------------------------------|
43+
| [`access`](#access) | NpmAccess | [`NpmPublishExtension::access`](extension.md#access) | |
44+
| [`dry`](#dry) | NpmAccess | [`NpmPublishExtension::dry`](extension.md#dry) | |
45+
| [`uri`](#uri) | URI | | |
46+
| [`otp`](#otp) | String | | |
47+
| [`authToken`](#authtoken) | String | | |
48+
| [`auth`](#auth) | String | | |
49+
| [`username`](#username) | String | | |
50+
| [`password`](#password) | String | | |
51+
| [`npmrc`](#npmrc) | RegularFile | [`NpmPublishExtension::npmrc`](extension.md#npmrc) | |
5152

5253
=== "Keys"
5354

@@ -136,3 +137,7 @@ Should always be specified together with a username.
136137

137138
!!! note
138139
Only one of `authToken`, `auth` or `username` + `password` should be provided.
140+
141+
### `npmrc`
142+
143+
An optional `.npmrc` to use when publishing packages to this registry.

npm-publish-gradle-plugin/src/main/kotlin/config/extension.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import dev.petuska.npm.publish.extension.NpmPublishExtension
44
import dev.petuska.npm.publish.extension.domain.NpmAccess
55
import dev.petuska.npm.publish.util.notFalse
66
import dev.petuska.npm.publish.util.sysProjectEnvPropertyConvention
7-
import dev.petuska.npm.publish.util.unsafeCast
87
import org.gradle.api.Project
98

109
internal fun Project.configure(extension: NpmPublishExtension) {
@@ -20,14 +19,21 @@ internal fun Project.configure(extension: NpmPublishExtension) {
2019
extension.nodeBin.convention(extension.nodeHome.map { it.file("bin/node") })
2120
extension.npmBin.convention(extension.nodeHome.map { it.file("bin/npm") })
2221
extension.readme.convention(
23-
sysProjectEnvPropertyConvention("readme").map { layout.projectDirectory.file(it) }
22+
sysProjectEnvPropertyConvention("readme").map(layout.projectDirectory::file)
2423
)
2524
extension.npmIgnore.convention(
2625
sysProjectEnvPropertyConvention(
2726
"npmIgnore",
28-
provider { layout.projectDirectory.file(".npmignore") }
29-
.map { (if (it.asFile.exists()) it else null).unsafeCast() }
30-
).map { layout.projectDirectory.file(it) }
27+
provider { layout.projectDirectory.file(".npmignore").asFile }
28+
.map { (if (it.exists()) it.absolutePath else null) }
29+
).map(layout.projectDirectory::file)
30+
)
31+
extension.npmrc.convention(
32+
sysProjectEnvPropertyConvention(
33+
"npmrc",
34+
provider { layout.projectDirectory.file(".npmrc").asFile }
35+
.map { (if (it.exists()) it.absolutePath else null) }
36+
).map(layout.projectDirectory::file)
3137
)
3238
extension.organization.convention(
3339
sysProjectEnvPropertyConvention("organization")

npm-publish-gradle-plugin/src/main/kotlin/config/registry.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import dev.petuska.npm.publish.util.notFalse
1010
import dev.petuska.npm.publish.util.sysProjectEnvPropertyConvention
1111
import dev.petuska.npm.publish.util.toCamelCase
1212
import org.gradle.api.Project
13+
import java.io.File
1314
import java.net.URI
1415

1516
internal fun Project.configure(registry: NpmRegistry) {
@@ -25,6 +26,10 @@ internal fun Project.configure(registry: NpmRegistry) {
2526
registry.auth.convention(sysProjectEnvPropertyConvention(prefix + "auth"))
2627
registry.username.convention(sysProjectEnvPropertyConvention(prefix + "username"))
2728
registry.password.convention(sysProjectEnvPropertyConvention(prefix + "password"))
29+
registry.npmrc.convention(
30+
sysProjectEnvPropertyConvention(prefix + "npmrc", extension.npmrc.asFile.map(File::getAbsolutePath))
31+
.map(layout.projectDirectory::file)
32+
)
2833
registry.dry.convention(
2934
sysProjectEnvPropertyConvention(prefix + "dry", extension.dry.map(Boolean?::toString)).map { it.notFalse() }
3035
)

npm-publish-gradle-plugin/src/main/kotlin/extension/NpmPublishExtension.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ public abstract class NpmPublishExtension : WithGradleFactories(), ExtensionAwar
5959
*/
6060
public abstract val npmIgnore: RegularFileProperty
6161

62+
/**
63+
* A location of the default `.npmrc` file.
64+
* If set, it will be used as a default for all registries that do not have one set explicitly.
65+
* @see [NpmRegistry.npmrc]
66+
*/
67+
public abstract val npmrc: RegularFileProperty
68+
6269
/**
6370
* Default package scope.
6471
* If set, it will be used as a default for all packages that do not have one set explicitly.

npm-publish-gradle-plugin/src/main/kotlin/extension/domain/NpmRegistry.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@ import dev.petuska.npm.publish.task.NpmPublishTask
66
import dev.petuska.npm.publish.util.NamedInput
77
import dev.petuska.npm.publish.util.NpmPublishDsl
88
import org.gradle.api.NamedDomainObjectContainer
9+
import org.gradle.api.file.RegularFileProperty
910
import org.gradle.api.provider.Property
1011
import org.gradle.api.provider.Provider
1112
import org.gradle.api.tasks.Input
13+
import org.gradle.api.tasks.InputFile
1214
import org.gradle.api.tasks.Optional
15+
import org.gradle.api.tasks.PathSensitive
16+
import org.gradle.api.tasks.PathSensitivity
1317
import java.net.URI
1418

1519
/**
@@ -74,6 +78,15 @@ public abstract class NpmRegistry : NamedInput {
7478
@get:Optional
7579
public abstract val password: Property<String>
7680

81+
/**
82+
* A location of the default `.npmrc` file.
83+
* If set, it will be used as a default for all registries that do not have one set explicitly.
84+
*/
85+
@get:InputFile
86+
@get:Optional
87+
@get:PathSensitive(PathSensitivity.RELATIVE)
88+
public abstract val npmrc: RegularFileProperty
89+
7790
/**
7891
* Specifies if a dry-run should be added to the npm command arguments by default. Dry run does all the
7992
* normal run des except actual file uploading. Defaults to `false`.

npm-publish-gradle-plugin/src/main/kotlin/task/NpmPublishTask.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,24 @@ import dev.petuska.npm.publish.extension.domain.NpmRegistry
55
import dev.petuska.npm.publish.util.configure
66
import org.gradle.api.Action
77
import org.gradle.api.file.DirectoryProperty
8+
import org.gradle.api.file.FileSystemOperations
89
import org.gradle.api.provider.Property
910
import org.gradle.api.publish.plugins.PublishingPlugin.PUBLISH_TASK_GROUP
1011
import org.gradle.api.tasks.*
1112
import org.gradle.api.tasks.Optional
1213
import org.gradle.api.tasks.options.Option
1314
import java.util.*
15+
import javax.inject.Inject
1416

1517
/**
1618
* A publishing task that publishes a given package to a given registry.
1719
*/
1820
@Suppress("LeakingThis")
1921
@UntrackedTask(because = "Must always run")
2022
public abstract class NpmPublishTask : NpmExecTask() {
23+
@get:Inject
24+
internal abstract val fs: FileSystemOperations
25+
2126
/**
2227
* A registry to publish to
2328
* @see [NpmRegistry]
@@ -98,7 +103,13 @@ public abstract class NpmPublishTask : NpmExecTask() {
98103
if (d) add("--dry-run")
99104
if (tag.isPresent) add("--tag=${tag.get()}")
100105
}
101-
npmExec(args) { it.workingDir(packageDir.get()) }.rethrowFailure()
106+
val workingDir = project.layout.buildDirectory.dir("registries/${reg.name}/${packageDir.get().asFile.name}")
107+
fs.sync {
108+
it.from(packageDir)
109+
if (reg.npmrc.isPresent) it.from(reg.npmrc)
110+
it.into(workingDir)
111+
}
112+
npmExec(args) { it.workingDir(workingDir.get()) }.rethrowFailure()
102113
if (!d) info { "Published package at $pDir to ${reg.name} registry" }
103114
}
104115
}

sandbox/empty/.npmrc

Whitespace-only changes.

0 commit comments

Comments
 (0)