UNPKG

ts-gir

Version:
190 lines (143 loc) 17.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); require("core-js/modules/es.symbol.description"); require("core-js/modules/es.array.filter"); require("core-js/modules/es.array.iterator"); require("core-js/modules/es.object.get-own-property-descriptors"); require("core-js/modules/es.set"); require("core-js/modules/es.string.search"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _err = _interopRequireDefault(require("err")); var _lodash = _interopRequireDefault(require("lodash")); var _cosmiconfig = require("cosmiconfig"); var _util = _interopRequireDefault(require("util")); var _fsExtra = _interopRequireDefault(require("fs-extra")); var _glob = _interopRequireDefault(require("glob")); var _path = _interopRequireDefault(require("path")); var _pkgDir = _interopRequireDefault(require("pkg-dir")); var _command = require("@oclif/command"); var _bluebird = require("bluebird"); var _runtime = require("babel-plugin-ts-optchain/lib/runtime"); var _Gir = _interopRequireDefault(require("./Gir")); var _GirJSGenerator = _interopRequireDefault(require("./GirJSGenerator")); var _GirTSGenerator = _interopRequireDefault(require("./GirTSGenerator")); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } const glob = _util.default.promisify(_glob.default); const rootPath = _pkgDir.default.sync(process.cwd()) || process.cwd(); class TSGir extends _command.Command { constructor(...args) { super(...args); this.warnings = new Set(); } getUserConfig() { return (0, _asyncToGenerator2.default)(function* () { const userConfig = (0, _runtime.oc)((yield (0, _cosmiconfig.cosmiconfig)('tsgir').search(rootPath)), ["config"], {}); return _objectSpread({ importMap: {}, ignoreDuplicates: false }, userConfig); })(); } runForFile(girFile) { var _this = this; return (0, _asyncToGenerator2.default)(function* () { const _this$parse = _this.parse(TSGir), flags = _this$parse.flags; const gir = new _Gir.default(); yield gir.loadFile(girFile); if (!gir.repository) throw new _err.default('xml not loaded'); let $namespaces = gir.repository.namespace; if (!Array.isArray($namespaces)) $namespaces = [$namespaces]; yield (0, _bluebird.mapSeries)($namespaces, /*#__PURE__*/ function () { var _ref = (0, _asyncToGenerator2.default)(function* ($namespace) { const namespaceName = $namespace['@_name']; const userConfig = yield _this.getUserConfig(); const moduleName = flags.module || userConfig.moduleName; // console.log(`Process namespace "${namespaceName}"`); const basename = flags.output || userConfig.output || _lodash.default.kebabCase(namespaceName); const dir = flags.dir || userConfig.dir || ''; const path = _path.default.resolve(process.cwd(), dir, basename); const girTSGenerator = new _GirTSGenerator.default($namespace, userConfig, { info: _this.log, warn: _this.handleWarn.bind(_this) }, moduleName); girTSGenerator.build(); const girJSGenerator = new _GirJSGenerator.default($namespace, girTSGenerator.renamed); girJSGenerator.build(); const tsCode = girTSGenerator.generate(); const jsCode = girJSGenerator.generate(); yield _fsExtra.default.writeFile(`${path}.d.ts`, tsCode); yield _fsExtra.default.writeFile(`${path}.js`, jsCode); }); return function (_x) { return _ref.apply(this, arguments); }; }()); })(); } run() { var _this2 = this; return (0, _asyncToGenerator2.default)(function* () { const _this2$parse = _this2.parse(TSGir), flags = _this2$parse.flags; let inputFiles = []; if (Array.isArray(flags.inputs)) { inputFiles = flags.inputs; } else { inputFiles = yield glob(flags.inputs); } for (let i = 0; i < inputFiles.length; i++) { if (inputFiles[i]) { yield _this2.runForFile(inputFiles[i]); } } })(); } handleWarn(input) { if (typeof input === 'string') { if (this.warnings.has(input)) return; this.warnings.add(input); } this.warn(input); } } exports.default = TSGir; TSGir.description = 'generate typescript from gir'; TSGir.flags = { help: _command.flags.help({ char: 'h' }), module: _command.flags.string({ char: 'm' }), output: _command.flags.string({ char: 'o', description: 'Output basename, if not set, the namespace is used' }), dir: _command.flags.string({ char: 'd', description: 'Output dir' }), silent: _command.flags.boolean({ char: 's' }), verbose: _command.flags.boolean(), version: _command.flags.version({ char: 'v' }), inputs: _command.flags.string({ char: 'i', multiple: true, required: true, default: '/usr/share/gir-1.0/*.gir', description: 'Paths to GIR files to generate type definitions from (with wild card support)' }) }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9UU0dpci50cyJdLCJuYW1lcyI6WyJnbG9iIiwidXRpbCIsInByb21pc2lmeSIsImdsb2JDYiIsInJvb3RQYXRoIiwicGtnRGlyIiwic3luYyIsInByb2Nlc3MiLCJjd2QiLCJUU0dpciIsIkNvbW1hbmQiLCJ3YXJuaW5ncyIsIlNldCIsImdldFVzZXJDb25maWciLCJ1c2VyQ29uZmlnIiwib2MiLCJzZWFyY2giLCJpbXBvcnRNYXAiLCJpZ25vcmVEdXBsaWNhdGVzIiwicnVuRm9yRmlsZSIsImdpckZpbGUiLCJwYXJzZSIsImZsYWdzIiwiZ2lyIiwiR2lyIiwibG9hZEZpbGUiLCJyZXBvc2l0b3J5IiwiRXJyIiwiJG5hbWVzcGFjZXMiLCJuYW1lc3BhY2UiLCJBcnJheSIsImlzQXJyYXkiLCIkbmFtZXNwYWNlIiwibmFtZXNwYWNlTmFtZSIsIm1vZHVsZU5hbWUiLCJtb2R1bGUiLCJiYXNlbmFtZSIsIm91dHB1dCIsIl8iLCJrZWJhYkNhc2UiLCJkaXIiLCJwYXRoIiwiUGF0aCIsInJlc29sdmUiLCJnaXJUU0dlbmVyYXRvciIsIkdpclRTR2VuZXJhdG9yIiwiaW5mbyIsImxvZyIsIndhcm4iLCJoYW5kbGVXYXJuIiwiYmluZCIsImJ1aWxkIiwiZ2lySlNHZW5lcmF0b3IiLCJHaXJKU0dlbmVyYXRvciIsInJlbmFtZWQiLCJ0c0NvZGUiLCJnZW5lcmF0ZSIsImpzQ29kZSIsImZzIiwid3JpdGVGaWxlIiwicnVuIiwiaW5wdXRGaWxlcyIsImlucHV0cyIsImkiLCJsZW5ndGgiLCJpbnB1dCIsImhhcyIsImFkZCIsImRlc2NyaXB0aW9uIiwiaGVscCIsImNoYXIiLCJzdHJpbmciLCJzaWxlbnQiLCJib29sZWFuIiwidmVyYm9zZSIsInZlcnNpb24iLCJtdWx0aXBsZSIsInJlcXVpcmVkIiwiZGVmYXVsdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNB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ZW50IjpbImltcG9ydCBFcnIgZnJvbSAnZXJyJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBjb3NtaWNvbmZpZyB9IGZyb20gJ2Nvc21pY29uZmlnJztcbmltcG9ydCB1dGlsIGZyb20gJ3V0aWwnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCBnbG9iQ2IgZnJvbSAnZ2xvYic7XG5pbXBvcnQgUGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBwa2dEaXIgZnJvbSAncGtnLWRpcic7XG5pbXBvcnQgeyBDb21tYW5kLCBmbGFncyB9IGZyb20gJ0BvY2xpZi9jb21tYW5kJztcbmltcG9ydCB7IG1hcFNlcmllcyB9IGZyb20gJ2JsdWViaXJkJztcbi8vIE5lZWRzIGJhYmVsXG5pbXBvcnQgeyBvYyB9IGZyb20gJ3RzLW9wdGNoYWluLm1hY3JvJztcbmltcG9ydCBHaXIgZnJvbSAnLi9HaXInO1xuaW1wb3J0IEdpckpTR2VuZXJhdG9yIGZyb20gJy4vR2lySlNHZW5lcmF0b3InO1xuaW1wb3J0IEdpclRTR2VuZXJhdG9yIGZyb20gJy4vR2lyVFNHZW5lcmF0b3InO1xuaW1wb3J0IHsgTmFtZXNwYWNlLCBVc2VyQ29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IGdsb2IgPSB1dGlsLnByb21pc2lmeShnbG9iQ2IpO1xuXG5jb25zdCByb290UGF0aCA9IHBrZ0Rpci5zeW5jKHByb2Nlc3MuY3dkKCkpIHx8IHByb2Nlc3MuY3dkKCk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRTR2lyIGV4dGVuZHMgQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9ICdnZW5lcmF0ZSB0eXBlc2NyaXB0IGZyb20gZ2lyJztcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgaGVscDogZmxhZ3MuaGVscCh7IGNoYXI6ICdoJyB9KSxcbiAgICBtb2R1bGU6IGZsYWdzLnN0cmluZyh7IGNoYXI6ICdtJyB9KSxcbiAgICBvdXRwdXQ6IGZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiAnbycsXG4gICAgICBkZXNjcmlwdGlvbjogJ091dHB1dCBiYXNlbmFtZSwgaWYgbm90IHNldCwgdGhlIG5hbWVzcGFjZSBpcyB1c2VkJ1xuICAgIH0pLFxuICAgIGRpcjogZmxhZ3Muc3RyaW5nKHsgY2hhcjogJ2QnLCBkZXNjcmlwdGlvbjogJ091dHB1dCBkaXInIH0pLFxuICAgIHNpbGVudDogZmxhZ3MuYm9vbGVhbih7IGNoYXI6ICdzJyB9KSxcbiAgICB2ZXJib3NlOiBmbGFncy5ib29sZWFuKCksXG4gICAgdmVyc2lvbjogZmxhZ3MudmVyc2lvbih7IGNoYXI6ICd2JyB9KSxcbiAgICBpbnB1dHM6IGZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiAnaScsXG4gICAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgZGVmYXVsdDogJy91c3Ivc2hhcmUvZ2lyLTEuMC8qLmdpcicsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1BhdGhzIHRvIEdJUiBmaWxlcyB0byBnZW5lcmF0ZSB0eXBlIGRlZmluaXRpb25zIGZyb20gKHdpdGggd2lsZCBjYXJkIHN1cHBvcnQpJ1xuICAgIH0pXG4gIH07XG5cbiAgd2FybmluZ3M6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIGFzeW5jIGdldFVzZXJDb25maWcoKTogUHJvbWlzZTxVc2VyQ29uZmlnPiB7XG4gICAgY29uc3QgdXNlckNvbmZpZzogUGFydGlhbDxVc2VyQ29uZmlnPiA9IG9jKFxuICAgICAgYXdhaXQgY29zbWljb25maWcoJ3RzZ2lyJykuc2VhcmNoKHJvb3RQYXRoKVxuICAgICkuY29uZmlnKHt9KTtcbiAgICByZXR1cm4ge1xuICAgICAgaW1wb3J0TWFwOiB7fSxcbiAgICAgIGlnbm9yZUR1cGxpY2F0ZXM6IGZhbHNlLFxuICAgICAgLi4udXNlckNvbmZpZ1xuICAgIH07XG4gIH1cblxuICBhc3luYyBydW5Gb3JGaWxlKGdpckZpbGU6IHN0cmluZykge1xuICAgIGNvbnN0IHsgZmxhZ3MgfSA9IHRoaXMucGFyc2UoVFNHaXIpO1xuICAgIGNvbnN0IGdpciA9IG5ldyBHaXIoKTtcbiAgICBhd2FpdCBnaXIubG9hZEZpbGUoZ2lyRmlsZSk7XG4gICAgaWYgKCFnaXIucmVwb3NpdG9yeSkgdGhyb3cgbmV3IEVycigneG1sIG5vdCBsb2FkZWQnKTtcbiAgICBsZXQgJG5hbWVzcGFjZXMgPSBnaXIucmVwb3NpdG9yeS5uYW1lc3BhY2U7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KCRuYW1lc3BhY2VzKSkgJG5hbWVzcGFjZXMgPSBbJG5hbWVzcGFjZXNdO1xuICAgIGF3YWl0IG1hcFNlcmllcygkbmFtZXNwYWNlcywgYXN5bmMgKCRuYW1lc3BhY2U6IE5hbWVzcGFjZSkgPT4ge1xuICAgICAgY29uc3QgbmFtZXNwYWNlTmFtZSA9ICRuYW1lc3BhY2VbJ0BfbmFtZSddO1xuICAgICAgY29uc3QgdXNlckNvbmZpZyA9IGF3YWl0IHRoaXMuZ2V0VXNlckNvbmZpZygpO1xuICAgICAgY29uc3QgbW9kdWxlTmFtZSA9IGZsYWdzLm1vZHVsZSB8fCB1c2VyQ29uZmlnLm1vZHVsZU5hbWU7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgUHJvY2VzcyBuYW1lc3BhY2UgXCIke25hbWVzcGFjZU5hbWV9XCJgKTtcbiAgICAgIGNvbnN0IGJhc2VuYW1lID1cbiAgICAgICAgZmxhZ3Mub3V0cHV0IHx8IHVzZXJDb25maWcub3V0cHV0IHx8IF8ua2ViYWJDYXNlKG5hbWVzcGFjZU5hbWUpO1xuICAgICAgY29uc3QgZGlyID0gZmxhZ3MuZGlyIHx8IHVzZXJDb25maWcuZGlyIHx8ICcnO1xuICAgICAgY29uc3QgcGF0aCA9IFBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBkaXIsIGJhc2VuYW1lKTtcbiAgICAgIGNvbnN0IGdpclRTR2VuZXJhdG9yID0gbmV3IEdpclRTR2VuZXJhdG9yKFxuICAgICAgICAkbmFtZXNwYWNlLFxuICAgICAgICB1c2VyQ29uZmlnLFxuICAgICAgICB7XG4gICAgICAgICAgaW5mbzogdGhpcy5sb2csXG4gICAgICAgICAgd2FybjogdGhpcy5oYW5kbGVXYXJuLmJpbmQodGhpcylcbiAgICAgICAgfSxcbiAgICAgICAgbW9kdWxlTmFtZVxuICAgICAgKTtcbiAgICAgIGdpclRTR2VuZXJhdG9yLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IGdpckpTR2VuZXJhdG9yID0gbmV3IEdpckpTR2VuZXJhdG9yKFxuICAgICAgICAkbmFtZXNwYWNlLFxuICAgICAgICBnaXJUU0dlbmVyYXRvci5yZW5hbWVkXG4gICAgICApO1xuICAgICAgZ2lySlNHZW5lcmF0b3IuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHRzQ29kZSA9IGdpclRTR2VuZXJhdG9yLmdlbmVyYXRlKCk7XG4gICAgICBjb25zdCBqc0NvZGUgPSBnaXJKU0dlbmVyYXRvci5nZW5lcmF0ZSgpO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGAke3BhdGh9LmQudHNgLCB0c0NvZGUpO1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGAke3BhdGh9LmpzYCwganNDb2RlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJ1bigpIHtcbiAgICBjb25zdCB7IGZsYWdzIH0gPSB0aGlzLnBhcnNlKFRTR2lyKTtcbiAgICBsZXQgaW5wdXRGaWxlcyA9IFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZsYWdzLmlucHV0cykpIHtcbiAgICAgIGlucHV0RmlsZXMgPSBmbGFncy5pbnB1dHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlucHV0RmlsZXMgPSBhd2FpdCBnbG9iKGZsYWdzLmlucHV0cyk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRGaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGlucHV0RmlsZXNbaV0pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5ydW5Gb3JGaWxlKGlucHV0RmlsZXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVdhcm4oaW5wdXQ6IHN0cmluZyB8IEVycm9yKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICh0aGlzLndhcm5pbmdzLmhhcyhpbnB1dCkpIHJldHVybjtcbiAgICAgIHRoaXMud2FybmluZ3MuYWRkKGlucHV0KTtcbiAgICB9XG4gICAgdGhpcy53YXJuKGlucHV0KTtcbiAgfVxufVxuIl19