UNPKG

projen

Version:

CDK for software projects

122 lines • 14.3 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.GitAttributesFile = exports.EndOfLine = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const file_1 = require("./file"); /** * The end of line characters supported by git. */ var EndOfLine; (function (EndOfLine) { /** * Maintain existing (mixed values within one file are normalised by looking * at what's used after the first line) */ EndOfLine["AUTO"] = "auto"; /** * Carriage Return + Line Feed characters (\r\n), common on Windows */ EndOfLine["CRLF"] = "crlf"; /** * Line Feed only (\n), common on Linux and macOS as well as inside git repos */ EndOfLine["LF"] = "lf"; /** * Disable and do not configure the end of line character */ EndOfLine["NONE"] = "none"; })(EndOfLine || (exports.EndOfLine = EndOfLine = {})); /** * Assign attributes to file names in a git repository. * * @see https://git-scm.com/docs/gitattributes */ class GitAttributesFile extends file_1.FileBase { constructor(scope, options) { super(scope, ".gitattributes", { editGitignore: false, }); this.attributes = new Map(); this.endOfLine = options?.endOfLine ?? EndOfLine.LF; if (this.endOfLine != EndOfLine.NONE) { let endOfLineAttributes = [`text=auto`]; if (this.endOfLine != EndOfLine.AUTO) { endOfLineAttributes.push(`eol=${this.endOfLine}`); } // Setting a default end of line for all text files in the repository // This line should be the first one in order to use it as a default for text files and allow for overriding in later lines this.addAttributes("*", ...endOfLineAttributes); } } /** * Maps a set of attributes to a set of files. * @param glob Glob pattern to match files in the repo. * @param attributes Attributes to assign to these files. */ addAttributes(glob, ...attributes) { if (!this.attributes.has(glob)) { this.attributes.set(glob, new Set()); } const set = this.attributes.get(glob); for (const attribute of attributes) { set.add(attribute); } } /** * Removes attributes from a set of files. * * If no attributes are provided, the glob pattern will be removed completely. * * @param glob Glob pattern to modify. * @param attributes Attributes to remove from matched files. */ removeAttributes(glob, ...attributes) { if (attributes.length === 0) { this.attributes.delete(glob); return; } const mapping = this.attributes.get(glob); if (!mapping) { return; } for (const attribute of attributes) { mapping.delete(attribute); } if (mapping.size === 0) { this.attributes.delete(glob); } } /** * Add attributes necessary to mark these files as stored in LFS */ addLfsPattern(glob) { this.addAttributes(glob, "filter=lfs", "diff=lfs", "merge=lfs", "-text"); } /** * Whether the current gitattributes file has any LFS patterns */ get hasLfsPatterns() { return Array.from(this.attributes.values()).some((attrs) => attrs.has("filter=lfs")); } preSynthesize() { this.project.addPackageIgnore("/.gitattributes"); super.preSynthesize(); } synthesizeContent(_) { // We can assume the file map is never empty. const entries = Array.from(this.attributes.entries()).sort(([l], [r]) => l.localeCompare(r)); if (entries.length === 0) { return undefined; } return [ ...(this.marker ? [`# ${this.marker}`] : []), "", ...entries.map(([name, attributes]) => `${name} ${Array.from(attributes).join(" ")}`), ].join("\n"); } } exports.GitAttributesFile = GitAttributesFile; _a = JSII_RTTI_SYMBOL_1; GitAttributesFile[_a] = { fqn: "projen.GitAttributesFile", version: "0.98.32" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0YXR0cmlidXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9naXRhdHRyaWJ1dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsaUNBQTZDO0FBRTdDOztHQUVHO0FBQ0gsSUFBWSxTQXFCWDtBQXJCRCxXQUFZLFNBQVM7SUFDbkI7OztPQUdHO0lBQ0gsMEJBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gsMEJBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gsc0JBQVMsQ0FBQTtJQUVUOztPQUVHO0lBQ0gsMEJBQWEsQ0FBQTtBQUNmLENBQUMsRUFyQlcsU0FBUyx5QkFBVCxTQUFTLFFBcUJwQjtBQWdCRDs7OztHQUlHO0FBQ0gsTUFBYSxpQkFBa0IsU0FBUSxlQUFRO0lBUTdDLFlBQW1CLEtBQWlCLEVBQUUsT0FBa0M7UUFDdEUsS0FBSyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRTtZQUM3QixhQUFhLEVBQUUsS0FBSztTQUNyQixDQUFDLENBQUM7UUFWWSxlQUFVLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7UUFZM0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLEVBQUUsU0FBUyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFFcEQsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyQyxJQUFJLG1CQUFtQixHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFeEMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDckMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDcEQsQ0FBQztZQUVELHFFQUFxRTtZQUNyRSwySEFBMkg7WUFDM0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFD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QUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUN0RTtTQUNGLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2YsQ0FBQzs7QUEvR0gsOENBZ0hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBJUmVzb2x2ZXIsIEZpbGVCYXNlIH0gZnJvbSBcIi4vZmlsZVwiO1xuXG4vKipcbiAqIFRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXJzIHN1cHBvcnRlZCBieSBnaXQuXG4gKi9cbmV4cG9ydCBlbnVtIEVuZE9mTGluZSB7XG4gIC8qKlxuICAgKiBNYWludGFpbiBleGlzdGluZyAobWl4ZWQgdmFsdWVzIHdpdGhpbiBvbmUgZmlsZSBhcmUgbm9ybWFsaXNlZCBieSBsb29raW5nXG4gICAqIGF0IHdoYXQncyB1c2VkIGFmdGVyIHRoZSBmaXJzdCBsaW5lKVxuICAgKi9cbiAgQVVUTyA9IFwiYXV0b1wiLFxuXG4gIC8qKlxuICAgKiBDYXJyaWFnZSBSZXR1cm4gKyBMaW5lIEZlZWQgY2hhcmFjdGVycyAoXFxyXFxuKSwgY29tbW9uIG9uIFdpbmRvd3NcbiAgICovXG4gIENSTEYgPSBcImNybGZcIixcblxuICAvKipcbiAgICogTGluZSBGZWVkIG9ubHkgKFxcbiksIGNvbW1vbiBvbiBMaW51eCBhbmQgbWFjT1MgYXMgd2VsbCBhcyBpbnNpZGUgZ2l0IHJlcG9zXG4gICAqL1xuICBMRiA9IFwibGZcIixcblxuICAvKipcbiAgICogRGlzYWJsZSBhbmQgZG8gbm90IGNvbmZpZ3VyZSB0aGUgZW5kIG9mIGxpbmUgY2hhcmFjdGVyXG4gICAqL1xuICBOT05FID0gXCJub25lXCIsXG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYEdpdEF0dHJpYnV0ZXNGaWxlYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRBdHRyaWJ1dGVzRmlsZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGRlZmF1bHQgZW5kIG9mIGxpbmUgY2hhcmFjdGVyIGZvciB0ZXh0IGZpbGVzLlxuICAgKlxuICAgKiBlbmRPZkxpbmUgaXQncyB1c2VmdWwgdG8ga2VlcCB0aGUgc2FtZSBlbmQgb2YgbGluZSBiZXR3ZWVuIFdpbmRvd3MgYW5kIFVuaXggb3BlcmF0aXZlIHN5c3RlbXMgZm9yIGdpdCBjaGVja2luZy9jaGVja291dCBvcGVyYXRpb25zLiBIZW5jZSwgaXQgY2FuIGF2b2lkIHNpbXBsZSByZXBvc2l0b3J5IG11dGF0aW9ucyBjb25zaXN0aW5nIG9ubHkgb2YgY2hhbmdlcyBpbiB0aGUgZW5kIG9mIGxpbmUgY2hhcmFjdGVycy4gSXQgd2lsbCBiZSBzZXQgaW4gdGhlIGZpcnN0IGxpbmUgb2YgdGhlIC5naXRhdHRyaWJ1dGVzIGZpbGUgdG8gbWFrZSBpdCB0aGUgZmlyc3QgbWF0Y2ggd2l0aCBoaWdoIHByaW9yaXR5IGJ1dCBpdCBjYW4gYmUgb3ZlcnJpZGVuIGluIGEgbGF0ZXIgbGluZS4gQ2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgZXhwbGljaXRseTogYHsgZW5kT2ZMaW5lOiBFbmRPZkxpbmUuTk9ORSB9YC5cbiAgICpcbiAgICogQGRlZmF1bHQgRW5kT2ZMaW5lLkxGXG4gICAqL1xuICByZWFkb25seSBlbmRPZkxpbmU/OiBFbmRPZkxpbmU7XG59XG5cbi8qKlxuICogQXNzaWduIGF0dHJpYnV0ZXMgdG8gZmlsZSBuYW1lcyBpbiBhIGdpdCByZXBvc2l0b3J5LlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdGF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGNsYXNzIEdpdEF0dHJpYnV0ZXNGaWxlIGV4dGVuZHMgRmlsZUJhc2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGF0dHJpYnV0ZXMgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGVuZCBvZiBsaW5lIGNoYXJhY3RlciBmb3IgdGV4dCBmaWxlcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRPZkxpbmU6IEVuZE9mTGluZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioc2NvcGU6IElDb25zdHJ1Y3QsIG9wdGlvbnM/OiBHaXRBdHRyaWJ1dGVzRmlsZU9wdGlvbnMpIHtcbiAgICBzdXBlcihzY29wZSwgXCIuZ2l0YXR0cmlidXRlc1wiLCB7XG4gICAgICBlZGl0R2l0aWdub3JlOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIHRoaXMuZW5kT2ZMaW5lID0gb3B0aW9ucz8uZW5kT2ZMaW5lID8/IEVuZE9mTGluZS5MRjtcblxuICAgIGlmICh0aGlzLmVuZE9mTGluZSAhPSBFbmRPZkxpbmUuTk9ORSkge1xuICAgICAgbGV0IGVuZE9mTGluZUF0dHJpYnV0ZXMgPSBbYHRleHQ9YXV0b2BdO1xuXG4gICAgICBpZiAodGhpcy5lbmRPZkxpbmUgIT0gRW5kT2ZMaW5lLkFVVE8pIHtcbiAgICAgICAgZW5kT2ZMaW5lQXR0cmlidXRlcy5wdXNoKGBlb2w9JHt0aGlzLmVuZE9mTGluZX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0dGluZyBhIGRlZmF1bHQgZW5kIG9mIGxpbmUgZm9yIGFsbCB0ZXh0IGZpbGVzIGluIHRoZSByZXBvc2l0b3J5XG4gICAgICAvLyBUaGlzIGxpbmUgc2hvdWxkIGJlIHRoZSBmaXJzdCBvbmUgaW4gb3JkZXIgdG8gdXNlIGl0IGFzIGEgZGVmYXVsdCBmb3IgdGV4dCBmaWxlcyBhbmQgYWxsb3cgZm9yIG92ZXJyaWRpbmcgaW4gbGF0ZXIgbGluZXNcbiAgICAgIHRoaXMuYWRkQXR0cmlidXRlcyhcIipcIiwgLi4uZW5kT2ZMaW5lQXR0cmlidXRlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgYSBzZXQgb2YgYXR0cmlidXRlcyB0byBhIHNldCBvZiBmaWxlcy5cbiAgICogQHBhcmFtIGdsb2IgR2xvYiBwYXR0ZXJuIHRvIG1hdGNoIGZpbGVzIGluIHRoZSByZXBvLlxuICAgKiBAcGFyYW0gYXR0cmlidXRlcyBBdHRyaWJ1dGVzIHRvIGFzc2lnbiB0byB0aGVzZSBmaWxlcy5cbiAgICovXG4gIHB1YmxpYyBhZGRBdHRyaWJ1dGVzKGdsb2I6IHN0cmluZywgLi4uYXR0cmlidXRlczogc3RyaW5nW10pIHtcbiAgICBpZiAoIXRoaXMuYXR0cmlidXRlcy5oYXMoZ2xvYikpIHtcbiAgICAgIHRoaXMuYXR0cmlidXRlcy5zZXQoZ2xvYiwgbmV3IFNldCgpKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXQgPSB0aGlzLmF0dHJpYnV0ZXMuZ2V0KGdsb2IpITtcbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICBzZXQuYWRkKGF0dHJpYnV0ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYXR0cmlidXRlcyBmcm9tIGEgc2V0IG9mIGZpbGVzLlxuICAgKlxuICAgKiBJZiBubyBhdHRyaWJ1dGVzIGFyZSBwcm92aWRlZCwgdGhlIGdsb2IgcGF0dGVybiB3aWxsIGJlIHJlbW92ZWQgY29tcGxldGVseS5cbiAgICpcbiAgICogQHBhcmFtIGdsb2IgR2xvYiBwYXR0ZXJuIHRvIG1vZGlmeS5cbiAgICogQHBhcmFtIGF0dHJpYnV0ZXMgQXR0cmlidXRlcyB0byByZW1vdmUgZnJvbSBtYXRjaGVkIGZpbGVzLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZUF0dHJpYnV0ZXMoZ2xvYjogc3RyaW5nLCAuLi5hdHRyaWJ1dGVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmIChhdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5hdHRyaWJ1dGVzLmRlbGV0ZShnbG9iKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtYXBwaW5nID0gdGhpcy5hdHRyaWJ1dGVzLmdldChnbG9iKTtcbiAgICBpZiAoIW1hcHBpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICBtYXBwaW5nLmRlbGV0ZShhdHRyaWJ1dGUpO1xuICAgIH1cblxuICAgIGlmIChtYXBwaW5nLnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMuYXR0cmlidXRlcy5kZWxldGUoZ2xvYik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhdHRyaWJ1dGVzIG5lY2Vzc2FyeSB0byBtYXJrIHRoZXNlIGZpbGVzIGFzIHN0b3JlZCBpbiBMRlNcbiAgICovXG4gIHB1YmxpYyBhZGRMZnNQYXR0ZXJuKGdsb2I6IHN0cmluZykge1xuICAgIHRoaXMuYWRkQXR0cmlidXRlcyhnbG9iLCBcImZpbHRlcj1sZnNcIiwgXCJkaWZmPWxmc1wiLCBcIm1lcmdlPWxmc1wiLCBcIi10ZXh0XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgZ2l0YXR0cmlidXRlcyBmaWxlIGhhcyBhbnkgTEZTIHBhdHRlcm5zXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc0xmc1BhdHRlcm5zKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuYXR0cmlidXRlcy52YWx1ZXMoKSkuc29tZSgoYXR0cnMpID0+XG4gICAgICBhdHRycy5oYXMoXCJmaWx0ZXI9bGZzXCIpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBwcmVTeW50aGVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMucHJvamVjdC5hZGRQYWNrYWdlSWdub3JlKFwiLy5naXRhdHRyaWJ1dGVzXCIpO1xuXG4gICAgc3VwZXIucHJlU3ludGhlc2l6ZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN5bnRoZXNpemVDb250ZW50KF86IElSZXNvbHZlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gV2UgY2FuIGFzc3VtZSB0aGUgZmlsZSBtYXAgaXMgbmV2ZXIgZW1wdHkuXG4gICAgY29uc3QgZW50cmllcyA9IEFycmF5LmZyb20odGhpcy5hdHRyaWJ1dGVzLmVudHJpZXMoKSkuc29ydCgoW2xdLCBbcl0pID0+XG4gICAgICBsLmxvY2FsZUNvbXBhcmUocilcbiAgICApO1xuXG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBbXG4gICAgICAuLi4odGhpcy5tYXJrZXIgPyBbYCMgJHt0aGlzLm1hcmtlcn1gXSA6IFtdKSxcbiAgICAgIFwiXCIsXG4gICAgICAuLi5lbnRyaWVzLm1hcChcbiAgICAgICAgKFtuYW1lLCBhdHRyaWJ1dGVzXSkgPT4gYCR7bmFtZX0gJHtBcnJheS5mcm9tKGF0dHJpYnV0ZXMpLmpvaW4oXCIgXCIpfWBcbiAgICAgICksXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9XG59XG4iXX0=