@sanity/client 6.7.1-canary.0 → 6.7.1-canary.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/csm.cjs +7 -53
- package/dist/csm.cjs.map +1 -1
- package/dist/csm.d.ts +0 -3
- package/dist/csm.js +8 -53
- package/dist/csm.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/src/csm/index.ts +0 -1
- package/src/csm/mapToEditLinks.test.ts +0 -103
- package/src/csm/mapToEditLinks.ts +0 -11
package/dist/csm.cjs
CHANGED
|
@@ -68,16 +68,6 @@ function parseJsonPath(path) {
|
|
|
68
68
|
}
|
|
69
69
|
return parsed;
|
|
70
70
|
}
|
|
71
|
-
function defineEditLink(_studioUrl) {
|
|
72
|
-
const studioUrl = _studioUrl.replace(/\/$/, "");
|
|
73
|
-
return (_ref, path) => {
|
|
74
|
-
let {
|
|
75
|
-
_id,
|
|
76
|
-
_type
|
|
77
|
-
} = _ref;
|
|
78
|
-
return "".concat(studioUrl, "/intent/edit/id=").concat(_id, ";type=").concat(_type, ";path=").concat(encodeJsonPathToUriComponent(path));
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
71
|
function encodeJsonPathToUriComponent(path) {
|
|
82
72
|
const sourcePath = Array.isArray(path) ? path : parseJsonPath(path);
|
|
83
73
|
return encodeURIComponent(sourcePath.map((key, i) =>
|
|
@@ -90,35 +80,6 @@ function isRecord(value) {
|
|
|
90
80
|
function isArray(value) {
|
|
91
81
|
return value !== null && Array.isArray(value);
|
|
92
82
|
}
|
|
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 =
|
|
110
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
111
|
-
csm.documents[mapping.source.document];
|
|
112
|
-
const sourcePath = csm.paths[mapping.source.path];
|
|
113
|
-
if (options == null ? void 0 : options.keyArraySelectors) {
|
|
114
|
-
const matchPathSegments = parseJsonPath(matchedPath);
|
|
115
|
-
const sourcePathSegments = parseJsonPath(sourcePath);
|
|
116
|
-
const fullSourceSegments = sourcePathSegments.concat(path.slice(matchPathSegments.length));
|
|
117
|
-
return encoder(value, sourceDocument, fullSourceSegments);
|
|
118
|
-
}
|
|
119
|
-
return encoder(value, sourceDocument, parseJsonPath(sourcePath + pathSuffix));
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
83
|
function walkMap(value, mappingFn) {
|
|
123
84
|
let path = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
124
85
|
if (isArray(value)) {
|
|
@@ -136,8 +97,8 @@ function walkMap(value, mappingFn) {
|
|
|
136
97
|
});
|
|
137
98
|
}
|
|
138
99
|
if (isRecord(value)) {
|
|
139
|
-
return Object.fromEntries(Object.entries(value).map(
|
|
140
|
-
let [k, v] =
|
|
100
|
+
return Object.fromEntries(Object.entries(value).map(_ref => {
|
|
101
|
+
let [k, v] = _ref;
|
|
141
102
|
return [k, walkMap(v, mappingFn, path.concat(k))];
|
|
142
103
|
}));
|
|
143
104
|
}
|
|
@@ -148,12 +109,12 @@ function resolveMapping(resultPath, csm) {
|
|
|
148
109
|
if (csm.mappings[resultJsonPath] !== void 0) {
|
|
149
110
|
return [csm.mappings[resultJsonPath], resultJsonPath, ""];
|
|
150
111
|
}
|
|
151
|
-
const mappings = Object.entries(csm.mappings).filter(
|
|
152
|
-
let [key] =
|
|
112
|
+
const mappings = Object.entries(csm.mappings).filter(_ref2 => {
|
|
113
|
+
let [key] = _ref2;
|
|
153
114
|
return resultJsonPath.startsWith(key);
|
|
154
|
-
}).sort((
|
|
155
|
-
let [key1] =
|
|
156
|
-
let [key2] =
|
|
115
|
+
}).sort((_ref3, _ref4) => {
|
|
116
|
+
let [key1] = _ref3;
|
|
117
|
+
let [key2] = _ref4;
|
|
157
118
|
return key2.length - key1.length;
|
|
158
119
|
});
|
|
159
120
|
if (mappings.length == 0) {
|
|
@@ -163,15 +124,8 @@ function resolveMapping(resultPath, csm) {
|
|
|
163
124
|
const pathSuffix = resultJsonPath.substring(matchedPath.length);
|
|
164
125
|
return [mapping, matchedPath, pathSuffix];
|
|
165
126
|
}
|
|
166
|
-
function mapToEditLinks(result, csm, studioUrl) {
|
|
167
|
-
const createEditLink = defineEditLink(studioUrl);
|
|
168
|
-
return encodeIntoResult(result, csm, (_, sourceDocument, path) => {
|
|
169
|
-
return createEditLink(sourceDocument, path);
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
127
|
exports.encodeJsonPathToUriComponent = encodeJsonPathToUriComponent;
|
|
173
128
|
exports.jsonPath = jsonPath;
|
|
174
|
-
exports.mapToEditLinks = mapToEditLinks;
|
|
175
129
|
exports.resolveMapping = resolveMapping;
|
|
176
130
|
exports.walkMap = walkMap;
|
|
177
131
|
//# 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","../src/csm/mapToEditLinks.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 {ContentSourceMapDocument, ContentSourceMapDocuments} from '../types'\nimport {parseJsonPath} from './jsonpath'\nimport type {PathSegment, StudioUrl} from './types'\n\n/** @alpha */\nexport type EditLink = `/intent/edit/id=${string};type=${string};path=${string}`\n\n/** @alpha */\nexport interface EditLinkProps {\n studioUrl: StudioUrl\n document: ContentSourceMapDocument\n}\n\n/** @alpha */\nexport type DefineEditLink = (\n studioUrl: StudioUrl,\n) => (sourceDocument: ContentSourceMapDocuments[number]) => `${StudioUrl}${EditLink}`\n\n/** @alpha */\nexport function defineEditLink(\n _studioUrl: StudioUrl,\n): (\n sourceDocument: ContentSourceMapDocuments[number],\n path: string | PathSegment[],\n) => `${StudioUrl}${EditLink}` {\n const studioUrl = _studioUrl.replace(/\\/$/, '')\n return ({_id, _type}, path) =>\n `${studioUrl}/intent/edit/id=${_id};type=${_type};path=${encodeJsonPathToUriComponent(path)}`\n}\n\n/** @alpha */\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","import type {ContentSourceMap} from '../types'\nimport {defineEditLink} from './editIntent'\nimport {encodeIntoResult} from './sourcemap'\n\n/** @alpha */\nexport function mapToEditLinks<R>(result: R, csm: ContentSourceMap, studioUrl: string): R {\n const createEditLink = defineEditLink(studioUrl)\n return encodeIntoResult(result, csm, (_, sourceDocument, path) => {\n return createEditLink(sourceDocument, path)\n }) as R\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","defineEditLink","_studioUrl","studioUrl","_ref","_id","_type","encodeJsonPathToUriComponent","sourcePath","Array","isArray","encodeURIComponent","i","isRecord","value","encodeIntoResult","result","csm","encoder","options","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","mapToEditLinks","createEditLink","_"],"mappings":"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"}
|
|
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 {ContentSourceMapDocument, ContentSourceMapDocuments} from '../types'\nimport {parseJsonPath} from './jsonpath'\nimport type {PathSegment, StudioUrl} from './types'\n\n/** @alpha */\nexport type EditLink = `/intent/edit/id=${string};type=${string};path=${string}`\n\n/** @alpha */\nexport interface EditLinkProps {\n studioUrl: StudioUrl\n document: ContentSourceMapDocument\n}\n\n/** @alpha */\nexport type DefineEditLink = (\n studioUrl: StudioUrl,\n) => (sourceDocument: ContentSourceMapDocuments[number]) => `${StudioUrl}${EditLink}`\n\n/** @alpha */\nexport function defineEditLink(\n _studioUrl: StudioUrl,\n): (\n sourceDocument: ContentSourceMapDocuments[number],\n path: string | PathSegment[],\n) => `${StudioUrl}${EditLink}` {\n const studioUrl = _studioUrl.replace(/\\/$/, '')\n return ({_id, _type}, path) =>\n `${studioUrl}/intent/edit/id=${_id};type=${_type};path=${encodeJsonPathToUriComponent(path)}`\n}\n\n/** @alpha */\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","encodeJsonPathToUriComponent","sourcePath","Array","isArray","encodeURIComponent","i","isRecord","value","walkMap","mappingFn","arguments","length","undefined","v","idx","Object","fromEntries","entries","_ref","k","resolveMapping","resultPath","csm","resultJsonPath","mappings","filter","_ref2","startsWith","sort","_ref3","_ref4","key1","key2","matchedPath","mapping","pathSuffix","substring"],"mappings":"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"}
|
package/dist/csm.d.ts
CHANGED
|
@@ -99,9 +99,6 @@ export declare type KeyedSegment = {
|
|
|
99
99
|
index: number
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
/** @alpha */
|
|
103
|
-
export declare function mapToEditLinks<R>(result: R, csm: ContentSourceMap, studioUrl: string): R
|
|
104
|
-
|
|
105
102
|
/** @public */
|
|
106
103
|
export declare type PathSegment = string | number | KeyedSegment
|
|
107
104
|
|
package/dist/csm.js
CHANGED
|
@@ -63,16 +63,6 @@ function parseJsonPath(path) {
|
|
|
63
63
|
}
|
|
64
64
|
return parsed;
|
|
65
65
|
}
|
|
66
|
-
function defineEditLink(_studioUrl) {
|
|
67
|
-
const studioUrl = _studioUrl.replace(/\/$/, "");
|
|
68
|
-
return (_ref, path) => {
|
|
69
|
-
let {
|
|
70
|
-
_id,
|
|
71
|
-
_type
|
|
72
|
-
} = _ref;
|
|
73
|
-
return "".concat(studioUrl, "/intent/edit/id=").concat(_id, ";type=").concat(_type, ";path=").concat(encodeJsonPathToUriComponent(path));
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
66
|
function encodeJsonPathToUriComponent(path) {
|
|
77
67
|
const sourcePath = Array.isArray(path) ? path : parseJsonPath(path);
|
|
78
68
|
return encodeURIComponent(sourcePath.map((key, i) =>
|
|
@@ -85,35 +75,6 @@ function isRecord(value) {
|
|
|
85
75
|
function isArray(value) {
|
|
86
76
|
return value !== null && Array.isArray(value);
|
|
87
77
|
}
|
|
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 =
|
|
105
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
106
|
-
csm.documents[mapping.source.document];
|
|
107
|
-
const sourcePath = csm.paths[mapping.source.path];
|
|
108
|
-
if (options == null ? void 0 : options.keyArraySelectors) {
|
|
109
|
-
const matchPathSegments = parseJsonPath(matchedPath);
|
|
110
|
-
const sourcePathSegments = parseJsonPath(sourcePath);
|
|
111
|
-
const fullSourceSegments = sourcePathSegments.concat(path.slice(matchPathSegments.length));
|
|
112
|
-
return encoder(value, sourceDocument, fullSourceSegments);
|
|
113
|
-
}
|
|
114
|
-
return encoder(value, sourceDocument, parseJsonPath(sourcePath + pathSuffix));
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
78
|
function walkMap(value, mappingFn) {
|
|
118
79
|
let path = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
119
80
|
if (isArray(value)) {
|
|
@@ -131,8 +92,8 @@ function walkMap(value, mappingFn) {
|
|
|
131
92
|
});
|
|
132
93
|
}
|
|
133
94
|
if (isRecord(value)) {
|
|
134
|
-
return Object.fromEntries(Object.entries(value).map(
|
|
135
|
-
let [k, v] =
|
|
95
|
+
return Object.fromEntries(Object.entries(value).map(_ref => {
|
|
96
|
+
let [k, v] = _ref;
|
|
136
97
|
return [k, walkMap(v, mappingFn, path.concat(k))];
|
|
137
98
|
}));
|
|
138
99
|
}
|
|
@@ -143,12 +104,12 @@ function resolveMapping(resultPath, csm) {
|
|
|
143
104
|
if (csm.mappings[resultJsonPath] !== void 0) {
|
|
144
105
|
return [csm.mappings[resultJsonPath], resultJsonPath, ""];
|
|
145
106
|
}
|
|
146
|
-
const mappings = Object.entries(csm.mappings).filter(
|
|
147
|
-
let [key] =
|
|
107
|
+
const mappings = Object.entries(csm.mappings).filter(_ref2 => {
|
|
108
|
+
let [key] = _ref2;
|
|
148
109
|
return resultJsonPath.startsWith(key);
|
|
149
|
-
}).sort((
|
|
150
|
-
let [key1] =
|
|
151
|
-
let [key2] =
|
|
110
|
+
}).sort((_ref3, _ref4) => {
|
|
111
|
+
let [key1] = _ref3;
|
|
112
|
+
let [key2] = _ref4;
|
|
152
113
|
return key2.length - key1.length;
|
|
153
114
|
});
|
|
154
115
|
if (mappings.length == 0) {
|
|
@@ -158,11 +119,5 @@ function resolveMapping(resultPath, csm) {
|
|
|
158
119
|
const pathSuffix = resultJsonPath.substring(matchedPath.length);
|
|
159
120
|
return [mapping, matchedPath, pathSuffix];
|
|
160
121
|
}
|
|
161
|
-
|
|
162
|
-
const createEditLink = defineEditLink(studioUrl);
|
|
163
|
-
return encodeIntoResult(result, csm, (_, sourceDocument, path) => {
|
|
164
|
-
return createEditLink(sourceDocument, path);
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
export { encodeJsonPathToUriComponent, jsonPath, mapToEditLinks, resolveMapping, walkMap };
|
|
122
|
+
export { encodeJsonPathToUriComponent, jsonPath, resolveMapping, walkMap };
|
|
168
123
|
//# 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","../src/csm/mapToEditLinks.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 {ContentSourceMapDocument, ContentSourceMapDocuments} from '../types'\nimport {parseJsonPath} from './jsonpath'\nimport type {PathSegment, StudioUrl} from './types'\n\n/** @alpha */\nexport type EditLink = `/intent/edit/id=${string};type=${string};path=${string}`\n\n/** @alpha */\nexport interface EditLinkProps {\n studioUrl: StudioUrl\n document: ContentSourceMapDocument\n}\n\n/** @alpha */\nexport type DefineEditLink = (\n studioUrl: StudioUrl,\n) => (sourceDocument: ContentSourceMapDocuments[number]) => `${StudioUrl}${EditLink}`\n\n/** @alpha */\nexport function defineEditLink(\n _studioUrl: StudioUrl,\n): (\n sourceDocument: ContentSourceMapDocuments[number],\n path: string | PathSegment[],\n) => `${StudioUrl}${EditLink}` {\n const studioUrl = _studioUrl.replace(/\\/$/, '')\n return ({_id, _type}, path) =>\n `${studioUrl}/intent/edit/id=${_id};type=${_type};path=${encodeJsonPathToUriComponent(path)}`\n}\n\n/** @alpha */\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","import type {ContentSourceMap} from '../types'\nimport {defineEditLink} from './editIntent'\nimport {encodeIntoResult} from './sourcemap'\n\n/** @alpha */\nexport function mapToEditLinks<R>(result: R, csm: ContentSourceMap, studioUrl: string): R {\n const createEditLink = defineEditLink(studioUrl)\n return encodeIntoResult(result, csm, (_, sourceDocument, path) => {\n return createEditLink(sourceDocument, path)\n }) as R\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","defineEditLink","_studioUrl","studioUrl","_ref","_id","_type","encodeJsonPathToUriComponent","sourcePath","Array","isArray","encodeURIComponent","i","isRecord","value","encodeIntoResult","result","csm","encoder","options","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","mapToEditLinks","createEditLink","_"],"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 {ContentSourceMapDocument, ContentSourceMapDocuments} from '../types'\nimport {parseJsonPath} from './jsonpath'\nimport type {PathSegment, StudioUrl} from './types'\n\n/** @alpha */\nexport type EditLink = `/intent/edit/id=${string};type=${string};path=${string}`\n\n/** @alpha */\nexport interface EditLinkProps {\n studioUrl: StudioUrl\n document: ContentSourceMapDocument\n}\n\n/** @alpha */\nexport type DefineEditLink = (\n studioUrl: StudioUrl,\n) => (sourceDocument: ContentSourceMapDocuments[number]) => `${StudioUrl}${EditLink}`\n\n/** @alpha */\nexport function defineEditLink(\n _studioUrl: StudioUrl,\n): (\n sourceDocument: ContentSourceMapDocuments[number],\n path: string | PathSegment[],\n) => `${StudioUrl}${EditLink}` {\n const studioUrl = _studioUrl.replace(/\\/$/, '')\n return ({_id, _type}, path) =>\n `${studioUrl}/intent/edit/id=${_id};type=${_type};path=${encodeJsonPathToUriComponent(path)}`\n}\n\n/** @alpha */\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","encodeJsonPathToUriComponent","sourcePath","Array","isArray","encodeURIComponent","i","isRecord","value","walkMap","mappingFn","arguments","length","undefined","v","idx","Object","fromEntries","entries","_ref","k","resolveMapping","resultPath","csm","resultJsonPath","mappings","filter","_ref2","startsWith","sort","_ref3","_ref4","key1","key2","matchedPath","mapping","pathSuffix","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.1";
|
|
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.1";
|
|
8
8
|
const middleware = [debug({
|
|
9
9
|
verbose: true,
|
|
10
10
|
namespace: "sanity:client"
|
package/package.json
CHANGED
package/src/csm/index.ts
CHANGED
|
@@ -15,6 +15,5 @@ export type {
|
|
|
15
15
|
} from '../types'
|
|
16
16
|
export {encodeJsonPathToUriComponent} from './editIntent'
|
|
17
17
|
export {jsonPath} from './jsonpath'
|
|
18
|
-
export * from './mapToEditLinks'
|
|
19
18
|
export {resolveMapping, walkMap, type WalkMapFn} from './sourcemap'
|
|
20
19
|
export type * from './types'
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import {expect, test} from 'vitest'
|
|
2
|
-
|
|
3
|
-
import {ContentSourceMapDocument} from '../types'
|
|
4
|
-
import {mapToEditLinks} from './mapToEditLinks'
|
|
5
|
-
|
|
6
|
-
const resultEditLinksTestCases = [
|
|
7
|
-
{
|
|
8
|
-
name: 'returns links for all strings in the result',
|
|
9
|
-
queryResult: {
|
|
10
|
-
result: [
|
|
11
|
-
{
|
|
12
|
-
linkMe: 'that',
|
|
13
|
-
deep: [
|
|
14
|
-
{
|
|
15
|
-
linkMe: 'that',
|
|
16
|
-
},
|
|
17
|
-
],
|
|
18
|
-
},
|
|
19
|
-
],
|
|
20
|
-
resultSourceMap: {
|
|
21
|
-
documents: [
|
|
22
|
-
{
|
|
23
|
-
_id: 'foo',
|
|
24
|
-
_type: 'foo',
|
|
25
|
-
},
|
|
26
|
-
] satisfies ContentSourceMapDocument[],
|
|
27
|
-
paths: ["$['linkMe']", "$['deep']"],
|
|
28
|
-
mappings: {
|
|
29
|
-
"$[0]['linkMe']": {
|
|
30
|
-
source: {
|
|
31
|
-
document: 0,
|
|
32
|
-
path: 0,
|
|
33
|
-
type: 'documentValue',
|
|
34
|
-
},
|
|
35
|
-
type: 'value',
|
|
36
|
-
},
|
|
37
|
-
"$[0]['deep']": {
|
|
38
|
-
source: {
|
|
39
|
-
document: 0,
|
|
40
|
-
path: 1,
|
|
41
|
-
type: 'documentValue',
|
|
42
|
-
},
|
|
43
|
-
type: 'value',
|
|
44
|
-
},
|
|
45
|
-
},
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
expected: [
|
|
49
|
-
{
|
|
50
|
-
linkMe: 'test.sanity.studio/intent/edit/id=foo;type=foo;path=linkMe',
|
|
51
|
-
deep: [
|
|
52
|
-
{
|
|
53
|
-
linkMe: 'test.sanity.studio/intent/edit/id=foo;type=foo;path=deep%5B0%5D.linkMe',
|
|
54
|
-
},
|
|
55
|
-
],
|
|
56
|
-
},
|
|
57
|
-
],
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
name: 'results should be unchanged if no compatible types are found',
|
|
61
|
-
queryResult: {
|
|
62
|
-
result: [
|
|
63
|
-
{
|
|
64
|
-
dontLinkMe: 1,
|
|
65
|
-
},
|
|
66
|
-
],
|
|
67
|
-
resultSourceMap: {
|
|
68
|
-
documents: [
|
|
69
|
-
{
|
|
70
|
-
_id: 'foo',
|
|
71
|
-
_type: 'foo',
|
|
72
|
-
},
|
|
73
|
-
] satisfies ContentSourceMapDocument[],
|
|
74
|
-
paths: ["$['dontLinkMe']"],
|
|
75
|
-
mappings: {
|
|
76
|
-
"$[0]['dontLinkMe']": {
|
|
77
|
-
source: {
|
|
78
|
-
document: 0,
|
|
79
|
-
path: 0,
|
|
80
|
-
type: 'documentValue',
|
|
81
|
-
},
|
|
82
|
-
type: 'value',
|
|
83
|
-
},
|
|
84
|
-
},
|
|
85
|
-
},
|
|
86
|
-
},
|
|
87
|
-
expected: [
|
|
88
|
-
{
|
|
89
|
-
dontLinkMe: 1,
|
|
90
|
-
},
|
|
91
|
-
],
|
|
92
|
-
},
|
|
93
|
-
]
|
|
94
|
-
|
|
95
|
-
test.each(resultEditLinksTestCases)('mapToEditLinks $name', ({queryResult, expected}) => {
|
|
96
|
-
const response = mapToEditLinks(
|
|
97
|
-
queryResult.result,
|
|
98
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
99
|
-
queryResult.resultSourceMap as any,
|
|
100
|
-
'test.sanity.studio/',
|
|
101
|
-
)
|
|
102
|
-
expect(response).toEqual(expected)
|
|
103
|
-
})
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type {ContentSourceMap} from '../types'
|
|
2
|
-
import {defineEditLink} from './editIntent'
|
|
3
|
-
import {encodeIntoResult} from './sourcemap'
|
|
4
|
-
|
|
5
|
-
/** @alpha */
|
|
6
|
-
export function mapToEditLinks<R>(result: R, csm: ContentSourceMap, studioUrl: string): R {
|
|
7
|
-
const createEditLink = defineEditLink(studioUrl)
|
|
8
|
-
return encodeIntoResult(result, csm, (_, sourceDocument, path) => {
|
|
9
|
-
return createEditLink(sourceDocument, path)
|
|
10
|
-
}) as R
|
|
11
|
-
}
|