@dolthub/proto-resource-utils 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cjs/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";class e extends Error{}const a=e=>e&&e[0].toLocaleUpperCase()+e.slice(1);class r extends Error{}const t="[-a-zA-Z0-9_]{3,32}",n="[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*",o=`(${n}|${t})`,i=[":","~"," ","\t","[\0-]","","^\\.","/\\.","\\.lock$","\\.lock/","^$","^-$","\\.\\.","@{","//","^/","/$"].join("|"),s=e=>`^(?!.*(${e}))`,l=s(["\\?","\\^","\\[","\\\\","\\*",i].join("|")),c=s(i);var d=Object.freeze({__proto__:null,validBackupIdPattern:"[0-9]{8}T[0-9]{6}.[0-9]{3}",validBranchNamePattern:l,validBranchProtectionNamePattern:c,validClientCredentialIdPattern:"[0-9a-v]{45}",validEmailOrResourcePattern:o,validEmailPattern:n,validLongResourcePattern:"[-a-zA-Z0-9_]{3,36}",validNumberPattern:"[1-9][0-9]*",validResourceSegmentPattern:t,validUuidPattern:"[a-f0-9-]{36}"});exports.ResourceNameValidationError=e,exports.ResourceParamValidationError=r,exports.byHash=function(e,a){const r=e.name.split("/").at(-1),t=a.name.split("/").at(-1);if(!r)throw new Error(`Malformatted name: ${e.name}`);if(!t)throw new Error(`Malformatted name: ${a.name}`);if(r===t)return 0;if(r<t)return-1;if(r>t)return 1;throw new Error(`Unable to compare: ${e.name} ${a.name}`)},exports.byName=function(e,a){const r=e.name.split("/").at(-1),t=a.name.split("/").at(-1);if(!r)throw new Error(`Malformatted name: ${e.name}`);if(!t)throw new Error(`Malformatted name: ${a.name}`);return r.localeCompare(t)},exports.byResourceName=function(e,a){return e.name.localeCompare(a.name)},exports.comparatorsToSorters=function(e){return Object.fromEntries(Object.entries(e).map((([e,a])=>{return[e,(r=a,(e,a)=>e.sort(a?function(e){return(a,r)=>e(r,a)}(r):r))];var r})))},exports.displayName=function(e){if("getDisplayName"in e&&e.getDisplayName){const a=e.getDisplayName();if(a)return a}if("displayName"in e&&e.displayName)return e.displayName;const a="getName"in e?e.getName():e.name,r=a.split("/").at(-1);return null!=r?r:a},exports.doNameValidation=function(a,r,t,n){const o=(e=>Object.assign({throwValidationError:!0,validate:!0},e))(n);if(o.validate&&!t.validate(a)){const t=`${r} resource name failed validation: ${a}`;if(o.throwValidationError)throw new e(t);console.log(t)}},exports.doParamValidation=function(e,t,n,o){const i=(e=>Object.assign({throwValidationError:!0,validate:!0},e))(o);if(!i.validate)return;Object.entries(e).forEach((([e,o])=>{if(n(e)(o))return;const s="production"===process.env.NODE_ENV?function(e,r){switch(e){case"emailAddress":return"Invalid email address.";case"branchName":return"Invalid branch name. Please refer to the help docs for branch name rules.";case"credentialId":return"CredentialID can only contain lowercase letters and numbers, and can be no longer than 45 characters.";default:return`${a(r.split(/(?=[A-Z])/).join(" ").toLowerCase())} name can only contain underscores, dashes, and letters, and must be 3-32 characters.`}}(e,t):`${t} param ${e} failed validation: ${o}`;if(i.throwValidationError)throw new r(s);console.log(s)}))},exports.validResourceSegmentPattern=d;
1
+ "use strict";const t=["t","☃️","user/in-progress/do-some-things","user/in-progress/{}","user/{/a.tt/}"],e=["","this-is-a-@{-test","this-is-a- -test","this-is-a-\t-test","this-is-a-//-test","this-is-a-:-test","this-is-a-~-test","this-is-a-\0-test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a-\b-test","this-is-a-\t-test","this-is-a-\n-test","this-is-a-\v-test","this-is-a-\f-test","this-is-a-\r-test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a-\n-test","user/working/.tt",".user/working/a.tt","user/working/","/user/working/","user/working/mybranch.lock","mybranch.lock","user.lock/working/mybranch","-"],s=[...e,"this-is-a-..-test","this-is-a-?-test","this-is-a-[-test","this-is-a-\\-test","this-is-a-^-test","this-is-a-*-test"];class a extends Error{}const i=t=>t&&t[0].toLocaleUpperCase()+t.slice(1);class r extends Error{}const n="[-a-zA-Z0-9_]{3,32}",o="[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*",l=`(${o}|${n})`,c=[":","~"," ","\t","[\0-]","","^\\.","/\\.","\\.lock$","\\.lock/","^$","^-$","\\.\\.","@{","//","^/","/$"].join("|"),h=t=>`^(?!.*(${t}))`,d=h(["\\?","\\^","\\[","\\\\","\\*",c].join("|")),m=h(c);var u=Object.freeze({__proto__:null,validBackupIdPattern:"[0-9]{8}T[0-9]{6}.[0-9]{3}",validBranchNamePattern:d,validBranchProtectionNamePattern:m,validClientCredentialIdPattern:"[0-9a-v]{45}",validEmailOrResourcePattern:l,validEmailPattern:o,validLongResourcePattern:"[-a-zA-Z0-9_]{3,36}",validNumberPattern:"[1-9][0-9]*",validResourceSegmentPattern:n,validUuidPattern:"[a-f0-9-]{36}"});exports.ResourceNameValidationError=a,exports.ResourceParamValidationError=r,exports.byHash=function(t,e){const s=t.name.split("/").at(-1),a=e.name.split("/").at(-1);if(!s)throw new Error(`Malformatted name: ${t.name}`);if(!a)throw new Error(`Malformatted name: ${e.name}`);if(s===a)return 0;if(s<a)return-1;if(s>a)return 1;throw new Error(`Unable to compare: ${t.name} ${e.name}`)},exports.byName=function(t,e){const s=t.name.split("/").at(-1),a=e.name.split("/").at(-1);if(!s)throw new Error(`Malformatted name: ${t.name}`);if(!a)throw new Error(`Malformatted name: ${e.name}`);return s.localeCompare(a)},exports.byResourceName=function(t,e){return t.name.localeCompare(e.name)},exports.comparatorsToSorters=function(t){return Object.fromEntries(Object.entries(t).map((([t,e])=>{return[t,(s=e,(t,e)=>t.sort(e?function(t){return(e,s)=>t(s,e)}(s):s))];var s})))},exports.displayName=function(t){if("getDisplayName"in t&&t.getDisplayName){const e=t.getDisplayName();if(e)return e}if("displayName"in t&&t.displayName)return t.displayName;const e="getName"in t?t.getName():t.name,s=e.split("/").at(-1);return null!=s?s:e},exports.doNameValidation=function(t,e,s,i){const r=(t=>Object.assign({throwValidationError:!0,validate:!0},t))(i);if(r.validate&&!s.validate(t)){const s=`${e} resource name failed validation: ${t}`;if(r.throwValidationError)throw new a(s);console.log(s)}},exports.doParamValidation=function(t,e,s,a){const n=(t=>Object.assign({throwValidationError:!0,validate:!0},t))(a);if(!n.validate)return;Object.entries(t).forEach((([t,a])=>{if(s(t)(a))return;const o="production"===process.env.NODE_ENV?function(t,e){switch(t){case"emailAddress":return"Invalid email address.";case"branchName":return"Invalid branch name. Please refer to the help docs for branch name rules.";case"credentialId":return"CredentialID can only contain lowercase letters and numbers, and can be no longer than 45 characters.";default:return`${i(e.split(/(?=[A-Z])/).join(" ").toLowerCase())} name can only contain underscores, dashes, and letters, and must be 3-32 characters.`}}(t,e):`${e} param ${t} failed validation: ${a}`;if(n.throwValidationError)throw new r(o);console.log(o)}))},exports.invalidBranchNames=s,exports.invalidBranchProtectionNames=e,exports.validBranchNames=t,exports.validResourceSegmentPattern=u;
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/doNameValidation.ts","../../src/doParamValidation.ts","../../src/validResourceSegmentPattern.ts","../../src/byHash.ts","../../src/byName.ts","../../src/byResourceName.ts","../../src/comparatorsToSorters.ts","../../src/displayName.ts","../../src/resourceNames.ts"],"sourcesContent":["import { getFromResourceOptions } from \"./resourceNames\";\nimport {\n FromResourceOptions,\n ResourceNameConverter,\n} from \"./ResourceNamesUtils\";\n\nexport default function doNameValidation<T>(\n resourceName: string,\n resourceTypeName: string,\n converter: ResourceNameConverter<T>,\n o?: Partial<FromResourceOptions>,\n) {\n const opts = getFromResourceOptions(o);\n if (opts.validate && !converter.validate(resourceName)) {\n const msg = `${resourceTypeName} resource name failed validation: ${resourceName}`;\n if (opts.throwValidationError) {\n throw new ResourceNameValidationError(msg);\n } else {\n console.log(msg);\n }\n }\n}\n\nexport class ResourceNameValidationError extends Error {}\n","import { ToResourceOptions } from \"./ResourceNamesUtils\";\nimport { getToResourceOptions } from \"./resourceNames\";\n\nconst initialUppercase = (str: string) =>\n str && str[0].toLocaleUpperCase() + str.slice(1);\n\nexport default function doParamValidation(\n obj: {\n [paramName: string]: string;\n },\n resourceTypeName: string,\n getValidator: (paramName: string) => (value: string) => boolean,\n o?: Partial<ToResourceOptions>,\n) {\n const opts = getToResourceOptions(o);\n if (!opts.validate) {\n return;\n }\n const entries = Object.entries(obj);\n\n entries.forEach(([paramName, value]) => {\n const isValid = getValidator(paramName)(value);\n if (isValid) {\n return;\n }\n\n const msg =\n process.env.NODE_ENV === \"production\"\n ? getProdError(paramName, resourceTypeName)\n : `${resourceTypeName} param ${paramName} failed validation: ${value}`;\n\n if (opts.throwValidationError) {\n throw new ResourceParamValidationError(msg);\n } else {\n console.log(msg);\n }\n });\n}\n\nexport class ResourceParamValidationError extends Error {}\n\nexport function getProdError(paramName: string, resourceTypeName: string) {\n switch (paramName) {\n case \"emailAddress\":\n return \"Invalid email address.\";\n case \"branchName\":\n return \"Invalid branch name. Please refer to the help docs for branch name rules.\";\n case \"credentialId\":\n return \"CredentialID can only contain lowercase letters and numbers, and can be no longer than 45 characters.\";\n default: {\n const friendlyTypeName = initialUppercase(\n resourceTypeName\n .split(/(?=[A-Z])/)\n .join(\" \")\n .toLowerCase(),\n );\n return `${friendlyTypeName} name can only contain underscores, dashes, and letters, and must be 3-32 characters.`;\n }\n }\n}\n","const validResourceSegmentPattern = \"[-a-zA-Z0-9_]{3,32}\";\nconst validClientCredentialIdPattern = \"[0-9a-v]{45}\";\nconst validEmailPattern =\n \"[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\\\.[a-zA-Z0-9-]+)*\";\nconst validEmailOrResourcePattern = `(${validEmailPattern}|${validResourceSegmentPattern})`;\nconst validNumberPattern = \"[1-9][0-9]*\";\nconst validLongResourcePattern = \"[-a-zA-Z0-9_]{3,36}\";\nconst validUuidPattern = \"[a-f0-9-]{36}\";\nconst validBackupIdPattern = \"[0-9]{8}T[0-9]{6}.[0-9]{3}\";\n\n// Removed ?,^, [, \\, * from invalidBranchNamePattern as they are allowed in fnmatch\nconst invalidBranchProtectionNamePattern = [\n `:`,\n `~`,\n ` `,\n `\\t`,\n `[\\x00-\\x1f]`,\n `\\x7f`,\n `^\\\\.`,\n `/\\\\.`,\n `\\\\.lock$`,\n `\\\\.lock/`,\n `^$`,\n `^-$`,\n `\\\\.\\\\.`,\n `@{`,\n `//`,\n `^/`,\n `/$`,\n].join(\"|\");\n\nconst invalidBranchNamePattern = [\n `\\\\?`,\n `\\\\^`,\n `\\\\[`,\n `\\\\\\\\`,\n `\\\\*`,\n invalidBranchProtectionNamePattern,\n].join(\"|\");\n\nconst invertRegexPattern = (p: string) => `^(?!.*(${p}))`;\nconst validBranchNamePattern = invertRegexPattern(invalidBranchNamePattern);\nconst validBranchProtectionNamePattern = invertRegexPattern(\n invalidBranchProtectionNamePattern,\n);\n\nexport {\n validBackupIdPattern,\n validBranchNamePattern,\n validClientCredentialIdPattern,\n validEmailOrResourcePattern,\n validEmailPattern,\n validLongResourcePattern,\n validNumberPattern,\n validResourceSegmentPattern,\n validUuidPattern,\n validBranchProtectionNamePattern,\n};\n","type NamedResource = {\n name: string;\n};\n\nexport default function byHash(o1: NamedResource, o2: NamedResource): number {\n const o1LastParam = o1.name.split(\"/\").at(-1);\n const o2LastParam = o2.name.split(\"/\").at(-1);\n\n if (!o1LastParam) {\n throw new Error(`Malformatted name: ${o1.name}`);\n }\n\n if (!o2LastParam) {\n throw new Error(`Malformatted name: ${o2.name}`);\n }\n\n if (o1LastParam === o2LastParam) {\n return 0;\n }\n if (o1LastParam < o2LastParam) {\n return -1;\n }\n if (o1LastParam > o2LastParam) {\n return 1;\n }\n throw new Error(`Unable to compare: ${o1.name} ${o2.name}`);\n}\n","type NamedResource = {\n name: string;\n};\n\nexport default function byName(o1: NamedResource, o2: NamedResource): number {\n const o1LastParam = o1.name.split(\"/\").at(-1);\n const o2LastParam = o2.name.split(\"/\").at(-1);\n\n if (!o1LastParam) {\n throw new Error(`Malformatted name: ${o1.name}`);\n }\n\n if (!o2LastParam) {\n throw new Error(`Malformatted name: ${o2.name}`);\n }\n\n return o1LastParam.localeCompare(o2LastParam);\n}\n","type NamedResource = {\n name: string;\n};\n\nexport default function byResourceName(\n o1: NamedResource,\n o2: NamedResource,\n): number {\n return o1.name.localeCompare(o2.name);\n}\n","import {\n Comparator,\n Comparators,\n NamedResource,\n Sorter,\n Sorters,\n} from \"./ResourceUtils\";\n\nexport default function comparatorsToSorters<T extends NamedResource>(\n cmps: Comparators<T>,\n): Sorters<T> {\n return Object.fromEntries(\n Object.entries(cmps).map(([k, v]) => [k, comparatorToSorter(v)]),\n ) as Sorters<T>;\n}\n\nexport function comparatorToSorter<T extends NamedResource>(\n cmpFn: Comparator<T>,\n): Sorter<T> {\n return (ts: T[], desc?: boolean) => ts.sort(desc ? reverse(cmpFn) : cmpFn);\n}\n\nexport function reverse<T extends NamedResource>(cmpFn: Comparator<T>) {\n return (t1: T, t2: T) => cmpFn(t2, t1);\n}\n","import { NamedObjectable, NamedResource } from \"./ResourceUtils\";\n\nexport default function displayName<O extends NamedObjectable<NamedResource>>(\n r: O | NamedResource,\n): string {\n if (\"getDisplayName\" in r && r.getDisplayName) {\n const dn = r.getDisplayName();\n if (dn) {\n return dn;\n }\n }\n\n if (\"displayName\" in r && r.displayName) {\n return r.displayName;\n }\n\n const name = \"getName\" in r ? r.getName() : r.name;\n const shortName = name.split(\"/\").at(-1);\n\n return shortName ?? name;\n}\n","import { FromResourceOptions, ToResourceOptions } from \"./ResourceNamesUtils\";\n\n// For now, the from and to options are the same, but I can easily imagine a world\n// where they're not in the future, so let's keep them separately named.\nconst defaultFromResourceOptions = (): FromResourceOptions => {\n return {\n throwValidationError: true,\n validate: true,\n };\n};\nexport const getFromResourceOptions = (\n o?: Partial<FromResourceOptions>,\n): FromResourceOptions => Object.assign(defaultFromResourceOptions(), o);\n\nconst defaultToResourceOptions = (): ToResourceOptions => {\n return {\n throwValidationError: true,\n validate: true,\n };\n};\nexport const getToResourceOptions = (\n o?: Partial<ToResourceOptions>,\n): FromResourceOptions => Object.assign(defaultToResourceOptions(), o);\n"],"names":["ResourceNameValidationError","Error","initialUppercase","str","toLocaleUpperCase","slice","ResourceParamValidationError","validResourceSegmentPattern","validEmailPattern","validEmailOrResourcePattern","invalidBranchProtectionNamePattern","join","invertRegexPattern","p","validBranchNamePattern","validBranchProtectionNamePattern","o1","o2","o1LastParam","name","split","at","o2LastParam","localeCompare","cmps","Object","fromEntries","entries","map","k","v","cmpFn","ts","desc","sort","t1","t2","reverse","r","getDisplayName","dn","displayName","getName","shortName","resourceName","resourceTypeName","converter","o","opts","assign","throwValidationError","validate","getFromResourceOptions","msg","console","log","obj","getValidator","getToResourceOptions","forEach","paramName","value","process","env","NODE_ENV","toLowerCase","getProdError"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/__tests__/helpers/branchNames.ts","../../src/doNameValidation.ts","../../src/doParamValidation.ts","../../src/validResourceSegmentPattern.ts","../../src/byHash.ts","../../src/byName.ts","../../src/byResourceName.ts","../../src/comparatorsToSorters.ts","../../src/displayName.ts","../../src/resourceNames.ts"],"sourcesContent":["export const validBranchNames = [\n \"t\",\n \"☃️\",\n \"user/in-progress/do-some-things\",\n \"user/in-progress/{}\",\n \"user/{/a.tt/}\",\n];\n\nexport const invalidBranchProtectionNames = [\n \"\",\n \"this-is-a-@{-test\",\n \"this-is-a- -test\",\n \"this-is-a-\\t-test\",\n \"this-is-a-//-test\",\n \"this-is-a-:-test\",\n \"this-is-a-~-test\",\n \"this-is-a-\\x00-test\",\n \"this-is-a-\\x01-test\",\n \"this-is-a-\\x02-test\",\n \"this-is-a-\\x03-test\",\n \"this-is-a-\\x04-test\",\n \"this-is-a-\\x05-test\",\n \"this-is-a-\\x06-test\",\n \"this-is-a-\\x07-test\",\n \"this-is-a-\\x08-test\",\n \"this-is-a-\\x09-test\",\n \"this-is-a-\\x0a-test\",\n \"this-is-a-\\x0b-test\",\n \"this-is-a-\\x0c-test\",\n \"this-is-a-\\x0d-test\",\n \"this-is-a-\\x0e-test\",\n \"this-is-a-\\x0f-test\",\n \"this-is-a-\\x10-test\",\n \"this-is-a-\\x11-test\",\n \"this-is-a-\\x12-test\",\n \"this-is-a-\\x13-test\",\n \"this-is-a-\\x14-test\",\n \"this-is-a-\\x15-test\",\n \"this-is-a-\\x16-test\",\n \"this-is-a-\\x17-test\",\n \"this-is-a-\\x18-test\",\n \"this-is-a-\\x19-test\",\n \"this-is-a-\\x1a-test\",\n \"this-is-a-\\x1b-test\",\n \"this-is-a-\\x1c-test\",\n \"this-is-a-\\x1d-test\",\n \"this-is-a-\\x1e-test\",\n \"this-is-a-\\x1f-test\",\n \"this-is-a-\\x7f-test\",\n \"this-is-a-\\n-test\",\n \"user/working/.tt\",\n \".user/working/a.tt\",\n \"user/working/\",\n \"/user/working/\",\n \"user/working/mybranch.lock\",\n \"mybranch.lock\",\n \"user.lock/working/mybranch\",\n \"-\",\n];\n\nexport const invalidBranchNames = [\n ...invalidBranchProtectionNames,\n \"this-is-a-..-test\",\n \"this-is-a-?-test\",\n \"this-is-a-[-test\",\n \"this-is-a-\\\\-test\",\n \"this-is-a-^-test\",\n \"this-is-a-*-test\",\n];\n\nexport const validBranchProtectionNames = [\n ...validBranchNames,\n \"foo*\",\n \"qa/**/*\",\n \"c{at,ub}s\",\n \"c?t\",\n \"c??t\",\n \"c*\",\n \"c*t\",\n \"ca[a-z]\",\n \"ca[^t]\",\n \"?\",\n \"*\",\n \"[\\\\?]\",\n];\n","import { getFromResourceOptions } from \"./resourceNames\";\nimport {\n FromResourceOptions,\n ResourceNameConverter,\n} from \"./ResourceNamesUtils\";\n\nexport default function doNameValidation<T>(\n resourceName: string,\n resourceTypeName: string,\n converter: ResourceNameConverter<T>,\n o?: Partial<FromResourceOptions>,\n) {\n const opts = getFromResourceOptions(o);\n if (opts.validate && !converter.validate(resourceName)) {\n const msg = `${resourceTypeName} resource name failed validation: ${resourceName}`;\n if (opts.throwValidationError) {\n throw new ResourceNameValidationError(msg);\n } else {\n console.log(msg);\n }\n }\n}\n\nexport class ResourceNameValidationError extends Error {}\n","import { ToResourceOptions } from \"./ResourceNamesUtils\";\nimport { getToResourceOptions } from \"./resourceNames\";\n\nconst initialUppercase = (str: string) =>\n str && str[0].toLocaleUpperCase() + str.slice(1);\n\nexport default function doParamValidation(\n obj: {\n [paramName: string]: string;\n },\n resourceTypeName: string,\n getValidator: (paramName: string) => (value: string) => boolean,\n o?: Partial<ToResourceOptions>,\n) {\n const opts = getToResourceOptions(o);\n if (!opts.validate) {\n return;\n }\n const entries = Object.entries(obj);\n\n entries.forEach(([paramName, value]) => {\n const isValid = getValidator(paramName)(value);\n if (isValid) {\n return;\n }\n\n const msg =\n process.env.NODE_ENV === \"production\"\n ? getProdError(paramName, resourceTypeName)\n : `${resourceTypeName} param ${paramName} failed validation: ${value}`;\n\n if (opts.throwValidationError) {\n throw new ResourceParamValidationError(msg);\n } else {\n console.log(msg);\n }\n });\n}\n\nexport class ResourceParamValidationError extends Error {}\n\nexport function getProdError(paramName: string, resourceTypeName: string) {\n switch (paramName) {\n case \"emailAddress\":\n return \"Invalid email address.\";\n case \"branchName\":\n return \"Invalid branch name. Please refer to the help docs for branch name rules.\";\n case \"credentialId\":\n return \"CredentialID can only contain lowercase letters and numbers, and can be no longer than 45 characters.\";\n default: {\n const friendlyTypeName = initialUppercase(\n resourceTypeName\n .split(/(?=[A-Z])/)\n .join(\" \")\n .toLowerCase(),\n );\n return `${friendlyTypeName} name can only contain underscores, dashes, and letters, and must be 3-32 characters.`;\n }\n }\n}\n","const validResourceSegmentPattern = \"[-a-zA-Z0-9_]{3,32}\";\nconst validClientCredentialIdPattern = \"[0-9a-v]{45}\";\nconst validEmailPattern =\n \"[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\\\.[a-zA-Z0-9-]+)*\";\nconst validEmailOrResourcePattern = `(${validEmailPattern}|${validResourceSegmentPattern})`;\nconst validNumberPattern = \"[1-9][0-9]*\";\nconst validLongResourcePattern = \"[-a-zA-Z0-9_]{3,36}\";\nconst validUuidPattern = \"[a-f0-9-]{36}\";\nconst validBackupIdPattern = \"[0-9]{8}T[0-9]{6}.[0-9]{3}\";\n\n// Removed ?,^, [, \\, * from invalidBranchNamePattern as they are allowed in fnmatch\nconst invalidBranchProtectionNamePattern = [\n `:`,\n `~`,\n ` `,\n `\\t`,\n `[\\x00-\\x1f]`,\n `\\x7f`,\n `^\\\\.`,\n `/\\\\.`,\n `\\\\.lock$`,\n `\\\\.lock/`,\n `^$`,\n `^-$`,\n `\\\\.\\\\.`,\n `@{`,\n `//`,\n `^/`,\n `/$`,\n].join(\"|\");\n\nconst invalidBranchNamePattern = [\n `\\\\?`,\n `\\\\^`,\n `\\\\[`,\n `\\\\\\\\`,\n `\\\\*`,\n invalidBranchProtectionNamePattern,\n].join(\"|\");\n\nconst invertRegexPattern = (p: string) => `^(?!.*(${p}))`;\nconst validBranchNamePattern = invertRegexPattern(invalidBranchNamePattern);\nconst validBranchProtectionNamePattern = invertRegexPattern(\n invalidBranchProtectionNamePattern,\n);\n\nexport {\n validBackupIdPattern,\n validBranchNamePattern,\n validClientCredentialIdPattern,\n validEmailOrResourcePattern,\n validEmailPattern,\n validLongResourcePattern,\n validNumberPattern,\n validResourceSegmentPattern,\n validUuidPattern,\n validBranchProtectionNamePattern,\n};\n","type NamedResource = {\n name: string;\n};\n\nexport default function byHash(o1: NamedResource, o2: NamedResource): number {\n const o1LastParam = o1.name.split(\"/\").at(-1);\n const o2LastParam = o2.name.split(\"/\").at(-1);\n\n if (!o1LastParam) {\n throw new Error(`Malformatted name: ${o1.name}`);\n }\n\n if (!o2LastParam) {\n throw new Error(`Malformatted name: ${o2.name}`);\n }\n\n if (o1LastParam === o2LastParam) {\n return 0;\n }\n if (o1LastParam < o2LastParam) {\n return -1;\n }\n if (o1LastParam > o2LastParam) {\n return 1;\n }\n throw new Error(`Unable to compare: ${o1.name} ${o2.name}`);\n}\n","type NamedResource = {\n name: string;\n};\n\nexport default function byName(o1: NamedResource, o2: NamedResource): number {\n const o1LastParam = o1.name.split(\"/\").at(-1);\n const o2LastParam = o2.name.split(\"/\").at(-1);\n\n if (!o1LastParam) {\n throw new Error(`Malformatted name: ${o1.name}`);\n }\n\n if (!o2LastParam) {\n throw new Error(`Malformatted name: ${o2.name}`);\n }\n\n return o1LastParam.localeCompare(o2LastParam);\n}\n","type NamedResource = {\n name: string;\n};\n\nexport default function byResourceName(\n o1: NamedResource,\n o2: NamedResource,\n): number {\n return o1.name.localeCompare(o2.name);\n}\n","import {\n Comparator,\n Comparators,\n NamedResource,\n Sorter,\n Sorters,\n} from \"./ResourceUtils\";\n\nexport default function comparatorsToSorters<T extends NamedResource>(\n cmps: Comparators<T>,\n): Sorters<T> {\n return Object.fromEntries(\n Object.entries(cmps).map(([k, v]) => [k, comparatorToSorter(v)]),\n ) as Sorters<T>;\n}\n\nexport function comparatorToSorter<T extends NamedResource>(\n cmpFn: Comparator<T>,\n): Sorter<T> {\n return (ts: T[], desc?: boolean) => ts.sort(desc ? reverse(cmpFn) : cmpFn);\n}\n\nexport function reverse<T extends NamedResource>(cmpFn: Comparator<T>) {\n return (t1: T, t2: T) => cmpFn(t2, t1);\n}\n","import { NamedObjectable, NamedResource } from \"./ResourceUtils\";\n\nexport default function displayName<O extends NamedObjectable<NamedResource>>(\n r: O | NamedResource,\n): string {\n if (\"getDisplayName\" in r && r.getDisplayName) {\n const dn = r.getDisplayName();\n if (dn) {\n return dn;\n }\n }\n\n if (\"displayName\" in r && r.displayName) {\n return r.displayName;\n }\n\n const name = \"getName\" in r ? r.getName() : r.name;\n const shortName = name.split(\"/\").at(-1);\n\n return shortName ?? name;\n}\n","import { FromResourceOptions, ToResourceOptions } from \"./ResourceNamesUtils\";\n\n// For now, the from and to options are the same, but I can easily imagine a world\n// where they're not in the future, so let's keep them separately named.\nconst defaultFromResourceOptions = (): FromResourceOptions => {\n return {\n throwValidationError: true,\n validate: true,\n };\n};\nexport const getFromResourceOptions = (\n o?: Partial<FromResourceOptions>,\n): FromResourceOptions => Object.assign(defaultFromResourceOptions(), o);\n\nconst defaultToResourceOptions = (): ToResourceOptions => {\n return {\n throwValidationError: true,\n validate: true,\n };\n};\nexport const getToResourceOptions = (\n o?: Partial<ToResourceOptions>,\n): FromResourceOptions => Object.assign(defaultToResourceOptions(), o);\n"],"names":["validBranchNames","invalidBranchProtectionNames","invalidBranchNames","ResourceNameValidationError","Error","initialUppercase","str","toLocaleUpperCase","slice","ResourceParamValidationError","validResourceSegmentPattern","validEmailPattern","validEmailOrResourcePattern","invalidBranchProtectionNamePattern","join","invertRegexPattern","p","validBranchNamePattern","validBranchProtectionNamePattern","o1","o2","o1LastParam","name","split","at","o2LastParam","localeCompare","cmps","Object","fromEntries","entries","map","k","v","cmpFn","ts","desc","sort","t1","t2","reverse","r","getDisplayName","dn","displayName","getName","shortName","resourceName","resourceTypeName","converter","o","opts","assign","throwValidationError","validate","getFromResourceOptions","msg","console","log","obj","getValidator","getToResourceOptions","forEach","paramName","value","process","env","NODE_ENV","toLowerCase","getProdError"],"mappings":"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"}
package/dist/esm/index.js CHANGED
@@ -1,2 +1,2 @@
1
- function e(e,a){const r=e.name.split("/").at(-1),t=a.name.split("/").at(-1);if(!r)throw new Error(`Malformatted name: ${e.name}`);if(!t)throw new Error(`Malformatted name: ${a.name}`);if(r===t)return 0;if(r<t)return-1;if(r>t)return 1;throw new Error(`Unable to compare: ${e.name} ${a.name}`)}function a(e,a){const r=e.name.split("/").at(-1),t=a.name.split("/").at(-1);if(!r)throw new Error(`Malformatted name: ${e.name}`);if(!t)throw new Error(`Malformatted name: ${a.name}`);return r.localeCompare(t)}function r(e,a){return e.name.localeCompare(a.name)}function t(e){return Object.fromEntries(Object.entries(e).map((([e,a])=>{return[e,(r=a,(e,a)=>e.sort(a?function(e){return(a,r)=>e(r,a)}(r):r))];var r})))}function n(e){if("getDisplayName"in e&&e.getDisplayName){const a=e.getDisplayName();if(a)return a}if("displayName"in e&&e.displayName)return e.displayName;const a="getName"in e?e.getName():e.name,r=a.split("/").at(-1);return null!=r?r:a}function o(e,a,r,t){const n=(e=>Object.assign({throwValidationError:!0,validate:!0},e))(t);if(n.validate&&!r.validate(e)){const r=`${a} resource name failed validation: ${e}`;if(n.throwValidationError)throw new i(r);console.log(r)}}class i extends Error{}const l=e=>e&&e[0].toLocaleUpperCase()+e.slice(1);function s(e,a,r,t){const n=(e=>Object.assign({throwValidationError:!0,validate:!0},e))(t);if(!n.validate)return;Object.entries(e).forEach((([e,t])=>{if(r(e)(t))return;const o="production"===process.env.NODE_ENV?function(e,a){switch(e){case"emailAddress":return"Invalid email address.";case"branchName":return"Invalid branch name. Please refer to the help docs for branch name rules.";case"credentialId":return"CredentialID can only contain lowercase letters and numbers, and can be no longer than 45 characters.";default:return`${l(a.split(/(?=[A-Z])/).join(" ").toLowerCase())} name can only contain underscores, dashes, and letters, and must be 3-32 characters.`}}(e,a):`${a} param ${e} failed validation: ${t}`;if(n.throwValidationError)throw new c(o);console.log(o)}))}class c extends Error{}const d="[-a-zA-Z0-9_]{3,32}",m="[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*",u=`(${m}|${d})`,f=[":","~"," ","\t","[\0-]","","^\\.","/\\.","\\.lock$","\\.lock/","^$","^-$","\\.\\.","@{","//","^/","/$"].join("|"),p=e=>`^(?!.*(${e}))`,h=p(["\\?","\\^","\\[","\\\\","\\*",f].join("|")),v=p(f);var w=Object.freeze({__proto__:null,validBackupIdPattern:"[0-9]{8}T[0-9]{6}.[0-9]{3}",validBranchNamePattern:h,validBranchProtectionNamePattern:v,validClientCredentialIdPattern:"[0-9a-v]{45}",validEmailOrResourcePattern:u,validEmailPattern:m,validLongResourcePattern:"[-a-zA-Z0-9_]{3,36}",validNumberPattern:"[1-9][0-9]*",validResourceSegmentPattern:d,validUuidPattern:"[a-f0-9-]{36}"});export{i as ResourceNameValidationError,c as ResourceParamValidationError,e as byHash,a as byName,r as byResourceName,t as comparatorsToSorters,n as displayName,o as doNameValidation,s as doParamValidation,w as validResourceSegmentPattern};
1
+ const t=["t","☃️","user/in-progress/do-some-things","user/in-progress/{}","user/{/a.tt/}"],e=["","this-is-a-@{-test","this-is-a- -test","this-is-a-\t-test","this-is-a-//-test","this-is-a-:-test","this-is-a-~-test","this-is-a-\0-test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a-\b-test","this-is-a-\t-test","this-is-a-\n-test","this-is-a-\v-test","this-is-a-\f-test","this-is-a-\r-test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a--test","this-is-a-\n-test","user/working/.tt",".user/working/a.tt","user/working/","/user/working/","user/working/mybranch.lock","mybranch.lock","user.lock/working/mybranch","-"],s=[...e,"this-is-a-..-test","this-is-a-?-test","this-is-a-[-test","this-is-a-\\-test","this-is-a-^-test","this-is-a-*-test"];function a(t,e){const s=t.name.split("/").at(-1),a=e.name.split("/").at(-1);if(!s)throw new Error(`Malformatted name: ${t.name}`);if(!a)throw new Error(`Malformatted name: ${e.name}`);if(s===a)return 0;if(s<a)return-1;if(s>a)return 1;throw new Error(`Unable to compare: ${t.name} ${e.name}`)}function i(t,e){const s=t.name.split("/").at(-1),a=e.name.split("/").at(-1);if(!s)throw new Error(`Malformatted name: ${t.name}`);if(!a)throw new Error(`Malformatted name: ${e.name}`);return s.localeCompare(a)}function r(t,e){return t.name.localeCompare(e.name)}function n(t){return Object.fromEntries(Object.entries(t).map((([t,e])=>{return[t,(s=e,(t,e)=>t.sort(e?function(t){return(e,s)=>t(s,e)}(s):s))];var s})))}function o(t){if("getDisplayName"in t&&t.getDisplayName){const e=t.getDisplayName();if(e)return e}if("displayName"in t&&t.displayName)return t.displayName;const e="getName"in t?t.getName():t.name,s=e.split("/").at(-1);return null!=s?s:e}function l(t,e,s,a){const i=(t=>Object.assign({throwValidationError:!0,validate:!0},t))(a);if(i.validate&&!s.validate(t)){const s=`${e} resource name failed validation: ${t}`;if(i.throwValidationError)throw new c(s);console.log(s)}}class c extends Error{}const h=t=>t&&t[0].toLocaleUpperCase()+t.slice(1);function d(t,e,s,a){const i=(t=>Object.assign({throwValidationError:!0,validate:!0},t))(a);if(!i.validate)return;Object.entries(t).forEach((([t,a])=>{if(s(t)(a))return;const r="production"===process.env.NODE_ENV?function(t,e){switch(t){case"emailAddress":return"Invalid email address.";case"branchName":return"Invalid branch name. Please refer to the help docs for branch name rules.";case"credentialId":return"CredentialID can only contain lowercase letters and numbers, and can be no longer than 45 characters.";default:return`${h(e.split(/(?=[A-Z])/).join(" ").toLowerCase())} name can only contain underscores, dashes, and letters, and must be 3-32 characters.`}}(t,e):`${e} param ${t} failed validation: ${a}`;if(i.throwValidationError)throw new m(r);console.log(r)}))}class m extends Error{}const u="[-a-zA-Z0-9_]{3,32}",f="[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*",p=`(${f}|${u})`,w=[":","~"," ","\t","[\0-]","","^\\.","/\\.","\\.lock$","\\.lock/","^$","^-$","\\.\\.","@{","//","^/","/$"].join("|"),v=t=>`^(?!.*(${t}))`,g=v(["\\?","\\^","\\[","\\\\","\\*",w].join("|")),$=v(w);var b=Object.freeze({__proto__:null,validBackupIdPattern:"[0-9]{8}T[0-9]{6}.[0-9]{3}",validBranchNamePattern:g,validBranchProtectionNamePattern:$,validClientCredentialIdPattern:"[0-9a-v]{45}",validEmailOrResourcePattern:p,validEmailPattern:f,validLongResourcePattern:"[-a-zA-Z0-9_]{3,36}",validNumberPattern:"[1-9][0-9]*",validResourceSegmentPattern:u,validUuidPattern:"[a-f0-9-]{36}"});export{c as ResourceNameValidationError,m as ResourceParamValidationError,a as byHash,i as byName,r as byResourceName,n as comparatorsToSorters,o as displayName,l as doNameValidation,d as doParamValidation,s as invalidBranchNames,e as invalidBranchProtectionNames,t as validBranchNames,b as validResourceSegmentPattern};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/byHash.ts","../../src/byName.ts","../../src/byResourceName.ts","../../src/comparatorsToSorters.ts","../../src/displayName.ts","../../src/doNameValidation.ts","../../src/resourceNames.ts","../../src/doParamValidation.ts","../../src/validResourceSegmentPattern.ts"],"sourcesContent":["type NamedResource = {\n name: string;\n};\n\nexport default function byHash(o1: NamedResource, o2: NamedResource): number {\n const o1LastParam = o1.name.split(\"/\").at(-1);\n const o2LastParam = o2.name.split(\"/\").at(-1);\n\n if (!o1LastParam) {\n throw new Error(`Malformatted name: ${o1.name}`);\n }\n\n if (!o2LastParam) {\n throw new Error(`Malformatted name: ${o2.name}`);\n }\n\n if (o1LastParam === o2LastParam) {\n return 0;\n }\n if (o1LastParam < o2LastParam) {\n return -1;\n }\n if (o1LastParam > o2LastParam) {\n return 1;\n }\n throw new Error(`Unable to compare: ${o1.name} ${o2.name}`);\n}\n","type NamedResource = {\n name: string;\n};\n\nexport default function byName(o1: NamedResource, o2: NamedResource): number {\n const o1LastParam = o1.name.split(\"/\").at(-1);\n const o2LastParam = o2.name.split(\"/\").at(-1);\n\n if (!o1LastParam) {\n throw new Error(`Malformatted name: ${o1.name}`);\n }\n\n if (!o2LastParam) {\n throw new Error(`Malformatted name: ${o2.name}`);\n }\n\n return o1LastParam.localeCompare(o2LastParam);\n}\n","type NamedResource = {\n name: string;\n};\n\nexport default function byResourceName(\n o1: NamedResource,\n o2: NamedResource,\n): number {\n return o1.name.localeCompare(o2.name);\n}\n","import {\n Comparator,\n Comparators,\n NamedResource,\n Sorter,\n Sorters,\n} from \"./ResourceUtils\";\n\nexport default function comparatorsToSorters<T extends NamedResource>(\n cmps: Comparators<T>,\n): Sorters<T> {\n return Object.fromEntries(\n Object.entries(cmps).map(([k, v]) => [k, comparatorToSorter(v)]),\n ) as Sorters<T>;\n}\n\nexport function comparatorToSorter<T extends NamedResource>(\n cmpFn: Comparator<T>,\n): Sorter<T> {\n return (ts: T[], desc?: boolean) => ts.sort(desc ? reverse(cmpFn) : cmpFn);\n}\n\nexport function reverse<T extends NamedResource>(cmpFn: Comparator<T>) {\n return (t1: T, t2: T) => cmpFn(t2, t1);\n}\n","import { NamedObjectable, NamedResource } from \"./ResourceUtils\";\n\nexport default function displayName<O extends NamedObjectable<NamedResource>>(\n r: O | NamedResource,\n): string {\n if (\"getDisplayName\" in r && r.getDisplayName) {\n const dn = r.getDisplayName();\n if (dn) {\n return dn;\n }\n }\n\n if (\"displayName\" in r && r.displayName) {\n return r.displayName;\n }\n\n const name = \"getName\" in r ? r.getName() : r.name;\n const shortName = name.split(\"/\").at(-1);\n\n return shortName ?? name;\n}\n","import { getFromResourceOptions } from \"./resourceNames\";\nimport {\n FromResourceOptions,\n ResourceNameConverter,\n} from \"./ResourceNamesUtils\";\n\nexport default function doNameValidation<T>(\n resourceName: string,\n resourceTypeName: string,\n converter: ResourceNameConverter<T>,\n o?: Partial<FromResourceOptions>,\n) {\n const opts = getFromResourceOptions(o);\n if (opts.validate && !converter.validate(resourceName)) {\n const msg = `${resourceTypeName} resource name failed validation: ${resourceName}`;\n if (opts.throwValidationError) {\n throw new ResourceNameValidationError(msg);\n } else {\n console.log(msg);\n }\n }\n}\n\nexport class ResourceNameValidationError extends Error {}\n","import { FromResourceOptions, ToResourceOptions } from \"./ResourceNamesUtils\";\n\n// For now, the from and to options are the same, but I can easily imagine a world\n// where they're not in the future, so let's keep them separately named.\nconst defaultFromResourceOptions = (): FromResourceOptions => {\n return {\n throwValidationError: true,\n validate: true,\n };\n};\nexport const getFromResourceOptions = (\n o?: Partial<FromResourceOptions>,\n): FromResourceOptions => Object.assign(defaultFromResourceOptions(), o);\n\nconst defaultToResourceOptions = (): ToResourceOptions => {\n return {\n throwValidationError: true,\n validate: true,\n };\n};\nexport const getToResourceOptions = (\n o?: Partial<ToResourceOptions>,\n): FromResourceOptions => Object.assign(defaultToResourceOptions(), o);\n","import { ToResourceOptions } from \"./ResourceNamesUtils\";\nimport { getToResourceOptions } from \"./resourceNames\";\n\nconst initialUppercase = (str: string) =>\n str && str[0].toLocaleUpperCase() + str.slice(1);\n\nexport default function doParamValidation(\n obj: {\n [paramName: string]: string;\n },\n resourceTypeName: string,\n getValidator: (paramName: string) => (value: string) => boolean,\n o?: Partial<ToResourceOptions>,\n) {\n const opts = getToResourceOptions(o);\n if (!opts.validate) {\n return;\n }\n const entries = Object.entries(obj);\n\n entries.forEach(([paramName, value]) => {\n const isValid = getValidator(paramName)(value);\n if (isValid) {\n return;\n }\n\n const msg =\n process.env.NODE_ENV === \"production\"\n ? getProdError(paramName, resourceTypeName)\n : `${resourceTypeName} param ${paramName} failed validation: ${value}`;\n\n if (opts.throwValidationError) {\n throw new ResourceParamValidationError(msg);\n } else {\n console.log(msg);\n }\n });\n}\n\nexport class ResourceParamValidationError extends Error {}\n\nexport function getProdError(paramName: string, resourceTypeName: string) {\n switch (paramName) {\n case \"emailAddress\":\n return \"Invalid email address.\";\n case \"branchName\":\n return \"Invalid branch name. Please refer to the help docs for branch name rules.\";\n case \"credentialId\":\n return \"CredentialID can only contain lowercase letters and numbers, and can be no longer than 45 characters.\";\n default: {\n const friendlyTypeName = initialUppercase(\n resourceTypeName\n .split(/(?=[A-Z])/)\n .join(\" \")\n .toLowerCase(),\n );\n return `${friendlyTypeName} name can only contain underscores, dashes, and letters, and must be 3-32 characters.`;\n }\n }\n}\n","const validResourceSegmentPattern = \"[-a-zA-Z0-9_]{3,32}\";\nconst validClientCredentialIdPattern = \"[0-9a-v]{45}\";\nconst validEmailPattern =\n \"[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\\\.[a-zA-Z0-9-]+)*\";\nconst validEmailOrResourcePattern = `(${validEmailPattern}|${validResourceSegmentPattern})`;\nconst validNumberPattern = \"[1-9][0-9]*\";\nconst validLongResourcePattern = \"[-a-zA-Z0-9_]{3,36}\";\nconst validUuidPattern = \"[a-f0-9-]{36}\";\nconst validBackupIdPattern = \"[0-9]{8}T[0-9]{6}.[0-9]{3}\";\n\n// Removed ?,^, [, \\, * from invalidBranchNamePattern as they are allowed in fnmatch\nconst invalidBranchProtectionNamePattern = [\n `:`,\n `~`,\n ` `,\n `\\t`,\n `[\\x00-\\x1f]`,\n `\\x7f`,\n `^\\\\.`,\n `/\\\\.`,\n `\\\\.lock$`,\n `\\\\.lock/`,\n `^$`,\n `^-$`,\n `\\\\.\\\\.`,\n `@{`,\n `//`,\n `^/`,\n `/$`,\n].join(\"|\");\n\nconst invalidBranchNamePattern = [\n `\\\\?`,\n `\\\\^`,\n `\\\\[`,\n `\\\\\\\\`,\n `\\\\*`,\n invalidBranchProtectionNamePattern,\n].join(\"|\");\n\nconst invertRegexPattern = (p: string) => `^(?!.*(${p}))`;\nconst validBranchNamePattern = invertRegexPattern(invalidBranchNamePattern);\nconst validBranchProtectionNamePattern = invertRegexPattern(\n invalidBranchProtectionNamePattern,\n);\n\nexport {\n validBackupIdPattern,\n validBranchNamePattern,\n validClientCredentialIdPattern,\n validEmailOrResourcePattern,\n validEmailPattern,\n validLongResourcePattern,\n validNumberPattern,\n validResourceSegmentPattern,\n validUuidPattern,\n validBranchProtectionNamePattern,\n};\n"],"names":["byHash","o1","o2","o1LastParam","name","split","at","o2LastParam","Error","byName","localeCompare","byResourceName","comparatorsToSorters","cmps","Object","fromEntries","entries","map","k","v","cmpFn","ts","desc","sort","t1","t2","reverse","displayName","r","getDisplayName","dn","getName","shortName","doNameValidation","resourceName","resourceTypeName","converter","o","opts","assign","throwValidationError","validate","getFromResourceOptions","msg","ResourceNameValidationError","console","log","initialUppercase","str","toLocaleUpperCase","slice","doParamValidation","obj","getValidator","getToResourceOptions","forEach","paramName","value","process","env","NODE_ENV","join","toLowerCase","getProdError","ResourceParamValidationError","validResourceSegmentPattern","validEmailPattern","validEmailOrResourcePattern","invalidBranchProtectionNamePattern","invertRegexPattern","p","validBranchNamePattern","validBranchProtectionNamePattern"],"mappings":"AAIc,SAAUA,EAAOC,EAAmBC,GAChD,MAAMC,EAAcF,EAAGG,KAAKC,MAAM,KAAKC,OACjCC,EAAcL,EAAGE,KAAKC,MAAM,KAAKC,OAEvC,IAAKH,EACH,MAAM,IAAIK,MAAM,sBAAsBP,EAAGG,QAG3C,IAAKG,EACH,MAAM,IAAIC,MAAM,sBAAsBN,EAAGE,QAG3C,GAAID,IAAgBI,EAClB,OAAO,EAET,GAAIJ,EAAcI,EAChB,OAAO,EAET,GAAIJ,EAAcI,EAChB,OAAO,EAET,MAAM,IAAIC,MAAM,sBAAsBP,EAAGG,QAAQF,EAAGE,OACtD,CCtBc,SAAUK,EAAOR,EAAmBC,GAChD,MAAMC,EAAcF,EAAGG,KAAKC,MAAM,KAAKC,OACjCC,EAAcL,EAAGE,KAAKC,MAAM,KAAKC,OAEvC,IAAKH,EACH,MAAM,IAAIK,MAAM,sBAAsBP,EAAGG,QAG3C,IAAKG,EACH,MAAM,IAAIC,MAAM,sBAAsBN,EAAGE,QAG3C,OAAOD,EAAYO,cAAcH,EACnC,CCbc,SAAUI,EACtBV,EACAC,GAEA,OAAOD,EAAGG,KAAKM,cAAcR,EAAGE,KAClC,CCDc,SAAUQ,EACtBC,GAEA,OAAOC,OAAOC,YACZD,OAAOE,QAAQH,GAAMI,KAAI,EAAEC,EAAGC,MAAO,OAACD,GAKxCE,EAL8DD,EAOvD,CAACE,EAASC,IAAmBD,EAAGE,KAAKD,EAGxC,SAA2CF,GAC/C,MAAO,CAACI,EAAOC,IAAUL,EAAMK,EAAID,EACrC,CALqDE,CAAQN,GAASA,KAHhE,IACJA,CALiE,IAEnE,CCZc,SAAUO,EACtBC,GAEA,GAAI,mBAAoBA,GAAKA,EAAEC,eAAgB,CAC7C,MAAMC,EAAKF,EAAEC,iBACb,GAAIC,EACF,OAAOA,CAEX,CAEA,GAAI,gBAAiBF,GAAKA,EAAED,YAC1B,OAAOC,EAAED,YAGX,MAAMvB,EAAO,YAAawB,EAAIA,EAAEG,UAAYH,EAAExB,KACxC4B,EAAY5B,EAAKC,MAAM,KAAKC,OAElC,OAAO0B,QAAAA,EAAa5B,CACtB,CCdc,SAAU6B,EACtBC,EACAC,EACAC,EACAC,GAEA,MAAMC,ECF8B,CACpCD,GACwBvB,OAAOyB,OAPxB,CACLC,sBAAsB,EACtBC,UAAU,GAKwDJ,GDAvDK,CAAuBL,GACpC,GAAIC,EAAKG,WAAaL,EAAUK,SAASP,GAAe,CACtD,MAAMS,EAAM,GAAGR,sCAAqDD,IACpE,GAAII,EAAKE,qBACP,MAAM,IAAII,EAA4BD,GAEtCE,QAAQC,IAAIH,EAEhB,CACF,CAEM,MAAOC,UAAoCpC,OEpBjD,MAAMuC,EAAoBC,GACxBA,GAAOA,EAAI,GAAGC,oBAAsBD,EAAIE,MAAM,GAElC,SAAUC,EACtBC,EAGAjB,EACAkB,EACAhB,GAEA,MAAMC,EDM4B,CAClCD,GACwBvB,OAAOyB,OAPxB,CACLC,sBAAsB,EACtBC,UAAU,GAKsDJ,GCRrDiB,CAAqBjB,GAClC,IAAKC,EAAKG,SACR,OAEc3B,OAAOE,QAAQoC,GAEvBG,SAAQ,EAAEC,EAAWC,MAE3B,GADgBJ,EAAaG,EAAbH,CAAwBI,GAEtC,OAGF,MAAMd,EACqB,eAAzBe,QAAQC,IAAIC,SAcZ,SAAuBJ,EAAmBrB,GAC9C,OAAQqB,GACN,IAAK,eACH,MAAO,yBACT,IAAK,aACH,MAAO,4EACT,IAAK,eACH,MAAO,wGACT,QAOE,MAAO,GANkBT,EACvBZ,EACG9B,MAAM,aACNwD,KAAK,KACLC,sGAKX,CA/BUC,CAAaP,EAAWrB,GACxB,GAAGA,WAA0BqB,wBAAgCC,IAEnE,GAAInB,EAAKE,qBACP,MAAM,IAAIwB,EAA6BrB,GAEvCE,QAAQC,IAAIH,EACd,GAEJ,CAEM,MAAOqB,UAAqCxD,OCvClD,MAAMyD,EAA8B,sBAE9BC,EACJ,sEACIC,EAA8B,IAAID,KAAqBD,KAOvDG,EAAqC,CACzC,IACA,IACA,IACA,KACA,SACA,IACA,OACA,OACA,WACA,WACA,KACA,MACA,SACA,KACA,KACA,KACA,MACAP,KAAK,KAWDQ,EAAsBC,GAAc,UAAUA,MAC9CC,EAAyBF,EAVE,CAC/B,MACA,MACA,MACA,OACA,MACAD,GACAP,KAAK,MAIDW,EAAmCH,EACvCD,4DAnC2B,wHAPU,0FAKN,yCADN,6DAEF"}
1
+ {"version":3,"file":"index.js","sources":["../../src/__tests__/helpers/branchNames.ts","../../src/byHash.ts","../../src/byName.ts","../../src/byResourceName.ts","../../src/comparatorsToSorters.ts","../../src/displayName.ts","../../src/doNameValidation.ts","../../src/resourceNames.ts","../../src/doParamValidation.ts","../../src/validResourceSegmentPattern.ts"],"sourcesContent":["export const validBranchNames = [\n \"t\",\n \"☃️\",\n \"user/in-progress/do-some-things\",\n \"user/in-progress/{}\",\n \"user/{/a.tt/}\",\n];\n\nexport const invalidBranchProtectionNames = [\n \"\",\n \"this-is-a-@{-test\",\n \"this-is-a- -test\",\n \"this-is-a-\\t-test\",\n \"this-is-a-//-test\",\n \"this-is-a-:-test\",\n \"this-is-a-~-test\",\n \"this-is-a-\\x00-test\",\n \"this-is-a-\\x01-test\",\n \"this-is-a-\\x02-test\",\n \"this-is-a-\\x03-test\",\n \"this-is-a-\\x04-test\",\n \"this-is-a-\\x05-test\",\n \"this-is-a-\\x06-test\",\n \"this-is-a-\\x07-test\",\n \"this-is-a-\\x08-test\",\n \"this-is-a-\\x09-test\",\n \"this-is-a-\\x0a-test\",\n \"this-is-a-\\x0b-test\",\n \"this-is-a-\\x0c-test\",\n \"this-is-a-\\x0d-test\",\n \"this-is-a-\\x0e-test\",\n \"this-is-a-\\x0f-test\",\n \"this-is-a-\\x10-test\",\n \"this-is-a-\\x11-test\",\n \"this-is-a-\\x12-test\",\n \"this-is-a-\\x13-test\",\n \"this-is-a-\\x14-test\",\n \"this-is-a-\\x15-test\",\n \"this-is-a-\\x16-test\",\n \"this-is-a-\\x17-test\",\n \"this-is-a-\\x18-test\",\n \"this-is-a-\\x19-test\",\n \"this-is-a-\\x1a-test\",\n \"this-is-a-\\x1b-test\",\n \"this-is-a-\\x1c-test\",\n \"this-is-a-\\x1d-test\",\n \"this-is-a-\\x1e-test\",\n \"this-is-a-\\x1f-test\",\n \"this-is-a-\\x7f-test\",\n \"this-is-a-\\n-test\",\n \"user/working/.tt\",\n \".user/working/a.tt\",\n \"user/working/\",\n \"/user/working/\",\n \"user/working/mybranch.lock\",\n \"mybranch.lock\",\n \"user.lock/working/mybranch\",\n \"-\",\n];\n\nexport const invalidBranchNames = [\n ...invalidBranchProtectionNames,\n \"this-is-a-..-test\",\n \"this-is-a-?-test\",\n \"this-is-a-[-test\",\n \"this-is-a-\\\\-test\",\n \"this-is-a-^-test\",\n \"this-is-a-*-test\",\n];\n\nexport const validBranchProtectionNames = [\n ...validBranchNames,\n \"foo*\",\n \"qa/**/*\",\n \"c{at,ub}s\",\n \"c?t\",\n \"c??t\",\n \"c*\",\n \"c*t\",\n \"ca[a-z]\",\n \"ca[^t]\",\n \"?\",\n \"*\",\n \"[\\\\?]\",\n];\n","type NamedResource = {\n name: string;\n};\n\nexport default function byHash(o1: NamedResource, o2: NamedResource): number {\n const o1LastParam = o1.name.split(\"/\").at(-1);\n const o2LastParam = o2.name.split(\"/\").at(-1);\n\n if (!o1LastParam) {\n throw new Error(`Malformatted name: ${o1.name}`);\n }\n\n if (!o2LastParam) {\n throw new Error(`Malformatted name: ${o2.name}`);\n }\n\n if (o1LastParam === o2LastParam) {\n return 0;\n }\n if (o1LastParam < o2LastParam) {\n return -1;\n }\n if (o1LastParam > o2LastParam) {\n return 1;\n }\n throw new Error(`Unable to compare: ${o1.name} ${o2.name}`);\n}\n","type NamedResource = {\n name: string;\n};\n\nexport default function byName(o1: NamedResource, o2: NamedResource): number {\n const o1LastParam = o1.name.split(\"/\").at(-1);\n const o2LastParam = o2.name.split(\"/\").at(-1);\n\n if (!o1LastParam) {\n throw new Error(`Malformatted name: ${o1.name}`);\n }\n\n if (!o2LastParam) {\n throw new Error(`Malformatted name: ${o2.name}`);\n }\n\n return o1LastParam.localeCompare(o2LastParam);\n}\n","type NamedResource = {\n name: string;\n};\n\nexport default function byResourceName(\n o1: NamedResource,\n o2: NamedResource,\n): number {\n return o1.name.localeCompare(o2.name);\n}\n","import {\n Comparator,\n Comparators,\n NamedResource,\n Sorter,\n Sorters,\n} from \"./ResourceUtils\";\n\nexport default function comparatorsToSorters<T extends NamedResource>(\n cmps: Comparators<T>,\n): Sorters<T> {\n return Object.fromEntries(\n Object.entries(cmps).map(([k, v]) => [k, comparatorToSorter(v)]),\n ) as Sorters<T>;\n}\n\nexport function comparatorToSorter<T extends NamedResource>(\n cmpFn: Comparator<T>,\n): Sorter<T> {\n return (ts: T[], desc?: boolean) => ts.sort(desc ? reverse(cmpFn) : cmpFn);\n}\n\nexport function reverse<T extends NamedResource>(cmpFn: Comparator<T>) {\n return (t1: T, t2: T) => cmpFn(t2, t1);\n}\n","import { NamedObjectable, NamedResource } from \"./ResourceUtils\";\n\nexport default function displayName<O extends NamedObjectable<NamedResource>>(\n r: O | NamedResource,\n): string {\n if (\"getDisplayName\" in r && r.getDisplayName) {\n const dn = r.getDisplayName();\n if (dn) {\n return dn;\n }\n }\n\n if (\"displayName\" in r && r.displayName) {\n return r.displayName;\n }\n\n const name = \"getName\" in r ? r.getName() : r.name;\n const shortName = name.split(\"/\").at(-1);\n\n return shortName ?? name;\n}\n","import { getFromResourceOptions } from \"./resourceNames\";\nimport {\n FromResourceOptions,\n ResourceNameConverter,\n} from \"./ResourceNamesUtils\";\n\nexport default function doNameValidation<T>(\n resourceName: string,\n resourceTypeName: string,\n converter: ResourceNameConverter<T>,\n o?: Partial<FromResourceOptions>,\n) {\n const opts = getFromResourceOptions(o);\n if (opts.validate && !converter.validate(resourceName)) {\n const msg = `${resourceTypeName} resource name failed validation: ${resourceName}`;\n if (opts.throwValidationError) {\n throw new ResourceNameValidationError(msg);\n } else {\n console.log(msg);\n }\n }\n}\n\nexport class ResourceNameValidationError extends Error {}\n","import { FromResourceOptions, ToResourceOptions } from \"./ResourceNamesUtils\";\n\n// For now, the from and to options are the same, but I can easily imagine a world\n// where they're not in the future, so let's keep them separately named.\nconst defaultFromResourceOptions = (): FromResourceOptions => {\n return {\n throwValidationError: true,\n validate: true,\n };\n};\nexport const getFromResourceOptions = (\n o?: Partial<FromResourceOptions>,\n): FromResourceOptions => Object.assign(defaultFromResourceOptions(), o);\n\nconst defaultToResourceOptions = (): ToResourceOptions => {\n return {\n throwValidationError: true,\n validate: true,\n };\n};\nexport const getToResourceOptions = (\n o?: Partial<ToResourceOptions>,\n): FromResourceOptions => Object.assign(defaultToResourceOptions(), o);\n","import { ToResourceOptions } from \"./ResourceNamesUtils\";\nimport { getToResourceOptions } from \"./resourceNames\";\n\nconst initialUppercase = (str: string) =>\n str && str[0].toLocaleUpperCase() + str.slice(1);\n\nexport default function doParamValidation(\n obj: {\n [paramName: string]: string;\n },\n resourceTypeName: string,\n getValidator: (paramName: string) => (value: string) => boolean,\n o?: Partial<ToResourceOptions>,\n) {\n const opts = getToResourceOptions(o);\n if (!opts.validate) {\n return;\n }\n const entries = Object.entries(obj);\n\n entries.forEach(([paramName, value]) => {\n const isValid = getValidator(paramName)(value);\n if (isValid) {\n return;\n }\n\n const msg =\n process.env.NODE_ENV === \"production\"\n ? getProdError(paramName, resourceTypeName)\n : `${resourceTypeName} param ${paramName} failed validation: ${value}`;\n\n if (opts.throwValidationError) {\n throw new ResourceParamValidationError(msg);\n } else {\n console.log(msg);\n }\n });\n}\n\nexport class ResourceParamValidationError extends Error {}\n\nexport function getProdError(paramName: string, resourceTypeName: string) {\n switch (paramName) {\n case \"emailAddress\":\n return \"Invalid email address.\";\n case \"branchName\":\n return \"Invalid branch name. Please refer to the help docs for branch name rules.\";\n case \"credentialId\":\n return \"CredentialID can only contain lowercase letters and numbers, and can be no longer than 45 characters.\";\n default: {\n const friendlyTypeName = initialUppercase(\n resourceTypeName\n .split(/(?=[A-Z])/)\n .join(\" \")\n .toLowerCase(),\n );\n return `${friendlyTypeName} name can only contain underscores, dashes, and letters, and must be 3-32 characters.`;\n }\n }\n}\n","const validResourceSegmentPattern = \"[-a-zA-Z0-9_]{3,32}\";\nconst validClientCredentialIdPattern = \"[0-9a-v]{45}\";\nconst validEmailPattern =\n \"[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\\\.[a-zA-Z0-9-]+)*\";\nconst validEmailOrResourcePattern = `(${validEmailPattern}|${validResourceSegmentPattern})`;\nconst validNumberPattern = \"[1-9][0-9]*\";\nconst validLongResourcePattern = \"[-a-zA-Z0-9_]{3,36}\";\nconst validUuidPattern = \"[a-f0-9-]{36}\";\nconst validBackupIdPattern = \"[0-9]{8}T[0-9]{6}.[0-9]{3}\";\n\n// Removed ?,^, [, \\, * from invalidBranchNamePattern as they are allowed in fnmatch\nconst invalidBranchProtectionNamePattern = [\n `:`,\n `~`,\n ` `,\n `\\t`,\n `[\\x00-\\x1f]`,\n `\\x7f`,\n `^\\\\.`,\n `/\\\\.`,\n `\\\\.lock$`,\n `\\\\.lock/`,\n `^$`,\n `^-$`,\n `\\\\.\\\\.`,\n `@{`,\n `//`,\n `^/`,\n `/$`,\n].join(\"|\");\n\nconst invalidBranchNamePattern = [\n `\\\\?`,\n `\\\\^`,\n `\\\\[`,\n `\\\\\\\\`,\n `\\\\*`,\n invalidBranchProtectionNamePattern,\n].join(\"|\");\n\nconst invertRegexPattern = (p: string) => `^(?!.*(${p}))`;\nconst validBranchNamePattern = invertRegexPattern(invalidBranchNamePattern);\nconst validBranchProtectionNamePattern = invertRegexPattern(\n invalidBranchProtectionNamePattern,\n);\n\nexport {\n validBackupIdPattern,\n validBranchNamePattern,\n validClientCredentialIdPattern,\n validEmailOrResourcePattern,\n validEmailPattern,\n validLongResourcePattern,\n validNumberPattern,\n validResourceSegmentPattern,\n validUuidPattern,\n validBranchProtectionNamePattern,\n};\n"],"names":["validBranchNames","invalidBranchProtectionNames","invalidBranchNames","byHash","o1","o2","o1LastParam","name","split","at","o2LastParam","Error","byName","localeCompare","byResourceName","comparatorsToSorters","cmps","Object","fromEntries","entries","map","k","v","cmpFn","ts","desc","sort","t1","t2","reverse","displayName","r","getDisplayName","dn","getName","shortName","doNameValidation","resourceName","resourceTypeName","converter","o","opts","assign","throwValidationError","validate","getFromResourceOptions","msg","ResourceNameValidationError","console","log","initialUppercase","str","toLocaleUpperCase","slice","doParamValidation","obj","getValidator","getToResourceOptions","forEach","paramName","value","process","env","NODE_ENV","join","toLowerCase","getProdError","ResourceParamValidationError","validResourceSegmentPattern","validEmailPattern","validEmailOrResourcePattern","invalidBranchProtectionNamePattern","invertRegexPattern","p","validBranchNamePattern","validBranchProtectionNamePattern"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,22 @@
1
+ declare const validBranchNames: string[];
2
+ declare const invalidBranchProtectionNames: string[];
3
+ declare const invalidBranchNames: string[];
4
+
5
+ type NamedResource$3 = {
6
+ name: string;
7
+ };
8
+ declare function byHash(o1: NamedResource$3, o2: NamedResource$3): number;
9
+
10
+ type NamedResource$2 = {
11
+ name: string;
12
+ };
13
+ declare function byName(o1: NamedResource$2, o2: NamedResource$2): number;
14
+
15
+ type NamedResource$1 = {
16
+ name: string;
17
+ };
18
+ declare function byResourceName(o1: NamedResource$1, o2: NamedResource$1): number;
19
+
1
20
  type FromResourceOptions = {
2
21
  validate?: boolean;
3
22
  throwValidationError?: boolean;
@@ -11,28 +30,28 @@ type ResourceNameConverter<T> = {
11
30
  getValidationPattern: () => string;
12
31
  };
13
32
 
14
- type NamedResource$3 = {
33
+ type NamedResource = {
15
34
  name: string;
16
35
  displayName?: string;
17
36
  };
18
- type Comparator<O extends NamedResource$3> = (t1: O, t2: O) => number;
19
- type Comparators<O extends NamedResource$3> = {
37
+ type Comparator<O extends NamedResource> = (t1: O, t2: O) => number;
38
+ type Comparators<O extends NamedResource> = {
20
39
  byName: Comparator<O>;
21
40
  byResourceName: Comparator<O>;
22
41
  [fnName: string]: Comparator<O>;
23
42
  };
24
- type Sorter<O extends NamedResource$3> = (ts: O[], desc?: boolean) => O[];
25
- type Sorters<O extends NamedResource$3> = {
43
+ type Sorter<O extends NamedResource> = (ts: O[], desc?: boolean) => O[];
44
+ type Sorters<O extends NamedResource> = {
26
45
  [K in keyof Comparators<O>]: Sorter<O>;
27
46
  };
28
47
  type Objectable<O> = {
29
48
  toObject: () => O;
30
49
  };
31
- type NamedObjectable<O extends NamedResource$3> = {
50
+ type NamedObjectable<O extends NamedResource> = {
32
51
  getDisplayName?: () => string;
33
52
  getName: () => string;
34
53
  } & Objectable<O>;
35
- type ResourceUtils<O extends NamedResource$3, T extends NamedObjectable<O>, P extends object, U extends object = object> = {
54
+ type ResourceUtils<O extends NamedResource, T extends NamedObjectable<O>, P extends object, U extends object = object> = {
36
55
  cmp: Comparators<O>;
37
56
  rn: ResourceNameConverter<P>;
38
57
  sort: Sorters<O>;
@@ -40,24 +59,9 @@ type ResourceUtils<O extends NamedResource$3, T extends NamedObjectable<O>, P ex
40
59
  fromObject: (o: Partial<O>) => T;
41
60
  } & U;
42
61
 
43
- type NamedResource$2 = {
44
- name: string;
45
- };
46
- declare function byHash(o1: NamedResource$2, o2: NamedResource$2): number;
47
-
48
- type NamedResource$1 = {
49
- name: string;
50
- };
51
- declare function byName(o1: NamedResource$1, o2: NamedResource$1): number;
52
-
53
- type NamedResource = {
54
- name: string;
55
- };
56
- declare function byResourceName(o1: NamedResource, o2: NamedResource): number;
57
-
58
- declare function comparatorsToSorters<T extends NamedResource$3>(cmps: Comparators<T>): Sorters<T>;
62
+ declare function comparatorsToSorters<T extends NamedResource>(cmps: Comparators<T>): Sorters<T>;
59
63
 
60
- declare function displayName<O extends NamedObjectable<NamedResource$3>>(r: O | NamedResource$3): string;
64
+ declare function displayName<O extends NamedObjectable<NamedResource>>(r: O | NamedResource): string;
61
65
 
62
66
  declare function doNameValidation<T>(resourceName: string, resourceTypeName: string, converter: ResourceNameConverter<T>, o?: Partial<FromResourceOptions>): void;
63
67
  declare class ResourceNameValidationError extends Error {
@@ -105,5 +109,5 @@ declare namespace validResourceSegmentPattern_d {
105
109
  };
106
110
  }
107
111
 
108
- export { ResourceNameValidationError, ResourceParamValidationError, byHash, byName, byResourceName, comparatorsToSorters, displayName, doNameValidation, doParamValidation, validResourceSegmentPattern_d as validResourceSegmentPattern };
109
- export type { Comparators, NamedResource$3 as NamedResource, ResourceNameConverter, ResourceUtils, Sorter, Sorters, ToResourceOptions };
112
+ export { ResourceNameValidationError, ResourceParamValidationError, byHash, byName, byResourceName, comparatorsToSorters, displayName, doNameValidation, doParamValidation, invalidBranchNames, invalidBranchProtectionNames, validBranchNames, validResourceSegmentPattern_d as validResourceSegmentPattern };
113
+ export type { Comparators, NamedResource, ResourceNameConverter, ResourceUtils, Sorter, Sorters, ToResourceOptions };
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@dolthub/proto-resource-utils",
3
3
  "author": "DoltHub",
4
4
  "description": "Utilities for handling Google protobuf resources and names",
5
- "version": "0.2.0",
5
+ "version": "0.2.1",
6
6
  "main": "dist/cjs/index.js",
7
7
  "module": "dist/esm/index.js",
8
8
  "types": "dist/index.d.ts",
@@ -56,4 +56,4 @@
56
56
  "bugs": {
57
57
  "url": "https://github.com/dolthub/react-library/issues"
58
58
  }
59
- }
59
+ }