service-collector.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. var fs = require('fs');
  2. var util = require('util');
  3. var path = require('path');
  4. var AWS = require('../');
  5. var apis = require('../lib/api_loader');
  6. var metadata = require('../apis/metadata');
  7. var ClientCreator = require('./client-creator');
  8. var clientCreator = new ClientCreator();
  9. var defaultServices = clientCreator.getDefaultServices().join(',');
  10. var sanitizeRegex = /[^a-zA-Z0-9,-]/;
  11. var serviceClasses = {};
  12. Object.keys(AWS).forEach(function(name) {
  13. if (AWS[name].serviceIdentifier) {
  14. serviceClasses[AWS[name].serviceIdentifier] = AWS[name];
  15. }
  16. });
  17. function getServiceHeader(service) {
  18. if (service === 'all') {
  19. return Object.keys(serviceClasses).map(function(name) {
  20. return getServiceHeader(name);
  21. }).join('\n');
  22. }
  23. if (!serviceClasses[service]) return null;
  24. var versions = serviceClasses[service].apiVersions.map(function(version) {
  25. return version.indexOf('*') >= 0 ? null : version;
  26. }).filter(function(c) { return c !== null; });
  27. var file = util.format(
  28. 'if (!Object.prototype.hasOwnProperty.call(AWS, \'' + metadata[service].name + '\')) {\n' +
  29. ' AWS.apiLoader.services[\'%s\'] = {};\n' +
  30. ' AWS.%s = AWS.Service.defineService(\'%s\', %s);\n',
  31. service, metadata[service].name, service, util.inspect(versions));
  32. var svcPath = path.join(__dirname, '..', 'lib', 'services', service + '.js');
  33. if (fs.existsSync(svcPath)) {
  34. file += ' require(\'./services/' + service + '\');\n';
  35. }
  36. file += '}\n';
  37. return file;
  38. }
  39. function getService(service, version) {
  40. if (service === 'all') {
  41. return Object.keys(serviceClasses).map(function(name) {
  42. var out = serviceClasses[name].apiVersions.map(function(svcVersion) {
  43. if (svcVersion.indexOf('*') >= 0) return null;
  44. return getService(name, svcVersion);
  45. }).filter(function(c) { return c !== null; }).join('\n');
  46. return out;
  47. }).join('\n');
  48. }
  49. var svc, api;
  50. if (!serviceClasses[service]) {
  51. return null;
  52. }
  53. try {
  54. var ClassName = serviceClasses[service];
  55. svc = new ClassName({apiVersion: version, endpoint: 'localhost'});
  56. api = svc.api;
  57. } catch (e) {
  58. return null;
  59. }
  60. var serviceFileName = metadata[service].prefix || service;
  61. var lines = [];
  62. var line = util.format(
  63. 'AWS.apiLoader.services[\'%s\'][\'%s\'] = %s;\n',
  64. service, svc.api.apiVersion, 'require(\'../apis/' + serviceFileName + '-' + svc.api.apiVersion + '.min\')');
  65. lines.push(line);
  66. if (Object.prototype.hasOwnProperty.call(api, 'paginators') && Object.keys(api.paginators).length) {
  67. line = util.format(
  68. 'AWS.apiLoader.services[\'%s\'][\'%s\'].paginators = %s;\n',
  69. service, svc.api.apiVersion, 'require(\'../apis/' + serviceFileName + '-' + svc.api.apiVersion + '.paginators\').pagination');
  70. lines.push(line);
  71. }
  72. if (Object.prototype.hasOwnProperty.call(api, 'waiters') && Object.keys(api.waiters).length) {
  73. line = util.format(
  74. 'AWS.apiLoader.services[\'%s\'][\'%s\'].waiters = %s;\n',
  75. service, svc.api.apiVersion, 'require(\'../apis/' + serviceFileName + '-' + svc.api.apiVersion + '.waiters2\').waiters');
  76. lines.push(line);
  77. }
  78. return lines.join('');
  79. }
  80. function ServiceCollector(services) {
  81. var builtServices = {};
  82. function buildService(name, usingDefaultServices) {
  83. var match = name.match(/^(.+?)(?:-(.+?))?$/);
  84. var service = match[1], version = match[2] || 'latest';
  85. var contents = [];
  86. var lines, err;
  87. if (!builtServices[service]) {
  88. builtServices[service] = {};
  89. lines = getServiceHeader(service);
  90. if (lines === null) {
  91. if (!usingDefaultServices) {
  92. err = new Error('Invalid module: ' + service);
  93. err.name = 'InvalidModuleError';
  94. throw err;
  95. }
  96. } else {
  97. contents.push(lines);
  98. }
  99. }
  100. if (!builtServices[service][version]) {
  101. builtServices[service][version] = true;
  102. lines = getService(service, version);
  103. if (lines === null) {
  104. if (!usingDefaultServices) {
  105. err = new Error('Invalid module: ' + service + '-' + version);
  106. err.name = 'InvalidModuleError';
  107. throw err;
  108. }
  109. } else {
  110. contents.push(lines);
  111. }
  112. }
  113. return contents.join('');
  114. }
  115. var serviceCode = '';
  116. var usingDefaultServicesToggle = false;
  117. if (!services) {
  118. usingDefaultServicesToggle = true;
  119. services = defaultServices;
  120. }
  121. if (services.match(sanitizeRegex)) {
  122. throw new Error('Incorrectly formatted service names');
  123. }
  124. var invalidModules = [];
  125. services.split(',').sort().forEach(function(name) {
  126. if (['cognitoidentity', 'sts'].indexOf(name) >= 0) {
  127. // these service has been included via browser credentials already
  128. return;
  129. }
  130. try {
  131. serviceCode += buildService(name, usingDefaultServicesToggle) + '\n';
  132. } catch (e) {
  133. if (e.name === 'InvalidModuleError') invalidModules.push(name);
  134. else throw e;
  135. }
  136. });
  137. if (invalidModules.length > 0) {
  138. throw new Error('Missing modules: ' + invalidModules.join(', '));
  139. }
  140. return serviceCode;
  141. }
  142. module.exports = ServiceCollector;