Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CB-12397 fix .gitignore for plugins & platforms (cordova-create part) #8

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,17 @@ module.exports = function (dir, optionalId, optionalName, cfg, extEvents) {
fs.mkdirSync(dir);
}

// CB-12397 add .gitignore for plugins & platforms
// to generated app
// (use stock .npmignore for ignore file)
// NOTE: This is a workaround solution for the existing
// npm .gitignore/.npmignore behavior discussed in:
// npm/npm#1862
// npm/npm#3763
// npm/npm#7252
const ignoreStockPath =
path.join(require('cordova-app-hello-world').dirname, '.npmignore');

try {
// Copy files from template to project
if (cfg.lib.www.template) {
Expand Down Expand Up @@ -263,6 +274,16 @@ module.exports = function (dir, optionalId, optionalName, cfg, extEvents) {

pkgjson.version = DEFAULT_VERSION;
fs.writeFileSync(pkgjsonPath, JSON.stringify(pkgjson, null, 4), 'utf8');

// XXX TODO USE fs-extra function instead,
// XXX WAITING FOR apache/cordova-create#14 to be merged
// CB-12397 add .gitignore for plugins & platforms
// to generated app
// XXX GONE:
shell.cp(ignoreStockPath, path.join(dir, '.gitignore'));
/* ** XXX TODO:
fs.copySync(ignoreStockPath, path.join(dir, '.gitignore'));
// */
}

// Create basic project structure.
Expand Down
153 changes: 106 additions & 47 deletions spec/create.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,88 +57,138 @@ describe('cordova create checks for valid-identifier', function () {

describe('create end-to-end', function () {

function checkProject () {
function checkProjectCommonArtifacts () {
// Check if top level dirs exist.
var dirs = ['hooks', 'platforms', 'plugins', 'www'];
dirs.forEach(function (d) {
expect(path.join(project, d)).toExist();
});

// Check that README.md exists inside of hooks
expect(path.join(project, 'hooks', 'README.md')).toExist();

// Check if www files exist.
// Check that index.html exists inside of www
expect(path.join(project, 'www', 'index.html')).toExist();

// Check that config.xml was updated.
var configXml = new ConfigParser(path.join(project, 'config.xml'));
expect(configXml.packageName()).toEqual(appId);

// TODO (kamrik): check somehow that we got the right config.xml from the fixture and not some place else.
// expect(configXml.name()).toEqual('TestBase');
}
// Check if config.xml exists.
expect(path.join(project, 'config.xml')).toExist();

function checkConfigXml () {
// Check if top level dirs exist.
var dirs = ['hooks', 'platforms', 'plugins', 'www'];
dirs.forEach(function (d) {
expect(path.join(project, d)).toExist();
});
expect(path.join(project, 'hooks', 'README.md')).toExist();

// index.js and template subdir folder should not exist (inner files should be copied to the project folder)
// index.html, index.js and template subdir folder
// should not exist in top level
// (inner files should be copied to the project top level folder)
expect(path.join(project, 'index.html')).not.toExist();
expect(path.join(project, 'index.js')).not.toExist();
expect(path.join(project, 'template')).not.toExist();

// Check if www files exist.
expect(path.join(project, 'www', 'index.html')).toExist();
// Check that .gitignore does not exist inside of www
expect(path.join(project, 'www', '.gitignore')).not.toExist();

// Check that .npmignore does not exist inside of www
expect(path.join(project, 'www', '.npmignore')).not.toExist();

// Check that config.xml does not exist inside of www
expect(path.join(project, 'www', 'config.xml')).not.toExist();

// Check that no package.json exists inside of www
expect(path.join(project, 'www', 'package.json')).not.toExist();

// Check that config.xml was updated.
var configXml = new ConfigParser(path.join(project, 'config.xml'));
expect(configXml.packageName()).toEqual(appId);
expect(configXml.version()).toEqual('1.0.0');
// Check that we got the right config.xml from the fixture and not some place else.
expect(configXml.name()).toEqual('TestBase');
}

// Check that config.xml does not exist inside of www
expect(path.join(project, 'www', 'config.xml')).not.toExist();
function checkProjectArtifactsWithConfigFromTemplate () {
checkProjectCommonArtifacts();

// Check that standard js artifact does not exist
expect(path.join(project, 'www', 'js')).not.toExist();
expect(path.join(project, 'www', 'js', 'index.js')).not.toExist();

// [CB-12397] Check that .gitignore does not exist
expect(path.join(project, '.gitignore')).not.toExist();
// [CB-12397] Check that .npmignore does not exist
expect(path.join(project, '.npmignore')).not.toExist();

// Check that we got no package.json
expect(path.join(project, 'package.json')).not.toExist();

// Check that we got the right config.xml from the template and not stock
const configXml = new ConfigParser(path.join(project, 'config.xml'));
expect(configXml.description()).toEqual('this is the correct config.xml');
}

function checkSubDir () {
// Check if top level dirs exist.
var dirs = ['hooks', 'platforms', 'plugins', 'www'];
dirs.forEach(function (d) {
expect(path.join(project, d)).toExist();
});
expect(path.join(project, 'hooks', 'README.md')).toExist();
function checkProjectArtifactsWithNoPackageFromTemplate () {
checkProjectCommonArtifacts();

// index.js and template subdir folder should not exist (inner files should be copied to the project folder)
expect(path.join(project, 'index.js')).not.toExist();
expect(path.join(project, 'template')).not.toExist();
// Check that standard js artifact does not exist
expect(path.join(project, 'www', 'js')).not.toExist();
expect(path.join(project, 'www', 'js', 'index.js')).not.toExist();

// [CB-12397] Check that .gitignore does not exist
expect(path.join(project, '.gitignore')).not.toExist();
// [CB-12397] Check that .npmignore does not exist
expect(path.join(project, '.npmignore')).not.toExist();

// Check that we got no package.json
expect(path.join(project, 'package.json')).not.toExist();
}

function checkProjectArtifactsWithPackageFromTemplate () {
checkProjectCommonArtifacts();

// Check that standard js artifact exists
expect(path.join(project, 'www', 'js')).toExist();
expect(path.join(project, 'www', 'js', 'index.js')).toExist();

// Check if package.json exists.
expect(path.join(project, 'package.json')).toExist();

// [CB-12397] Check that .gitignore exists
expect(path.join(project, '.gitignore')).toExist();
// [CB-12397] Check that .npmignore exists
expect(path.join(project, '.npmignore')).toExist();

// Check that we got package.json (the correct one)
var pkjson = requireFresh(path.join(project, 'package.json'));
// Pkjson.displayName should equal config's name.
expect(pkjson.displayName).toEqual('TestBase');
}

function checkProjectArtifactsWithPackageFromSubDir () {
checkProjectCommonArtifacts();

// Check that standard js artifact does not exist
expect(path.join(project, 'www', 'js')).not.toExist();
expect(path.join(project, 'www', 'js', 'index.js')).not.toExist();

// [CB-12397] Check that .gitignore exists
expect(path.join(project, '.gitignore')).toExist();
// [CB-12397] Check that .npmignore does not exist
expect(path.join(project, '.npmignore')).not.toExist();

// Check if config files exist.
expect(path.join(project, 'www', 'index.html')).toExist();

// Check that config.xml was updated.
var configXml = new ConfigParser(path.join(project, 'config.xml'));
expect(configXml.packageName()).toEqual(appId);
expect(configXml.version()).toEqual('1.0.0');
// Check that we got package.json (the correct one)
var pkjson = requireFresh(path.join(project, 'package.json'));

// Pkjson.displayName should equal config's name.
expect(pkjson.displayName).toEqual(appName);
expect(pkjson.valid).toEqual('true');

// Check that we got the right config.xml
const configXml = new ConfigParser(path.join(project, 'config.xml'));
expect(configXml.description()).toEqual('this is the correct config.xml');
}

it('should successfully run without template and use default hello-world app', function () {
// Create a real project with no template
// use default cordova-app-hello-world app
return create(project, appId, appName, {}, events)
.then(checkProject)
.then(checkProjectArtifactsWithPackageFromTemplate)
.then(function () {
var pkgJson = requireFresh(path.join(project, 'package.json'));
// confirm default hello world app copies over package.json and it matched appId
Expand All @@ -161,7 +211,7 @@ describe('create end-to-end', function () {
expect(fetchSpy).toHaveBeenCalledTimes(1);
expect(fetchSpy.calls.argsFor(0)[0]).toBe(config.lib.www.url);
})
.then(checkProject);
.then(checkProjectArtifactsWithPackageFromTemplate);
});

it('should successfully run with NPM package', function () {
Expand All @@ -179,7 +229,7 @@ describe('create end-to-end', function () {
expect(fetchSpy).toHaveBeenCalledTimes(1);
expect(fetchSpy.calls.argsFor(0)[0]).toBe(config.lib.www.url);
})
.then(checkProject);
.then(checkProjectArtifactsWithPackageFromTemplate);
});

it('should successfully run with NPM package and explicitly fetch latest if no version is given', function () {
Expand All @@ -198,7 +248,7 @@ describe('create end-to-end', function () {
expect(fetchSpy).toHaveBeenCalledTimes(1);
expect(fetchSpy.calls.argsFor(0)[0]).toBe(config.lib.www.url + '@latest');
})
.then(checkProject);
.then(checkProjectArtifactsWithPackageFromTemplate);
});

it('should successfully run with template not having a package.json at toplevel', function () {
Expand All @@ -211,7 +261,7 @@ describe('create end-to-end', function () {
}
};
return create(project, appId, appName, config, events)
.then(checkProject)
.then(checkProjectArtifactsWithNoPackageFromTemplate)
.then(function () {
// Check that we got the right config.xml
var configXml = new ConfigParser(path.join(project, 'config.xml'));
Expand All @@ -229,7 +279,7 @@ describe('create end-to-end', function () {
}
};
return create(project, appId, appName, config, events)
.then(checkProject);
.then(checkProjectArtifactsWithNoPackageFromTemplate);
});

it('should successfully run with template having package.json, and subdirectory, and no package.json in subdirectory', function () {
Expand All @@ -242,7 +292,7 @@ describe('create end-to-end', function () {
}
};
return create(project, appId, appName, config, events)
.then(checkProject);
.then(checkProjectArtifactsWithNoPackageFromTemplate);
});

it('should successfully run with template having package.json, and subdirectory, and package.json in subdirectory', function () {
Expand All @@ -255,7 +305,7 @@ describe('create end-to-end', function () {
}
};
return create(project, appId, appName, config, events)
.then(checkSubDir);
.then(checkProjectArtifactsWithPackageFromSubDir);
});

it('should successfully run config.xml in the www folder and move it outside', function () {
Expand All @@ -268,7 +318,7 @@ describe('create end-to-end', function () {
}
};
return create(project, appId, appName, config, events)
.then(checkConfigXml);
.then(checkProjectArtifactsWithConfigFromTemplate);
});

it('should successfully run with www folder as the template', function () {
Expand All @@ -281,13 +331,20 @@ describe('create end-to-end', function () {
}
};
return create(project, appId, appName, config, events)
.then(checkConfigXml);
.then(checkProjectArtifactsWithConfigFromTemplate)
.then(() => {
// Additional check that we have the fixture www,
// not one from stock the app
expect(path.join(project, 'www', 'fixture-marker-page.html')).toExist();
expect(path.join(project, 'www', 'subdir')).toExist();
expect(path.join(project, 'www', 'subdir', 'sub-fixture-marker-page.html')).toExist();
});
});

it('should successfully run with existing, empty destination', function () {
shell.mkdir('-p', project);
return create(project, appId, appName, {}, events)
.then(checkProject);
.then(checkProjectArtifactsWithPackageFromTemplate);
});

describe('when --link-to is provided', function () {
Expand Down Expand Up @@ -315,6 +372,7 @@ describe('create end-to-end', function () {

// Check www/config exists
expect(path.join(project, 'www', 'config.xml')).toExist();

// Check www/config.xml was not updated.
var configXml = new ConfigParser(path.join(project, 'www', 'config.xml'));
expect(configXml.packageName()).toEqual('io.cordova.hellocordova');
Expand All @@ -323,6 +381,7 @@ describe('create end-to-end', function () {

// Check that config.xml was copied to project/config.xml
expect(path.join(project, 'config.xml')).toExist();

configXml = new ConfigParser(path.join(project, 'config.xml'));
expect(configXml.description()).toEqual('this is the correct config.xml');
// Check project/config.xml was updated.
Expand Down
4 changes: 2 additions & 2 deletions spec/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,9 @@ beforeEach(function () {
result.pass = fs.existsSync(testPath);

if (result.pass) {
result.message = 'Expected file ' + testPath + ' to exist.';
} else {
result.message = 'Expected file ' + testPath + ' to not exist.';
} else {
result.message = 'Expected file ' + testPath + ' to exist.';
}

return result;
Expand Down
1 change: 1 addition & 0 deletions spec/templates/config_in_www/www/fixture-marker-page.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<h1>Fixture marker page</h1>
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<h1>Sub-fixture marker page</h1>