@sanity/client 6.7.1-canary.3 → 6.7.1-canary.4
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/csm.cjs +34 -3
- package/dist/csm.cjs.map +1 -1
- package/dist/csm.d.ts +30 -0
- package/dist/csm.js +32 -4
- package/dist/csm.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +8 -8
- package/src/csm/editIntent.ts +1 -4
- package/src/csm/index.ts +9 -2
- package/src/csm/jsonpath.test.ts +12 -19
- package/src/csm/jsonpath.ts +1 -1
- package/src/csm/sourcemap.ts +1 -5
package/dist/csm.cjs
CHANGED
|
@@ -79,9 +79,7 @@ function createEditIntentLink(studioUrl, _ref, path) {
|
|
|
79
79
|
}
|
|
80
80
|
function encodeJsonPathToUriComponent(path) {
|
|
81
81
|
const sourcePath = Array.isArray(path) ? path : parseJsonPath(path);
|
|
82
|
-
return encodeURIComponent(sourcePath.map((key, i) =>
|
|
83
|
-
// eslint-disable-next-line no-nested-ternary
|
|
84
|
-
typeof key === "number" ? "[".concat(key, "]") : i > 0 ? ".".concat(key) : key).join(""));
|
|
82
|
+
return encodeURIComponent(sourcePath.map((key, i) => typeof key === "number" ? "[".concat(key, "]") : i > 0 ? ".".concat(key) : key).join(""));
|
|
85
83
|
}
|
|
86
84
|
function isRecord(value) {
|
|
87
85
|
return typeof value === "object" && value !== null;
|
|
@@ -89,6 +87,36 @@ function isRecord(value) {
|
|
|
89
87
|
function isArray(value) {
|
|
90
88
|
return value !== null && Array.isArray(value);
|
|
91
89
|
}
|
|
90
|
+
function encode(result, csm, encoder, options) {
|
|
91
|
+
return encodeIntoResult(result, csm, encoder, options);
|
|
92
|
+
}
|
|
93
|
+
function encodeIntoResult(result, csm, encoder, options) {
|
|
94
|
+
return walkMap(result, (value, path) => {
|
|
95
|
+
if (typeof value !== "string") {
|
|
96
|
+
return value;
|
|
97
|
+
}
|
|
98
|
+
const resolveMappingResult = resolveMapping(path, csm);
|
|
99
|
+
if (!resolveMappingResult) {
|
|
100
|
+
return value;
|
|
101
|
+
}
|
|
102
|
+
const [mapping, matchedPath, pathSuffix] = resolveMappingResult;
|
|
103
|
+
if (mapping.type !== "value") {
|
|
104
|
+
return value;
|
|
105
|
+
}
|
|
106
|
+
if (mapping.source.type !== "documentValue") {
|
|
107
|
+
return value;
|
|
108
|
+
}
|
|
109
|
+
const sourceDocument = csm.documents[mapping.source.document];
|
|
110
|
+
const sourcePath = csm.paths[mapping.source.path];
|
|
111
|
+
if (options == null ? void 0 : options.keyArraySelectors) {
|
|
112
|
+
const matchPathSegments = parseJsonPath(matchedPath);
|
|
113
|
+
const sourcePathSegments = parseJsonPath(sourcePath);
|
|
114
|
+
const fullSourceSegments = sourcePathSegments.concat(path.slice(matchPathSegments.length));
|
|
115
|
+
return encoder(value, sourceDocument, fullSourceSegments);
|
|
116
|
+
}
|
|
117
|
+
return encoder(value, sourceDocument, parseJsonPath(sourcePath + pathSuffix));
|
|
118
|
+
});
|
|
119
|
+
}
|
|
92
120
|
function walkMap(value, mappingFn) {
|
|
93
121
|
let path = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
94
122
|
if (isArray(value)) {
|
|
@@ -134,8 +162,11 @@ function resolveMapping(resultPath, csm) {
|
|
|
134
162
|
return [mapping, matchedPath, pathSuffix];
|
|
135
163
|
}
|
|
136
164
|
exports.createEditIntentLink = createEditIntentLink;
|
|
165
|
+
exports.encode = encode;
|
|
166
|
+
exports.encodeIntoResult = encodeIntoResult;
|
|
137
167
|
exports.encodeJsonPathToUriComponent = encodeJsonPathToUriComponent;
|
|
138
168
|
exports.jsonPath = jsonPath;
|
|
169
|
+
exports.parseJsonPath = parseJsonPath;
|
|
139
170
|
exports.resolveMapping = resolveMapping;
|
|
140
171
|
exports.walkMap = walkMap;
|
|
141
172
|
//# sourceMappingURL=csm.cjs.map
|
package/dist/csm.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csm.cjs","sources":["../src/csm/jsonpath.ts","../src/csm/editIntent.ts","../src/csm/sourcemap.ts"],"sourcesContent":["import type { PathSegment } from './types'\n\nconst ESCAPE: Record<string, string> = {\n '\\f': '\\\\f',\n '\\n': '\\\\n',\n '\\r': '\\\\r',\n '\\t': '\\\\t',\n \"'\": \"\\\\'\",\n '\\\\': '\\\\\\\\',\n}\n\nconst UNESCAPE: Record<string, string> = {\n '\\\\f': '\\f',\n '\\\\n': '\\n',\n '\\\\r': '\\r',\n '\\\\t': '\\t',\n \"\\\\'\": \"'\",\n '\\\\\\\\': '\\\\',\n}\n\n/** @internal */\nexport function jsonPath(\n path: PathSegment[],\n opts?: {\n keyArraySelectors: boolean\n },\n): string {\n return `$${path\n .map((segment) => {\n if (typeof segment === 'string') {\n const escapedKey = segment.replace(/[\\f\\n\\r\\t'\\\\]/g, (match) => {\n return ESCAPE[match]\n })\n return `['${escapedKey}']`\n }\n\n if (typeof segment === 'number') {\n return `[${segment}]`\n }\n\n if (opts?.keyArraySelectors && segment.key !== '') {\n const escapedKey = segment.key.replace(/['\\\\]/g, (match) => {\n return ESCAPE[match]\n })\n return `[?(@._key=='${escapedKey}')]`\n }\n\n return `[${segment.index}]`\n })\n .join('')}`\n}\n\n/** @internal */\nexport function parseJsonPath(path: string): PathSegment[] {\n const parsed: PathSegment[] = []\n\n const parseRe = /\\['(.*?)'\\]|\\[(\\d+)\\]|\\[\\?\\(@\\._key=='(.*?)'\\)\\]/g\n let match: RegExpExecArray | null\n\n while ((match = parseRe.exec(path)) !== null) {\n if (match[1] !== undefined) {\n const key = match[1].replace(/\\\\(\\\\|f|n|r|t|')/g, (m) => {\n return UNESCAPE[m]\n })\n\n parsed.push(key)\n continue\n }\n\n if (match[2] !== undefined) {\n parsed.push(parseInt(match[2], 10))\n continue\n }\n\n if (match[3] !== undefined) {\n const key = match[3].replace(/\\\\(\\\\')/g, (m) => {\n return UNESCAPE[m]\n })\n\n parsed.push({\n key,\n index: -1,\n })\n continue\n }\n }\n\n return parsed\n}\n","import type {ContentSourceMapDocuments} from '../types'\nimport {parseJsonPath} from './jsonpath'\nimport type {PathSegment, StudioUrl} from './types'\n\n/** @public */\nexport type EditIntentLink = `/intent/edit/id=${string};type=${string};path=${string}`\n\n/** @public */\nexport function createEditIntentLink(\n studioUrl: StudioUrl,\n {_id, _type}: ContentSourceMapDocuments[number],\n path: string | PathSegment[],\n): `${StudioUrl}${EditIntentLink}` {\n const _studioUrl = studioUrl.replace(/\\/$/, '')\n const _path = encodeJsonPathToUriComponent(path)\n return `${_studioUrl}/intent/edit/id=${_id};type=${_type};path=${_path}`\n}\n\n/** @public */\nexport function encodeJsonPathToUriComponent(path: string | PathSegment[]): string {\n const sourcePath = Array.isArray(path) ? path : parseJsonPath(path)\n return encodeURIComponent(\n sourcePath\n .map((key, i) =>\n // eslint-disable-next-line no-nested-ternary\n typeof key === 'number' ? `[${key}]` : i > 0 ? `.${key}` : key,\n )\n .join(''),\n )\n}\n","import type {ContentSourceMap, ContentSourceMapDocuments, ContentSourceMapMapping} from '../types'\nimport {jsonPath, parseJsonPath} from './jsonpath'\nimport type {PathSegment} from './types'\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\nfunction isArray(value: unknown): value is Array<unknown> {\n return value !== null && Array.isArray(value)\n}\n\n/** @alpha */\nexport type Encoder<E> = (\n value: string,\n sourceDocument: ContentSourceMapDocuments[number],\n path: PathSegment[],\n) => E\n\n/** @alpha */\nexport function encode<R, E>(\n result: R,\n csm: ContentSourceMap,\n encoder: Encoder<E>,\n options?: {keyArraySelectors: boolean},\n): R {\n return encodeIntoResult(result, csm, encoder, options) as R\n}\n\n/** @alpha */\nexport function encodeIntoResult<R>(\n result: R,\n csm: ContentSourceMap,\n encoder: Encoder<unknown>,\n options?: {keyArraySelectors: boolean},\n): ReturnType<Encoder<unknown>> {\n return walkMap(result, (value, path) => {\n // Only map strings, we could extend this in the future to support other types like integers...\n if (typeof value !== 'string') {\n return value\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const resolveMappingResult = resolveMapping(path, csm)\n if (!resolveMappingResult) {\n return value\n }\n\n const [mapping, matchedPath, pathSuffix] = resolveMappingResult\n if (mapping.type !== 'value') {\n return value\n }\n\n if (mapping.source.type !== 'documentValue') {\n return value\n }\n\n const sourceDocument =\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n csm.documents[mapping.source.document!]\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const sourcePath = csm.paths[mapping.source.path]\n\n if (options?.keyArraySelectors) {\n const matchPathSegments = parseJsonPath(matchedPath)\n const sourcePathSegments = parseJsonPath(sourcePath)\n const fullSourceSegments = sourcePathSegments.concat(path.slice(matchPathSegments.length))\n\n return encoder(value, sourceDocument, fullSourceSegments)\n }\n\n return encoder(value, sourceDocument, parseJsonPath(sourcePath + pathSuffix))\n })\n}\n\n/** @alpha */\nexport type WalkMapFn = (value: unknown, path: PathSegment[]) => unknown\n\n/** generic way to walk a nested object or array and apply a mapping function to each value\n * @alpha\n */\nexport function walkMap(value: unknown, mappingFn: WalkMapFn, path: PathSegment[] = []): unknown {\n if (isArray(value)) {\n return value.map((v, idx) => {\n if (isRecord(v)) {\n const key = v['_key']\n if (typeof key === 'string') {\n return walkMap(v, mappingFn, path.concat({key, index: idx}))\n }\n }\n\n return walkMap(v, mappingFn, path.concat(idx))\n })\n }\n\n if (isRecord(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([k, v]) => [k, walkMap(v, mappingFn, path.concat(k))]),\n )\n }\n\n return mappingFn(value, path)\n}\n\n/** @alpha */\nexport function resolveMapping(\n resultPath: PathSegment[],\n csm: ContentSourceMap,\n): [ContentSourceMapMapping, string, string] | undefined {\n const resultJsonPath = jsonPath(resultPath)\n\n if (csm.mappings[resultJsonPath] !== undefined) {\n return [csm.mappings[resultJsonPath], resultJsonPath, '']\n }\n\n const mappings = Object.entries(csm.mappings)\n .filter(([key]) => resultJsonPath.startsWith(key))\n .sort(([key1], [key2]) => key2.length - key1.length)\n\n if (mappings.length == 0) {\n return undefined\n }\n\n const [matchedPath, mapping] = mappings[0]\n const pathSuffix = resultJsonPath.substring(matchedPath.length)\n return [mapping, matchedPath, pathSuffix]\n}\n"],"names":["ESCAPE","UNESCAPE","jsonPath","path","opts","concat","map","segment","escapedKey","replace","match","keyArraySelectors","key","index","join","parseJsonPath","parsed","parseRe","exec","m","push","parseInt","createEditIntentLink","studioUrl","_ref","_id","_type","_studioUrl","_path","encodeJsonPathToUriComponent","sourcePath","Array","isArray","encodeURIComponent","i","isRecord","value","walkMap","mappingFn","arguments","length","undefined","v","idx","Object","fromEntries","entries","_ref2","k","resolveMapping","resultPath","csm","resultJsonPath","mappings","filter","_ref3","startsWith","sort","_ref4","_ref5","key1","key2","matchedPath","mapping","pathSuffix","substring"],"mappings":";;;;;AAEA,MAAMA,MAAiC,GAAA;EACrC,IAAM,EAAA,KAAA;EACN,IAAM,EAAA,KAAA;EACN,IAAM,EAAA,KAAA;EACN,GAAM,EAAA,KAAA;EACN,GAAK,EAAA,KAAA;EACL,IAAM,EAAA;AACR,CAAA;AAEA,MAAMC,QAAmC,GAAA;EACvC,KAAO,EAAA,IAAA;EACP,KAAO,EAAA,IAAA;EACP,KAAO,EAAA,IAAA;EACP,KAAO,EAAA,GAAA;EACP,KAAO,EAAA,GAAA;EACP,MAAQ,EAAA;AACV,CAAA;AAGgB,SAAAC,QAAAA,CACdC,MACAC,IAGQ,EAAA;EACR,OAAO,GAAI,CAAAC,MAAA,CAAAF,IAAA,CACRG,GAAI,CAACC,OAAY,IAAA;IACZ,IAAA,OAAOA,YAAY,QAAU,EAAA;MAC/B,MAAMC,UAAa,GAAAD,OAAA,CAAQE,OAAQ,CAAA,gBAAA,EAAmBC,KAAU,IAAA;QAC9D,OAAOV,OAAOU,KAAK,CAAA;MAAA,CACpB,CAAA;MACD,OAAO,KAAKL,MAAU,CAAAG,UAAA,EAAA,IAAA,CAAA;IACxB;IAEI,IAAA,OAAOD,YAAY,QAAU,EAAA;MAC/B,OAAO,IAAIF,MAAO,CAAAE,OAAA,EAAA,GAAA,CAAA;IACpB;IAEA,IAAA,CAAIH,IAAM,IAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,IAAA,CAAAO,iBAAA,KAAqBJ,OAAQ,CAAAK,GAAA,KAAQ,EAAI,EAAA;MACjD,MAAMJ,aAAaD,OAAQ,CAAAK,GAAA,CAAIH,OAAQ,CAAA,QAAA,EAAWC,KAAU,IAAA;QAC1D,OAAOV,OAAOU,KAAK,CAAA;MAAA,CACpB,CAAA;MACD,OAAO,eAAeL,MAAU,CAAAG,UAAA,EAAA,KAAA,CAAA;IAClC;IAEO,OAAA,GAAA,CAAIH,eAAQQ,KAAK,EAAA,GAAA,CAAA;EAAA,CACzB,CACA,CAAAC,IAAA,CAAK,EAAE,CAAA,CAAA;AACZ;AAGO,SAASC,cAAcZ,IAA6B,EAAA;EACzD,MAAMa,SAAwB,EAAC;EAE/B,MAAMC,OAAU,GAAA,mDAAA;EACZ,IAAAP,KAAA;EAEJ,OAAA,CAAQA,KAAQ,GAAAO,OAAA,CAAQC,IAAK,CAAAf,IAAI,OAAO,IAAM,EAAA;IACxC,IAAAO,KAAA,CAAM,CAAC,CAAA,KAAM,KAAW,CAAA,EAAA;MAC1B,MAAME,MAAMF,KAAM,CAAA,CAAC,EAAED,OAAQ,CAAA,mBAAA,EAAsBU,CAAM,IAAA;QACvD,OAAOlB,SAASkB,CAAC,CAAA;MAAA,CAClB,CAAA;MAEDH,MAAA,CAAOI,KAAKR,GAAG,CAAA;MACf;IACF;IAEI,IAAAF,KAAA,CAAM,CAAC,CAAA,KAAM,KAAW,CAAA,EAAA;MAC1BM,MAAA,CAAOI,KAAKC,QAAS,CAAAX,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAC,CAAA;MAClC;IACF;IAEI,IAAAA,KAAA,CAAM,CAAC,CAAA,KAAM,KAAW,CAAA,EAAA;MAC1B,MAAME,MAAMF,KAAM,CAAA,CAAC,EAAED,OAAQ,CAAA,UAAA,EAAaU,CAAM,IAAA;QAC9C,OAAOlB,SAASkB,CAAC,CAAA;MAAA,CAClB,CAAA;MAEDH,MAAA,CAAOI,IAAK,CAAA;QACVR,GAAA;QACAC,KAAO,EAAA,CAAA;MAAA,CACR,CAAA;MACD;IACF;EACF;EAEO,OAAAG,MAAA;AACT;AChFO,SAASM,qBACdC,SACA,EAAAC,IAAA,EACArB,IACiC,EAAA;EAAA,IAFjC;IAACsB,GAAK;IAAAC;EAAA;EAGN,MAAMC,UAAa,GAAAJ,SAAA,CAAUd,OAAQ,CAAA,KAAA,EAAO,EAAE,CAAA;EACxC,MAAAmB,KAAA,GAAQC,6BAA6B1B,IAAI,CAAA;EAC/C,OAAO,GAAGE,MAAU,CAAAsB,UAAA,EAAA,kBAAA,CAAA,CAAmBtB,MAAG,CAAAoB,GAAA,EAAA,QAAA,CAAA,CAASpB,cAAK,QAAS,CAAA,CAAAA,MAAA,CAAAuB,KAAA,CAAA;AACnE;AAGO,SAASC,6BAA6B1B,IAAsC,EAAA;EACjF,MAAM2B,aAAaC,KAAM,CAAAC,OAAA,CAAQ7B,IAAI,CAAI,GAAAA,IAAA,GAAOY,cAAcZ,IAAI,CAAA;EAC3D,OAAA8B,kBAAA,CACLH,UACG,CAAAxB,GAAA,CAAI,CAACM,GAAK,EAAAsB,CAAA;EAAA;EAET,OAAOtB,QAAQ,QAAW,GAAA,GAAA,CAAIP,YAAG,GAAM,CAAA,GAAA6B,CAAA,GAAI,CAAI,GAAA,GAAA,CAAI7B,MAAQ,CAAAO,GAAA,CAAA,GAAAA,GAAA,CAC7D,CACCE,KAAK,EAAE,CAAA,CACZ;AACF;ACzBA,SAASqB,SAASC,KAAkD,EAAA;EAC3D,OAAA,OAAOA,KAAU,KAAA,QAAA,IAAYA,KAAU,KAAA,IAAA;AAChD;AAEA,SAASJ,QAAQI,KAAyC,EAAA;EACxD,OAAOA,KAAU,KAAA,IAAA,IAAQL,KAAM,CAAAC,OAAA,CAAQI,KAAK,CAAA;AAC9C;AAuEO,SAASC,OAAQA,CAAAD,KAAA,EAAgBE,SAAsB,EAAmC;EAAA,IAAnCnC,IAAA,GAAAoC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAsB,EAAa;EAC3F,IAAAP,OAAA,CAAQI,KAAK,CAAG,EAAA;IAClB,OAAOA,KAAM,CAAA9B,GAAA,CAAI,CAACoC,CAAA,EAAGC,GAAQ,KAAA;MACvB,IAAAR,QAAA,CAASO,CAAC,CAAG,EAAA;QACT,MAAA9B,GAAA,GAAM8B,EAAE,MAAM,CAAA;QAChB,IAAA,OAAO9B,QAAQ,QAAU,EAAA;UACpB,OAAAyB,OAAA,CAAQK,CAAG,EAAAJ,SAAA,EAAWnC,IAAK,CAAAE,MAAA,CAAO;YAACO,GAAK;YAAAC,KAAA,EAAO8B;UAAI,CAAA,CAAC,CAAA;QAC7D;MACF;MAEA,OAAON,QAAQK,CAAG,EAAAJ,SAAA,EAAWnC,IAAK,CAAAE,MAAA,CAAOsC,GAAG,CAAC,CAAA;IAAA,CAC9C,CAAA;EACH;EAEI,IAAAR,QAAA,CAASC,KAAK,CAAG,EAAA;IACnB,OAAOQ,MAAO,CAAAC,WAAA,CACZD,MAAA,CAAOE,QAAQV,KAAK,CAAA,CAAE9B,IAAIyC,KAAA;MAAA,IAAC,CAACC,GAAGN,CAAC,CAAA,GAAAK,KAAA;MAAA,OAAM,CAACC,CAAG,EAAAX,OAAA,CAAQK,GAAGJ,SAAW,EAAAnC,IAAA,CAAKE,OAAO2C,CAAC,CAAC,CAAC,CAAC;IAAA,EAAA,CAClF;EACF;EAEO,OAAAV,SAAA,CAAUF,OAAOjC,IAAI,CAAA;AAC9B;AAGgB,SAAA8C,cAAAA,CACdC,YACAC,GACuD,EAAA;EACjD,MAAAC,cAAA,GAAiBlD,SAASgD,UAAU,CAAA;EAE1C,IAAIC,GAAI,CAAAE,QAAA,CAASD,cAAc,CAAA,KAAM,KAAW,CAAA,EAAA;IAC9C,OAAO,CAACD,GAAI,CAAAE,QAAA,CAASD,cAAc,CAAA,EAAGA,gBAAgB,EAAE,CAAA;EAC1D;EAEM,MAAAC,QAAA,GAAWT,MAAO,CAAAE,OAAA,CAAQK,GAAI,CAAAE,QAAQ,CACzC,CAAAC,MAAA,CAAOC,KAAA;IAAA,IAAC,CAAC3C,GAAG,CAAA,GAAA2C,KAAA;IAAA,OAAMH,cAAe,CAAAI,UAAA,CAAW5C,GAAG,CAAC;EAAA,EAChD,CAAA6C,IAAA,CAAK,CAAAC,KAAA,EAAAC,KAAA;IAAA,IAAC,CAACC,IAAI,CAAA,GAAAF,KAAA;IAAA,IAAG,CAACG,IAAI,CAAM,GAAAF,KAAA;IAAA,OAAAE,IAAA,CAAKrB,MAAS,GAAAoB,IAAA,CAAKpB,MAAM;EAAA,EAAA;EAEjD,IAAAa,QAAA,CAASb,UAAU,CAAG,EAAA;IACjB,OAAA,KAAA,CAAA;EACT;EAEA,MAAM,CAACsB,WAAA,EAAaC,OAAO,CAAA,GAAIV,SAAS,CAAC,CAAA;EACzC,MAAMW,UAAa,GAAAZ,cAAA,CAAea,SAAU,CAAAH,WAAA,CAAYtB,MAAM,CAAA;EACvD,OAAA,CAACuB,OAAS,EAAAD,WAAA,EAAaE,UAAU,CAAA;AAC1C;;;;;"}
|
|
1
|
+
{"version":3,"file":"csm.cjs","sources":["../src/csm/jsonpath.ts","../src/csm/editIntent.ts","../src/csm/sourcemap.ts"],"sourcesContent":["import type {PathSegment} from './types'\n\nconst ESCAPE: Record<string, string> = {\n '\\f': '\\\\f',\n '\\n': '\\\\n',\n '\\r': '\\\\r',\n '\\t': '\\\\t',\n \"'\": \"\\\\'\",\n '\\\\': '\\\\\\\\',\n}\n\nconst UNESCAPE: Record<string, string> = {\n '\\\\f': '\\f',\n '\\\\n': '\\n',\n '\\\\r': '\\r',\n '\\\\t': '\\t',\n \"\\\\'\": \"'\",\n '\\\\\\\\': '\\\\',\n}\n\n/** @internal */\nexport function jsonPath(\n path: PathSegment[],\n opts?: {\n keyArraySelectors: boolean\n },\n): string {\n return `$${path\n .map((segment) => {\n if (typeof segment === 'string') {\n const escapedKey = segment.replace(/[\\f\\n\\r\\t'\\\\]/g, (match) => {\n return ESCAPE[match]\n })\n return `['${escapedKey}']`\n }\n\n if (typeof segment === 'number') {\n return `[${segment}]`\n }\n\n if (opts?.keyArraySelectors && segment.key !== '') {\n const escapedKey = segment.key.replace(/['\\\\]/g, (match) => {\n return ESCAPE[match]\n })\n return `[?(@._key=='${escapedKey}')]`\n }\n\n return `[${segment.index}]`\n })\n .join('')}`\n}\n\n/** @internal */\nexport function parseJsonPath(path: string): PathSegment[] {\n const parsed: PathSegment[] = []\n\n const parseRe = /\\['(.*?)'\\]|\\[(\\d+)\\]|\\[\\?\\(@\\._key=='(.*?)'\\)\\]/g\n let match: RegExpExecArray | null\n\n while ((match = parseRe.exec(path)) !== null) {\n if (match[1] !== undefined) {\n const key = match[1].replace(/\\\\(\\\\|f|n|r|t|')/g, (m) => {\n return UNESCAPE[m]\n })\n\n parsed.push(key)\n continue\n }\n\n if (match[2] !== undefined) {\n parsed.push(parseInt(match[2], 10))\n continue\n }\n\n if (match[3] !== undefined) {\n const key = match[3].replace(/\\\\(\\\\')/g, (m) => {\n return UNESCAPE[m]\n })\n\n parsed.push({\n key,\n index: -1,\n })\n continue\n }\n }\n\n return parsed\n}\n","import type {ContentSourceMapDocuments} from '../types'\nimport {parseJsonPath} from './jsonpath'\nimport type {PathSegment, StudioUrl} from './types'\n\n/** @public */\nexport type EditIntentLink = `/intent/edit/id=${string};type=${string};path=${string}`\n\n/** @public */\nexport function createEditIntentLink(\n studioUrl: StudioUrl,\n {_id, _type}: ContentSourceMapDocuments[number],\n path: string | PathSegment[],\n): `${StudioUrl}${EditIntentLink}` {\n const _studioUrl = studioUrl.replace(/\\/$/, '')\n const _path = encodeJsonPathToUriComponent(path)\n return `${_studioUrl}/intent/edit/id=${_id};type=${_type};path=${_path}`\n}\n\n/** @public */\nexport function encodeJsonPathToUriComponent(path: string | PathSegment[]): string {\n const sourcePath = Array.isArray(path) ? path : parseJsonPath(path)\n return encodeURIComponent(\n sourcePath\n .map((key, i) => (typeof key === 'number' ? `[${key}]` : i > 0 ? `.${key}` : key))\n .join(''),\n )\n}\n","import type {ContentSourceMap, ContentSourceMapDocuments, ContentSourceMapMapping} from '../types'\nimport {jsonPath, parseJsonPath} from './jsonpath'\nimport type {PathSegment} from './types'\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\nfunction isArray(value: unknown): value is Array<unknown> {\n return value !== null && Array.isArray(value)\n}\n\n/** @alpha */\nexport type Encoder<E> = (\n value: string,\n sourceDocument: ContentSourceMapDocuments[number],\n path: PathSegment[],\n) => E\n\n/** @alpha */\nexport function encode<R, E>(\n result: R,\n csm: ContentSourceMap,\n encoder: Encoder<E>,\n options?: {keyArraySelectors: boolean},\n): R {\n return encodeIntoResult(result, csm, encoder, options) as R\n}\n\n/** @alpha */\nexport function encodeIntoResult<R>(\n result: R,\n csm: ContentSourceMap,\n encoder: Encoder<unknown>,\n options?: {keyArraySelectors: boolean},\n): ReturnType<Encoder<unknown>> {\n return walkMap(result, (value, path) => {\n // Only map strings, we could extend this in the future to support other types like integers...\n if (typeof value !== 'string') {\n return value\n }\n\n const resolveMappingResult = resolveMapping(path, csm)\n if (!resolveMappingResult) {\n return value\n }\n\n const [mapping, matchedPath, pathSuffix] = resolveMappingResult\n if (mapping.type !== 'value') {\n return value\n }\n\n if (mapping.source.type !== 'documentValue') {\n return value\n }\n\n const sourceDocument = csm.documents[mapping.source.document!]\n const sourcePath = csm.paths[mapping.source.path]\n\n if (options?.keyArraySelectors) {\n const matchPathSegments = parseJsonPath(matchedPath)\n const sourcePathSegments = parseJsonPath(sourcePath)\n const fullSourceSegments = sourcePathSegments.concat(path.slice(matchPathSegments.length))\n\n return encoder(value, sourceDocument, fullSourceSegments)\n }\n\n return encoder(value, sourceDocument, parseJsonPath(sourcePath + pathSuffix))\n })\n}\n\n/** @alpha */\nexport type WalkMapFn = (value: unknown, path: PathSegment[]) => unknown\n\n/** generic way to walk a nested object or array and apply a mapping function to each value\n * @alpha\n */\nexport function walkMap(value: unknown, mappingFn: WalkMapFn, path: PathSegment[] = []): unknown {\n if (isArray(value)) {\n return value.map((v, idx) => {\n if (isRecord(v)) {\n const key = v['_key']\n if (typeof key === 'string') {\n return walkMap(v, mappingFn, path.concat({key, index: idx}))\n }\n }\n\n return walkMap(v, mappingFn, path.concat(idx))\n })\n }\n\n if (isRecord(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([k, v]) => [k, walkMap(v, mappingFn, path.concat(k))]),\n )\n }\n\n return mappingFn(value, path)\n}\n\n/** @alpha */\nexport function resolveMapping(\n resultPath: PathSegment[],\n csm: ContentSourceMap,\n): [ContentSourceMapMapping, string, string] | undefined {\n const resultJsonPath = jsonPath(resultPath)\n\n if (csm.mappings[resultJsonPath] !== undefined) {\n return [csm.mappings[resultJsonPath], resultJsonPath, '']\n }\n\n const mappings = Object.entries(csm.mappings)\n .filter(([key]) => resultJsonPath.startsWith(key))\n .sort(([key1], [key2]) => key2.length - key1.length)\n\n if (mappings.length == 0) {\n return undefined\n }\n\n const [matchedPath, mapping] = mappings[0]\n const pathSuffix = resultJsonPath.substring(matchedPath.length)\n return [mapping, matchedPath, pathSuffix]\n}\n"],"names":["ESCAPE","UNESCAPE","jsonPath","path","opts","concat","map","segment","escapedKey","replace","match","keyArraySelectors","key","index","join","parseJsonPath","parsed","parseRe","exec","m","push","parseInt","createEditIntentLink","studioUrl","_ref","_id","_type","_studioUrl","_path","encodeJsonPathToUriComponent","sourcePath","Array","isArray","encodeURIComponent","i","isRecord","value","encode","result","csm","encoder","options","encodeIntoResult","walkMap","resolveMappingResult","resolveMapping","mapping","matchedPath","pathSuffix","type","source","sourceDocument","documents","document","paths","matchPathSegments","sourcePathSegments","fullSourceSegments","slice","length","mappingFn","arguments","undefined","v","idx","Object","fromEntries","entries","_ref2","k","resultPath","resultJsonPath","mappings","filter","_ref3","startsWith","sort","_ref4","_ref5","key1","key2","substring"],"mappings":"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"}
|
package/dist/csm.d.ts
CHANGED
|
@@ -92,9 +92,36 @@ export declare function createEditIntentLink(
|
|
|
92
92
|
/** @public */
|
|
93
93
|
export declare type EditIntentLink = `/intent/edit/id=${string};type=${string};path=${string}`
|
|
94
94
|
|
|
95
|
+
/** @alpha */
|
|
96
|
+
export declare function encode<R, E>(
|
|
97
|
+
result: R,
|
|
98
|
+
csm: ContentSourceMap,
|
|
99
|
+
encoder: Encoder<E>,
|
|
100
|
+
options?: {
|
|
101
|
+
keyArraySelectors: boolean
|
|
102
|
+
},
|
|
103
|
+
): R
|
|
104
|
+
|
|
105
|
+
/** @alpha */
|
|
106
|
+
export declare function encodeIntoResult<R>(
|
|
107
|
+
result: R,
|
|
108
|
+
csm: ContentSourceMap,
|
|
109
|
+
encoder: Encoder<unknown>,
|
|
110
|
+
options?: {
|
|
111
|
+
keyArraySelectors: boolean
|
|
112
|
+
},
|
|
113
|
+
): ReturnType<Encoder<unknown>>
|
|
114
|
+
|
|
95
115
|
/** @public */
|
|
96
116
|
export declare function encodeJsonPathToUriComponent(path: string | PathSegment[]): string
|
|
97
117
|
|
|
118
|
+
/** @alpha */
|
|
119
|
+
export declare type Encoder<E> = (
|
|
120
|
+
value: string,
|
|
121
|
+
sourceDocument: ContentSourceMapDocuments[number],
|
|
122
|
+
path: PathSegment[],
|
|
123
|
+
) => E
|
|
124
|
+
|
|
98
125
|
/** @internal */
|
|
99
126
|
export declare function jsonPath(
|
|
100
127
|
path: PathSegment[],
|
|
@@ -109,6 +136,9 @@ export declare type KeyedSegment = {
|
|
|
109
136
|
index: number
|
|
110
137
|
}
|
|
111
138
|
|
|
139
|
+
/** @internal */
|
|
140
|
+
export declare function parseJsonPath(path: string): PathSegment[]
|
|
141
|
+
|
|
112
142
|
/** @public */
|
|
113
143
|
export declare type PathSegment = string | number | KeyedSegment
|
|
114
144
|
|
package/dist/csm.js
CHANGED
|
@@ -74,9 +74,7 @@ function createEditIntentLink(studioUrl, _ref, path) {
|
|
|
74
74
|
}
|
|
75
75
|
function encodeJsonPathToUriComponent(path) {
|
|
76
76
|
const sourcePath = Array.isArray(path) ? path : parseJsonPath(path);
|
|
77
|
-
return encodeURIComponent(sourcePath.map((key, i) =>
|
|
78
|
-
// eslint-disable-next-line no-nested-ternary
|
|
79
|
-
typeof key === "number" ? "[".concat(key, "]") : i > 0 ? ".".concat(key) : key).join(""));
|
|
77
|
+
return encodeURIComponent(sourcePath.map((key, i) => typeof key === "number" ? "[".concat(key, "]") : i > 0 ? ".".concat(key) : key).join(""));
|
|
80
78
|
}
|
|
81
79
|
function isRecord(value) {
|
|
82
80
|
return typeof value === "object" && value !== null;
|
|
@@ -84,6 +82,36 @@ function isRecord(value) {
|
|
|
84
82
|
function isArray(value) {
|
|
85
83
|
return value !== null && Array.isArray(value);
|
|
86
84
|
}
|
|
85
|
+
function encode(result, csm, encoder, options) {
|
|
86
|
+
return encodeIntoResult(result, csm, encoder, options);
|
|
87
|
+
}
|
|
88
|
+
function encodeIntoResult(result, csm, encoder, options) {
|
|
89
|
+
return walkMap(result, (value, path) => {
|
|
90
|
+
if (typeof value !== "string") {
|
|
91
|
+
return value;
|
|
92
|
+
}
|
|
93
|
+
const resolveMappingResult = resolveMapping(path, csm);
|
|
94
|
+
if (!resolveMappingResult) {
|
|
95
|
+
return value;
|
|
96
|
+
}
|
|
97
|
+
const [mapping, matchedPath, pathSuffix] = resolveMappingResult;
|
|
98
|
+
if (mapping.type !== "value") {
|
|
99
|
+
return value;
|
|
100
|
+
}
|
|
101
|
+
if (mapping.source.type !== "documentValue") {
|
|
102
|
+
return value;
|
|
103
|
+
}
|
|
104
|
+
const sourceDocument = csm.documents[mapping.source.document];
|
|
105
|
+
const sourcePath = csm.paths[mapping.source.path];
|
|
106
|
+
if (options == null ? void 0 : options.keyArraySelectors) {
|
|
107
|
+
const matchPathSegments = parseJsonPath(matchedPath);
|
|
108
|
+
const sourcePathSegments = parseJsonPath(sourcePath);
|
|
109
|
+
const fullSourceSegments = sourcePathSegments.concat(path.slice(matchPathSegments.length));
|
|
110
|
+
return encoder(value, sourceDocument, fullSourceSegments);
|
|
111
|
+
}
|
|
112
|
+
return encoder(value, sourceDocument, parseJsonPath(sourcePath + pathSuffix));
|
|
113
|
+
});
|
|
114
|
+
}
|
|
87
115
|
function walkMap(value, mappingFn) {
|
|
88
116
|
let path = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
89
117
|
if (isArray(value)) {
|
|
@@ -128,5 +156,5 @@ function resolveMapping(resultPath, csm) {
|
|
|
128
156
|
const pathSuffix = resultJsonPath.substring(matchedPath.length);
|
|
129
157
|
return [mapping, matchedPath, pathSuffix];
|
|
130
158
|
}
|
|
131
|
-
export { createEditIntentLink, encodeJsonPathToUriComponent, jsonPath, resolveMapping, walkMap };
|
|
159
|
+
export { createEditIntentLink, encode, encodeIntoResult, encodeJsonPathToUriComponent, jsonPath, parseJsonPath, resolveMapping, walkMap };
|
|
132
160
|
//# sourceMappingURL=csm.js.map
|
package/dist/csm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csm.js","sources":["../src/csm/jsonpath.ts","../src/csm/editIntent.ts","../src/csm/sourcemap.ts"],"sourcesContent":["import type { PathSegment } from './types'\n\nconst ESCAPE: Record<string, string> = {\n '\\f': '\\\\f',\n '\\n': '\\\\n',\n '\\r': '\\\\r',\n '\\t': '\\\\t',\n \"'\": \"\\\\'\",\n '\\\\': '\\\\\\\\',\n}\n\nconst UNESCAPE: Record<string, string> = {\n '\\\\f': '\\f',\n '\\\\n': '\\n',\n '\\\\r': '\\r',\n '\\\\t': '\\t',\n \"\\\\'\": \"'\",\n '\\\\\\\\': '\\\\',\n}\n\n/** @internal */\nexport function jsonPath(\n path: PathSegment[],\n opts?: {\n keyArraySelectors: boolean\n },\n): string {\n return `$${path\n .map((segment) => {\n if (typeof segment === 'string') {\n const escapedKey = segment.replace(/[\\f\\n\\r\\t'\\\\]/g, (match) => {\n return ESCAPE[match]\n })\n return `['${escapedKey}']`\n }\n\n if (typeof segment === 'number') {\n return `[${segment}]`\n }\n\n if (opts?.keyArraySelectors && segment.key !== '') {\n const escapedKey = segment.key.replace(/['\\\\]/g, (match) => {\n return ESCAPE[match]\n })\n return `[?(@._key=='${escapedKey}')]`\n }\n\n return `[${segment.index}]`\n })\n .join('')}`\n}\n\n/** @internal */\nexport function parseJsonPath(path: string): PathSegment[] {\n const parsed: PathSegment[] = []\n\n const parseRe = /\\['(.*?)'\\]|\\[(\\d+)\\]|\\[\\?\\(@\\._key=='(.*?)'\\)\\]/g\n let match: RegExpExecArray | null\n\n while ((match = parseRe.exec(path)) !== null) {\n if (match[1] !== undefined) {\n const key = match[1].replace(/\\\\(\\\\|f|n|r|t|')/g, (m) => {\n return UNESCAPE[m]\n })\n\n parsed.push(key)\n continue\n }\n\n if (match[2] !== undefined) {\n parsed.push(parseInt(match[2], 10))\n continue\n }\n\n if (match[3] !== undefined) {\n const key = match[3].replace(/\\\\(\\\\')/g, (m) => {\n return UNESCAPE[m]\n })\n\n parsed.push({\n key,\n index: -1,\n })\n continue\n }\n }\n\n return parsed\n}\n","import type {ContentSourceMapDocuments} from '../types'\nimport {parseJsonPath} from './jsonpath'\nimport type {PathSegment, StudioUrl} from './types'\n\n/** @public */\nexport type EditIntentLink = `/intent/edit/id=${string};type=${string};path=${string}`\n\n/** @public */\nexport function createEditIntentLink(\n studioUrl: StudioUrl,\n {_id, _type}: ContentSourceMapDocuments[number],\n path: string | PathSegment[],\n): `${StudioUrl}${EditIntentLink}` {\n const _studioUrl = studioUrl.replace(/\\/$/, '')\n const _path = encodeJsonPathToUriComponent(path)\n return `${_studioUrl}/intent/edit/id=${_id};type=${_type};path=${_path}`\n}\n\n/** @public */\nexport function encodeJsonPathToUriComponent(path: string | PathSegment[]): string {\n const sourcePath = Array.isArray(path) ? path : parseJsonPath(path)\n return encodeURIComponent(\n sourcePath\n .map((key, i) =>\n // eslint-disable-next-line no-nested-ternary\n typeof key === 'number' ? `[${key}]` : i > 0 ? `.${key}` : key,\n )\n .join(''),\n )\n}\n","import type {ContentSourceMap, ContentSourceMapDocuments, ContentSourceMapMapping} from '../types'\nimport {jsonPath, parseJsonPath} from './jsonpath'\nimport type {PathSegment} from './types'\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\nfunction isArray(value: unknown): value is Array<unknown> {\n return value !== null && Array.isArray(value)\n}\n\n/** @alpha */\nexport type Encoder<E> = (\n value: string,\n sourceDocument: ContentSourceMapDocuments[number],\n path: PathSegment[],\n) => E\n\n/** @alpha */\nexport function encode<R, E>(\n result: R,\n csm: ContentSourceMap,\n encoder: Encoder<E>,\n options?: {keyArraySelectors: boolean},\n): R {\n return encodeIntoResult(result, csm, encoder, options) as R\n}\n\n/** @alpha */\nexport function encodeIntoResult<R>(\n result: R,\n csm: ContentSourceMap,\n encoder: Encoder<unknown>,\n options?: {keyArraySelectors: boolean},\n): ReturnType<Encoder<unknown>> {\n return walkMap(result, (value, path) => {\n // Only map strings, we could extend this in the future to support other types like integers...\n if (typeof value !== 'string') {\n return value\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const resolveMappingResult = resolveMapping(path, csm)\n if (!resolveMappingResult) {\n return value\n }\n\n const [mapping, matchedPath, pathSuffix] = resolveMappingResult\n if (mapping.type !== 'value') {\n return value\n }\n\n if (mapping.source.type !== 'documentValue') {\n return value\n }\n\n const sourceDocument =\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n csm.documents[mapping.source.document!]\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const sourcePath = csm.paths[mapping.source.path]\n\n if (options?.keyArraySelectors) {\n const matchPathSegments = parseJsonPath(matchedPath)\n const sourcePathSegments = parseJsonPath(sourcePath)\n const fullSourceSegments = sourcePathSegments.concat(path.slice(matchPathSegments.length))\n\n return encoder(value, sourceDocument, fullSourceSegments)\n }\n\n return encoder(value, sourceDocument, parseJsonPath(sourcePath + pathSuffix))\n })\n}\n\n/** @alpha */\nexport type WalkMapFn = (value: unknown, path: PathSegment[]) => unknown\n\n/** generic way to walk a nested object or array and apply a mapping function to each value\n * @alpha\n */\nexport function walkMap(value: unknown, mappingFn: WalkMapFn, path: PathSegment[] = []): unknown {\n if (isArray(value)) {\n return value.map((v, idx) => {\n if (isRecord(v)) {\n const key = v['_key']\n if (typeof key === 'string') {\n return walkMap(v, mappingFn, path.concat({key, index: idx}))\n }\n }\n\n return walkMap(v, mappingFn, path.concat(idx))\n })\n }\n\n if (isRecord(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([k, v]) => [k, walkMap(v, mappingFn, path.concat(k))]),\n )\n }\n\n return mappingFn(value, path)\n}\n\n/** @alpha */\nexport function resolveMapping(\n resultPath: PathSegment[],\n csm: ContentSourceMap,\n): [ContentSourceMapMapping, string, string] | undefined {\n const resultJsonPath = jsonPath(resultPath)\n\n if (csm.mappings[resultJsonPath] !== undefined) {\n return [csm.mappings[resultJsonPath], resultJsonPath, '']\n }\n\n const mappings = Object.entries(csm.mappings)\n .filter(([key]) => resultJsonPath.startsWith(key))\n .sort(([key1], [key2]) => key2.length - key1.length)\n\n if (mappings.length == 0) {\n return undefined\n }\n\n const [matchedPath, mapping] = mappings[0]\n const pathSuffix = resultJsonPath.substring(matchedPath.length)\n return [mapping, matchedPath, pathSuffix]\n}\n"],"names":["ESCAPE","UNESCAPE","jsonPath","path","opts","concat","map","segment","escapedKey","replace","match","keyArraySelectors","key","index","join","parseJsonPath","parsed","parseRe","exec","m","push","parseInt","createEditIntentLink","studioUrl","_ref","_id","_type","_studioUrl","_path","encodeJsonPathToUriComponent","sourcePath","Array","isArray","encodeURIComponent","i","isRecord","value","walkMap","mappingFn","arguments","length","undefined","v","idx","Object","fromEntries","entries","_ref2","k","resolveMapping","resultPath","csm","resultJsonPath","mappings","filter","_ref3","startsWith","sort","_ref4","_ref5","key1","key2","matchedPath","mapping","pathSuffix","substring"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"csm.js","sources":["../src/csm/jsonpath.ts","../src/csm/editIntent.ts","../src/csm/sourcemap.ts"],"sourcesContent":["import type {PathSegment} from './types'\n\nconst ESCAPE: Record<string, string> = {\n '\\f': '\\\\f',\n '\\n': '\\\\n',\n '\\r': '\\\\r',\n '\\t': '\\\\t',\n \"'\": \"\\\\'\",\n '\\\\': '\\\\\\\\',\n}\n\nconst UNESCAPE: Record<string, string> = {\n '\\\\f': '\\f',\n '\\\\n': '\\n',\n '\\\\r': '\\r',\n '\\\\t': '\\t',\n \"\\\\'\": \"'\",\n '\\\\\\\\': '\\\\',\n}\n\n/** @internal */\nexport function jsonPath(\n path: PathSegment[],\n opts?: {\n keyArraySelectors: boolean\n },\n): string {\n return `$${path\n .map((segment) => {\n if (typeof segment === 'string') {\n const escapedKey = segment.replace(/[\\f\\n\\r\\t'\\\\]/g, (match) => {\n return ESCAPE[match]\n })\n return `['${escapedKey}']`\n }\n\n if (typeof segment === 'number') {\n return `[${segment}]`\n }\n\n if (opts?.keyArraySelectors && segment.key !== '') {\n const escapedKey = segment.key.replace(/['\\\\]/g, (match) => {\n return ESCAPE[match]\n })\n return `[?(@._key=='${escapedKey}')]`\n }\n\n return `[${segment.index}]`\n })\n .join('')}`\n}\n\n/** @internal */\nexport function parseJsonPath(path: string): PathSegment[] {\n const parsed: PathSegment[] = []\n\n const parseRe = /\\['(.*?)'\\]|\\[(\\d+)\\]|\\[\\?\\(@\\._key=='(.*?)'\\)\\]/g\n let match: RegExpExecArray | null\n\n while ((match = parseRe.exec(path)) !== null) {\n if (match[1] !== undefined) {\n const key = match[1].replace(/\\\\(\\\\|f|n|r|t|')/g, (m) => {\n return UNESCAPE[m]\n })\n\n parsed.push(key)\n continue\n }\n\n if (match[2] !== undefined) {\n parsed.push(parseInt(match[2], 10))\n continue\n }\n\n if (match[3] !== undefined) {\n const key = match[3].replace(/\\\\(\\\\')/g, (m) => {\n return UNESCAPE[m]\n })\n\n parsed.push({\n key,\n index: -1,\n })\n continue\n }\n }\n\n return parsed\n}\n","import type {ContentSourceMapDocuments} from '../types'\nimport {parseJsonPath} from './jsonpath'\nimport type {PathSegment, StudioUrl} from './types'\n\n/** @public */\nexport type EditIntentLink = `/intent/edit/id=${string};type=${string};path=${string}`\n\n/** @public */\nexport function createEditIntentLink(\n studioUrl: StudioUrl,\n {_id, _type}: ContentSourceMapDocuments[number],\n path: string | PathSegment[],\n): `${StudioUrl}${EditIntentLink}` {\n const _studioUrl = studioUrl.replace(/\\/$/, '')\n const _path = encodeJsonPathToUriComponent(path)\n return `${_studioUrl}/intent/edit/id=${_id};type=${_type};path=${_path}`\n}\n\n/** @public */\nexport function encodeJsonPathToUriComponent(path: string | PathSegment[]): string {\n const sourcePath = Array.isArray(path) ? path : parseJsonPath(path)\n return encodeURIComponent(\n sourcePath\n .map((key, i) => (typeof key === 'number' ? `[${key}]` : i > 0 ? `.${key}` : key))\n .join(''),\n )\n}\n","import type {ContentSourceMap, ContentSourceMapDocuments, ContentSourceMapMapping} from '../types'\nimport {jsonPath, parseJsonPath} from './jsonpath'\nimport type {PathSegment} from './types'\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\nfunction isArray(value: unknown): value is Array<unknown> {\n return value !== null && Array.isArray(value)\n}\n\n/** @alpha */\nexport type Encoder<E> = (\n value: string,\n sourceDocument: ContentSourceMapDocuments[number],\n path: PathSegment[],\n) => E\n\n/** @alpha */\nexport function encode<R, E>(\n result: R,\n csm: ContentSourceMap,\n encoder: Encoder<E>,\n options?: {keyArraySelectors: boolean},\n): R {\n return encodeIntoResult(result, csm, encoder, options) as R\n}\n\n/** @alpha */\nexport function encodeIntoResult<R>(\n result: R,\n csm: ContentSourceMap,\n encoder: Encoder<unknown>,\n options?: {keyArraySelectors: boolean},\n): ReturnType<Encoder<unknown>> {\n return walkMap(result, (value, path) => {\n // Only map strings, we could extend this in the future to support other types like integers...\n if (typeof value !== 'string') {\n return value\n }\n\n const resolveMappingResult = resolveMapping(path, csm)\n if (!resolveMappingResult) {\n return value\n }\n\n const [mapping, matchedPath, pathSuffix] = resolveMappingResult\n if (mapping.type !== 'value') {\n return value\n }\n\n if (mapping.source.type !== 'documentValue') {\n return value\n }\n\n const sourceDocument = csm.documents[mapping.source.document!]\n const sourcePath = csm.paths[mapping.source.path]\n\n if (options?.keyArraySelectors) {\n const matchPathSegments = parseJsonPath(matchedPath)\n const sourcePathSegments = parseJsonPath(sourcePath)\n const fullSourceSegments = sourcePathSegments.concat(path.slice(matchPathSegments.length))\n\n return encoder(value, sourceDocument, fullSourceSegments)\n }\n\n return encoder(value, sourceDocument, parseJsonPath(sourcePath + pathSuffix))\n })\n}\n\n/** @alpha */\nexport type WalkMapFn = (value: unknown, path: PathSegment[]) => unknown\n\n/** generic way to walk a nested object or array and apply a mapping function to each value\n * @alpha\n */\nexport function walkMap(value: unknown, mappingFn: WalkMapFn, path: PathSegment[] = []): unknown {\n if (isArray(value)) {\n return value.map((v, idx) => {\n if (isRecord(v)) {\n const key = v['_key']\n if (typeof key === 'string') {\n return walkMap(v, mappingFn, path.concat({key, index: idx}))\n }\n }\n\n return walkMap(v, mappingFn, path.concat(idx))\n })\n }\n\n if (isRecord(value)) {\n return Object.fromEntries(\n Object.entries(value).map(([k, v]) => [k, walkMap(v, mappingFn, path.concat(k))]),\n )\n }\n\n return mappingFn(value, path)\n}\n\n/** @alpha */\nexport function resolveMapping(\n resultPath: PathSegment[],\n csm: ContentSourceMap,\n): [ContentSourceMapMapping, string, string] | undefined {\n const resultJsonPath = jsonPath(resultPath)\n\n if (csm.mappings[resultJsonPath] !== undefined) {\n return [csm.mappings[resultJsonPath], resultJsonPath, '']\n }\n\n const mappings = Object.entries(csm.mappings)\n .filter(([key]) => resultJsonPath.startsWith(key))\n .sort(([key1], [key2]) => key2.length - key1.length)\n\n if (mappings.length == 0) {\n return undefined\n }\n\n const [matchedPath, mapping] = mappings[0]\n const pathSuffix = resultJsonPath.substring(matchedPath.length)\n return [mapping, matchedPath, pathSuffix]\n}\n"],"names":["ESCAPE","UNESCAPE","jsonPath","path","opts","concat","map","segment","escapedKey","replace","match","keyArraySelectors","key","index","join","parseJsonPath","parsed","parseRe","exec","m","push","parseInt","createEditIntentLink","studioUrl","_ref","_id","_type","_studioUrl","_path","encodeJsonPathToUriComponent","sourcePath","Array","isArray","encodeURIComponent","i","isRecord","value","encode","result","csm","encoder","options","encodeIntoResult","walkMap","resolveMappingResult","resolveMapping","mapping","matchedPath","pathSuffix","type","source","sourceDocument","documents","document","paths","matchPathSegments","sourcePathSegments","fullSourceSegments","slice","length","mappingFn","arguments","undefined","v","idx","Object","fromEntries","entries","_ref2","k","resultPath","resultJsonPath","mappings","filter","_ref3","startsWith","sort","_ref4","_ref5","key1","key2","substring"],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -8,7 +8,7 @@ var getIt = require('get-it');
|
|
|
8
8
|
var rxjs = require('rxjs');
|
|
9
9
|
var operators = require('rxjs/operators');
|
|
10
10
|
var name = "@sanity/client";
|
|
11
|
-
var version = "6.7.1-canary.
|
|
11
|
+
var version = "6.7.1-canary.4";
|
|
12
12
|
const middleware = [middleware$1.debug({
|
|
13
13
|
verbose: true,
|
|
14
14
|
namespace: "sanity:client"
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@ export { adapter as unstable__adapter, environment as unstable__environment } fr
|
|
|
4
4
|
import { Observable, lastValueFrom } from 'rxjs';
|
|
5
5
|
import { map, filter } from 'rxjs/operators';
|
|
6
6
|
var name = "@sanity/client";
|
|
7
|
-
var version = "6.7.1-canary.
|
|
7
|
+
var version = "6.7.1-canary.4";
|
|
8
8
|
const middleware = [debug({
|
|
9
9
|
verbose: true,
|
|
10
10
|
namespace: "sanity:client"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sanity/client",
|
|
3
|
-
"version": "6.7.1-canary.
|
|
3
|
+
"version": "6.7.1-canary.4",
|
|
4
4
|
"description": "Client for retrieving, creating and patching data from Sanity.io",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sanity",
|
|
@@ -113,25 +113,25 @@
|
|
|
113
113
|
"@edge-runtime/vm": "^3.1.6",
|
|
114
114
|
"@rollup/plugin-commonjs": "^25.0.7",
|
|
115
115
|
"@rollup/plugin-node-resolve": "^15.2.3",
|
|
116
|
-
"@sanity/pkg-utils": "^3.2.
|
|
116
|
+
"@sanity/pkg-utils": "^3.2.2",
|
|
117
117
|
"@types/node": "^20.8.8",
|
|
118
|
-
"@typescript-eslint/eslint-plugin": "^6.9.
|
|
119
|
-
"@typescript-eslint/parser": "^6.9.
|
|
118
|
+
"@typescript-eslint/eslint-plugin": "^6.9.1",
|
|
119
|
+
"@typescript-eslint/parser": "^6.9.1",
|
|
120
120
|
"@vitest/coverage-v8": "^0.34.6",
|
|
121
121
|
"eslint": "^8.52.0",
|
|
122
122
|
"eslint-config-prettier": "^9.0.0",
|
|
123
123
|
"eslint-plugin-prettier": "^5.0.1",
|
|
124
124
|
"eslint-plugin-simple-import-sort": "^10.0.0",
|
|
125
125
|
"faucet": "^0.0.4",
|
|
126
|
-
"happy-dom": "^12.10.
|
|
126
|
+
"happy-dom": "^12.10.3",
|
|
127
127
|
"ls-engines": "^0.9.0",
|
|
128
|
-
"nock": "^13.3.
|
|
128
|
+
"nock": "^13.3.7",
|
|
129
129
|
"prettier": "^3.0.3",
|
|
130
130
|
"prettier-plugin-packagejson": "^2.4.6",
|
|
131
131
|
"rimraf": "^5.0.1",
|
|
132
|
-
"rollup": "^4.
|
|
132
|
+
"rollup": "^4.2.0",
|
|
133
133
|
"sse-channel": "^4.0.0",
|
|
134
|
-
"terser": "^5.
|
|
134
|
+
"terser": "^5.24.0",
|
|
135
135
|
"typescript": "^5.2.2",
|
|
136
136
|
"vitest": "^0.34.6",
|
|
137
137
|
"vitest-github-actions-reporter": "^0.10.0"
|
package/src/csm/editIntent.ts
CHANGED
|
@@ -21,10 +21,7 @@ export function encodeJsonPathToUriComponent(path: string | PathSegment[]): stri
|
|
|
21
21
|
const sourcePath = Array.isArray(path) ? path : parseJsonPath(path)
|
|
22
22
|
return encodeURIComponent(
|
|
23
23
|
sourcePath
|
|
24
|
-
.map((key, i) =>
|
|
25
|
-
// eslint-disable-next-line no-nested-ternary
|
|
26
|
-
typeof key === 'number' ? `[${key}]` : i > 0 ? `.${key}` : key,
|
|
27
|
-
)
|
|
24
|
+
.map((key, i) => (typeof key === 'number' ? `[${key}]` : i > 0 ? `.${key}` : key))
|
|
28
25
|
.join(''),
|
|
29
26
|
)
|
|
30
27
|
}
|
package/src/csm/index.ts
CHANGED
|
@@ -14,6 +14,13 @@ export type {
|
|
|
14
14
|
ContentSourceMapValueMapping,
|
|
15
15
|
} from '../types'
|
|
16
16
|
export {createEditIntentLink, type EditIntentLink, encodeJsonPathToUriComponent} from './editIntent'
|
|
17
|
-
export {jsonPath} from './jsonpath'
|
|
18
|
-
export {
|
|
17
|
+
export {jsonPath, parseJsonPath} from './jsonpath'
|
|
18
|
+
export {
|
|
19
|
+
encode,
|
|
20
|
+
encodeIntoResult,
|
|
21
|
+
type Encoder,
|
|
22
|
+
resolveMapping,
|
|
23
|
+
walkMap,
|
|
24
|
+
type WalkMapFn,
|
|
25
|
+
} from './sourcemap'
|
|
19
26
|
export type * from './types'
|
package/src/csm/jsonpath.test.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {expect, test} from 'vitest'
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import {jsonPath, parseJsonPath} from './jsonpath'
|
|
4
4
|
|
|
5
5
|
test('formats normalised JSON Paths', () => {
|
|
6
|
-
expect(jsonPath(['foo', 'bar', 0, 'baz'])).toBe(
|
|
7
|
-
"$['foo']['bar'][0]['baz']",
|
|
8
|
-
)
|
|
6
|
+
expect(jsonPath(['foo', 'bar', 0, 'baz'])).toBe("$['foo']['bar'][0]['baz']")
|
|
9
7
|
})
|
|
10
8
|
|
|
11
9
|
test('formats normalised JSON Paths with escaped characters', () => {
|
|
@@ -15,26 +13,21 @@ test('formats normalised JSON Paths with escaped characters', () => {
|
|
|
15
13
|
})
|
|
16
14
|
|
|
17
15
|
test('parses normalised JSON Paths', () => {
|
|
18
|
-
expect(parseJsonPath("$['foo']['bar'][0]['baz']")).toEqual([
|
|
16
|
+
expect(parseJsonPath("$['foo']['bar'][0]['baz']")).toEqual(['foo', 'bar', 0, 'baz'])
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
test('parses normalised JSON Paths with escaped characters', () => {
|
|
20
|
+
expect(parseJsonPath("$['foo']['bar'][0]['baz']['it\\'s a \\'test\\'']")).toEqual([
|
|
19
21
|
'foo',
|
|
20
22
|
'bar',
|
|
21
23
|
0,
|
|
22
24
|
'baz',
|
|
25
|
+
"it's a 'test'",
|
|
23
26
|
])
|
|
24
27
|
})
|
|
25
28
|
|
|
26
|
-
test('parses normalised JSON Paths with
|
|
29
|
+
test('parses normalised JSON Paths with key array filter selectors', () => {
|
|
27
30
|
expect(
|
|
28
|
-
parseJsonPath("$['foo']['
|
|
29
|
-
).toEqual(['foo', '
|
|
31
|
+
parseJsonPath("$['foo'][?(@._key=='section-1')][0]['baz'][?(@._key=='section-2')]"),
|
|
32
|
+
).toEqual(['foo', {key: 'section-1', index: -1}, 0, 'baz', {key: 'section-2', index: -1}])
|
|
30
33
|
})
|
|
31
|
-
|
|
32
|
-
test('parses normalised JSON Paths with key array filter selectors', () => {
|
|
33
|
-
expect(parseJsonPath("$['foo'][?(@._key=='section-1')][0]['baz'][?(@._key=='section-2')]")).toEqual([
|
|
34
|
-
'foo',
|
|
35
|
-
{ key: 'section-1', index: -1 },
|
|
36
|
-
0,
|
|
37
|
-
'baz',
|
|
38
|
-
{ key: 'section-2', index: -1},
|
|
39
|
-
])
|
|
40
|
-
})
|
package/src/csm/jsonpath.ts
CHANGED
package/src/csm/sourcemap.ts
CHANGED
|
@@ -40,7 +40,6 @@ export function encodeIntoResult<R>(
|
|
|
40
40
|
return value
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
44
43
|
const resolveMappingResult = resolveMapping(path, csm)
|
|
45
44
|
if (!resolveMappingResult) {
|
|
46
45
|
return value
|
|
@@ -55,10 +54,7 @@ export function encodeIntoResult<R>(
|
|
|
55
54
|
return value
|
|
56
55
|
}
|
|
57
56
|
|
|
58
|
-
const sourceDocument =
|
|
59
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
60
|
-
csm.documents[mapping.source.document!]
|
|
61
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
57
|
+
const sourceDocument = csm.documents[mapping.source.document!]
|
|
62
58
|
const sourcePath = csm.paths[mapping.source.path]
|
|
63
59
|
|
|
64
60
|
if (options?.keyArraySelectors) {
|