@pipe0/react 1.0.19 → 1.0.20
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/CHANGELOG.md +8 -0
- package/dist/components/defaults/adapters/index.d.mts.map +1 -1
- package/dist/components/defaults/adapters/index.mjs +2 -0
- package/dist/components/defaults/adapters/index.mjs.map +1 -1
- package/dist/components/defaults/adapters/single-create-input.mjs +37 -0
- package/dist/components/defaults/adapters/single-create-input.mjs.map +1 -0
- package/dist/hooks/use-form-core.mjs +2 -2
- package/dist/hooks/use-form-core.mjs.map +1 -1
- package/dist/hooks/use-pipe-catalog-table.d.mts +8 -8
- package/dist/hooks/use-stream-form.d.mts +30 -0
- package/dist/hooks/use-stream-form.d.mts.map +1 -0
- package/dist/hooks/use-stream-form.mjs +90 -0
- package/dist/hooks/use-stream-form.mjs.map +1 -0
- package/dist/index.d.mts +2 -1
- package/dist/index.mjs +2 -1
- package/dist/types/field-props.d.mts +7 -0
- package/dist/types/field-props.d.mts.map +1 -1
- package/dist/utils/build-section-handlers.mjs +18 -6
- package/dist/utils/build-section-handlers.mjs.map +1 -1
- package/dist/widgets/glyphs/linkedin.mjs +32 -0
- package/dist/widgets/glyphs/linkedin.mjs.map +1 -0
- package/dist/widgets/icon-glyph.mjs +4 -3
- package/dist/widgets/icon-glyph.mjs.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/components/defaults/adapters/index.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/components/defaults/adapters/index.ts"],"mappings":";;;;;AA0CA;;cAAa,eAAA,EAwC2B,OAAA,CAAQ,eAAA"}
|
|
@@ -27,6 +27,7 @@ import { ProvidersInputAdapter } from "./providers-input.mjs";
|
|
|
27
27
|
import { RangeInputAdapter } from "./range-input.mjs";
|
|
28
28
|
import { SearchPayloadInputAdapter } from "./search-payload-input.mjs";
|
|
29
29
|
import { SelectInputAdapter } from "./select-input.mjs";
|
|
30
|
+
import { SingleCreateInputAdapter } from "./single-create-input.mjs";
|
|
30
31
|
import { TaggedOrderedMultiCreateInputAdapter } from "./tagged-ordered-multi-create-input.mjs";
|
|
31
32
|
import { TaggedTextInputAdapter } from "./tagged-text-input.mjs";
|
|
32
33
|
import { TemplateInputAdapter } from "./template-input.mjs";
|
|
@@ -52,6 +53,7 @@ const defaultAdapters = {
|
|
|
52
53
|
multi_select_input: MultiSelectInputAdapter,
|
|
53
54
|
include_exclude_input: IncludeExcludeInputAdapter,
|
|
54
55
|
multi_create_input: MultiCreateInputAdapter,
|
|
56
|
+
single_create_input: SingleCreateInputAdapter,
|
|
55
57
|
property_list_input: PropertyListInputAdapter,
|
|
56
58
|
context_select_input: ContextSelectInputAdapter,
|
|
57
59
|
async_multi_select_input: AsyncMultiSelectInputAdapter,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/components/defaults/adapters/index.ts"],"sourcesContent":["import type { FieldAdapterMap } from \"../../../types/adapters.js\";\nimport { AsyncIncludeExcludeSelectInputAdapter } from \"./async-include-exclude-select-input.js\";\nimport { AsyncMultiSelectInputAdapter } from \"./async-multi-select-input.js\";\nimport { BooleanInputAdapter } from \"./boolean-input.js\";\nimport { ConnectorInputAdapter } from \"./connector-input.js\";\nimport { ContextSelectInputAdapter } from \"./context-select-input.js\";\nimport { CursorPaginationInputAdapter } from \"./cursor-pagination-input.js\";\nimport { DateRangeInputAdapter } from \"./date-range-input.js\";\nimport { ExactRangeInputAdapter } from \"./exact-range-input.js\";\nimport { FieldSelectInputAdapter } from \"./field-select-input.js\";\nimport { FieldsSelectInputAdapter } from \"./fields-select-input.js\";\nimport { IncludeExcludeInputAdapter } from \"./include-exclude-input.js\";\nimport { IncludeExcludeSelectInputAdapter } from \"./include-exclude-select-input.js\";\nimport { IntInputAdapter } from \"./int-input.js\";\nimport { JsonExtractionInputAdapter } from \"./json-extraction-input.js\";\nimport { JsonSchemaInputAdapter } from \"./json-schema-input.js\";\nimport { LooseObjectInputAdapter } from \"./loose-object-input.js\";\nimport { MinMaxIntInputAdapter } from \"./min-max-int-input.js\";\nimport { MultiCreateInputAdapter } from \"./multi-create-input.js\";\nimport { MultiSelectInputAdapter } from \"./multi-select-input.js\";\nimport { NumberInputAdapter } from \"./number-input.js\";\nimport { OrderedMultiCreateInputAdapter } from \"./ordered-multi-create-input.js\";\nimport { OutputFieldInputAdapter } from \"./output-field-input.js\";\nimport { ConditionBlockInputAdapter, PipesRunIfInputAdapter } from \"./pipes-run-if-input.js\";\nimport { PromptInputAdapter } from \"./prompt-input.js\";\nimport { PropertyListInputAdapter } from \"./property-list-input.js\";\nimport { ProvidersInputAdapter } from \"./providers-input.js\";\nimport { RangeInputAdapter } from \"./range-input.js\";\nimport { SearchPayloadInputAdapter } from \"./search-payload-input.js\";\nimport { SelectInputAdapter } from \"./select-input.js\";\nimport { TaggedOrderedMultiCreateInputAdapter } from \"./tagged-ordered-multi-create-input.js\";\nimport { TaggedTextInputAdapter } from \"./tagged-text-input.js\";\nimport { TemplateInputAdapter } from \"./template-input.js\";\nimport { TextInputAdapter } from \"./text-input.js\";\nimport { TextareaInputAdapter } from \"./textarea-input.js\";\nimport { TypedFieldsSelectInputAdapter } from \"./typed-fields-select-input.js\";\n\n/**\n * Default field adapters for all known field kinds.\n * Users can override any of these via `<FormProvider adapters={...}>`.\n */\nexport const defaultAdapters = {\n text_input: TextInputAdapter,\n textarea_input: TextareaInputAdapter,\n int_input: IntInputAdapter,\n number_input: NumberInputAdapter,\n select_input: SelectInputAdapter,\n boolean_input: BooleanInputAdapter,\n nullable_boolean_input: BooleanInputAdapter,\n range_input: RangeInputAdapter,\n date_range_input: DateRangeInputAdapter,\n multi_select_input: MultiSelectInputAdapter,\n include_exclude_input: IncludeExcludeInputAdapter,\n multi_create_input: MultiCreateInputAdapter,\n property_list_input: PropertyListInputAdapter,\n context_select_input: ContextSelectInputAdapter,\n async_multi_select_input: AsyncMultiSelectInputAdapter,\n async_include_exclude_select_input: AsyncIncludeExcludeSelectInputAdapter,\n include_exclude_select_input: IncludeExcludeSelectInputAdapter,\n exact_range_input: ExactRangeInputAdapter,\n min_max_int_input: MinMaxIntInputAdapter,\n ordered_multi_create_input: OrderedMultiCreateInputAdapter,\n tagged_ordered_multi_create_input: TaggedOrderedMultiCreateInputAdapter,\n prompt_input: PromptInputAdapter,\n template_input: TemplateInputAdapter,\n tagged_text_input: TaggedTextInputAdapter,\n loose_object_input: LooseObjectInputAdapter,\n json_schema_input: JsonSchemaInputAdapter,\n json_extraction_input: JsonExtractionInputAdapter,\n pipes_run_if_input: PipesRunIfInputAdapter,\n condition_block_input: ConditionBlockInputAdapter,\n connector_input: ConnectorInputAdapter,\n providers_input: ProvidersInputAdapter,\n fields_select_input: FieldsSelectInputAdapter,\n typed_fields_select_input: TypedFieldsSelectInputAdapter,\n field_select_input: FieldSelectInputAdapter,\n output_field_input: OutputFieldInputAdapter,\n cursor_pagination_metadata: CursorPaginationInputAdapter,\n // Renders nothing by default — consumers (e.g. apps/dash) override this.\n search_payload_input: SearchPayloadInputAdapter,\n} satisfies Partial<FieldAdapterMap> as Partial<FieldAdapterMap>;\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/components/defaults/adapters/index.ts"],"sourcesContent":["import type { FieldAdapterMap } from \"../../../types/adapters.js\";\nimport { AsyncIncludeExcludeSelectInputAdapter } from \"./async-include-exclude-select-input.js\";\nimport { AsyncMultiSelectInputAdapter } from \"./async-multi-select-input.js\";\nimport { BooleanInputAdapter } from \"./boolean-input.js\";\nimport { ConnectorInputAdapter } from \"./connector-input.js\";\nimport { ContextSelectInputAdapter } from \"./context-select-input.js\";\nimport { CursorPaginationInputAdapter } from \"./cursor-pagination-input.js\";\nimport { DateRangeInputAdapter } from \"./date-range-input.js\";\nimport { ExactRangeInputAdapter } from \"./exact-range-input.js\";\nimport { FieldSelectInputAdapter } from \"./field-select-input.js\";\nimport { FieldsSelectInputAdapter } from \"./fields-select-input.js\";\nimport { IncludeExcludeInputAdapter } from \"./include-exclude-input.js\";\nimport { IncludeExcludeSelectInputAdapter } from \"./include-exclude-select-input.js\";\nimport { IntInputAdapter } from \"./int-input.js\";\nimport { JsonExtractionInputAdapter } from \"./json-extraction-input.js\";\nimport { JsonSchemaInputAdapter } from \"./json-schema-input.js\";\nimport { LooseObjectInputAdapter } from \"./loose-object-input.js\";\nimport { MinMaxIntInputAdapter } from \"./min-max-int-input.js\";\nimport { MultiCreateInputAdapter } from \"./multi-create-input.js\";\nimport { MultiSelectInputAdapter } from \"./multi-select-input.js\";\nimport { NumberInputAdapter } from \"./number-input.js\";\nimport { OrderedMultiCreateInputAdapter } from \"./ordered-multi-create-input.js\";\nimport { OutputFieldInputAdapter } from \"./output-field-input.js\";\nimport { ConditionBlockInputAdapter, PipesRunIfInputAdapter } from \"./pipes-run-if-input.js\";\nimport { PromptInputAdapter } from \"./prompt-input.js\";\nimport { PropertyListInputAdapter } from \"./property-list-input.js\";\nimport { ProvidersInputAdapter } from \"./providers-input.js\";\nimport { RangeInputAdapter } from \"./range-input.js\";\nimport { SearchPayloadInputAdapter } from \"./search-payload-input.js\";\nimport { SelectInputAdapter } from \"./select-input.js\";\nimport { SingleCreateInputAdapter } from \"./single-create-input.js\";\nimport { TaggedOrderedMultiCreateInputAdapter } from \"./tagged-ordered-multi-create-input.js\";\nimport { TaggedTextInputAdapter } from \"./tagged-text-input.js\";\nimport { TemplateInputAdapter } from \"./template-input.js\";\nimport { TextInputAdapter } from \"./text-input.js\";\nimport { TextareaInputAdapter } from \"./textarea-input.js\";\nimport { TypedFieldsSelectInputAdapter } from \"./typed-fields-select-input.js\";\n\n/**\n * Default field adapters for all known field kinds.\n * Users can override any of these via `<FormProvider adapters={...}>`.\n */\nexport const defaultAdapters = {\n text_input: TextInputAdapter,\n textarea_input: TextareaInputAdapter,\n int_input: IntInputAdapter,\n number_input: NumberInputAdapter,\n select_input: SelectInputAdapter,\n boolean_input: BooleanInputAdapter,\n nullable_boolean_input: BooleanInputAdapter,\n range_input: RangeInputAdapter,\n date_range_input: DateRangeInputAdapter,\n multi_select_input: MultiSelectInputAdapter,\n include_exclude_input: IncludeExcludeInputAdapter,\n multi_create_input: MultiCreateInputAdapter,\n single_create_input: SingleCreateInputAdapter,\n property_list_input: PropertyListInputAdapter,\n context_select_input: ContextSelectInputAdapter,\n async_multi_select_input: AsyncMultiSelectInputAdapter,\n async_include_exclude_select_input: AsyncIncludeExcludeSelectInputAdapter,\n include_exclude_select_input: IncludeExcludeSelectInputAdapter,\n exact_range_input: ExactRangeInputAdapter,\n min_max_int_input: MinMaxIntInputAdapter,\n ordered_multi_create_input: OrderedMultiCreateInputAdapter,\n tagged_ordered_multi_create_input: TaggedOrderedMultiCreateInputAdapter,\n prompt_input: PromptInputAdapter,\n template_input: TemplateInputAdapter,\n tagged_text_input: TaggedTextInputAdapter,\n loose_object_input: LooseObjectInputAdapter,\n json_schema_input: JsonSchemaInputAdapter,\n json_extraction_input: JsonExtractionInputAdapter,\n pipes_run_if_input: PipesRunIfInputAdapter,\n condition_block_input: ConditionBlockInputAdapter,\n connector_input: ConnectorInputAdapter,\n providers_input: ProvidersInputAdapter,\n fields_select_input: FieldsSelectInputAdapter,\n typed_fields_select_input: TypedFieldsSelectInputAdapter,\n field_select_input: FieldSelectInputAdapter,\n output_field_input: OutputFieldInputAdapter,\n cursor_pagination_metadata: CursorPaginationInputAdapter,\n // Renders nothing by default — consumers (e.g. apps/dash) override this.\n search_payload_input: SearchPayloadInputAdapter,\n} satisfies Partial<FieldAdapterMap> as Partial<FieldAdapterMap>;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,MAAa,kBAAkB;CAC7B,YAAY;CACZ,gBAAgB;CAChB,WAAW;CACX,cAAc;CACd,cAAc;CACd,eAAe;CACf,wBAAwB;CACxB,aAAa;CACb,kBAAkB;CAClB,oBAAoB;CACpB,uBAAuB;CACvB,oBAAoB;CACpB,qBAAqB;CACrB,qBAAqB;CACrB,sBAAsB;CACtB,0BAA0B;CAC1B,oCAAoC;CACpC,8BAA8B;CAC9B,mBAAmB;CACnB,mBAAmB;CACnB,4BAA4B;CAC5B,mCAAmC;CACnC,cAAc;CACd,gBAAgB;CAChB,mBAAmB;CACnB,oBAAoB;CACpB,mBAAmB;CACnB,uBAAuB;CACvB,oBAAoB;CACpB,uBAAuB;CACvB,iBAAiB;CACjB,iBAAiB;CACjB,qBAAqB;CACrB,2BAA2B;CAC3B,oBAAoB;CACpB,oBAAoB;CACpB,4BAA4B;CAE5B,sBAAsB;CACvB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { SuggestCombobox } from "../../internal/combobox/suggest-combobox.mjs";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
|
|
4
|
+
//#region src/components/defaults/adapters/single-create-input.tsx
|
|
5
|
+
/**
|
|
6
|
+
* One free-text value with suggestions — the single-value sibling of
|
|
7
|
+
* `multi_create_input`.
|
|
8
|
+
*
|
|
9
|
+
* `allowCreate` is the whole point of using this rather than `select_input`:
|
|
10
|
+
* the suggestions are a shortcut for the common answers, not a constraint. A
|
|
11
|
+
* feed URL nobody has listed is exactly as valid as one we happened to know.
|
|
12
|
+
*
|
|
13
|
+
* `single` mode is already implemented by `SuggestCombobox` and used by the
|
|
14
|
+
* field and context pickers, so this adapter is a projection between a scalar
|
|
15
|
+
* value and the list the combobox speaks, and nothing more.
|
|
16
|
+
*/
|
|
17
|
+
function SingleCreateInputAdapter(field) {
|
|
18
|
+
const current = typeof field.value === "string" ? field.value : "";
|
|
19
|
+
return /* @__PURE__ */ jsx("div", {
|
|
20
|
+
"data-p0": "input",
|
|
21
|
+
children: /* @__PURE__ */ jsx(SuggestCombobox, {
|
|
22
|
+
single: true,
|
|
23
|
+
allowCreate: true,
|
|
24
|
+
value: current ? [current] : [],
|
|
25
|
+
onChange: (next) => field.setValue(next[next.length - 1] ?? ""),
|
|
26
|
+
options: field.options,
|
|
27
|
+
loadOptions: field.loadOptions,
|
|
28
|
+
disabled: field.disabled,
|
|
29
|
+
ariaInvalid: !!field.error,
|
|
30
|
+
placeholder: field.meta.placeholder
|
|
31
|
+
})
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
//#endregion
|
|
36
|
+
export { SingleCreateInputAdapter };
|
|
37
|
+
//# sourceMappingURL=single-create-input.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"single-create-input.mjs","names":[],"sources":["../../../../src/components/defaults/adapters/single-create-input.tsx"],"sourcesContent":["import type { FieldHandle } from \"../../../types/field-handle.js\";\nimport { SuggestCombobox } from \"../../internal/combobox/suggest-combobox.js\";\n\n/**\n * One free-text value with suggestions — the single-value sibling of\n * `multi_create_input`.\n *\n * `allowCreate` is the whole point of using this rather than `select_input`:\n * the suggestions are a shortcut for the common answers, not a constraint. A\n * feed URL nobody has listed is exactly as valid as one we happened to know.\n *\n * `single` mode is already implemented by `SuggestCombobox` and used by the\n * field and context pickers, so this adapter is a projection between a scalar\n * value and the list the combobox speaks, and nothing more.\n */\nexport function SingleCreateInputAdapter(field: FieldHandle<\"single_create_input\">) {\n const current = typeof field.value === \"string\" ? field.value : \"\";\n\n return (\n <div data-p0=\"input\">\n <SuggestCombobox\n single\n allowCreate\n value={current ? [current] : []}\n // The combobox hands back a list even in single mode; the LAST entry is\n // the new selection. Clearing yields an empty list, which has to become\n // an empty string rather than `undefined` — the schema is a string.\n onChange={(next) => field.setValue(next[next.length - 1] ?? \"\")}\n options={field.options}\n loadOptions={field.loadOptions}\n disabled={field.disabled}\n ariaInvalid={!!field.error}\n placeholder={field.meta.placeholder}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAeA,SAAgB,yBAAyB,OAA2C;CAClF,MAAM,UAAU,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAEhE,QACE,oBAAC,OAAD;EAAK,WAAQ;YACX,oBAAC,iBAAD;GACE;GACA;GACA,OAAO,UAAU,CAAC,QAAQ,GAAG,EAAE;GAI/B,WAAW,SAAS,MAAM,SAAS,KAAK,KAAK,SAAS,MAAM,GAAG;GAC/D,SAAS,MAAM;GACf,aAAa,MAAM;GACnB,UAAU,MAAM;GAChB,aAAa,CAAC,CAAC,MAAM;GACrB,aAAa,MAAM,KAAK;GACxB;EACE"}
|
|
@@ -142,7 +142,7 @@ function useFormCore(options) {
|
|
|
142
142
|
const getFieldContextResolver = resolvers?.getFieldContext;
|
|
143
143
|
const searchFieldContext = useCallback(async (fieldPath, query) => {
|
|
144
144
|
if (!getFieldContextResolver) return [];
|
|
145
|
-
const idKey = kind === "search" ? "search_id" : kind === "effect" ? "effect_id" : kind === "playbook" ? "playbook_id" : "pipe_id";
|
|
145
|
+
const idKey = kind === "search" ? "search_id" : kind === "effect" ? "effect_id" : kind === "playbook" ? "playbook_id" : kind === "stream" ? "stream_id" : "pipe_id";
|
|
146
146
|
return (await Promise.resolve(getFieldContextResolver({
|
|
147
147
|
fieldPath,
|
|
148
148
|
query,
|
|
@@ -216,7 +216,7 @@ function useFormCore(options) {
|
|
|
216
216
|
suggestionsDisabled: false,
|
|
217
217
|
suggestionsDisabledReason: void 0
|
|
218
218
|
};
|
|
219
|
-
const idKey = kind === "search" ? "search_id" : kind === "effect" ? "effect_id" : kind === "playbook" ? "playbook_id" : "pipe_id";
|
|
219
|
+
const idKey = kind === "search" ? "search_id" : kind === "effect" ? "effect_id" : kind === "playbook" ? "playbook_id" : kind === "stream" ? "stream_id" : "pipe_id";
|
|
220
220
|
Promise.resolve(resolvers.getFieldContext({
|
|
221
221
|
fieldPath: slot.fieldPath,
|
|
222
222
|
query: "",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-form-core.mjs","names":[],"sources":["../../src/hooks/use-form-core.ts"],"sourcesContent":["import { standardSchemaResolver } from \"@hookform/resolvers/standard-schema\";\nimport type {\n EnabledIf,\n EnabledResult,\n FormResolvers,\n FormSection,\n FormStore,\n GeneratedInputMeta,\n PipesEnvironment,\n ProviderName,\n StoreOption,\n} from \"@pipe0/base\";\nimport { joinConnectionString } from \"@pipe0/base\";\nimport {\n type Dispatch,\n type SetStateAction,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { type FieldValues, type UseFormReturn, useForm } from \"react-hook-form\";\nimport type { AnyFieldProps, ConstantSuggestion, SecretSuggestion } from \"../types/field-props.js\";\nimport type { FormSectionHandle } from \"../types/form-handle.js\";\nimport { buildSectionHandles } from \"../utils/build-section-handlers.js\";\nimport { mergeFormStores } from \"../utils/merge-form-stores.js\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport type ResourceStatus = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\nexport type SlotId = \"field\" | \"suggestions\";\n\nexport type FieldEnabledState = {\n disabled: boolean;\n reason?: string;\n};\n\nexport type FieldLoadState = {\n status: ResourceStatus;\n /** Field-level disabled (from `meta.enabledIf`). */\n disabled: boolean;\n /** Field-level disabled reason. */\n disabledReason?: string;\n /** Suggestions sub-feature gate (from `optionsDef.enabledIf`). */\n suggestionsDisabled: boolean;\n /** Suggestions sub-feature reason. */\n suggestionsDisabledReason?: string;\n};\n\nexport interface UseFormCoreOptions<T extends FieldValues> {\n pipeOrSearchId: string;\n kind: \"pipe\" | \"search\" | \"effect\" | \"playbook\";\n schema: any;\n publicKey: string;\n defaultValues?: T;\n formConfig: FormSection[];\n resolvers?: FormResolvers;\n store: FormStore;\n setStore: Dispatch<SetStateAction<FormStore>>;\n environment?: PipesEnvironment;\n /**\n * Form-level scope tags. Bundled into every `resolvers.getSecrets` call so\n * the backend can return only the secrets allowed in the declared scopes\n * (intersection on top of cascade visibility).\n */\n scopes?: string[];\n /**\n * Current team context. Bundled into every `resolvers.getSecrets` call so\n * the backend can restrict team-level secrets to exactly this team.\n */\n teamId?: string;\n}\n\nexport interface UseFormCoreReturn<T extends FieldValues> {\n connectionsStatus: ResourceStatus;\n /** Map of field path → load state for dynamic context_select_input fields. */\n fieldLoadStates: Record<string, FieldLoadState>;\n /** Subset of `fieldLoadStates` where `status === \"error\"`. RHF-style. */\n fieldLoaderErrors: Record<string, FieldLoadState>;\n /** Subset of `fieldLoadStates` where `status === \"loading\"`. RHF-style. */\n loadingFieldLoaders: Record<string, FieldLoadState>;\n /** True when any field loader has errored. */\n hasFieldLoaderError: boolean;\n /** True when any field loader is currently loading. */\n isFieldLoaderLoading: boolean;\n form: UseFormReturn<T, any, any>;\n sections: FormSectionHandle[];\n fields: AnyFieldProps[];\n reset: (values?: T) => void;\n}\n\ntype EnabledSlot = {\n fieldPath: string;\n slotId: SlotId;\n enabledIf: EnabledIf;\n /** Only present for \"suggestions\" slots — used to drive option fetching. */\n optionsDef?: {\n requires: { connection?: ProviderName; fields?: readonly string[] };\n };\n};\n\nfunction collectEnabledSlots(formConfig: FormSection[]): EnabledSlot[] {\n const out: EnabledSlot[] = [];\n for (const section of formConfig) {\n for (const group of section.groups) {\n for (const field of group.fields as GeneratedInputMeta[]) {\n if (field.enabledIf) {\n out.push({\n fieldPath: field.path,\n slotId: \"field\",\n enabledIf: field.enabledIf,\n });\n }\n // Keep in sync with `FIELD_CONTEXT_CAPABLE_TYPES` in @pipe0/base\n // (get-pipes-form-config.ts) and `resolveField` (form-inputs.ts).\n const supportsOptionsDef =\n field.type === \"context_select_input\" ||\n field.type === \"tagged_text_input\" ||\n field.type === \"condition_block_input\" ||\n field.type === \"field_select_input\" ||\n field.type === \"fields_select_input\" ||\n field.type === \"typed_fields_select_input\" ||\n field.type === \"property_list_input\";\n if (supportsOptionsDef && \"optionsDef\" in field && field.optionsDef) {\n const optionsDef = field.optionsDef as EnabledSlot[\"optionsDef\"] & {\n enabledIf?: EnabledIf;\n };\n if (optionsDef?.enabledIf) {\n out.push({\n fieldPath: field.path,\n slotId: \"suggestions\",\n enabledIf: optionsDef.enabledIf,\n optionsDef,\n });\n } else {\n // Even without a sub-feature enabledIf, we still need to track\n // this field as having a fetchable suggestions slot — it's\n // always enabled and the fetch fires on every value change.\n out.push({\n fieldPath: field.path,\n slotId: \"suggestions\",\n enabledIf: () => ({ disabled: false }),\n optionsDef,\n });\n }\n }\n }\n }\n }\n return out;\n}\n\nfunction getPathValue(obj: unknown, path: string): unknown {\n const parts = path.split(\".\");\n let cur: any = obj;\n for (const part of parts) {\n if (cur == null) return undefined;\n cur = cur[part];\n }\n return cur;\n}\n\nfunction evalSlot(slot: EnabledSlot, payload: unknown): EnabledResult {\n return slot.enabledIf(payload);\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useFormCore<T extends FieldValues>(\n options: UseFormCoreOptions<T>,\n): UseFormCoreReturn<T> {\n const {\n schema,\n publicKey,\n defaultValues,\n formConfig,\n resolvers,\n pipeOrSearchId,\n kind,\n setStore,\n environment = \"production\",\n scopes,\n teamId,\n } = options;\n\n // Stable signature for `scopes` so its identity doesn't churn the effect\n // dep across renders when callers pass a fresh array literal each time.\n const scopesKey = useMemo(() => (scopes ? JSON.stringify(scopes) : \"\"), [scopes]);\n\n // --- Per-resource status ---\n const [connectionsStatus, setConnectionsStatus] = useState<ResourceStatus>(\n resolvers?.getConnections ? \"loading\" : \"idle\",\n );\n const [fieldLoadStates, setFieldLoadStates] = useState<Record<string, FieldLoadState>>({});\n\n // --- Form ---\n const form = useForm<T>({\n resolver: standardSchemaResolver(schema),\n defaultValues: defaultValues as any,\n });\n\n // --- Helpers ---\n const mergeStore = useCallback(\n (incoming: FormStore) => setStore((old) => mergeFormStores(old, incoming)),\n [setStore],\n );\n\n // Latest-ref for formConfig: Effect 1 reads it for the connector prefill but\n // must not depend on it (formConfig rebuilds on every store merge, which\n // would re-fire the connections fetch in a loop).\n const formConfigRef = useRef(formConfig);\n formConfigRef.current = formConfig;\n\n // --- Effect 1: Load connections ---\n useEffect(() => {\n if (!resolvers?.getConnections) {\n setConnectionsStatus(\"idle\");\n return;\n }\n\n let cancelled = false;\n setConnectionsStatus(\"loading\");\n\n Promise.resolve(resolvers.getConnections({ id: pipeOrSearchId, environment }))\n .then((conns) => {\n if (cancelled) return;\n\n mergeStore({\n field_options: {\n connections: {\n options: conns.map((c) => ({\n label: c.public_id,\n value: c.public_id,\n widgets: {\n provider_logo: { provider: c.provider as ProviderName },\n },\n // StoreOption's opaque string channel: the form-config layer\n // rebuilds userConnections from these options, and anything\n // not carried here is lost before it reaches connector meta.\n data: {\n is_default: String(c.is_default ?? false),\n ownership_level: c.ownership_level ?? \"\",\n },\n })),\n },\n },\n });\n\n // Prefill default connections into an EMPTY required connector. A\n // stored payload with a required connector always carries >=1\n // connection (min-1 validation), so an empty required connector\n // implies a fresh create form — prefilling never overwrites a\n // user's or stored choice. Runs once per connections load, so a\n // user clearing the field afterwards is not fought.\n const connectorField = formConfigRef.current\n .flatMap((section) => section.groups.flatMap((group) => group.fields))\n .map((field) => field as GeneratedInputMeta)\n .find((field) => field.type === \"connector_input\");\n if (\n connectorField?.type === \"connector_input\" &&\n connectorField.connectorMode === \"required\"\n ) {\n const current = form.getValues(connectorField.path as any) as\n | { connections?: { connection: string }[] }\n | null\n | undefined;\n const isEmpty = current == null || (current.connections?.length ?? 0) === 0;\n const defaults = conns.filter((c) => c.is_default);\n if (isEmpty && defaults.length > 0) {\n form.setValue(\n connectorField.path as any,\n {\n strategy: \"first\",\n connections: defaults.map((c) => ({\n type: \"vault\",\n connection: joinConnectionString({ provider: c.provider, id: c.public_id }),\n })),\n } as any,\n // Not dirtying: a freshly opened form with a prefilled default\n // should still count as pristine.\n { shouldDirty: false, shouldValidate: false },\n );\n }\n }\n\n setConnectionsStatus(\"ready\");\n })\n .catch(() => {\n if (!cancelled) setConnectionsStatus(\"error\");\n });\n\n return () => {\n cancelled = true;\n };\n }, [pipeOrSearchId, environment, resolvers?.getConnections, mergeStore]);\n\n // --- Curried secrets search ---\n // Each keystroke in the reference picker fires this with the latest query.\n // The picker handles debounce + race-correctness; here we just bundle in\n // form-level args (environment / scopes / teamId) and call the resolver.\n // No caching: every call hits the resolver. Returns [] if no resolver.\n const getSecretsResolver = resolvers?.getSecrets;\n const searchSecrets = useCallback(\n async (query: string): Promise<SecretSuggestion[]> => {\n if (!getSecretsResolver) return [];\n return Promise.resolve(getSecretsResolver({ query, environment, scopes, teamId }));\n },\n // `scopesKey` is the stable serialization of `scopes`; depending on the\n // raw array would churn the callback identity on every parent render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [getSecretsResolver, environment, scopesKey, teamId],\n );\n\n // --- Curried constants search ---\n // Mirrors `searchSecrets` exactly. Same per-keystroke contract, same\n // form-level arg bundling. Returns [] when no resolver is wired.\n const getConstantsResolver = resolvers?.getConstants;\n const searchConstants = useCallback(\n async (query: string): Promise<ConstantSuggestion[]> => {\n if (!getConstantsResolver) return [];\n return Promise.resolve(getConstantsResolver({ query, environment, scopes, teamId }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [getConstantsResolver, environment, scopesKey, teamId],\n );\n\n // --- Curried field-context search ---\n // Per-keystroke server-side option search for context selects. Mirrors\n // `searchSecrets`: bundles the LIVE payload (`form.getValues()`, never a\n // stale watched snapshot) plus the pipe/search id, and returns ONE field's\n // options directly — never merged into the shared store, since a keystroke\n // must not mutate global state.\n const getFieldContextResolver = resolvers?.getFieldContext;\n const searchFieldContext = useCallback(\n async (fieldPath: string, query: string): Promise<StoreOption[]> => {\n if (!getFieldContextResolver) return [];\n const idKey =\n kind === \"search\"\n ? \"search_id\"\n : kind === \"effect\"\n ? \"effect_id\"\n : kind === \"playbook\"\n ? \"playbook_id\"\n : \"pipe_id\";\n const incoming = await Promise.resolve(\n getFieldContextResolver({\n fieldPath,\n query,\n payload: {\n ...(form.getValues() as Record<string, unknown>),\n [idKey]: pipeOrSearchId,\n },\n }),\n );\n return incoming?.field_options?.[fieldPath]?.options ?? [];\n },\n [getFieldContextResolver, kind, pipeOrSearchId, form],\n );\n\n // --- Effect 2: Evaluate enabledIf slots + drive context_select fetching ---\n const slots = useMemo(() => collectEnabledSlots(formConfig), [formConfig]);\n\n // Subscribe to all form value changes so resolvers re-evaluate.\n const watchedValues = form.watch();\n\n // Evaluate every slot against the current payload. Keep the result\n // serialized so the effect's deps stay stable across reference-identical\n // re-renders.\n const slotResults = useMemo(() => {\n const out: Record<string, EnabledResult> = {};\n for (const slot of slots) {\n out[`${slot.fieldPath}::${slot.slotId}`] = evalSlot(slot, watchedValues);\n }\n return out;\n }, [slots, watchedValues]);\n const slotResultsSig = useMemo(() => JSON.stringify(slotResults), [slotResults]);\n\n // Track previous results so we can detect enabled→disabled transitions\n // (drives field-value clearing) and last-fired fetch signatures.\n const prevResultsRef = useRef<Record<string, EnabledResult>>({});\n const lastFiredSigRef = useRef<Record<string, string>>({});\n\n useEffect(() => {\n if (slots.length === 0) return;\n\n const nextLoadStates: Record<string, FieldLoadState> = {\n ...fieldLoadStates,\n };\n\n // Group slot results by field path for the load-state map.\n const byField: Record<string, { field?: EnabledResult; suggestions?: EnabledResult }> = {};\n for (const slot of slots) {\n const r = slotResults[`${slot.fieldPath}::${slot.slotId}`];\n if (r == null) continue;\n byField[slot.fieldPath] ??= {};\n byField[slot.fieldPath][slot.slotId] = r;\n }\n\n for (const slot of slots) {\n const key = `${slot.fieldPath}::${slot.slotId}`;\n const r = slotResults[key];\n if (r == null) continue;\n const prev = prevResultsRef.current[key];\n\n // Field-slot only: on enabled→disabled, reset the value to the field's\n // configured default (from the seeded defaultValues) rather than `\"\"`.\n // `\"\"` is invalid for non-string fields — e.g. a gated boolean fails\n // `z.boolean()` and a nullable int's `null` default would coerce to `0`.\n // Fall back to `\"\"` only when there's NO default at the path, so explicit\n // `null`/`false` defaults survive (this resets an optional int back to\n // empty when its gate turns off).\n if (slot.slotId === \"field\" && r.disabled && prev != null && !prev.disabled) {\n const def = getPathValue(defaultValues, slot.fieldPath);\n form.setValue(slot.fieldPath as any, (def === undefined ? \"\" : def) as any, {\n shouldDirty: true,\n shouldTouch: true,\n });\n }\n\n // Suggestions-slot: drive the existing context_select_input fetch.\n if (slot.slotId === \"suggestions\" && resolvers?.getFieldContext) {\n // If suggestions are gated, skip the fetch and reset dedupe so\n // re-enabling re-fires.\n if (r.disabled) {\n delete lastFiredSigRef.current[slot.fieldPath];\n continue;\n }\n\n // Resolve the connection for the legacy `requires.connection`\n // (still needed to pick the right secret for the fetch).\n const watchedConnections = (\n watchedValues as {\n connector?: { connections?: { connection?: string }[] };\n }\n )?.connector?.connections;\n const required = slot.optionsDef?.requires;\n\n let connectionId: string | undefined;\n if (required?.connection) {\n const match = watchedConnections?.find((c) =>\n c?.connection?.startsWith(`${required.connection}_`),\n );\n connectionId = match?.connection;\n // No matching connection — can't fetch, even if enabledIf passed.\n if (!connectionId) continue;\n }\n\n // Per-field signature for dedupe. It also scopes the handlers below:\n // a settled fetch only applies while it is still the LAST one fired\n // for its field. Effect re-runs (slots identity churn, sig changes)\n // must NOT invalidate an in-flight fetch — the dedupe ref survives\n // re-runs, so a lifetime-cancelled fetch would never be refired and\n // the field would spin forever.\n const perFieldSig = JSON.stringify({\n connectionId,\n deps: required?.fields?.map((d) => getPathValue(watchedValues, d)) ?? [],\n });\n if (lastFiredSigRef.current[slot.fieldPath] === perFieldSig) continue;\n lastFiredSigRef.current[slot.fieldPath] = perFieldSig;\n const isCurrent = () => lastFiredSigRef.current[slot.fieldPath] === perFieldSig;\n\n // Mark loading for this field's fetch.\n const existing = nextLoadStates[slot.fieldPath];\n nextLoadStates[slot.fieldPath] = {\n status: \"loading\",\n disabled: existing?.disabled ?? false,\n disabledReason: existing?.disabledReason,\n suggestionsDisabled: false,\n suggestionsDisabledReason: undefined,\n };\n\n const idKey =\n kind === \"search\"\n ? \"search_id\"\n : kind === \"effect\"\n ? \"effect_id\"\n : kind === \"playbook\"\n ? \"playbook_id\"\n : \"pipe_id\";\n\n Promise.resolve(\n resolvers.getFieldContext({\n fieldPath: slot.fieldPath,\n query: \"\",\n payload: {\n ...(watchedValues as Record<string, unknown>),\n [idKey]: pipeOrSearchId,\n },\n }),\n )\n .then((incoming: FormStore | undefined) => {\n if (!isCurrent()) return;\n // A resolver may resolve with `undefined` on transport errors\n // (openapi-fetch RESOLVES with `{ error }` instead of rejecting).\n // Merging undefined would throw inside the setStore updater — i.e.\n // during render, past this chain's .catch — so route it there.\n if (!incoming?.field_options) {\n throw new Error(\"Empty field-context response\");\n }\n mergeStore(incoming);\n setFieldLoadStates((s) => ({\n ...s,\n [slot.fieldPath]: {\n ...(s[slot.fieldPath] ?? {\n disabled: false,\n suggestionsDisabled: false,\n }),\n status: \"ready\",\n },\n }));\n })\n .catch(() => {\n if (!isCurrent()) return;\n setFieldLoadStates((s) => ({\n ...s,\n [slot.fieldPath]: {\n ...(s[slot.fieldPath] ?? {\n disabled: false,\n suggestionsDisabled: false,\n }),\n status: \"error\",\n },\n }));\n });\n }\n }\n\n // Reflect the latest enabledIf evaluation into fieldLoadStates so the\n // adapters and field-wrapper can render the disabled state.\n for (const fieldPath of Object.keys(byField)) {\n const { field: fieldR, suggestions: sugR } = byField[fieldPath]!;\n const prevState = nextLoadStates[fieldPath];\n nextLoadStates[fieldPath] = {\n status: prevState?.status ?? \"idle\",\n disabled: fieldR == null ? (prevState?.disabled ?? false) : fieldR.disabled,\n disabledReason: fieldR == null ? prevState?.disabledReason : fieldR.message,\n suggestionsDisabled:\n sugR == null ? (prevState?.suggestionsDisabled ?? false) : sugR.disabled,\n suggestionsDisabledReason:\n sugR == null ? prevState?.suggestionsDisabledReason : sugR.message,\n };\n }\n\n setFieldLoadStates(nextLoadStates);\n prevResultsRef.current = slotResults;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [slotResultsSig, slots, pipeOrSearchId]);\n\n // --- Sections & fields ---\n const isSubmitted = form.formState.isSubmitted;\n const formErrors = form.formState.errors;\n\n // `watchedValues` and `formErrors` must be in the dep array: field handles\n // bake `form.getValues(path)` snapshots into `field.value` / textareaProps /\n // selectedValue, and adapters render those as controlled inputs. Without\n // these deps, the memo never refreshes on keystrokes and the controlled\n // inputs snap back to their stale snapshot — typing/selecting appears to\n // do nothing. See FieldRenderer's memo comment for the intended contract.\n const sections = useMemo(\n () =>\n buildSectionHandles(formConfig, form as any, publicKey, {\n fieldLoadStates,\n searchSecrets,\n searchConstants,\n searchFieldContext,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n formConfig,\n form,\n publicKey,\n fieldLoadStates,\n isSubmitted,\n searchSecrets,\n searchConstants,\n searchFieldContext,\n watchedValues,\n formErrors,\n ],\n );\n\n const fields = useMemo(\n () => sections.flatMap((s) => s.groups.flatMap((g) => g.fields)),\n [sections],\n );\n\n const { fieldLoaderErrors, loadingFieldLoaders, hasFieldLoaderError, isFieldLoaderLoading } =\n useMemo(() => {\n const errors: Record<string, FieldLoadState> = {};\n const loading: Record<string, FieldLoadState> = {};\n for (const [path, state] of Object.entries(fieldLoadStates)) {\n if (state.status === \"error\") errors[path] = state;\n else if (state.status === \"loading\") loading[path] = state;\n }\n return {\n fieldLoaderErrors: errors,\n loadingFieldLoaders: loading,\n hasFieldLoaderError: Object.keys(errors).length > 0,\n isFieldLoaderLoading: Object.keys(loading).length > 0,\n };\n }, [fieldLoadStates]);\n\n return {\n connectionsStatus,\n fieldLoadStates,\n fieldLoaderErrors,\n loadingFieldLoaders,\n hasFieldLoaderError,\n isFieldLoaderLoading,\n form,\n sections,\n fields,\n reset: form.reset,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-form-core.mjs","names":[],"sources":["../../src/hooks/use-form-core.ts"],"sourcesContent":["import { standardSchemaResolver } from \"@hookform/resolvers/standard-schema\";\nimport type {\n EnabledIf,\n EnabledResult,\n FormResolvers,\n FormSection,\n FormStore,\n GeneratedInputMeta,\n PipesEnvironment,\n ProviderName,\n StoreOption,\n} from \"@pipe0/base\";\nimport { joinConnectionString } from \"@pipe0/base\";\nimport {\n type Dispatch,\n type SetStateAction,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { type FieldValues, type UseFormReturn, useForm } from \"react-hook-form\";\nimport type { AnyFieldProps, ConstantSuggestion, SecretSuggestion } from \"../types/field-props.js\";\nimport type { FormSectionHandle } from \"../types/form-handle.js\";\nimport { buildSectionHandles } from \"../utils/build-section-handlers.js\";\nimport { mergeFormStores } from \"../utils/merge-form-stores.js\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport type ResourceStatus = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\nexport type SlotId = \"field\" | \"suggestions\";\n\nexport type FieldEnabledState = {\n disabled: boolean;\n reason?: string;\n};\n\nexport type FieldLoadState = {\n status: ResourceStatus;\n /** Field-level disabled (from `meta.enabledIf`). */\n disabled: boolean;\n /** Field-level disabled reason. */\n disabledReason?: string;\n /** Suggestions sub-feature gate (from `optionsDef.enabledIf`). */\n suggestionsDisabled: boolean;\n /** Suggestions sub-feature reason. */\n suggestionsDisabledReason?: string;\n};\n\nexport interface UseFormCoreOptions<T extends FieldValues> {\n pipeOrSearchId: string;\n kind: \"pipe\" | \"search\" | \"effect\" | \"playbook\" | \"stream\";\n schema: any;\n publicKey: string;\n defaultValues?: T;\n formConfig: FormSection[];\n resolvers?: FormResolvers;\n store: FormStore;\n setStore: Dispatch<SetStateAction<FormStore>>;\n environment?: PipesEnvironment;\n /**\n * Form-level scope tags. Bundled into every `resolvers.getSecrets` call so\n * the backend can return only the secrets allowed in the declared scopes\n * (intersection on top of cascade visibility).\n */\n scopes?: string[];\n /**\n * Current team context. Bundled into every `resolvers.getSecrets` call so\n * the backend can restrict team-level secrets to exactly this team.\n */\n teamId?: string;\n}\n\nexport interface UseFormCoreReturn<T extends FieldValues> {\n connectionsStatus: ResourceStatus;\n /** Map of field path → load state for dynamic context_select_input fields. */\n fieldLoadStates: Record<string, FieldLoadState>;\n /** Subset of `fieldLoadStates` where `status === \"error\"`. RHF-style. */\n fieldLoaderErrors: Record<string, FieldLoadState>;\n /** Subset of `fieldLoadStates` where `status === \"loading\"`. RHF-style. */\n loadingFieldLoaders: Record<string, FieldLoadState>;\n /** True when any field loader has errored. */\n hasFieldLoaderError: boolean;\n /** True when any field loader is currently loading. */\n isFieldLoaderLoading: boolean;\n form: UseFormReturn<T, any, any>;\n sections: FormSectionHandle[];\n fields: AnyFieldProps[];\n reset: (values?: T) => void;\n}\n\ntype EnabledSlot = {\n fieldPath: string;\n slotId: SlotId;\n enabledIf: EnabledIf;\n /** Only present for \"suggestions\" slots — used to drive option fetching. */\n optionsDef?: {\n requires: { connection?: ProviderName; fields?: readonly string[] };\n };\n};\n\nfunction collectEnabledSlots(formConfig: FormSection[]): EnabledSlot[] {\n const out: EnabledSlot[] = [];\n for (const section of formConfig) {\n for (const group of section.groups) {\n for (const field of group.fields as GeneratedInputMeta[]) {\n if (field.enabledIf) {\n out.push({\n fieldPath: field.path,\n slotId: \"field\",\n enabledIf: field.enabledIf,\n });\n }\n // Keep in sync with `FIELD_CONTEXT_CAPABLE_TYPES` in @pipe0/base\n // (get-pipes-form-config.ts) and `resolveField` (form-inputs.ts).\n const supportsOptionsDef =\n field.type === \"context_select_input\" ||\n field.type === \"tagged_text_input\" ||\n field.type === \"condition_block_input\" ||\n field.type === \"field_select_input\" ||\n field.type === \"fields_select_input\" ||\n field.type === \"typed_fields_select_input\" ||\n field.type === \"property_list_input\";\n if (supportsOptionsDef && \"optionsDef\" in field && field.optionsDef) {\n const optionsDef = field.optionsDef as EnabledSlot[\"optionsDef\"] & {\n enabledIf?: EnabledIf;\n };\n if (optionsDef?.enabledIf) {\n out.push({\n fieldPath: field.path,\n slotId: \"suggestions\",\n enabledIf: optionsDef.enabledIf,\n optionsDef,\n });\n } else {\n // Even without a sub-feature enabledIf, we still need to track\n // this field as having a fetchable suggestions slot — it's\n // always enabled and the fetch fires on every value change.\n out.push({\n fieldPath: field.path,\n slotId: \"suggestions\",\n enabledIf: () => ({ disabled: false }),\n optionsDef,\n });\n }\n }\n }\n }\n }\n return out;\n}\n\nfunction getPathValue(obj: unknown, path: string): unknown {\n const parts = path.split(\".\");\n let cur: any = obj;\n for (const part of parts) {\n if (cur == null) return undefined;\n cur = cur[part];\n }\n return cur;\n}\n\nfunction evalSlot(slot: EnabledSlot, payload: unknown): EnabledResult {\n return slot.enabledIf(payload);\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useFormCore<T extends FieldValues>(\n options: UseFormCoreOptions<T>,\n): UseFormCoreReturn<T> {\n const {\n schema,\n publicKey,\n defaultValues,\n formConfig,\n resolvers,\n pipeOrSearchId,\n kind,\n setStore,\n environment = \"production\",\n scopes,\n teamId,\n } = options;\n\n // Stable signature for `scopes` so its identity doesn't churn the effect\n // dep across renders when callers pass a fresh array literal each time.\n const scopesKey = useMemo(() => (scopes ? JSON.stringify(scopes) : \"\"), [scopes]);\n\n // --- Per-resource status ---\n const [connectionsStatus, setConnectionsStatus] = useState<ResourceStatus>(\n resolvers?.getConnections ? \"loading\" : \"idle\",\n );\n const [fieldLoadStates, setFieldLoadStates] = useState<Record<string, FieldLoadState>>({});\n\n // --- Form ---\n const form = useForm<T>({\n resolver: standardSchemaResolver(schema),\n defaultValues: defaultValues as any,\n });\n\n // --- Helpers ---\n const mergeStore = useCallback(\n (incoming: FormStore) => setStore((old) => mergeFormStores(old, incoming)),\n [setStore],\n );\n\n // Latest-ref for formConfig: Effect 1 reads it for the connector prefill but\n // must not depend on it (formConfig rebuilds on every store merge, which\n // would re-fire the connections fetch in a loop).\n const formConfigRef = useRef(formConfig);\n formConfigRef.current = formConfig;\n\n // --- Effect 1: Load connections ---\n useEffect(() => {\n if (!resolvers?.getConnections) {\n setConnectionsStatus(\"idle\");\n return;\n }\n\n let cancelled = false;\n setConnectionsStatus(\"loading\");\n\n Promise.resolve(resolvers.getConnections({ id: pipeOrSearchId, environment }))\n .then((conns) => {\n if (cancelled) return;\n\n mergeStore({\n field_options: {\n connections: {\n options: conns.map((c) => ({\n label: c.public_id,\n value: c.public_id,\n widgets: {\n provider_logo: { provider: c.provider as ProviderName },\n },\n // StoreOption's opaque string channel: the form-config layer\n // rebuilds userConnections from these options, and anything\n // not carried here is lost before it reaches connector meta.\n data: {\n is_default: String(c.is_default ?? false),\n ownership_level: c.ownership_level ?? \"\",\n },\n })),\n },\n },\n });\n\n // Prefill default connections into an EMPTY required connector. A\n // stored payload with a required connector always carries >=1\n // connection (min-1 validation), so an empty required connector\n // implies a fresh create form — prefilling never overwrites a\n // user's or stored choice. Runs once per connections load, so a\n // user clearing the field afterwards is not fought.\n const connectorField = formConfigRef.current\n .flatMap((section) => section.groups.flatMap((group) => group.fields))\n .map((field) => field as GeneratedInputMeta)\n .find((field) => field.type === \"connector_input\");\n if (\n connectorField?.type === \"connector_input\" &&\n connectorField.connectorMode === \"required\"\n ) {\n const current = form.getValues(connectorField.path as any) as\n | { connections?: { connection: string }[] }\n | null\n | undefined;\n const isEmpty = current == null || (current.connections?.length ?? 0) === 0;\n const defaults = conns.filter((c) => c.is_default);\n if (isEmpty && defaults.length > 0) {\n form.setValue(\n connectorField.path as any,\n {\n strategy: \"first\",\n connections: defaults.map((c) => ({\n type: \"vault\",\n connection: joinConnectionString({ provider: c.provider, id: c.public_id }),\n })),\n } as any,\n // Not dirtying: a freshly opened form with a prefilled default\n // should still count as pristine.\n { shouldDirty: false, shouldValidate: false },\n );\n }\n }\n\n setConnectionsStatus(\"ready\");\n })\n .catch(() => {\n if (!cancelled) setConnectionsStatus(\"error\");\n });\n\n return () => {\n cancelled = true;\n };\n }, [pipeOrSearchId, environment, resolvers?.getConnections, mergeStore]);\n\n // --- Curried secrets search ---\n // Each keystroke in the reference picker fires this with the latest query.\n // The picker handles debounce + race-correctness; here we just bundle in\n // form-level args (environment / scopes / teamId) and call the resolver.\n // No caching: every call hits the resolver. Returns [] if no resolver.\n const getSecretsResolver = resolvers?.getSecrets;\n const searchSecrets = useCallback(\n async (query: string): Promise<SecretSuggestion[]> => {\n if (!getSecretsResolver) return [];\n return Promise.resolve(getSecretsResolver({ query, environment, scopes, teamId }));\n },\n // `scopesKey` is the stable serialization of `scopes`; depending on the\n // raw array would churn the callback identity on every parent render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [getSecretsResolver, environment, scopesKey, teamId],\n );\n\n // --- Curried constants search ---\n // Mirrors `searchSecrets` exactly. Same per-keystroke contract, same\n // form-level arg bundling. Returns [] when no resolver is wired.\n const getConstantsResolver = resolvers?.getConstants;\n const searchConstants = useCallback(\n async (query: string): Promise<ConstantSuggestion[]> => {\n if (!getConstantsResolver) return [];\n return Promise.resolve(getConstantsResolver({ query, environment, scopes, teamId }));\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [getConstantsResolver, environment, scopesKey, teamId],\n );\n\n // --- Curried field-context search ---\n // Per-keystroke server-side option search for context selects. Mirrors\n // `searchSecrets`: bundles the LIVE payload (`form.getValues()`, never a\n // stale watched snapshot) plus the pipe/search id, and returns ONE field's\n // options directly — never merged into the shared store, since a keystroke\n // must not mutate global state.\n const getFieldContextResolver = resolvers?.getFieldContext;\n const searchFieldContext = useCallback(\n async (fieldPath: string, query: string): Promise<StoreOption[]> => {\n if (!getFieldContextResolver) return [];\n const idKey =\n kind === \"search\"\n ? \"search_id\"\n : kind === \"effect\"\n ? \"effect_id\"\n : kind === \"playbook\"\n ? \"playbook_id\"\n : kind === \"stream\"\n ? \"stream_id\"\n : \"pipe_id\";\n const incoming = await Promise.resolve(\n getFieldContextResolver({\n fieldPath,\n query,\n payload: {\n ...(form.getValues() as Record<string, unknown>),\n [idKey]: pipeOrSearchId,\n },\n }),\n );\n return incoming?.field_options?.[fieldPath]?.options ?? [];\n },\n [getFieldContextResolver, kind, pipeOrSearchId, form],\n );\n\n // --- Effect 2: Evaluate enabledIf slots + drive context_select fetching ---\n const slots = useMemo(() => collectEnabledSlots(formConfig), [formConfig]);\n\n // Subscribe to all form value changes so resolvers re-evaluate.\n const watchedValues = form.watch();\n\n // Evaluate every slot against the current payload. Keep the result\n // serialized so the effect's deps stay stable across reference-identical\n // re-renders.\n const slotResults = useMemo(() => {\n const out: Record<string, EnabledResult> = {};\n for (const slot of slots) {\n out[`${slot.fieldPath}::${slot.slotId}`] = evalSlot(slot, watchedValues);\n }\n return out;\n }, [slots, watchedValues]);\n const slotResultsSig = useMemo(() => JSON.stringify(slotResults), [slotResults]);\n\n // Track previous results so we can detect enabled→disabled transitions\n // (drives field-value clearing) and last-fired fetch signatures.\n const prevResultsRef = useRef<Record<string, EnabledResult>>({});\n const lastFiredSigRef = useRef<Record<string, string>>({});\n\n useEffect(() => {\n if (slots.length === 0) return;\n\n const nextLoadStates: Record<string, FieldLoadState> = {\n ...fieldLoadStates,\n };\n\n // Group slot results by field path for the load-state map.\n const byField: Record<string, { field?: EnabledResult; suggestions?: EnabledResult }> = {};\n for (const slot of slots) {\n const r = slotResults[`${slot.fieldPath}::${slot.slotId}`];\n if (r == null) continue;\n byField[slot.fieldPath] ??= {};\n byField[slot.fieldPath][slot.slotId] = r;\n }\n\n for (const slot of slots) {\n const key = `${slot.fieldPath}::${slot.slotId}`;\n const r = slotResults[key];\n if (r == null) continue;\n const prev = prevResultsRef.current[key];\n\n // Field-slot only: on enabled→disabled, reset the value to the field's\n // configured default (from the seeded defaultValues) rather than `\"\"`.\n // `\"\"` is invalid for non-string fields — e.g. a gated boolean fails\n // `z.boolean()` and a nullable int's `null` default would coerce to `0`.\n // Fall back to `\"\"` only when there's NO default at the path, so explicit\n // `null`/`false` defaults survive (this resets an optional int back to\n // empty when its gate turns off).\n if (slot.slotId === \"field\" && r.disabled && prev != null && !prev.disabled) {\n const def = getPathValue(defaultValues, slot.fieldPath);\n form.setValue(slot.fieldPath as any, (def === undefined ? \"\" : def) as any, {\n shouldDirty: true,\n shouldTouch: true,\n });\n }\n\n // Suggestions-slot: drive the existing context_select_input fetch.\n if (slot.slotId === \"suggestions\" && resolvers?.getFieldContext) {\n // If suggestions are gated, skip the fetch and reset dedupe so\n // re-enabling re-fires.\n if (r.disabled) {\n delete lastFiredSigRef.current[slot.fieldPath];\n continue;\n }\n\n // Resolve the connection for the legacy `requires.connection`\n // (still needed to pick the right secret for the fetch).\n const watchedConnections = (\n watchedValues as {\n connector?: { connections?: { connection?: string }[] };\n }\n )?.connector?.connections;\n const required = slot.optionsDef?.requires;\n\n let connectionId: string | undefined;\n if (required?.connection) {\n const match = watchedConnections?.find((c) =>\n c?.connection?.startsWith(`${required.connection}_`),\n );\n connectionId = match?.connection;\n // No matching connection — can't fetch, even if enabledIf passed.\n if (!connectionId) continue;\n }\n\n // Per-field signature for dedupe. It also scopes the handlers below:\n // a settled fetch only applies while it is still the LAST one fired\n // for its field. Effect re-runs (slots identity churn, sig changes)\n // must NOT invalidate an in-flight fetch — the dedupe ref survives\n // re-runs, so a lifetime-cancelled fetch would never be refired and\n // the field would spin forever.\n const perFieldSig = JSON.stringify({\n connectionId,\n deps: required?.fields?.map((d) => getPathValue(watchedValues, d)) ?? [],\n });\n if (lastFiredSigRef.current[slot.fieldPath] === perFieldSig) continue;\n lastFiredSigRef.current[slot.fieldPath] = perFieldSig;\n const isCurrent = () => lastFiredSigRef.current[slot.fieldPath] === perFieldSig;\n\n // Mark loading for this field's fetch.\n const existing = nextLoadStates[slot.fieldPath];\n nextLoadStates[slot.fieldPath] = {\n status: \"loading\",\n disabled: existing?.disabled ?? false,\n disabledReason: existing?.disabledReason,\n suggestionsDisabled: false,\n suggestionsDisabledReason: undefined,\n };\n\n const idKey =\n kind === \"search\"\n ? \"search_id\"\n : kind === \"effect\"\n ? \"effect_id\"\n : kind === \"playbook\"\n ? \"playbook_id\"\n : kind === \"stream\"\n ? \"stream_id\"\n : \"pipe_id\";\n\n Promise.resolve(\n resolvers.getFieldContext({\n fieldPath: slot.fieldPath,\n query: \"\",\n payload: {\n ...(watchedValues as Record<string, unknown>),\n [idKey]: pipeOrSearchId,\n },\n }),\n )\n .then((incoming: FormStore | undefined) => {\n if (!isCurrent()) return;\n // A resolver may resolve with `undefined` on transport errors\n // (openapi-fetch RESOLVES with `{ error }` instead of rejecting).\n // Merging undefined would throw inside the setStore updater — i.e.\n // during render, past this chain's .catch — so route it there.\n if (!incoming?.field_options) {\n throw new Error(\"Empty field-context response\");\n }\n mergeStore(incoming);\n setFieldLoadStates((s) => ({\n ...s,\n [slot.fieldPath]: {\n ...(s[slot.fieldPath] ?? {\n disabled: false,\n suggestionsDisabled: false,\n }),\n status: \"ready\",\n },\n }));\n })\n .catch(() => {\n if (!isCurrent()) return;\n setFieldLoadStates((s) => ({\n ...s,\n [slot.fieldPath]: {\n ...(s[slot.fieldPath] ?? {\n disabled: false,\n suggestionsDisabled: false,\n }),\n status: \"error\",\n },\n }));\n });\n }\n }\n\n // Reflect the latest enabledIf evaluation into fieldLoadStates so the\n // adapters and field-wrapper can render the disabled state.\n for (const fieldPath of Object.keys(byField)) {\n const { field: fieldR, suggestions: sugR } = byField[fieldPath]!;\n const prevState = nextLoadStates[fieldPath];\n nextLoadStates[fieldPath] = {\n status: prevState?.status ?? \"idle\",\n disabled: fieldR == null ? (prevState?.disabled ?? false) : fieldR.disabled,\n disabledReason: fieldR == null ? prevState?.disabledReason : fieldR.message,\n suggestionsDisabled:\n sugR == null ? (prevState?.suggestionsDisabled ?? false) : sugR.disabled,\n suggestionsDisabledReason:\n sugR == null ? prevState?.suggestionsDisabledReason : sugR.message,\n };\n }\n\n setFieldLoadStates(nextLoadStates);\n prevResultsRef.current = slotResults;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [slotResultsSig, slots, pipeOrSearchId]);\n\n // --- Sections & fields ---\n const isSubmitted = form.formState.isSubmitted;\n const formErrors = form.formState.errors;\n\n // `watchedValues` and `formErrors` must be in the dep array: field handles\n // bake `form.getValues(path)` snapshots into `field.value` / textareaProps /\n // selectedValue, and adapters render those as controlled inputs. Without\n // these deps, the memo never refreshes on keystrokes and the controlled\n // inputs snap back to their stale snapshot — typing/selecting appears to\n // do nothing. See FieldRenderer's memo comment for the intended contract.\n const sections = useMemo(\n () =>\n buildSectionHandles(formConfig, form as any, publicKey, {\n fieldLoadStates,\n searchSecrets,\n searchConstants,\n searchFieldContext,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n formConfig,\n form,\n publicKey,\n fieldLoadStates,\n isSubmitted,\n searchSecrets,\n searchConstants,\n searchFieldContext,\n watchedValues,\n formErrors,\n ],\n );\n\n const fields = useMemo(\n () => sections.flatMap((s) => s.groups.flatMap((g) => g.fields)),\n [sections],\n );\n\n const { fieldLoaderErrors, loadingFieldLoaders, hasFieldLoaderError, isFieldLoaderLoading } =\n useMemo(() => {\n const errors: Record<string, FieldLoadState> = {};\n const loading: Record<string, FieldLoadState> = {};\n for (const [path, state] of Object.entries(fieldLoadStates)) {\n if (state.status === \"error\") errors[path] = state;\n else if (state.status === \"loading\") loading[path] = state;\n }\n return {\n fieldLoaderErrors: errors,\n loadingFieldLoaders: loading,\n hasFieldLoaderError: Object.keys(errors).length > 0,\n isFieldLoaderLoading: Object.keys(loading).length > 0,\n };\n }, [fieldLoadStates]);\n\n return {\n connectionsStatus,\n fieldLoadStates,\n fieldLoaderErrors,\n loadingFieldLoaders,\n hasFieldLoaderError,\n isFieldLoaderLoading,\n form,\n sections,\n fields,\n reset: form.reset,\n };\n}\n"],"mappings":"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"}
|
|
@@ -38,14 +38,14 @@ declare function usePipeCatalogTable(config?: {
|
|
|
38
38
|
removeColumnFilter: (id: "inputFields" | "outputFields" | "tags" | "providers") => void;
|
|
39
39
|
resetFilters: () => void;
|
|
40
40
|
getColumnFilterValue: (id: "inputFields" | "outputFields" | "tags" | "providers") => string;
|
|
41
|
-
sortedInputFieldEntries: [string, ("prompt:run@1" | "agent:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "company:funding:waterfall@1" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "email:draft:gmail@1" | "message:send:slack@1" | "message:send-direct:slack@1" | "template:fill@1" | "contact:create:resend@1" | "lead:enroll:lemlist@1" | "contact:match:hubspot@1" | "company:match:hubspot@1" | "deal:match:hubspot@1" | "object:update:hubspot@1" | "object:associations:hubspot@1" | "activity:log:hubspot@1" | "person:match:salesforce@1" | "account:match:salesforce@1" | "opportunity:match:salesforce@1" | "record:lookup:salesforce@1" | "record:update:salesforce@1" | "record:assert:salesforce@1" | "activities:find:salesforce@1" | "activity:log:salesforce@1" | "person:match:attio@1" | "company:match:attio@1" | "deal:match:attio@1" | "record:match:attio@1" | "record:lookup:attio@1" | "record:update:attio@1" | "activities:find:attio@1" | "lead:enroll:amplemarket@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "role:waterfall@1" | "roles:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "company:identity:crustdata@1" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "person:profile:waterfall@2" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "field:timestamp@1" | "formula:run@1" | "signals:personprofilematch@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:extract:parallel@1" | "website:maplinks:firecrawl@1" | "website:markdown:parallel@1" | "row:append:sheet@1" | "row:expandappend:sheet@1" | "row:roundrobin:sheet@1" | "bucket:claim@1" | "bucket:count@1" | "bucket:check@1" | "bucket:countif@1" | "rows:find:sheet@1" | "rows:delete:sheet@1" | "rows:find:postgres@1" | "rows:find:databricks@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:content:crustdata@1" | "profile:posts:x@1" | "post:create:x@1" | "ads:linkedin:waterfall@1" | "ads:google:waterfall@1" | "ads:meta:waterfall@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "company:match:amplemarket@1" | "company:jobs:amplemarket@1" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "person:identity:email:waterfall@2" | "person:devprofileurl:profileurl:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]][];
|
|
42
|
-
sortedOutputFieldEntries: [string, ("prompt:run@1" | "agent:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "company:funding:waterfall@1" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "email:draft:gmail@1" | "message:send:slack@1" | "message:send-direct:slack@1" | "template:fill@1" | "contact:create:resend@1" | "lead:enroll:lemlist@1" | "contact:match:hubspot@1" | "company:match:hubspot@1" | "deal:match:hubspot@1" | "object:update:hubspot@1" | "object:associations:hubspot@1" | "activity:log:hubspot@1" | "person:match:salesforce@1" | "account:match:salesforce@1" | "opportunity:match:salesforce@1" | "record:lookup:salesforce@1" | "record:update:salesforce@1" | "record:assert:salesforce@1" | "activities:find:salesforce@1" | "activity:log:salesforce@1" | "person:match:attio@1" | "company:match:attio@1" | "deal:match:attio@1" | "record:match:attio@1" | "record:lookup:attio@1" | "record:update:attio@1" | "activities:find:attio@1" | "lead:enroll:amplemarket@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "role:waterfall@1" | "roles:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "company:identity:crustdata@1" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "person:profile:waterfall@2" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "field:timestamp@1" | "formula:run@1" | "signals:personprofilematch@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:extract:parallel@1" | "website:maplinks:firecrawl@1" | "website:markdown:parallel@1" | "row:append:sheet@1" | "row:expandappend:sheet@1" | "row:roundrobin:sheet@1" | "bucket:claim@1" | "bucket:count@1" | "bucket:check@1" | "bucket:countif@1" | "rows:find:sheet@1" | "rows:delete:sheet@1" | "rows:find:postgres@1" | "rows:find:databricks@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:content:crustdata@1" | "profile:posts:x@1" | "post:create:x@1" | "ads:linkedin:waterfall@1" | "ads:google:waterfall@1" | "ads:meta:waterfall@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "company:match:amplemarket@1" | "company:jobs:amplemarket@1" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "person:identity:email:waterfall@2" | "person:devprofileurl:profileurl:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]][];
|
|
43
|
-
sortedTagEntries: [string, ("prompt:run@1" | "agent:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "company:funding:waterfall@1" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "email:draft:gmail@1" | "message:send:slack@1" | "message:send-direct:slack@1" | "template:fill@1" | "contact:create:resend@1" | "lead:enroll:lemlist@1" | "contact:match:hubspot@1" | "company:match:hubspot@1" | "deal:match:hubspot@1" | "object:update:hubspot@1" | "object:associations:hubspot@1" | "activity:log:hubspot@1" | "person:match:salesforce@1" | "account:match:salesforce@1" | "opportunity:match:salesforce@1" | "record:lookup:salesforce@1" | "record:update:salesforce@1" | "record:assert:salesforce@1" | "activities:find:salesforce@1" | "activity:log:salesforce@1" | "person:match:attio@1" | "company:match:attio@1" | "deal:match:attio@1" | "record:match:attio@1" | "record:lookup:attio@1" | "record:update:attio@1" | "activities:find:attio@1" | "lead:enroll:amplemarket@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "role:waterfall@1" | "roles:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "company:identity:crustdata@1" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "person:profile:waterfall@2" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "field:timestamp@1" | "formula:run@1" | "signals:personprofilematch@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:extract:parallel@1" | "website:maplinks:firecrawl@1" | "website:markdown:parallel@1" | "row:append:sheet@1" | "row:expandappend:sheet@1" | "row:roundrobin:sheet@1" | "bucket:claim@1" | "bucket:count@1" | "bucket:check@1" | "bucket:countif@1" | "rows:find:sheet@1" | "rows:delete:sheet@1" | "rows:find:postgres@1" | "rows:find:databricks@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:content:crustdata@1" | "profile:posts:x@1" | "post:create:x@1" | "ads:linkedin:waterfall@1" | "ads:google:waterfall@1" | "ads:meta:waterfall@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "company:match:amplemarket@1" | "company:jobs:amplemarket@1" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "person:identity:email:waterfall@2" | "person:devprofileurl:profileurl:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]][];
|
|
44
|
-
sortedProviderEntries: [string, ("prompt:run@1" | "agent:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "company:funding:waterfall@1" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "email:draft:gmail@1" | "message:send:slack@1" | "message:send-direct:slack@1" | "template:fill@1" | "contact:create:resend@1" | "lead:enroll:lemlist@1" | "contact:match:hubspot@1" | "company:match:hubspot@1" | "deal:match:hubspot@1" | "object:update:hubspot@1" | "object:associations:hubspot@1" | "activity:log:hubspot@1" | "person:match:salesforce@1" | "account:match:salesforce@1" | "opportunity:match:salesforce@1" | "record:lookup:salesforce@1" | "record:update:salesforce@1" | "record:assert:salesforce@1" | "activities:find:salesforce@1" | "activity:log:salesforce@1" | "person:match:attio@1" | "company:match:attio@1" | "deal:match:attio@1" | "record:match:attio@1" | "record:lookup:attio@1" | "record:update:attio@1" | "activities:find:attio@1" | "lead:enroll:amplemarket@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "role:waterfall@1" | "roles:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "company:identity:crustdata@1" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "person:profile:waterfall@2" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "field:timestamp@1" | "formula:run@1" | "signals:personprofilematch@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:extract:parallel@1" | "website:maplinks:firecrawl@1" | "website:markdown:parallel@1" | "row:append:sheet@1" | "row:expandappend:sheet@1" | "row:roundrobin:sheet@1" | "bucket:claim@1" | "bucket:count@1" | "bucket:check@1" | "bucket:countif@1" | "rows:find:sheet@1" | "rows:delete:sheet@1" | "rows:find:postgres@1" | "rows:find:databricks@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:content:crustdata@1" | "profile:posts:x@1" | "post:create:x@1" | "ads:linkedin:waterfall@1" | "ads:google:waterfall@1" | "ads:meta:waterfall@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "company:match:amplemarket@1" | "company:jobs:amplemarket@1" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "person:identity:email:waterfall@2" | "person:devprofileurl:profileurl:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]][];
|
|
45
|
-
pipeIdsByInputField: Record<string, ("prompt:run@1" | "agent:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "company:funding:waterfall@1" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "email:draft:gmail@1" | "message:send:slack@1" | "message:send-direct:slack@1" | "template:fill@1" | "contact:create:resend@1" | "lead:enroll:lemlist@1" | "contact:match:hubspot@1" | "company:match:hubspot@1" | "deal:match:hubspot@1" | "object:update:hubspot@1" | "object:associations:hubspot@1" | "activity:log:hubspot@1" | "person:match:salesforce@1" | "account:match:salesforce@1" | "opportunity:match:salesforce@1" | "record:lookup:salesforce@1" | "record:update:salesforce@1" | "record:assert:salesforce@1" | "activities:find:salesforce@1" | "activity:log:salesforce@1" | "person:match:attio@1" | "company:match:attio@1" | "deal:match:attio@1" | "record:match:attio@1" | "record:lookup:attio@1" | "record:update:attio@1" | "activities:find:attio@1" | "lead:enroll:amplemarket@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "role:waterfall@1" | "roles:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "company:identity:crustdata@1" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "person:profile:waterfall@2" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "field:timestamp@1" | "formula:run@1" | "signals:personprofilematch@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:extract:parallel@1" | "website:maplinks:firecrawl@1" | "website:markdown:parallel@1" | "row:append:sheet@1" | "row:expandappend:sheet@1" | "row:roundrobin:sheet@1" | "bucket:claim@1" | "bucket:count@1" | "bucket:check@1" | "bucket:countif@1" | "rows:find:sheet@1" | "rows:delete:sheet@1" | "rows:find:postgres@1" | "rows:find:databricks@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:content:crustdata@1" | "profile:posts:x@1" | "post:create:x@1" | "ads:linkedin:waterfall@1" | "ads:google:waterfall@1" | "ads:meta:waterfall@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "company:match:amplemarket@1" | "company:jobs:amplemarket@1" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "person:identity:email:waterfall@2" | "person:devprofileurl:profileurl:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]>;
|
|
46
|
-
pipeIdsByOutputField: Record<string, ("prompt:run@1" | "agent:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "company:funding:waterfall@1" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "email:draft:gmail@1" | "message:send:slack@1" | "message:send-direct:slack@1" | "template:fill@1" | "contact:create:resend@1" | "lead:enroll:lemlist@1" | "contact:match:hubspot@1" | "company:match:hubspot@1" | "deal:match:hubspot@1" | "object:update:hubspot@1" | "object:associations:hubspot@1" | "activity:log:hubspot@1" | "person:match:salesforce@1" | "account:match:salesforce@1" | "opportunity:match:salesforce@1" | "record:lookup:salesforce@1" | "record:update:salesforce@1" | "record:assert:salesforce@1" | "activities:find:salesforce@1" | "activity:log:salesforce@1" | "person:match:attio@1" | "company:match:attio@1" | "deal:match:attio@1" | "record:match:attio@1" | "record:lookup:attio@1" | "record:update:attio@1" | "activities:find:attio@1" | "lead:enroll:amplemarket@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "role:waterfall@1" | "roles:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "company:identity:crustdata@1" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "person:profile:waterfall@2" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "field:timestamp@1" | "formula:run@1" | "signals:personprofilematch@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:extract:parallel@1" | "website:maplinks:firecrawl@1" | "website:markdown:parallel@1" | "row:append:sheet@1" | "row:expandappend:sheet@1" | "row:roundrobin:sheet@1" | "bucket:claim@1" | "bucket:count@1" | "bucket:check@1" | "bucket:countif@1" | "rows:find:sheet@1" | "rows:delete:sheet@1" | "rows:find:postgres@1" | "rows:find:databricks@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:content:crustdata@1" | "profile:posts:x@1" | "post:create:x@1" | "ads:linkedin:waterfall@1" | "ads:google:waterfall@1" | "ads:meta:waterfall@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "company:match:amplemarket@1" | "company:jobs:amplemarket@1" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "person:identity:email:waterfall@2" | "person:devprofileurl:profileurl:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]>;
|
|
47
|
-
pipeIdsByProvider: Record<string, ("prompt:run@1" | "agent:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "company:funding:waterfall@1" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "email:draft:gmail@1" | "message:send:slack@1" | "message:send-direct:slack@1" | "template:fill@1" | "contact:create:resend@1" | "lead:enroll:lemlist@1" | "contact:match:hubspot@1" | "company:match:hubspot@1" | "deal:match:hubspot@1" | "object:update:hubspot@1" | "object:associations:hubspot@1" | "activity:log:hubspot@1" | "person:match:salesforce@1" | "account:match:salesforce@1" | "opportunity:match:salesforce@1" | "record:lookup:salesforce@1" | "record:update:salesforce@1" | "record:assert:salesforce@1" | "activities:find:salesforce@1" | "activity:log:salesforce@1" | "person:match:attio@1" | "company:match:attio@1" | "deal:match:attio@1" | "record:match:attio@1" | "record:lookup:attio@1" | "record:update:attio@1" | "activities:find:attio@1" | "lead:enroll:amplemarket@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "role:waterfall@1" | "roles:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "company:identity:crustdata@1" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "person:profile:waterfall@2" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "field:timestamp@1" | "formula:run@1" | "signals:personprofilematch@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:extract:parallel@1" | "website:maplinks:firecrawl@1" | "website:markdown:parallel@1" | "row:append:sheet@1" | "row:expandappend:sheet@1" | "row:roundrobin:sheet@1" | "bucket:claim@1" | "bucket:count@1" | "bucket:check@1" | "bucket:countif@1" | "rows:find:sheet@1" | "rows:delete:sheet@1" | "rows:find:postgres@1" | "rows:find:databricks@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:content:crustdata@1" | "profile:posts:x@1" | "post:create:x@1" | "ads:linkedin:waterfall@1" | "ads:google:waterfall@1" | "ads:meta:waterfall@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "company:match:amplemarket@1" | "company:jobs:amplemarket@1" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "person:identity:email:waterfall@2" | "person:devprofileurl:profileurl:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]>;
|
|
48
|
-
pipeIdsByTag: Record<string, ("prompt:run@1" | "agent:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "company:funding:waterfall@1" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "email:draft:gmail@1" | "message:send:slack@1" | "message:send-direct:slack@1" | "template:fill@1" | "contact:create:resend@1" | "lead:enroll:lemlist@1" | "contact:match:hubspot@1" | "company:match:hubspot@1" | "deal:match:hubspot@1" | "object:update:hubspot@1" | "object:associations:hubspot@1" | "activity:log:hubspot@1" | "person:match:salesforce@1" | "account:match:salesforce@1" | "opportunity:match:salesforce@1" | "record:lookup:salesforce@1" | "record:update:salesforce@1" | "record:assert:salesforce@1" | "activities:find:salesforce@1" | "activity:log:salesforce@1" | "person:match:attio@1" | "company:match:attio@1" | "deal:match:attio@1" | "record:match:attio@1" | "record:lookup:attio@1" | "record:update:attio@1" | "activities:find:attio@1" | "lead:enroll:amplemarket@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "role:waterfall@1" | "roles:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "company:identity:crustdata@1" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "person:profile:waterfall@2" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "field:timestamp@1" | "formula:run@1" | "signals:personprofilematch@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:extract:parallel@1" | "website:maplinks:firecrawl@1" | "website:markdown:parallel@1" | "row:append:sheet@1" | "row:expandappend:sheet@1" | "row:roundrobin:sheet@1" | "bucket:claim@1" | "bucket:count@1" | "bucket:check@1" | "bucket:countif@1" | "rows:find:sheet@1" | "rows:delete:sheet@1" | "rows:find:postgres@1" | "rows:find:databricks@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:content:crustdata@1" | "profile:posts:x@1" | "post:create:x@1" | "ads:linkedin:waterfall@1" | "ads:google:waterfall@1" | "ads:meta:waterfall@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "company:match:amplemarket@1" | "company:jobs:amplemarket@1" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "person:identity:email:waterfall@2" | "person:devprofileurl:profileurl:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]>;
|
|
41
|
+
sortedInputFieldEntries: [string, ("prompt:run@1" | "agent:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "company:funding:waterfall@1" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "email:draft:gmail@1" | "message:send:slack@1" | "message:send-direct:slack@1" | "template:fill@1" | "contact:create:resend@1" | "lead:enroll:lemlist@1" | "contact:match:hubspot@1" | "company:match:hubspot@1" | "deal:match:hubspot@1" | "object:update:hubspot@1" | "object:associations:hubspot@1" | "activity:log:hubspot@1" | "person:match:salesforce@1" | "account:match:salesforce@1" | "opportunity:match:salesforce@1" | "record:lookup:salesforce@1" | "record:update:salesforce@1" | "record:assert:salesforce@1" | "activities:find:salesforce@1" | "activity:log:salesforce@1" | "person:match:attio@1" | "company:match:attio@1" | "deal:match:attio@1" | "record:match:attio@1" | "record:lookup:attio@1" | "record:update:attio@1" | "activities:find:attio@1" | "lead:enroll:amplemarket@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "role:waterfall@1" | "roles:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "company:identity:crustdata@1" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "person:profile:waterfall@2" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "field:timestamp@1" | "formula:run@1" | "signals:personprofilematch@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:extract:parallel@1" | "website:maplinks:firecrawl@1" | "website:markdown:parallel@1" | "row:append:sheet@1" | "row:expandappend:sheet@1" | "row:roundrobin:sheet@1" | "bucket:claim@1" | "stream:enroll@1" | "stream:unenroll@1" | "bucket:count@1" | "bucket:check@1" | "bucket:countif@1" | "rows:find:sheet@1" | "rows:delete:sheet@1" | "rows:find:postgres@1" | "rows:find:databricks@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:content:crustdata@1" | "profile:posts:x@1" | "post:create:x@1" | "ads:linkedin:waterfall@1" | "ads:google:waterfall@1" | "ads:meta:waterfall@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "company:match:amplemarket@1" | "company:jobs:amplemarket@1" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "person:identity:email:waterfall@2" | "person:devprofileurl:profileurl:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]][];
|
|
42
|
+
sortedOutputFieldEntries: [string, ("prompt:run@1" | "agent:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "company:funding:waterfall@1" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "email:draft:gmail@1" | "message:send:slack@1" | "message:send-direct:slack@1" | "template:fill@1" | "contact:create:resend@1" | "lead:enroll:lemlist@1" | "contact:match:hubspot@1" | "company:match:hubspot@1" | "deal:match:hubspot@1" | "object:update:hubspot@1" | "object:associations:hubspot@1" | "activity:log:hubspot@1" | "person:match:salesforce@1" | "account:match:salesforce@1" | "opportunity:match:salesforce@1" | "record:lookup:salesforce@1" | "record:update:salesforce@1" | "record:assert:salesforce@1" | "activities:find:salesforce@1" | "activity:log:salesforce@1" | "person:match:attio@1" | "company:match:attio@1" | "deal:match:attio@1" | "record:match:attio@1" | "record:lookup:attio@1" | "record:update:attio@1" | "activities:find:attio@1" | "lead:enroll:amplemarket@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "role:waterfall@1" | "roles:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "company:identity:crustdata@1" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "person:profile:waterfall@2" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "field:timestamp@1" | "formula:run@1" | "signals:personprofilematch@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:extract:parallel@1" | "website:maplinks:firecrawl@1" | "website:markdown:parallel@1" | "row:append:sheet@1" | "row:expandappend:sheet@1" | "row:roundrobin:sheet@1" | "bucket:claim@1" | "stream:enroll@1" | "stream:unenroll@1" | "bucket:count@1" | "bucket:check@1" | "bucket:countif@1" | "rows:find:sheet@1" | "rows:delete:sheet@1" | "rows:find:postgres@1" | "rows:find:databricks@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:content:crustdata@1" | "profile:posts:x@1" | "post:create:x@1" | "ads:linkedin:waterfall@1" | "ads:google:waterfall@1" | "ads:meta:waterfall@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "company:match:amplemarket@1" | "company:jobs:amplemarket@1" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "person:identity:email:waterfall@2" | "person:devprofileurl:profileurl:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]][];
|
|
43
|
+
sortedTagEntries: [string, ("prompt:run@1" | "agent:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "company:funding:waterfall@1" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "email:draft:gmail@1" | "message:send:slack@1" | "message:send-direct:slack@1" | "template:fill@1" | "contact:create:resend@1" | "lead:enroll:lemlist@1" | "contact:match:hubspot@1" | "company:match:hubspot@1" | "deal:match:hubspot@1" | "object:update:hubspot@1" | "object:associations:hubspot@1" | "activity:log:hubspot@1" | "person:match:salesforce@1" | "account:match:salesforce@1" | "opportunity:match:salesforce@1" | "record:lookup:salesforce@1" | "record:update:salesforce@1" | "record:assert:salesforce@1" | "activities:find:salesforce@1" | "activity:log:salesforce@1" | "person:match:attio@1" | "company:match:attio@1" | "deal:match:attio@1" | "record:match:attio@1" | "record:lookup:attio@1" | "record:update:attio@1" | "activities:find:attio@1" | "lead:enroll:amplemarket@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "role:waterfall@1" | "roles:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "company:identity:crustdata@1" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "person:profile:waterfall@2" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "field:timestamp@1" | "formula:run@1" | "signals:personprofilematch@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:extract:parallel@1" | "website:maplinks:firecrawl@1" | "website:markdown:parallel@1" | "row:append:sheet@1" | "row:expandappend:sheet@1" | "row:roundrobin:sheet@1" | "bucket:claim@1" | "stream:enroll@1" | "stream:unenroll@1" | "bucket:count@1" | "bucket:check@1" | "bucket:countif@1" | "rows:find:sheet@1" | "rows:delete:sheet@1" | "rows:find:postgres@1" | "rows:find:databricks@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:content:crustdata@1" | "profile:posts:x@1" | "post:create:x@1" | "ads:linkedin:waterfall@1" | "ads:google:waterfall@1" | "ads:meta:waterfall@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "company:match:amplemarket@1" | "company:jobs:amplemarket@1" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "person:identity:email:waterfall@2" | "person:devprofileurl:profileurl:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]][];
|
|
44
|
+
sortedProviderEntries: [string, ("prompt:run@1" | "agent:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "company:funding:waterfall@1" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "email:draft:gmail@1" | "message:send:slack@1" | "message:send-direct:slack@1" | "template:fill@1" | "contact:create:resend@1" | "lead:enroll:lemlist@1" | "contact:match:hubspot@1" | "company:match:hubspot@1" | "deal:match:hubspot@1" | "object:update:hubspot@1" | "object:associations:hubspot@1" | "activity:log:hubspot@1" | "person:match:salesforce@1" | "account:match:salesforce@1" | "opportunity:match:salesforce@1" | "record:lookup:salesforce@1" | "record:update:salesforce@1" | "record:assert:salesforce@1" | "activities:find:salesforce@1" | "activity:log:salesforce@1" | "person:match:attio@1" | "company:match:attio@1" | "deal:match:attio@1" | "record:match:attio@1" | "record:lookup:attio@1" | "record:update:attio@1" | "activities:find:attio@1" | "lead:enroll:amplemarket@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "role:waterfall@1" | "roles:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "company:identity:crustdata@1" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "person:profile:waterfall@2" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "field:timestamp@1" | "formula:run@1" | "signals:personprofilematch@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:extract:parallel@1" | "website:maplinks:firecrawl@1" | "website:markdown:parallel@1" | "row:append:sheet@1" | "row:expandappend:sheet@1" | "row:roundrobin:sheet@1" | "bucket:claim@1" | "stream:enroll@1" | "stream:unenroll@1" | "bucket:count@1" | "bucket:check@1" | "bucket:countif@1" | "rows:find:sheet@1" | "rows:delete:sheet@1" | "rows:find:postgres@1" | "rows:find:databricks@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:content:crustdata@1" | "profile:posts:x@1" | "post:create:x@1" | "ads:linkedin:waterfall@1" | "ads:google:waterfall@1" | "ads:meta:waterfall@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "company:match:amplemarket@1" | "company:jobs:amplemarket@1" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "person:identity:email:waterfall@2" | "person:devprofileurl:profileurl:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]][];
|
|
45
|
+
pipeIdsByInputField: Record<string, ("prompt:run@1" | "agent:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "company:funding:waterfall@1" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "email:draft:gmail@1" | "message:send:slack@1" | "message:send-direct:slack@1" | "template:fill@1" | "contact:create:resend@1" | "lead:enroll:lemlist@1" | "contact:match:hubspot@1" | "company:match:hubspot@1" | "deal:match:hubspot@1" | "object:update:hubspot@1" | "object:associations:hubspot@1" | "activity:log:hubspot@1" | "person:match:salesforce@1" | "account:match:salesforce@1" | "opportunity:match:salesforce@1" | "record:lookup:salesforce@1" | "record:update:salesforce@1" | "record:assert:salesforce@1" | "activities:find:salesforce@1" | "activity:log:salesforce@1" | "person:match:attio@1" | "company:match:attio@1" | "deal:match:attio@1" | "record:match:attio@1" | "record:lookup:attio@1" | "record:update:attio@1" | "activities:find:attio@1" | "lead:enroll:amplemarket@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "role:waterfall@1" | "roles:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "company:identity:crustdata@1" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "person:profile:waterfall@2" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "field:timestamp@1" | "formula:run@1" | "signals:personprofilematch@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:extract:parallel@1" | "website:maplinks:firecrawl@1" | "website:markdown:parallel@1" | "row:append:sheet@1" | "row:expandappend:sheet@1" | "row:roundrobin:sheet@1" | "bucket:claim@1" | "stream:enroll@1" | "stream:unenroll@1" | "bucket:count@1" | "bucket:check@1" | "bucket:countif@1" | "rows:find:sheet@1" | "rows:delete:sheet@1" | "rows:find:postgres@1" | "rows:find:databricks@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:content:crustdata@1" | "profile:posts:x@1" | "post:create:x@1" | "ads:linkedin:waterfall@1" | "ads:google:waterfall@1" | "ads:meta:waterfall@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "company:match:amplemarket@1" | "company:jobs:amplemarket@1" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "person:identity:email:waterfall@2" | "person:devprofileurl:profileurl:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]>;
|
|
46
|
+
pipeIdsByOutputField: Record<string, ("prompt:run@1" | "agent:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "company:funding:waterfall@1" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "email:draft:gmail@1" | "message:send:slack@1" | "message:send-direct:slack@1" | "template:fill@1" | "contact:create:resend@1" | "lead:enroll:lemlist@1" | "contact:match:hubspot@1" | "company:match:hubspot@1" | "deal:match:hubspot@1" | "object:update:hubspot@1" | "object:associations:hubspot@1" | "activity:log:hubspot@1" | "person:match:salesforce@1" | "account:match:salesforce@1" | "opportunity:match:salesforce@1" | "record:lookup:salesforce@1" | "record:update:salesforce@1" | "record:assert:salesforce@1" | "activities:find:salesforce@1" | "activity:log:salesforce@1" | "person:match:attio@1" | "company:match:attio@1" | "deal:match:attio@1" | "record:match:attio@1" | "record:lookup:attio@1" | "record:update:attio@1" | "activities:find:attio@1" | "lead:enroll:amplemarket@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "role:waterfall@1" | "roles:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "company:identity:crustdata@1" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "person:profile:waterfall@2" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "field:timestamp@1" | "formula:run@1" | "signals:personprofilematch@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:extract:parallel@1" | "website:maplinks:firecrawl@1" | "website:markdown:parallel@1" | "row:append:sheet@1" | "row:expandappend:sheet@1" | "row:roundrobin:sheet@1" | "bucket:claim@1" | "stream:enroll@1" | "stream:unenroll@1" | "bucket:count@1" | "bucket:check@1" | "bucket:countif@1" | "rows:find:sheet@1" | "rows:delete:sheet@1" | "rows:find:postgres@1" | "rows:find:databricks@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:content:crustdata@1" | "profile:posts:x@1" | "post:create:x@1" | "ads:linkedin:waterfall@1" | "ads:google:waterfall@1" | "ads:meta:waterfall@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "company:match:amplemarket@1" | "company:jobs:amplemarket@1" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "person:identity:email:waterfall@2" | "person:devprofileurl:profileurl:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]>;
|
|
47
|
+
pipeIdsByProvider: Record<string, ("prompt:run@1" | "agent:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "company:funding:waterfall@1" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "email:draft:gmail@1" | "message:send:slack@1" | "message:send-direct:slack@1" | "template:fill@1" | "contact:create:resend@1" | "lead:enroll:lemlist@1" | "contact:match:hubspot@1" | "company:match:hubspot@1" | "deal:match:hubspot@1" | "object:update:hubspot@1" | "object:associations:hubspot@1" | "activity:log:hubspot@1" | "person:match:salesforce@1" | "account:match:salesforce@1" | "opportunity:match:salesforce@1" | "record:lookup:salesforce@1" | "record:update:salesforce@1" | "record:assert:salesforce@1" | "activities:find:salesforce@1" | "activity:log:salesforce@1" | "person:match:attio@1" | "company:match:attio@1" | "deal:match:attio@1" | "record:match:attio@1" | "record:lookup:attio@1" | "record:update:attio@1" | "activities:find:attio@1" | "lead:enroll:amplemarket@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "role:waterfall@1" | "roles:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "company:identity:crustdata@1" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "person:profile:waterfall@2" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "field:timestamp@1" | "formula:run@1" | "signals:personprofilematch@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:extract:parallel@1" | "website:maplinks:firecrawl@1" | "website:markdown:parallel@1" | "row:append:sheet@1" | "row:expandappend:sheet@1" | "row:roundrobin:sheet@1" | "bucket:claim@1" | "stream:enroll@1" | "stream:unenroll@1" | "bucket:count@1" | "bucket:check@1" | "bucket:countif@1" | "rows:find:sheet@1" | "rows:delete:sheet@1" | "rows:find:postgres@1" | "rows:find:databricks@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:content:crustdata@1" | "profile:posts:x@1" | "post:create:x@1" | "ads:linkedin:waterfall@1" | "ads:google:waterfall@1" | "ads:meta:waterfall@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "company:match:amplemarket@1" | "company:jobs:amplemarket@1" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "person:identity:email:waterfall@2" | "person:devprofileurl:profileurl:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]>;
|
|
48
|
+
pipeIdsByTag: Record<string, ("prompt:run@1" | "agent:run@1" | "company:newssummary:website@1" | "company:newssummary:domain@1" | "company:techstack:builtwith@1" | "company:techstack:builtwith@2" | "company:websiteurl:email@1" | "company:domain:workemail@1" | "company:funding:leadmagic@1" | "company:funding:leadmagic@2" | "company:funding:waterfall@1" | "people:workemail:waterfall@1" | "person:workemail:waterfall@1" | "people:email:iswork@1" | "email:iswork@1" | "people:name:split@1" | "person:name:split@1" | "person:name:join@1" | "people:validate:email:zerobounce@1" | "people:email:validate:zerobounce@2" | "email:validate:zerobounce@1" | "people:mobilenumber:workemail:waterfall@1" | "company:overview@1" | "company:overview@2" | "company:overview@3" | "json:extract:multi@1" | "email:write@1" | "message:write@1" | "email:send:resend@1" | "email:send:gmail@1" | "email:draft:gmail@1" | "message:send:slack@1" | "message:send-direct:slack@1" | "template:fill@1" | "contact:create:resend@1" | "lead:enroll:lemlist@1" | "contact:match:hubspot@1" | "company:match:hubspot@1" | "deal:match:hubspot@1" | "object:update:hubspot@1" | "object:associations:hubspot@1" | "activity:log:hubspot@1" | "person:match:salesforce@1" | "account:match:salesforce@1" | "opportunity:match:salesforce@1" | "record:lookup:salesforce@1" | "record:update:salesforce@1" | "record:assert:salesforce@1" | "activities:find:salesforce@1" | "activity:log:salesforce@1" | "person:match:attio@1" | "company:match:attio@1" | "deal:match:attio@1" | "record:match:attio@1" | "record:lookup:attio@1" | "record:update:attio@1" | "activities:find:attio@1" | "lead:enroll:amplemarket@1" | "people:match:role:waterfall@1" | "person:match:role:waterfall@1" | "role:waterfall@1" | "roles:waterfall@1" | "person:identity:amplemarket@1" | "company:identity@2" | "company:identity@3" | "company:identity:crustdata@1" | "person:match:amplemarket@1" | "people:phone:profile:waterfall@1" | "person:mobile:profileurl:waterfall@1" | "people:personalemail:profile:waterfall@1" | "person:personalemail:profileurl:waterfall@1" | "people:profile:waterfall@1" | "person:profile:waterfall@1" | "person:profile:waterfall@2" | "people:profileurl:email:waterfall@1" | "person:profileurl:email:waterfall@1" | "person:profileurl:name@1" | "people:email:validate:zerobounce@1" | "person:email:validate:millionverifier@1" | "people:phone:workemail:waterfall@1" | "person:mobile:workemail:waterfall@1" | "fields:merge@1" | "field:slugify@1" | "field:domainify@1" | "field:timestamp@1" | "formula:run@1" | "signals:personprofilematch@1" | "website:scrape:firecrawl@1" | "website:scrapelist:firecrawl@1" | "website:extract:firecrawl@1" | "website:extract:parallel@1" | "website:maplinks:firecrawl@1" | "website:markdown:parallel@1" | "row:append:sheet@1" | "row:expandappend:sheet@1" | "row:roundrobin:sheet@1" | "bucket:claim@1" | "stream:enroll@1" | "stream:unenroll@1" | "bucket:count@1" | "bucket:check@1" | "bucket:countif@1" | "rows:find:sheet@1" | "rows:delete:sheet@1" | "rows:find:postgres@1" | "rows:find:databricks@1" | "company:lookalikes:companyenrich@1" | "company:lookalikes:companyenrich@2" | "company:match:logodev@1" | "company:match:logodev@2" | "person:posts:content:crustdata@1" | "profile:posts:x@1" | "post:create:x@1" | "ads:linkedin:waterfall@1" | "ads:google:waterfall@1" | "ads:meta:waterfall@1" | "company:match:crustdata@1" | "company:match:crustdata@2" | "company:match:amplemarket@1" | "company:jobs:amplemarket@1" | "people:profile:workemail:crustdata@1" | "person:profile:workemail:crustdata@1" | "people:workemail:profileurl:waterfall@1" | "person:workemail:profileurl:waterfall@1" | "people:identity:email:waterfall@1" | "person:identity:email:waterfall@1" | "person:identity:email:waterfall@2" | "person:devprofileurl:profileurl:waterfall@1" | "http:request@1" | "company:identity@1" | "people:professionalprofile:waterfall@1" | "people:professionalprofileurl:name@1" | "people:professionalprofileurl:email:waterfall@1" | "people:mobilenumber:professionalprofile:waterfall@1")[]>;
|
|
49
49
|
};
|
|
50
50
|
type UsePipeCatalogTableReturn = ReturnType<typeof usePipeCatalogTable>;
|
|
51
51
|
//#endregion
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { PipeFormContext } from "../context/pipe-form-context.mjs";
|
|
2
|
+
import { GroupMap, PathMap, SectionMap } from "../types/form-customization.mjs";
|
|
3
|
+
import { StreamId, StreamPayload } from "@pipe0/base";
|
|
4
|
+
|
|
5
|
+
//#region src/hooks/use-stream-form.d.ts
|
|
6
|
+
interface UseStreamFormOptions {
|
|
7
|
+
streamId: StreamId;
|
|
8
|
+
publicKey: string;
|
|
9
|
+
/** Seeded from the entry's `defaultPayload` when omitted. */
|
|
10
|
+
defaultValues?: StreamPayload;
|
|
11
|
+
sectionMap?: SectionMap;
|
|
12
|
+
groupMap?: GroupMap;
|
|
13
|
+
pathMap?: PathMap;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Drives the form that configures a stream before it is created.
|
|
17
|
+
*
|
|
18
|
+
* Closer to `usePlaybookForm` than to `usePipeForm`, and for the same reason it
|
|
19
|
+
* is thinner: a stream is configured against a SOURCE, not against a sheet, so
|
|
20
|
+
* there is no `ValidationContext` and no field references to resolve. It does
|
|
21
|
+
* keep the connector — several sources need a credential — which is why the
|
|
22
|
+
* store is real rather than permanently empty.
|
|
23
|
+
*
|
|
24
|
+
* Returns a `PipeFormContext`-shaped object so the existing `<PipeForm>`
|
|
25
|
+
* compound components render it unchanged.
|
|
26
|
+
*/
|
|
27
|
+
declare function useStreamForm(options: UseStreamFormOptions): PipeFormContext;
|
|
28
|
+
//#endregion
|
|
29
|
+
export { UseStreamFormOptions, useStreamForm };
|
|
30
|
+
//# sourceMappingURL=use-stream-form.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-stream-form.d.mts","names":[],"sources":["../../src/hooks/use-stream-form.ts"],"mappings":";;;;;UAeiB,oBAAA;EACf,QAAA,EAAU,QAAA;EACV,SAAA;EAFmC;EAInC,aAAA,GAAgB,aAAA;EAChB,UAAA,GAAa,UAAA;EACb,QAAA,GAAW,QAAA;EACX,OAAA,GAAU,OAAA;AAAA;;;;;;;;;;;;;iBAeI,aAAA,CAAc,OAAA,EAAS,oBAAA,GAAuB,eAAA"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { asFormHandle } from "../utils/internal-form.mjs";
|
|
2
|
+
import { useFormCore } from "./use-form-core.mjs";
|
|
3
|
+
import { useMemo, useState } from "react";
|
|
4
|
+
import { getStreamDefaultPayload, getStreamEntry, getStreamPayloadFormConfig, getStreamPayloadSchema } from "@pipe0/base";
|
|
5
|
+
|
|
6
|
+
//#region src/hooks/use-stream-form.ts
|
|
7
|
+
/**
|
|
8
|
+
* Drives the form that configures a stream before it is created.
|
|
9
|
+
*
|
|
10
|
+
* Closer to `usePlaybookForm` than to `usePipeForm`, and for the same reason it
|
|
11
|
+
* is thinner: a stream is configured against a SOURCE, not against a sheet, so
|
|
12
|
+
* there is no `ValidationContext` and no field references to resolve. It does
|
|
13
|
+
* keep the connector — several sources need a credential — which is why the
|
|
14
|
+
* store is real rather than permanently empty.
|
|
15
|
+
*
|
|
16
|
+
* Returns a `PipeFormContext`-shaped object so the existing `<PipeForm>`
|
|
17
|
+
* compound components render it unchanged.
|
|
18
|
+
*/
|
|
19
|
+
function useStreamForm(options) {
|
|
20
|
+
const { streamId, publicKey, defaultValues, sectionMap, groupMap, pathMap } = options;
|
|
21
|
+
useMemo(() => getStreamEntry(streamId), [streamId]);
|
|
22
|
+
const [store, setStore] = useState({ field_options: {} });
|
|
23
|
+
const seedValues = useMemo(() => defaultValues ?? getStreamDefaultPayload(streamId), [defaultValues, streamId]);
|
|
24
|
+
const formConfig = useMemo(() => getStreamPayloadFormConfig({
|
|
25
|
+
streamPayload: seedValues,
|
|
26
|
+
store,
|
|
27
|
+
customization: {
|
|
28
|
+
sectionMap,
|
|
29
|
+
groupMap,
|
|
30
|
+
pathMap
|
|
31
|
+
}
|
|
32
|
+
}), [
|
|
33
|
+
seedValues,
|
|
34
|
+
store,
|
|
35
|
+
JSON.stringify({
|
|
36
|
+
sectionMap,
|
|
37
|
+
groupMap,
|
|
38
|
+
pathMap
|
|
39
|
+
})
|
|
40
|
+
]);
|
|
41
|
+
const core = useFormCore({
|
|
42
|
+
pipeOrSearchId: streamId,
|
|
43
|
+
kind: "stream",
|
|
44
|
+
schema: getStreamPayloadSchema(streamId),
|
|
45
|
+
publicKey,
|
|
46
|
+
defaultValues: seedValues,
|
|
47
|
+
store,
|
|
48
|
+
setStore,
|
|
49
|
+
formConfig
|
|
50
|
+
});
|
|
51
|
+
const sections = core.sections;
|
|
52
|
+
const fields = useMemo(() => sections.flatMap((s) => s.groups.flatMap((g) => g.fields)), [sections]);
|
|
53
|
+
const fieldPaths = useMemo(() => new Set(sections.flatMap((s) => s.groups.flatMap((g) => g.fields.map((f) => f.path)))), [sections]);
|
|
54
|
+
return useMemo(() => ({
|
|
55
|
+
id: streamId,
|
|
56
|
+
publicKey,
|
|
57
|
+
form: asFormHandle(core.form),
|
|
58
|
+
sections,
|
|
59
|
+
fields,
|
|
60
|
+
fieldPaths,
|
|
61
|
+
connectionsStatus: core.connectionsStatus,
|
|
62
|
+
fieldLoadStates: core.fieldLoadStates,
|
|
63
|
+
fieldLoaderErrors: core.fieldLoaderErrors,
|
|
64
|
+
loadingFieldLoaders: core.loadingFieldLoaders,
|
|
65
|
+
hasFieldLoaderError: core.hasFieldLoaderError,
|
|
66
|
+
isFieldLoaderLoading: core.isFieldLoaderLoading,
|
|
67
|
+
resolvers: void 0,
|
|
68
|
+
store,
|
|
69
|
+
reset: core.reset
|
|
70
|
+
}), [
|
|
71
|
+
streamId,
|
|
72
|
+
publicKey,
|
|
73
|
+
core.form,
|
|
74
|
+
sections,
|
|
75
|
+
fields,
|
|
76
|
+
fieldPaths,
|
|
77
|
+
core.connectionsStatus,
|
|
78
|
+
core.fieldLoadStates,
|
|
79
|
+
core.fieldLoaderErrors,
|
|
80
|
+
core.loadingFieldLoaders,
|
|
81
|
+
core.hasFieldLoaderError,
|
|
82
|
+
core.isFieldLoaderLoading,
|
|
83
|
+
store,
|
|
84
|
+
core.reset
|
|
85
|
+
]);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
//#endregion
|
|
89
|
+
export { useStreamForm };
|
|
90
|
+
//# sourceMappingURL=use-stream-form.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-stream-form.mjs","names":[],"sources":["../../src/hooks/use-stream-form.ts"],"sourcesContent":["import {\n type FormStore,\n getStreamDefaultPayload,\n getStreamEntry,\n getStreamPayloadFormConfig,\n getStreamPayloadSchema,\n type StreamId,\n type StreamPayload,\n} from \"@pipe0/base\";\nimport { useMemo, useState } from \"react\";\nimport type { PipeFormContext } from \"../context/pipe-form-context.js\";\nimport type { GroupMap, PathMap, SectionMap } from \"../types/form-customization.js\";\nimport { asFormHandle } from \"../utils/internal-form.js\";\nimport { useFormCore } from \"./use-form-core.js\";\n\nexport interface UseStreamFormOptions {\n streamId: StreamId;\n publicKey: string;\n /** Seeded from the entry's `defaultPayload` when omitted. */\n defaultValues?: StreamPayload;\n sectionMap?: SectionMap;\n groupMap?: GroupMap;\n pathMap?: PathMap;\n}\n\n/**\n * Drives the form that configures a stream before it is created.\n *\n * Closer to `usePlaybookForm` than to `usePipeForm`, and for the same reason it\n * is thinner: a stream is configured against a SOURCE, not against a sheet, so\n * there is no `ValidationContext` and no field references to resolve. It does\n * keep the connector — several sources need a credential — which is why the\n * store is real rather than permanently empty.\n *\n * Returns a `PipeFormContext`-shaped object so the existing `<PipeForm>`\n * compound components render it unchanged.\n */\nexport function useStreamForm(options: UseStreamFormOptions): PipeFormContext {\n const { streamId, publicKey, defaultValues, sectionMap, groupMap, pathMap } = options;\n\n // Resolved eagerly so an unknown id fails here with a legible message rather\n // than deep inside the form builder.\n useMemo(() => getStreamEntry(streamId), [streamId]);\n\n const [store, setStore] = useState<FormStore>({ field_options: {} });\n\n const seedValues = useMemo(\n () => (defaultValues ?? getStreamDefaultPayload(streamId)) as StreamPayload,\n [defaultValues, streamId],\n );\n\n const customizationKey = JSON.stringify({ sectionMap, groupMap, pathMap });\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: customization inputs are tracked by value via `customizationKey` to keep the config stable across inline-object renders.\n const formConfig = useMemo(\n () =>\n getStreamPayloadFormConfig({\n streamPayload: seedValues,\n store,\n customization: { sectionMap, groupMap, pathMap },\n }),\n [seedValues, store, customizationKey],\n );\n\n const core = useFormCore<Record<string, unknown>>({\n pipeOrSearchId: streamId,\n kind: \"stream\",\n schema: getStreamPayloadSchema(streamId),\n publicKey,\n defaultValues: seedValues as unknown as Record<string, unknown>,\n store,\n setStore,\n formConfig,\n });\n\n const sections = core.sections;\n\n const fields = useMemo(\n () => sections.flatMap((s) => s.groups.flatMap((g) => g.fields)),\n [sections],\n );\n\n const fieldPaths = useMemo(\n () => new Set(sections.flatMap((s) => s.groups.flatMap((g) => g.fields.map((f) => f.path)))),\n [sections],\n );\n\n return useMemo<PipeFormContext>(\n () => ({\n // Structural reuse of PipeFormContext — see the function docblock.\n id: streamId as unknown as PipeFormContext[\"id\"],\n publicKey,\n form: asFormHandle(core.form) as unknown as PipeFormContext[\"form\"],\n sections,\n fields,\n fieldPaths,\n connectionsStatus: core.connectionsStatus,\n fieldLoadStates: core.fieldLoadStates,\n fieldLoaderErrors: core.fieldLoaderErrors,\n loadingFieldLoaders: core.loadingFieldLoaders,\n hasFieldLoaderError: core.hasFieldLoaderError,\n isFieldLoaderLoading: core.isFieldLoaderLoading,\n resolvers: undefined,\n store,\n reset: core.reset as unknown as PipeFormContext[\"reset\"],\n }),\n [\n streamId,\n publicKey,\n core.form,\n sections,\n fields,\n fieldPaths,\n core.connectionsStatus,\n core.fieldLoadStates,\n core.fieldLoaderErrors,\n core.loadingFieldLoaders,\n core.hasFieldLoaderError,\n core.isFieldLoaderLoading,\n store,\n core.reset,\n ],\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAqCA,SAAgB,cAAc,SAAgD;CAC5E,MAAM,EAAE,UAAU,WAAW,eAAe,YAAY,UAAU,YAAY;AAI9E,eAAc,eAAe,SAAS,EAAE,CAAC,SAAS,CAAC;CAEnD,MAAM,CAAC,OAAO,YAAY,SAAoB,EAAE,eAAe,EAAE,EAAE,CAAC;CAEpE,MAAM,aAAa,cACV,iBAAiB,wBAAwB,SAAS,EACzD,CAAC,eAAe,SAAS,CAC1B;CAKD,MAAM,aAAa,cAEf,2BAA2B;EACzB,eAAe;EACf;EACA,eAAe;GAAE;GAAY;GAAU;GAAS;EACjD,CAAC,EACJ;EAAC;EAAY;EAVU,KAAK,UAAU;GAAE;GAAY;GAAU;GAAS,CAAC;EAUnC,CACtC;CAED,MAAM,OAAO,YAAqC;EAChD,gBAAgB;EAChB,MAAM;EACN,QAAQ,uBAAuB,SAAS;EACxC;EACA,eAAe;EACf;EACA;EACA;EACD,CAAC;CAEF,MAAM,WAAW,KAAK;CAEtB,MAAM,SAAS,cACP,SAAS,SAAS,MAAM,EAAE,OAAO,SAAS,MAAM,EAAE,OAAO,CAAC,EAChE,CAAC,SAAS,CACX;CAED,MAAM,aAAa,cACX,IAAI,IAAI,SAAS,SAAS,MAAM,EAAE,OAAO,SAAS,MAAM,EAAE,OAAO,KAAK,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAC5F,CAAC,SAAS,CACX;AAED,QAAO,eACE;EAEL,IAAI;EACJ;EACA,MAAM,aAAa,KAAK,KAAK;EAC7B;EACA;EACA;EACA,mBAAmB,KAAK;EACxB,iBAAiB,KAAK;EACtB,mBAAmB,KAAK;EACxB,qBAAqB,KAAK;EAC1B,qBAAqB,KAAK;EAC1B,sBAAsB,KAAK;EAC3B,WAAW;EACX;EACA,OAAO,KAAK;EACb,GACD;EACE;EACA;EACA,KAAK;EACL;EACA;EACA;EACA,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL;EACA,KAAK;EACN,CACF"}
|
package/dist/index.d.mts
CHANGED
|
@@ -98,6 +98,7 @@ import { UsePipeFormOptions, usePipeForm } from "./hooks/use-pipe-form.mjs";
|
|
|
98
98
|
import { UsePlaybookFormOptions, usePlaybookForm } from "./hooks/use-playbook-form.mjs";
|
|
99
99
|
import { UseSearchFormOptions, useSearchForm } from "./hooks/use-search-form.mjs";
|
|
100
100
|
import { UseSheetEffectFormOptions, useSheetEffectForm } from "./hooks/use-sheet-effect-form.mjs";
|
|
101
|
+
import { UseStreamFormOptions, useStreamForm } from "./hooks/use-stream-form.mjs";
|
|
101
102
|
import { fuzzyFilter, getFieldStatusIcon, getFieldTypeIcon } from "./utils/catalog-helpers.mjs";
|
|
102
103
|
import { EmojiGlyph } from "./widgets/emoji-glyph.mjs";
|
|
103
104
|
import { FieldTypeBadge } from "./widgets/field-type-badge.mjs";
|
|
@@ -107,4 +108,4 @@ import { PricingBadge } from "./widgets/pricing-badge.mjs";
|
|
|
107
108
|
import { ProviderLogo } from "./widgets/provider-logo.mjs";
|
|
108
109
|
import { WidgetStrip } from "./widgets/widget-strip.mjs";
|
|
109
110
|
import { WidgetView } from "./widgets/widget-view.mjs";
|
|
110
|
-
export { Alert, AlertDescription, type AlertProps, AlertTitle, type AlertVariant, type AnyFieldProps as AnyFieldHandle, AvatarGroup, type AvatarGroupProps, type AvatarGroupState, CatalogCard, CatalogCardBadge, type CatalogCardBadgeProps, CatalogCardBadges, type CatalogCardBadgesProps, CatalogCardDescription, type CatalogCardDescriptionProps, CatalogCardHeader, type CatalogCardHeaderProps, type CatalogCardProps, CatalogCardTitle, type CatalogCardTitleProps, CatalogCategorySection, type CatalogCategorySectionProps, type CatalogClassNames, type CatalogComponentOverrides, type CatalogConfig, CatalogCopyId, type CatalogCopyIdProps, CatalogCreditBadge, type CatalogCreditBadgeProps, CatalogDocsBadge, type CatalogDocsBadgeProps, CatalogFieldBadge, type CatalogFieldBadgeProps, type CatalogFieldBadgeState, CatalogProvider, CatalogProviderAvatars, type CatalogProviderAvatarsProps, type CatalogProviderProps, CatalogRoot, type CostMode, type EffectCardData, EffectCatalog, EffectCatalogCard, EffectCatalogCardContext, type EffectCatalogCardContextValue, type EffectCatalogCardProps, type EffectCatalogCardState, EffectCatalogCategoryFilter, type EffectCatalogCategoryFilterProps, type EffectCatalogCategoryFilterState, EffectCatalogContext, type EffectCatalogContextValue, EffectCatalogEmpty, type EffectCatalogEmptyProps, type EffectCatalogEmptyState, type EffectCatalogInstanceProps, EffectCatalogList, type EffectCatalogListProps, type EffectCatalogListState, type EffectCatalogProps, EffectCatalogSearchFilter, type EffectCatalogSearchFilterProps, type EffectCatalogSearchFilterState, type EffectCatalogZeroConfigProps, EmojiGlyph, type FieldAdapterMap, type GeneratedFieldProps as FieldHandle, type FieldKind, type FieldMeta, FieldRenderer, FieldTypeBadge, type FormClassNames, type FormComponents, type FormConfig, type FormErrorEntry, type FormErrors, type FormFieldState, type FormHandle, FormProvider, type FormResetFieldOptions, type FormResetOptions, FormRoot, type FormSetValueOptions, type FormStateSnapshot, type GroupMap, type GroupOverride, IconGlyph, type InputFieldEntries, LogoUrl, type OutputFieldEntries, type PathMap, type PathOverride, type ActiveFilter as PipeActiveFilter, type PipeCardData, PipeCatalog, PipeCatalogActiveFilters, type PipeCatalogActiveFiltersProps, type PipeCatalogActiveFiltersState, PipeCatalogCard, PipeCatalogCardContext, type PipeCatalogCardContextValue, type PipeCatalogCardProps, PipeCatalogCategoryFilter, type PipeCatalogCategoryFilterProps, type PipeCatalogCategoryFilterState, PipeCatalogColumnFilter, type PipeCatalogColumnFilterProps, PipeCatalogColumnFilters, type PipeCatalogColumnFiltersProps, PipeCatalogContext, type PipeCatalogContextValue, PipeCatalogEmpty, type PipeCatalogEmptyProps, type PipeCatalogEmptyState, PipeCatalogInputFieldFilter, type PipeCatalogInputFieldFilterProps, type PipeCatalogInstanceProps, PipeCatalogList, type PipeCatalogListProps, type PipeCatalogListState, PipeCatalogOutputFieldFilter, type PipeCatalogOutputFieldFilterProps, type PipeCatalogProps, PipeCatalogProviderFilter, type PipeCatalogProviderFilterProps, PipeCatalogSearchFilter, type PipeCatalogSearchFilterProps, type PipeCatalogSearchFilterState, PipeCatalogTagFilter, type PipeCatalogTagFilterProps, type PipeCatalogZeroConfigProps, type PipeColumnFilterId, type ColumnFilterState as PipeColumnFilterState, PipeForm, PipeFormContent, PipeFormContext, PipeFormErrors, PipeFormField, PipeFormFooter, PipeFormGroup, PipeFormHeader, type PipeFormInstanceProps, type PipeFormProps, PipeFormSection, PipeFormSubmitButton, PipeFormTitle, type PipeFormZeroConfigProps, PricingBadge, ProviderLogo, type ActiveFilter$1 as SearchActiveFilter, type SearchCardData, SearchCatalog, SearchCatalogActiveFilters, type SearchCatalogActiveFiltersProps, type SearchCatalogActiveFiltersState, SearchCatalogCard, SearchCatalogCardContext, type SearchCatalogCardContextValue, type SearchCatalogCardProps, SearchCatalogCategoryFilter, type SearchCatalogCategoryFilterProps, type SearchCatalogCategoryFilterState, SearchCatalogColumnFilter, type SearchCatalogColumnFilterProps, SearchCatalogColumnFilters, type SearchCatalogColumnFiltersProps, SearchCatalogContext, type SearchCatalogContextValue, SearchCatalogEmpty, type SearchCatalogEmptyProps, type SearchCatalogEmptyState, type SearchCatalogInstanceProps, SearchCatalogList, type SearchCatalogListProps, type SearchCatalogListState, SearchCatalogOutputFieldFilter, type SearchCatalogOutputFieldFilterProps, type SearchCatalogProps, SearchCatalogProviderFilter, type SearchCatalogProviderFilterProps, SearchCatalogSearchFilter, type SearchCatalogSearchFilterProps, type SearchCatalogSearchFilterState, SearchCatalogTagFilter, type SearchCatalogTagFilterProps, type SearchCatalogZeroConfigProps, type SearchColumnFilterId, type ColumnFilterState$1 as SearchColumnFilterState, SearchForm, SearchFormContent, SearchFormContext, SearchFormErrors, SearchFormField, SearchFormFooter, SearchFormGroup, SearchFormHeader, type SearchFormInstanceProps, type SearchFormProps, SearchFormSection, SearchFormSubmitButton, SearchFormTitle, type SearchFormZeroConfigProps, type SearchOutputFieldEntries, type ActiveFilter$2 as SearchesActiveFilter, type SearchesCardData, SearchesCatalog, SearchesCatalogActiveFilters, type SearchesCatalogActiveFiltersProps, type SearchesCatalogActiveFiltersState, SearchesCatalogCard, SearchesCatalogCardContext, type SearchesCatalogCardContextValue, type SearchesCatalogCardProps, SearchesCatalogCategoryFilter, type SearchesCatalogCategoryFilterProps, type SearchesCatalogCategoryFilterState, SearchesCatalogColumnFilter, type SearchesCatalogColumnFilterProps, SearchesCatalogColumnFilters, type SearchesCatalogColumnFiltersProps, SearchesCatalogContext, type SearchesCatalogContextValue, SearchesCatalogEmpty, type SearchesCatalogEmptyProps, type SearchesCatalogEmptyState, type SearchesCatalogInstanceProps, SearchesCatalogList, type SearchesCatalogListProps, type SearchesCatalogListState, SearchesCatalogOutputFieldFilter, type SearchesCatalogOutputFieldFilterProps, type SearchesCatalogProps, SearchesCatalogProviderFilter, type SearchesCatalogProviderFilterProps, SearchesCatalogSearchFilter, type SearchesCatalogSearchFilterProps, type SearchesCatalogSearchFilterState, SearchesCatalogTagFilter, type SearchesCatalogTagFilterProps, type SearchesCatalogZeroConfigProps, type SearchesColumnFilterId, type ColumnFilterState$2 as SearchesColumnFilterState, type SearchesOutputFieldEntries, type SectionMap, type SectionOverride, type UseEffectCatalogTableReturn, type UsePipeCatalogTableReturn, type UsePipeFormOptions, type UsePlaybookFormOptions, type UseSearchCatalogTableReturn, type UseSearchFormOptions, type UseSearchesCatalogTableReturn, type UseSheetEffectFormOptions, WidgetStrip, WidgetView, alertVariants, defaultAdapters, fuzzyFilter, getFieldStatusIcon, getFieldTypeIcon, useCatalogConfig, useEffectCatalogCard, useEffectCatalogContext, useEffectCatalogTable, useFieldError, useFormAlert, useFormConfig, usePipeCatalogCard, usePipeCatalogContext, usePipeCatalogTable, usePipeForm, usePipeFormContext, usePlaybookForm, usePortalContainer, useSearchCatalogCard, useSearchCatalogContext, useSearchCatalogTable, useSearchForm, useSearchFormContext, useSearchesCatalogCard, useSearchesCatalogContext, useSearchesCatalogTable, useSheetEffectForm };
|
|
111
|
+
export { Alert, AlertDescription, type AlertProps, AlertTitle, type AlertVariant, type AnyFieldProps as AnyFieldHandle, AvatarGroup, type AvatarGroupProps, type AvatarGroupState, CatalogCard, CatalogCardBadge, type CatalogCardBadgeProps, CatalogCardBadges, type CatalogCardBadgesProps, CatalogCardDescription, type CatalogCardDescriptionProps, CatalogCardHeader, type CatalogCardHeaderProps, type CatalogCardProps, CatalogCardTitle, type CatalogCardTitleProps, CatalogCategorySection, type CatalogCategorySectionProps, type CatalogClassNames, type CatalogComponentOverrides, type CatalogConfig, CatalogCopyId, type CatalogCopyIdProps, CatalogCreditBadge, type CatalogCreditBadgeProps, CatalogDocsBadge, type CatalogDocsBadgeProps, CatalogFieldBadge, type CatalogFieldBadgeProps, type CatalogFieldBadgeState, CatalogProvider, CatalogProviderAvatars, type CatalogProviderAvatarsProps, type CatalogProviderProps, CatalogRoot, type CostMode, type EffectCardData, EffectCatalog, EffectCatalogCard, EffectCatalogCardContext, type EffectCatalogCardContextValue, type EffectCatalogCardProps, type EffectCatalogCardState, EffectCatalogCategoryFilter, type EffectCatalogCategoryFilterProps, type EffectCatalogCategoryFilterState, EffectCatalogContext, type EffectCatalogContextValue, EffectCatalogEmpty, type EffectCatalogEmptyProps, type EffectCatalogEmptyState, type EffectCatalogInstanceProps, EffectCatalogList, type EffectCatalogListProps, type EffectCatalogListState, type EffectCatalogProps, EffectCatalogSearchFilter, type EffectCatalogSearchFilterProps, type EffectCatalogSearchFilterState, type EffectCatalogZeroConfigProps, EmojiGlyph, type FieldAdapterMap, type GeneratedFieldProps as FieldHandle, type FieldKind, type FieldMeta, FieldRenderer, FieldTypeBadge, type FormClassNames, type FormComponents, type FormConfig, type FormErrorEntry, type FormErrors, type FormFieldState, type FormHandle, FormProvider, type FormResetFieldOptions, type FormResetOptions, FormRoot, type FormSetValueOptions, type FormStateSnapshot, type GroupMap, type GroupOverride, IconGlyph, type InputFieldEntries, LogoUrl, type OutputFieldEntries, type PathMap, type PathOverride, type ActiveFilter as PipeActiveFilter, type PipeCardData, PipeCatalog, PipeCatalogActiveFilters, type PipeCatalogActiveFiltersProps, type PipeCatalogActiveFiltersState, PipeCatalogCard, PipeCatalogCardContext, type PipeCatalogCardContextValue, type PipeCatalogCardProps, PipeCatalogCategoryFilter, type PipeCatalogCategoryFilterProps, type PipeCatalogCategoryFilterState, PipeCatalogColumnFilter, type PipeCatalogColumnFilterProps, PipeCatalogColumnFilters, type PipeCatalogColumnFiltersProps, PipeCatalogContext, type PipeCatalogContextValue, PipeCatalogEmpty, type PipeCatalogEmptyProps, type PipeCatalogEmptyState, PipeCatalogInputFieldFilter, type PipeCatalogInputFieldFilterProps, type PipeCatalogInstanceProps, PipeCatalogList, type PipeCatalogListProps, type PipeCatalogListState, PipeCatalogOutputFieldFilter, type PipeCatalogOutputFieldFilterProps, type PipeCatalogProps, PipeCatalogProviderFilter, type PipeCatalogProviderFilterProps, PipeCatalogSearchFilter, type PipeCatalogSearchFilterProps, type PipeCatalogSearchFilterState, PipeCatalogTagFilter, type PipeCatalogTagFilterProps, type PipeCatalogZeroConfigProps, type PipeColumnFilterId, type ColumnFilterState as PipeColumnFilterState, PipeForm, PipeFormContent, PipeFormContext, PipeFormErrors, PipeFormField, PipeFormFooter, PipeFormGroup, PipeFormHeader, type PipeFormInstanceProps, type PipeFormProps, PipeFormSection, PipeFormSubmitButton, PipeFormTitle, type PipeFormZeroConfigProps, PricingBadge, ProviderLogo, type ActiveFilter$1 as SearchActiveFilter, type SearchCardData, SearchCatalog, SearchCatalogActiveFilters, type SearchCatalogActiveFiltersProps, type SearchCatalogActiveFiltersState, SearchCatalogCard, SearchCatalogCardContext, type SearchCatalogCardContextValue, type SearchCatalogCardProps, SearchCatalogCategoryFilter, type SearchCatalogCategoryFilterProps, type SearchCatalogCategoryFilterState, SearchCatalogColumnFilter, type SearchCatalogColumnFilterProps, SearchCatalogColumnFilters, type SearchCatalogColumnFiltersProps, SearchCatalogContext, type SearchCatalogContextValue, SearchCatalogEmpty, type SearchCatalogEmptyProps, type SearchCatalogEmptyState, type SearchCatalogInstanceProps, SearchCatalogList, type SearchCatalogListProps, type SearchCatalogListState, SearchCatalogOutputFieldFilter, type SearchCatalogOutputFieldFilterProps, type SearchCatalogProps, SearchCatalogProviderFilter, type SearchCatalogProviderFilterProps, SearchCatalogSearchFilter, type SearchCatalogSearchFilterProps, type SearchCatalogSearchFilterState, SearchCatalogTagFilter, type SearchCatalogTagFilterProps, type SearchCatalogZeroConfigProps, type SearchColumnFilterId, type ColumnFilterState$1 as SearchColumnFilterState, SearchForm, SearchFormContent, SearchFormContext, SearchFormErrors, SearchFormField, SearchFormFooter, SearchFormGroup, SearchFormHeader, type SearchFormInstanceProps, type SearchFormProps, SearchFormSection, SearchFormSubmitButton, SearchFormTitle, type SearchFormZeroConfigProps, type SearchOutputFieldEntries, type ActiveFilter$2 as SearchesActiveFilter, type SearchesCardData, SearchesCatalog, SearchesCatalogActiveFilters, type SearchesCatalogActiveFiltersProps, type SearchesCatalogActiveFiltersState, SearchesCatalogCard, SearchesCatalogCardContext, type SearchesCatalogCardContextValue, type SearchesCatalogCardProps, SearchesCatalogCategoryFilter, type SearchesCatalogCategoryFilterProps, type SearchesCatalogCategoryFilterState, SearchesCatalogColumnFilter, type SearchesCatalogColumnFilterProps, SearchesCatalogColumnFilters, type SearchesCatalogColumnFiltersProps, SearchesCatalogContext, type SearchesCatalogContextValue, SearchesCatalogEmpty, type SearchesCatalogEmptyProps, type SearchesCatalogEmptyState, type SearchesCatalogInstanceProps, SearchesCatalogList, type SearchesCatalogListProps, type SearchesCatalogListState, SearchesCatalogOutputFieldFilter, type SearchesCatalogOutputFieldFilterProps, type SearchesCatalogProps, SearchesCatalogProviderFilter, type SearchesCatalogProviderFilterProps, SearchesCatalogSearchFilter, type SearchesCatalogSearchFilterProps, type SearchesCatalogSearchFilterState, SearchesCatalogTagFilter, type SearchesCatalogTagFilterProps, type SearchesCatalogZeroConfigProps, type SearchesColumnFilterId, type ColumnFilterState$2 as SearchesColumnFilterState, type SearchesOutputFieldEntries, type SectionMap, type SectionOverride, type UseEffectCatalogTableReturn, type UsePipeCatalogTableReturn, type UsePipeFormOptions, type UsePlaybookFormOptions, type UseSearchCatalogTableReturn, type UseSearchFormOptions, type UseSearchesCatalogTableReturn, type UseSheetEffectFormOptions, type UseStreamFormOptions, WidgetStrip, WidgetView, alertVariants, defaultAdapters, fuzzyFilter, getFieldStatusIcon, getFieldTypeIcon, useCatalogConfig, useEffectCatalogCard, useEffectCatalogContext, useEffectCatalogTable, useFieldError, useFormAlert, useFormConfig, usePipeCatalogCard, usePipeCatalogContext, usePipeCatalogTable, usePipeForm, usePipeFormContext, usePlaybookForm, usePortalContainer, useSearchCatalogCard, useSearchCatalogContext, useSearchCatalogTable, useSearchForm, useSearchFormContext, useSearchesCatalogCard, useSearchesCatalogContext, useSearchesCatalogTable, useSheetEffectForm, useStreamForm };
|
package/dist/index.mjs
CHANGED
|
@@ -101,5 +101,6 @@ import { CatalogCategorySection } from "./components/defaults/catalog/category-s
|
|
|
101
101
|
import { CatalogProviderAvatars } from "./components/defaults/catalog/provider-avatars.mjs";
|
|
102
102
|
import { usePlaybookForm } from "./hooks/use-playbook-form.mjs";
|
|
103
103
|
import { useSheetEffectForm } from "./hooks/use-sheet-effect-form.mjs";
|
|
104
|
+
import { useStreamForm } from "./hooks/use-stream-form.mjs";
|
|
104
105
|
|
|
105
|
-
export { Alert, AlertDescription, AlertTitle, AvatarGroup, CatalogCard, CatalogCardBadge, CatalogCardBadges, CatalogCardDescription, CatalogCardHeader, CatalogCardTitle, CatalogCategorySection, CatalogCopyId, CatalogCreditBadge, CatalogDocsBadge, CatalogFieldBadge, CatalogProvider, CatalogProviderAvatars, CatalogRoot, EffectCatalog, EffectCatalogCard, EffectCatalogCardContext, EffectCatalogCategoryFilter, EffectCatalogContext, EffectCatalogEmpty, EffectCatalogList, EffectCatalogSearchFilter, EmojiGlyph, FieldRenderer, FieldTypeBadge, FormProvider, FormRoot, IconGlyph, LogoUrl, PipeCatalog, PipeCatalogActiveFilters, PipeCatalogCard, PipeCatalogCardContext, PipeCatalogCategoryFilter, PipeCatalogColumnFilter, PipeCatalogColumnFilters, PipeCatalogContext, PipeCatalogEmpty, PipeCatalogInputFieldFilter, PipeCatalogList, PipeCatalogOutputFieldFilter, PipeCatalogProviderFilter, PipeCatalogSearchFilter, PipeCatalogTagFilter, PipeForm, PipeFormContent, PipeFormContext, PipeFormErrors, PipeFormField, PipeFormFooter, PipeFormGroup, PipeFormHeader, PipeFormSection, PipeFormSubmitButton, PipeFormTitle, PricingBadge, ProviderLogo, SearchCatalog, SearchCatalogActiveFilters, SearchCatalogCard, SearchCatalogCardContext, SearchCatalogCategoryFilter, SearchCatalogColumnFilter, SearchCatalogColumnFilters, SearchCatalogContext, SearchCatalogEmpty, SearchCatalogList, SearchCatalogOutputFieldFilter, SearchCatalogProviderFilter, SearchCatalogSearchFilter, SearchCatalogTagFilter, SearchForm, SearchFormContent, SearchFormContext, SearchFormErrors, SearchFormField, SearchFormFooter, SearchFormGroup, SearchFormHeader, SearchFormSection, SearchFormSubmitButton, SearchFormTitle, SearchesCatalog, SearchesCatalogActiveFilters, SearchesCatalogCard, SearchesCatalogCardContext, SearchesCatalogCategoryFilter, SearchesCatalogColumnFilter, SearchesCatalogColumnFilters, SearchesCatalogContext, SearchesCatalogEmpty, SearchesCatalogList, SearchesCatalogOutputFieldFilter, SearchesCatalogProviderFilter, SearchesCatalogSearchFilter, SearchesCatalogTagFilter, WidgetStrip, WidgetView, alertVariants, defaultAdapters, fuzzyFilter, getFieldStatusIcon, getFieldTypeIcon, useCatalogConfig, useEffectCatalogCard, useEffectCatalogContext, useEffectCatalogTable, useFieldError, useFormAlert, useFormConfig, usePipeCatalogCard, usePipeCatalogContext, usePipeCatalogTable, usePipeForm, usePipeFormContext, usePlaybookForm, usePortalContainer, useSearchCatalogCard, useSearchCatalogContext, useSearchCatalogTable, useSearchForm, useSearchFormContext, useSearchesCatalogCard, useSearchesCatalogContext, useSearchesCatalogTable, useSheetEffectForm };
|
|
106
|
+
export { Alert, AlertDescription, AlertTitle, AvatarGroup, CatalogCard, CatalogCardBadge, CatalogCardBadges, CatalogCardDescription, CatalogCardHeader, CatalogCardTitle, CatalogCategorySection, CatalogCopyId, CatalogCreditBadge, CatalogDocsBadge, CatalogFieldBadge, CatalogProvider, CatalogProviderAvatars, CatalogRoot, EffectCatalog, EffectCatalogCard, EffectCatalogCardContext, EffectCatalogCategoryFilter, EffectCatalogContext, EffectCatalogEmpty, EffectCatalogList, EffectCatalogSearchFilter, EmojiGlyph, FieldRenderer, FieldTypeBadge, FormProvider, FormRoot, IconGlyph, LogoUrl, PipeCatalog, PipeCatalogActiveFilters, PipeCatalogCard, PipeCatalogCardContext, PipeCatalogCategoryFilter, PipeCatalogColumnFilter, PipeCatalogColumnFilters, PipeCatalogContext, PipeCatalogEmpty, PipeCatalogInputFieldFilter, PipeCatalogList, PipeCatalogOutputFieldFilter, PipeCatalogProviderFilter, PipeCatalogSearchFilter, PipeCatalogTagFilter, PipeForm, PipeFormContent, PipeFormContext, PipeFormErrors, PipeFormField, PipeFormFooter, PipeFormGroup, PipeFormHeader, PipeFormSection, PipeFormSubmitButton, PipeFormTitle, PricingBadge, ProviderLogo, SearchCatalog, SearchCatalogActiveFilters, SearchCatalogCard, SearchCatalogCardContext, SearchCatalogCategoryFilter, SearchCatalogColumnFilter, SearchCatalogColumnFilters, SearchCatalogContext, SearchCatalogEmpty, SearchCatalogList, SearchCatalogOutputFieldFilter, SearchCatalogProviderFilter, SearchCatalogSearchFilter, SearchCatalogTagFilter, SearchForm, SearchFormContent, SearchFormContext, SearchFormErrors, SearchFormField, SearchFormFooter, SearchFormGroup, SearchFormHeader, SearchFormSection, SearchFormSubmitButton, SearchFormTitle, SearchesCatalog, SearchesCatalogActiveFilters, SearchesCatalogCard, SearchesCatalogCardContext, SearchesCatalogCategoryFilter, SearchesCatalogColumnFilter, SearchesCatalogColumnFilters, SearchesCatalogContext, SearchesCatalogEmpty, SearchesCatalogList, SearchesCatalogOutputFieldFilter, SearchesCatalogProviderFilter, SearchesCatalogSearchFilter, SearchesCatalogTagFilter, WidgetStrip, WidgetView, alertVariants, defaultAdapters, fuzzyFilter, getFieldStatusIcon, getFieldTypeIcon, useCatalogConfig, useEffectCatalogCard, useEffectCatalogContext, useEffectCatalogTable, useFieldError, useFormAlert, useFormConfig, usePipeCatalogCard, usePipeCatalogContext, usePipeCatalogTable, usePipeForm, usePipeFormContext, usePlaybookForm, usePortalContainer, useSearchCatalogCard, useSearchCatalogContext, useSearchCatalogTable, useSearchForm, useSearchFormContext, useSearchesCatalogCard, useSearchesCatalogContext, useSearchesCatalogTable, useSheetEffectForm, useStreamForm };
|
|
@@ -172,6 +172,7 @@ interface FieldExtras {
|
|
|
172
172
|
options: Array<{
|
|
173
173
|
value: string;
|
|
174
174
|
label: string;
|
|
175
|
+
widgets?: _$_pipe0_base0.WidgetsByKind;
|
|
175
176
|
}>;
|
|
176
177
|
selected: string[];
|
|
177
178
|
onToggle: (v: string) => void;
|
|
@@ -213,6 +214,12 @@ interface FieldExtras {
|
|
|
213
214
|
exact_range_input: RangeOperatorExtras;
|
|
214
215
|
min_max_int_input: RangeFieldPair<number | null>;
|
|
215
216
|
multi_create_input: ListExtras;
|
|
217
|
+
/**
|
|
218
|
+
* One free-text value with suggestions. Only the suggestion half of
|
|
219
|
+
* `ListExtras` — there is no list to add to or remove from, so exposing
|
|
220
|
+
* `items`/`add`/`remove` would be three affordances that cannot be used.
|
|
221
|
+
*/
|
|
222
|
+
single_create_input: Pick<ListExtras, "options" | "loadOptions">;
|
|
216
223
|
/**
|
|
217
224
|
* Property list — stored as `{ property }[]` (extensible entries) but edited
|
|
218
225
|
* as a plain tag list; the handler maps between the two shapes. When the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-props.d.mts","names":[],"sources":["../../src/types/field-props.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"field-props.d.mts","names":[],"sources":["../../src/types/field-props.ts"],"mappings":"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"}
|
|
@@ -301,14 +301,10 @@ function buildExtras(meta, base, publicKey, loadingCtx) {
|
|
|
301
301
|
next.splice(to, 0, moved);
|
|
302
302
|
base.setValue(next);
|
|
303
303
|
};
|
|
304
|
-
|
|
305
|
-
if (m.suggestionsDef?.options) if (typeof m.suggestionsDef.options === "function") result.loadOptions = async (query) => withMergedWidgets(await m.suggestionsDef.options({
|
|
306
|
-
query,
|
|
307
|
-
token: publicKey
|
|
308
|
-
}), m.suggestionsDef.widgets);
|
|
309
|
-
else result.options = withMergedWidgets(m.suggestionsDef.options, m.suggestionsDef.widgets);
|
|
304
|
+
Object.assign(result, suggestionExtras(meta, publicKey));
|
|
310
305
|
return result;
|
|
311
306
|
}
|
|
307
|
+
if (inputGuards.single_create_input(meta)) return suggestionExtras(meta, publicKey);
|
|
312
308
|
if (inputGuards.property_list_input(meta)) {
|
|
313
309
|
const value = base.value ?? [];
|
|
314
310
|
const result = {
|
|
@@ -377,6 +373,22 @@ function buildExtras(meta, base, publicKey, loadingCtx) {
|
|
|
377
373
|
}
|
|
378
374
|
return {};
|
|
379
375
|
}
|
|
376
|
+
/**
|
|
377
|
+
* Turn a `suggestionsDef` into the options a combobox can render.
|
|
378
|
+
*
|
|
379
|
+
* Shared by the list and single create inputs. Kept in one place because the
|
|
380
|
+
* static/async split is easy to get subtly different in a second copy, and the
|
|
381
|
+
* difference would only show on the async branch.
|
|
382
|
+
*/
|
|
383
|
+
function suggestionExtras(meta, publicKey) {
|
|
384
|
+
const m = meta;
|
|
385
|
+
if (!m.suggestionsDef?.options) return {};
|
|
386
|
+
if (typeof m.suggestionsDef.options === "function") return { loadOptions: async (query) => withMergedWidgets(await m.suggestionsDef.options({
|
|
387
|
+
query,
|
|
388
|
+
token: publicKey
|
|
389
|
+
}), m.suggestionsDef.widgets) };
|
|
390
|
+
return { options: withMergedWidgets(m.suggestionsDef.options, m.suggestionsDef.widgets) };
|
|
391
|
+
}
|
|
380
392
|
function isEmptyValue(value) {
|
|
381
393
|
if (value === null || typeof value === "undefined") return true;
|
|
382
394
|
if (typeof value === "string") return value === "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-section-handlers.mjs","names":[],"sources":["../../src/utils/build-section-handlers.ts"],"sourcesContent":["import type { FormSection, GeneratedInputMeta, SecretSuggestion, StoreOption } from \"@pipe0/base\";\nimport { inputGuards } from \"@pipe0/base\";\nimport type { UseFormReturn } from \"react-hook-form\";\nimport type { FieldLoadState } from \"../hooks/use-form-core.js\";\nimport type {\n AnyFieldProps,\n ConstantSuggestion,\n GeneratedFieldProps,\n} from \"../types/field-props.js\";\nimport type { FormGroupHandle, FormSectionHandle } from \"../types/form-handle.js\";\n\nexport interface FieldLoadingContext {\n /** Per-field load states for dynamic context_select_input fields, keyed by path. */\n fieldLoadStates: Record<string, FieldLoadState>;\n /**\n * Curried per-keystroke secrets searcher. Bundles the form-level\n * `environment` / `scopes` / `teamId` so adapters only need to pass the\n * user's typed query. Returns `[]` when no `getSecrets` resolver is wired.\n */\n searchSecrets?: (query: string) => Promise<SecretSuggestion[]>;\n /**\n * Curried per-keystroke constants searcher. Mirrors `searchSecrets`.\n * Returns `[]` when no `getConstants` resolver is wired.\n */\n searchConstants?: (query: string) => Promise<ConstantSuggestion[]>;\n /**\n * Curried per-keystroke field-context searcher: server-side option search\n * for ONE optionsDef-capable field (bundles the live payload). Returns the\n * options directly — never merged into the shared form store. Absent when\n * no `getFieldContext` resolver is wired.\n */\n searchFieldContext?: (fieldPath: string, query: string) => Promise<StoreOption[]>;\n}\n\n/**\n * Builds a fully-typed `GeneratedFieldProps` from raw metadata + form state.\n *\n * The returned object includes:\n * - Base props (kind, meta, value, setValue, error, etc.)\n * - Kind-specific extras (inputProps, options, toggle, etc.)\n */\nexport function buildFieldProps<Meta extends GeneratedInputMeta>(\n meta: Meta,\n form: UseFormReturn<Record<string, unknown>>,\n publicKey: string,\n loadingCtx?: FieldLoadingContext,\n): GeneratedFieldProps<Meta[\"type\"]> {\n const path = meta.path;\n const fieldState = form.getFieldState(path as any);\n const value = form.getValues(path as any);\n const id = `p0-field-${path.replace(/\\./g, \"-\")}`;\n\n const setValue = (v: unknown) =>\n form.setValue(path as any, v, {\n shouldDirty: true,\n shouldTouch: true,\n shouldValidate: true,\n });\n\n // Match the submit-gated behavior used everywhere else (group errorCount,\n // `useFieldError`): don't surface the field's error until the user has\n // attempted a submit. Otherwise `setValue`-triggered validation would\n // flash errors the moment the form is interacted with.\n const hasSubmitted = form.formState.isSubmitted;\n\n const loadState = loadingCtx?.fieldLoadStates?.[path];\n\n const base = {\n kind: meta.type,\n meta,\n form,\n path,\n label: meta.label ?? \"\",\n description: meta.description,\n info: meta.info,\n error: hasSubmitted ? fieldState.error?.message : undefined,\n touched: fieldState.isTouched,\n dirty: fieldState.isDirty,\n id,\n value,\n setValue,\n reset: () => form.resetField(path as any),\n disabled: loadState?.disabled ?? false,\n disabledReason: loadState?.disabledReason,\n };\n\n const extras = buildExtras(meta, { path, id, value, setValue }, publicKey, loadingCtx);\n\n return { ...base, ...extras } as unknown as GeneratedFieldProps<Meta[\"type\"]>;\n}\n\n// Re-export under old name for backward compat\nexport { buildFieldProps as buildFieldHandle };\n\ntype OptionLike = {\n value: string;\n label: string;\n widgets?: Record<string, Record<string, unknown>>;\n};\n\nfunction withMergedWidgets<T extends OptionLike>(\n options: T[],\n staticWidgets: Record<string, Record<string, unknown>> | undefined,\n): T[] {\n if (!staticWidgets) return options;\n return options.map((o) => ({\n ...o,\n widgets: { ...staticWidgets, ...(o.widgets ?? {}) },\n }));\n}\n\nfunction buildExtras(\n meta: GeneratedInputMeta,\n base: {\n path: string;\n id: string;\n value: unknown;\n setValue: (v: unknown) => void;\n },\n publicKey: string,\n loadingCtx?: FieldLoadingContext,\n): Record<string, unknown> {\n if (\n inputGuards.text_input(meta) ||\n inputGuards.int_input(meta) ||\n inputGuards.number_input(meta)\n ) {\n const isNumber = inputGuards.int_input(meta) || inputGuards.number_input(meta);\n return {\n inputProps: {\n type: isNumber ? \"number\" : (meta as any).inputType || \"text\",\n name: base.path,\n id: base.id,\n value: base.value != null ? String(base.value) : \"\",\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n const v = e.target.value;\n base.setValue(isNumber ? (v === \"\" ? null : Number(v)) : v);\n },\n placeholder: meta.placeholder,\n step: inputGuards.number_input(meta) ? \"0.001\" : undefined,\n },\n };\n }\n\n if (inputGuards.textarea_input(meta)) {\n return {\n textareaProps: {\n name: base.path,\n id: base.id,\n value: (base.value as string) ?? \"\",\n onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => base.setValue(e.target.value),\n placeholder: meta.placeholder,\n rows: meta.rows,\n },\n };\n }\n\n if (inputGuards.select_input(meta)) {\n return {\n options: meta.options ?? [],\n selectedValue: (base.value as string) ?? \"\",\n onSelect: (v: string) => base.setValue(v),\n };\n }\n\n if (inputGuards.context_select_input(meta)) {\n const loadState = loadingCtx?.fieldLoadStates?.[meta.path];\n const searchFieldContext = loadingCtx?.searchFieldContext;\n return {\n options: meta.options ?? [],\n selectedValue: (base.value as string) ?? \"\",\n onSelect: (v: string) => base.setValue(v),\n pending: loadState?.status === \"loading\",\n suggestionsDisabled: loadState?.suggestionsDisabled ?? false,\n suggestionsDisabledReason: loadState?.suggestionsDisabledReason,\n // Per-keystroke server-side search through the field-context channel.\n // Static widgets merge exactly as `resolveField` does for store options.\n loadOptions: searchFieldContext\n ? async (query: string) =>\n withMergedWidgets(await searchFieldContext(meta.path, query), meta.optionsDef?.widgets)\n : undefined,\n };\n }\n\n if (inputGuards.tagged_text_input(meta)) {\n const loadState = loadingCtx?.fieldLoadStates?.[meta.path];\n return {\n options: meta.options ?? [],\n pending: loadState?.status === \"loading\",\n suggestionsDisabled: loadState?.suggestionsDisabled ?? false,\n suggestionsDisabledReason: loadState?.suggestionsDisabledReason,\n searchSecrets: loadingCtx?.searchSecrets,\n searchConstants: loadingCtx?.searchConstants,\n };\n }\n\n if (inputGuards.providers_input(meta)) {\n return {\n options: meta.options ?? [],\n };\n }\n\n if (inputGuards.multi_select_input(meta)) {\n const selected = (base.value as string[]) ?? [];\n return {\n options: meta.options ?? [],\n selected,\n onToggle: (v: string) =>\n base.setValue(selected.includes(v) ? selected.filter((s) => s !== v) : [...selected, v]),\n onClear: () => base.setValue([]),\n };\n }\n\n if (inputGuards.async_multi_select_input(meta)) {\n const selected = (base.value as string[]) ?? [];\n return {\n loadOptions: async (query: string) =>\n withMergedWidgets(\n await meta.optionsDef.options({ query, token: publicKey }),\n meta.optionsDef.widgets,\n ),\n selected,\n onToggle: (v: string) =>\n base.setValue(selected.includes(v) ? selected.filter((s) => s !== v) : [...selected, v]),\n onClear: () => base.setValue([]),\n };\n }\n\n if (inputGuards.boolean_input(meta) || inputGuards.nullable_boolean_input(meta)) {\n return {\n checked: base.value === true,\n isNull: base.value === null || base.value === undefined,\n toggle: () => base.setValue(base.value === true ? false : true),\n clear: () => base.setValue(null),\n };\n }\n\n if (\n inputGuards.include_exclude_input(meta) ||\n inputGuards.include_exclude_select_input(meta) ||\n inputGuards.async_include_exclude_select_input(meta)\n ) {\n const current = (base.value as {\n include: string[];\n exclude: string[];\n }) ?? { include: [], exclude: [] };\n const result: Record<string, unknown> = {\n include: {\n value: current.include,\n add: (v: string) => base.setValue({ ...current, include: [...current.include, v] }),\n remove: (v: string) =>\n base.setValue({\n ...current,\n include: current.include.filter((i) => i !== v),\n }),\n },\n exclude: {\n value: current.exclude,\n add: (v: string) => base.setValue({ ...current, exclude: [...current.exclude, v] }),\n remove: (v: string) =>\n base.setValue({\n ...current,\n exclude: current.exclude.filter((i) => i !== v),\n }),\n },\n };\n const m = meta as any;\n if (m.optionsDef?.options && typeof m.optionsDef.options === \"function\") {\n result.loadOptions = async (query: string) =>\n withMergedWidgets(\n await m.optionsDef.options({ query, token: publicKey }),\n m.optionsDef.widgets,\n );\n } else if (m.optionsDef?.options) {\n result.options = withMergedWidgets(m.optionsDef.options, m.optionsDef.widgets);\n }\n if (m.suggestionsDef?.options) {\n if (typeof m.suggestionsDef.options === \"function\") {\n result.loadOptions = async (query: string) =>\n withMergedWidgets(\n await m.suggestionsDef.options({ query, token: publicKey }),\n m.suggestionsDef.widgets,\n );\n } else {\n result.options = withMergedWidgets(m.suggestionsDef.options, m.suggestionsDef.widgets);\n }\n }\n return result;\n }\n\n if (inputGuards.range_input(meta)) {\n const current = (base.value as {\n from: number | null;\n to: number | null;\n }) ?? { from: null, to: null };\n return {\n from: {\n value: current.from,\n set: (v: number | null) => base.setValue({ ...current, from: v }),\n },\n to: {\n value: current.to,\n set: (v: number | null) => base.setValue({ ...current, to: v }),\n },\n };\n }\n\n if (inputGuards.date_range_input(meta)) {\n const current = (base.value as Record<string, string>) ?? {};\n return {\n from: {\n value: current.gte ?? current.gt ?? \"\",\n set: (v: string) => base.setValue({ ...current, gte: v }),\n },\n to: {\n value: current.lte ?? current.lt ?? \"\",\n set: (v: string) => base.setValue({ ...current, lte: v }),\n },\n };\n }\n\n if (inputGuards.exact_range_input(meta)) {\n const current = (base.value as Record<string, number | null>) ?? {};\n return {\n greaterThan: {\n operator: current.gt != null ? \"gt\" : \"gte\",\n value: current.gt ?? current.gte ?? null,\n setOperator: (op: string) => {\n const otherOp = op === \"gt\" ? \"gte\" : \"gt\";\n const val = current[otherOp] ?? current[op];\n const updated = { ...current };\n delete updated[otherOp];\n if (val != null) updated[op] = val;\n base.setValue(updated);\n },\n setValue: (v: number | null) => {\n const op = current.gt != null ? \"gt\" : \"gte\";\n const updated = { ...current };\n if (v != null) updated[op] = v;\n else delete updated[op];\n base.setValue(updated);\n },\n },\n lessThan: {\n operator: current.lt != null ? \"lt\" : \"lte\",\n value: current.lt ?? current.lte ?? null,\n setOperator: (op: string) => {\n const otherOp = op === \"lt\" ? \"lte\" : \"lt\";\n const val = current[otherOp] ?? current[op];\n const updated = { ...current };\n delete updated[otherOp];\n if (val != null) updated[op] = val;\n base.setValue(updated);\n },\n setValue: (v: number | null) => {\n const op = current.lt != null ? \"lt\" : \"lte\";\n const updated = { ...current };\n if (v != null) updated[op] = v;\n else delete updated[op];\n base.setValue(updated);\n },\n },\n };\n }\n\n if (inputGuards.min_max_int_input(meta)) {\n const current = (base.value as {\n min: number | null;\n max: number | null;\n }) ?? { min: null, max: null };\n return {\n from: {\n value: current.min,\n set: (v: number | null) => base.setValue({ ...current, min: v }),\n },\n to: {\n value: current.max,\n set: (v: number | null) => base.setValue({ ...current, max: v }),\n },\n };\n }\n\n if (inputGuards.multi_create_input(meta) || inputGuards.ordered_multi_create_input(meta)) {\n const items = (base.value as string[]) ?? [];\n const result: Record<string, unknown> = {\n items,\n add: (v: string) => base.setValue([...items, v]),\n remove: (v: string) => base.setValue(items.filter((i) => i !== v)),\n };\n if (inputGuards.ordered_multi_create_input(meta)) {\n result.reorder = (from: number, to: number) => {\n const next = [...items];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n base.setValue(next);\n };\n }\n const m = meta as any;\n if (m.suggestionsDef?.options) {\n if (typeof m.suggestionsDef.options === \"function\") {\n result.loadOptions = async (query: string) =>\n withMergedWidgets(\n await m.suggestionsDef.options({ query, token: publicKey }),\n m.suggestionsDef.widgets,\n );\n } else {\n result.options = withMergedWidgets(m.suggestionsDef.options, m.suggestionsDef.widgets);\n }\n }\n return result;\n }\n\n if (inputGuards.property_list_input(meta)) {\n // Stored shape is `{ property }[]` (extensible entries); the tag editor\n // works on plain strings, so map between the two here.\n const value = (base.value as { property: string }[]) ?? [];\n const result: Record<string, unknown> = {\n items: value.map((entry) => entry.property),\n add: (v: string) => base.setValue([...value, { property: v }]),\n remove: (v: string) => base.setValue(value.filter((entry) => entry.property !== v)),\n };\n const m = meta as any;\n if (m.suggestionsDef?.options) {\n if (typeof m.suggestionsDef.options === \"function\") {\n result.loadOptions = async (query: string) =>\n withMergedWidgets(\n await m.suggestionsDef.options({ query, token: publicKey }),\n m.suggestionsDef.widgets,\n );\n } else {\n result.options = withMergedWidgets(m.suggestionsDef.options, m.suggestionsDef.widgets);\n }\n }\n if (m.optionsDef) {\n // Connection-scoped suggestions (same channel as `context_select_input`):\n // per-keystroke server-side fetch with the user's connection secret.\n // Suggestion-only — the field lists the provider's actual attributes,\n // so free-form entries are disallowed.\n const loadState = loadingCtx?.fieldLoadStates?.[meta.path];\n const searchFieldContext = loadingCtx?.searchFieldContext;\n result.options = (meta as { options?: unknown }).options ?? [];\n result.pending = loadState?.status === \"loading\";\n result.suggestionsDisabled = loadState?.suggestionsDisabled ?? false;\n result.suggestionsDisabledReason = loadState?.suggestionsDisabledReason;\n result.allowCreate = false;\n if (searchFieldContext) {\n result.loadOptions = async (query: string) =>\n withMergedWidgets(await searchFieldContext(meta.path, query), m.optionsDef.widgets);\n }\n }\n return result;\n }\n\n if (inputGuards.tagged_ordered_multi_create_input(meta)) {\n const items = (base.value as string[]) ?? [];\n const result: Record<string, unknown> = {\n items,\n setItems: (next: string[]) => base.setValue(next),\n inputFields: meta.inputFields ?? [],\n };\n const m = meta as any;\n if (m.suggestionsDef?.options) {\n if (typeof m.suggestionsDef.options === \"function\") {\n result.loadOptions = async (query: string) =>\n withMergedWidgets(\n await m.suggestionsDef.options({ query, token: publicKey }),\n m.suggestionsDef.widgets,\n );\n } else {\n result.options = withMergedWidgets(m.suggestionsDef.options, m.suggestionsDef.widgets);\n }\n }\n return result;\n }\n\n if (inputGuards.loose_object_input(meta)) {\n const value = (base.value as Record<string, string>) ?? {};\n return {\n value,\n setObject: (next: Record<string, string>) => base.setValue(next),\n searchSecrets: loadingCtx?.searchSecrets,\n searchConstants: loadingCtx?.searchConstants,\n };\n }\n\n if (inputGuards.prompt_input(meta) || inputGuards.template_input(meta)) {\n return {\n searchSecrets: loadingCtx?.searchSecrets,\n searchConstants: loadingCtx?.searchConstants,\n };\n }\n\n if (inputGuards.condition_block_input(meta)) {\n const loadState = loadingCtx?.fieldLoadStates?.[meta.path];\n return {\n searchSecrets: loadingCtx?.searchSecrets,\n searchConstants: loadingCtx?.searchConstants,\n // Field-name suggestions themselves ride on `meta.options` (merged from\n // the form store by `resolveField`); only the load state comes through.\n pending: loadState?.status === \"loading\",\n };\n }\n\n if (inputGuards.field_select_input(meta)) {\n const loadState = loadingCtx?.fieldLoadStates?.[meta.path];\n return {\n options: meta.options ?? [],\n pending: loadState?.status === \"loading\",\n suggestionsDisabled: loadState?.suggestionsDisabled ?? false,\n suggestionsDisabledReason: loadState?.suggestionsDisabledReason,\n };\n }\n\n // Remaining types need no extras beyond base\n return {};\n}\n\nfunction isEmptyValue(value: unknown): boolean {\n if (value === null || typeof value === \"undefined\") return true;\n if (typeof value === \"string\") return value === \"\";\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === \"object\") {\n const keys = Object.keys(value);\n if (keys.length === 0) return true;\n return keys.every((k) => isEmptyValue((value as Record<string, unknown>)[k]));\n }\n return false;\n}\n\nexport function buildSectionHandles(\n formConfig: FormSection[],\n form: UseFormReturn<Record<string, unknown>>,\n publicKey: string,\n loadingCtx?: FieldLoadingContext,\n): FormSectionHandle[] {\n // In onSubmit validation mode, don't flag groups as invalid until the\n // user has actually attempted a submit. This matches RHF's own field-level\n // behavior where `formState.errors` is only populated after the first\n // submit (and updated reactively thereafter per `reValidateMode`).\n const hasSubmitted = form.formState.isSubmitted;\n\n return formConfig\n .map((section) => {\n const groups: FormGroupHandle[] = section.groups\n .map((group) => {\n // Drop a connector field whose mode is \"disabled\" (custom connections\n // unsupported) — there's nothing to configure, so we hide the whole\n // group/section rather than render a \"not supported\" placeholder.\n const fields = group.fields\n .filter(\n (meta) => !(inputGuards.connector_input(meta) && meta.connectorMode === \"disabled\"),\n )\n .map((meta) => buildFieldProps(meta, form, publicKey, loadingCtx)) as AnyFieldProps[];\n\n const groupPathError = form.getFieldState(group.groupPath as any).error;\n const errorCount = hasSubmitted\n ? fields.filter((f) => f.error != null).length + (groupPathError ? 1 : 0)\n : 0;\n const setCount = fields.filter((f) => !isEmptyValue(f.value)).length;\n const dirtyCount = fields.filter((f) => f.dirty).length;\n\n return {\n key: group.groupPath,\n label: group.label,\n description: group.description,\n iconKey: group.iconKey,\n defaultExpand: group.defaultExpand ?? false,\n fields,\n errorCount,\n setCount,\n dirtyCount,\n };\n })\n .filter((group) => group.fields.length > 0);\n\n return {\n key: section.metadata.path,\n label: section.metadata.label,\n description: section.metadata.description,\n groups,\n };\n })\n .filter((section) => section.groups.length > 0);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"build-section-handlers.mjs","names":[],"sources":["../../src/utils/build-section-handlers.ts"],"sourcesContent":["import type { FormSection, GeneratedInputMeta, SecretSuggestion, StoreOption } from \"@pipe0/base\";\nimport { inputGuards } from \"@pipe0/base\";\nimport type { UseFormReturn } from \"react-hook-form\";\nimport type { FieldLoadState } from \"../hooks/use-form-core.js\";\nimport type {\n AnyFieldProps,\n ConstantSuggestion,\n GeneratedFieldProps,\n} from \"../types/field-props.js\";\nimport type { FormGroupHandle, FormSectionHandle } from \"../types/form-handle.js\";\n\nexport interface FieldLoadingContext {\n /** Per-field load states for dynamic context_select_input fields, keyed by path. */\n fieldLoadStates: Record<string, FieldLoadState>;\n /**\n * Curried per-keystroke secrets searcher. Bundles the form-level\n * `environment` / `scopes` / `teamId` so adapters only need to pass the\n * user's typed query. Returns `[]` when no `getSecrets` resolver is wired.\n */\n searchSecrets?: (query: string) => Promise<SecretSuggestion[]>;\n /**\n * Curried per-keystroke constants searcher. Mirrors `searchSecrets`.\n * Returns `[]` when no `getConstants` resolver is wired.\n */\n searchConstants?: (query: string) => Promise<ConstantSuggestion[]>;\n /**\n * Curried per-keystroke field-context searcher: server-side option search\n * for ONE optionsDef-capable field (bundles the live payload). Returns the\n * options directly — never merged into the shared form store. Absent when\n * no `getFieldContext` resolver is wired.\n */\n searchFieldContext?: (fieldPath: string, query: string) => Promise<StoreOption[]>;\n}\n\n/**\n * Builds a fully-typed `GeneratedFieldProps` from raw metadata + form state.\n *\n * The returned object includes:\n * - Base props (kind, meta, value, setValue, error, etc.)\n * - Kind-specific extras (inputProps, options, toggle, etc.)\n */\nexport function buildFieldProps<Meta extends GeneratedInputMeta>(\n meta: Meta,\n form: UseFormReturn<Record<string, unknown>>,\n publicKey: string,\n loadingCtx?: FieldLoadingContext,\n): GeneratedFieldProps<Meta[\"type\"]> {\n const path = meta.path;\n const fieldState = form.getFieldState(path as any);\n const value = form.getValues(path as any);\n const id = `p0-field-${path.replace(/\\./g, \"-\")}`;\n\n const setValue = (v: unknown) =>\n form.setValue(path as any, v, {\n shouldDirty: true,\n shouldTouch: true,\n shouldValidate: true,\n });\n\n // Match the submit-gated behavior used everywhere else (group errorCount,\n // `useFieldError`): don't surface the field's error until the user has\n // attempted a submit. Otherwise `setValue`-triggered validation would\n // flash errors the moment the form is interacted with.\n const hasSubmitted = form.formState.isSubmitted;\n\n const loadState = loadingCtx?.fieldLoadStates?.[path];\n\n const base = {\n kind: meta.type,\n meta,\n form,\n path,\n label: meta.label ?? \"\",\n description: meta.description,\n info: meta.info,\n error: hasSubmitted ? fieldState.error?.message : undefined,\n touched: fieldState.isTouched,\n dirty: fieldState.isDirty,\n id,\n value,\n setValue,\n reset: () => form.resetField(path as any),\n disabled: loadState?.disabled ?? false,\n disabledReason: loadState?.disabledReason,\n };\n\n const extras = buildExtras(meta, { path, id, value, setValue }, publicKey, loadingCtx);\n\n return { ...base, ...extras } as unknown as GeneratedFieldProps<Meta[\"type\"]>;\n}\n\n// Re-export under old name for backward compat\nexport { buildFieldProps as buildFieldHandle };\n\ntype OptionLike = {\n value: string;\n label: string;\n widgets?: Record<string, Record<string, unknown>>;\n};\n\nfunction withMergedWidgets<T extends OptionLike>(\n options: T[],\n staticWidgets: Record<string, Record<string, unknown>> | undefined,\n): T[] {\n if (!staticWidgets) return options;\n return options.map((o) => ({\n ...o,\n widgets: { ...staticWidgets, ...(o.widgets ?? {}) },\n }));\n}\n\nfunction buildExtras(\n meta: GeneratedInputMeta,\n base: {\n path: string;\n id: string;\n value: unknown;\n setValue: (v: unknown) => void;\n },\n publicKey: string,\n loadingCtx?: FieldLoadingContext,\n): Record<string, unknown> {\n if (\n inputGuards.text_input(meta) ||\n inputGuards.int_input(meta) ||\n inputGuards.number_input(meta)\n ) {\n const isNumber = inputGuards.int_input(meta) || inputGuards.number_input(meta);\n return {\n inputProps: {\n type: isNumber ? \"number\" : (meta as any).inputType || \"text\",\n name: base.path,\n id: base.id,\n value: base.value != null ? String(base.value) : \"\",\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n const v = e.target.value;\n base.setValue(isNumber ? (v === \"\" ? null : Number(v)) : v);\n },\n placeholder: meta.placeholder,\n step: inputGuards.number_input(meta) ? \"0.001\" : undefined,\n },\n };\n }\n\n if (inputGuards.textarea_input(meta)) {\n return {\n textareaProps: {\n name: base.path,\n id: base.id,\n value: (base.value as string) ?? \"\",\n onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => base.setValue(e.target.value),\n placeholder: meta.placeholder,\n rows: meta.rows,\n },\n };\n }\n\n if (inputGuards.select_input(meta)) {\n return {\n options: meta.options ?? [],\n selectedValue: (base.value as string) ?? \"\",\n onSelect: (v: string) => base.setValue(v),\n };\n }\n\n if (inputGuards.context_select_input(meta)) {\n const loadState = loadingCtx?.fieldLoadStates?.[meta.path];\n const searchFieldContext = loadingCtx?.searchFieldContext;\n return {\n options: meta.options ?? [],\n selectedValue: (base.value as string) ?? \"\",\n onSelect: (v: string) => base.setValue(v),\n pending: loadState?.status === \"loading\",\n suggestionsDisabled: loadState?.suggestionsDisabled ?? false,\n suggestionsDisabledReason: loadState?.suggestionsDisabledReason,\n // Per-keystroke server-side search through the field-context channel.\n // Static widgets merge exactly as `resolveField` does for store options.\n loadOptions: searchFieldContext\n ? async (query: string) =>\n withMergedWidgets(await searchFieldContext(meta.path, query), meta.optionsDef?.widgets)\n : undefined,\n };\n }\n\n if (inputGuards.tagged_text_input(meta)) {\n const loadState = loadingCtx?.fieldLoadStates?.[meta.path];\n return {\n options: meta.options ?? [],\n pending: loadState?.status === \"loading\",\n suggestionsDisabled: loadState?.suggestionsDisabled ?? false,\n suggestionsDisabledReason: loadState?.suggestionsDisabledReason,\n searchSecrets: loadingCtx?.searchSecrets,\n searchConstants: loadingCtx?.searchConstants,\n };\n }\n\n if (inputGuards.providers_input(meta)) {\n return {\n options: meta.options ?? [],\n };\n }\n\n if (inputGuards.multi_select_input(meta)) {\n const selected = (base.value as string[]) ?? [];\n return {\n options: meta.options ?? [],\n selected,\n onToggle: (v: string) =>\n base.setValue(selected.includes(v) ? selected.filter((s) => s !== v) : [...selected, v]),\n onClear: () => base.setValue([]),\n };\n }\n\n if (inputGuards.async_multi_select_input(meta)) {\n const selected = (base.value as string[]) ?? [];\n return {\n loadOptions: async (query: string) =>\n withMergedWidgets(\n await meta.optionsDef.options({ query, token: publicKey }),\n meta.optionsDef.widgets,\n ),\n selected,\n onToggle: (v: string) =>\n base.setValue(selected.includes(v) ? selected.filter((s) => s !== v) : [...selected, v]),\n onClear: () => base.setValue([]),\n };\n }\n\n if (inputGuards.boolean_input(meta) || inputGuards.nullable_boolean_input(meta)) {\n return {\n checked: base.value === true,\n isNull: base.value === null || base.value === undefined,\n toggle: () => base.setValue(base.value === true ? false : true),\n clear: () => base.setValue(null),\n };\n }\n\n if (\n inputGuards.include_exclude_input(meta) ||\n inputGuards.include_exclude_select_input(meta) ||\n inputGuards.async_include_exclude_select_input(meta)\n ) {\n const current = (base.value as {\n include: string[];\n exclude: string[];\n }) ?? { include: [], exclude: [] };\n const result: Record<string, unknown> = {\n include: {\n value: current.include,\n add: (v: string) => base.setValue({ ...current, include: [...current.include, v] }),\n remove: (v: string) =>\n base.setValue({\n ...current,\n include: current.include.filter((i) => i !== v),\n }),\n },\n exclude: {\n value: current.exclude,\n add: (v: string) => base.setValue({ ...current, exclude: [...current.exclude, v] }),\n remove: (v: string) =>\n base.setValue({\n ...current,\n exclude: current.exclude.filter((i) => i !== v),\n }),\n },\n };\n const m = meta as any;\n if (m.optionsDef?.options && typeof m.optionsDef.options === \"function\") {\n result.loadOptions = async (query: string) =>\n withMergedWidgets(\n await m.optionsDef.options({ query, token: publicKey }),\n m.optionsDef.widgets,\n );\n } else if (m.optionsDef?.options) {\n result.options = withMergedWidgets(m.optionsDef.options, m.optionsDef.widgets);\n }\n if (m.suggestionsDef?.options) {\n if (typeof m.suggestionsDef.options === \"function\") {\n result.loadOptions = async (query: string) =>\n withMergedWidgets(\n await m.suggestionsDef.options({ query, token: publicKey }),\n m.suggestionsDef.widgets,\n );\n } else {\n result.options = withMergedWidgets(m.suggestionsDef.options, m.suggestionsDef.widgets);\n }\n }\n return result;\n }\n\n if (inputGuards.range_input(meta)) {\n const current = (base.value as {\n from: number | null;\n to: number | null;\n }) ?? { from: null, to: null };\n return {\n from: {\n value: current.from,\n set: (v: number | null) => base.setValue({ ...current, from: v }),\n },\n to: {\n value: current.to,\n set: (v: number | null) => base.setValue({ ...current, to: v }),\n },\n };\n }\n\n if (inputGuards.date_range_input(meta)) {\n const current = (base.value as Record<string, string>) ?? {};\n return {\n from: {\n value: current.gte ?? current.gt ?? \"\",\n set: (v: string) => base.setValue({ ...current, gte: v }),\n },\n to: {\n value: current.lte ?? current.lt ?? \"\",\n set: (v: string) => base.setValue({ ...current, lte: v }),\n },\n };\n }\n\n if (inputGuards.exact_range_input(meta)) {\n const current = (base.value as Record<string, number | null>) ?? {};\n return {\n greaterThan: {\n operator: current.gt != null ? \"gt\" : \"gte\",\n value: current.gt ?? current.gte ?? null,\n setOperator: (op: string) => {\n const otherOp = op === \"gt\" ? \"gte\" : \"gt\";\n const val = current[otherOp] ?? current[op];\n const updated = { ...current };\n delete updated[otherOp];\n if (val != null) updated[op] = val;\n base.setValue(updated);\n },\n setValue: (v: number | null) => {\n const op = current.gt != null ? \"gt\" : \"gte\";\n const updated = { ...current };\n if (v != null) updated[op] = v;\n else delete updated[op];\n base.setValue(updated);\n },\n },\n lessThan: {\n operator: current.lt != null ? \"lt\" : \"lte\",\n value: current.lt ?? current.lte ?? null,\n setOperator: (op: string) => {\n const otherOp = op === \"lt\" ? \"lte\" : \"lt\";\n const val = current[otherOp] ?? current[op];\n const updated = { ...current };\n delete updated[otherOp];\n if (val != null) updated[op] = val;\n base.setValue(updated);\n },\n setValue: (v: number | null) => {\n const op = current.lt != null ? \"lt\" : \"lte\";\n const updated = { ...current };\n if (v != null) updated[op] = v;\n else delete updated[op];\n base.setValue(updated);\n },\n },\n };\n }\n\n if (inputGuards.min_max_int_input(meta)) {\n const current = (base.value as {\n min: number | null;\n max: number | null;\n }) ?? { min: null, max: null };\n return {\n from: {\n value: current.min,\n set: (v: number | null) => base.setValue({ ...current, min: v }),\n },\n to: {\n value: current.max,\n set: (v: number | null) => base.setValue({ ...current, max: v }),\n },\n };\n }\n\n if (inputGuards.multi_create_input(meta) || inputGuards.ordered_multi_create_input(meta)) {\n const items = (base.value as string[]) ?? [];\n const result: Record<string, unknown> = {\n items,\n add: (v: string) => base.setValue([...items, v]),\n remove: (v: string) => base.setValue(items.filter((i) => i !== v)),\n };\n if (inputGuards.ordered_multi_create_input(meta)) {\n result.reorder = (from: number, to: number) => {\n const next = [...items];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n base.setValue(next);\n };\n }\n Object.assign(result, suggestionExtras(meta, publicKey));\n return result;\n }\n\n if (inputGuards.single_create_input(meta)) {\n // Suggestions only. The value is a plain string on `base`, so the adapter\n // reads and writes it directly rather than through list helpers.\n return suggestionExtras(meta, publicKey);\n }\n\n if (inputGuards.property_list_input(meta)) {\n // Stored shape is `{ property }[]` (extensible entries); the tag editor\n // works on plain strings, so map between the two here.\n const value = (base.value as { property: string }[]) ?? [];\n const result: Record<string, unknown> = {\n items: value.map((entry) => entry.property),\n add: (v: string) => base.setValue([...value, { property: v }]),\n remove: (v: string) => base.setValue(value.filter((entry) => entry.property !== v)),\n };\n const m = meta as any;\n if (m.suggestionsDef?.options) {\n if (typeof m.suggestionsDef.options === \"function\") {\n result.loadOptions = async (query: string) =>\n withMergedWidgets(\n await m.suggestionsDef.options({ query, token: publicKey }),\n m.suggestionsDef.widgets,\n );\n } else {\n result.options = withMergedWidgets(m.suggestionsDef.options, m.suggestionsDef.widgets);\n }\n }\n if (m.optionsDef) {\n // Connection-scoped suggestions (same channel as `context_select_input`):\n // per-keystroke server-side fetch with the user's connection secret.\n // Suggestion-only — the field lists the provider's actual attributes,\n // so free-form entries are disallowed.\n const loadState = loadingCtx?.fieldLoadStates?.[meta.path];\n const searchFieldContext = loadingCtx?.searchFieldContext;\n result.options = (meta as { options?: unknown }).options ?? [];\n result.pending = loadState?.status === \"loading\";\n result.suggestionsDisabled = loadState?.suggestionsDisabled ?? false;\n result.suggestionsDisabledReason = loadState?.suggestionsDisabledReason;\n result.allowCreate = false;\n if (searchFieldContext) {\n result.loadOptions = async (query: string) =>\n withMergedWidgets(await searchFieldContext(meta.path, query), m.optionsDef.widgets);\n }\n }\n return result;\n }\n\n if (inputGuards.tagged_ordered_multi_create_input(meta)) {\n const items = (base.value as string[]) ?? [];\n const result: Record<string, unknown> = {\n items,\n setItems: (next: string[]) => base.setValue(next),\n inputFields: meta.inputFields ?? [],\n };\n const m = meta as any;\n if (m.suggestionsDef?.options) {\n if (typeof m.suggestionsDef.options === \"function\") {\n result.loadOptions = async (query: string) =>\n withMergedWidgets(\n await m.suggestionsDef.options({ query, token: publicKey }),\n m.suggestionsDef.widgets,\n );\n } else {\n result.options = withMergedWidgets(m.suggestionsDef.options, m.suggestionsDef.widgets);\n }\n }\n return result;\n }\n\n if (inputGuards.loose_object_input(meta)) {\n const value = (base.value as Record<string, string>) ?? {};\n return {\n value,\n setObject: (next: Record<string, string>) => base.setValue(next),\n searchSecrets: loadingCtx?.searchSecrets,\n searchConstants: loadingCtx?.searchConstants,\n };\n }\n\n if (inputGuards.prompt_input(meta) || inputGuards.template_input(meta)) {\n return {\n searchSecrets: loadingCtx?.searchSecrets,\n searchConstants: loadingCtx?.searchConstants,\n };\n }\n\n if (inputGuards.condition_block_input(meta)) {\n const loadState = loadingCtx?.fieldLoadStates?.[meta.path];\n return {\n searchSecrets: loadingCtx?.searchSecrets,\n searchConstants: loadingCtx?.searchConstants,\n // Field-name suggestions themselves ride on `meta.options` (merged from\n // the form store by `resolveField`); only the load state comes through.\n pending: loadState?.status === \"loading\",\n };\n }\n\n if (inputGuards.field_select_input(meta)) {\n const loadState = loadingCtx?.fieldLoadStates?.[meta.path];\n return {\n options: meta.options ?? [],\n pending: loadState?.status === \"loading\",\n suggestionsDisabled: loadState?.suggestionsDisabled ?? false,\n suggestionsDisabledReason: loadState?.suggestionsDisabledReason,\n };\n }\n\n // Remaining types need no extras beyond base\n return {};\n}\n\n/**\n * Turn a `suggestionsDef` into the options a combobox can render.\n *\n * Shared by the list and single create inputs. Kept in one place because the\n * static/async split is easy to get subtly different in a second copy, and the\n * difference would only show on the async branch.\n */\nfunction suggestionExtras(meta: unknown, publicKey: string | undefined) {\n const m = meta as any;\n if (!m.suggestionsDef?.options) return {};\n if (typeof m.suggestionsDef.options === \"function\") {\n return {\n loadOptions: async (query: string) =>\n withMergedWidgets(\n await m.suggestionsDef.options({ query, token: publicKey }),\n m.suggestionsDef.widgets,\n ),\n };\n }\n return { options: withMergedWidgets(m.suggestionsDef.options, m.suggestionsDef.widgets) };\n}\n\nfunction isEmptyValue(value: unknown): boolean {\n if (value === null || typeof value === \"undefined\") return true;\n if (typeof value === \"string\") return value === \"\";\n if (Array.isArray(value)) return value.length === 0;\n if (typeof value === \"object\") {\n const keys = Object.keys(value);\n if (keys.length === 0) return true;\n return keys.every((k) => isEmptyValue((value as Record<string, unknown>)[k]));\n }\n return false;\n}\n\nexport function buildSectionHandles(\n formConfig: FormSection[],\n form: UseFormReturn<Record<string, unknown>>,\n publicKey: string,\n loadingCtx?: FieldLoadingContext,\n): FormSectionHandle[] {\n // In onSubmit validation mode, don't flag groups as invalid until the\n // user has actually attempted a submit. This matches RHF's own field-level\n // behavior where `formState.errors` is only populated after the first\n // submit (and updated reactively thereafter per `reValidateMode`).\n const hasSubmitted = form.formState.isSubmitted;\n\n return formConfig\n .map((section) => {\n const groups: FormGroupHandle[] = section.groups\n .map((group) => {\n // Drop a connector field whose mode is \"disabled\" (custom connections\n // unsupported) — there's nothing to configure, so we hide the whole\n // group/section rather than render a \"not supported\" placeholder.\n const fields = group.fields\n .filter(\n (meta) => !(inputGuards.connector_input(meta) && meta.connectorMode === \"disabled\"),\n )\n .map((meta) => buildFieldProps(meta, form, publicKey, loadingCtx)) as AnyFieldProps[];\n\n const groupPathError = form.getFieldState(group.groupPath as any).error;\n const errorCount = hasSubmitted\n ? fields.filter((f) => f.error != null).length + (groupPathError ? 1 : 0)\n : 0;\n const setCount = fields.filter((f) => !isEmptyValue(f.value)).length;\n const dirtyCount = fields.filter((f) => f.dirty).length;\n\n return {\n key: group.groupPath,\n label: group.label,\n description: group.description,\n iconKey: group.iconKey,\n defaultExpand: group.defaultExpand ?? false,\n fields,\n errorCount,\n setCount,\n dirtyCount,\n };\n })\n .filter((group) => group.fields.length > 0);\n\n return {\n key: section.metadata.path,\n label: section.metadata.label,\n description: section.metadata.description,\n groups,\n };\n })\n .filter((section) => section.groups.length > 0);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/widgets/glyphs/linkedin.tsx
|
|
4
|
+
/**
|
|
5
|
+
* The LinkedIn mark.
|
|
6
|
+
*
|
|
7
|
+
* Carried here because lucide REMOVED every brand icon in v1 — they are
|
|
8
|
+
* trademarks, and lucide chose not to ship them rather than police their use.
|
|
9
|
+
* The dash gets this from `@phosphor-icons/react`, which still does; this
|
|
10
|
+
* package has no icon dependency beyond lucide, so adding one for a single
|
|
11
|
+
* glyph would cost more than the glyph.
|
|
12
|
+
*
|
|
13
|
+
* Sized and stroked like the lucide icons around it in `iconGlyphs`, so it does
|
|
14
|
+
* not stand out as the one that came from somewhere else. Filled rather than
|
|
15
|
+
* stroked because that is how the mark is drawn.
|
|
16
|
+
*/
|
|
17
|
+
function LinkedinGlyph({ size = 24, ...props }) {
|
|
18
|
+
return /* @__PURE__ */ jsx("svg", {
|
|
19
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
20
|
+
width: size,
|
|
21
|
+
height: size,
|
|
22
|
+
viewBox: "0 0 24 24",
|
|
23
|
+
fill: "currentColor",
|
|
24
|
+
"aria-hidden": "true",
|
|
25
|
+
...props,
|
|
26
|
+
children: /* @__PURE__ */ jsx("path", { d: "M20.45 20.45h-3.56v-5.57c0-1.33-.02-3.04-1.85-3.04-1.85 0-2.13 1.45-2.13 2.94v5.67H9.35V9h3.41v1.56h.05a3.74 3.74 0 0 1 3.37-1.85c3.6 0 4.27 2.37 4.27 5.46v6.28zM5.34 7.43a2.06 2.06 0 1 1 0-4.13 2.06 2.06 0 0 1 0 4.13zm1.78 13.02H3.55V9h3.57v11.45zM22.22 0H1.77C.79 0 0 .77 0 1.72v20.56C0 23.23.79 24 1.77 24h20.45c.98 0 1.78-.77 1.78-1.72V1.72C24 .77 23.2 0 22.22 0z" })
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//#endregion
|
|
31
|
+
export { LinkedinGlyph };
|
|
32
|
+
//# sourceMappingURL=linkedin.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linkedin.mjs","names":[],"sources":["../../../src/widgets/glyphs/linkedin.tsx"],"sourcesContent":["import type { SVGProps } from \"react\";\n\n/**\n * The LinkedIn mark.\n *\n * Carried here because lucide REMOVED every brand icon in v1 — they are\n * trademarks, and lucide chose not to ship them rather than police their use.\n * The dash gets this from `@phosphor-icons/react`, which still does; this\n * package has no icon dependency beyond lucide, so adding one for a single\n * glyph would cost more than the glyph.\n *\n * Sized and stroked like the lucide icons around it in `iconGlyphs`, so it does\n * not stand out as the one that came from somewhere else. Filled rather than\n * stroked because that is how the mark is drawn.\n */\nexport function LinkedinGlyph({\n size = 24,\n ...props\n}: SVGProps<SVGSVGElement> & { size?: number | string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n {...props}\n >\n <path d=\"M20.45 20.45h-3.56v-5.57c0-1.33-.02-3.04-1.85-3.04-1.85 0-2.13 1.45-2.13 2.94v5.67H9.35V9h3.41v1.56h.05a3.74 3.74 0 0 1 3.37-1.85c3.6 0 4.27 2.37 4.27 5.46v6.28zM5.34 7.43a2.06 2.06 0 1 1 0-4.13 2.06 2.06 0 0 1 0 4.13zm1.78 13.02H3.55V9h3.57v11.45zM22.22 0H1.77C.79 0 0 .77 0 1.72v20.56C0 23.23.79 24 1.77 24h20.45c.98 0 1.78-.77 1.78-1.72V1.72C24 .77 23.2 0 22.22 0z\" />\n </svg>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAeA,SAAgB,cAAc,EAC5B,OAAO,IACP,GAAG,SACoD;AACvD,QACE,oBAAC,OAAD;EACE,OAAM;EACN,OAAO;EACP,QAAQ;EACR,SAAQ;EACR,MAAK;EACL,eAAY;EACZ,GAAI;YAEJ,oBAAC,QAAD,EAAM,GAAE,mXAAoX;EACxX"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { LinkedinGlyph } from "./glyphs/linkedin.mjs";
|
|
1
2
|
import { jsx } from "react/jsx-runtime";
|
|
2
|
-
import { Activity, Award, Banknote, BarChart3, BookOpen, Boxes, Braces, Brain, Briefcase, BriefcaseBusiness, Building2, Calendar, Code2, Compass, Contact, Download, Factory, Filter, GraduationCap, Handshake, History, Languages, LetterText, Library,
|
|
3
|
+
import { Activity, Award, Banknote, BarChart3, BookOpen, Boxes, Braces, Brain, Briefcase, BriefcaseBusiness, Building2, Calendar, Code2, Compass, Contact, Download, Factory, Filter, GraduationCap, Handshake, History, Languages, LetterText, Library, List, Mail, MapPin, Medal, Plug, Search, Shuffle, Sigma, SlidersHorizontal, Sparkles, Star, Swords, Tags, Type, Upload, User, Workflow, Zap } from "lucide-react";
|
|
3
4
|
|
|
4
5
|
//#region src/widgets/icon-glyph.tsx
|
|
5
6
|
const iconMap = {
|
|
@@ -17,7 +18,7 @@ const iconMap = {
|
|
|
17
18
|
plug: Plug,
|
|
18
19
|
mix: Shuffle,
|
|
19
20
|
job: BriefcaseBusiness,
|
|
20
|
-
linkedin:
|
|
21
|
+
linkedin: LinkedinGlyph,
|
|
21
22
|
text: Type,
|
|
22
23
|
workflow: Workflow,
|
|
23
24
|
letter: LetterText,
|
|
@@ -25,7 +26,7 @@ const iconMap = {
|
|
|
25
26
|
web: Compass,
|
|
26
27
|
activity: Activity,
|
|
27
28
|
boxes: Boxes,
|
|
28
|
-
|
|
29
|
+
competition: Swords,
|
|
29
30
|
bill: Banknote,
|
|
30
31
|
bolt: Zap,
|
|
31
32
|
star: Star,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon-glyph.mjs","names":[],"sources":["../../src/widgets/icon-glyph.tsx"],"sourcesContent":["import type { IconKey } from \"@pipe0/base\";\nimport {\n Activity,\n Award,\n Banknote,\n BarChart3,\n BookOpen,\n Boxes,\n Braces,\n Brain,\n Briefcase,\n BriefcaseBusiness,\n Building2,\n Calendar,\n Code2,\n Compass,\n Contact,\n Download,\n Factory,\n Filter,\n GraduationCap,\n Handshake,\n History,\n Languages,\n LetterText,\n Library,\n
|
|
1
|
+
{"version":3,"file":"icon-glyph.mjs","names":[],"sources":["../../src/widgets/icon-glyph.tsx"],"sourcesContent":["import type { IconKey } from \"@pipe0/base\";\nimport {\n Activity,\n Award,\n Banknote,\n BarChart3,\n BookOpen,\n Boxes,\n Braces,\n Brain,\n Briefcase,\n BriefcaseBusiness,\n Building2,\n Calendar,\n Code2,\n Compass,\n Contact,\n Download,\n Factory,\n Filter,\n GraduationCap,\n Handshake,\n History,\n Languages,\n LetterText,\n Library,\n List,\n Mail,\n MapPin,\n Medal,\n Plug,\n Search,\n Shuffle,\n Sigma,\n SlidersHorizontal,\n Sparkles,\n Star,\n Swords,\n Tags,\n Type,\n Upload,\n User,\n Workflow,\n Zap,\n} from \"lucide-react\";\nimport type { ComponentType } from \"react\";\nimport { LinkedinGlyph } from \"./glyphs/linkedin.js\";\n\nconst iconMap: Record<IconKey, ComponentType<{ className?: string; size?: number }>> = {\n school: GraduationCap,\n user: User,\n location: MapPin,\n language: Languages,\n brain: Brain,\n book: BookOpen,\n money: Banknote,\n office: Building2,\n search: Search,\n output: Upload,\n input: Download,\n plug: Plug,\n mix: Shuffle,\n job: BriefcaseBusiness,\n linkedin: LinkedinGlyph,\n text: Type,\n workflow: Workflow,\n letter: LetterText,\n source: Sigma,\n web: Compass,\n activity: Activity,\n boxes: Boxes,\n competition: Swords,\n bill: Banknote,\n bolt: Zap,\n star: Star,\n scholar: Library,\n // expanded set\n briefcase: Briefcase,\n history: History,\n sparkles: Sparkles,\n list: List,\n sliders: SlidersHorizontal,\n factory: Factory,\n award: Award,\n tags: Tags,\n handshake: Handshake,\n contact: Contact,\n mail: Mail,\n calendar: Calendar,\n chart: BarChart3,\n code: Code2,\n braces: Braces,\n filter: Filter,\n};\n\nexport function IconGlyph({\n keyName,\n className,\n size,\n}: {\n keyName: IconKey;\n className?: string;\n size?: number;\n}) {\n const Icon = iconMap[keyName] ?? Medal;\n return <Icon className={className} size={size} />;\n}\n"],"mappings":";;;;;AAgDA,MAAM,UAAiF;CACrF,QAAQ;CACR,MAAM;CACN,UAAU;CACV,UAAU;CACV,OAAO;CACP,MAAM;CACN,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,MAAM;CACN,KAAK;CACL,KAAK;CACL,UAAU;CACV,MAAM;CACN,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,UAAU;CACV,OAAO;CACP,aAAa;CACb,MAAM;CACN,MAAM;CACN,MAAM;CACN,SAAS;CAET,WAAW;CACX,SAAS;CACT,UAAU;CACV,MAAM;CACN,SAAS;CACT,SAAS;CACT,OAAO;CACP,MAAM;CACN,WAAW;CACX,SAAS;CACT,MAAM;CACN,UAAU;CACV,OAAO;CACP,MAAM;CACN,QAAQ;CACR,QAAQ;CACT;AAED,SAAgB,UAAU,EACxB,SACA,WACA,QAKC;AAED,QAAO,oBADM,QAAQ,YAAY,OAC1B;EAAiB;EAAiB;EAAQ"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pipe0/react",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.20",
|
|
4
4
|
"description": "React component library for building forms and catalogs powered by pipe0 pipes and searches.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "pipe0",
|
|
@@ -80,11 +80,11 @@
|
|
|
80
80
|
"clsx": "^2.1.1",
|
|
81
81
|
"cmdk": "^1.1.1",
|
|
82
82
|
"jsonata": "^2.1.0",
|
|
83
|
-
"lucide-react": "^
|
|
83
|
+
"lucide-react": "^1.33.0",
|
|
84
84
|
"react-hook-form": "^7.62.0",
|
|
85
85
|
"swr": "^2.4.1",
|
|
86
86
|
"tailwind-merge": "^3.3.1",
|
|
87
|
-
"@pipe0/base": "1.0.
|
|
87
|
+
"@pipe0/base": "1.0.20"
|
|
88
88
|
},
|
|
89
89
|
"devDependencies": {
|
|
90
90
|
"@base-ui/react": "^1.6.0",
|