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.99.51" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0YXR0cmlidXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9naXRhdHRyaWJ1dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsaUNBQWtDO0FBRWxDOztHQUVHO0FBQ0gsSUFBWSxTQXFCWDtBQXJCRCxXQUFZLFNBQVM7SUFDbkI7OztPQUdHO0lBQ0gsMEJBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gsMEJBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gsc0JBQVMsQ0FBQTtJQUVUOztPQUVHO0lBQ0gsMEJBQWEsQ0FBQTtBQUNmLENBQUMsRUFyQlcsU0FBUyx5QkFBVCxTQUFTLFFBcUJwQjtBQWdCRDs7OztHQUlHO0FBQ0gsTUFBYSxpQkFBa0IsU0FBUSxlQUFRO0lBUTdDLFlBQW1CLEtBQWlCLEVBQUUsT0FBa0M7UUFDdEUsS0FBSyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRTtZQUM3QixhQUFhLEVBQUUsS0FBSztTQUNyQixDQUFDLENBQUM7UUFWWSxlQUFVLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7UUFZM0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLEVBQUUsU0FBUyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFFcEQsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyQyxJQUFJLG1CQUFtQixHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFeEMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDckMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDcEQsQ0FBQztZQUVELHFFQUFxRTtZQUNyRSwySEFBMkg7WUFDM0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFD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QUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUN0RTtTQUNGLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2YsQ0FBQzs7QUEvR0gsOENBZ0hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB0eXBlIHsgSVJlc29sdmVyIH0gZnJvbSBcIi4vZmlsZVwiO1xuaW1wb3J0IHsgRmlsZUJhc2UgfSBmcm9tIFwiLi9maWxlXCI7XG5cbi8qKlxuICogVGhlIGVuZCBvZiBsaW5lIGNoYXJhY3RlcnMgc3VwcG9ydGVkIGJ5IGdpdC5cbiAqL1xuZXhwb3J0IGVudW0gRW5kT2ZMaW5lIHtcbiAgLyoqXG4gICAqIE1haW50YWluIGV4aXN0aW5nIChtaXhlZCB2YWx1ZXMgd2l0aGluIG9uZSBmaWxlIGFyZSBub3JtYWxpc2VkIGJ5IGxvb2tpbmdcbiAgICogYXQgd2hhdCdzIHVzZWQgYWZ0ZXIgdGhlIGZpcnN0IGxpbmUpXG4gICAqL1xuICBBVVRPID0gXCJhdXRvXCIsXG5cbiAgLyoqXG4gICAqIENhcnJpYWdlIFJldHVybiArIExpbmUgRmVlZCBjaGFyYWN0ZXJzIChcXHJcXG4pLCBjb21tb24gb24gV2luZG93c1xuICAgKi9cbiAgQ1JMRiA9IFwiY3JsZlwiLFxuXG4gIC8qKlxuICAgKiBMaW5lIEZlZWQgb25seSAoXFxuKSwgY29tbW9uIG9uIExpbnV4IGFuZCBtYWNPUyBhcyB3ZWxsIGFzIGluc2lkZSBnaXQgcmVwb3NcbiAgICovXG4gIExGID0gXCJsZlwiLFxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIGFuZCBkbyBub3QgY29uZmlndXJlIHRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXJcbiAgICovXG4gIE5PTkUgPSBcIm5vbmVcIixcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBgR2l0QXR0cmlidXRlc0ZpbGVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdpdEF0dHJpYnV0ZXNGaWxlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBlbmQgb2YgbGluZSBjaGFyYWN0ZXIgZm9yIHRleHQgZmlsZXMuXG4gICAqXG4gICAqIGVuZE9mTGluZSBpdCdzIHVzZWZ1bCB0byBrZWVwIHRoZSBzYW1lIGVuZCBvZiBsaW5lIGJldHdlZW4gV2luZG93cyBhbmQgVW5peCBvcGVyYXRpdmUgc3lzdGVtcyBmb3IgZ2l0IGNoZWNraW5nL2NoZWNrb3V0IG9wZXJhdGlvbnMuIEhlbmNlLCBpdCBjYW4gYXZvaWQgc2ltcGxlIHJlcG9zaXRvcnkgbXV0YXRpb25zIGNvbnNpc3Rpbmcgb25seSBvZiBjaGFuZ2VzIGluIHRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXJzLiBJdCB3aWxsIGJlIHNldCBpbiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgLmdpdGF0dHJpYnV0ZXMgZmlsZSB0byBtYWtlIGl0IHRoZSBmaXJzdCBtYXRjaCB3aXRoIGhpZ2ggcHJpb3JpdHkgYnV0IGl0IGNhbiBiZSBvdmVycmlkZW4gaW4gYSBsYXRlciBsaW5lLiBDYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyBleHBsaWNpdGx5OiBgeyBlbmRPZkxpbmU6IEVuZE9mTGluZS5OT05FIH1gLlxuICAgKlxuICAgKiBAZGVmYXVsdCBFbmRPZkxpbmUuTEZcbiAgICovXG4gIHJlYWRvbmx5IGVuZE9mTGluZT86IEVuZE9mTGluZTtcbn1cblxuLyoqXG4gKiBBc3NpZ24gYXR0cmlidXRlcyB0byBmaWxlIG5hbWVzIGluIGEgZ2l0IHJlcG9zaXRvcnkuXG4gKlxuICogQHNlZSBodHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0YXR0cmlidXRlc1xuICovXG5leHBvcnQgY2xhc3MgR2l0QXR0cmlidXRlc0ZpbGUgZXh0ZW5kcyBGaWxlQmFzZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXR0cmlidXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgZW5kIG9mIGxpbmUgY2hhcmFjdGVyIGZvciB0ZXh0IGZpbGVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZE9mTGluZTogRW5kT2ZMaW5lO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogSUNvbnN0cnVjdCwgb3B0aW9ucz86IEdpdEF0dHJpYnV0ZXNGaWxlT3B0aW9ucykge1xuICAgIHN1cGVyKHNjb3BlLCBcIi5naXRhdHRyaWJ1dGVzXCIsIHtcbiAgICAgIGVkaXRHaXRpZ25vcmU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5lbmRPZkxpbmUgPSBvcHRpb25zPy5lbmRPZkxpbmUgPz8gRW5kT2ZMaW5lLkxGO1xuXG4gICAgaWYgKHRoaXMuZW5kT2ZMaW5lICE9IEVuZE9mTGluZS5OT05FKSB7XG4gICAgICBsZXQgZW5kT2ZMaW5lQXR0cmlidXRlcyA9IFtgdGV4dD1hdXRvYF07XG5cbiAgICAgIGlmICh0aGlzLmVuZE9mTGluZSAhPSBFbmRPZkxpbmUuQVVUTykge1xuICAgICAgICBlbmRPZkxpbmVBdHRyaWJ1dGVzLnB1c2goYGVvbD0ke3RoaXMuZW5kT2ZMaW5lfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXR0aW5nIGEgZGVmYXVsdCBlbmQgb2YgbGluZSBmb3IgYWxsIHRleHQgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnlcbiAgICAgIC8vIFRoaXMgbGluZSBzaG91bGQgYmUgdGhlIGZpcnN0IG9uZSBpbiBvcmRlciB0byB1c2UgaXQgYXMgYSBkZWZhdWx0IGZvciB0ZXh0IGZpbGVzIGFuZCBhbGxvdyBmb3Igb3ZlcnJpZGluZyBpbiBsYXRlciBsaW5lc1xuICAgICAgdGhpcy5hZGRBdHRyaWJ1dGVzKFwiKlwiLCAuLi5lbmRPZkxpbmVBdHRyaWJ1dGVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFwcyBhIHNldCBvZiBhdHRyaWJ1dGVzIHRvIGEgc2V0IG9mIGZpbGVzLlxuICAgKiBAcGFyYW0gZ2xvYiBHbG9iIHBhdHRlcm4gdG8gbWF0Y2ggZmlsZXMgaW4gdGhlIHJlcG8uXG4gICAqIEBwYXJhbSBhdHRyaWJ1dGVzIEF0dHJpYnV0ZXMgdG8gYXNzaWduIHRvIHRoZXNlIGZpbGVzLlxuICAgKi9cbiAgcHVibGljIGFkZEF0dHJpYnV0ZXMoZ2xvYjogc3RyaW5nLCAuLi5hdHRyaWJ1dGVzOiBzdHJpbmdbXSkge1xuICAgIGlmICghdGhpcy5hdHRyaWJ1dGVzLmhhcyhnbG9iKSkge1xuICAgICAgdGhpcy5hdHRyaWJ1dGVzLnNldChnbG9iLCBuZXcgU2V0KCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHNldCA9IHRoaXMuYXR0cmlidXRlcy5nZXQoZ2xvYikhO1xuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIHNldC5hZGQoYXR0cmlidXRlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhdHRyaWJ1dGVzIGZyb20gYSBzZXQgb2YgZmlsZXMuXG4gICAqXG4gICAqIElmIG5vIGF0dHJpYnV0ZXMgYXJlIHByb3ZpZGVkLCB0aGUgZ2xvYiBwYXR0ZXJuIHdpbGwgYmUgcmVtb3ZlZCBjb21wbGV0ZWx5LlxuICAgKlxuICAgKiBAcGFyYW0gZ2xvYiBHbG9iIHBhdHRlcm4gdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0gYXR0cmlidXRlcyBBdHRyaWJ1dGVzIHRvIHJlbW92ZSBmcm9tIG1hdGNoZWQgZmlsZXMuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlQXR0cmlidXRlcyhnbG9iOiBzdHJpbmcsIC4uLmF0dHJpYnV0ZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKGF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmF0dHJpYnV0ZXMuZGVsZXRlKGdsb2IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1hcHBpbmcgPSB0aGlzLmF0dHJpYnV0ZXMuZ2V0KGdsb2IpO1xuICAgIGlmICghbWFwcGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIG1hcHBpbmcuZGVsZXRlKGF0dHJpYnV0ZSk7XG4gICAgfVxuXG4gICAgaWYgKG1hcHBpbmcuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5hdHRyaWJ1dGVzLmRlbGV0ZShnbG9iKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGF0dHJpYnV0ZXMgbmVjZXNzYXJ5IHRvIG1hcmsgdGhlc2UgZmlsZXMgYXMgc3RvcmVkIGluIExGU1xuICAgKi9cbiAgcHVibGljIGFkZExmc1BhdHRlcm4oZ2xvYjogc3RyaW5nKSB7XG4gICAgdGhpcy5hZGRBdHRyaWJ1dGVzKGdsb2IsIFwiZmlsdGVyPWxmc1wiLCBcImRpZmY9bGZzXCIsIFwibWVyZ2U9bGZzXCIsIFwiLXRleHRcIik7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY3VycmVudCBnaXRhdHRyaWJ1dGVzIGZpbGUgaGFzIGFueSBMRlMgcGF0dGVybnNcbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzTGZzUGF0dGVybnMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5hdHRyaWJ1dGVzLnZhbHVlcygpKS5zb21lKChhdHRycykgPT5cbiAgICAgIGF0dHJzLmhhcyhcImZpbHRlcj1sZnNcIiksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBwcmVTeW50aGVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMucHJvamVjdC5hZGRQYWNrYWdlSWdub3JlKFwiLy5naXRhdHRyaWJ1dGVzXCIpO1xuXG4gICAgc3VwZXIucHJlU3ludGhlc2l6ZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN5bnRoZXNpemVDb250ZW50KF86IElSZXNvbHZlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gV2UgY2FuIGFzc3VtZSB0aGUgZmlsZSBtYXAgaXMgbmV2ZXIgZW1wdHkuXG4gICAgY29uc3QgZW50cmllcyA9IEFycmF5LmZyb20odGhpcy5hdHRyaWJ1dGVzLmVudHJpZXMoKSkuc29ydCgoW2xdLCBbcl0pID0+XG4gICAgICBsLmxvY2FsZUNvbXBhcmUociksXG4gICAgKTtcblxuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gW1xuICAgICAgLi4uKHRoaXMubWFya2VyID8gW2AjICR7dGhpcy5tYXJrZXJ9YF0gOiBbXSksXG4gICAgICBcIlwiLFxuICAgICAgLi4uZW50cmllcy5tYXAoXG4gICAgICAgIChbbmFtZSwgYXR0cmlidXRlc10pID0+IGAke25hbWV9ICR7QXJyYXkuZnJvbShhdHRyaWJ1dGVzKS5qb2luKFwiIFwiKX1gLFxuICAgICAgKSxcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gIH1cbn1cbiJdfQ==