@sanity/util 4.19.0 → 4.19.1-next.10

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/lib/client.js CHANGED
@@ -1,8 +1,7 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: !0 });
3
- var rxjs = require("rxjs"), concurrencyLimiter = require("./concurrency-limiter.js");
1
+ import { from, switchMap, finalize } from "rxjs";
2
+ import { ConcurrencyLimiter } from "./concurrency-limiter.js";
4
3
  function createClientConcurrencyLimiter(maxConcurrency) {
5
- const limiter = new concurrencyLimiter.ConcurrencyLimiter(maxConcurrency);
4
+ const limiter = new ConcurrencyLimiter(maxConcurrency);
6
5
  function wrapClient(client) {
7
6
  return new Proxy(client, {
8
7
  get: (target, property) => {
@@ -38,9 +37,9 @@ function createClientConcurrencyLimiter(maxConcurrency) {
38
37
  get: (target, property) => {
39
38
  switch (property) {
40
39
  case "fetch":
41
- return (...args) => rxjs.from(limiter.ready()).pipe(
42
- rxjs.switchMap(() => target.fetch(...args)),
43
- rxjs.finalize(() => limiter.release())
40
+ return (...args) => from(limiter.ready()).pipe(
41
+ switchMap(() => target.fetch(...args)),
42
+ finalize(() => limiter.release())
44
43
  );
45
44
  case "clone":
46
45
  return (...args) => wrapObservableClient(target.clone(...args));
@@ -59,5 +58,7 @@ function createClientConcurrencyLimiter(maxConcurrency) {
59
58
  }
60
59
  return wrapClient;
61
60
  }
62
- exports.createClientConcurrencyLimiter = createClientConcurrencyLimiter;
61
+ export {
62
+ createClientConcurrencyLimiter
63
+ };
63
64
  //# sourceMappingURL=client.js.map
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sources":["../src/client/concurrency-limiter/createClientConcurrencyLimiter.ts"],"sourcesContent":["import {type ObservableSanityClient, type SanityClient} from '@sanity/client'\nimport {finalize, from, switchMap} from 'rxjs'\n\nimport {ConcurrencyLimiter} from '../../concurrency-limiter'\n\n/**\n * Decorates a sanity client to limit the concurrency of `client.fetch`\n * requests. Keeps the concurrency limit state and returns wrapped clients with\n * that same state if the `clone` `config` or `withConfig` methods are called.\n */\nexport function createClientConcurrencyLimiter(\n maxConcurrency: number,\n): (input: SanityClient) => SanityClient {\n const limiter = new ConcurrencyLimiter(maxConcurrency)\n\n function wrapClient(client: SanityClient): SanityClient {\n return new Proxy(client, {\n get: (target, property) => {\n switch (property) {\n case 'fetch': {\n return async (...args: Parameters<SanityClient['fetch']>) => {\n await limiter.ready()\n try {\n // note we want to await before we return so the finally block\n // will run after the promise has been fulfilled or rejected\n return await target.fetch(...args)\n } finally {\n limiter.release()\n }\n }\n }\n case 'clone': {\n return (...args: Parameters<SanityClient['clone']>) => {\n return wrapClient(target.clone(...args))\n }\n }\n case 'config': {\n return (...args: Parameters<SanityClient['config']>) => {\n const result = target.config(...args)\n\n // if there is a config, it returns a client so we need to wrap again\n if (args[0]) return wrapClient(result)\n return result\n }\n }\n case 'withConfig': {\n return (...args: Parameters<SanityClient['withConfig']>) => {\n return wrapClient(target.withConfig(...args))\n }\n }\n case 'observable': {\n return wrapObservableClient(target.observable)\n }\n default: {\n return target[property as keyof SanityClient]\n }\n }\n },\n })\n }\n\n function wrapObservableClient(\n observableSanityClient: ObservableSanityClient,\n ): ObservableSanityClient {\n return new Proxy(observableSanityClient, {\n get: (target, property) => {\n switch (property) {\n case 'fetch': {\n return (...args: Parameters<ObservableSanityClient['fetch']>) =>\n from(limiter.ready()).pipe(\n switchMap(() => target.fetch(...args)),\n finalize(() => limiter.release()),\n )\n }\n case 'clone': {\n return (...args: Parameters<ObservableSanityClient['clone']>) => {\n return wrapObservableClient(target.clone(...args))\n }\n }\n case 'config': {\n return (...args: Parameters<ObservableSanityClient['config']>) => {\n const result = target.config(...args)\n\n // if there is a config, it returns a client so we need to wrap again\n if (args[0]) return wrapObservableClient(result)\n return result\n }\n }\n case 'withConfig': {\n return (...args: Parameters<ObservableSanityClient['withConfig']>) => {\n return wrapObservableClient(target.withConfig(...args))\n }\n }\n default: {\n return target[property as keyof ObservableSanityClient]\n }\n }\n },\n })\n }\n\n return wrapClient\n}\n"],"names":["ConcurrencyLimiter","from","switchMap","finalize"],"mappings":";;;AAUO,SAAS,+BACd,gBACuC;AACvC,QAAM,UAAU,IAAIA,mBAAAA,mBAAmB,cAAc;AAErD,WAAS,WAAW,QAAoC;AACtD,WAAO,IAAI,MAAM,QAAQ;AAAA,MACvB,KAAK,CAAC,QAAQ,aAAa;AACzB,gBAAQ,UAAA;AAAA,UACN,KAAK;AACH,mBAAO,UAAU,SAA4C;AAC3D,oBAAM,QAAQ,MAAA;AACd,kBAAI;AAGF,uBAAO,MAAM,OAAO,MAAM,GAAG,IAAI;AAAA,cACnC,UAAA;AACE,wBAAQ,QAAA;AAAA,cACV;AAAA,YACF;AAAA,UAEF,KAAK;AACH,mBAAO,IAAI,SACF,WAAW,OAAO,MAAM,GAAG,IAAI,CAAC;AAAA,UAG3C,KAAK;AACH,mBAAO,IAAI,SAA6C;AACtD,oBAAM,SAAS,OAAO,OAAO,GAAG,IAAI;AAGpC,qBAAI,KAAK,CAAC,IAAU,WAAW,MAAM,IAC9B;AAAA,YACT;AAAA,UAEF,KAAK;AACH,mBAAO,IAAI,SACF,WAAW,OAAO,WAAW,GAAG,IAAI,CAAC;AAAA,UAGhD,KAAK;AACH,mBAAO,qBAAqB,OAAO,UAAU;AAAA,UAE/C;AACE,mBAAO,OAAO,QAA8B;AAAA,QAAA;AAAA,MAGlD;AAAA,IAAA,CACD;AAAA,EACH;AAEA,WAAS,qBACP,wBACwB;AACxB,WAAO,IAAI,MAAM,wBAAwB;AAAA,MACvC,KAAK,CAAC,QAAQ,aAAa;AACzB,gBAAQ,UAAA;AAAA,UACN,KAAK;AACH,mBAAO,IAAI,SACTC,KAAAA,KAAK,QAAQ,MAAA,CAAO,EAAE;AAAA,cACpBC,KAAAA,UAAU,MAAM,OAAO,MAAM,GAAG,IAAI,CAAC;AAAA,cACrCC,cAAS,MAAM,QAAQ,QAAA,CAAS;AAAA,YAAA;AAAA,UAGtC,KAAK;AACH,mBAAO,IAAI,SACF,qBAAqB,OAAO,MAAM,GAAG,IAAI,CAAC;AAAA,UAGrD,KAAK;AACH,mBAAO,IAAI,SAAuD;AAChE,oBAAM,SAAS,OAAO,OAAO,GAAG,IAAI;AAGpC,qBAAI,KAAK,CAAC,IAAU,qBAAqB,MAAM,IACxC;AAAA,YACT;AAAA,UAEF,KAAK;AACH,mBAAO,IAAI,SACF,qBAAqB,OAAO,WAAW,GAAG,IAAI,CAAC;AAAA,UAG1D;AACE,mBAAO,OAAO,QAAwC;AAAA,QAAA;AAAA,MAG5D;AAAA,IAAA,CACD;AAAA,EACH;AAEA,SAAO;AACT;;"}
1
+ {"version":3,"file":"client.js","sources":["../src/client/concurrency-limiter/createClientConcurrencyLimiter.ts"],"sourcesContent":["import {type ObservableSanityClient, type SanityClient} from '@sanity/client'\nimport {finalize, from, switchMap} from 'rxjs'\n\nimport {ConcurrencyLimiter} from '../../concurrency-limiter'\n\n/**\n * Decorates a sanity client to limit the concurrency of `client.fetch`\n * requests. Keeps the concurrency limit state and returns wrapped clients with\n * that same state if the `clone` `config` or `withConfig` methods are called.\n */\nexport function createClientConcurrencyLimiter(\n maxConcurrency: number,\n): (input: SanityClient) => SanityClient {\n const limiter = new ConcurrencyLimiter(maxConcurrency)\n\n function wrapClient(client: SanityClient): SanityClient {\n return new Proxy(client, {\n get: (target, property) => {\n switch (property) {\n case 'fetch': {\n return async (...args: Parameters<SanityClient['fetch']>) => {\n await limiter.ready()\n try {\n // note we want to await before we return so the finally block\n // will run after the promise has been fulfilled or rejected\n return await target.fetch(...args)\n } finally {\n limiter.release()\n }\n }\n }\n case 'clone': {\n return (...args: Parameters<SanityClient['clone']>) => {\n return wrapClient(target.clone(...args))\n }\n }\n case 'config': {\n return (...args: Parameters<SanityClient['config']>) => {\n const result = target.config(...args)\n\n // if there is a config, it returns a client so we need to wrap again\n if (args[0]) return wrapClient(result)\n return result\n }\n }\n case 'withConfig': {\n return (...args: Parameters<SanityClient['withConfig']>) => {\n return wrapClient(target.withConfig(...args))\n }\n }\n case 'observable': {\n return wrapObservableClient(target.observable)\n }\n default: {\n return target[property as keyof SanityClient]\n }\n }\n },\n })\n }\n\n function wrapObservableClient(\n observableSanityClient: ObservableSanityClient,\n ): ObservableSanityClient {\n return new Proxy(observableSanityClient, {\n get: (target, property) => {\n switch (property) {\n case 'fetch': {\n return (...args: Parameters<ObservableSanityClient['fetch']>) =>\n from(limiter.ready()).pipe(\n switchMap(() => target.fetch(...args)),\n finalize(() => limiter.release()),\n )\n }\n case 'clone': {\n return (...args: Parameters<ObservableSanityClient['clone']>) => {\n return wrapObservableClient(target.clone(...args))\n }\n }\n case 'config': {\n return (...args: Parameters<ObservableSanityClient['config']>) => {\n const result = target.config(...args)\n\n // if there is a config, it returns a client so we need to wrap again\n if (args[0]) return wrapObservableClient(result)\n return result\n }\n }\n case 'withConfig': {\n return (...args: Parameters<ObservableSanityClient['withConfig']>) => {\n return wrapObservableClient(target.withConfig(...args))\n }\n }\n default: {\n return target[property as keyof ObservableSanityClient]\n }\n }\n },\n })\n }\n\n return wrapClient\n}\n"],"names":[],"mappings":";;AAUO,SAAS,+BACd,gBACuC;AACvC,QAAM,UAAU,IAAI,mBAAmB,cAAc;AAErD,WAAS,WAAW,QAAoC;AACtD,WAAO,IAAI,MAAM,QAAQ;AAAA,MACvB,KAAK,CAAC,QAAQ,aAAa;AACzB,gBAAQ,UAAA;AAAA,UACN,KAAK;AACH,mBAAO,UAAU,SAA4C;AAC3D,oBAAM,QAAQ,MAAA;AACd,kBAAI;AAGF,uBAAO,MAAM,OAAO,MAAM,GAAG,IAAI;AAAA,cACnC,UAAA;AACE,wBAAQ,QAAA;AAAA,cACV;AAAA,YACF;AAAA,UAEF,KAAK;AACH,mBAAO,IAAI,SACF,WAAW,OAAO,MAAM,GAAG,IAAI,CAAC;AAAA,UAG3C,KAAK;AACH,mBAAO,IAAI,SAA6C;AACtD,oBAAM,SAAS,OAAO,OAAO,GAAG,IAAI;AAGpC,qBAAI,KAAK,CAAC,IAAU,WAAW,MAAM,IAC9B;AAAA,YACT;AAAA,UAEF,KAAK;AACH,mBAAO,IAAI,SACF,WAAW,OAAO,WAAW,GAAG,IAAI,CAAC;AAAA,UAGhD,KAAK;AACH,mBAAO,qBAAqB,OAAO,UAAU;AAAA,UAE/C;AACE,mBAAO,OAAO,QAA8B;AAAA,QAAA;AAAA,MAGlD;AAAA,IAAA,CACD;AAAA,EACH;AAEA,WAAS,qBACP,wBACwB;AACxB,WAAO,IAAI,MAAM,wBAAwB;AAAA,MACvC,KAAK,CAAC,QAAQ,aAAa;AACzB,gBAAQ,UAAA;AAAA,UACN,KAAK;AACH,mBAAO,IAAI,SACT,KAAK,QAAQ,MAAA,CAAO,EAAE;AAAA,cACpB,UAAU,MAAM,OAAO,MAAM,GAAG,IAAI,CAAC;AAAA,cACrC,SAAS,MAAM,QAAQ,QAAA,CAAS;AAAA,YAAA;AAAA,UAGtC,KAAK;AACH,mBAAO,IAAI,SACF,qBAAqB,OAAO,MAAM,GAAG,IAAI,CAAC;AAAA,UAGrD,KAAK;AACH,mBAAO,IAAI,SAAuD;AAChE,oBAAM,SAAS,OAAO,OAAO,GAAG,IAAI;AAGpC,qBAAI,KAAK,CAAC,IAAU,qBAAqB,MAAM,IACxC;AAAA,YACT;AAAA,UAEF,KAAK;AACH,mBAAO,IAAI,SACF,qBAAqB,OAAO,WAAW,GAAG,IAAI,CAAC;AAAA,UAG1D;AACE,mBAAO,OAAO,QAAwC;AAAA,QAAA;AAAA,MAG5D;AAAA,IAAA,CACD;AAAA,EACH;AAEA,SAAO;AACT;"}
@@ -1,5 +1,3 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: !0 });
3
1
  class ConcurrencyLimiter {
4
2
  current = 0;
5
3
  resolvers = [];
@@ -28,5 +26,7 @@ class ConcurrencyLimiter {
28
26
  this.current = Math.max(0, this.current - 1);
29
27
  };
30
28
  }
31
- exports.ConcurrencyLimiter = ConcurrencyLimiter;
29
+ export {
30
+ ConcurrencyLimiter
31
+ };
32
32
  //# sourceMappingURL=concurrency-limiter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"concurrency-limiter.js","sources":["../src/concurrency-limiter.ts"],"sourcesContent":["/**\n * ConcurrencyLimiter manages the number of concurrent operations that can be performed.\n * It ensures that the number of operations does not exceed a specified maximum limit.\n */\nexport class ConcurrencyLimiter {\n current = 0\n resolvers: Array<() => void> = []\n public max: number\n constructor(max: number) {\n this.max = max\n }\n\n /**\n * Indicates when a slot for a new operation is ready.\n * If under the limit, it resolves immediately; otherwise, it waits until a slot is free.\n */\n ready = (): Promise<void> => {\n if (this.max === Infinity) return Promise.resolve()\n\n if (this.current < this.max) {\n this.current++\n return Promise.resolve()\n }\n\n return new Promise<void>((resolve) => {\n this.resolvers.push(resolve)\n })\n }\n\n /**\n * Releases a slot, decrementing the current count of operations if nothing is in the queue.\n * If there are operations waiting, it allows the next one in the queue to proceed.\n */\n release = (): void => {\n if (this.max === Infinity) return\n\n const nextResolver = this.resolvers.shift()\n if (nextResolver) {\n nextResolver()\n return\n }\n\n this.current = Math.max(0, this.current - 1)\n }\n}\n"],"names":[],"mappings":";;AAIO,MAAM,mBAAmB;AAAA,EAC9B,UAAU;AAAA,EACV,YAA+B,CAAA;AAAA,EACxB;AAAA,EACP,YAAY,KAAa;AACvB,SAAK,MAAM;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,MACF,KAAK,QAAQ,QAAiB,QAAQ,QAAA,IAEtC,KAAK,UAAU,KAAK,OACtB,KAAK,WACE,QAAQ,aAGV,IAAI,QAAc,CAAC,YAAY;AACpC,SAAK,UAAU,KAAK,OAAO;AAAA,EAC7B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOH,UAAU,MAAY;AACpB,QAAI,KAAK,QAAQ,MAAU;AAE3B,UAAM,eAAe,KAAK,UAAU,MAAA;AACpC,QAAI,cAAc;AAChB,mBAAA;AACA;AAAA,IACF;AAEA,SAAK,UAAU,KAAK,IAAI,GAAG,KAAK,UAAU,CAAC;AAAA,EAC7C;AACF;;"}
1
+ {"version":3,"file":"concurrency-limiter.js","sources":["../src/concurrency-limiter.ts"],"sourcesContent":["/**\n * ConcurrencyLimiter manages the number of concurrent operations that can be performed.\n * It ensures that the number of operations does not exceed a specified maximum limit.\n */\nexport class ConcurrencyLimiter {\n current = 0\n resolvers: Array<() => void> = []\n public max: number\n constructor(max: number) {\n this.max = max\n }\n\n /**\n * Indicates when a slot for a new operation is ready.\n * If under the limit, it resolves immediately; otherwise, it waits until a slot is free.\n */\n ready = (): Promise<void> => {\n if (this.max === Infinity) return Promise.resolve()\n\n if (this.current < this.max) {\n this.current++\n return Promise.resolve()\n }\n\n return new Promise<void>((resolve) => {\n this.resolvers.push(resolve)\n })\n }\n\n /**\n * Releases a slot, decrementing the current count of operations if nothing is in the queue.\n * If there are operations waiting, it allows the next one in the queue to proceed.\n */\n release = (): void => {\n if (this.max === Infinity) return\n\n const nextResolver = this.resolvers.shift()\n if (nextResolver) {\n nextResolver()\n return\n }\n\n this.current = Math.max(0, this.current - 1)\n }\n}\n"],"names":[],"mappings":"AAIO,MAAM,mBAAmB;AAAA,EAC9B,UAAU;AAAA,EACV,YAA+B,CAAA;AAAA,EACxB;AAAA,EACP,YAAY,KAAa;AACvB,SAAK,MAAM;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,MACF,KAAK,QAAQ,QAAiB,QAAQ,QAAA,IAEtC,KAAK,UAAU,KAAK,OACtB,KAAK,WACE,QAAQ,aAGV,IAAI,QAAc,CAAC,YAAY;AACpC,SAAK,UAAU,KAAK,OAAO;AAAA,EAC7B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOH,UAAU,MAAY;AACpB,QAAI,KAAK,QAAQ,MAAU;AAE3B,UAAM,eAAe,KAAK,UAAU,MAAA;AACpC,QAAI,cAAc;AAChB,mBAAA;AACA;AAAA,IACF;AAEA,SAAK,UAAU,KAAK,IAAI,GAAG,KAAK,UAAU,CAAC;AAAA,EAC7C;AACF;"}
package/lib/content.js CHANGED
@@ -1,5 +1,3 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: !0 });
3
1
  var hasOwn = Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty);
4
2
  function isDeepEmptyObject(value) {
5
3
  for (const key in value)
@@ -78,11 +76,13 @@ function resolveTypeName(value) {
78
76
  const obj = value;
79
77
  return "_type" in obj && obj._type || jsType;
80
78
  }
81
- exports.isDeepEmpty = isDeepEmpty;
82
- exports.isEmpty = isEmpty;
83
- exports.isEmptyArray = isEmptyArray;
84
- exports.isEmptyObject = isEmptyObject;
85
- exports.isShallowEmptyObject = isShallowEmptyObject;
86
- exports.randomKey = randomKey;
87
- exports.resolveTypeName = resolveTypeName;
79
+ export {
80
+ isDeepEmpty,
81
+ isEmpty,
82
+ isEmptyArray,
83
+ isEmptyObject,
84
+ isShallowEmptyObject,
85
+ randomKey,
86
+ resolveTypeName
87
+ };
88
88
  //# sourceMappingURL=content.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"content.js","sources":["../src/content/hasOwn.ts","../src/content/isDeepEmpty.ts","../src/content/isShallowEmptyObject.ts","../src/content/randomKey.ts","../src/content/resolveJSType.ts","../src/content/resolveTypeName.ts"],"sourcesContent":["export default Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty)\n","import hasOwn from './hasOwn'\n\nfunction isDeepEmptyObject(value: {[key: string]: any}): boolean {\n for (const key in value) {\n if (key === '_type' || key === '_key') {\n continue\n }\n if (hasOwn(value, key) && !isDeepEmpty(value[key])) {\n return false\n }\n }\n return true\n}\n\nfunction isDeepEmptyArray(value: unknown[]): boolean {\n for (let i = 0; i < value.length; i++) {\n if (!isDeepEmpty(value[i])) {\n return false\n }\n }\n return true\n}\n\n/**\n * Looks at the value and determines if it is deeply empty while not considering _type and _key attributes on objects.\n * A value will be considered deeply empty if it is:\n * - undefined or null\n * - an object where all property values are deeply empty\n * - an array where all items are deeply empty\n * @param value - the value to check for deep emptiness\n */\nexport function isDeepEmpty(value: unknown): boolean {\n if (value === undefined || value === null) {\n return true\n }\n const type = typeof value\n\n if (Array.isArray(value)) {\n return isDeepEmptyArray(value)\n }\n if (type === 'object') {\n return isDeepEmptyObject(value)\n }\n return false\n}\n\n/**\n * @deprecated Use `isDeepEmpty` instead\n * todo: remove in v4\n */\nexport const isEmptyArray = isDeepEmptyArray\n\n/**\n * @deprecated Use `isDeepEmpty` instead\n * todo: remove in v4\n */\nexport const isEmpty = isDeepEmpty\n\n/**\n * @deprecated Use `isDeepEmpty` instead\n * todo: remove in v4\n */\nexport const isEmptyObject = isDeepEmptyObject\n","import hasOwn from './hasOwn'\n\nexport function isShallowEmptyObject(value: {[key: string]: unknown}): boolean {\n for (const key in value) {\n if (key === '_type' || key === '_key') {\n continue\n }\n if (hasOwn(value, key) && value[key] !== undefined) {\n return false\n }\n }\n return true\n}\n","const getByteHexTable = (() => {\n let table: string[]\n return () => {\n if (table) {\n return table\n }\n\n table = []\n for (let i = 0; i < 256; ++i) {\n table[i] = (i + 0x100).toString(16).slice(1)\n }\n return table\n }\n})()\n\n// WHATWG crypto RNG - https://w3c.github.io/webcrypto/Overview.html\nfunction whatwgRNG(length = 16) {\n const rnds8 = new Uint8Array(length)\n crypto.getRandomValues(rnds8)\n return rnds8\n}\n\nexport function randomKey(length?: number): string {\n const table = getByteHexTable()\n return whatwgRNG(length)\n .reduce((str, n) => str + table[n], '')\n .slice(0, length)\n}\n","const toString = Object.prototype.toString\n// Copied from https://github.com/ForbesLindesay/type-of, but inlined to have fine grained control\n\nexport function resolveJSType(val: unknown) {\n switch (toString.call(val)) {\n case '[object Function]':\n return 'function'\n case '[object Date]':\n return 'date'\n case '[object RegExp]':\n return 'regexp'\n case '[object Arguments]':\n return 'arguments'\n case '[object Array]':\n return 'array'\n case '[object String]':\n return 'string'\n default:\n }\n\n if (typeof val == 'object' && val && typeof (val as any).length == 'number') {\n try {\n if (typeof (val as any).callee == 'function') {\n return 'arguments'\n }\n } catch (ex) {\n if (ex instanceof TypeError) {\n return 'arguments'\n }\n }\n }\n\n if (val === null) {\n return 'null'\n }\n\n if (val === undefined) {\n return 'undefined'\n }\n\n if (val && (val as any).nodeType === 1) {\n return 'element'\n }\n\n if (val === Object(val)) {\n return 'object'\n }\n\n return typeof val\n}\n","import {resolveJSType} from './resolveJSType'\n\nexport function resolveTypeName(value: unknown): string {\n const jsType = resolveJSType(value)\n if (jsType !== 'object') {\n return jsType\n }\n\n const obj = value as Record<string, unknown> & {_type?: string}\n return ('_type' in obj && obj._type) || jsType\n}\n"],"names":[],"mappings":";;AAAA,IAAA,SAAe,OAAO,UAAU,eAAe,KAAK,KAAK,OAAO,UAAU,cAAc;ACExF,SAAS,kBAAkB,OAAsC;AAC/D,aAAW,OAAO;AAChB,QAAI,EAAA,QAAQ,WAAW,QAAQ,WAG3B,OAAO,OAAO,GAAG,KAAK,CAAC,YAAY,MAAM,GAAG,CAAC;AAC/C,aAAO;AAGX,SAAO;AACT;AAEA,SAAS,iBAAiB,OAA2B;AACnD,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ;AAChC,QAAI,CAAC,YAAY,MAAM,CAAC,CAAC;AACvB,aAAO;AAGX,SAAO;AACT;AAUO,SAAS,YAAY,OAAyB;AACnD,MAA2B,SAAU;AACnC,WAAO;AAET,QAAM,OAAO,OAAO;AAEpB,SAAI,MAAM,QAAQ,KAAK,IACd,iBAAiB,KAAK,IAE3B,SAAS,WACJ,kBAAkB,KAAK,IAEzB;AACT;AAMO,MAAM,eAAe,kBAMf,UAAU,aAMV,gBAAgB;AC5DtB,SAAS,qBAAqB,OAA0C;AAC7E,aAAW,OAAO;AAChB,QAAI,EAAA,QAAQ,WAAW,QAAQ,WAG3B,OAAO,OAAO,GAAG,KAAK,MAAM,GAAG,MAAM;AACvC,aAAO;AAGX,SAAO;AACT;ACZA,MAAM,kBAAmB,uBAAM;AAC7B,MAAI;AACJ,SAAO,MAAM;AACX,QAAI;AACF,aAAO;AAGT,YAAQ,CAAA;AACR,aAAS,IAAI,GAAG,IAAI,KAAK,EAAE;AACzB,YAAM,CAAC,KAAK,IAAI,KAAO,SAAS,EAAE,EAAE,MAAM,CAAC;AAE7C,WAAO;AAAA,EACT;AACF,GAAA;AAGA,SAAS,UAAU,SAAS,IAAI;AAC9B,QAAM,QAAQ,IAAI,WAAW,MAAM;AACnC,SAAA,OAAO,gBAAgB,KAAK,GACrB;AACT;AAEO,SAAS,UAAU,QAAyB;AACjD,QAAM,QAAQ,gBAAA;AACd,SAAO,UAAU,MAAM,EACpB,OAAO,CAAC,KAAK,MAAM,MAAM,MAAM,CAAC,GAAG,EAAE,EACrC,MAAM,GAAG,MAAM;AACpB;AC3BA,MAAM,WAAW,OAAO,UAAU;AAG3B,SAAS,cAAc,KAAc;AAC1C,UAAQ,SAAS,KAAK,GAAG,GAAA;AAAA,IACvB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACT;AAGF,MAAI,OAAO,OAAO,YAAY,OAAO,OAAQ,IAAY,UAAU;AACjE,QAAI;AACF,UAAI,OAAQ,IAAY,UAAU;AAChC,eAAO;AAAA,IAEX,SAAS,IAAI;AACX,UAAI,cAAc;AAChB,eAAO;AAAA,IAEX;AAGF,SAAI,QAAQ,OACH,SAGL,QAAQ,SACH,cAGL,OAAQ,IAAY,aAAa,IAC5B,YAGL,QAAQ,OAAO,GAAG,IACb,WAGF,OAAO;AAChB;AC/CO,SAAS,gBAAgB,OAAwB;AACtD,QAAM,SAAS,cAAc,KAAK;AAClC,MAAI,WAAW;AACb,WAAO;AAGT,QAAM,MAAM;AACZ,SAAQ,WAAW,OAAO,IAAI,SAAU;AAC1C;;;;;;;;"}
1
+ {"version":3,"file":"content.js","sources":["../src/content/hasOwn.ts","../src/content/isDeepEmpty.ts","../src/content/isShallowEmptyObject.ts","../src/content/randomKey.ts","../src/content/resolveJSType.ts","../src/content/resolveTypeName.ts"],"sourcesContent":["export default Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty)\n","import hasOwn from './hasOwn'\n\nfunction isDeepEmptyObject(value: {[key: string]: any}): boolean {\n for (const key in value) {\n if (key === '_type' || key === '_key') {\n continue\n }\n if (hasOwn(value, key) && !isDeepEmpty(value[key])) {\n return false\n }\n }\n return true\n}\n\nfunction isDeepEmptyArray(value: unknown[]): boolean {\n for (let i = 0; i < value.length; i++) {\n if (!isDeepEmpty(value[i])) {\n return false\n }\n }\n return true\n}\n\n/**\n * Looks at the value and determines if it is deeply empty while not considering _type and _key attributes on objects.\n * A value will be considered deeply empty if it is:\n * - undefined or null\n * - an object where all property values are deeply empty\n * - an array where all items are deeply empty\n * @param value - the value to check for deep emptiness\n */\nexport function isDeepEmpty(value: unknown): boolean {\n if (value === undefined || value === null) {\n return true\n }\n const type = typeof value\n\n if (Array.isArray(value)) {\n return isDeepEmptyArray(value)\n }\n if (type === 'object') {\n return isDeepEmptyObject(value)\n }\n return false\n}\n\n/**\n * @deprecated Use `isDeepEmpty` instead\n * todo: remove in v4\n */\nexport const isEmptyArray = isDeepEmptyArray\n\n/**\n * @deprecated Use `isDeepEmpty` instead\n * todo: remove in v4\n */\nexport const isEmpty = isDeepEmpty\n\n/**\n * @deprecated Use `isDeepEmpty` instead\n * todo: remove in v4\n */\nexport const isEmptyObject = isDeepEmptyObject\n","import hasOwn from './hasOwn'\n\nexport function isShallowEmptyObject(value: {[key: string]: unknown}): boolean {\n for (const key in value) {\n if (key === '_type' || key === '_key') {\n continue\n }\n if (hasOwn(value, key) && value[key] !== undefined) {\n return false\n }\n }\n return true\n}\n","const getByteHexTable = (() => {\n let table: string[]\n return () => {\n if (table) {\n return table\n }\n\n table = []\n for (let i = 0; i < 256; ++i) {\n table[i] = (i + 0x100).toString(16).slice(1)\n }\n return table\n }\n})()\n\n// WHATWG crypto RNG - https://w3c.github.io/webcrypto/Overview.html\nfunction whatwgRNG(length = 16) {\n const rnds8 = new Uint8Array(length)\n crypto.getRandomValues(rnds8)\n return rnds8\n}\n\nexport function randomKey(length?: number): string {\n const table = getByteHexTable()\n return whatwgRNG(length)\n .reduce((str, n) => str + table[n], '')\n .slice(0, length)\n}\n","const toString = Object.prototype.toString\n// Copied from https://github.com/ForbesLindesay/type-of, but inlined to have fine grained control\n\nexport function resolveJSType(val: unknown) {\n switch (toString.call(val)) {\n case '[object Function]':\n return 'function'\n case '[object Date]':\n return 'date'\n case '[object RegExp]':\n return 'regexp'\n case '[object Arguments]':\n return 'arguments'\n case '[object Array]':\n return 'array'\n case '[object String]':\n return 'string'\n default:\n }\n\n if (typeof val == 'object' && val && typeof (val as any).length == 'number') {\n try {\n if (typeof (val as any).callee == 'function') {\n return 'arguments'\n }\n } catch (ex) {\n if (ex instanceof TypeError) {\n return 'arguments'\n }\n }\n }\n\n if (val === null) {\n return 'null'\n }\n\n if (val === undefined) {\n return 'undefined'\n }\n\n if (val && (val as any).nodeType === 1) {\n return 'element'\n }\n\n if (val === Object(val)) {\n return 'object'\n }\n\n return typeof val\n}\n","import {resolveJSType} from './resolveJSType'\n\nexport function resolveTypeName(value: unknown): string {\n const jsType = resolveJSType(value)\n if (jsType !== 'object') {\n return jsType\n }\n\n const obj = value as Record<string, unknown> & {_type?: string}\n return ('_type' in obj && obj._type) || jsType\n}\n"],"names":[],"mappings":"AAAA,IAAA,SAAe,OAAO,UAAU,eAAe,KAAK,KAAK,OAAO,UAAU,cAAc;ACExF,SAAS,kBAAkB,OAAsC;AAC/D,aAAW,OAAO;AAChB,QAAI,EAAA,QAAQ,WAAW,QAAQ,WAG3B,OAAO,OAAO,GAAG,KAAK,CAAC,YAAY,MAAM,GAAG,CAAC;AAC/C,aAAO;AAGX,SAAO;AACT;AAEA,SAAS,iBAAiB,OAA2B;AACnD,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ;AAChC,QAAI,CAAC,YAAY,MAAM,CAAC,CAAC;AACvB,aAAO;AAGX,SAAO;AACT;AAUO,SAAS,YAAY,OAAyB;AACnD,MAA2B,SAAU;AACnC,WAAO;AAET,QAAM,OAAO,OAAO;AAEpB,SAAI,MAAM,QAAQ,KAAK,IACd,iBAAiB,KAAK,IAE3B,SAAS,WACJ,kBAAkB,KAAK,IAEzB;AACT;AAMO,MAAM,eAAe,kBAMf,UAAU,aAMV,gBAAgB;AC5DtB,SAAS,qBAAqB,OAA0C;AAC7E,aAAW,OAAO;AAChB,QAAI,EAAA,QAAQ,WAAW,QAAQ,WAG3B,OAAO,OAAO,GAAG,KAAK,MAAM,GAAG,MAAM;AACvC,aAAO;AAGX,SAAO;AACT;ACZA,MAAM,kBAAmB,uBAAM;AAC7B,MAAI;AACJ,SAAO,MAAM;AACX,QAAI;AACF,aAAO;AAGT,YAAQ,CAAA;AACR,aAAS,IAAI,GAAG,IAAI,KAAK,EAAE;AACzB,YAAM,CAAC,KAAK,IAAI,KAAO,SAAS,EAAE,EAAE,MAAM,CAAC;AAE7C,WAAO;AAAA,EACT;AACF,GAAA;AAGA,SAAS,UAAU,SAAS,IAAI;AAC9B,QAAM,QAAQ,IAAI,WAAW,MAAM;AACnC,SAAA,OAAO,gBAAgB,KAAK,GACrB;AACT;AAEO,SAAS,UAAU,QAAyB;AACjD,QAAM,QAAQ,gBAAA;AACd,SAAO,UAAU,MAAM,EACpB,OAAO,CAAC,KAAK,MAAM,MAAM,MAAM,CAAC,GAAG,EAAE,EACrC,MAAM,GAAG,MAAM;AACpB;AC3BA,MAAM,WAAW,OAAO,UAAU;AAG3B,SAAS,cAAc,KAAc;AAC1C,UAAQ,SAAS,KAAK,GAAG,GAAA;AAAA,IACvB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACT;AAGF,MAAI,OAAO,OAAO,YAAY,OAAO,OAAQ,IAAY,UAAU;AACjE,QAAI;AACF,UAAI,OAAQ,IAAY,UAAU;AAChC,eAAO;AAAA,IAEX,SAAS,IAAI;AACX,UAAI,cAAc;AAChB,eAAO;AAAA,IAEX;AAGF,SAAI,QAAQ,OACH,SAGL,QAAQ,SACH,cAGL,OAAQ,IAAY,aAAa,IAC5B,YAGL,QAAQ,OAAO,GAAG,IACb,WAGF,OAAO;AAChB;AC/CO,SAAS,gBAAgB,OAAwB;AACtD,QAAM,SAAS,cAAc,KAAK;AAClC,MAAI,WAAW;AACb,WAAO;AAGT,QAAM,MAAM;AACZ,SAAQ,WAAW,OAAO,IAAI,SAAU;AAC1C;"}
@@ -1,5 +1,3 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: !0 });
3
1
  function createSafeJsonParser({ errorLabel }) {
4
2
  return function(line) {
5
3
  try {
@@ -16,5 +14,7 @@ ${errorJson}
16
14
  }
17
15
  };
18
16
  }
19
- exports.createSafeJsonParser = createSafeJsonParser;
17
+ export {
18
+ createSafeJsonParser
19
+ };
20
20
  //# sourceMappingURL=createSafeJsonParser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createSafeJsonParser.js","sources":["../src/createSafeJsonParser.ts"],"sourcesContent":["interface Options {\n errorLabel: string\n}\n\ntype Parser<Type> = (line: string) => Type\n\n/**\n * Create a safe JSON parser that is able to handle lines interrupted by an error object.\n *\n * This may occur when streaming NDJSON from the Export HTTP API.\n *\n * @internal\n * @see {@link https://github.com/sanity-io/sanity/pull/1787 | Initial pull request}\n */\nexport function createSafeJsonParser<Type>({errorLabel}: Options): Parser<Type> {\n return function safeJsonParser(line) {\n try {\n return JSON.parse(line)\n } catch (err) {\n // Catch half-done lines with an error at the end\n const errorPosition = line.lastIndexOf('{\"error\":')\n if (errorPosition === -1) {\n err.message = `${err.message} (${line})`\n throw err\n }\n\n const errorJson = line.slice(errorPosition)\n const errorLine = JSON.parse(errorJson)\n const error = errorLine && errorLine.error\n if (error && error.description) {\n throw new Error(`${errorLabel}: ${error.description}\\n\\n${errorJson}\\n`, {cause: err})\n }\n\n throw err\n }\n }\n}\n"],"names":[],"mappings":";;AAcO,SAAS,qBAA2B,EAAC,cAAoC;AAC9E,SAAO,SAAwB,MAAM;AACnC,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,SAAS,KAAK;AAEZ,YAAM,gBAAgB,KAAK,YAAY,WAAW;AAClD,UAAI,kBAAkB;AACpB,cAAA,IAAI,UAAU,GAAG,IAAI,OAAO,KAAK,IAAI,KAC/B;AAGR,YAAM,YAAY,KAAK,MAAM,aAAa,GACpC,YAAY,KAAK,MAAM,SAAS,GAChC,QAAQ,aAAa,UAAU;AACrC,YAAI,SAAS,MAAM,cACX,IAAI,MAAM,GAAG,UAAU,KAAK,MAAM,WAAW;AAAA;AAAA,EAAO,SAAS;AAAA,GAAM,EAAC,OAAO,IAAA,CAAI,IAGjF;AAAA,IACR;AAAA,EACF;AACF;;"}
1
+ {"version":3,"file":"createSafeJsonParser.js","sources":["../src/createSafeJsonParser.ts"],"sourcesContent":["interface Options {\n errorLabel: string\n}\n\ntype Parser<Type> = (line: string) => Type\n\n/**\n * Create a safe JSON parser that is able to handle lines interrupted by an error object.\n *\n * This may occur when streaming NDJSON from the Export HTTP API.\n *\n * @internal\n * @see {@link https://github.com/sanity-io/sanity/pull/1787 | Initial pull request}\n */\nexport function createSafeJsonParser<Type>({errorLabel}: Options): Parser<Type> {\n return function safeJsonParser(line) {\n try {\n return JSON.parse(line)\n } catch (err) {\n // Catch half-done lines with an error at the end\n const errorPosition = line.lastIndexOf('{\"error\":')\n if (errorPosition === -1) {\n err.message = `${err.message} (${line})`\n throw err\n }\n\n const errorJson = line.slice(errorPosition)\n const errorLine = JSON.parse(errorJson)\n const error = errorLine && errorLine.error\n if (error && error.description) {\n throw new Error(`${errorLabel}: ${error.description}\\n\\n${errorJson}\\n`, {cause: err})\n }\n\n throw err\n }\n }\n}\n"],"names":[],"mappings":"AAcO,SAAS,qBAA2B,EAAC,cAAoC;AAC9E,SAAO,SAAwB,MAAM;AACnC,QAAI;AACF,aAAO,KAAK,MAAM,IAAI;AAAA,IACxB,SAAS,KAAK;AAEZ,YAAM,gBAAgB,KAAK,YAAY,WAAW;AAClD,UAAI,kBAAkB;AACpB,cAAA,IAAI,UAAU,GAAG,IAAI,OAAO,KAAK,IAAI,KAC/B;AAGR,YAAM,YAAY,KAAK,MAAM,aAAa,GACpC,YAAY,KAAK,MAAM,SAAS,GAChC,QAAQ,aAAa,UAAU;AACrC,YAAI,SAAS,MAAM,cACX,IAAI,MAAM,GAAG,UAAU,KAAK,MAAM,WAAW;AAAA;AAAA,EAAO,SAAS;AAAA,GAAM,EAAC,OAAO,IAAA,CAAI,IAGjF;AAAA,IACR;AAAA,EACF;AACF;"}
package/lib/fs.js CHANGED
@@ -1,13 +1,9 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: !0 });
3
- var fs = require("node:fs/promises"), os = require("node:os"), path = require("node:path");
4
- function _interopDefaultCompat(e) {
5
- return e && typeof e == "object" && "default" in e ? e : { default: e };
6
- }
7
- var fs__default = /* @__PURE__ */ _interopDefaultCompat(fs), os__default = /* @__PURE__ */ _interopDefaultCompat(os), path__default = /* @__PURE__ */ _interopDefaultCompat(path);
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
8
4
  async function pathIsEmpty(dir) {
9
5
  try {
10
- return (await fs__default.default.readdir(absolutify(dir))).length === 0;
6
+ return (await fs.readdir(absolutify(dir))).length === 0;
11
7
  } catch (err) {
12
8
  if (err.code === "ENOENT")
13
9
  return !0;
@@ -17,17 +13,19 @@ async function pathIsEmpty(dir) {
17
13
  function expandHome(filePath) {
18
14
  if (filePath.charCodeAt(0) === 126) {
19
15
  if (filePath.charCodeAt(1) === 43)
20
- return path__default.default.join(process.cwd(), filePath.slice(2));
21
- const home = os__default.default.homedir();
22
- return home ? path__default.default.join(home, filePath.slice(1)) : filePath;
16
+ return path.join(process.cwd(), filePath.slice(2));
17
+ const home = os.homedir();
18
+ return home ? path.join(home, filePath.slice(1)) : filePath;
23
19
  }
24
20
  return filePath;
25
21
  }
26
22
  function absolutify(dir) {
27
23
  const pathName = expandHome(dir);
28
- return path__default.default.isAbsolute(pathName) ? pathName : path__default.default.resolve(process.cwd(), pathName);
24
+ return path.isAbsolute(pathName) ? pathName : path.resolve(process.cwd(), pathName);
29
25
  }
30
- exports.absolutify = absolutify;
31
- exports.expandHome = expandHome;
32
- exports.pathIsEmpty = pathIsEmpty;
26
+ export {
27
+ absolutify,
28
+ expandHome,
29
+ pathIsEmpty
30
+ };
33
31
  //# sourceMappingURL=fs.js.map
package/lib/fs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"fs.js","sources":["../src/fsTools.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\n\nexport async function pathIsEmpty(dir: string): Promise<boolean> {\n try {\n const content = await fs.readdir(absolutify(dir))\n return content.length === 0\n } catch (err) {\n if (err.code === 'ENOENT') {\n return true\n }\n\n throw err\n }\n}\n\nexport function expandHome(filePath: string): string {\n if (\n filePath.charCodeAt(0) === 126\n /* ~ */\n ) {\n if (\n filePath.charCodeAt(1) === 43\n /* + */\n ) {\n return path.join(process.cwd(), filePath.slice(2))\n }\n\n const home = os.homedir()\n return home ? path.join(home, filePath.slice(1)) : filePath\n }\n\n return filePath\n}\n\nexport function absolutify(dir: string): string {\n const pathName = expandHome(dir)\n return path.isAbsolute(pathName) ? pathName : path.resolve(process.cwd(), pathName)\n}\n"],"names":["fs","path","os"],"mappings":";;;;;;;AAIA,eAAsB,YAAY,KAA+B;AAC/D,MAAI;AAEF,YADgB,MAAMA,YAAAA,QAAG,QAAQ,WAAW,GAAG,CAAC,GACjC,WAAW;AAAA,EAC5B,SAAS,KAAK;AACZ,QAAI,IAAI,SAAS;AACf,aAAO;AAGT,UAAM;AAAA,EACR;AACF;AAEO,SAAS,WAAW,UAA0B;AACnD,MACE,SAAS,WAAW,CAAC,MAAM,KAE3B;AACA,QACE,SAAS,WAAW,CAAC,MAAM;AAG3B,aAAOC,cAAAA,QAAK,KAAK,QAAQ,IAAA,GAAO,SAAS,MAAM,CAAC,CAAC;AAGnD,UAAM,OAAOC,YAAAA,QAAG,QAAA;AAChB,WAAO,OAAOD,cAAAA,QAAK,KAAK,MAAM,SAAS,MAAM,CAAC,CAAC,IAAI;AAAA,EACrD;AAEA,SAAO;AACT;AAEO,SAAS,WAAW,KAAqB;AAC9C,QAAM,WAAW,WAAW,GAAG;AAC/B,SAAOA,sBAAK,WAAW,QAAQ,IAAI,WAAWA,sBAAK,QAAQ,QAAQ,IAAA,GAAO,QAAQ;AACpF;;;;"}
1
+ {"version":3,"file":"fs.js","sources":["../src/fsTools.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\n\nexport async function pathIsEmpty(dir: string): Promise<boolean> {\n try {\n const content = await fs.readdir(absolutify(dir))\n return content.length === 0\n } catch (err) {\n if (err.code === 'ENOENT') {\n return true\n }\n\n throw err\n }\n}\n\nexport function expandHome(filePath: string): string {\n if (\n filePath.charCodeAt(0) === 126\n /* ~ */\n ) {\n if (\n filePath.charCodeAt(1) === 43\n /* + */\n ) {\n return path.join(process.cwd(), filePath.slice(2))\n }\n\n const home = os.homedir()\n return home ? path.join(home, filePath.slice(1)) : filePath\n }\n\n return filePath\n}\n\nexport function absolutify(dir: string): string {\n const pathName = expandHome(dir)\n return path.isAbsolute(pathName) ? pathName : path.resolve(process.cwd(), pathName)\n}\n"],"names":[],"mappings":";;;AAIA,eAAsB,YAAY,KAA+B;AAC/D,MAAI;AAEF,YADgB,MAAM,GAAG,QAAQ,WAAW,GAAG,CAAC,GACjC,WAAW;AAAA,EAC5B,SAAS,KAAK;AACZ,QAAI,IAAI,SAAS;AACf,aAAO;AAGT,UAAM;AAAA,EACR;AACF;AAEO,SAAS,WAAW,UAA0B;AACnD,MACE,SAAS,WAAW,CAAC,MAAM,KAE3B;AACA,QACE,SAAS,WAAW,CAAC,MAAM;AAG3B,aAAO,KAAK,KAAK,QAAQ,IAAA,GAAO,SAAS,MAAM,CAAC,CAAC;AAGnD,UAAM,OAAO,GAAG,QAAA;AAChB,WAAO,OAAO,KAAK,KAAK,MAAM,SAAS,MAAM,CAAC,CAAC,IAAI;AAAA,EACrD;AAEA,SAAO;AACT;AAEO,SAAS,WAAW,KAAqB;AAC9C,QAAM,WAAW,WAAW,GAAG;AAC/B,SAAO,KAAK,WAAW,QAAQ,IAAI,WAAW,KAAK,QAAQ,QAAQ,IAAA,GAAO,QAAQ;AACpF;"}
package/lib/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";
1
+
2
2
  //# sourceMappingURL=index.js.map
@@ -1,6 +1,6 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: !0 });
3
- var tz = require("@date-fns/tz"), utc = require("@date-fns/utc"), dateFns = require("date-fns");
1
+ import { TZDateMini } from "@date-fns/tz";
2
+ import { UTCDateMini } from "@date-fns/utc";
3
+ import { format as format$1, parse as parse$1, parseISO } from "date-fns";
4
4
  const sanitizeLocale = (locale) => locale.replace(/@posix$/, "");
5
5
  function getMonthName(date, style = "long", locale = "en-US") {
6
6
  const validLocale = sanitizeLocale(locale);
@@ -47,10 +47,10 @@ function getFractionalSeconds(date, length) {
47
47
  return length === 1 ? ms.slice(0, 1) : length === 2 ? ms.slice(0, 2) : length === 3 ? ms : `${ms}0`;
48
48
  }
49
49
  function getTimeZoneAbbreviation(date) {
50
- const tz2 = new Intl.DateTimeFormat(sanitizeLocale("en-US"), {
50
+ const tz = new Intl.DateTimeFormat(sanitizeLocale("en-US"), {
51
51
  timeZoneName: "short"
52
52
  }).formatToParts(date).find((part) => part.type === "timeZoneName");
53
- return tz2 ? tz2.value : "";
53
+ return tz ? tz.value : "";
54
54
  }
55
55
  function formatMomentLike(date, formatStr) {
56
56
  const escapeSequences = [], processedFormat = formatStr.replace(/\[([^\]]+)\]/g, (_, contents) => (escapeSequences.push(contents), "\uE000")), year = date.getFullYear(), monthIndex = date.getMonth(), dayOfMonth = date.getDate(), dayOfWeek = date.getDay(), hours = date.getHours(), minutes = date.getMinutes(), seconds = date.getSeconds(), isoWeekNum = getISOWeekNumber(date), isoWeekYear = getISOWeekYear(date), localeWeekYear = getLocaleWeekYear(date), unixMs = date.getTime(), unixSec = Math.floor(unixMs / 1e3), tokens = [
@@ -151,8 +151,8 @@ function formatMomentLike(date, formatStr) {
151
151
  // Time zone offset
152
152
  { key: "z", getValue: () => getTimeZoneAbbreviation(date) },
153
153
  { key: "zz", getValue: () => getTimeZoneAbbreviation(date) },
154
- { key: "Z", getValue: () => dateFns.format(date, "xxx") },
155
- { key: "ZZ", getValue: () => dateFns.format(date, "xx") },
154
+ { key: "Z", getValue: () => format$1(date, "xxx") },
155
+ { key: "ZZ", getValue: () => format$1(date, "xx") },
156
156
  // Time
157
157
  { key: "LTS", getValue: () => getLocalizedDate(date, { timeStyle: "medium" }) },
158
158
  { key: "LT", getValue: () => getLocalizedDate(date, { timeStyle: "short" }) },
@@ -260,13 +260,13 @@ function momentToDateFnsFormat(momentFormat) {
260
260
  const DEFAULT_DATE_FORMAT = "YYYY-MM-DD", DEFAULT_TIME_FORMAT = "HH:mm", DEFAULT_TIMEZONE = Intl.DateTimeFormat().resolvedOptions().timeZone;
261
261
  function format(input, dateFormat, options = { useUTC: !1, timeZone: void 0 }) {
262
262
  const { useUTC, timeZone } = options;
263
- return formatMomentLike(useUTC ? new utc.UTCDateMini(input) : timeZone ? new tz.TZDateMini(input, timeZone || DEFAULT_TIMEZONE) : new Date(input), dateFormat);
263
+ return formatMomentLike(useUTC ? new UTCDateMini(input) : timeZone ? new TZDateMini(input, timeZone || DEFAULT_TIMEZONE) : new Date(input), dateFormat);
264
264
  }
265
265
  function parse(dateString, dateFormat, timeZone) {
266
- const dnsFormat = dateFormat ? momentToDateFnsFormat(dateFormat) : void 0, parsed = dnsFormat ? dateFns.parse(dateString, dnsFormat, /* @__PURE__ */ new Date()) : dateFns.parseISO(dateString);
266
+ const dnsFormat = dateFormat ? momentToDateFnsFormat(dateFormat) : void 0, parsed = dnsFormat ? parse$1(dateString, dnsFormat, /* @__PURE__ */ new Date()) : parseISO(dateString);
267
267
  if (parsed && !isNaN(parsed.getTime())) {
268
268
  let parsedDate = parsed;
269
- return timeZone && isValidTimeZoneString(timeZone) && dateFormat ? parsedDate = new tz.TZDateMini(
269
+ return timeZone && isValidTimeZoneString(timeZone) && dateFormat ? parsedDate = new TZDateMini(
270
270
  parsed.getFullYear(),
271
271
  parsed.getMonth(),
272
272
  parsed.getDate(),
@@ -275,17 +275,19 @@ function parse(dateString, dateFormat, timeZone) {
275
275
  parsed.getSeconds(),
276
276
  parsed.getMilliseconds(),
277
277
  timeZone
278
- ) : timeZone && isValidTimeZoneString(timeZone) && (parsedDate = new tz.TZDateMini(parsed, timeZone)), { isValid: !0, date: parsedDate };
278
+ ) : timeZone && isValidTimeZoneString(timeZone) && (parsedDate = new TZDateMini(parsed, timeZone)), { isValid: !0, date: parsedDate };
279
279
  }
280
280
  return { isValid: !1, error: `Invalid date. Must be on the format "${dateFormat}"` };
281
281
  }
282
282
  function isValidTimeZoneString(timeZone) {
283
283
  return Intl.supportedValuesOf("timeZone").includes(timeZone);
284
284
  }
285
- exports.DEFAULT_DATE_FORMAT = DEFAULT_DATE_FORMAT;
286
- exports.DEFAULT_TIME_FORMAT = DEFAULT_TIME_FORMAT;
287
- exports.format = format;
288
- exports.isValidTimeZoneString = isValidTimeZoneString;
289
- exports.parse = parse;
290
- exports.sanitizeLocale = sanitizeLocale;
285
+ export {
286
+ DEFAULT_DATE_FORMAT,
287
+ DEFAULT_TIME_FORMAT,
288
+ format,
289
+ isValidTimeZoneString,
290
+ parse,
291
+ sanitizeLocale
292
+ };
291
293
  //# sourceMappingURL=legacyDateFormat.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"legacyDateFormat.js","sources":["../src/datetime-formatter/sanitizeLocale.ts","../src/datetime-formatter/formatter.ts","../src/datetime-formatter/momentToDateFnsFormat.ts","../src/legacyDateFormat.ts"],"sourcesContent":["// this is used to avoid issues with the Intl.DateTimeFormat constructor as part of the efps tests\nconst sanitizeLocale = (locale: string): string => locale.replace(/@posix$/, '')\n\nexport default sanitizeLocale\n","import {format} from 'date-fns'\n\nimport sanitizeLocale from './sanitizeLocale'\n\nfunction getMonthName(\n date: Date,\n style: 'long' | 'short' | 'narrow' | undefined = 'long',\n locale = 'en-US',\n): string {\n const validLocale = sanitizeLocale(locale)\n return new Intl.DateTimeFormat(validLocale, {month: style}).format(date)\n}\n\nfunction getDayName(\n date: Date,\n style: 'long' | 'short' | 'narrow' | undefined = 'long',\n locale = 'en-US',\n): string {\n const validLocale = sanitizeLocale(locale)\n return new Intl.DateTimeFormat(validLocale, {weekday: style}).format(date)\n}\n\nfunction getLocalizedDate(date: Date, options: Intl.DateTimeFormatOptions, locale = 'en-US') {\n const validLocale = sanitizeLocale(locale)\n return new Intl.DateTimeFormat(validLocale, options).format(date)\n}\n\n/**\n * Zero-pads a number to `length` digits (e.g. zeroPad(7, 2) = \"07\").\n */\nfunction zeroPad(num: number, length: number): string {\n return String(num).padStart(length, '0')\n}\n\n/**\n * Returns an English ordinal for a given day number\n */\nfunction getOrdinal(day: number): string {\n const j = day % 10\n const k = day % 100\n if (j === 1 && k !== 11) return `${day}st`\n if (j === 2 && k !== 12) return `${day}nd`\n if (j === 3 && k !== 13) return `${day}rd`\n return `${day}th`\n}\n\nfunction getISODayOfWeek(date: Date): number {\n // Sunday=0 in JS, but ISO calls Monday=1...Sunday=7\n const dow = date.getDay()\n return dow === 0 ? 7 : dow\n}\n\nfunction getISOWeekYear(date: Date): number {\n // Clone date, shift to the \"Thursday\" of this week\n const temp = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()))\n const dayOfWeek = getISODayOfWeek(temp)\n temp.setUTCDate(temp.getUTCDate() - dayOfWeek + 4)\n return temp.getUTCFullYear()\n}\n\nfunction getISOWeekNumber(date: Date): number {\n const temp = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()))\n const dayOfWeek = getISODayOfWeek(temp)\n temp.setUTCDate(temp.getUTCDate() - dayOfWeek + 4)\n const yearStart = new Date(Date.UTC(temp.getUTCFullYear(), 0, 1))\n return Math.ceil(((temp.valueOf() - yearStart.valueOf()) / 86400000 + 1) / 7)\n}\n\nfunction getDayOfYear(date: Date): number {\n const startOfYear = new Date(Date.UTC(date.getFullYear(), 0, 1))\n // fix for local-time differences\n const diff =\n date.valueOf() -\n startOfYear.valueOf() +\n (startOfYear.getTimezoneOffset() - date.getTimezoneOffset()) * 60_000\n return Math.floor(diff / (1000 * 60 * 60 * 24)) + 1\n}\n\n// \"Locale\" week-year => approximate with ISO logic here\nfunction getLocaleWeekYear(date: Date): number {\n return getISOWeekYear(date)\n}\n\n/**\n * Returns fractional seconds based on the count of 'S' in the token.\n */\nfunction getFractionalSeconds(date: Date, length: number): string {\n const ms = zeroPad(date.getMilliseconds(), 3) // \"123\"\n if (length === 1) {\n return ms.slice(0, 1) // \"1\"\n } else if (length === 2) {\n return ms.slice(0, 2) // \"12\"\n } else if (length === 3) {\n return ms // \"123\"\n }\n // length=4 => e.g. \"1230\"\n return `${ms}0`\n}\n\nfunction getTimeZoneAbbreviation(date: Date) {\n const parts = new Intl.DateTimeFormat(sanitizeLocale('en-US'), {\n timeZoneName: 'short',\n }).formatToParts(date)\n const tz = parts.find((part) => part.type === 'timeZoneName')\n return tz ? tz.value : ''\n}\n\n/**\n * Formats a Date object using many Moment-like tokens.\n */\nfunction formatMomentLike(date: Date, formatStr: string): string {\n // Store escaped sequences to restore later\n const escapeSequences: string[] = []\n const escapeToken = '\\uE000' // Use a Unicode private use character as placeholder\n\n // Replace bracketed content with placeholders\n const processedFormat = formatStr.replace(/\\[([^\\]]+)\\]/g, (_, contents) => {\n escapeSequences.push(contents)\n return escapeToken\n })\n\n // Basic fields\n const year = date.getFullYear()\n const monthIndex = date.getMonth() // 0..11\n const dayOfMonth = date.getDate() // 1..31\n const dayOfWeek = date.getDay() // 0..6 (Sun=0)\n const hours = date.getHours() // 0..23\n const minutes = date.getMinutes() // 0..59\n const seconds = date.getSeconds() // 0..59\n\n // Week-related\n const isoWeekNum = getISOWeekNumber(date)\n const isoWeekYear = getISOWeekYear(date)\n const localeWeekYear = getLocaleWeekYear(date)\n\n // Timestamps\n const unixMs = date.getTime() // milliseconds since epoch\n const unixSec = Math.floor(unixMs / 1000) // seconds since epoch\n\n // Build token -> value map\n const tokens = [\n // Year\n // 1970 1971 ... 2029 2030\n {key: 'YYYY', getValue: () => String(year)},\n // 70 71 ... 29 30\n {key: 'YY', getValue: () => String(year).slice(-2)},\n // 1970 1971 ... 9999 +10000 +10001\n {key: 'Y', getValue: () => String(year)},\n // Expanded years, -001970 -001971 ... +001907 +001971\n {key: 'YYYYY', getValue: () => zeroPad(year, 5)},\n\n // ISO week-year\n // 1970 1971 ... 2029 2030\n {key: 'GGGG', getValue: () => String(isoWeekYear)},\n // 70 71 ... 29 30\n {key: 'GG', getValue: () => String(isoWeekYear).slice(-2)},\n\n // \"locale\" week-year\n {key: 'gggg', getValue: () => String(localeWeekYear)},\n {key: 'gg', getValue: () => String(localeWeekYear).slice(-2)},\n\n // Quarter\n {key: 'Q', getValue: () => String(Math.floor(monthIndex / 3) + 1)},\n {key: 'Qo', getValue: () => getOrdinal(Math.floor(monthIndex / 3) + 1)},\n\n // --- Month (using Intl) ---\n {key: 'MMMM', getValue: () => getMonthName(date, 'long')}, // e.g. \"January\"\n {key: 'MMM', getValue: () => getMonthName(date, 'short')}, // e.g. \"Jan\"\n // For numeric months, we still do a manual approach:\n {key: 'MM', getValue: () => zeroPad(monthIndex + 1, 2)},\n {key: 'M', getValue: () => String(monthIndex + 1)},\n {key: 'Mo', getValue: () => getOrdinal(monthIndex + 1)},\n\n // Day of Month\n {key: 'DD', getValue: () => zeroPad(dayOfMonth, 2)},\n {key: 'D', getValue: () => String(dayOfMonth)},\n {key: 'Do', getValue: () => getOrdinal(dayOfMonth)},\n\n // --- Day of Week (using Intl) ---\n {key: 'dddd', getValue: () => getDayName(date, 'long')}, // e.g. \"Monday\"\n {key: 'ddd', getValue: () => getDayName(date, 'short')}, // e.g. \"Mon\"\n {\n key: 'dd',\n // e.g. \"Mo\" => first 2 chars of short day name\n getValue: () => getDayName(date, 'short').slice(0, 2),\n },\n {key: 'd', getValue: () => String(dayOfWeek)},\n {key: 'do', getValue: () => getOrdinal(dayOfWeek + 1)},\n\n // Day of the year\n {key: 'DDDD', getValue: () => zeroPad(getDayOfYear(date), 3)},\n {key: 'DDD', getValue: () => String(getDayOfYear(date))},\n {key: 'DDDo', getValue: () => getOrdinal(getDayOfYear(date))},\n\n // ISO day of week\n {key: 'E', getValue: () => String(getISODayOfWeek(date))},\n\n // Week of the year\n // w 1 2 ... 52 53\n {key: 'w', getValue: () => zeroPad(isoWeekNum, 2)},\n // week 1st 2nd ... 52nd 53rd\n {key: 'wo', getValue: () => getOrdinal(isoWeekNum)},\n // 01 02 ... 52 53\n {key: 'ww', getValue: () => zeroPad(isoWeekNum, 2)},\n\n // ISO Week\n {key: 'WW', getValue: () => zeroPad(isoWeekNum, 2)},\n {key: 'W', getValue: () => String(isoWeekNum)},\n {key: 'Wo', getValue: () => getOrdinal(isoWeekNum)},\n\n // or \"locale\" week => replace isoWeekNum\n\n // 24h hours\n {key: 'HH', getValue: () => zeroPad(hours, 2)},\n {key: 'H', getValue: () => String(hours)},\n\n // 12h hours\n {key: 'hh', getValue: () => zeroPad(((hours + 11) % 12) + 1, 2)},\n {key: 'h', getValue: () => String(((hours + 11) % 12) + 1)},\n\n // 1 2 ... 23 24\n {key: 'k', getValue: () => String(hours || 24)},\n // 01 02 ... 23 24\n {key: 'kk', getValue: () => zeroPad(hours || 24, 2)},\n\n // Minutes\n {key: 'mm', getValue: () => zeroPad(minutes, 2)},\n {key: 'm', getValue: () => String(minutes)},\n\n // Seconds\n {key: 'ss', getValue: () => zeroPad(seconds, 2)},\n {key: 's', getValue: () => String(seconds)},\n\n // Fractional seconds (S..SSSS) => handled separately\n // Timezone offset (Z, ZZ) => handled separately\n\n // AM/PM\n {key: 'A', getValue: () => (hours < 12 ? 'AM' : 'PM')},\n {key: 'a', getValue: () => (hours < 12 ? 'am' : 'pm')},\n\n // Unix timestamps\n {key: 'X', getValue: () => String(unixSec)},\n {key: 'x', getValue: () => String(unixMs)},\n\n // Eras BC AD\n {key: 'N', getValue: () => (year < 0 ? 'BC' : 'AD')},\n {key: 'NN', getValue: () => (year < 0 ? 'BC' : 'AD')},\n {key: 'NNN', getValue: () => (year < 0 ? 'BC' : 'AD')},\n\n // Before Christ, Anno Domini\n {key: 'NNNN', getValue: () => (year < 0 ? 'Before Christ' : 'Anno Domini')},\n {key: 'NNNNN', getValue: () => (year < 0 ? 'BC' : 'AD')},\n\n // Time zone offset\n {key: 'z', getValue: () => getTimeZoneAbbreviation(date)},\n {key: 'zz', getValue: () => getTimeZoneAbbreviation(date)},\n {key: 'Z', getValue: () => format(date, 'xxx')},\n {key: 'ZZ', getValue: () => format(date, 'xx')},\n\n // Time\n {key: 'LTS', getValue: () => getLocalizedDate(date, {timeStyle: 'medium'})},\n {key: 'LT', getValue: () => getLocalizedDate(date, {timeStyle: 'short'})},\n\n // Date (uppercase = longer names)\n {\n key: 'LLLL',\n getValue: () =>\n getLocalizedDate(date, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n }),\n },\n {\n key: 'LLL',\n getValue: () =>\n getLocalizedDate(date, {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n }),\n },\n {\n key: 'LL',\n getValue: () => getLocalizedDate(date, {year: 'numeric', month: 'long', day: 'numeric'}),\n },\n {\n key: 'L',\n getValue: () => getLocalizedDate(date, {year: 'numeric', month: '2-digit', day: '2-digit'}),\n },\n\n // Date (lowercase = shorter names)\n {\n key: 'llll',\n getValue: () =>\n getLocalizedDate(date, {\n weekday: 'short',\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n }),\n },\n {\n key: 'lll',\n getValue: () =>\n getLocalizedDate(date, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n }),\n },\n {\n key: 'll',\n getValue: () => getLocalizedDate(date, {year: 'numeric', month: 'short', day: 'numeric'}),\n },\n {\n key: 'l',\n getValue: () => getLocalizedDate(date, {year: 'numeric', month: 'numeric', day: 'numeric'}),\n },\n ]\n\n // Sort tokens by descending length to avoid partial collisions\n tokens.sort((a, b) => b.key.length - a.key.length)\n\n // 1) Fractional seconds (avoid colliding with LTS)\n const fracSecRegex = /(?<!LT)S{1,4}/g\n let output = processedFormat.replace(fracSecRegex, (match) => {\n return getFractionalSeconds(date, match.length)\n })\n\n // Find each token and replace it, make sure not to replace overlapping tokens\n for (const {key, getValue} of tokens) {\n // Escape special characters\n const escapedKey = key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n // Match the token, but only if it's not part of a larger word\n const tokenRegex = new RegExp(`(^|[^A-Z0-9a-z])(${escapedKey})(?![A-Z0-9a-z])`, 'g')\n\n // Only compute the value if the token exists in the output\n if (output.match(tokenRegex)) {\n const value = getValue()\n output = output.replace(tokenRegex, `$1${value}`)\n }\n }\n\n // After all token replacements, restore escaped sequences\n output = output.replace(new RegExp(escapeToken, 'g'), () => escapeSequences.shift() || '')\n\n return output\n}\n\nexport default formatMomentLike\n","/**\n * Converts a Moment.js format string into a UTS 35 (Unicode Technical Standard #35)\n * format string\n *\n * This function doesn't take absolutely every token into account, but should cover\n * all common cases. If you find a missing token, feel free to add it.\n *\n */\nexport function momentToDateFnsFormat(momentFormat: string): string {\n // A list of replacements from Moment tokens to date-fns tokens\n // ordered from longest to shortest to prevent partial replacements\n const formatMap: Record<string, string> = {\n YYYY: 'yyyy',\n YY: 'yy',\n MMMM: 'MMMM',\n MMM: 'MMM',\n MM: 'MM',\n M: 'M',\n DD: 'dd',\n D: 'd',\n dddd: 'EEEE',\n ddd: 'EEE',\n HH: 'HH',\n H: 'H',\n hh: 'hh',\n h: 'h',\n mm: 'mm',\n m: 'm',\n ss: 'ss',\n s: 's',\n A: 'a',\n a: 'a',\n }\n\n // Replace each token in the format string\n return Object.keys(formatMap).reduce(\n (acc, key) => acc.replace(new RegExp(key, 'g'), formatMap[key]),\n momentFormat,\n )\n}\n","import {TZDateMini} from '@date-fns/tz'\nimport {UTCDateMini} from '@date-fns/utc'\nimport {parse as dateFnsParse, parseISO} from 'date-fns'\n\nimport formatMomentLike from './datetime-formatter/formatter'\nimport {momentToDateFnsFormat} from './datetime-formatter/momentToDateFnsFormat'\nimport sanitizeLocale from './datetime-formatter/sanitizeLocale'\n\nexport {sanitizeLocale}\n\nexport const DEFAULT_DATE_FORMAT = 'YYYY-MM-DD'\nexport const DEFAULT_TIME_FORMAT = 'HH:mm'\n// take local as default time zone\nconst DEFAULT_TIMEZONE = Intl.DateTimeFormat().resolvedOptions().timeZone\n\nexport type ParseResult = {isValid: boolean; date?: Date; error?: string} & (\n | {isValid: true; date: Date}\n | {isValid: false; error?: string}\n)\n\nexport function format(\n input: Date,\n dateFormat: string,\n options: {useUTC?: boolean; timeZone?: string} = {useUTC: false, timeZone: undefined},\n): string {\n const {useUTC, timeZone} = options\n\n if (useUTC) return formatMomentLike(new UTCDateMini(input), dateFormat)\n return formatMomentLike(\n timeZone ? new TZDateMini(input, timeZone || DEFAULT_TIMEZONE) : new Date(input),\n dateFormat,\n )\n}\n\n/*\n It would be so good to remove date-fns from this file, but it's used in the parse function. We could write our own parser,\n but this is better than moment.\n */\nexport function parse(dateString: string, dateFormat?: string, timeZone?: string): ParseResult {\n const dnsFormat = dateFormat ? momentToDateFnsFormat(dateFormat) : undefined\n\n // parse string to date using the format string from date-fns\n const parsed = dnsFormat ? dateFnsParse(dateString, dnsFormat, new Date()) : parseISO(dateString)\n\n if (parsed && !isNaN(parsed.getTime())) {\n let parsedDate = parsed\n\n // Only apply timezone conversion if:\n // 1. A timezone is specified, AND\n // 2. A dateFormat was provided (meaning this is user input, not an ISO string being deserialized)\n if (timeZone && isValidTimeZoneString(timeZone) && dateFormat) {\n // Create TZDateMini using the component constructor to interpret the parsed\n // components as being in the target timezone. We can't use new TZDateMini(parsed, timeZone)\n // because dateFnsParse already created the Date in the browser's local timezone, which\n // would cause an incorrect conversion. By extracting components, we tell TZDateMini:\n // \"these values represent the time in the target timezone directly\"\n parsedDate = new TZDateMini(\n parsed.getFullYear(),\n parsed.getMonth(),\n parsed.getDate(),\n parsed.getHours(),\n parsed.getMinutes(),\n parsed.getSeconds(),\n parsed.getMilliseconds(),\n timeZone,\n )\n } else if (timeZone && isValidTimeZoneString(timeZone)) {\n // For ISO strings, just wrap in TZDateMini for display without conversion\n parsedDate = new TZDateMini(parsed, timeZone)\n }\n\n return {isValid: true, date: parsedDate}\n }\n return {isValid: false, error: `Invalid date. Must be on the format \"${dateFormat}\"`}\n}\n\nexport function isValidTimeZoneString(timeZone: string): boolean {\n return Intl.supportedValuesOf('timeZone').includes(timeZone)\n}\n"],"names":["tz","format","UTCDateMini","TZDateMini","dateFnsParse","parseISO"],"mappings":"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"}
1
+ {"version":3,"file":"legacyDateFormat.js","sources":["../src/datetime-formatter/sanitizeLocale.ts","../src/datetime-formatter/formatter.ts","../src/datetime-formatter/momentToDateFnsFormat.ts","../src/legacyDateFormat.ts"],"sourcesContent":["// this is used to avoid issues with the Intl.DateTimeFormat constructor as part of the efps tests\nconst sanitizeLocale = (locale: string): string => locale.replace(/@posix$/, '')\n\nexport default sanitizeLocale\n","import {format} from 'date-fns'\n\nimport sanitizeLocale from './sanitizeLocale'\n\nfunction getMonthName(\n date: Date,\n style: 'long' | 'short' | 'narrow' | undefined = 'long',\n locale = 'en-US',\n): string {\n const validLocale = sanitizeLocale(locale)\n return new Intl.DateTimeFormat(validLocale, {month: style}).format(date)\n}\n\nfunction getDayName(\n date: Date,\n style: 'long' | 'short' | 'narrow' | undefined = 'long',\n locale = 'en-US',\n): string {\n const validLocale = sanitizeLocale(locale)\n return new Intl.DateTimeFormat(validLocale, {weekday: style}).format(date)\n}\n\nfunction getLocalizedDate(date: Date, options: Intl.DateTimeFormatOptions, locale = 'en-US') {\n const validLocale = sanitizeLocale(locale)\n return new Intl.DateTimeFormat(validLocale, options).format(date)\n}\n\n/**\n * Zero-pads a number to `length` digits (e.g. zeroPad(7, 2) = \"07\").\n */\nfunction zeroPad(num: number, length: number): string {\n return String(num).padStart(length, '0')\n}\n\n/**\n * Returns an English ordinal for a given day number\n */\nfunction getOrdinal(day: number): string {\n const j = day % 10\n const k = day % 100\n if (j === 1 && k !== 11) return `${day}st`\n if (j === 2 && k !== 12) return `${day}nd`\n if (j === 3 && k !== 13) return `${day}rd`\n return `${day}th`\n}\n\nfunction getISODayOfWeek(date: Date): number {\n // Sunday=0 in JS, but ISO calls Monday=1...Sunday=7\n const dow = date.getDay()\n return dow === 0 ? 7 : dow\n}\n\nfunction getISOWeekYear(date: Date): number {\n // Clone date, shift to the \"Thursday\" of this week\n const temp = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()))\n const dayOfWeek = getISODayOfWeek(temp)\n temp.setUTCDate(temp.getUTCDate() - dayOfWeek + 4)\n return temp.getUTCFullYear()\n}\n\nfunction getISOWeekNumber(date: Date): number {\n const temp = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()))\n const dayOfWeek = getISODayOfWeek(temp)\n temp.setUTCDate(temp.getUTCDate() - dayOfWeek + 4)\n const yearStart = new Date(Date.UTC(temp.getUTCFullYear(), 0, 1))\n return Math.ceil(((temp.valueOf() - yearStart.valueOf()) / 86400000 + 1) / 7)\n}\n\nfunction getDayOfYear(date: Date): number {\n const startOfYear = new Date(Date.UTC(date.getFullYear(), 0, 1))\n // fix for local-time differences\n const diff =\n date.valueOf() -\n startOfYear.valueOf() +\n (startOfYear.getTimezoneOffset() - date.getTimezoneOffset()) * 60_000\n return Math.floor(diff / (1000 * 60 * 60 * 24)) + 1\n}\n\n// \"Locale\" week-year => approximate with ISO logic here\nfunction getLocaleWeekYear(date: Date): number {\n return getISOWeekYear(date)\n}\n\n/**\n * Returns fractional seconds based on the count of 'S' in the token.\n */\nfunction getFractionalSeconds(date: Date, length: number): string {\n const ms = zeroPad(date.getMilliseconds(), 3) // \"123\"\n if (length === 1) {\n return ms.slice(0, 1) // \"1\"\n } else if (length === 2) {\n return ms.slice(0, 2) // \"12\"\n } else if (length === 3) {\n return ms // \"123\"\n }\n // length=4 => e.g. \"1230\"\n return `${ms}0`\n}\n\nfunction getTimeZoneAbbreviation(date: Date) {\n const parts = new Intl.DateTimeFormat(sanitizeLocale('en-US'), {\n timeZoneName: 'short',\n }).formatToParts(date)\n const tz = parts.find((part) => part.type === 'timeZoneName')\n return tz ? tz.value : ''\n}\n\n/**\n * Formats a Date object using many Moment-like tokens.\n */\nfunction formatMomentLike(date: Date, formatStr: string): string {\n // Store escaped sequences to restore later\n const escapeSequences: string[] = []\n const escapeToken = '\\uE000' // Use a Unicode private use character as placeholder\n\n // Replace bracketed content with placeholders\n const processedFormat = formatStr.replace(/\\[([^\\]]+)\\]/g, (_, contents) => {\n escapeSequences.push(contents)\n return escapeToken\n })\n\n // Basic fields\n const year = date.getFullYear()\n const monthIndex = date.getMonth() // 0..11\n const dayOfMonth = date.getDate() // 1..31\n const dayOfWeek = date.getDay() // 0..6 (Sun=0)\n const hours = date.getHours() // 0..23\n const minutes = date.getMinutes() // 0..59\n const seconds = date.getSeconds() // 0..59\n\n // Week-related\n const isoWeekNum = getISOWeekNumber(date)\n const isoWeekYear = getISOWeekYear(date)\n const localeWeekYear = getLocaleWeekYear(date)\n\n // Timestamps\n const unixMs = date.getTime() // milliseconds since epoch\n const unixSec = Math.floor(unixMs / 1000) // seconds since epoch\n\n // Build token -> value map\n const tokens = [\n // Year\n // 1970 1971 ... 2029 2030\n {key: 'YYYY', getValue: () => String(year)},\n // 70 71 ... 29 30\n {key: 'YY', getValue: () => String(year).slice(-2)},\n // 1970 1971 ... 9999 +10000 +10001\n {key: 'Y', getValue: () => String(year)},\n // Expanded years, -001970 -001971 ... +001907 +001971\n {key: 'YYYYY', getValue: () => zeroPad(year, 5)},\n\n // ISO week-year\n // 1970 1971 ... 2029 2030\n {key: 'GGGG', getValue: () => String(isoWeekYear)},\n // 70 71 ... 29 30\n {key: 'GG', getValue: () => String(isoWeekYear).slice(-2)},\n\n // \"locale\" week-year\n {key: 'gggg', getValue: () => String(localeWeekYear)},\n {key: 'gg', getValue: () => String(localeWeekYear).slice(-2)},\n\n // Quarter\n {key: 'Q', getValue: () => String(Math.floor(monthIndex / 3) + 1)},\n {key: 'Qo', getValue: () => getOrdinal(Math.floor(monthIndex / 3) + 1)},\n\n // --- Month (using Intl) ---\n {key: 'MMMM', getValue: () => getMonthName(date, 'long')}, // e.g. \"January\"\n {key: 'MMM', getValue: () => getMonthName(date, 'short')}, // e.g. \"Jan\"\n // For numeric months, we still do a manual approach:\n {key: 'MM', getValue: () => zeroPad(monthIndex + 1, 2)},\n {key: 'M', getValue: () => String(monthIndex + 1)},\n {key: 'Mo', getValue: () => getOrdinal(monthIndex + 1)},\n\n // Day of Month\n {key: 'DD', getValue: () => zeroPad(dayOfMonth, 2)},\n {key: 'D', getValue: () => String(dayOfMonth)},\n {key: 'Do', getValue: () => getOrdinal(dayOfMonth)},\n\n // --- Day of Week (using Intl) ---\n {key: 'dddd', getValue: () => getDayName(date, 'long')}, // e.g. \"Monday\"\n {key: 'ddd', getValue: () => getDayName(date, 'short')}, // e.g. \"Mon\"\n {\n key: 'dd',\n // e.g. \"Mo\" => first 2 chars of short day name\n getValue: () => getDayName(date, 'short').slice(0, 2),\n },\n {key: 'd', getValue: () => String(dayOfWeek)},\n {key: 'do', getValue: () => getOrdinal(dayOfWeek + 1)},\n\n // Day of the year\n {key: 'DDDD', getValue: () => zeroPad(getDayOfYear(date), 3)},\n {key: 'DDD', getValue: () => String(getDayOfYear(date))},\n {key: 'DDDo', getValue: () => getOrdinal(getDayOfYear(date))},\n\n // ISO day of week\n {key: 'E', getValue: () => String(getISODayOfWeek(date))},\n\n // Week of the year\n // w 1 2 ... 52 53\n {key: 'w', getValue: () => zeroPad(isoWeekNum, 2)},\n // week 1st 2nd ... 52nd 53rd\n {key: 'wo', getValue: () => getOrdinal(isoWeekNum)},\n // 01 02 ... 52 53\n {key: 'ww', getValue: () => zeroPad(isoWeekNum, 2)},\n\n // ISO Week\n {key: 'WW', getValue: () => zeroPad(isoWeekNum, 2)},\n {key: 'W', getValue: () => String(isoWeekNum)},\n {key: 'Wo', getValue: () => getOrdinal(isoWeekNum)},\n\n // or \"locale\" week => replace isoWeekNum\n\n // 24h hours\n {key: 'HH', getValue: () => zeroPad(hours, 2)},\n {key: 'H', getValue: () => String(hours)},\n\n // 12h hours\n {key: 'hh', getValue: () => zeroPad(((hours + 11) % 12) + 1, 2)},\n {key: 'h', getValue: () => String(((hours + 11) % 12) + 1)},\n\n // 1 2 ... 23 24\n {key: 'k', getValue: () => String(hours || 24)},\n // 01 02 ... 23 24\n {key: 'kk', getValue: () => zeroPad(hours || 24, 2)},\n\n // Minutes\n {key: 'mm', getValue: () => zeroPad(minutes, 2)},\n {key: 'm', getValue: () => String(minutes)},\n\n // Seconds\n {key: 'ss', getValue: () => zeroPad(seconds, 2)},\n {key: 's', getValue: () => String(seconds)},\n\n // Fractional seconds (S..SSSS) => handled separately\n // Timezone offset (Z, ZZ) => handled separately\n\n // AM/PM\n {key: 'A', getValue: () => (hours < 12 ? 'AM' : 'PM')},\n {key: 'a', getValue: () => (hours < 12 ? 'am' : 'pm')},\n\n // Unix timestamps\n {key: 'X', getValue: () => String(unixSec)},\n {key: 'x', getValue: () => String(unixMs)},\n\n // Eras BC AD\n {key: 'N', getValue: () => (year < 0 ? 'BC' : 'AD')},\n {key: 'NN', getValue: () => (year < 0 ? 'BC' : 'AD')},\n {key: 'NNN', getValue: () => (year < 0 ? 'BC' : 'AD')},\n\n // Before Christ, Anno Domini\n {key: 'NNNN', getValue: () => (year < 0 ? 'Before Christ' : 'Anno Domini')},\n {key: 'NNNNN', getValue: () => (year < 0 ? 'BC' : 'AD')},\n\n // Time zone offset\n {key: 'z', getValue: () => getTimeZoneAbbreviation(date)},\n {key: 'zz', getValue: () => getTimeZoneAbbreviation(date)},\n {key: 'Z', getValue: () => format(date, 'xxx')},\n {key: 'ZZ', getValue: () => format(date, 'xx')},\n\n // Time\n {key: 'LTS', getValue: () => getLocalizedDate(date, {timeStyle: 'medium'})},\n {key: 'LT', getValue: () => getLocalizedDate(date, {timeStyle: 'short'})},\n\n // Date (uppercase = longer names)\n {\n key: 'LLLL',\n getValue: () =>\n getLocalizedDate(date, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n }),\n },\n {\n key: 'LLL',\n getValue: () =>\n getLocalizedDate(date, {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n }),\n },\n {\n key: 'LL',\n getValue: () => getLocalizedDate(date, {year: 'numeric', month: 'long', day: 'numeric'}),\n },\n {\n key: 'L',\n getValue: () => getLocalizedDate(date, {year: 'numeric', month: '2-digit', day: '2-digit'}),\n },\n\n // Date (lowercase = shorter names)\n {\n key: 'llll',\n getValue: () =>\n getLocalizedDate(date, {\n weekday: 'short',\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n }),\n },\n {\n key: 'lll',\n getValue: () =>\n getLocalizedDate(date, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n }),\n },\n {\n key: 'll',\n getValue: () => getLocalizedDate(date, {year: 'numeric', month: 'short', day: 'numeric'}),\n },\n {\n key: 'l',\n getValue: () => getLocalizedDate(date, {year: 'numeric', month: 'numeric', day: 'numeric'}),\n },\n ]\n\n // Sort tokens by descending length to avoid partial collisions\n tokens.sort((a, b) => b.key.length - a.key.length)\n\n // 1) Fractional seconds (avoid colliding with LTS)\n const fracSecRegex = /(?<!LT)S{1,4}/g\n let output = processedFormat.replace(fracSecRegex, (match) => {\n return getFractionalSeconds(date, match.length)\n })\n\n // Find each token and replace it, make sure not to replace overlapping tokens\n for (const {key, getValue} of tokens) {\n // Escape special characters\n const escapedKey = key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n // Match the token, but only if it's not part of a larger word\n const tokenRegex = new RegExp(`(^|[^A-Z0-9a-z])(${escapedKey})(?![A-Z0-9a-z])`, 'g')\n\n // Only compute the value if the token exists in the output\n if (output.match(tokenRegex)) {\n const value = getValue()\n output = output.replace(tokenRegex, `$1${value}`)\n }\n }\n\n // After all token replacements, restore escaped sequences\n output = output.replace(new RegExp(escapeToken, 'g'), () => escapeSequences.shift() || '')\n\n return output\n}\n\nexport default formatMomentLike\n","/**\n * Converts a Moment.js format string into a UTS 35 (Unicode Technical Standard #35)\n * format string\n *\n * This function doesn't take absolutely every token into account, but should cover\n * all common cases. If you find a missing token, feel free to add it.\n *\n */\nexport function momentToDateFnsFormat(momentFormat: string): string {\n // A list of replacements from Moment tokens to date-fns tokens\n // ordered from longest to shortest to prevent partial replacements\n const formatMap: Record<string, string> = {\n YYYY: 'yyyy',\n YY: 'yy',\n MMMM: 'MMMM',\n MMM: 'MMM',\n MM: 'MM',\n M: 'M',\n DD: 'dd',\n D: 'd',\n dddd: 'EEEE',\n ddd: 'EEE',\n HH: 'HH',\n H: 'H',\n hh: 'hh',\n h: 'h',\n mm: 'mm',\n m: 'm',\n ss: 'ss',\n s: 's',\n A: 'a',\n a: 'a',\n }\n\n // Replace each token in the format string\n return Object.keys(formatMap).reduce(\n (acc, key) => acc.replace(new RegExp(key, 'g'), formatMap[key]),\n momentFormat,\n )\n}\n","import {TZDateMini} from '@date-fns/tz'\nimport {UTCDateMini} from '@date-fns/utc'\nimport {parse as dateFnsParse, parseISO} from 'date-fns'\n\nimport formatMomentLike from './datetime-formatter/formatter'\nimport {momentToDateFnsFormat} from './datetime-formatter/momentToDateFnsFormat'\nimport sanitizeLocale from './datetime-formatter/sanitizeLocale'\n\nexport {sanitizeLocale}\n\nexport const DEFAULT_DATE_FORMAT = 'YYYY-MM-DD'\nexport const DEFAULT_TIME_FORMAT = 'HH:mm'\n// take local as default time zone\nconst DEFAULT_TIMEZONE = Intl.DateTimeFormat().resolvedOptions().timeZone\n\nexport type ParseResult = {isValid: boolean; date?: Date; error?: string} & (\n | {isValid: true; date: Date}\n | {isValid: false; error?: string}\n)\n\nexport function format(\n input: Date,\n dateFormat: string,\n options: {useUTC?: boolean; timeZone?: string} = {useUTC: false, timeZone: undefined},\n): string {\n const {useUTC, timeZone} = options\n\n if (useUTC) return formatMomentLike(new UTCDateMini(input), dateFormat)\n return formatMomentLike(\n timeZone ? new TZDateMini(input, timeZone || DEFAULT_TIMEZONE) : new Date(input),\n dateFormat,\n )\n}\n\n/*\n It would be so good to remove date-fns from this file, but it's used in the parse function. We could write our own parser,\n but this is better than moment.\n */\nexport function parse(dateString: string, dateFormat?: string, timeZone?: string): ParseResult {\n const dnsFormat = dateFormat ? momentToDateFnsFormat(dateFormat) : undefined\n\n // parse string to date using the format string from date-fns\n const parsed = dnsFormat ? dateFnsParse(dateString, dnsFormat, new Date()) : parseISO(dateString)\n\n if (parsed && !isNaN(parsed.getTime())) {\n let parsedDate = parsed\n\n // Only apply timezone conversion if:\n // 1. A timezone is specified, AND\n // 2. A dateFormat was provided (meaning this is user input, not an ISO string being deserialized)\n if (timeZone && isValidTimeZoneString(timeZone) && dateFormat) {\n // Create TZDateMini using the component constructor to interpret the parsed\n // components as being in the target timezone. We can't use new TZDateMini(parsed, timeZone)\n // because dateFnsParse already created the Date in the browser's local timezone, which\n // would cause an incorrect conversion. By extracting components, we tell TZDateMini:\n // \"these values represent the time in the target timezone directly\"\n parsedDate = new TZDateMini(\n parsed.getFullYear(),\n parsed.getMonth(),\n parsed.getDate(),\n parsed.getHours(),\n parsed.getMinutes(),\n parsed.getSeconds(),\n parsed.getMilliseconds(),\n timeZone,\n )\n } else if (timeZone && isValidTimeZoneString(timeZone)) {\n // For ISO strings, just wrap in TZDateMini for display without conversion\n parsedDate = new TZDateMini(parsed, timeZone)\n }\n\n return {isValid: true, date: parsedDate}\n }\n return {isValid: false, error: `Invalid date. Must be on the format \"${dateFormat}\"`}\n}\n\nexport function isValidTimeZoneString(timeZone: string): boolean {\n return Intl.supportedValuesOf('timeZone').includes(timeZone)\n}\n"],"names":["format","dateFnsParse"],"mappings":"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"}
package/lib/paths.js CHANGED
@@ -1,6 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: !0 });
3
- var types = require("@sanity/types");
1
+ import { isIndexSegment, isKeySegment, isIndexTuple } from "@sanity/types";
4
2
  const rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g, reKeySegment = /_key\s*==\s*['"](.*)['"]/, EMPTY_PATH = [], FOCUS_TERMINATOR = "$", GROQ_DATA_TYPE_VALUES = ["true", "false", "null"];
5
3
  function get(obj, path, defaultVal) {
6
4
  const select = typeof path == "string" ? fromString(path) : path;
@@ -9,12 +7,12 @@ function get(obj, path, defaultVal) {
9
7
  let acc = obj;
10
8
  for (let i = 0; i < select.length; i++) {
11
9
  const segment = select[i];
12
- if (types.isIndexSegment(segment)) {
10
+ if (isIndexSegment(segment)) {
13
11
  if (!Array.isArray(acc))
14
12
  return defaultVal;
15
13
  acc = acc[segment];
16
14
  }
17
- if (types.isKeySegment(segment)) {
15
+ if (isKeySegment(segment)) {
18
16
  if (!Array.isArray(acc))
19
17
  return defaultVal;
20
18
  acc = acc.find((item) => item._key === segment._key);
@@ -42,7 +40,7 @@ function numEqualSegments(path, otherPath) {
42
40
  return length;
43
41
  }
44
42
  function isSegmentEqual(segmentA, segmentB) {
45
- return types.isKeySegment(segmentA) && types.isKeySegment(segmentB) ? segmentA._key === segmentB._key : types.isIndexSegment(segmentA) ? Number(segmentA) === Number(segmentB) : types.isIndexTuple(segmentA) && types.isIndexTuple(segmentB) ? segmentA[0] === segmentB[0] && segmentA[1] === segmentB[1] : segmentA === segmentB;
43
+ return isKeySegment(segmentA) && isKeySegment(segmentB) ? segmentA._key === segmentB._key : isIndexSegment(segmentA) ? Number(segmentA) === Number(segmentB) : isIndexTuple(segmentA) && isIndexTuple(segmentB) ? segmentA[0] === segmentB[0] && segmentA[1] === segmentB[1] : segmentA === segmentB;
46
44
  }
47
45
  function hasFocus(focusPath, path) {
48
46
  const withoutTerminator = focusPath[focusPath.length - 1] === FOCUS_TERMINATOR ? focusPath.slice(0, -1) : focusPath;
@@ -85,7 +83,7 @@ function toString(path) {
85
83
  return `${target}[${segment}]`;
86
84
  if (typeof segment == "string")
87
85
  return isHead ? segment : GROQ_DATA_TYPE_VALUES.includes(segment) ? `${target}["${segment}"]` : `${target}.${segment}`;
88
- if (types.isKeySegment(segment) && segment._key)
86
+ if (isKeySegment(segment) && segment._key)
89
87
  return `${target}[_key=="${segment._key}"]`;
90
88
  if (Array.isArray(segment)) {
91
89
  const [from, to] = segment;
@@ -121,7 +119,7 @@ function fromString(path) {
121
119
  return segments.map(normalizePathSegment);
122
120
  }
123
121
  function normalizePathSegment(segment) {
124
- return types.isIndexSegment(segment) ? normalizeIndexSegment(segment) : types.isKeySegment(segment) ? normalizeKeySegment(segment) : types.isIndexTuple(segment) ? normalizeIndexTupleSegment(segment) : segment;
122
+ return isIndexSegment(segment) ? normalizeIndexSegment(segment) : isKeySegment(segment) ? normalizeKeySegment(segment) : isIndexTuple(segment) ? normalizeIndexTupleSegment(segment) : segment;
125
123
  }
126
124
  function normalizeIndexSegment(segment) {
127
125
  return Number(segment.replace(/[^\d]/g, ""));
@@ -133,21 +131,23 @@ function normalizeIndexTupleSegment(segment) {
133
131
  const [from, to] = segment.split(":").map((seg) => seg === "" ? seg : Number(seg));
134
132
  return [from, to];
135
133
  }
136
- exports.FOCUS_TERMINATOR = FOCUS_TERMINATOR;
137
- exports._resolveKeyedPath = _resolveKeyedPath;
138
- exports.fromString = fromString;
139
- exports.get = get;
140
- exports.hasFocus = hasFocus;
141
- exports.hasItemFocus = hasItemFocus;
142
- exports.isEqual = isEqual;
143
- exports.isExpanded = isExpanded;
144
- exports.isSegmentEqual = isSegmentEqual;
145
- exports.numEqualSegments = numEqualSegments;
146
- exports.pathFor = pathFor;
147
- exports.resolveKeyedPath = resolveKeyedPath;
148
- exports.startsWith = startsWith;
149
- exports.toString = toString;
150
- exports.trimChildPath = trimChildPath;
151
- exports.trimLeft = trimLeft;
152
- exports.trimRight = trimRight;
134
+ export {
135
+ FOCUS_TERMINATOR,
136
+ _resolveKeyedPath,
137
+ fromString,
138
+ get,
139
+ hasFocus,
140
+ hasItemFocus,
141
+ isEqual,
142
+ isExpanded,
143
+ isSegmentEqual,
144
+ numEqualSegments,
145
+ pathFor,
146
+ resolveKeyedPath,
147
+ startsWith,
148
+ toString,
149
+ trimChildPath,
150
+ trimLeft,
151
+ trimRight
152
+ };
153
153
  //# sourceMappingURL=paths.js.map
package/lib/paths.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sources":["../src/paths.ts"],"sourcesContent":["import {\n type IndexTuple,\n isIndexSegment,\n isIndexTuple,\n isKeySegment,\n type KeyedSegment,\n type Path,\n type PathSegment,\n} from '@sanity/types'\n\nconst rePropName =\n /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g\nconst reKeySegment = /_key\\s*==\\s*['\"](.*)['\"]/\nconst EMPTY_PATH: Path = []\n\nexport const FOCUS_TERMINATOR = '$'\n\n// Fields named as GROQ data types cannot be accessed using dot notation. These fields must instead\n// be serialized using square bracket notation.\nconst GROQ_DATA_TYPE_VALUES = ['true', 'false', 'null']\n\nexport function get<R>(obj: unknown, path: Path | string): R | undefined\nexport function get<R>(obj: unknown, path: Path | string, defaultValue: R): R\nexport function get(obj: unknown, path: Path | string, defaultVal?: unknown): unknown {\n const select = typeof path === 'string' ? fromString(path) : path\n if (!Array.isArray(select)) {\n throw new Error('Path must be an array or a string')\n }\n\n let acc: unknown = obj\n for (let i = 0; i < select.length; i++) {\n const segment = select[i]\n if (isIndexSegment(segment)) {\n if (!Array.isArray(acc)) {\n return defaultVal\n }\n\n acc = acc[segment]\n }\n\n if (isKeySegment(segment)) {\n if (!Array.isArray(acc)) {\n return defaultVal\n }\n\n acc = acc.find((item) => item._key === segment._key)\n }\n\n if (typeof segment === 'string') {\n acc =\n typeof acc === 'object' && acc !== null\n ? ((acc as Record<string, unknown>)[segment] as Record<string, unknown>)\n : undefined\n }\n\n if (typeof acc === 'undefined') {\n return defaultVal\n }\n }\n\n return acc\n}\n\nconst pathsMemo = new Map<string, Path>()\nexport function pathFor(path: Path): Path {\n if (path.length === 0) {\n return EMPTY_PATH\n }\n const asString = toString(path)\n if (pathsMemo.has(asString)) {\n return pathsMemo.get(asString)!\n }\n pathsMemo.set(asString, path)\n Object.freeze(path)\n return path\n}\n\nexport function isEqual(path: Path, otherPath: Path): boolean {\n return (\n path.length === otherPath.length &&\n path.every((segment, i) => isSegmentEqual(segment, otherPath[i]))\n )\n}\n\nexport function numEqualSegments(path: Path, otherPath: Path): number {\n const length = Math.min(path.length, otherPath.length)\n for (let i = 0; i < length; i++) {\n if (!isSegmentEqual(path[i], otherPath[i])) {\n return i\n }\n }\n return length\n}\n\nexport function isSegmentEqual(segmentA: PathSegment, segmentB: PathSegment): boolean {\n if (isKeySegment(segmentA) && isKeySegment(segmentB)) {\n return segmentA._key === segmentB._key\n }\n\n if (isIndexSegment(segmentA)) {\n return Number(segmentA) === Number(segmentB)\n }\n\n if (isIndexTuple(segmentA) && isIndexTuple(segmentB)) {\n return segmentA[0] === segmentB[0] && segmentA[1] === segmentB[1]\n }\n\n return segmentA === segmentB\n}\n\nexport function hasFocus(focusPath: Path, path: Path): boolean {\n const withoutTerminator =\n focusPath[focusPath.length - 1] === FOCUS_TERMINATOR ? focusPath.slice(0, -1) : focusPath\n return isEqual(withoutTerminator, path)\n}\n\nexport function hasItemFocus(focusPath: Path, item: PathSegment): boolean {\n return focusPath.length === 1 && isSegmentEqual(focusPath[0], item)\n}\n\nexport function isExpanded(segment: PathSegment, focusPath: Path): boolean {\n const [head, ...tail] = focusPath\n return tail.length > 0 && isSegmentEqual(segment, head)\n}\n\nexport function startsWith(prefix: Path, path: Path): boolean {\n return prefix.every((segment, i) => isSegmentEqual(segment, path[i]))\n}\n\nexport function trimLeft(prefix: Path, path: Path): Path {\n if (prefix.length === 0 || path.length === 0) {\n return path\n }\n const [prefixHead, ...prefixTail] = prefix\n const [pathHead, ...pathTail] = path\n if (!isSegmentEqual(prefixHead, pathHead)) {\n return path\n }\n return pathFor(trimLeft(prefixTail, pathTail))\n}\n\nexport function trimRight(suffix: Path, path: Path): Path {\n const sufLen = suffix.length\n const pathLen = path.length\n if (sufLen === 0 || pathLen === 0) {\n return path\n }\n\n let i = 0\n while (\n i < sufLen &&\n i < pathLen &&\n isSegmentEqual(path[pathLen - i - 1], suffix[sufLen - i - 1])\n ) {\n i++\n }\n\n return pathFor(path.slice(0, pathLen - i))\n}\n\nexport function trimChildPath(path: Path, childPath: Path): Path {\n return startsWith(path, childPath) ? trimLeft(path, childPath) : EMPTY_PATH\n}\n\nexport function toString(path: Path): string {\n if (!Array.isArray(path)) {\n throw new Error('Path is not an array')\n }\n\n return path.reduce<string>((target, segment, i) => {\n const isHead = i === 0\n\n if (typeof segment === 'number') {\n return `${target}[${segment}]`\n }\n\n if (typeof segment === 'string') {\n if (isHead) {\n return segment\n }\n\n if (GROQ_DATA_TYPE_VALUES.includes(segment)) {\n return `${target}[\"${segment}\"]`\n }\n\n return `${target}.${segment}`\n }\n\n if (isKeySegment(segment) && segment._key) {\n return `${target}[_key==\"${segment._key}\"]`\n }\n\n if (Array.isArray(segment)) {\n const [from, to] = segment\n return `${target}[${from}:${to}]`\n }\n\n throw new Error(`Unsupported path segment \\`${JSON.stringify(segment)}\\``)\n }, '')\n}\n\nexport function _resolveKeyedPath(value: unknown, path: Path): Path {\n if (path.length === 0) {\n return path\n }\n const [next, ...rest] = path\n if (typeof next === 'number') {\n if (!Array.isArray(value) || !(next in value)) {\n return []\n }\n const item = value[next]\n const key = item?._key\n return [typeof key === 'string' ? {_key: item._key} : next, ..._resolveKeyedPath(item, rest)]\n }\n const nextVal = get(value, [next])\n return [next, ..._resolveKeyedPath(nextVal, rest)]\n}\n\n/**\n * Takes a value and a path that may include numeric indices and attempts to replace numeric indices with keyed paths\n *\n * @param value - any json value\n * @param path - a Path that may include numeric indices\n * @returns a path where numeric indices has been replaced by keyed segments (e.g. `{_key: <key>}`)\n * Will do as good attempt as possible, but in case of missing array items, it will return the best possible match:\n * - `resolveKeyedPath([0, 'bar'], [])` will return [] since array has no value at index 0\n * - `resolveKeyedPath([0, 'foo'], [{_key: 'xyz', 'foo': 'bar'}, {_key: 'abc'}])` will return `[{_key: 'xyz'}, 'foo']` since array has no value at index 0\n * - `resolveKeyedPath([0, 'foo', 'bar'], [{_key: 'xyz'}])` will return `[{_key: 'xyz'}, 'foo', 'bar']` since array has no value at index 0\n * Object keys will be preserved as-is, e.g. `resolveKeyedPath(['foo', 'bar'], undefined)` will return `['foo', 'bar']`\n */\nexport function resolveKeyedPath(value: unknown, path: Path): Path {\n if (!Array.isArray(path)) {\n throw new Error('Path is not an array')\n }\n return pathFor(_resolveKeyedPath(value, path))\n}\n\nexport function fromString(path: string): Path {\n if (typeof path !== 'string') {\n throw new Error('Path is not a string')\n }\n\n const segments = path.match(rePropName)\n if (!segments) {\n throw new Error('Invalid path string')\n }\n\n return segments.map(normalizePathSegment)\n}\n\nfunction normalizePathSegment(segment: string): PathSegment {\n if (isIndexSegment(segment)) {\n return normalizeIndexSegment(segment)\n }\n\n if (isKeySegment(segment)) {\n return normalizeKeySegment(segment)\n }\n\n if (isIndexTuple(segment)) {\n return normalizeIndexTupleSegment(segment)\n }\n\n return segment\n}\n\nfunction normalizeIndexSegment(segment: string): PathSegment {\n return Number(segment.replace(/[^\\d]/g, ''))\n}\n\nfunction normalizeKeySegment(segment: string): KeyedSegment {\n const segments = segment.match(reKeySegment)\n return {_key: segments![1]}\n}\n\nfunction normalizeIndexTupleSegment(segment: string): IndexTuple {\n const [from, to] = segment.split(':').map((seg) => (seg === '' ? seg : Number(seg)))\n return [from, to]\n}\n"],"names":["isIndexSegment","isKeySegment","isIndexTuple"],"mappings":"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"}
1
+ {"version":3,"file":"paths.js","sources":["../src/paths.ts"],"sourcesContent":["import {\n type IndexTuple,\n isIndexSegment,\n isIndexTuple,\n isKeySegment,\n type KeyedSegment,\n type Path,\n type PathSegment,\n} from '@sanity/types'\n\nconst rePropName =\n /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g\nconst reKeySegment = /_key\\s*==\\s*['\"](.*)['\"]/\nconst EMPTY_PATH: Path = []\n\nexport const FOCUS_TERMINATOR = '$'\n\n// Fields named as GROQ data types cannot be accessed using dot notation. These fields must instead\n// be serialized using square bracket notation.\nconst GROQ_DATA_TYPE_VALUES = ['true', 'false', 'null']\n\nexport function get<R>(obj: unknown, path: Path | string): R | undefined\nexport function get<R>(obj: unknown, path: Path | string, defaultValue: R): R\nexport function get(obj: unknown, path: Path | string, defaultVal?: unknown): unknown {\n const select = typeof path === 'string' ? fromString(path) : path\n if (!Array.isArray(select)) {\n throw new Error('Path must be an array or a string')\n }\n\n let acc: unknown = obj\n for (let i = 0; i < select.length; i++) {\n const segment = select[i]\n if (isIndexSegment(segment)) {\n if (!Array.isArray(acc)) {\n return defaultVal\n }\n\n acc = acc[segment]\n }\n\n if (isKeySegment(segment)) {\n if (!Array.isArray(acc)) {\n return defaultVal\n }\n\n acc = acc.find((item) => item._key === segment._key)\n }\n\n if (typeof segment === 'string') {\n acc =\n typeof acc === 'object' && acc !== null\n ? ((acc as Record<string, unknown>)[segment] as Record<string, unknown>)\n : undefined\n }\n\n if (typeof acc === 'undefined') {\n return defaultVal\n }\n }\n\n return acc\n}\n\nconst pathsMemo = new Map<string, Path>()\nexport function pathFor(path: Path): Path {\n if (path.length === 0) {\n return EMPTY_PATH\n }\n const asString = toString(path)\n if (pathsMemo.has(asString)) {\n return pathsMemo.get(asString)!\n }\n pathsMemo.set(asString, path)\n Object.freeze(path)\n return path\n}\n\nexport function isEqual(path: Path, otherPath: Path): boolean {\n return (\n path.length === otherPath.length &&\n path.every((segment, i) => isSegmentEqual(segment, otherPath[i]))\n )\n}\n\nexport function numEqualSegments(path: Path, otherPath: Path): number {\n const length = Math.min(path.length, otherPath.length)\n for (let i = 0; i < length; i++) {\n if (!isSegmentEqual(path[i], otherPath[i])) {\n return i\n }\n }\n return length\n}\n\nexport function isSegmentEqual(segmentA: PathSegment, segmentB: PathSegment): boolean {\n if (isKeySegment(segmentA) && isKeySegment(segmentB)) {\n return segmentA._key === segmentB._key\n }\n\n if (isIndexSegment(segmentA)) {\n return Number(segmentA) === Number(segmentB)\n }\n\n if (isIndexTuple(segmentA) && isIndexTuple(segmentB)) {\n return segmentA[0] === segmentB[0] && segmentA[1] === segmentB[1]\n }\n\n return segmentA === segmentB\n}\n\nexport function hasFocus(focusPath: Path, path: Path): boolean {\n const withoutTerminator =\n focusPath[focusPath.length - 1] === FOCUS_TERMINATOR ? focusPath.slice(0, -1) : focusPath\n return isEqual(withoutTerminator, path)\n}\n\nexport function hasItemFocus(focusPath: Path, item: PathSegment): boolean {\n return focusPath.length === 1 && isSegmentEqual(focusPath[0], item)\n}\n\nexport function isExpanded(segment: PathSegment, focusPath: Path): boolean {\n const [head, ...tail] = focusPath\n return tail.length > 0 && isSegmentEqual(segment, head)\n}\n\nexport function startsWith(prefix: Path, path: Path): boolean {\n return prefix.every((segment, i) => isSegmentEqual(segment, path[i]))\n}\n\nexport function trimLeft(prefix: Path, path: Path): Path {\n if (prefix.length === 0 || path.length === 0) {\n return path\n }\n const [prefixHead, ...prefixTail] = prefix\n const [pathHead, ...pathTail] = path\n if (!isSegmentEqual(prefixHead, pathHead)) {\n return path\n }\n return pathFor(trimLeft(prefixTail, pathTail))\n}\n\nexport function trimRight(suffix: Path, path: Path): Path {\n const sufLen = suffix.length\n const pathLen = path.length\n if (sufLen === 0 || pathLen === 0) {\n return path\n }\n\n let i = 0\n while (\n i < sufLen &&\n i < pathLen &&\n isSegmentEqual(path[pathLen - i - 1], suffix[sufLen - i - 1])\n ) {\n i++\n }\n\n return pathFor(path.slice(0, pathLen - i))\n}\n\nexport function trimChildPath(path: Path, childPath: Path): Path {\n return startsWith(path, childPath) ? trimLeft(path, childPath) : EMPTY_PATH\n}\n\nexport function toString(path: Path): string {\n if (!Array.isArray(path)) {\n throw new Error('Path is not an array')\n }\n\n return path.reduce<string>((target, segment, i) => {\n const isHead = i === 0\n\n if (typeof segment === 'number') {\n return `${target}[${segment}]`\n }\n\n if (typeof segment === 'string') {\n if (isHead) {\n return segment\n }\n\n if (GROQ_DATA_TYPE_VALUES.includes(segment)) {\n return `${target}[\"${segment}\"]`\n }\n\n return `${target}.${segment}`\n }\n\n if (isKeySegment(segment) && segment._key) {\n return `${target}[_key==\"${segment._key}\"]`\n }\n\n if (Array.isArray(segment)) {\n const [from, to] = segment\n return `${target}[${from}:${to}]`\n }\n\n throw new Error(`Unsupported path segment \\`${JSON.stringify(segment)}\\``)\n }, '')\n}\n\nexport function _resolveKeyedPath(value: unknown, path: Path): Path {\n if (path.length === 0) {\n return path\n }\n const [next, ...rest] = path\n if (typeof next === 'number') {\n if (!Array.isArray(value) || !(next in value)) {\n return []\n }\n const item = value[next]\n const key = item?._key\n return [typeof key === 'string' ? {_key: item._key} : next, ..._resolveKeyedPath(item, rest)]\n }\n const nextVal = get(value, [next])\n return [next, ..._resolveKeyedPath(nextVal, rest)]\n}\n\n/**\n * Takes a value and a path that may include numeric indices and attempts to replace numeric indices with keyed paths\n *\n * @param value - any json value\n * @param path - a Path that may include numeric indices\n * @returns a path where numeric indices has been replaced by keyed segments (e.g. `{_key: <key>}`)\n * Will do as good attempt as possible, but in case of missing array items, it will return the best possible match:\n * - `resolveKeyedPath([0, 'bar'], [])` will return [] since array has no value at index 0\n * - `resolveKeyedPath([0, 'foo'], [{_key: 'xyz', 'foo': 'bar'}, {_key: 'abc'}])` will return `[{_key: 'xyz'}, 'foo']` since array has no value at index 0\n * - `resolveKeyedPath([0, 'foo', 'bar'], [{_key: 'xyz'}])` will return `[{_key: 'xyz'}, 'foo', 'bar']` since array has no value at index 0\n * Object keys will be preserved as-is, e.g. `resolveKeyedPath(['foo', 'bar'], undefined)` will return `['foo', 'bar']`\n */\nexport function resolveKeyedPath(value: unknown, path: Path): Path {\n if (!Array.isArray(path)) {\n throw new Error('Path is not an array')\n }\n return pathFor(_resolveKeyedPath(value, path))\n}\n\nexport function fromString(path: string): Path {\n if (typeof path !== 'string') {\n throw new Error('Path is not a string')\n }\n\n const segments = path.match(rePropName)\n if (!segments) {\n throw new Error('Invalid path string')\n }\n\n return segments.map(normalizePathSegment)\n}\n\nfunction normalizePathSegment(segment: string): PathSegment {\n if (isIndexSegment(segment)) {\n return normalizeIndexSegment(segment)\n }\n\n if (isKeySegment(segment)) {\n return normalizeKeySegment(segment)\n }\n\n if (isIndexTuple(segment)) {\n return normalizeIndexTupleSegment(segment)\n }\n\n return segment\n}\n\nfunction normalizeIndexSegment(segment: string): PathSegment {\n return Number(segment.replace(/[^\\d]/g, ''))\n}\n\nfunction normalizeKeySegment(segment: string): KeyedSegment {\n const segments = segment.match(reKeySegment)\n return {_key: segments![1]}\n}\n\nfunction normalizeIndexTupleSegment(segment: string): IndexTuple {\n const [from, to] = segment.split(':').map((seg) => (seg === '' ? seg : Number(seg)))\n return [from, to]\n}\n"],"names":[],"mappings":"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"}