@sanity/cli-core 0.1.0-alpha.9 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/SanityCommand.js +81 -5
- package/dist/SanityCommand.js.map +1 -1
- package/dist/_exports/package-manager.d.ts +33 -0
- package/dist/_exports/package-manager.js +3 -0
- package/dist/_exports/package-manager.js.map +1 -0
- package/dist/_exports/request.d.ts +79 -0
- package/dist/_exports/request.js +7 -0
- package/dist/_exports/request.js.map +1 -0
- package/dist/_exports/ux.d.ts +61 -26
- package/dist/_exports/ux.js +1 -0
- package/dist/_exports/ux.js.map +1 -1
- package/dist/config/cli/getCliConfig.js +33 -33
- package/dist/config/cli/getCliConfig.js.map +1 -1
- package/dist/config/cli/getCliConfigSync.js +1 -1
- package/dist/config/cli/getCliConfigSync.js.map +1 -1
- package/dist/config/cli/schemas.js +7 -0
- package/dist/config/cli/schemas.js.map +1 -1
- package/dist/config/cli/types/cliConfig.js.map +1 -1
- package/dist/config/findProjectRoot.js +6 -2
- package/dist/config/findProjectRoot.js.map +1 -1
- package/dist/config/findProjectRootSync.js +7 -3
- package/dist/config/findProjectRootSync.js.map +1 -1
- package/dist/config/studio/getStudioWorkspaces.js +14 -1
- package/dist/config/studio/getStudioWorkspaces.js.map +1 -1
- package/dist/config/studio/readStudioConfig.worker.js +6 -5
- package/dist/config/studio/readStudioConfig.worker.js.map +1 -1
- package/dist/errors/NonInteractiveError.js +18 -0
- package/dist/errors/NonInteractiveError.js.map +1 -0
- package/dist/{util → errors}/NotFoundError.js +1 -1
- package/dist/errors/NotFoundError.js.map +1 -0
- package/dist/errors/ProjectRootNotFoundError.js +35 -0
- package/dist/errors/ProjectRootNotFoundError.js.map +1 -0
- package/dist/index.d.ts +939 -5689
- package/dist/index.js +8 -14
- package/dist/index.js.map +1 -1
- package/dist/loaders/studio/studioWorkerLoader.worker.js +102 -23
- package/dist/loaders/studio/studioWorkerLoader.worker.js.map +1 -1
- package/dist/loaders/studio/studioWorkerTask.js +18 -27
- package/dist/loaders/studio/studioWorkerTask.js.map +1 -1
- package/dist/loaders/tsx/tsxWorkerLoader.worker.js +3 -4
- package/dist/loaders/tsx/tsxWorkerLoader.worker.js.map +1 -1
- package/dist/loaders/tsx/tsxWorkerTask.js +4 -34
- package/dist/loaders/tsx/tsxWorkerTask.js.map +1 -1
- package/dist/request/createRequester.js +83 -0
- package/dist/request/createRequester.js.map +1 -0
- package/dist/services/apiClient.js +7 -3
- package/dist/services/apiClient.js.map +1 -1
- package/dist/services/cliUserConfig.js +5 -5
- package/dist/services/cliUserConfig.js.map +1 -1
- package/dist/services/getCliToken.js +2 -2
- package/dist/services/getCliToken.js.map +1 -1
- package/dist/util/doImport.js +2 -1
- package/dist/util/doImport.js.map +1 -1
- package/dist/util/environment/mockBrowserEnvironment.js +1 -0
- package/dist/util/environment/mockBrowserEnvironment.js.map +1 -1
- package/dist/util/getCliTelemetry.js +6 -8
- package/dist/util/getCliTelemetry.js.map +1 -1
- package/dist/util/getSanityUrl.js +4 -3
- package/dist/util/getSanityUrl.js.map +1 -1
- package/dist/util/importModule.js +32 -0
- package/dist/util/importModule.js.map +1 -0
- package/dist/util/isInteractive.js +1 -1
- package/dist/util/isInteractive.js.map +1 -1
- package/dist/util/packageManager.js +55 -0
- package/dist/util/packageManager.js.map +1 -0
- package/dist/util/promisifyWorker.js +72 -0
- package/dist/util/promisifyWorker.js.map +1 -0
- package/dist/util/readPackageJson.js +74 -0
- package/dist/util/readPackageJson.js.map +1 -0
- package/dist/ux/prompts.js +49 -1
- package/dist/ux/prompts.js.map +1 -1
- package/package.json +44 -40
- package/dist/_exports/tree.d.ts +0 -47
- package/dist/_exports/tree.js +0 -3
- package/dist/_exports/tree.js.map +0 -1
- package/dist/config/cli/getCliConfig.worker.js +0 -15
- package/dist/config/cli/getCliConfig.worker.js.map +0 -1
- package/dist/telemetry/cleanupOldTelemetryFiles.js +0 -30
- package/dist/telemetry/cleanupOldTelemetryFiles.js.map +0 -1
- package/dist/telemetry/createTelemetryStore.js +0 -95
- package/dist/telemetry/createTelemetryStore.js.map +0 -1
- package/dist/telemetry/createTraceId.js +0 -10
- package/dist/telemetry/createTraceId.js.map +0 -1
- package/dist/telemetry/findTelemetryFiles.js +0 -36
- package/dist/telemetry/findTelemetryFiles.js.map +0 -1
- package/dist/telemetry/flushTelemetryFiles.js +0 -107
- package/dist/telemetry/flushTelemetryFiles.js.map +0 -1
- package/dist/telemetry/generateTelemetryFilePath.js +0 -30
- package/dist/telemetry/generateTelemetryFilePath.js.map +0 -1
- package/dist/telemetry/logger.js +0 -54
- package/dist/telemetry/logger.js.map +0 -1
- package/dist/telemetry/telemetryStoreDebug.js +0 -7
- package/dist/telemetry/telemetryStoreDebug.js.map +0 -1
- package/dist/telemetry/trace.js +0 -150
- package/dist/telemetry/trace.js.map +0 -1
- package/dist/util/NotFoundError.js.map +0 -1
- package/dist/util/createExpiringConfig.js +0 -60
- package/dist/util/createExpiringConfig.js.map +0 -1
- package/dist/util/parseStringFlag.js +0 -19
- package/dist/util/parseStringFlag.js.map +0 -1
- package/dist/util/tree.js +0 -108
- package/dist/util/tree.js.map +0 -1
- package/dist/util/waitForAsync.js +0 -5
- package/dist/util/waitForAsync.js.map +0 -1
- package/dist/ux/formatObject.js +0 -9
- package/dist/ux/formatObject.js.map +0 -1
- package/dist/ux/printKeyValue.js +0 -16
- package/dist/ux/printKeyValue.js.map +0 -1
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { join } from 'node:path';
|
|
2
|
-
import { getTelemetryBaseInfo } from './getTelemetryBaseInfo.js';
|
|
3
|
-
import { telemetryStoreDebug } from './telemetryStoreDebug.js';
|
|
4
|
-
/**
|
|
5
|
-
* Generates a unique telemetry file path for a specific CLI session.
|
|
6
|
-
*
|
|
7
|
-
* File format: `telemetry-\{hashedToken\}-\{env\}-\{sessionId\}.ndjson`
|
|
8
|
-
*
|
|
9
|
-
* The sessionId ensures each CLI process writes to its own file, preventing:
|
|
10
|
-
* - File write conflicts when multiple CLI commands run concurrently
|
|
11
|
-
* - Race conditions during file operations
|
|
12
|
-
* - Data corruption from simultaneous writes
|
|
13
|
-
*
|
|
14
|
-
* During flush, all session files are discovered and aggregated together.
|
|
15
|
-
*
|
|
16
|
-
* @param sessionId - Unique identifier for this CLI session
|
|
17
|
-
* @returns Promise resolving to the full file path for this session's telemetry
|
|
18
|
-
* @internal
|
|
19
|
-
*/ export async function generateTelemetryFilePath(sessionId) {
|
|
20
|
-
telemetryStoreDebug('Generating telemetry file path for sessionId: %s', sessionId);
|
|
21
|
-
const { basePattern, directory, environment, hashedToken } = await getTelemetryBaseInfo();
|
|
22
|
-
telemetryStoreDebug('Generated token hash: %s', hashedToken);
|
|
23
|
-
telemetryStoreDebug('Detected environment: %s', environment);
|
|
24
|
-
const fileName = `${basePattern}-${sessionId}.ndjson`;
|
|
25
|
-
const filePath = join(directory, fileName);
|
|
26
|
-
telemetryStoreDebug('Telemetry file path: %s', filePath);
|
|
27
|
-
return filePath;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
//# sourceMappingURL=generateTelemetryFilePath.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/telemetry/generateTelemetryFilePath.ts"],"sourcesContent":["import {join} from 'node:path'\n\nimport {getTelemetryBaseInfo} from './getTelemetryBaseInfo.js'\nimport {telemetryStoreDebug} from './telemetryStoreDebug.js'\n\n/**\n * Generates a unique telemetry file path for a specific CLI session.\n *\n * File format: `telemetry-\\{hashedToken\\}-\\{env\\}-\\{sessionId\\}.ndjson`\n *\n * The sessionId ensures each CLI process writes to its own file, preventing:\n * - File write conflicts when multiple CLI commands run concurrently\n * - Race conditions during file operations\n * - Data corruption from simultaneous writes\n *\n * During flush, all session files are discovered and aggregated together.\n *\n * @param sessionId - Unique identifier for this CLI session\n * @returns Promise resolving to the full file path for this session's telemetry\n * @internal\n */\nexport async function generateTelemetryFilePath(sessionId: string): Promise<string> {\n telemetryStoreDebug('Generating telemetry file path for sessionId: %s', sessionId)\n\n const {basePattern, directory, environment, hashedToken} = await getTelemetryBaseInfo()\n\n telemetryStoreDebug('Generated token hash: %s', hashedToken)\n telemetryStoreDebug('Detected environment: %s', environment)\n\n const fileName = `${basePattern}-${sessionId}.ndjson`\n const filePath = join(directory, fileName)\n telemetryStoreDebug('Telemetry file path: %s', filePath)\n\n return filePath\n}\n"],"names":["join","getTelemetryBaseInfo","telemetryStoreDebug","generateTelemetryFilePath","sessionId","basePattern","directory","environment","hashedToken","fileName","filePath"],"mappings":"AAAA,SAAQA,IAAI,QAAO,YAAW;AAE9B,SAAQC,oBAAoB,QAAO,4BAA2B;AAC9D,SAAQC,mBAAmB,QAAO,2BAA0B;AAE5D;;;;;;;;;;;;;;;CAeC,GACD,OAAO,eAAeC,0BAA0BC,SAAiB;IAC/DF,oBAAoB,oDAAoDE;IAExE,MAAM,EAACC,WAAW,EAAEC,SAAS,EAAEC,WAAW,EAAEC,WAAW,EAAC,GAAG,MAAMP;IAEjEC,oBAAoB,4BAA4BM;IAChDN,oBAAoB,4BAA4BK;IAEhD,MAAME,WAAW,GAAGJ,YAAY,CAAC,EAAED,UAAU,OAAO,CAAC;IACrD,MAAMM,WAAWV,KAAKM,WAAWG;IACjCP,oBAAoB,2BAA2BQ;IAE/C,OAAOA;AACT"}
|
package/dist/telemetry/logger.js
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { telemetryStoreDebug } from './telemetryStoreDebug.js';
|
|
2
|
-
import { createTrace } from './trace.js';
|
|
3
|
-
// Sample rate tracking for log events
|
|
4
|
-
const logSampleTracker = new Map();
|
|
5
|
-
/**
|
|
6
|
-
* Creates a telemetry logger that emits events via the provided emit function
|
|
7
|
-
* @internal
|
|
8
|
-
*/ export function createLogger(sessionId, emit) {
|
|
9
|
-
telemetryStoreDebug('Creating logger for session: %s', sessionId);
|
|
10
|
-
const log = (event, data)=>{
|
|
11
|
-
telemetryStoreDebug('Logging event: %s', event.name);
|
|
12
|
-
// Handle sampling if maxSampleRate is specified
|
|
13
|
-
if (event.maxSampleRate && event.maxSampleRate > 0) {
|
|
14
|
-
const now = Date.now();
|
|
15
|
-
const lastEmit = logSampleTracker.get(event.name) || 0;
|
|
16
|
-
if (now - lastEmit < event.maxSampleRate) {
|
|
17
|
-
telemetryStoreDebug('Skipping event %s due to sampling (maxSampleRate: %d)', event.name, event.maxSampleRate);
|
|
18
|
-
return; // Skip due to sampling
|
|
19
|
-
}
|
|
20
|
-
logSampleTracker.set(event.name, now);
|
|
21
|
-
telemetryStoreDebug('Event %s passed sampling check', event.name);
|
|
22
|
-
}
|
|
23
|
-
const logEvent = {
|
|
24
|
-
createdAt: new Date().toISOString(),
|
|
25
|
-
data: data ?? null,
|
|
26
|
-
name: event.name,
|
|
27
|
-
sessionId,
|
|
28
|
-
type: 'log',
|
|
29
|
-
version: event.version
|
|
30
|
-
};
|
|
31
|
-
emit(logEvent);
|
|
32
|
-
};
|
|
33
|
-
const trace = (event, context)=>{
|
|
34
|
-
telemetryStoreDebug('Creating trace: %s', event.name);
|
|
35
|
-
return createTrace(event, context, sessionId, emit, createLogger);
|
|
36
|
-
};
|
|
37
|
-
const updateUserProperties = (properties)=>{
|
|
38
|
-
telemetryStoreDebug('Updating user properties: %o', properties);
|
|
39
|
-
const userPropsEvent = {
|
|
40
|
-
createdAt: new Date().toISOString(),
|
|
41
|
-
properties,
|
|
42
|
-
sessionId,
|
|
43
|
-
type: 'userProperties'
|
|
44
|
-
};
|
|
45
|
-
emit(userPropsEvent);
|
|
46
|
-
};
|
|
47
|
-
return {
|
|
48
|
-
log,
|
|
49
|
-
trace,
|
|
50
|
-
updateUserProperties
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
//# sourceMappingURL=logger.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/telemetry/logger.ts"],"sourcesContent":["import {\n type DefinedTelemetryLog,\n type DefinedTelemetryTrace,\n type TelemetryEvent,\n type TelemetryLogger,\n type TelemetryTrace,\n} from '@sanity/telemetry'\n\nimport {telemetryStoreDebug} from './telemetryStoreDebug.js'\nimport {createTrace} from './trace.js'\n\n// Sample rate tracking for log events\nconst logSampleTracker = new Map<string, number>()\n\n/**\n * Creates a telemetry logger that emits events via the provided emit function\n * @internal\n */\nexport function createLogger<UserProperties>(\n sessionId: string,\n emit: (event: TelemetryEvent) => void,\n): TelemetryLogger<UserProperties> {\n telemetryStoreDebug('Creating logger for session: %s', sessionId)\n\n const log = <Data>(event: DefinedTelemetryLog<Data>, data?: Data) => {\n telemetryStoreDebug('Logging event: %s', event.name)\n\n // Handle sampling if maxSampleRate is specified\n if (event.maxSampleRate && event.maxSampleRate > 0) {\n const now = Date.now()\n const lastEmit = logSampleTracker.get(event.name) || 0\n\n if (now - lastEmit < event.maxSampleRate) {\n telemetryStoreDebug(\n 'Skipping event %s due to sampling (maxSampleRate: %d)',\n event.name,\n event.maxSampleRate,\n )\n return // Skip due to sampling\n }\n\n logSampleTracker.set(event.name, now)\n telemetryStoreDebug('Event %s passed sampling check', event.name)\n }\n\n const logEvent: TelemetryEvent = {\n createdAt: new Date().toISOString(),\n data: data ?? null,\n name: event.name,\n sessionId,\n type: 'log',\n version: event.version,\n }\n\n emit(logEvent)\n }\n\n const trace = <Data, Context = unknown>(\n event: DefinedTelemetryTrace<Data, Context>,\n context?: Context,\n ): TelemetryTrace<UserProperties, Data> => {\n telemetryStoreDebug('Creating trace: %s', event.name)\n return createTrace(event, context, sessionId, emit, createLogger)\n }\n\n const updateUserProperties = (properties: UserProperties) => {\n telemetryStoreDebug('Updating user properties: %o', properties)\n const userPropsEvent: TelemetryEvent = {\n createdAt: new Date().toISOString(),\n properties,\n sessionId,\n type: 'userProperties',\n }\n\n emit(userPropsEvent)\n }\n\n return {\n log,\n trace,\n updateUserProperties,\n }\n}\n"],"names":["telemetryStoreDebug","createTrace","logSampleTracker","Map","createLogger","sessionId","emit","log","event","data","name","maxSampleRate","now","Date","lastEmit","get","set","logEvent","createdAt","toISOString","type","version","trace","context","updateUserProperties","properties","userPropsEvent"],"mappings":"AAQA,SAAQA,mBAAmB,QAAO,2BAA0B;AAC5D,SAAQC,WAAW,QAAO,aAAY;AAEtC,sCAAsC;AACtC,MAAMC,mBAAmB,IAAIC;AAE7B;;;CAGC,GACD,OAAO,SAASC,aACdC,SAAiB,EACjBC,IAAqC;IAErCN,oBAAoB,mCAAmCK;IAEvD,MAAME,MAAM,CAAOC,OAAkCC;QACnDT,oBAAoB,qBAAqBQ,MAAME,IAAI;QAEnD,gDAAgD;QAChD,IAAIF,MAAMG,aAAa,IAAIH,MAAMG,aAAa,GAAG,GAAG;YAClD,MAAMC,MAAMC,KAAKD,GAAG;YACpB,MAAME,WAAWZ,iBAAiBa,GAAG,CAACP,MAAME,IAAI,KAAK;YAErD,IAAIE,MAAME,WAAWN,MAAMG,aAAa,EAAE;gBACxCX,oBACE,yDACAQ,MAAME,IAAI,EACVF,MAAMG,aAAa;gBAErB,QAAO,uBAAuB;YAChC;YAEAT,iBAAiBc,GAAG,CAACR,MAAME,IAAI,EAAEE;YACjCZ,oBAAoB,kCAAkCQ,MAAME,IAAI;QAClE;QAEA,MAAMO,WAA2B;YAC/BC,WAAW,IAAIL,OAAOM,WAAW;YACjCV,MAAMA,QAAQ;YACdC,MAAMF,MAAME,IAAI;YAChBL;YACAe,MAAM;YACNC,SAASb,MAAMa,OAAO;QACxB;QAEAf,KAAKW;IACP;IAEA,MAAMK,QAAQ,CACZd,OACAe;QAEAvB,oBAAoB,sBAAsBQ,MAAME,IAAI;QACpD,OAAOT,YAAYO,OAAOe,SAASlB,WAAWC,MAAMF;IACtD;IAEA,MAAMoB,uBAAuB,CAACC;QAC5BzB,oBAAoB,gCAAgCyB;QACpD,MAAMC,iBAAiC;YACrCR,WAAW,IAAIL,OAAOM,WAAW;YACjCM;YACApB;YACAe,MAAM;QACR;QAEAd,KAAKoB;IACP;IAEA,OAAO;QACLnB;QACAe;QACAE;IACF;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/telemetry/telemetryStoreDebug.ts"],"sourcesContent":["import {subdebug} from '../debug.js'\n\n/**\n * Debug logger for telemetry store operations\n * @internal\n */\nexport const telemetryStoreDebug = subdebug('telemetry:telemetryStore')\n"],"names":["subdebug","telemetryStoreDebug"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,cAAa;AAEpC;;;CAGC,GACD,OAAO,MAAMC,sBAAsBD,SAAS,4BAA2B"}
|
package/dist/telemetry/trace.js
DELETED
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import { createTraceId } from './createTraceId.js';
|
|
2
|
-
import { telemetryStoreDebug } from './telemetryStoreDebug.js';
|
|
3
|
-
/**
|
|
4
|
-
* Creates a trace instance that can emit trace lifecycle events
|
|
5
|
-
* @internal
|
|
6
|
-
*/ export function createTrace(definition, context, sessionId, emit, createLoggerFn) {
|
|
7
|
-
const traceId = createTraceId();
|
|
8
|
-
telemetryStoreDebug('Creating trace %s with traceId: %s', definition.name, traceId);
|
|
9
|
-
let isStarted = false;
|
|
10
|
-
let isCompleted = false;
|
|
11
|
-
const emitTraceEvent = (type, data)=>{
|
|
12
|
-
if (isCompleted && type !== 'trace.start') return;
|
|
13
|
-
const baseEvent = {
|
|
14
|
-
context: context,
|
|
15
|
-
createdAt: new Date().toISOString(),
|
|
16
|
-
name: definition.name,
|
|
17
|
-
sessionId,
|
|
18
|
-
traceId,
|
|
19
|
-
version: definition.version
|
|
20
|
-
};
|
|
21
|
-
let traceEvent;
|
|
22
|
-
switch(type){
|
|
23
|
-
case 'trace.complete':
|
|
24
|
-
{
|
|
25
|
-
traceEvent = {
|
|
26
|
-
...baseEvent,
|
|
27
|
-
type: 'trace.complete',
|
|
28
|
-
...data && {
|
|
29
|
-
data
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
break;
|
|
33
|
-
}
|
|
34
|
-
case 'trace.error':
|
|
35
|
-
{
|
|
36
|
-
traceEvent = {
|
|
37
|
-
...baseEvent,
|
|
38
|
-
data,
|
|
39
|
-
type: 'trace.error'
|
|
40
|
-
};
|
|
41
|
-
break;
|
|
42
|
-
}
|
|
43
|
-
case 'trace.log':
|
|
44
|
-
{
|
|
45
|
-
traceEvent = {
|
|
46
|
-
...baseEvent,
|
|
47
|
-
data,
|
|
48
|
-
type: 'trace.log'
|
|
49
|
-
};
|
|
50
|
-
break;
|
|
51
|
-
}
|
|
52
|
-
case 'trace.start':
|
|
53
|
-
{
|
|
54
|
-
traceEvent = {
|
|
55
|
-
...baseEvent,
|
|
56
|
-
type: 'trace.start'
|
|
57
|
-
};
|
|
58
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
default:
|
|
61
|
-
{
|
|
62
|
-
return; // Unknown type
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
emit(traceEvent);
|
|
66
|
-
};
|
|
67
|
-
const start = ()=>{
|
|
68
|
-
if (isStarted) {
|
|
69
|
-
telemetryStoreDebug('Trace %s already started', traceId);
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
telemetryStoreDebug('Starting trace %s', traceId);
|
|
73
|
-
isStarted = true;
|
|
74
|
-
emitTraceEvent('trace.start');
|
|
75
|
-
};
|
|
76
|
-
const log = (data)=>{
|
|
77
|
-
telemetryStoreDebug('Logging data for trace %s', traceId);
|
|
78
|
-
if (!isStarted) start();
|
|
79
|
-
emitTraceEvent('trace.log', data);
|
|
80
|
-
};
|
|
81
|
-
const complete = ()=>{
|
|
82
|
-
if (isCompleted) {
|
|
83
|
-
telemetryStoreDebug('Trace %s already completed', traceId);
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
telemetryStoreDebug('Completing trace %s', traceId);
|
|
87
|
-
if (!isStarted) start();
|
|
88
|
-
emitTraceEvent('trace.complete');
|
|
89
|
-
isCompleted = true;
|
|
90
|
-
};
|
|
91
|
-
const error = (err)=>{
|
|
92
|
-
if (isCompleted) {
|
|
93
|
-
telemetryStoreDebug('Trace %s already completed, ignoring error', traceId);
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
telemetryStoreDebug('Error in trace %s: %s', traceId, err.message);
|
|
97
|
-
if (!isStarted) start();
|
|
98
|
-
// Convert Error to serializable object
|
|
99
|
-
const errorData = {
|
|
100
|
-
message: err.message,
|
|
101
|
-
name: err.name,
|
|
102
|
-
stack: err.stack
|
|
103
|
-
};
|
|
104
|
-
emitTraceEvent('trace.error', errorData);
|
|
105
|
-
isCompleted = true;
|
|
106
|
-
};
|
|
107
|
-
const awaitPromise = (promise, finalData)=>{
|
|
108
|
-
if (!isStarted) start();
|
|
109
|
-
return promise.then((result)=>{
|
|
110
|
-
if (finalData !== undefined) {
|
|
111
|
-
log(finalData);
|
|
112
|
-
}
|
|
113
|
-
complete();
|
|
114
|
-
return result;
|
|
115
|
-
}).catch((err)=>{
|
|
116
|
-
error(err);
|
|
117
|
-
throw err;
|
|
118
|
-
});
|
|
119
|
-
};
|
|
120
|
-
const newContext = (name)=>{
|
|
121
|
-
const contextEmit = (event)=>{
|
|
122
|
-
// For trace events, we can add context, but for log events we need to be careful
|
|
123
|
-
if (event.type.startsWith('trace.')) {
|
|
124
|
-
const existingContext = event.context;
|
|
125
|
-
emit({
|
|
126
|
-
...event,
|
|
127
|
-
context: {
|
|
128
|
-
...typeof existingContext === 'object' && existingContext ? existingContext : {},
|
|
129
|
-
contextName: name
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
} else {
|
|
133
|
-
// For log events, we can't add context as it's not part of TelemetryLogEvent
|
|
134
|
-
// Just emit as-is
|
|
135
|
-
emit(event);
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
return createLoggerFn(sessionId, contextEmit);
|
|
139
|
-
};
|
|
140
|
-
return {
|
|
141
|
-
await: awaitPromise,
|
|
142
|
-
complete,
|
|
143
|
-
error,
|
|
144
|
-
log,
|
|
145
|
-
newContext,
|
|
146
|
-
start
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
//# sourceMappingURL=trace.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/telemetry/trace.ts"],"sourcesContent":["import {\n type DefinedTelemetryTrace,\n type TelemetryEvent,\n type TelemetryLogger,\n type TelemetryTrace,\n} from '@sanity/telemetry'\n\nimport {createTraceId} from './createTraceId.js'\nimport {telemetryStoreDebug} from './telemetryStoreDebug.js'\n\n/**\n * Creates a trace instance that can emit trace lifecycle events\n * @internal\n */\nexport function createTrace<Data, Context = unknown, UserProperties = unknown>(\n definition: DefinedTelemetryTrace<Data, Context>,\n context: Context | undefined,\n sessionId: string,\n emit: (event: TelemetryEvent) => void,\n createLoggerFn: <UserProperties>(\n sessionId: string,\n emit: (event: TelemetryEvent) => void,\n ) => TelemetryLogger<UserProperties>,\n): TelemetryTrace<UserProperties, Data> {\n const traceId = createTraceId()\n telemetryStoreDebug('Creating trace %s with traceId: %s', definition.name, traceId)\n\n let isStarted = false\n let isCompleted = false\n\n const emitTraceEvent = (type: string, data?: Data | Error) => {\n if (isCompleted && type !== 'trace.start') return\n\n const baseEvent = {\n context: context as Context,\n createdAt: new Date().toISOString(),\n name: definition.name,\n sessionId,\n traceId,\n version: definition.version,\n }\n\n let traceEvent: TelemetryEvent\n\n switch (type) {\n case 'trace.complete': {\n traceEvent = {\n ...baseEvent,\n type: 'trace.complete',\n ...(data && {data}),\n } as TelemetryEvent\n\n break\n }\n case 'trace.error': {\n traceEvent = {\n ...baseEvent,\n data,\n type: 'trace.error',\n } as TelemetryEvent\n\n break\n }\n case 'trace.log': {\n traceEvent = {\n ...baseEvent,\n data,\n type: 'trace.log',\n } as TelemetryEvent\n\n break\n }\n case 'trace.start': {\n traceEvent = {\n ...baseEvent,\n type: 'trace.start',\n } as TelemetryEvent\n\n break\n }\n default: {\n return // Unknown type\n }\n }\n\n emit(traceEvent)\n }\n\n const start = () => {\n if (isStarted) {\n telemetryStoreDebug('Trace %s already started', traceId)\n return\n }\n telemetryStoreDebug('Starting trace %s', traceId)\n isStarted = true\n emitTraceEvent('trace.start')\n }\n\n const log = (data: Data) => {\n telemetryStoreDebug('Logging data for trace %s', traceId)\n if (!isStarted) start()\n emitTraceEvent('trace.log', data)\n }\n\n const complete = () => {\n if (isCompleted) {\n telemetryStoreDebug('Trace %s already completed', traceId)\n return\n }\n telemetryStoreDebug('Completing trace %s', traceId)\n if (!isStarted) start()\n emitTraceEvent('trace.complete')\n isCompleted = true\n }\n\n const error = (err: Error) => {\n if (isCompleted) {\n telemetryStoreDebug('Trace %s already completed, ignoring error', traceId)\n return\n }\n telemetryStoreDebug('Error in trace %s: %s', traceId, err.message)\n if (!isStarted) start()\n // Convert Error to serializable object\n const errorData = {\n message: err.message,\n name: err.name,\n stack: err.stack,\n }\n emitTraceEvent('trace.error', errorData)\n isCompleted = true\n }\n\n const awaitPromise = <P extends Promise<unknown>>(promise: P, finalData?: Data): P => {\n if (!isStarted) start()\n\n return promise\n .then((result) => {\n if (finalData !== undefined) {\n log(finalData)\n }\n complete()\n return result\n })\n .catch((err) => {\n error(err)\n throw err\n }) as P\n }\n\n const newContext = (name: string): TelemetryLogger<UserProperties> => {\n const contextEmit = (event: TelemetryEvent) => {\n // For trace events, we can add context, but for log events we need to be careful\n if (event.type.startsWith('trace.')) {\n const existingContext = (event as {context?: unknown}).context\n emit({\n ...event,\n context: {\n ...(typeof existingContext === 'object' && existingContext ? existingContext : {}),\n contextName: name,\n },\n } as TelemetryEvent)\n } else {\n // For log events, we can't add context as it's not part of TelemetryLogEvent\n // Just emit as-is\n emit(event)\n }\n }\n\n return createLoggerFn<UserProperties>(sessionId, contextEmit)\n }\n\n return {\n await: awaitPromise,\n complete,\n error,\n log,\n newContext,\n start,\n }\n}\n"],"names":["createTraceId","telemetryStoreDebug","createTrace","definition","context","sessionId","emit","createLoggerFn","traceId","name","isStarted","isCompleted","emitTraceEvent","type","data","baseEvent","createdAt","Date","toISOString","version","traceEvent","start","log","complete","error","err","message","errorData","stack","awaitPromise","promise","finalData","then","result","undefined","catch","newContext","contextEmit","event","startsWith","existingContext","contextName","await"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/util/NotFoundError.ts"],"sourcesContent":["import {isRecord} from './isRecord.js'\n\n/**\n * Error thrown when a file or directory is not found\n *\n * `code` is always `ENOENT` to mirror Node.js behavior when a file is not found\n *\n * @internal\n */\nexport class NotFoundError extends Error {\n code = 'ENOENT'\n path?: string\n\n constructor(message: string, path?: string) {\n super(message)\n this.path = path\n this.name = 'NotFoundError'\n }\n}\n\n/**\n * Returns whether or not the given error is a `NotFoundError`\n *\n * @param err - The error to check\n * @returns `true` if the error is a `NotFoundError`, `false` otherwise\n * @internal\n */\nexport function isNotFoundError(err: unknown): err is NotFoundError {\n return (\n isRecord(err) &&\n 'name' in err &&\n err.name === 'NotFoundError' &&\n 'code' in err &&\n err.code === 'ENOENT' &&\n 'message' in err &&\n typeof err.message === 'string'\n )\n}\n"],"names":["isRecord","NotFoundError","Error","code","path","message","name","isNotFoundError","err"],"mappings":"AAAA,SAAQA,QAAQ,QAAO,gBAAe;AAEtC;;;;;;CAMC,GACD,OAAO,MAAMC,sBAAsBC;IACjCC,OAAO,SAAQ;IACfC,KAAa;IAEb,YAAYC,OAAe,EAAED,IAAa,CAAE;QAC1C,KAAK,CAACC;QACN,IAAI,CAACD,IAAI,GAAGA;QACZ,IAAI,CAACE,IAAI,GAAG;IACd;AACF;AAEA;;;;;;CAMC,GACD,OAAO,SAASC,gBAAgBC,GAAY;IAC1C,OACER,SAASQ,QACT,UAAUA,OACVA,IAAIF,IAAI,KAAK,mBACb,UAAUE,OACVA,IAAIL,IAAI,KAAK,YACb,aAAaK,OACb,OAAOA,IAAIH,OAAO,KAAK;AAE3B"}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Create a config in the provided config store that expires after the provided TTL.
|
|
3
|
-
*/ export function createExpiringConfig({ fetchValue, key, onCacheHit = ()=>null, onFetch = ()=>null, onRevalidate = ()=>null, store, ttl, validateValue = (value)=>true }) {
|
|
4
|
-
let currentFetch = null;
|
|
5
|
-
return {
|
|
6
|
-
delete () {
|
|
7
|
-
store.delete(key);
|
|
8
|
-
},
|
|
9
|
-
async get () {
|
|
10
|
-
const stored = store.get(key);
|
|
11
|
-
if (isExpiringValue(stored)) {
|
|
12
|
-
const { updatedAt, value } = stored;
|
|
13
|
-
if (!validateValue(value)) {
|
|
14
|
-
throw new Error('Stored value is invalid');
|
|
15
|
-
}
|
|
16
|
-
const hasExpired = Date.now() - updatedAt > ttl;
|
|
17
|
-
if (!hasExpired) {
|
|
18
|
-
onCacheHit();
|
|
19
|
-
return value;
|
|
20
|
-
}
|
|
21
|
-
onRevalidate();
|
|
22
|
-
}
|
|
23
|
-
if (currentFetch) {
|
|
24
|
-
return currentFetch;
|
|
25
|
-
}
|
|
26
|
-
onFetch();
|
|
27
|
-
currentFetch = Promise.resolve(fetchValue());
|
|
28
|
-
const nextValue = await currentFetch;
|
|
29
|
-
if (!validateValue(nextValue)) {
|
|
30
|
-
throw new Error('Fetched value is invalid');
|
|
31
|
-
}
|
|
32
|
-
currentFetch = null;
|
|
33
|
-
store.set(key, {
|
|
34
|
-
updatedAt: Date.now(),
|
|
35
|
-
value: nextValue
|
|
36
|
-
});
|
|
37
|
-
return nextValue;
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Checks if the given stored value is valid (does not check if expired, only verified shape)
|
|
43
|
-
*
|
|
44
|
-
* @param stored - The stored value to check
|
|
45
|
-
* @returns True if the stored value is valid
|
|
46
|
-
* @internal
|
|
47
|
-
*/ function isExpiringValue(stored) {
|
|
48
|
-
if (typeof stored !== 'object' || stored === null || Array.isArray(stored)) {
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
if (!('updatedAt' in stored) || typeof stored.updatedAt !== 'number') {
|
|
52
|
-
return false;
|
|
53
|
-
}
|
|
54
|
-
if (!('value' in stored)) {
|
|
55
|
-
return false;
|
|
56
|
-
}
|
|
57
|
-
return true;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
//# sourceMappingURL=createExpiringConfig.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/util/createExpiringConfig.ts"],"sourcesContent":["import type ConfigStore from 'configstore'\n\ninterface ExpiringConfigValue {\n updatedAt: number\n value: unknown\n}\n\nexport interface ExpiringConfigOptions<Type> {\n /** Fetch value */\n fetchValue: () => Promise<Type> | Type\n /** Config key */\n key: string\n /** Config store */\n store: ConfigStore\n /** TTL (milliseconds) */\n ttl: number\n\n /** Subscribe to cache hit event */\n onCacheHit?: () => void\n /** Subscribe to fetch event */\n onFetch?: () => void\n /** Subscribe to revalidate event */\n onRevalidate?: () => void\n\n /**\n * Assert the fetched value is valid, or throw if invalid.\n * If none is provided, it will always accept the fetched value.\n */\n validateValue?: (value: unknown) => value is Type\n}\n\nexport interface ExpiringConfigApi<Type> {\n /**\n * Delete the cached value.\n */\n delete: () => void\n /**\n * Attempt to get the cached value. If there is no cached value, or the cached value has expired,\n * fetch, cache, and return the value.\n */\n get: () => Promise<Type>\n}\n\n/**\n * Create a config in the provided config store that expires after the provided TTL.\n */\nexport function createExpiringConfig<Type>({\n fetchValue,\n key,\n onCacheHit = () => null,\n onFetch = () => null,\n onRevalidate = () => null,\n store,\n ttl,\n validateValue = (value: unknown): value is Type => true,\n}: ExpiringConfigOptions<Type>): ExpiringConfigApi<Type> {\n let currentFetch: Promise<Type> | null = null\n return {\n delete() {\n store.delete(key)\n },\n async get(): Promise<Type> {\n const stored = store.get(key)\n\n if (isExpiringValue(stored)) {\n const {updatedAt, value} = stored\n if (!validateValue(value)) {\n throw new Error('Stored value is invalid')\n }\n\n const hasExpired = Date.now() - updatedAt > ttl\n\n if (!hasExpired) {\n onCacheHit()\n return value\n }\n\n onRevalidate()\n }\n\n if (currentFetch) {\n return currentFetch\n }\n onFetch()\n\n currentFetch = Promise.resolve(fetchValue())\n const nextValue = await currentFetch\n if (!validateValue(nextValue)) {\n throw new Error('Fetched value is invalid')\n }\n\n currentFetch = null\n\n store.set(key, {\n updatedAt: Date.now(),\n value: nextValue,\n })\n\n return nextValue\n },\n }\n}\n\n/**\n * Checks if the given stored value is valid (does not check if expired, only verified shape)\n *\n * @param stored - The stored value to check\n * @returns True if the stored value is valid\n * @internal\n */\nfunction isExpiringValue(stored: unknown): stored is ExpiringConfigValue {\n if (typeof stored !== 'object' || stored === null || Array.isArray(stored)) {\n return false\n }\n\n if (!('updatedAt' in stored) || typeof stored.updatedAt !== 'number') {\n return false\n }\n\n if (!('value' in stored)) {\n return false\n }\n\n return true\n}\n"],"names":["createExpiringConfig","fetchValue","key","onCacheHit","onFetch","onRevalidate","store","ttl","validateValue","value","currentFetch","delete","get","stored","isExpiringValue","updatedAt","Error","hasExpired","Date","now","Promise","resolve","nextValue","set","Array","isArray"],"mappings":"AA2CA;;CAEC,GACD,OAAO,SAASA,qBAA2B,EACzCC,UAAU,EACVC,GAAG,EACHC,aAAa,IAAM,IAAI,EACvBC,UAAU,IAAM,IAAI,EACpBC,eAAe,IAAM,IAAI,EACzBC,KAAK,EACLC,GAAG,EACHC,gBAAgB,CAACC,QAAkC,IAAI,EAC3B;IAC5B,IAAIC,eAAqC;IACzC,OAAO;QACLC;YACEL,MAAMK,MAAM,CAACT;QACf;QACA,MAAMU;YACJ,MAAMC,SAASP,MAAMM,GAAG,CAACV;YAEzB,IAAIY,gBAAgBD,SAAS;gBAC3B,MAAM,EAACE,SAAS,EAAEN,KAAK,EAAC,GAAGI;gBAC3B,IAAI,CAACL,cAAcC,QAAQ;oBACzB,MAAM,IAAIO,MAAM;gBAClB;gBAEA,MAAMC,aAAaC,KAAKC,GAAG,KAAKJ,YAAYR;gBAE5C,IAAI,CAACU,YAAY;oBACfd;oBACA,OAAOM;gBACT;gBAEAJ;YACF;YAEA,IAAIK,cAAc;gBAChB,OAAOA;YACT;YACAN;YAEAM,eAAeU,QAAQC,OAAO,CAACpB;YAC/B,MAAMqB,YAAY,MAAMZ;YACxB,IAAI,CAACF,cAAcc,YAAY;gBAC7B,MAAM,IAAIN,MAAM;YAClB;YAEAN,eAAe;YAEfJ,MAAMiB,GAAG,CAACrB,KAAK;gBACba,WAAWG,KAAKC,GAAG;gBACnBV,OAAOa;YACT;YAEA,OAAOA;QACT;IACF;AACF;AAEA;;;;;;CAMC,GACD,SAASR,gBAAgBD,MAAe;IACtC,IAAI,OAAOA,WAAW,YAAYA,WAAW,QAAQW,MAAMC,OAAO,CAACZ,SAAS;QAC1E,OAAO;IACT;IAEA,IAAI,CAAE,CAAA,eAAeA,MAAK,KAAM,OAAOA,OAAOE,SAAS,KAAK,UAAU;QACpE,OAAO;IACT;IAEA,IAAI,CAAE,CAAA,WAAWF,MAAK,GAAI;QACxB,OAAO;IACT;IAEA,OAAO;AACT"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Parses an optional string flag from oclif.
|
|
3
|
-
* If the input is undefined, return undefined
|
|
4
|
-
* but if the input is empty, throw an error.
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* @param input - The input to parse
|
|
8
|
-
* Throws an error if the input is empty
|
|
9
|
-
*/ export async function parseStringFlag(flagName, input) {
|
|
10
|
-
if (input === undefined) {
|
|
11
|
-
return input;
|
|
12
|
-
}
|
|
13
|
-
if (!input) {
|
|
14
|
-
throw new Error(`${flagName} argument is empty`);
|
|
15
|
-
}
|
|
16
|
-
return input;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
//# sourceMappingURL=parseStringFlag.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/util/parseStringFlag.ts"],"sourcesContent":["/**\n * Parses an optional string flag from oclif.\n * If the input is undefined, return undefined\n * but if the input is empty, throw an error.\n *\n *\n * @param input - The input to parse\n * Throws an error if the input is empty\n */\nexport async function parseStringFlag(flagName: string, input?: string) {\n if (input === undefined) {\n return input\n }\n\n if (!input) {\n throw new Error(`${flagName} argument is empty`)\n }\n\n return input\n}\n"],"names":["parseStringFlag","flagName","input","undefined","Error"],"mappings":"AAAA;;;;;;;;CAQC,GACD,OAAO,eAAeA,gBAAgBC,QAAgB,EAAEC,KAAc;IACpE,IAAIA,UAAUC,WAAW;QACvB,OAAOD;IACT;IAEA,IAAI,CAACA,OAAO;QACV,MAAM,IAAIE,MAAM,GAAGH,SAAS,kBAAkB,CAAC;IACjD;IAEA,OAAOC;AACT"}
|
package/dist/util/tree.js
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { isIndexSegment, isIndexTuple, isKeySegment } from '@sanity/types';
|
|
2
|
-
// FIXME: de-dupe this
|
|
3
|
-
// copy/paste of `pathToString` from 'sanity' to prevent circular imports
|
|
4
|
-
function pathToString(path) {
|
|
5
|
-
if (!Array.isArray(path)) {
|
|
6
|
-
throw new TypeError('Path is not an array');
|
|
7
|
-
}
|
|
8
|
-
let target = '';
|
|
9
|
-
let i = 0;
|
|
10
|
-
for (const segment of path){
|
|
11
|
-
if (isIndexSegment(segment)) {
|
|
12
|
-
target = `${target}[${segment}]`;
|
|
13
|
-
} else if (isKeySegment(segment) && segment._key) {
|
|
14
|
-
target = `${target}[_key=="${segment._key}"]`;
|
|
15
|
-
} else if (isIndexTuple(segment)) {
|
|
16
|
-
const [from, to] = segment;
|
|
17
|
-
target = `${target}[${from}:${to}]`;
|
|
18
|
-
} else if (typeof segment === 'string') {
|
|
19
|
-
const separator = i === 0 ? '' : '.';
|
|
20
|
-
target = `${target}${separator}${segment}`;
|
|
21
|
-
} else {
|
|
22
|
-
throw new TypeError(`Unsupported path segment \`${JSON.stringify(segment)}\``);
|
|
23
|
-
}
|
|
24
|
-
i++;
|
|
25
|
-
}
|
|
26
|
-
return target;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Recursively calculates the max length of all the keys in the given validation
|
|
30
|
-
* tree respecting extra length due to indentation depth. Used to calculate the
|
|
31
|
-
* padding for the rest of the tree.
|
|
32
|
-
*/ export const maxKeyLength = (children = {}, depth = 0)=>{
|
|
33
|
-
let max = 0;
|
|
34
|
-
for (const [key, child] of Object.entries(children)){
|
|
35
|
-
const currentMax = Math.max(key.length + depth * 2, maxKeyLength(child.children, depth + 1));
|
|
36
|
-
max = Math.max(max, currentMax);
|
|
37
|
-
}
|
|
38
|
-
return max;
|
|
39
|
-
};
|
|
40
|
-
/**
|
|
41
|
-
* Recursively formats a given tree into a printed user-friendly tree structure
|
|
42
|
-
*/ export const formatTree = ({ getMessage, getNodes: getLeaves = ({ nodes })=>nodes, indent = '', node = {}, paddingLength })=>{
|
|
43
|
-
const entries = Object.entries(node);
|
|
44
|
-
return entries.map(([key, child], index)=>{
|
|
45
|
-
const isLast = index === entries.length - 1;
|
|
46
|
-
const nextIndent = `${indent}${isLast ? ' ' : '│ '}`;
|
|
47
|
-
const leaves = getLeaves(child);
|
|
48
|
-
const nested = formatTree({
|
|
49
|
-
getMessage,
|
|
50
|
-
getNodes: getLeaves,
|
|
51
|
-
indent: nextIndent,
|
|
52
|
-
node: child.children,
|
|
53
|
-
paddingLength
|
|
54
|
-
});
|
|
55
|
-
if (!leaves?.length) {
|
|
56
|
-
const current = `${indent}${isLast ? '└' : '├'}─ ${key}`;
|
|
57
|
-
return [
|
|
58
|
-
current,
|
|
59
|
-
nested
|
|
60
|
-
].filter(Boolean).join('\n');
|
|
61
|
-
}
|
|
62
|
-
const [first, ...rest] = leaves;
|
|
63
|
-
const firstPadding = '.'.repeat(paddingLength - indent.length - key.length);
|
|
64
|
-
const elbow = isLast ? '└' : '├';
|
|
65
|
-
const subsequentPadding = ' '.repeat(paddingLength - indent.length + 2);
|
|
66
|
-
const firstMessage = `${indent}${elbow}─ ${key} ${firstPadding} ${getMessage(first)}`;
|
|
67
|
-
const subsequentMessages = rest.map((marker)=>`${nextIndent}${subsequentPadding} ${getMessage(marker)}`).join('\n');
|
|
68
|
-
const current = [
|
|
69
|
-
firstMessage,
|
|
70
|
-
subsequentMessages
|
|
71
|
-
].filter(Boolean).join('\n');
|
|
72
|
-
return [
|
|
73
|
-
current,
|
|
74
|
-
nested
|
|
75
|
-
].filter(Boolean).join('\n');
|
|
76
|
-
}).join('\n');
|
|
77
|
-
};
|
|
78
|
-
/**
|
|
79
|
-
* Converts a set of markers with paths into a tree of markers where the paths
|
|
80
|
-
* are embedded in the tree
|
|
81
|
-
*/ export function convertToTree(nodes) {
|
|
82
|
-
const root = {};
|
|
83
|
-
// add the markers to the tree
|
|
84
|
-
function addNode(node, tree = root) {
|
|
85
|
-
// if we've traversed the whole path
|
|
86
|
-
if (node.path.length === 0) {
|
|
87
|
-
if (!tree.nodes) tree.nodes = []; // ensure markers is defined
|
|
88
|
-
// then add the marker to the front
|
|
89
|
-
tree.nodes.push(node);
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
const [current, ...rest] = node.path;
|
|
93
|
-
const key = pathToString([
|
|
94
|
-
current
|
|
95
|
-
]);
|
|
96
|
-
// ensure the current node has children and the next node
|
|
97
|
-
if (!tree.children) tree.children = {};
|
|
98
|
-
if (!(key in tree.children)) tree.children[key] = {};
|
|
99
|
-
addNode({
|
|
100
|
-
...node,
|
|
101
|
-
path: rest
|
|
102
|
-
}, tree.children[key]);
|
|
103
|
-
}
|
|
104
|
-
for (const node of nodes)addNode(node);
|
|
105
|
-
return root;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
//# sourceMappingURL=tree.js.map
|
package/dist/util/tree.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/util/tree.ts"],"sourcesContent":["import {isIndexSegment, isIndexTuple, isKeySegment, type Path} from '@sanity/types'\n\n// FIXME: de-dupe this\n// copy/paste of `pathToString` from 'sanity' to prevent circular imports\nfunction pathToString(path: Path): string {\n if (!Array.isArray(path)) {\n throw new TypeError('Path is not an array')\n }\n\n let target = ''\n let i = 0\n for (const segment of path) {\n if (isIndexSegment(segment)) {\n target = `${target}[${segment}]`\n } else if (isKeySegment(segment) && segment._key) {\n target = `${target}[_key==\"${segment._key}\"]`\n } else if (isIndexTuple(segment)) {\n const [from, to] = segment\n target = `${target}[${from}:${to}]`\n } else if (typeof segment === 'string') {\n const separator = i === 0 ? '' : '.'\n target = `${target}${separator}${segment}`\n } else {\n throw new TypeError(`Unsupported path segment \\`${JSON.stringify(segment)}\\``)\n }\n i++\n }\n return target\n}\n\ninterface BaseNode {\n path: Path\n}\n\nexport interface Tree<Node extends BaseNode> {\n children?: Record<string, Tree<Node>>\n nodes?: Node[]\n}\n\n/**\n * Recursively calculates the max length of all the keys in the given validation\n * tree respecting extra length due to indentation depth. Used to calculate the\n * padding for the rest of the tree.\n */\nexport const maxKeyLength = (children: Record<string, Tree<BaseNode>> = {}, depth = 0): number => {\n let max = 0\n for (const [key, child] of Object.entries(children)) {\n const currentMax = Math.max(key.length + depth * 2, maxKeyLength(child.children, depth + 1))\n max = Math.max(max, currentMax)\n }\n return max\n}\n\ninterface Options<Node extends BaseNode> {\n getMessage: (node: Node) => string\n paddingLength: number\n\n getNodes?: (node: Tree<Node>) => Node[] | undefined\n indent?: string\n node?: Record<string, Tree<Node>>\n}\n\n/**\n * Recursively formats a given tree into a printed user-friendly tree structure\n */\nexport const formatTree = <Node extends BaseNode>({\n getMessage,\n getNodes: getLeaves = ({nodes}) => nodes,\n indent = '',\n node = {},\n paddingLength,\n}: Options<Node>): string => {\n const entries = Object.entries(node)\n\n return entries\n .map(([key, child], index) => {\n const isLast = index === entries.length - 1\n const nextIndent = `${indent}${isLast ? ' ' : '│ '}`\n const leaves = getLeaves(child)\n\n const nested = formatTree({\n getMessage,\n getNodes: getLeaves,\n indent: nextIndent,\n node: child.children,\n paddingLength,\n })\n\n if (!leaves?.length) {\n const current = `${indent}${isLast ? '└' : '├'}─ ${key}`\n return [current, nested].filter(Boolean).join('\\n')\n }\n\n const [first, ...rest] = leaves\n const firstPadding = '.'.repeat(paddingLength - indent.length - key.length)\n const elbow = isLast ? '└' : '├'\n const subsequentPadding = ' '.repeat(paddingLength - indent.length + 2)\n\n const firstMessage = `${indent}${elbow}─ ${key} ${firstPadding} ${getMessage(first)}`\n const subsequentMessages = rest\n .map((marker) => `${nextIndent}${subsequentPadding} ${getMessage(marker)}`)\n .join('\\n')\n\n const current = [firstMessage, subsequentMessages].filter(Boolean).join('\\n')\n return [current, nested].filter(Boolean).join('\\n')\n })\n .join('\\n')\n}\n\n/**\n * Converts a set of markers with paths into a tree of markers where the paths\n * are embedded in the tree\n */\nexport function convertToTree<const Node extends BaseNode>(nodes: Node[]): Tree<Node> {\n const root: Tree<Node> = {}\n\n // add the markers to the tree\n function addNode(node: Node, tree: Tree<Node> = root) {\n // if we've traversed the whole path\n if (node.path.length === 0) {\n if (!tree.nodes) tree.nodes = [] // ensure markers is defined\n\n // then add the marker to the front\n tree.nodes.push(node)\n return\n }\n\n const [current, ...rest] = node.path\n const key = pathToString([current])\n\n // ensure the current node has children and the next node\n if (!tree.children) tree.children = {}\n if (!(key in tree.children)) tree.children[key] = {}\n\n addNode({...node, path: rest}, tree.children[key])\n }\n\n for (const node of nodes) addNode(node)\n return root\n}\n"],"names":["isIndexSegment","isIndexTuple","isKeySegment","pathToString","path","Array","isArray","TypeError","target","i","segment","_key","from","to","separator","JSON","stringify","maxKeyLength","children","depth","max","key","child","Object","entries","currentMax","Math","length","formatTree","getMessage","getNodes","getLeaves","nodes","indent","node","paddingLength","map","index","isLast","nextIndent","leaves","nested","current","filter","Boolean","join","first","rest","firstPadding","repeat","elbow","subsequentPadding","firstMessage","subsequentMessages","marker","convertToTree","root","addNode","tree","push"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/util/waitForAsync.ts"],"sourcesContent":["export const waitForAsync = (ms = 0): Promise<void> => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n"],"names":["waitForAsync","ms","Promise","resolve","setTimeout"],"mappings":"AAAA,OAAO,MAAMA,eAAe,CAACC,KAAK,CAAC;IACjC,OAAO,IAAIC,QAAQ,CAACC,UAAYC,WAAWD,SAASF;AACtD,EAAC"}
|
package/dist/ux/formatObject.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ux/formatObject.ts"],"sourcesContent":["import {inspect} from 'node:util'\n\nexport function formatObject(obj: unknown): string {\n return inspect(obj, {colors: true, depth: +Infinity})\n}\n"],"names":["inspect","formatObject","obj","colors","depth","Infinity"],"mappings":"AAAA,SAAQA,OAAO,QAAO,YAAW;AAEjC,OAAO,SAASC,aAAaC,GAAY;IACvC,OAAOF,QAAQE,KAAK;QAACC,QAAQ;QAAMC,OAAO,CAACC;IAAQ;AACrD"}
|
package/dist/ux/printKeyValue.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { ux } from '@oclif/core';
|
|
2
|
-
import { formatObject } from './formatObject.js';
|
|
3
|
-
export function printKeyValue(obj) {
|
|
4
|
-
let printedLines = 0;
|
|
5
|
-
for (const key of Object.keys(obj)){
|
|
6
|
-
if (obj[key] !== undefined) {
|
|
7
|
-
ux.stdout(` ${key}: ${formatObject(obj[key])}`);
|
|
8
|
-
printedLines++;
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
if (printedLines > 0) {
|
|
12
|
-
ux.stdout('');
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
//# sourceMappingURL=printKeyValue.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ux/printKeyValue.ts"],"sourcesContent":["import {ux} from '@oclif/core'\n\nimport {formatObject} from './formatObject.js'\n\nexport function printKeyValue(obj: Record<string, unknown>): void {\n let printedLines = 0\n for (const key of Object.keys(obj)) {\n if (obj[key] !== undefined) {\n ux.stdout(` ${key}: ${formatObject(obj[key])}`)\n printedLines++\n }\n }\n\n if (printedLines > 0) {\n ux.stdout('')\n }\n}\n"],"names":["ux","formatObject","printKeyValue","obj","printedLines","key","Object","keys","undefined","stdout"],"mappings":"AAAA,SAAQA,EAAE,QAAO,cAAa;AAE9B,SAAQC,YAAY,QAAO,oBAAmB;AAE9C,OAAO,SAASC,cAAcC,GAA4B;IACxD,IAAIC,eAAe;IACnB,KAAK,MAAMC,OAAOC,OAAOC,IAAI,CAACJ,KAAM;QAClC,IAAIA,GAAG,CAACE,IAAI,KAAKG,WAAW;YAC1BR,GAAGS,MAAM,CAAC,CAAC,EAAE,EAAEJ,IAAI,EAAE,EAAEJ,aAAaE,GAAG,CAACE,IAAI,GAAG;YAC/CD;QACF;IACF;IAEA,IAAIA,eAAe,GAAG;QACpBJ,GAAGS,MAAM,CAAC;IACZ;AACF"}
|