From 610a1ab1f7f8ed5642eab9beb073869d4d639976 Mon Sep 17 00:00:00 2001 From: Waldemar Zurowski Date: Tue, 6 Feb 2018 10:41:34 +0100 Subject: [PATCH 1/4] Handle name of scoped package gently * stolen from `npm pack` --- lib/files.js | 16 ++++++++++++---- lib/serviceProperties.js | 5 +++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/lib/files.js b/lib/files.js index 673d7c7..2182300 100644 --- a/lib/files.js +++ b/lib/files.js @@ -4,13 +4,13 @@ const path = require('path'); module.exports = { serviceFile: function (root, pkg) { - return path.resolve(root, pkg.name + '.service'); + return path.resolve(root, packageFileName(pkg) + '.service'); }, specsDirectory: function (root) { return path.resolve(root, 'SPECS'); }, specFile: function (root, pkg) { - return path.resolve(root, pkg.name + '.spec'); + return path.resolve(root, packageFileName(pkg) + '.spec'); }, sourcesDirectory: function (root) { return path.resolve(root, 'SOURCES'); @@ -18,6 +18,14 @@ module.exports = { sourcesArchive: function (root, pkg) { const sourcesDirectory = this.sourcesDirectory(root); - return path.resolve(sourcesDirectory, pkg.name + '.tar.gz'); - } + return path.resolve(sourcesDirectory, packageFileName(pkg) + '.tar.gz'); + }, + packageFileName }; + +function packageFileName (pkg) { + return pkg.name[0] === '@' + // scoped packages get special treatment + ? pkg.name.substr(1).replace(/\//g, '-') + : pkg.name; +} diff --git a/lib/serviceProperties.js b/lib/serviceProperties.js index 049a9ca..74297b0 100644 --- a/lib/serviceProperties.js +++ b/lib/serviceProperties.js @@ -1,6 +1,7 @@ 'use strict'; const truncate = require('./truncate'); +const files = require('./files'); function convertToKeyValueFromSpec(spec, prop) { if (spec && prop in spec) { @@ -13,8 +14,8 @@ function convertToKeyValueFromSpec(spec, prop) { module.exports = function (pkg) { return Object.assign( { - name: pkg.name, - username: truncate(pkg.name), + name: files.packageFileName(pkg), + username: truncate(files.packageFileName(pkg)), description: pkg.description, environment: convertToKeyValueFromSpec(pkg.spec, 'environment'), serviceOptions: convertToKeyValueFromSpec(pkg.spec, 'serviceOptions') From e84ec376c4998323520651076e6101ba35d61d0e Mon Sep 17 00:00:00 2001 From: Waldemar Zurowski Date: Tue, 6 Feb 2018 19:14:43 +0100 Subject: [PATCH 2/4] Added missed tests for scoped package name --- lib/files.js | 2 +- test/fixtures/my-scoped-cool-api.json | 11 ++++++ test/fixtures/my-scoped-cool-api.service | 16 ++++++++ test/fixtures/my-scoped-cool-api.spec | 47 ++++++++++++++++++++++++ test/service.js | 8 ++++ test/spec.js | 9 +++++ 6 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/my-scoped-cool-api.json create mode 100644 test/fixtures/my-scoped-cool-api.service create mode 100644 test/fixtures/my-scoped-cool-api.spec diff --git a/lib/files.js b/lib/files.js index 2182300..d5dc62d 100644 --- a/lib/files.js +++ b/lib/files.js @@ -20,7 +20,7 @@ module.exports = { return path.resolve(sourcesDirectory, packageFileName(pkg) + '.tar.gz'); }, - packageFileName + packageFileName: packageFileName }; function packageFileName (pkg) { diff --git a/test/fixtures/my-scoped-cool-api.json b/test/fixtures/my-scoped-cool-api.json new file mode 100644 index 0000000..3721aee --- /dev/null +++ b/test/fixtures/my-scoped-cool-api.json @@ -0,0 +1,11 @@ +{ + "name": "@scoped/my-cool-api", + "version": "1.1.1", + "scripts": { + "start": "node index.js" + }, + "description": "My Cool API", + "main": "index.js", + "author": "bob@example.com", + "license": "MIT" +} diff --git a/test/fixtures/my-scoped-cool-api.service b/test/fixtures/my-scoped-cool-api.service new file mode 100644 index 0000000..6528616 --- /dev/null +++ b/test/fixtures/my-scoped-cool-api.service @@ -0,0 +1,16 @@ +[Unit] +Description=My Cool API +After=network.target nss-lookup.target + +[Service] +ExecStart=/usr/bin/npm start +WorkingDirectory=/usr/lib/scoped-my-cool-api +Restart=always +StandardOutput=syslog +StandardError=syslog +SyslogIdentifier=scoped-my-cool-api +User=scoped-my-cool-api +Group=scoped-my-cool-api + +[Install] +WantedBy=multi-user.target diff --git a/test/fixtures/my-scoped-cool-api.spec b/test/fixtures/my-scoped-cool-api.spec new file mode 100644 index 0000000..7adba06 --- /dev/null +++ b/test/fixtures/my-scoped-cool-api.spec @@ -0,0 +1,47 @@ +%define name scoped-my-cool-api +%define version 1.1.1 +%define release 1 +%define buildroot %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) + +Name: %{name} +Version: %{version} +Release: %{release} +Summary: scoped-my-cool-api + +Group: Installation Script +License: MIT +Source: %{name}.tar.gz +BuildRoot: %{buildroot} +Requires: nodejs +BuildRequires: nodejs +AutoReqProv: no + +%description +My Cool API + +%prep +%setup -q -c -n %{name} + +%build +npm prune --production +npm rebuild + +%pre +getent group scoped-my-cool-api >/dev/null || groupadd -r scoped-my-cool-api +getent passwd scoped-my-cool-api >/dev/null || useradd -r -g scoped-my-cool-api -G scoped-my-cool-api -d / -s /sbin/nologin -c "scoped-my-cool-api" scoped-my-cool-api + +%install +mkdir -p %{buildroot}/usr/lib/scoped-my-cool-api +cp -r ./ %{buildroot}/usr/lib/scoped-my-cool-api +mkdir -p %{buildroot}/var/log/scoped-my-cool-api + +%post +systemctl enable /usr/lib/scoped-my-cool-api/scoped-my-cool-api.service + +%clean +rm -rf %{buildroot} + +%files +%defattr(644, scoped-my-cool-api, scoped-my-cool-api, 755) +/usr/lib/scoped-my-cool-api +/var/log/scoped-my-cool-api diff --git a/test/service.js b/test/service.js index 2077f6c..75b006e 100644 --- a/test/service.js +++ b/test/service.js @@ -36,4 +36,12 @@ describe('service', () => { assert.equal(service, expected); }); + + it('creates a service file from a scoped package.json', function () { + var pkg = require('./fixtures/my-scoped-cool-api'); + var expected = loadFixture('my-scoped-cool-api.service'); + var service = createServiceFile(pkg); + + assert.equal(service, expected); + }); }); diff --git a/test/spec.js b/test/spec.js index 9034c60..2a9b64b 100644 --- a/test/spec.js +++ b/test/spec.js @@ -90,4 +90,13 @@ describe('spec', () => { const spec = createSpecFile(pkg); assert.equal(spec, expected); }); + + it('creates a spec file from a scoped package.json', function () { + var pkg = require('./fixtures/my-scoped-cool-api'); + var expected = loadFixture('my-scoped-cool-api.spec'); + var spec = createSpecFile(pkg); + + assert.equal(spec, expected); + }); + }); From 528e9dba546ea0fee511a475d6a80ff3203d122b Mon Sep 17 00:00:00 2001 From: Waldemar Zurowski Date: Tue, 6 Feb 2018 22:16:15 +0100 Subject: [PATCH 3/4] packageFileName is a proper closure --- lib/files.js | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/lib/files.js b/lib/files.js index d5dc62d..13ccac8 100644 --- a/lib/files.js +++ b/lib/files.js @@ -4,13 +4,13 @@ const path = require('path'); module.exports = { serviceFile: function (root, pkg) { - return path.resolve(root, packageFileName(pkg) + '.service'); + return path.resolve(root, this.packageFileName(pkg) + '.service'); }, specsDirectory: function (root) { return path.resolve(root, 'SPECS'); }, specFile: function (root, pkg) { - return path.resolve(root, packageFileName(pkg) + '.spec'); + return path.resolve(root, this.packageFileName(pkg) + '.spec'); }, sourcesDirectory: function (root) { return path.resolve(root, 'SOURCES'); @@ -18,14 +18,12 @@ module.exports = { sourcesArchive: function (root, pkg) { const sourcesDirectory = this.sourcesDirectory(root); - return path.resolve(sourcesDirectory, packageFileName(pkg) + '.tar.gz'); + return path.resolve(sourcesDirectory, this.packageFileName(pkg) + '.tar.gz'); }, - packageFileName: packageFileName + packageFileName: function (pkg) { + return pkg.name[0] === '@' + // scoped packages get special treatment + ? pkg.name.substr(1).replace(/\//g, '-') + : pkg.name; + } }; - -function packageFileName (pkg) { - return pkg.name[0] === '@' - // scoped packages get special treatment - ? pkg.name.substr(1).replace(/\//g, '-') - : pkg.name; -} From 762e600e3b5ba8d6ebd7b3e4626df7b69492522f Mon Sep 17 00:00:00 2001 From: Waldemar Zurowski Date: Mon, 9 Apr 2018 17:51:24 +0200 Subject: [PATCH 4/4] Updates for esliny --- lib/files.js | 8 ++++---- test/service.js | 10 +++++----- test/spec.js | 11 +++++------ 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/lib/files.js b/lib/files.js index 13ccac8..9c9df74 100644 --- a/lib/files.js +++ b/lib/files.js @@ -21,9 +21,9 @@ module.exports = { return path.resolve(sourcesDirectory, this.packageFileName(pkg) + '.tar.gz'); }, packageFileName: function (pkg) { - return pkg.name[0] === '@' - // scoped packages get special treatment - ? pkg.name.substr(1).replace(/\//g, '-') - : pkg.name; + return pkg.name[0] === '@' + // scoped packages get special treatment + ? pkg.name.substr(1).replace(/\//g, '-') + : pkg.name; } }; diff --git a/test/service.js b/test/service.js index 75b006e..20eb721 100644 --- a/test/service.js +++ b/test/service.js @@ -37,11 +37,11 @@ describe('service', () => { assert.equal(service, expected); }); - it('creates a service file from a scoped package.json', function () { - var pkg = require('./fixtures/my-scoped-cool-api'); - var expected = loadFixture('my-scoped-cool-api.service'); - var service = createServiceFile(pkg); + it('creates a service file from a scoped package.json', () => { + const pkg = require('./fixtures/my-scoped-cool-api'); + const expected = loadFixture('my-scoped-cool-api.service'); + const service = createServiceFile(pkg); - assert.equal(service, expected); + assert.equal(service, expected); }); }); diff --git a/test/spec.js b/test/spec.js index 2a9b64b..5551366 100644 --- a/test/spec.js +++ b/test/spec.js @@ -91,12 +91,11 @@ describe('spec', () => { assert.equal(spec, expected); }); - it('creates a spec file from a scoped package.json', function () { - var pkg = require('./fixtures/my-scoped-cool-api'); - var expected = loadFixture('my-scoped-cool-api.spec'); - var spec = createSpecFile(pkg); - - assert.equal(spec, expected); + it('creates a spec file from a scoped package.json', () => { + const pkg = require('./fixtures/my-scoped-cool-api'); + const expected = loadFixture('my-scoped-cool-api.spec'); + const spec = createSpecFile(pkg); + assert.equal(spec, expected); }); });