@workflow/utils 5.0.0-beta.1 → 5.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/parse-name.d.ts +12 -0
- package/dist/parse-name.d.ts.map +1 -1
- package/dist/parse-name.js +21 -0
- package/dist/parse-name.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { pluralize } from './pluralize.js';
|
|
2
|
-
export { parseClassName, parseStepName, parseWorkflowName, } from './parse-name.js';
|
|
2
|
+
export { formatStepName, formatWorkflowName, parseClassName, parseStepName, parseWorkflowName, } from './parse-name.js';
|
|
3
3
|
export { once, type PromiseWithResolvers, withResolvers } from './promise.js';
|
|
4
4
|
export { parseDurationToDate } from './time.js';
|
|
5
5
|
export { isVercelWorldTarget, resolveWorkflowTargetWorld, usesVercelWorld, } from './world-target.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,cAAc,EACd,aAAa,EACb,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,IAAI,EAAE,KAAK,oBAAoB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,IAAI,EAAE,KAAK,oBAAoB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { pluralize } from './pluralize.js';
|
|
2
|
-
export { parseClassName, parseStepName, parseWorkflowName, } from './parse-name.js';
|
|
2
|
+
export { formatStepName, formatWorkflowName, parseClassName, parseStepName, parseWorkflowName, } from './parse-name.js';
|
|
3
3
|
export { once, withResolvers } from './promise.js';
|
|
4
4
|
export { parseDurationToDate } from './time.js';
|
|
5
5
|
export { isVercelWorldTarget, resolveWorkflowTargetWorld, usesVercelWorld, } from './world-target.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,cAAc,EACd,aAAa,EACb,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,IAAI,EAA6B,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,mBAAmB,CAAC","sourcesContent":["export { pluralize } from './pluralize.js';\nexport {\n parseClassName,\n parseStepName,\n parseWorkflowName,\n} from './parse-name.js';\nexport { once, type PromiseWithResolvers, withResolvers } from './promise.js';\nexport { parseDurationToDate } from './time.js';\nexport {\n isVercelWorldTarget,\n resolveWorkflowTargetWorld,\n usesVercelWorld,\n} from './world-target.js';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,IAAI,EAA6B,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,mBAAmB,CAAC","sourcesContent":["export { pluralize } from './pluralize.js';\nexport {\n formatStepName,\n formatWorkflowName,\n parseClassName,\n parseStepName,\n parseWorkflowName,\n} from './parse-name.js';\nexport { once, type PromiseWithResolvers, withResolvers } from './promise.js';\nexport { parseDurationToDate } from './time.js';\nexport {\n isVercelWorldTarget,\n resolveWorkflowTargetWorld,\n usesVercelWorld,\n} from './world-target.js';\n"]}
|
package/dist/parse-name.d.ts
CHANGED
|
@@ -34,4 +34,16 @@ export declare function parseClassName(name: string): {
|
|
|
34
34
|
moduleSpecifier: string;
|
|
35
35
|
functionName: string;
|
|
36
36
|
} | null;
|
|
37
|
+
/**
|
|
38
|
+
* Human-friendly single-line rendering of a step or workflow name for log
|
|
39
|
+
* messages. Parses the machine name (`step//./workflows/1_simple//add`) and
|
|
40
|
+
* renders it as `add (./workflows/1_simple)` so users see the short function
|
|
41
|
+
* name and the source module specifier without the internal `//` syntax.
|
|
42
|
+
*
|
|
43
|
+
* Falls back to the raw name if parsing fails (e.g. older name formats or
|
|
44
|
+
* user-provided strings we don't recognize) so logs never silently drop
|
|
45
|
+
* information.
|
|
46
|
+
*/
|
|
47
|
+
export declare function formatStepName(name: string): string;
|
|
48
|
+
export declare function formatWorkflowName(name: string): string;
|
|
37
49
|
//# sourceMappingURL=parse-name.d.ts.map
|
package/dist/parse-name.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-name.d.ts","sourceRoot":"","sources":["../src/parse-name.ts"],"names":[],"mappings":"AAyDA;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM;eAxD9B,MAAM;qBAAmB,MAAM;kBAAgB,MAAM;SA0DpE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM;eAnE1B,MAAM;qBAAmB,MAAM;kBAAgB,MAAM;SAqEpE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM;eA9E3B,MAAM;qBAAmB,MAAM;kBAAgB,MAAM;SAgFpE"}
|
|
1
|
+
{"version":3,"file":"parse-name.d.ts","sourceRoot":"","sources":["../src/parse-name.ts"],"names":[],"mappings":"AAyDA;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM;eAxD9B,MAAM;qBAAmB,MAAM;kBAAgB,MAAM;SA0DpE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM;eAnE1B,MAAM;qBAAmB,MAAM;kBAAgB,MAAM;SAqEpE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM;eA9E3B,MAAM;qBAAmB,MAAM;kBAAgB,MAAM;SAgFpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD"}
|
package/dist/parse-name.js
CHANGED
|
@@ -77,4 +77,25 @@ export function parseStepName(name) {
|
|
|
77
77
|
export function parseClassName(name) {
|
|
78
78
|
return parseName('class', name);
|
|
79
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* Human-friendly single-line rendering of a step or workflow name for log
|
|
82
|
+
* messages. Parses the machine name (`step//./workflows/1_simple//add`) and
|
|
83
|
+
* renders it as `add (./workflows/1_simple)` so users see the short function
|
|
84
|
+
* name and the source module specifier without the internal `//` syntax.
|
|
85
|
+
*
|
|
86
|
+
* Falls back to the raw name if parsing fails (e.g. older name formats or
|
|
87
|
+
* user-provided strings we don't recognize) so logs never silently drop
|
|
88
|
+
* information.
|
|
89
|
+
*/
|
|
90
|
+
export function formatStepName(name) {
|
|
91
|
+
return formatParsedName(parseStepName(name), name);
|
|
92
|
+
}
|
|
93
|
+
export function formatWorkflowName(name) {
|
|
94
|
+
return formatParsedName(parseWorkflowName(name), name);
|
|
95
|
+
}
|
|
96
|
+
function formatParsedName(parsed, fallback) {
|
|
97
|
+
if (!parsed)
|
|
98
|
+
return fallback;
|
|
99
|
+
return `${parsed.shortName} (${parsed.moduleSpecifier})`;
|
|
100
|
+
}
|
|
80
101
|
//# sourceMappingURL=parse-name.js.map
|
package/dist/parse-name.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-name.js","sourceRoot":"","sources":["../src/parse-name.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,SAAS,SAAS,CAChB,GAAW,EACX,IAAY;IAEZ,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,2DAA2D;IAC3D,SAAS;IACT,sDAAsD;IACtD,iCAAiC;IACjC,sGAAsG;IACtG,kGAAkG;IAClG,6FAA6F;IAC7F,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,iBAAiB,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzE,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,2EAA2E;IAC3E,IAAI,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAErD,gDAAgD;IAChD,yEAAyE;IACzE,2EAA2E;IAC3E,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,IAAI,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,2CAA2C;QAC3C,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,CAAC;SAAM,CAAC;QACN,mEAAmE;QACnE,oEAAoE;QACpE,MAAM,cAAc,GAClB,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YACjD,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,eAAe,GAAG,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,CAAC;IAED,uEAAuE;IACvE,gFAAgF;IAChF,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,eAAe,EAAE,CAAC;QACpE,SAAS,GAAG,eAAe,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,SAAS;QACT,eAAe;QACf,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC","sourcesContent":["/**\n * Parse a machine readable name.\n *\n * @see {@link ../../swc-plugin-workflow/transform/src/naming.rs} for the naming scheme.\n */\nfunction parseName(\n tag: string,\n name: string\n): { shortName: string; moduleSpecifier: string; functionName: string } | null {\n if (typeof name !== 'string') {\n return null;\n }\n // Looks like {prefix}//{moduleSpecifier}//{function_name}\"\n // Where:\n // - {prefix} is either 'workflow', 'step', or 'class'\n // - {moduleSpecifier} is either:\n // - A module specifier (e.g., `point@0.0.1`, `@myorg/shared@1.2.3`) when provided via plugin config\n // - A relative path prefixed with `./` (e.g., `./src/jobs/order`) when no specifier is provided\n // - {function_name} is the name of the function (with nested functions using `/` separators)\n const [prefix, moduleSpecifier, ...functionNameParts] = name.split('//');\n if (prefix !== tag || !moduleSpecifier || functionNameParts.length === 0) {\n return null;\n }\n\n const functionName = functionNameParts.join('//');\n // For nested functions like \"processOrder/innerStep\", get just \"innerStep\"\n let shortName = functionName.split('/').at(-1) ?? '';\n\n // Extract a reasonable name for default exports\n // For module specifiers like \"point@0.0.1\", use the package name \"point\"\n // For relative paths like \"./src/jobs/order\", use the last segment \"order\"\n let moduleShortName = '';\n if (moduleSpecifier.startsWith('./')) {\n // Relative path: use the last path segment\n moduleShortName = moduleSpecifier.split('/').at(-1) ?? '';\n } else {\n // Module specifier: extract package name (strip version and scope)\n // e.g., \"@myorg/shared@1.2.3\" -> \"shared\", \"point@0.0.1\" -> \"point\"\n const withoutVersion =\n moduleSpecifier.split('@').slice(0, -1).join('@') ||\n moduleSpecifier.split('@')[0];\n moduleShortName = withoutVersion?.split('/').at(-1) ?? '';\n }\n\n // Default exports will use the module short name. \"__default\" was only\n // used for one package version, so this is a minor backwards compatibility fix.\n if (['default', '__default'].includes(shortName) && moduleShortName) {\n shortName = moduleShortName;\n }\n\n return {\n shortName,\n moduleSpecifier,\n functionName,\n };\n}\n\n/**\n * Parse a workflow name into its components.\n *\n * @param name - The workflow name to parse (e.g., \"workflow//./src/jobs/order//processOrder\" or \"workflow//mypackage@1.0.0//processOrder\").\n * @returns An object with `shortName`, `moduleSpecifier`, and `functionName` properties.\n * When the name is invalid, returns `null`.\n */\nexport function parseWorkflowName(name: string) {\n return parseName('workflow', name);\n}\n\n/**\n * Parse a step name into its components.\n *\n * @param name - The step name to parse (e.g., \"step//./src/jobs/order//fetchData\" or \"step//@myorg/tasks@2.0.0//processOrder\").\n * @returns An object with `shortName`, `moduleSpecifier`, and `functionName` properties.\n * When the name is invalid, returns `null`.\n */\nexport function parseStepName(name: string) {\n return parseName('step', name);\n}\n\n/**\n * Parse a class ID into its components.\n *\n * @param name - The class ID to parse (e.g., \"class//./src/models/Point//Point\" or \"class//point@0.0.1//Point\").\n * @returns An object with `shortName`, `moduleSpecifier`, and `functionName` (className) properties.\n * When the name is invalid, returns `null`.\n */\nexport function parseClassName(name: string) {\n return parseName('class', name);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"parse-name.js","sourceRoot":"","sources":["../src/parse-name.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,SAAS,SAAS,CAChB,GAAW,EACX,IAAY;IAEZ,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,2DAA2D;IAC3D,SAAS;IACT,sDAAsD;IACtD,iCAAiC;IACjC,sGAAsG;IACtG,kGAAkG;IAClG,6FAA6F;IAC7F,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,iBAAiB,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzE,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,2EAA2E;IAC3E,IAAI,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAErD,gDAAgD;IAChD,yEAAyE;IACzE,2EAA2E;IAC3E,IAAI,eAAe,GAAG,EAAE,CAAC;IACzB,IAAI,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,2CAA2C;QAC3C,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,CAAC;SAAM,CAAC;QACN,mEAAmE;QACnE,oEAAoE;QACpE,MAAM,cAAc,GAClB,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YACjD,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,eAAe,GAAG,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,CAAC;IAED,uEAAuE;IACvE,gFAAgF;IAChF,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,eAAe,EAAE,CAAC;QACpE,SAAS,GAAG,eAAe,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,SAAS;QACT,eAAe;QACf,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,gBAAgB,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,gBAAgB,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,gBAAgB,CACvB,MAIQ,EACR,QAAgB;IAEhB,IAAI,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IAC7B,OAAO,GAAG,MAAM,CAAC,SAAS,KAAK,MAAM,CAAC,eAAe,GAAG,CAAC;AAC3D,CAAC","sourcesContent":["/**\n * Parse a machine readable name.\n *\n * @see {@link ../../swc-plugin-workflow/transform/src/naming.rs} for the naming scheme.\n */\nfunction parseName(\n tag: string,\n name: string\n): { shortName: string; moduleSpecifier: string; functionName: string } | null {\n if (typeof name !== 'string') {\n return null;\n }\n // Looks like {prefix}//{moduleSpecifier}//{function_name}\"\n // Where:\n // - {prefix} is either 'workflow', 'step', or 'class'\n // - {moduleSpecifier} is either:\n // - A module specifier (e.g., `point@0.0.1`, `@myorg/shared@1.2.3`) when provided via plugin config\n // - A relative path prefixed with `./` (e.g., `./src/jobs/order`) when no specifier is provided\n // - {function_name} is the name of the function (with nested functions using `/` separators)\n const [prefix, moduleSpecifier, ...functionNameParts] = name.split('//');\n if (prefix !== tag || !moduleSpecifier || functionNameParts.length === 0) {\n return null;\n }\n\n const functionName = functionNameParts.join('//');\n // For nested functions like \"processOrder/innerStep\", get just \"innerStep\"\n let shortName = functionName.split('/').at(-1) ?? '';\n\n // Extract a reasonable name for default exports\n // For module specifiers like \"point@0.0.1\", use the package name \"point\"\n // For relative paths like \"./src/jobs/order\", use the last segment \"order\"\n let moduleShortName = '';\n if (moduleSpecifier.startsWith('./')) {\n // Relative path: use the last path segment\n moduleShortName = moduleSpecifier.split('/').at(-1) ?? '';\n } else {\n // Module specifier: extract package name (strip version and scope)\n // e.g., \"@myorg/shared@1.2.3\" -> \"shared\", \"point@0.0.1\" -> \"point\"\n const withoutVersion =\n moduleSpecifier.split('@').slice(0, -1).join('@') ||\n moduleSpecifier.split('@')[0];\n moduleShortName = withoutVersion?.split('/').at(-1) ?? '';\n }\n\n // Default exports will use the module short name. \"__default\" was only\n // used for one package version, so this is a minor backwards compatibility fix.\n if (['default', '__default'].includes(shortName) && moduleShortName) {\n shortName = moduleShortName;\n }\n\n return {\n shortName,\n moduleSpecifier,\n functionName,\n };\n}\n\n/**\n * Parse a workflow name into its components.\n *\n * @param name - The workflow name to parse (e.g., \"workflow//./src/jobs/order//processOrder\" or \"workflow//mypackage@1.0.0//processOrder\").\n * @returns An object with `shortName`, `moduleSpecifier`, and `functionName` properties.\n * When the name is invalid, returns `null`.\n */\nexport function parseWorkflowName(name: string) {\n return parseName('workflow', name);\n}\n\n/**\n * Parse a step name into its components.\n *\n * @param name - The step name to parse (e.g., \"step//./src/jobs/order//fetchData\" or \"step//@myorg/tasks@2.0.0//processOrder\").\n * @returns An object with `shortName`, `moduleSpecifier`, and `functionName` properties.\n * When the name is invalid, returns `null`.\n */\nexport function parseStepName(name: string) {\n return parseName('step', name);\n}\n\n/**\n * Parse a class ID into its components.\n *\n * @param name - The class ID to parse (e.g., \"class//./src/models/Point//Point\" or \"class//point@0.0.1//Point\").\n * @returns An object with `shortName`, `moduleSpecifier`, and `functionName` (className) properties.\n * When the name is invalid, returns `null`.\n */\nexport function parseClassName(name: string) {\n return parseName('class', name);\n}\n\n/**\n * Human-friendly single-line rendering of a step or workflow name for log\n * messages. Parses the machine name (`step//./workflows/1_simple//add`) and\n * renders it as `add (./workflows/1_simple)` so users see the short function\n * name and the source module specifier without the internal `//` syntax.\n *\n * Falls back to the raw name if parsing fails (e.g. older name formats or\n * user-provided strings we don't recognize) so logs never silently drop\n * information.\n */\nexport function formatStepName(name: string): string {\n return formatParsedName(parseStepName(name), name);\n}\n\nexport function formatWorkflowName(name: string): string {\n return formatParsedName(parseWorkflowName(name), name);\n}\n\nfunction formatParsedName(\n parsed: {\n shortName: string;\n moduleSpecifier: string;\n functionName: string;\n } | null,\n fallback: string\n): string {\n if (!parsed) return fallback;\n return `${parsed.shortName} (${parsed.moduleSpecifier})`;\n}\n"]}
|