@dolthub/proto-resource-utils 0.2.1 → 0.2.2
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 +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/package.json +10 -10
package/dist/cjs/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
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{}
|
|
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{}class i extends Error{}const r="[-a-zA-Z0-9_]{3,32}",n="[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*",o=`(${n}|${r})`,l=[":","~"," ","\t","[\0-]","","^\\.","/\\.","\\.lock$","\\.lock/","^$","^-$","\\.\\.","@{","//","^/","/$"].join("|"),c=t=>`^(?!.*(${t}))`,h=c(["\\?","\\^","\\[","\\\\","\\*",l].join("|")),d=c(l);var m=Object.freeze({__proto__:null,validBackupIdPattern:"[0-9]{8}T[0-9]{6}.[0-9]{3}",validBranchNamePattern:h,validBranchProtectionNamePattern:d,validClientCredentialIdPattern:"[0-9a-v]{45}",validEmailOrResourcePattern:o,validEmailPattern:n,validLongResourcePattern:"[-a-zA-Z0-9_]{3,36}",validNumberPattern:"[1-9][0-9]*",validResourceSegmentPattern:r,validUuidPattern:"[a-f0-9-]{36}"});exports.ResourceNameValidationError=a,exports.ResourceParamValidationError=i,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 r=(t=>Object.assign({throwValidationError:!0,validate:!0},t))(a);if(!r.validate)return;Object.entries(t).forEach(([t,a])=>{if(s(t)(a))return;const n="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`${(s=e.split(/(?=[A-Z])/).join(" ").toLowerCase())&&s[0].toLocaleUpperCase()+s.slice(1)} name can only contain underscores, dashes, and letters, and must be 3-32 characters.`}var s}(t,e):`${e} param ${t} failed validation: ${a}`;if(r.throwValidationError)throw new i(n);console.log(n)})},exports.invalidBranchNames=s,exports.invalidBranchProtectionNames=e,exports.validBranchNames=t,exports.validResourceSegmentPattern=m;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
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","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","str","toLowerCase","toLocaleUpperCase","slice","getProdError"],"mappings":"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"}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
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((
|
|
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{}function h(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`${(s=e.split(/(?=[A-Z])/).join(" ").toLowerCase())&&s[0].toLocaleUpperCase()+s.slice(1)} name can only contain underscores, dashes, and letters, and must be 3-32 characters.`}var s}(t,e):`${e} param ${t} failed validation: ${a}`;if(i.throwValidationError)throw new d(r);console.log(r)})}class d extends Error{}const m="[-a-zA-Z0-9_]{3,32}",u="[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*",f=`(${u}|${m})`,p=[":","~"," ","\t","[\0-]","","^\\.","/\\.","\\.lock$","\\.lock/","^$","^-$","\\.\\.","@{","//","^/","/$"].join("|"),w=t=>`^(?!.*(${t}))`,v=w(["\\?","\\^","\\[","\\\\","\\*",p].join("|")),g=w(p);var $=Object.freeze({__proto__:null,validBackupIdPattern:"[0-9]{8}T[0-9]{6}.[0-9]{3}",validBranchNamePattern:v,validBranchProtectionNamePattern:g,validClientCredentialIdPattern:"[0-9a-v]{45}",validEmailOrResourcePattern:f,validEmailPattern:u,validLongResourcePattern:"[-a-zA-Z0-9_]{3,36}",validNumberPattern:"[1-9][0-9]*",validResourceSegmentPattern:m,validUuidPattern:"[a-f0-9-]{36}"});export{c as ResourceNameValidationError,d as ResourceParamValidationError,a as byHash,i as byName,r as byResourceName,n as comparatorsToSorters,o as displayName,l as doNameValidation,h as doParamValidation,s as invalidBranchNames,e as invalidBranchProtectionNames,t as validBranchNames,$ as validResourceSegmentPattern};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
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","doParamValidation","obj","getValidator","getToResourceOptions","forEach","paramName","value","process","env","NODE_ENV","str","join","toLowerCase","toLocaleUpperCase","slice","getProdError","ResourceParamValidationError","validResourceSegmentPattern","validEmailPattern","validEmailOrResourcePattern","invalidBranchProtectionNamePattern","invertRegexPattern","p","validBranchNamePattern","validBranchProtectionNamePattern"],"mappings":"AAAO,MAAMA,EAAmB,CAC9B,IACA,KACA,kCACA,sBACA,iBAGWC,EAA+B,CAC1C,GACA,oBACA,mBACA,oBACA,oBACA,mBACA,mBACA,oBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,oBACA,oBACA,oBACA,oBACA,oBACA,oBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,oBACA,mBACA,qBACA,gBACA,iBACA,6BACA,gBACA,6BACA,KAGWC,EAAqB,IAC7BD,EACH,oBACA,mBACA,mBACA,oBACA,mBACA,oBC/DY,SAAUE,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,IAAI,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,IAHF,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,OEjBnC,SAAUuC,EACtBC,EAGAb,EACAc,EACAZ,GAEA,MAAMC,EDM4B,CAClCD,GACwBvB,OAAOyB,OAPxB,CACLC,sBAAsB,EACtBC,UAAU,GAKsDJ,GCRrDa,CAAqBb,GAClC,IAAKC,EAAKG,SACR,OAEc3B,OAAOE,QAAQgC,GAEvBG,QAAQ,EAAEC,EAAWC,MAE3B,GADgBJ,EAAaG,EAAbH,CAAwBI,GAEtC,OAGF,MAAMV,EACqB,eAAzBW,QAAQC,IAAIC,SAcZ,SAAuBJ,EAAmBjB,GAC9C,OAAQiB,GACN,IAAK,eACH,MAAO,yBACT,IAAK,aACH,MAAO,4EACT,IAAK,eACH,MAAO,wGACT,QAOE,MAAO,IArDaK,EAgDlBtB,EACG9B,MAAM,aACNqD,KAAK,KACLC,gBAlDFF,EAAI,GAAGG,oBAAsBH,EAAII,MAAM,0FADvB,IAACJ,CAwD1B,CA/BUK,CAAaV,EAAWjB,GACxB,GAAGA,WAA0BiB,wBAAgCC,IAEnE,GAAIf,EAAKE,qBACP,MAAM,IAAIuB,EAA6BpB,GAEvCE,QAAQC,IAAIH,IAGlB,CAEM,MAAOoB,UAAqCvD,OCvClD,MAAMwD,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,MACAT,KAAK,KAWDU,EAAsBC,GAAc,UAAUA,MAC9CC,EAAyBF,EAVE,CAC/B,MACA,MACA,MACA,OACA,MACAD,GACAT,KAAK,MAIDa,EAAmCH,EACvCD,4DAnC2B,wHAPU,0FAKN,yCADN,6DAEF"}
|
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.
|
|
5
|
+
"version": "0.2.2",
|
|
6
6
|
"main": "dist/cjs/index.js",
|
|
7
7
|
"module": "dist/esm/index.js",
|
|
8
8
|
"types": "dist/index.d.ts",
|
|
@@ -28,24 +28,24 @@
|
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@babel/core": "^7.28.3",
|
|
31
|
-
"@babel/preset-env": "^7.
|
|
32
|
-
"@babel/preset-typescript": "^7.
|
|
33
|
-
"@rollup/plugin-commonjs": "^
|
|
31
|
+
"@babel/preset-env": "^7.29.7",
|
|
32
|
+
"@babel/preset-typescript": "^7.29.7",
|
|
33
|
+
"@rollup/plugin-commonjs": "^29.0.2",
|
|
34
34
|
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
35
|
+
"@rollup/plugin-terser": "^1.0.0",
|
|
35
36
|
"@rollup/plugin-typescript": "^11.1.5",
|
|
36
37
|
"@types/eslint": "^9",
|
|
37
38
|
"@types/jest": "^29.5.14",
|
|
38
39
|
"@types/rollup-plugin-peer-deps-external": "^2",
|
|
39
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
40
|
-
"@typescript-eslint/parser": "^8.
|
|
41
|
-
"babel-jest": "^30.
|
|
40
|
+
"@typescript-eslint/eslint-plugin": "^8.59.1",
|
|
41
|
+
"@typescript-eslint/parser": "^8.60.1",
|
|
42
|
+
"babel-jest": "^30.4.1",
|
|
42
43
|
"eslint": "^9.39.2",
|
|
43
44
|
"jest": "^29.7.0",
|
|
44
|
-
"prettier": "^3.
|
|
45
|
+
"prettier": "^3.8.3",
|
|
45
46
|
"rollup": "^4.59.0",
|
|
46
|
-
"rollup-plugin-dts": "^6.
|
|
47
|
+
"rollup-plugin-dts": "^6.4.1",
|
|
47
48
|
"rollup-plugin-peer-deps-external": "^2.2.4",
|
|
48
|
-
"rollup-plugin-terser": "^7.0.2",
|
|
49
49
|
"typescript": "^5.9.3",
|
|
50
50
|
"yalc": "^1.0.0-pre.53"
|
|
51
51
|
},
|