@knapsack/types 4.89.2 → 4.89.3
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 +19 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/renderers.d.ts +2 -0
- package/dist/renderers.d.ts.map +1 -1
- package/dist/renderers.js +1 -1
- package/dist/renderers.js.map +1 -1
- package/dist/renderers.mjs +1 -1
- package/dist/renderers.mjs.map +1 -1
- package/dist/renderers.vitest.js +51 -51
- package/dist/renderers.vitest.js.map +1 -1
- package/dist/renderers.vitest.mjs +51 -51
- package/dist/renderers.vitest.mjs.map +1 -1
- package/package.json +7 -7
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui-config.ts","../src/color-config.ts","../src/typography-config.ts","../src/nav-customization-config.ts","../src/app-client-data/blocks.ts","../src/app-client-data/design-tokens.ts","../src/app-client-data/design-tokens-types/token-definitions.ts","../src/app-client-data/design-tokens-types/token-data.ts","../src/app-client-data/design-tokens-types/token-src-value-info.ts","../src/app-client-data/design-tokens-types/token-src.ts","../src/app-client-data/design-tokens-types/token-utils.ts","../src/app-client-data/patterns.ts","../src/app-client-data/tabs.ts","../src/app-client-data/page.header.ts","../src/app-client-data/index.ts","../src/app-client-data-v3/index.ts","../src/app-client-data-migrations/4.1.7-demos.ts","../src/app-client-data-migrations/index.ts","../src/app-sections.ts","../src/json-schema.ts","../src/changes.ts","../src/renderers.ts","../src/renderer-client-types.ts","../src/web-sockets.ts","../src/git-providers.ts","../src/user-roles.ts","../src/api-routes.ts"],"names":["isColor","color","colorString","__name","ColorStringStruct","define","value","ColorConfigStruct","union","type","literal","string","ColorTokenConfigStruct","HeadingLevels","FontSizeConfigValStruct","object","enums","number","FontFaceWeightStruct","FontFaceSourceFormats","FontFaceFormatsEnumStruct","FontFaceSourceStruct","FontFaceConfigStruct","optional","size","array","TextTransforms","FontStretches","TypographyLinkConfigStruct","boolean","FontSizeConfigStruct","TypographyConfigStruct","pageElementConfig","pageLinkElementConfig","pageElements","pageElementsV2","NavCustomizationConfigStruct","PrimaryNavCustomizationConfigStruct","SecondaryNavCustomizationConfigStruct","navCustomizationConfig","secondaryNavCustomizationConfig","primaryNavCustomizationConfig","customizableNavElements","UiConfigV1Struct","UiConfigV2Struct","UiConfigV3Struct","UiConfigV4Struct","defaulted","UiConfigV5Struct","UiConfigV6Struct","UiConfigV7Struct","UiConfigV8Struct","UiConfigV9Struct","UiConfigV10Struct","UiConfigStruct","BlockSizes","BlockSpacings","tokenNameDisplayFormats","strokeStyleValues","isTokenReference","val","hasTokenReferences","isNotTokenReference","TokenReferenceStruct","Te","compositeTypesRecord","tokenTypeComposites","singularTypesRecord","tokenTypeSingulars","isTokenTypeComposite","isTokenTypeSingular","expectType","TokenDataBaseStruct","t","isTokenDataComposite","tokenData","isTokenValueColor","TokenValueColorStruct","TokenDataColorNonRefStruct","TokenDataColorRefStruct","isTokenValueDimension","TokenValueDimensionStruct","TokenDataDimensionNonRefStruct","TokenDataDimensionRefStruct","isTokenValueDuration","TokenValueDurationStruct","TokenDataDurationNonRefStruct","TokenDataDurationRefStruct","isTokenValueFontWeight","TokenValueFontWeightStruct","TokenDataFontWeightNonRefStruct","TokenDataFontWeightRefStruct","TokenValueCubicBezierStruct","v","TokenDataCubicBezierNonRefStruct","TokenDataCubicBezierRefStruct","isTokenValueShadow","isObject","TokenValueShadowStruct","TokenDataShadowNonRefStruct","TokenDataShadowRefStruct","TokenValueStrokeStyleStruct","isTokenValueBorder","TokenValueBorderStruct","TokenDataBorderNonRefStruct","TokenDataBorderRefStruct","isTokenValueTransition","TokenValueTransitionStruct","TokenDataTransitionNonRefStruct","TokenDataTransitionRefStruct","TokenDataStringNonRefStruct","TokenDataStringRefStruct","TokenDataStrokeStyleNonRefStruct","TokenDataStrokeStyleRefStruct","TokenDataNumberNonRefStruct","TokenDataNumberRefStruct","TokenDataBooleanNonRefStruct","TokenDataBooleanRefStruct","assertTokenData","data","isObjKey","kind","error","isTokenSrcValueInfoSingular","tokenSrcValueInfo","isTokenSrcValueInfoComposite","isTokenSrcExtensions","extensionsObj","isTokenSrc","tokenObject","isTokenGroup","isTokenTypeVarRef","varRefCollectionInfo","getPrimitiveValue","tokenValue","isDimensionString","parseTokenDimensionValue","valueToParse","unit","parseNumberWithUnit","isDemoWithData","demo","isDataDemo","isTemplateDemo","isSpecNotInferred","spec","patternTabTypes","PageHeaderSizes","emptyAppClientData","isKsAppClientDataNoMeta","key","KsAppClientDataNoMetaStruct","KsAppClientDataNoMetaZodWIP","z","KsAppClientDataNoMetaZod","ctx","isKsAppClientDataAndMeta","KsAppClientDataAndMetaStruct","KsMetaStateStruct","isKsMetaState","isKsAppClientDataNoMetaV3","KsAppClientDataNoMetaStructV3","isKsAppClientDataAndMetaV3","KsAppClientDataAndMetaStructV3","KsMetaStateStructV3","isKsMetaStateV3","migration417Demos","appClientData","isDraft","pattern","slotName","slotData","slottedData","pId","templates","tId","demoIds","migrations","appSectionsById","appSections","PropTypeNames","isStringProp","prop","isNumberProp","isBooleanProp","isOptionsProp","isFunctionProp","isCustomTypeScriptProp","isArrayOfObjectsProp","isObjectProp","isArrayOfStringsProp","isArrayOfNumbersProp","PatchStructRuntime","p","PatchStruct","isPatch","patch","PatchesStructRuntime","PatchesStruct","isPatches","patches","KsRemoteChangeRuntime","KsRemoteChangeStruct","isKsRemoteChange","change","KsRemoteChangesStructRuntime","KsRemoteChangesStruct","isKsRemoteChanges","changes","rendererIds","CodeSrcUserConfigSchema","isTemplateInfoWithCodeSrcPath","info","createTemplateInfoId","addIdToTemplateInfo","normalizeTemplateInfo","rendererId","alias","path","convertTemplateInfoToOldWay","KsRendererClientEvents","ksRendererClientMetaId","WS_EVENTS","GitProviderType","MergeableState","RestActions","TextEncoding","rolesById","roles","createUrlForRoute","queryParams","origin","createUrlWithParams","getParams","params","getParamsForRoute"],"mappings":"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","file":"index.js","sourcesContent":["import {\n type,\n Describe,\n literal,\n optional,\n defaulted,\n boolean,\n array,\n object,\n} from 'superstruct';\n\nimport { ExpandRecursively } from '@knapsack/utils';\n\nimport {\n ColorConfig,\n ColorConfigStruct,\n ColorStringStruct,\n} from './color-config';\n\nimport {\n FontFaceConfigStruct,\n FontFaceConfig,\n TypographyConfigStruct,\n TypographyLinkConfigStruct,\n pageElements,\n pageElementsV2,\n} from './typography-config';\n\nimport {\n customizableNavElements,\n NavCustomizationConfigStruct,\n PrimaryNavCustomizationConfigStruct,\n SecondaryNavCustomizationConfigStruct,\n} from './nav-customization-config';\n\nexport type UiConfigV1 = {\n version: 1;\n oldSillySidebarBgColor: string;\n};\n\nexport const UiConfigV1Struct: Describe<UiConfigV1> = object({\n version: literal(1),\n oldSillySidebarBgColor: ColorStringStruct,\n});\n\nexport type UiConfigV2 = {\n version: 2;\n anotherSillySidebarBgColor: string;\n};\n\nexport const UiConfigV2Struct: Describe<UiConfigV2> = object({\n version: literal(2),\n anotherSillySidebarBgColor: ColorStringStruct,\n});\n\nexport type UiConfigV3 = {\n version: 3;\n sidebarBgColor: string;\n};\n\nexport const UiConfigV3Struct: Describe<UiConfigV3> = object({\n version: literal(3),\n sidebarBgColor: ColorStringStruct,\n});\n\nexport type UiConfigV4 = {\n version: 4;\n primaryColor: ColorConfig;\n darkColor: ColorConfig;\n lightColor: ColorConfig;\n enableSidebarIcons?: boolean;\n};\nexport const UiConfigV4Struct: Describe<UiConfigV4> = object({\n version: literal(4),\n primaryColor: ColorConfigStruct,\n darkColor: ColorConfigStruct,\n lightColor: ColorConfigStruct,\n enableSidebarIcons: optional(defaulted(boolean(), true)),\n});\n\nexport type UiConfigV5 = {\n version: 5;\n primaryColor: ColorConfig;\n darkColor: ColorConfig;\n lightColor: ColorConfig;\n linkColor: ColorConfig;\n enableSidebarIcons: boolean;\n};\nexport const UiConfigV5Struct: Describe<UiConfigV5> = object({\n version: literal(5),\n primaryColor: ColorConfigStruct,\n darkColor: ColorConfigStruct,\n lightColor: ColorConfigStruct,\n linkColor: ColorConfigStruct,\n enableSidebarIcons: optional(defaulted(boolean(), true)),\n});\n\nexport interface _UiConfigV6 extends Omit<UiConfigV5, 'version'> {\n version: 6;\n appearance: {\n customFonts?: FontFaceConfig[];\n pageElements: typeof pageElements;\n };\n}\n\n// ExpandRecursively needed to avoid \"Type 'UiConfigV6' is not assignable to type 'Record<string, unknown>'.\" error\nexport type UiConfigV6 = ExpandRecursively<_UiConfigV6>;\n\nexport const UiConfigV6Struct: Describe<UiConfigV6> = object({\n version: literal(6),\n primaryColor: ColorConfigStruct,\n darkColor: ColorConfigStruct,\n lightColor: ColorConfigStruct,\n linkColor: ColorConfigStruct,\n enableSidebarIcons: optional(defaulted(boolean(), true)),\n\n appearance: type({\n customFonts: optional(array(FontFaceConfigStruct)),\n pageElements: type({\n pageTitle: optional(TypographyConfigStruct),\n pageDescription: optional(TypographyConfigStruct),\n headingLarge: optional(TypographyConfigStruct),\n headingMedium: optional(TypographyConfigStruct),\n headingSmall: optional(TypographyConfigStruct),\n bodyText: optional(TypographyConfigStruct),\n link: optional(TypographyLinkConfigStruct),\n }),\n }),\n});\n\nexport interface _UiConfigV7 extends Omit<UiConfigV6, 'version'> {\n version: 7;\n appearance: {\n navigation?: typeof customizableNavElements;\n customFonts?: UiConfigV6['appearance']['customFonts'];\n pageElements: UiConfigV6['appearance']['pageElements'];\n };\n}\n\n// ExpandRecursively needed to avoid \"Type 'UiConfig7' is not assignable to type 'Record<string, unknown>'.\" error in ui-config.xstate.ts\nexport type UiConfigV7 = ExpandRecursively<_UiConfigV7>;\n\nexport const UiConfigV7Struct: Describe<UiConfigV7> = object({\n version: literal(7),\n primaryColor: ColorConfigStruct,\n darkColor: ColorConfigStruct,\n lightColor: ColorConfigStruct,\n linkColor: ColorConfigStruct,\n enableSidebarIcons: optional(defaulted(boolean(), true)),\n\n appearance: type({\n customFonts: optional(array(FontFaceConfigStruct)),\n navigation: optional(\n type({\n primaryNav: optional(PrimaryNavCustomizationConfigStruct),\n secondaryNav: optional(SecondaryNavCustomizationConfigStruct),\n tabs: optional(NavCustomizationConfigStruct),\n }),\n ),\n pageElements: type({\n pageTitle: optional(TypographyConfigStruct),\n pageDescription: optional(TypographyConfigStruct),\n headingLarge: optional(TypographyConfigStruct),\n headingMedium: optional(TypographyConfigStruct),\n headingSmall: optional(TypographyConfigStruct),\n bodyText: optional(TypographyConfigStruct),\n link: optional(TypographyLinkConfigStruct),\n }),\n }),\n});\n\nexport interface _UiConfigV8\n extends Omit<UiConfigV7, 'version' | 'enableSidebarIcons'> {\n version: 8;\n}\n\n// ExpandRecursively needed to avoid \"Type 'UiConfig8' is not assignable to type 'Record<string, unknown>'.\" error in ui-config.xstate.ts\n// TODO: move this to @knapsack/types\nexport type UiConfigV8 = ExpandRecursively<_UiConfigV8>;\n\nexport const UiConfigV8Struct: Describe<UiConfigV8> = object({\n version: literal(8),\n primaryColor: ColorConfigStruct,\n darkColor: ColorConfigStruct,\n lightColor: ColorConfigStruct,\n linkColor: ColorConfigStruct,\n\n appearance: type({\n customFonts: optional(array(FontFaceConfigStruct)),\n navigation: optional(\n type({\n primaryNav: optional(PrimaryNavCustomizationConfigStruct),\n secondaryNav: optional(SecondaryNavCustomizationConfigStruct),\n tabs: optional(NavCustomizationConfigStruct),\n }),\n ),\n pageElements: type({\n pageTitle: optional(TypographyConfigStruct),\n pageDescription: optional(TypographyConfigStruct),\n headingLarge: optional(TypographyConfigStruct),\n headingMedium: optional(TypographyConfigStruct),\n headingSmall: optional(TypographyConfigStruct),\n bodyText: optional(TypographyConfigStruct),\n link: optional(TypographyLinkConfigStruct),\n }),\n }),\n});\n\nexport interface _UiConfigV9\n extends Omit<\n UiConfigV8,\n 'version' | 'primaryColor' | 'darkColor' | 'lightColor' | 'linkColor'\n > {\n version: 9;\n}\nexport type UiConfigV9 = ExpandRecursively<_UiConfigV9>;\n\nexport const UiConfigV9Struct: Describe<UiConfigV9> = object({\n version: literal(9),\n\n appearance: type({\n customFonts: optional(array(FontFaceConfigStruct)),\n navigation: optional(\n type({\n primaryNav: optional(PrimaryNavCustomizationConfigStruct),\n secondaryNav: optional(SecondaryNavCustomizationConfigStruct),\n tabs: optional(NavCustomizationConfigStruct),\n }),\n ),\n pageElements: type({\n pageTitle: optional(TypographyConfigStruct),\n pageDescription: optional(TypographyConfigStruct),\n headingLarge: optional(TypographyConfigStruct),\n headingMedium: optional(TypographyConfigStruct),\n headingSmall: optional(TypographyConfigStruct),\n bodyText: optional(TypographyConfigStruct),\n link: optional(TypographyLinkConfigStruct),\n }),\n }),\n});\n\nexport interface _UiConfigV10 extends Omit<UiConfigV9, 'version'> {\n version: 10;\n appearance: {\n navigation?: UiConfigV9['appearance']['navigation'];\n customFonts?: UiConfigV9['appearance']['customFonts'];\n pageElements: typeof pageElementsV2;\n };\n}\nexport type UiConfigV10 = ExpandRecursively<_UiConfigV10>;\n\nexport const UiConfigV10Struct: Describe<UiConfigV10> = object({\n version: literal(10),\n\n appearance: type({\n customFonts: optional(array(FontFaceConfigStruct)),\n navigation: optional(\n type({\n primaryNav: optional(PrimaryNavCustomizationConfigStruct),\n secondaryNav: optional(SecondaryNavCustomizationConfigStruct),\n tabs: optional(NavCustomizationConfigStruct),\n }),\n ),\n pageElements: type({\n pageTitle: optional(TypographyConfigStruct),\n pageDescription: optional(TypographyConfigStruct),\n headingXLarge: optional(TypographyConfigStruct),\n headingLarge: optional(TypographyConfigStruct),\n headingMedium: optional(TypographyConfigStruct),\n headingSmall: optional(TypographyConfigStruct),\n headingXSmall: optional(TypographyConfigStruct),\n bodyText: optional(TypographyConfigStruct),\n link: optional(TypographyLinkConfigStruct),\n }),\n }),\n});\n\nexport type UiConfigVersions =\n | typeof UiConfigV1Struct.TYPE\n | typeof UiConfigV2Struct.TYPE\n | typeof UiConfigV3Struct.TYPE\n | typeof UiConfigV4Struct.TYPE\n | typeof UiConfigV5Struct.TYPE\n | typeof UiConfigV6Struct.TYPE\n | typeof UiConfigV7Struct.TYPE\n | typeof UiConfigV8Struct.TYPE\n | typeof UiConfigV9Struct.TYPE\n | typeof UiConfigV10Struct.TYPE;\n\n// ALIASES FOR LATEST VERSIONS\nexport type UiConfig = UiConfigV10;\nexport const UiConfigStruct: typeof UiConfigV10Struct = UiConfigV10Struct;\n\nexport type NavElementNames = keyof UiConfig['appearance']['navigation'];\n","import colorString from 'color-string';\nimport { define, Describe, literal, string, type, union } from 'superstruct'; // https://docs.superstructjs.org\n\n/** Use `import { isColor } from '@knapsack/color-utils'` if you can, need to duplicate this logic due to dep cycle */\nfunction isColor(color: unknown): color is string {\n if (typeof color !== 'string') return false;\n try {\n return !!colorString.get(color);\n } catch (e) {\n return false;\n }\n}\n\nexport type ColorTokenConfig = {\n type: 'design-token';\n /** Will be **either** `-` (old) or `.` (new) separated */\n tokenName: string;\n};\nexport type ColorConfig =\n | { type: 'value'; colorValue: string }\n | ColorTokenConfig;\n\nexport const ColorStringStruct = define<string>(\n 'ColorStringStruct',\n (value) => typeof value === 'string' && isColor(value),\n);\n\nexport const ColorConfigStruct: Describe<ColorConfig> = union([\n type({\n type: literal('value'),\n colorValue: ColorStringStruct,\n }),\n type({\n type: literal('design-token'),\n tokenName: string(),\n }),\n]);\n\n// so we can check if an object is not just a ColorConfig but specifically a token\nexport const ColorTokenConfigStruct: Describe<ColorTokenConfig> = type({\n type: literal('design-token'),\n tokenName: string(),\n});\n","import {\n Describe,\n string,\n type,\n union,\n number,\n enums,\n optional,\n literal,\n array,\n size,\n boolean,\n object,\n} from 'superstruct'; // https://docs.superstructjs.org\nimport { ColorConfig, ColorConfigStruct } from './color-config';\n\nexport const HeadingLevels = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] as const;\nexport type HeadingLevel = (typeof HeadingLevels)[number];\n\nexport type FontSizeConfigVal = {\n unit: 'px' | 'rem';\n value: number;\n};\n\nexport const FontSizeConfigValStruct: Describe<FontSizeConfigVal> = object({\n unit: enums(['rem', 'px']),\n value: number(),\n});\n\nexport type FontFaceWeight = number | string;\n\nexport const FontFaceWeightStruct: Describe<FontFaceWeight> = union([\n string(),\n number(),\n]);\n\nexport enum FontFaceSourceFormats {\n woff2 = 'woff2',\n woff = 'woff',\n}\n\nexport type FontFaceSource = {\n /**\n * Note: if /when we eventually add 'local' type support, format isn't used!\n */\n format: keyof typeof FontFaceSourceFormats;\n type: 'url';\n path: string;\n};\n\nexport const FontFaceFormatsEnumStruct = enums(['woff2', 'woff']);\n\nexport const FontFaceSourceStruct: Describe<FontFaceSource> = type({\n format: FontFaceFormatsEnumStruct,\n type: literal('url'),\n path: string(),\n});\n\nexport type FontFaceConfig = {\n /**\n * registered name of the custom font\n *\n * MDN Docs on {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-family @font-face's font-family property}\n */\n family?: string;\n\n /**\n * number between 1 and 1000.\n *\n * note: since two weights are allowed (with variable fonts), this type is an\n * optional array for easy parsing down the road.\n *\n * MDN Docs on {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-weight @font-face's font-weight property}.\n */\n weight?: FontFaceWeight | FontFaceWeight[];\n\n /**\n * the collection of urls / paths pointing to font files\n *\n * MDN Docs on {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/src @font-face's src property}.\n */\n src?: FontFaceSource[];\n\n /**\n * the style of the custom font (ex. normal or italic)\n *\n * {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-style See MDN docs on font-style}.\n */\n style?: string;\n\n // @todo: implement these later\n // display?: 'auto' | 'block' | 'swap' | 'fallback' | 'optional';\n // variationSettings?: string;\n // unicodeRange?: string; // or ideally, URange; //\n // see https://drafts.csswg.org/css-syntax-3/#urange-syntax and\n // https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/unicode-range\n};\n\nexport const FontFaceConfigStruct: Describe<FontFaceConfig> = type({\n family: optional(string()),\n weight: optional(\n union([FontFaceWeightStruct, size(array(FontFaceWeightStruct), 2)]),\n ),\n src: optional(array(FontFaceSourceStruct)),\n style: optional(string()),\n display: optional(enums(['auto', 'block', 'swap', 'fallback', 'optional'])),\n variationSettings: optional(string()),\n unicodeRange: optional(string()),\n});\n\nexport type FontSizeConfig = {\n min: FontSizeConfigVal;\n max?: FontSizeConfigVal;\n};\n\nexport enum TextTransforms {\n inherit = 'As typed',\n capitalize = 'Capitalize',\n lowercase = 'Lowercase',\n uppercase = 'Uppercase',\n}\n\nexport enum FontStretches {\n 'ultra-condensed' = 'Ultra-condensed',\n 'extra-condensed' = 'Extra-condensed',\n condensed = 'Condensed',\n 'semi-condensed' = 'Semi-condensed',\n normal = 'Normal',\n 'semi-expanded' = 'Semi-expanded',\n expanded = 'Expanded',\n 'extra-expanded' = 'Extra-expanded',\n 'ultra-expanded' = 'Ultra-expanded',\n}\n\nexport type TypographyConfig = {\n /**\n * min / max height used to future-proof way of supporting responsive typography\n */\n fontSize?: FontSizeConfig;\n\n /**\n * reminder: line-heights can also be unitless!\n */\n lineHeight?: string | number;\n fontWeight?: FontFaceWeight;\n\n /**\n * note: letter-spacing can't be unitless, unit required!\n */\n letterSpacing?: string;\n\n /**\n * if not specified, Knapsack default font, otherwise should allow for a stack of font strings + fallbacks (including the names of custom registered fonts)\n */\n fontFamily?: string;\n\n textColor?: ColorConfig;\n\n textTransform?: keyof typeof TextTransforms;\n\n fontStretch?: keyof typeof FontStretches;\n};\n\nexport interface TypographyLinkConfig {\n fontWeight?: FontFaceWeight;\n textColor?: ColorConfig;\n hoverColor?: ColorConfig;\n underline?: boolean;\n textTransform?: keyof typeof TextTransforms;\n fontStretch?: keyof typeof FontStretches;\n}\n\nexport const TypographyLinkConfigStruct: Describe<TypographyLinkConfig> = type({\n fontWeight: optional(union([string(), number()])),\n textColor: optional(ColorConfigStruct),\n hoverColor: optional(ColorConfigStruct),\n underline: optional(boolean()),\n textTransform: optional(\n enums(['inherit', 'capitalize', 'lowercase', 'uppercase']),\n ),\n fontStretch: optional(\n enums([\n 'ultra-condensed',\n 'extra-condensed',\n 'condensed',\n 'semi-condensed',\n 'normal',\n 'semi-expanded',\n 'expanded',\n 'extra-expanded',\n 'ultra-expanded',\n ]),\n ),\n});\n\nexport const FontSizeConfigStruct: Describe<FontSizeConfig> = type({\n min: FontSizeConfigValStruct,\n max: optional(FontSizeConfigValStruct),\n});\n\nexport const TypographyConfigStruct: Describe<TypographyConfig> = type({\n fontSize: optional(FontSizeConfigStruct),\n lineHeight: optional(union([string(), number()])),\n fontWeight: optional(union([string(), number()])),\n letterSpacing: optional(string()),\n fontFamily: optional(string()),\n textColor: optional(ColorConfigStruct),\n textTransform: optional(\n enums(['inherit', 'capitalize', 'lowercase', 'uppercase']),\n ),\n fontStretch: optional(\n enums([\n 'ultra-condensed',\n 'extra-condensed',\n 'condensed',\n 'semi-condensed',\n 'normal',\n 'semi-expanded',\n 'expanded',\n 'extra-expanded',\n 'ultra-expanded',\n ]),\n ),\n});\n\nconst pageElementConfig: TypographyConfig = {};\nconst pageLinkElementConfig: TypographyLinkConfig = {};\n\nexport const pageElements = {\n pageTitle: pageElementConfig,\n pageDescription: pageElementConfig,\n headingLarge: pageElementConfig,\n headingMedium: pageElementConfig,\n headingSmall: pageElementConfig,\n bodyText: pageElementConfig,\n link: pageLinkElementConfig,\n} as const;\n\nexport const pageElementsV2 = {\n pageTitle: pageElementConfig,\n pageDescription: pageElementConfig,\n headingXLarge: pageElementConfig,\n headingLarge: pageElementConfig,\n headingMedium: pageElementConfig,\n headingSmall: pageElementConfig,\n headingXSmall: pageElementConfig,\n bodyText: pageElementConfig,\n link: pageLinkElementConfig,\n} as const;\n\nexport type PageElementNames = keyof typeof pageElementsV2;\nexport type PageElementConfig = (typeof pageElementsV2)[PageElementNames];\n","import { Describe, type, union, optional } from 'superstruct'; // https://docs.superstructjs.org\nimport { ColorConfig, ColorConfigStruct } from './color-config';\nimport { TypographyConfig, TypographyConfigStruct } from './typography-config';\n\nexport interface NavCustomizationConfig extends TypographyConfig {\n accentColor?: ColorConfig;\n}\n\nexport interface PrimaryNavCustomizationConfig extends NavCustomizationConfig {\n hoverColor?: ColorConfig;\n backgroundColor?: ColorConfig;\n}\n\nexport type SecondaryNavCustomizationConfig = Omit<\n PrimaryNavCustomizationConfig,\n 'hoverColor'\n>;\n\nexport const NavCustomizationConfigStruct: Describe<NavCustomizationConfig> =\n union([\n TypographyConfigStruct,\n type({\n accentColor: optional(ColorConfigStruct),\n }),\n ]);\n\n// hoverColor: optional(ColorConfigStruct),\nexport const PrimaryNavCustomizationConfigStruct: Describe<PrimaryNavCustomizationConfig> =\n union([\n NavCustomizationConfigStruct,\n type({\n hoverColor: optional(ColorConfigStruct),\n backgroundColor: optional(ColorConfigStruct),\n }),\n ]);\n\nexport const SecondaryNavCustomizationConfigStruct: Describe<SecondaryNavCustomizationConfig> =\n union([\n NavCustomizationConfigStruct,\n type({\n backgroundColor: optional(ColorConfigStruct),\n }),\n ]);\n\nconst navCustomizationConfig: NavCustomizationConfig = {};\nconst secondaryNavCustomizationConfig: SecondaryNavCustomizationConfig = {};\nconst primaryNavCustomizationConfig: PrimaryNavCustomizationConfig = {};\n\nexport const customizableNavElements = {\n primaryNav: primaryNavCustomizationConfig,\n secondaryNav: secondaryNavCustomizationConfig,\n tabs: navCustomizationConfig,\n} as const;\n\nexport type CustomizableNavElementNames = keyof typeof customizableNavElements;\nexport type CustomizableNavElementConfig =\n (typeof customizableNavElements)[CustomizableNavElementNames];\n","import type { JSONContent } from '@tiptap/core';\nimport { TokenType, TokenVarType } from './design-tokens-types';\n\nexport const BlockSizes = ['large', 'medium', 'small'] as const;\ntype BlockSize = (typeof BlockSizes)[number];\n\nexport const BlockSpacings = ['large', 'medium', 'small'] as const;\ntype BlockSpacing = (typeof BlockSpacings)[number];\n\nexport type BlockHeader = {\n showHeader?: boolean;\n title?: string;\n description?: string;\n};\n\n/**\n * Data for blocks made using the `createEmbedBlock` function\n */\ntype IframeBlockData = {\n url?: string;\n clickToInteract: boolean;\n height?: number | string;\n};\n\ntype BlockConfigBase<\n BlockType extends string,\n Data extends Record<string, unknown> = never,\n> = {\n // Unique across all blocks, basically a UUID upon creation\n // e.g. `ut79D2X_H`\n id: string;\n // Match this to a Slices `id` to use it\n blockType: BlockType;\n data: Data;\n header?: BlockHeader;\n size?: BlockSize;\n /** Controls the amount of spacing AFTER a block */\n spacing?: BlockSpacing;\n};\n\ntype BlockConfigUnion =\n | BlockConfigBase<\n 'component-spec-block',\n {\n patternId?: string;\n templateId?: string;\n collapsible?: boolean;\n expanded?: boolean;\n }\n >\n | BlockConfigBase<\n 'pattern-template-block',\n {\n patternId?: string;\n templateId?: string;\n demoId?: string;\n /** @deprecated */\n demoSize?: string;\n showSchemaForm?: boolean;\n showCodeSnippet?: boolean;\n hideControls?: boolean;\n allowResizing?: boolean;\n }\n >\n | BlockConfigBase<\n 'design-src-tiles',\n {\n columns?: '4' | '3' | '2' | '1';\n imageStyles?: {\n align?: 'left' | 'right' | 'center';\n background?: 'dark' | 'light' | 'none';\n corners?: 'square' | 'rounded';\n fit?: 'contain' | 'fill';\n seamless?: boolean;\n size?: 'auto' | 'small' | 'medium' | 'large' | 'xsmall' | 'xlarge';\n };\n items: {\n description?: JSONContent;\n fileId: string;\n nodeId: string;\n title?: string;\n }[];\n layout?: 'grid' | 'list';\n hideComponentProps?: boolean;\n }\n >\n | BlockConfigBase<\n 'design-src-component',\n {\n fileId: string;\n componentId: string;\n contents: Array<'variants' | 'spec' | 'usage'>;\n styles?: {\n columns?: '4' | '3' | '2' | '1';\n image?: {\n align?: 'left' | 'right' | 'center';\n background?: 'dark' | 'light';\n corners?: 'square' | 'rounded';\n size?: 'auto' | 'small' | 'medium' | 'large' | 'xsmall' | 'xlarge';\n };\n layout?: 'grid' | 'list';\n };\n hideComponentProps?: boolean;\n hideComponentTitles?: boolean;\n }\n >\n | BlockConfigBase<\n 'text-editor',\n {\n autoFocus?: boolean;\n content: JSONContent;\n }\n >\n | BlockConfigBase<\n 'files-list',\n {\n files: string[];\n }\n >\n | BlockConfigBase<\n 'callout',\n {\n type: 'error' | 'info' | 'success' | 'warning';\n content: JSONContent;\n }\n >\n | BlockConfigBase<\n 'code-snippet',\n {\n content: JSONContent;\n }\n >\n | BlockConfigBase<'divider-block', Record<string, never>>\n | BlockConfigBase<\n 'guidelines',\n {\n guidelines: {\n id: string;\n image?: {\n src: string;\n title?: string;\n alt?: string;\n };\n imageFit?: 'contain' | 'cover';\n type: 'caution' | 'do' | 'dont';\n content?: JSONContent;\n }[];\n gridStyles?: {\n centered?: boolean;\n columns?: '4' | '3' | '2' | '1';\n };\n tileStyles?: {\n headerBeforeImage?: boolean;\n imageOutlined?: boolean;\n imageRounded?: boolean;\n imageSize?:\n | 'none'\n | 'small'\n | 'medium'\n | 'large'\n | 'xsmall'\n | 'xlarge';\n };\n }\n >\n | BlockConfigBase<\n 'image-block',\n {\n imageSize?: 'xs' | 's' | 'm' | 'l' | 'full';\n images?: {\n caption?: string;\n src: string;\n }[];\n }\n >\n | BlockConfigBase<\n 'shortcut-tiles',\n {\n shortcuts: {\n description?: string;\n id: string;\n image?: string;\n link: {\n external?: boolean;\n name?: string;\n path: string;\n };\n title: string;\n }[];\n gridStyles?: {\n columns?: '4' | '3' | '2' | '1';\n centered?: boolean;\n gapSize?: number;\n };\n tileStyles?: {\n imageSize?: 'none' | 'xsmall' | 'small' | 'medium' | 'large';\n outlined?: boolean;\n rounded?: boolean;\n titleSize?: 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';\n };\n }\n >\n | BlockConfigBase<\n 'table',\n {\n content: JSONContent;\n }\n >\n | BlockConfigBase<\n 'pattern-variations',\n {\n patternId?: string;\n templateId?: string;\n demoId?: string;\n variationId?: string;\n assetSetId?: string;\n excludePropValue?: string;\n includePropValue?: string;\n size?: 's' | 'm' | 'l' | 'full';\n /** @deprecated */\n hideBlockTitle?: boolean;\n }\n >\n | BlockConfigBase<\n 'design-tokens',\n {\n tokenType: TokenType | '';\n demoId: string;\n groupIds: string[];\n exclude?: string;\n include?: string;\n }\n >\n | BlockConfigBase<\n 'design-token-collection',\n {\n collectionId: string;\n modeIds?: string[];\n groupIds?: string[];\n exclude?: string;\n include?: string;\n varType?: TokenVarType;\n display?: 'color-swatches' | 'table';\n }\n >\n | BlockConfigBase<\n 'pattern-list-block',\n {\n itemSize?: 'small' | 'medium' | 'large' | 'full';\n showDescriptions?: boolean;\n excludePatterns?: string[];\n }\n >\n | BlockConfigBase<\n 'pattern-status-table-block',\n {\n excludeHiddenNavItems?: boolean;\n excludePatterns?: string[];\n }\n >\n | BlockConfigBase<\n 'video',\n {\n video: {\n format: string;\n name: string;\n size: string;\n url: string;\n };\n }\n >\n /** @deprecated */\n | BlockConfigBase<\n 'design-token-block',\n {\n tokens?: {\n type?: TokenType;\n category?: string;\n tags?: string[];\n name?: string;\n exclude?: string;\n };\n demo?: {\n id?: string;\n };\n }\n >\n | BlockConfigBase<'generic-iframe', IframeBlockData>\n | BlockConfigBase<'abstract-block', IframeBlockData>\n | BlockConfigBase<'adobe-xd-block', IframeBlockData>\n | BlockConfigBase<'airtable-block', IframeBlockData>\n | BlockConfigBase<'figma-block', IframeBlockData>\n | BlockConfigBase<'framer-cloud-block', IframeBlockData>\n | BlockConfigBase<'lucidchart-block', IframeBlockData>\n | BlockConfigBase<'storybook-block', IframeBlockData>\n | BlockConfigBase<'vimeo-block', IframeBlockData>\n | BlockConfigBase<'youtube-block', IframeBlockData>\n | BlockConfigBase<'whimsical-block', IframeBlockData>\n | BlockConfigBase<\n 'markdown-block',\n {\n md?: string | string[];\n /** Automatically switches to edit mode + autofocuses on the editor */\n autoEdit?: boolean;\n columns?: number;\n }\n >;\n\n/**\n * This is the config for a block - which is what is stored in `block.ID.json` and available at `data.db.blocks.byId[blockId]`\n *\n * @example\n * // Use the first generic to filter down to a specific block type\n * type PatternListBlockConfig = BlockConfig<'pattern-list-block'>;\n * // Access the field `data` by doing this:\n * type Data= BlockConfig<'pattern-list-block'>['data'];\n */\nexport type BlockConfig<\n BlockType extends BlockConfigUnion['blockType'] = BlockConfigUnion['blockType'],\n> = Extract<BlockConfigUnion, { blockType: BlockType }>;\n\n/**\n * Block Collection \"location\" here refers to where in the Knapsack data model\n * the \"location\" of the data is. Older \"block collection\" concepts within `page`\n * `patternSubPage` and `patternTemplate` were just an array of block IDs. Newer,\n * \"real\" `blockCollectionsById` is an actual data model that holds a list of block\n * IDs, separate from the page or pattern.\n * */\nexport type BlockCollectionLocation =\n | {\n type: 'page';\n pageId: string;\n }\n /** Tab on Page */\n | {\n type: 'pageTab';\n pageId: string;\n tabId: string;\n }\n /** Tab on Pattern Page */\n | {\n type: 'patternSubPage';\n patternId: string;\n subPageId: string;\n }\n /** At bottom of Pattern Template page (under Spec table) - least used location */\n | {\n type: 'patternTemplate';\n patternId: string;\n templateId: string;\n };\n\n/**\n * A named set of blocks grouped together for reuse or composition.\n */\nexport type BlockCollection = {\n id: string;\n // @TODO: Add title and description when a user can define these through UI\n // title: string;\n // description?: string;\n\n /**\n * Array of Block IDs\n */\n blockIds: BlockConfig['id'][]; // string[]\n};\n","export const tokenNameDisplayFormats = {\n default: 'Default',\n android: 'Android',\n cssVar: 'CSS Var',\n json: 'JSON',\n less: 'Less',\n scss: 'SCSS',\n swift: 'Swift',\n} as const;\n\nexport type TokenNameDisplayFormat = keyof typeof tokenNameDisplayFormats;\n","import * as s from 'superstruct';\n\nexport const strokeStyleValues = [\n 'solid',\n 'dashed',\n 'dotted',\n 'double',\n 'groove',\n 'ridge',\n 'outset',\n 'inset',\n] as const;\n\n/**\n * Don't use this one, use this instead:\n * @see {@link TokenDefinitionSingular}\n */\ntype TokenDefinitionSingularRaw =\n | { type: 'string'; value: string }\n | { type: 'number'; value: number }\n | { type: 'boolean'; value: boolean }\n | { type: 'color'; value: string }\n | {\n type: 'strokeStyle';\n value: (typeof strokeStyleValues)[number];\n }\n | { type: 'dimension'; value: `${number}${'px' | 'rem' | 'em' | '%'}` }\n | { type: 'duration'; value: `${number}ms` }\n // | { type: 'fontFamily'; value: string | string[] }\n | {\n type: 'fontWeight';\n // @TODO: Include union of possible strings https://tr.designtokens.org/format/#font-weight\n value: string | number;\n }\n | { type: 'cubicBezier'; value: [number, number, number, number] };\n\n/**\n * Definitions for both singular (non-composite) tokens.\n * Use first generic param to get just that type.\n * @example\n * ```ts\n * type TokenDefinitionDimension = TokenDefinitionSingular<'dimension'>\n * ```\n */\nexport type TokenDefinitionSingular<\n TheTokenType extends TokenDefinitionSingularRaw['type'] = TokenDefinitionSingularRaw['type'],\n> = Extract<TokenDefinitionSingularRaw, { type: TheTokenType }>;\n\n/**\n * Don't use this one, use this instead:\n * @see {@link TokenDefinitionComposite}\n */\ntype TokenDefinitionCompositeRaw =\n | {\n type: 'border';\n value: {\n color: { type: 'color' };\n style: { type: 'strokeStyle' };\n width: { type: 'dimension' };\n };\n }\n | {\n type: 'shadow';\n value: {\n color: { type: 'color' };\n offsetX: { type: 'dimension' };\n offsetY: { type: 'dimension' };\n spread: { type: 'dimension' };\n blur: { type: 'dimension' };\n inset: { type: 'boolean' };\n };\n }\n | {\n type: 'transition';\n value: {\n duration: { type: 'duration' };\n delay: { type: 'duration' };\n timingFunction: { type: 'cubicBezier' };\n };\n };\n// | {\n// type: 'gradient';\n// value: {\n// color: { type: 'color' };\n// position: { type: 'dimension' };\n// }[];\n// };\n\n/**\n * Definitions for composite tokens.\n * Use first generic param to get just that type.\n * @example\n * ```ts\n * type TokenDefinitionShadow = TokenDefinitionComposite<'shadow'>\n * ```\n */\nexport type TokenDefinitionComposite<\n TheTokenType extends TokenDefinitionCompositeRaw['type'] = TokenDefinitionCompositeRaw['type'],\n> = Extract<TokenDefinitionCompositeRaw, { type: TheTokenType }>;\n\n/**\n * Definitions for both singular and composite tokens.\n * Use first generic param to get just that type.\n * @example\n * ```ts\n * type TokenDefinitionDimension = TokenDefinition<'dimension'>\n * ```\n */\nexport type TokenDefinition<\n TheTokenType extends\n | TokenDefinitionComposite['type']\n | TokenDefinitionSingular['type'] =\n | TokenDefinitionComposite['type']\n | TokenDefinitionSingular['type'],\n> = Extract<\n TokenDefinitionComposite | TokenDefinitionSingular,\n { type: TheTokenType }\n>;\n\nexport type TokenReference = `{${string}}`;\n/** ensures there is no `{}` */\nexport type NotTokenReference<T> = T extends TokenReference ? never : T;\n\nexport function isTokenReference(val: unknown): val is TokenReference {\n if (typeof val !== 'string') return false;\n // total times `{` appears in `val`\n // Handle situation `{a.b} {c.d}`. Ensure count of `{` and `}` === 1. This\n // guarantees we ONLY support a single reference, ie `{a.b}`\n const totalOpenBrackets = val.split('{').length - 1;\n return totalOpenBrackets === 1 && val.startsWith('{') && val.endsWith('}');\n}\n\nexport function hasTokenReferences(val: unknown): boolean {\n return typeof val === 'string' && val.includes('{');\n}\n\nexport function isNotTokenReference<T>(\n value: T,\n): value is NotTokenReference<T> {\n return !isTokenReference(value);\n}\n\nexport const TokenReferenceStruct = s.define<TokenReference>(\n 'Token Reference',\n (value) => {\n if (typeof value !== 'string') return false;\n if (isNotTokenReference(value)) {\n return 'Must start and end with curly braces';\n }\n return true;\n },\n);\n\nexport type TokenType = TokenDefinition['type'];\nexport type TokenTypeComposite = TokenDefinitionComposite['type'];\nexport type TokenTypeSingular = TokenDefinitionSingular['type'];\nexport type TokenValueSingular = TokenDefinitionSingular['value'];\n\n// We make a Record to ensure we have *every* possible value\n// b/c TS will yell at us if a new one is added but isn't included here\n// then we make an array out of them, so we can be sure we have *every* possible value\nconst compositeTypesRecord: Record<TokenTypeComposite, TokenTypeComposite> = {\n border: 'border',\n shadow: 'shadow',\n transition: 'transition',\n};\nexport const tokenTypeComposites = Object.values(compositeTypesRecord);\nconst singularTypesRecord: Record<TokenTypeSingular, TokenTypeSingular> = {\n string: 'string',\n number: 'number',\n boolean: 'boolean',\n color: 'color',\n dimension: 'dimension',\n duration: 'duration',\n // fontFamily: 'fontFamily',\n fontWeight: 'fontWeight',\n strokeStyle: 'strokeStyle',\n cubicBezier: 'cubicBezier',\n};\nexport const tokenTypeSingulars = Object.values(singularTypesRecord);\n/**\n * @deprecated You probably want `isTokenDataComposite`\n * @see {isTokenDataComposite}\n */\nexport function isTokenTypeComposite(\n type: TokenType,\n): type is TokenTypeComposite {\n return tokenTypeComposites.includes(type as TokenTypeComposite);\n}\n\nexport function isTokenTypeSingular(\n type: TokenType,\n): type is TokenTypeSingular {\n return tokenTypeSingulars.includes(type as TokenTypeSingular);\n}\n","import { Simplify, expectType, isObjKey, isObject } from '@knapsack/utils';\nimport * as s from 'superstruct';\nimport {\n NotTokenReference,\n TokenDefinition,\n TokenDefinitionComposite,\n TokenDefinitionSingular,\n TokenReference,\n TokenReferenceStruct,\n TokenType,\n hasTokenReferences,\n isTokenTypeComposite,\n} from './token-definitions';\nimport { TokenKsExtensions, TokenOrder } from './token-misc';\nimport { TokenSrcValue } from './token-src';\n\n/** Used for tokens AND groups */\ntype TokenDataBothCommon = {\n id: string;\n description?: string;\n};\n\n// Shows what a fully de-referenced `value` of a composite token would be\ntype CreateDataValueForComposite<\n ValueObj extends Record<string, { type: TokenDefinitionSingular['type'] }>,\n> = {\n [Key in keyof ValueObj]: TokenDefinitionSingular<\n ValueObj[Key]['type']\n >['value'];\n};\n\nexpectType<\n CreateDataValueForComposite<TokenDefinitionComposite<'shadow'>['value']>[]\n>([\n {\n inset: false,\n color: '#000',\n offsetX: '0px',\n offsetY: '0px',\n spread: '0px',\n blur: '0px',\n },\n {\n color: '#000',\n offsetX: '0px',\n offsetY: '0px',\n spread: '0px',\n blur: '0px',\n inset: true,\n },\n]);\n\ntype TokenDataCommon<\n Info extends {\n /** Basically the ID */\n type: TokenDefinition['type'];\n value: unknown;\n },\n> = TokenDataBothCommon & {\n type: Info['type'];\n value: Info['value'];\n /**\n * Extracted from `$extensions['cloud.knapsack'].token`\n */\n tokenConfig?: TokenKsExtensions['token'];\n /**\n * Tokens that are references by this token\n * @todo will need to change for shadow\n * @example\n * ```\n * [\n * ['color.primary', 'color.secondary'],\n * ['spacing.medium']\n * ]\n * ```\n */\n references?: Array<string[]>;\n /**\n * Tokens that use this as a reference token\n * @see {CreateTokenData.references}\n * @example\n * * ```\n * [\n * ['color.primary', 'color.secondary'],\n * ['spacing.medium']\n * ]\n * ```\n */\n // referencedBy?: Array<string[]>;\n};\n\ntype CreateTokenData<\n Info extends {\n type: TokenDefinition['type'];\n value: unknown;\n },\n> =\n | ({\n kind: 'ref';\n /** Has `{}` removed */\n referencedTokenId: string;\n originalValue: TokenReference;\n } & TokenDataCommon<Info>)\n | ({\n kind: 'static';\n originalValue: NotTokenReference<TokenSrcValue<Info['type']>>;\n } & TokenDataCommon<Info>);\n\nconst TokenDataBaseStruct: s.Describe<\n TokenDataBothCommon & {\n references?: Array<string[]>;\n tokenConfig?: TokenKsExtensions['token'];\n }\n> = s.type({\n id: s.string(),\n description: s.optional(s.string()),\n references: s.optional(s.array(s.array(s.string()))),\n tokenConfig: s.optional(\n s.type({\n purpose: s.optional(s.string()),\n }),\n ),\n});\n\ntype TokenDataSingularRaw = {\n // ignore the key, this makes a discriminated union out of the values\n [TokenDef in TokenDefinitionSingular as TokenDef['type']]: Simplify<\n CreateTokenData<TokenDef>\n >;\n}[TokenDefinitionSingular['type']];\n\nexport type TokenDataSingular<\n TT extends TokenDataSingularRaw['type'] = TokenDataSingularRaw['type'],\n> = Extract<TokenDataSingularRaw, { type: TT }>;\n\nexpectType<TokenDataSingular[]>([\n {\n type: 'duration',\n value: '1ms',\n originalValue: '1ms',\n id: '1',\n kind: 'static',\n },\n {\n type: 'duration',\n value: '1ms',\n kind: 'ref',\n id: '1',\n originalValue: '{a.b}',\n referencedTokenId: '1',\n },\n // @ts-expect-error - kind is wrong\n {\n type: 'duration',\n value: '1ms',\n originalValue: '1ms',\n id: '1',\n kind: 'ref',\n },\n // @ts-expect-error - kind is wrong\n {\n type: 'duration',\n value: '1ms',\n kind: 'static',\n id: '1',\n originalValue: '{a.b}',\n referencedTokenId: '1',\n },\n {\n type: 'color',\n value: '#000',\n kind: 'static',\n id: '1',\n originalValue: '#000',\n },\n {\n type: 'color',\n value: '#000',\n kind: 'ref',\n id: '1',\n originalValue: '{c.b}',\n referencedTokenId: 'c.b',\n },\n {\n type: 'cubicBezier',\n kind: 'static',\n value: [0, 0, 0, 1],\n originalValue: [0, 0, 0, 1],\n id: '1',\n },\n]);\n\ntype TokenDataCompositeRaw = {\n [TokenType in TokenDefinitionComposite['type']]: Simplify<\n CreateTokenData<{\n type: TokenType;\n value: Simplify<\n CreateDataValueForComposite<\n TokenDefinitionComposite<TokenType>['value']\n >\n >;\n }>\n >;\n}[TokenDefinitionComposite['type']];\n\nexport type TokenDataComposite<\n TheTokenType extends TokenDataCompositeRaw['type'] = TokenDataCompositeRaw['type'],\n> = Extract<TokenDataCompositeRaw, { type: TheTokenType }>;\n\nexport function isTokenDataComposite(\n tokenData: TokenData,\n): tokenData is TokenDataComposite {\n return isTokenTypeComposite(tokenData.type);\n}\n\nexpectType<TokenDataComposite[]>([\n {\n type: 'border',\n kind: 'static',\n id: '1',\n value: {\n color: '#000',\n style: 'solid',\n width: '1px',\n },\n originalValue: {\n color: '#000',\n style: 'solid',\n width: '1px',\n },\n },\n {\n type: 'border',\n kind: 'ref',\n referencedTokenId: 'a.b',\n id: '1',\n value: {\n color: 'red',\n style: 'dashed',\n width: '2px',\n },\n originalValue: '{a.b}',\n },\n {\n type: 'shadow',\n value: {\n color: '#000',\n offsetX: '1px',\n offsetY: '1px',\n blur: '1px',\n spread: '1px',\n inset: false,\n },\n originalValue: {\n color: '#000',\n offsetX: '{a.a}',\n offsetY: '1px',\n blur: '1px',\n spread: '1px',\n inset: false,\n },\n id: '1',\n kind: 'static',\n },\n {\n type: 'shadow',\n kind: 'ref',\n referencedTokenId: 'a.b',\n value: {\n inset: true,\n color: 'red',\n offsetX: '1px',\n blur: '2px',\n offsetY: '3px',\n spread: '4px',\n },\n originalValue: '{a.b}',\n id: '1',\n },\n {\n type: 'transition',\n value: {\n duration: '100ms',\n delay: '200ms',\n timingFunction: [0, 0, 0, 0],\n },\n originalValue: '{a.b}',\n kind: 'ref',\n referencedTokenId: 'a.b',\n id: '1',\n },\n {\n type: 'transition',\n kind: 'static',\n value: {\n duration: '100ms',\n delay: '200ms',\n timingFunction: [0, 0, 0, 0],\n },\n originalValue: {\n duration: '100ms',\n delay: '{a.c}',\n timingFunction: '{a.c}',\n },\n id: '1',\n },\n {\n type: 'transition',\n kind: 'static',\n value: {\n duration: '100ms',\n delay: '200ms',\n timingFunction: [0, 0, 0, 0],\n },\n originalValue: {\n duration: '100ms',\n delay: '200ms',\n timingFunction: [0, 0, 0, 0],\n },\n id: '1',\n },\n]);\n\nexport type TokenData<\n TheTokenType extends TokenDataSingular['type'] | TokenDataComposite['type'] =\n | TokenDataSingular['type']\n | TokenDataComposite['type'],\n> = Extract<TokenDataSingular | TokenDataComposite, { type: TheTokenType }>;\n\nexport type TokenGroupData = Simplify<\n {\n type?: TokenType;\n /**\n * Extracted from `$extensions['cloud.knapsack'].group`\n */\n groupConfig?: TokenKsExtensions['group'];\n children: TokenOrder;\n } & TokenDataBothCommon\n>;\n\n/**\n * @deprecated Use `TokenValueColorStruct` instead\n */\nexport function isTokenValueColor(\n value: unknown,\n): value is TokenDefinitionSingular<'color'>['value'] {\n return typeof value === 'string' && !hasTokenReferences(value);\n}\n\nexport const TokenValueColorStruct = s.define<TokenData<'color'>['value']>(\n 'Color Value',\n (value) => {\n if (typeof value !== 'string') {\n return 'Value must be a string';\n }\n if (value === '') {\n return 'Value must not be empty';\n }\n if (hasTokenReferences(value)) {\n return 'Value must not contain {} (token references)';\n }\n return true;\n },\n);\n\nconst TokenDataColorNonRefStruct: s.Describe<\n Extract<TokenData<'color'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('color'),\n value: TokenValueColorStruct,\n kind: s.literal('static'),\n originalValue: TokenValueColorStruct,\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataColorRefStruct: s.Describe<\n Extract<TokenData<'color'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('color'),\n value: TokenValueColorStruct,\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\n/**\n * @deprecated Use `TokenValueDimensionStruct` instead\n */\nexport function isTokenValueDimension(\n value: unknown,\n): value is TokenDefinitionSingular<'dimension'>['value'] {\n return (\n typeof value === 'string' &&\n (value.endsWith('px') || value.endsWith('rem')) &&\n !hasTokenReferences(value)\n );\n}\n\nexport const TokenValueDimensionStruct = s.define<\n TokenData<'dimension'>['value']\n>('Dimension Value', (value) => {\n if (typeof value !== 'string') {\n return 'Value must be a string';\n }\n if (hasTokenReferences(value)) {\n return 'Value must not contain {} (token references)';\n }\n if (\n !value.endsWith('px') &&\n !value.endsWith('rem') &&\n !value.endsWith('em') &&\n !value.endsWith('%')\n ) {\n return 'Value must end with px, rem, em or %';\n }\n return true;\n});\n\nconst TokenDataDimensionNonRefStruct: s.Describe<\n Extract<TokenData<'dimension'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('dimension'),\n value: TokenValueDimensionStruct,\n kind: s.literal('static'),\n originalValue: TokenValueDimensionStruct,\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataDimensionRefStruct: s.Describe<\n Extract<TokenData<'dimension'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('dimension'),\n value: TokenValueDimensionStruct,\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\n/**\n * @deprecated Use `TokenValueDurationStruct` instead\n */\nexport function isTokenValueDuration(\n value: unknown,\n): value is TokenDefinitionSingular<'duration'>['value'] {\n return (\n typeof value === 'string' &&\n value.endsWith('ms') &&\n !hasTokenReferences(value)\n );\n}\n\nexport const TokenValueDurationStruct = s.define<\n TokenData<'duration'>['value']\n>('Duration Value', (value) => {\n if (typeof value !== 'string') {\n return 'Value must be a string';\n }\n if (hasTokenReferences(value)) {\n return 'Value must not contain {} (token references)';\n }\n\n const durationRegex = /^\\d+ms$/;\n if (!durationRegex.test(value)) {\n return 'Value must be a number followed by \"ms\" (e.g., \"100ms\")';\n }\n\n return true;\n});\n\nconst TokenDataDurationNonRefStruct: s.Describe<\n Extract<TokenData<'duration'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('duration'),\n value: TokenValueDurationStruct,\n kind: s.literal('static'),\n originalValue: TokenValueDurationStruct,\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataDurationRefStruct: s.Describe<\n Extract<TokenData<'duration'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('duration'),\n value: TokenValueDurationStruct,\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\n/**\n * @deprecated Use `TokenValueFontWeightStruct` instead\n */\nexport function isTokenValueFontWeight(\n value: unknown,\n): value is TokenDefinitionSingular<'fontWeight'>['value'] {\n return (\n (typeof value === 'string' || typeof value === 'number') &&\n !hasTokenReferences(value)\n );\n}\n\nexport const TokenValueFontWeightStruct = s.define<\n TokenData<'fontWeight'>['value']\n>('Font Weight Value', (value) => {\n if (typeof value !== 'string' && typeof value !== 'number') {\n return 'Value must be a string or number';\n }\n if (hasTokenReferences(value)) {\n return 'Value must not contain {} (token references)';\n }\n return true;\n});\n\nconst TokenDataFontWeightNonRefStruct: s.Describe<\n Extract<TokenData<'fontWeight'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('fontWeight'),\n value: TokenValueFontWeightStruct,\n kind: s.literal('static'),\n originalValue: TokenValueFontWeightStruct,\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataFontWeightRefStruct: s.Describe<\n Extract<TokenData<'fontWeight'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('fontWeight'),\n value: TokenValueFontWeightStruct,\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\nexport const TokenValueCubicBezierStruct = s.define<\n TokenData<'cubicBezier'>['value']\n>('Cubic Bezier Value', (value) => {\n if (!Array.isArray(value)) {\n return 'Value must be an array';\n }\n if (value.length !== 4) {\n return 'Value must be an array of 4 numbers';\n }\n if (!value.every((v) => typeof v === 'number')) {\n return 'Value must be an array of 4 numbers';\n }\n // check if the first and third values are between 0 and 1\n // cubic-bezier( <number [0,1]> , <number> , <number [0,1]> , <number> )\n if (value[0] < 0 || value[0] > 1 || value[2] < 0 || value[2] > 1) {\n return 'The first and third cubicBezier values must be between 0 and 1';\n }\n return true;\n});\n\nconst TokenDataCubicBezierNonRefStruct: s.Describe<\n Extract<TokenData<'cubicBezier'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('cubicBezier'),\n value: TokenValueCubicBezierStruct,\n kind: s.literal('static'),\n originalValue: TokenValueCubicBezierStruct,\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataCubicBezierRefStruct: s.Describe<\n Extract<TokenData<'cubicBezier'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('cubicBezier'),\n value: TokenValueCubicBezierStruct,\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\n/**\n * Determines if it's a \"shadow\" token value AND totally de-referenced\n */\nexport function isTokenValueShadow(\n value: unknown,\n): value is Simplify<\n CreateDataValueForComposite<TokenDefinitionComposite<'shadow'>['value']>\n> {\n return (\n isObject(value) &&\n isTokenValueColor(value.color) &&\n isTokenValueDimension(value.offsetX) &&\n isTokenValueDimension(value.offsetY) &&\n isTokenValueDimension(value.blur) &&\n isTokenValueDimension(value.spread)\n );\n}\n\nconst TokenValueShadowStruct = s.define<TokenData<'shadow'>['value']>(\n 'Shadow Value',\n (value) => {\n if (isTokenValueShadow(value)) return true;\n return `Expected a shadow value, got ${JSON.stringify(value)}`;\n },\n);\n\nconst TokenDataShadowNonRefStruct: s.Describe<\n Extract<TokenData<'shadow'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('shadow'),\n value: TokenValueShadowStruct,\n kind: s.literal('static'),\n originalValue: s.type({\n color: s.union([TokenValueColorStruct, TokenReferenceStruct]),\n offsetX: s.union([TokenValueDimensionStruct, TokenReferenceStruct]),\n offsetY: s.union([TokenValueDimensionStruct, TokenReferenceStruct]),\n blur: s.union([TokenValueDimensionStruct, TokenReferenceStruct]),\n spread: s.union([TokenValueDimensionStruct, TokenReferenceStruct]),\n inset: s.union([\n // marking this as optional b/c it could be `undefined` instead of `false`\n s.optional(s.boolean()),\n TokenReferenceStruct,\n ]),\n }),\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataShadowRefStruct: s.Describe<\n Extract<TokenData<'shadow'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('shadow'),\n value: TokenValueShadowStruct,\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\nexport const TokenValueStrokeStyleStruct = s.union([\n s.literal('solid'),\n s.literal('dashed'),\n s.literal('dotted'),\n s.literal('double'),\n s.literal('groove'),\n s.literal('ridge'),\n s.literal('outset'),\n s.literal('inset'),\n]);\n\n/**\n * Determines if it's a \"border\" token value AND totally de-referenced\n */\nexport function isTokenValueBorder(\n value: unknown,\n): value is Simplify<\n CreateDataValueForComposite<TokenDefinitionComposite<'border'>['value']>\n> {\n return (\n isObject(value) &&\n TokenValueColorStruct.is(value.color) &&\n TokenValueStrokeStyleStruct.is(value.style) &&\n TokenValueDimensionStruct.is(value.width)\n );\n}\n\nconst TokenValueBorderStruct = s.define<TokenData<'border'>['value']>(\n 'Border Value',\n isTokenValueBorder,\n);\n\nconst TokenDataBorderNonRefStruct: s.Describe<\n Extract<TokenData<'border'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('border'),\n value: TokenValueBorderStruct,\n kind: s.literal('static'),\n originalValue: s.type({\n color: s.union([TokenValueColorStruct, TokenReferenceStruct]),\n style: s.union([TokenValueStrokeStyleStruct, TokenReferenceStruct]),\n width: s.union([TokenValueDimensionStruct, TokenReferenceStruct]),\n }),\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataBorderRefStruct: s.Describe<\n Extract<TokenData<'border'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('border'),\n value: TokenValueBorderStruct,\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\n/**\n * Determines if it's a \"transition\" token value AND totally de-referenced\n */\nexport function isTokenValueTransition(\n value: unknown,\n): value is Simplify<\n CreateDataValueForComposite<TokenDefinitionComposite<'transition'>['value']>\n> {\n return (\n isObject(value) &&\n TokenValueCubicBezierStruct.is(value.timingFunction) &&\n TokenValueDurationStruct.is(value.duration) &&\n TokenValueDurationStruct.is(value.delay)\n );\n}\nconst TokenValueTransitionStruct = s.define<TokenData<'transition'>['value']>(\n 'Transition Value',\n isTokenValueTransition,\n);\n\nconst TokenDataTransitionNonRefStruct: s.Describe<\n Extract<TokenData<'transition'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('transition'),\n value: TokenValueTransitionStruct,\n kind: s.literal('static'),\n originalValue: s.type({\n timingFunction: s.union([\n TokenValueCubicBezierStruct,\n TokenReferenceStruct,\n ]),\n duration: s.union([TokenValueDurationStruct, TokenReferenceStruct]),\n delay: s.union([TokenValueDurationStruct, TokenReferenceStruct]),\n }),\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataTransitionRefStruct: s.Describe<\n Extract<TokenData<'transition'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('transition'),\n value: TokenValueTransitionStruct,\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataStringNonRefStruct: s.Describe<\n Extract<TokenData<'string'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('string'),\n value: s.string(),\n kind: s.literal('static'),\n originalValue: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataStringRefStruct: s.Describe<\n Extract<TokenData<'string'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('string'),\n value: s.string(),\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataStrokeStyleNonRefStruct: s.Describe<\n Extract<TokenData<'strokeStyle'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('strokeStyle'),\n value: TokenValueStrokeStyleStruct,\n kind: s.literal('static'),\n originalValue: TokenValueStrokeStyleStruct,\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataStrokeStyleRefStruct: s.Describe<\n Extract<TokenData<'strokeStyle'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('strokeStyle'),\n value: TokenValueStrokeStyleStruct,\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: TokenValueStrokeStyleStruct,\n }),\n TokenDataBaseStruct,\n);\n// const TokenDataFontFamilyNonRefStruct: s.Describe<\n// Extract<TokenData<'fontFamily'>, { kind: 'static' }>\n// > = s.assign(\n// s.type({\n// type: s.literal('fontFamily'),\n// value: s.union([s.string(), s.array(s.string())]),\n// kind: s.literal('static'),\n// originalValue: s.union([s.string(), s.array(s.string())]),\n// }),\n// TokenDataBaseStruct,\n// );\n\n// const TokenDataFontFamilyRefStruct: s.Describe<\n// Extract<TokenData<'fontFamily'>, { kind: 'ref' }>\n// > = s.assign(\n// s.type({\n// type: s.literal('fontFamily'),\n// value: s.union([s.string(), s.array(s.string())]),\n// kind: s.literal('ref'),\n// originalValue: TokenReferenceStruct,\n// referencedTokenId: s.string(),\n// }),\n// TokenDataBaseStruct,\n// );\n\nconst TokenDataNumberNonRefStruct: s.Describe<\n Extract<TokenData<'number'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('number'),\n value: s.number(),\n kind: s.literal('static'),\n originalValue: s.number(),\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataNumberRefStruct: s.Describe<\n Extract<TokenData<'number'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('number'),\n value: s.number(),\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataBooleanNonRefStruct: s.Describe<\n Extract<TokenData<'boolean'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('boolean'),\n value: s.boolean(),\n kind: s.literal('static'),\n originalValue: s.boolean(),\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataBooleanRefStruct: s.Describe<\n Extract<TokenData<'boolean'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('boolean'),\n value: s.boolean(),\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\n// Instead of using `s.union` to combine all the token data structs,\n// we first find out what \"type\" the token is\n// then we find out `kind` - which is our 2nd layer of discriminated union\n// and then use the specific struct\n// that way the errors are more specific to the actual declared token \"type\"\n// In a nutshell, `s.union` is not very good at discriminated unions errors\nexport const assertTokenData = (data: unknown): asserts data is TokenData => {\n if (!isObject(data)) {\n throw new Error(\n `Expected token data to be an object, got ${JSON.stringify(data)}`,\n );\n }\n if (!isObjKey('type', data)) {\n throw new Error(\n `Expected token data to have a \"type\" property, got ${JSON.stringify(\n data,\n )}`,\n );\n }\n if (typeof data.type !== 'string') {\n throw new Error(\n `Expected token data \"type\" property to be a string, got ${JSON.stringify(\n data,\n )}`,\n );\n }\n const type = data.type as TokenData['type'];\n const kind = data.kind as TokenData['kind'];\n try {\n switch (type) {\n case 'boolean':\n if (kind === 'ref') {\n TokenDataBooleanRefStruct.assert(data);\n } else {\n TokenDataBooleanNonRefStruct.assert(data);\n }\n return;\n case 'border':\n if (kind === 'ref') {\n TokenDataBorderRefStruct.assert(data);\n } else {\n TokenDataBorderNonRefStruct.assert(data);\n }\n return;\n case 'color':\n if (kind === 'ref') {\n TokenDataColorRefStruct.assert(data);\n } else {\n TokenDataColorNonRefStruct.assert(data);\n }\n return;\n case 'cubicBezier':\n if (kind === 'ref') {\n TokenDataCubicBezierRefStruct.assert(data);\n } else {\n TokenDataCubicBezierNonRefStruct.assert(data);\n }\n return;\n case 'dimension':\n if (kind === 'ref') {\n TokenDataDimensionRefStruct.assert(data);\n } else {\n TokenDataDimensionNonRefStruct.assert(data);\n }\n return;\n case 'duration':\n if (kind === 'ref') {\n TokenDataDurationRefStruct.assert(data);\n } else {\n TokenDataDurationNonRefStruct.assert(data);\n }\n return;\n case 'fontWeight':\n if (kind === 'ref') {\n TokenDataFontWeightRefStruct.assert(data);\n } else {\n TokenDataFontWeightNonRefStruct.assert(data);\n }\n return;\n case 'number':\n if (kind === 'ref') {\n TokenDataNumberRefStruct.assert(data);\n } else {\n TokenDataNumberNonRefStruct.assert(data);\n }\n return;\n case 'shadow':\n if (kind === 'ref') {\n TokenDataShadowRefStruct.assert(data);\n } else {\n TokenDataShadowNonRefStruct.assert(data);\n }\n return;\n case 'string':\n if (kind === 'ref') {\n TokenDataStringRefStruct.assert(data);\n } else {\n TokenDataStringNonRefStruct.assert(data);\n }\n return;\n case 'strokeStyle': // temp implementation\n if (kind === 'ref') {\n TokenDataStrokeStyleRefStruct.assert(data);\n } else {\n TokenDataStrokeStyleNonRefStruct.assert(data);\n }\n return;\n // case 'fontFamily':\n // if (kind === 'ref') {\n // TokenDataFontFamilyRefStruct.assert(data);\n // } else {\n // TokenDataFontFamilyNonRefStruct.assert(data);\n // }\n // return;\n case 'transition':\n if (kind === 'ref') {\n TokenDataTransitionRefStruct.assert(data);\n } else {\n TokenDataTransitionNonRefStruct.assert(data);\n }\n return;\n default: {\n const _exhaustiveCheck: never = type;\n throw new Error(`Unknown token data type: ${type}`);\n }\n }\n } catch (error) {\n if (!(error instanceof s.StructError)) throw error;\n throw new Error(\n `Invalid token data for type \"${type}\": ${\n error.message\n }. Received this data: \"${JSON.stringify(data)}\"`,\n );\n }\n};\n","import { Simplify, expectType } from '@knapsack/utils';\nimport {\n TokenType,\n TokenDefinitionSingular,\n TokenDefinitionComposite,\n isTokenTypeComposite,\n isTokenTypeSingular,\n} from './token-definitions';\n\ntype CreateTokenSrcValueInfo<\n T extends {\n type: TokenType;\n value: unknown;\n },\n> =\n | {\n kind: 'ref';\n /** Has `{}` removed */\n referencedTokenId: string;\n isVarRef?: boolean;\n type: T['type'];\n }\n | {\n kind: 'static';\n type: T['type'];\n value: T['value'];\n };\n\ntype TokenSrcValueInfoSingularRaw = {\n // Ignore the key, pay attention to the value\n // The values become the items in the discriminated union\n [TheTokenType in TokenDefinitionSingular as TheTokenType['type']]: Simplify<\n CreateTokenSrcValueInfo<TheTokenType>\n >;\n}[TokenDefinitionSingular['type']];\n\n// This helper allows us to just pass the type string in to get that\n// item out of the discriminated union: `TokenSrcValueInfoSingular<'color'>`\ntype TokenSrcValueInfoSingular<\n TT extends TokenSrcValueInfoSingularRaw['type'] = TokenSrcValueInfoSingularRaw['type'],\n> = Extract<TokenSrcValueInfoSingularRaw, { type: TT }>;\n\nexpectType<TokenSrcValueInfoSingular<'dimension'>[]>([\n {\n type: 'dimension',\n kind: 'static',\n value: '1px',\n },\n {\n type: 'dimension',\n kind: 'ref',\n referencedTokenId: 'a.b',\n },\n]);\n\ntype CreateSrcValueInfoForComposite<\n ValueObj extends Record<string, { type: TokenDefinitionSingular['type'] }>,\n> = {\n [Key in keyof ValueObj]: Simplify<\n CreateTokenSrcValueInfo<{\n type: ValueObj[Key]['type'];\n value: TokenDefinitionSingular<ValueObj[Key]['type']>['value'];\n }>\n >;\n};\n\ntype TokenSrcValueInfoCompositeRaw = {\n [TheTokenType in TokenDefinitionComposite['type']]: Simplify<\n CreateTokenSrcValueInfo<{\n type: TheTokenType;\n value: Simplify<\n CreateSrcValueInfoForComposite<\n TokenDefinitionComposite<TheTokenType>['value']\n >\n >;\n }>\n >;\n}[TokenDefinitionComposite['type']];\n\ntype TokenSrcValueInfoComposite<\n TT extends TokenSrcValueInfoCompositeRaw['type'] = TokenSrcValueInfoCompositeRaw['type'],\n> = Extract<TokenSrcValueInfoCompositeRaw, { type: TT }>;\n\nexpectType<TokenSrcValueInfoComposite<'border'>[]>([\n {\n type: 'border',\n kind: 'ref',\n referencedTokenId: 'a.b',\n },\n {\n type: 'border',\n kind: 'static',\n value: {\n color: {\n kind: 'static',\n type: 'color',\n value: 'red',\n },\n style: {\n kind: 'ref',\n type: 'strokeStyle',\n referencedTokenId: '', // FIX\n },\n width: {\n kind: 'static',\n type: 'dimension',\n value: '2px',\n },\n },\n },\n]);\n\nexpectType<TokenSrcValueInfoComposite<'transition'>[]>([\n {\n type: 'transition',\n kind: 'ref',\n referencedTokenId: 'a.b',\n },\n {\n type: 'transition',\n kind: 'static',\n value: {\n delay: {\n kind: 'static',\n type: 'duration',\n value: '1ms',\n },\n duration: {\n kind: 'ref',\n type: 'duration',\n referencedTokenId: 'animation.slow',\n },\n timingFunction: {\n kind: 'static',\n type: 'cubicBezier',\n value: [0.4, 0.0, 0.2, 1],\n },\n },\n },\n]);\n\nexport type TokenSrcValueInfo<\n TT extends\n | TokenSrcValueInfoComposite['type']\n | TokenSrcValueInfoSingular['type'] =\n | TokenSrcValueInfoComposite['type']\n | TokenSrcValueInfoSingular['type'],\n TheKind extends\n | TokenSrcValueInfoComposite['kind']\n | TokenSrcValueInfoSingular['kind'] =\n | TokenSrcValueInfoComposite['kind']\n | TokenSrcValueInfoSingular['kind'],\n> = Extract<\n TokenSrcValueInfoComposite | TokenSrcValueInfoSingular,\n { type: TT; kind: TheKind }\n>;\n\nexport function isTokenSrcValueInfoSingular(\n tokenSrcValueInfo: TokenSrcValueInfo,\n): tokenSrcValueInfo is TokenSrcValueInfoSingular {\n return isTokenTypeSingular(tokenSrcValueInfo?.type);\n}\nexport function isTokenSrcValueInfoComposite(\n tokenSrcValueInfo: TokenSrcValueInfo,\n): tokenSrcValueInfo is TokenSrcValueInfoComposite {\n return isTokenTypeComposite(tokenSrcValueInfo?.type);\n}\n\nexpectType<TokenSrcValueInfo[]>([\n {\n type: 'dimension',\n kind: 'static',\n value: '1px',\n },\n {\n type: 'transition',\n kind: 'ref',\n referencedTokenId: 'a.b',\n },\n {\n type: 'transition',\n kind: 'ref',\n // @ts-expect-error - with `kind: 'ref'`, `value` is not allowed\n value: '1px',\n },\n {\n kind: 'ref',\n type: 'duration',\n referencedTokenId: 'animation.slow',\n },\n {\n kind: 'static',\n type: 'cubicBezier',\n value: [0.4, 0.0, 0.2, 1],\n },\n {\n type: 'transition',\n kind: 'static',\n value: {\n delay: {\n kind: 'static',\n type: 'duration',\n value: '1ms',\n },\n duration: {\n kind: 'ref',\n type: 'duration',\n referencedTokenId: 'animation.slow',\n },\n timingFunction: {\n kind: 'static',\n type: 'cubicBezier',\n value: [0.4, 0.0, 0.2, 1],\n },\n },\n },\n]);\n\n/**\n * A common object that is used to represent a token in the app.\n * Used in functions for editing communication between UI forms, Xstate,\n * and `@knapsack/design-tokens-utils`.\n */\nexport type TokenInfo<\n TheTokenType extends TokenSrcValueInfo['type'] = TokenSrcValueInfo['type'],\n> = {\n tokenSrcValueInfo: TokenSrcValueInfo<TheTokenType>;\n tokenId: string;\n description?: string;\n};\n","import { Simplify, expectType, isObjKey, isObject } from '@knapsack/utils';\nimport {\n TokenDefinitionComposite,\n TokenDefinitionSingular,\n TokenReference,\n TokenType,\n TokenDefinition,\n} from './token-definitions';\nimport { TokenKsExtensions } from './token-misc';\n\nexport type TokenSrcCommon<TheType extends TokenType = TokenType> = {\n $type?: TokenDefinition<TheType>['type'];\n $description?: string;\n $extensions?: {\n 'cloud.knapsack'?: TokenKsExtensions;\n };\n};\n\nexport function isTokenSrcExtensions(\n extensionsObj: unknown,\n): extensionsObj is TokenSrcCommon['$extensions'] {\n return isObject(extensionsObj) && isObjKey('cloud.knapsack', extensionsObj);\n}\n\ntype CreateSrcValueForComposite<\n ValueObj extends Record<string, { type: TokenDefinitionSingular['type'] }>,\n> = {\n [Key in keyof ValueObj]:\n | TokenReference\n | TokenDefinitionSingular<ValueObj[Key]['type']>['value'];\n};\n\ntype TokenSrcValueCompositeRaw = {\n [TheTokenType in TokenDefinitionComposite['type']]: Simplify<{\n type: TheTokenType;\n value: Simplify<\n CreateSrcValueForComposite<\n TokenDefinitionComposite<TheTokenType>['value']\n >\n >;\n }>;\n}[TokenDefinitionComposite['type']];\n\ntype TokenSrcValueComposite<\n TT extends TokenSrcValueCompositeRaw['type'] = TokenSrcValueCompositeRaw['type'],\n> = Extract<TokenSrcValueCompositeRaw, { type: TT }>;\n\ntype TokenSrcValueRaw = TokenDefinitionSingular | TokenSrcValueComposite;\n\nexport type TokenSrcValue<\n Type extends\n | TokenDefinitionSingular['type']\n | TokenSrcValueComposite['type'] =\n | TokenDefinitionSingular['type']\n | TokenSrcValueComposite['type'],\n> = Extract<TokenSrcValueRaw, { type: Type }>['value'] | TokenReference;\n\nexpectType<TokenSrcValue[]>([\n '#ddd',\n true,\n [83, 1, 1, 1],\n {\n color: '#000',\n style: 'solid',\n width: '1px',\n },\n {\n inset: true,\n color: '#000',\n offsetX: '0px',\n offsetY: '{spacing.medium}',\n spread: '0px',\n blur: '0px',\n },\n {\n timingFunction: '{timing.ease}',\n duration: '{timing.duration.medium}',\n delay: '7ms',\n color: '#000',\n },\n]);\n\nexport type TokenSrc<\n TheType extends\n | TokenDefinitionSingular['type']\n | TokenSrcValueComposite['type'] =\n | TokenDefinitionSingular['type']\n | TokenSrcValueComposite['type'],\n> = Simplify<\n {\n $value: TokenSrcValue<TheType>;\n } & TokenSrcCommon<TheType>\n>;\n\nexport function isTokenSrc(tokenObject: unknown): tokenObject is TokenSrc {\n if (isObject(tokenObject) && isObjKey('$value', tokenObject)) return true;\n return false;\n}\n\nexport type TokenSrcGroup = TokenSrcCommon & {\n [key: string]:\n | TokenSrcGroup\n | TokenSrc\n | TokenSrcCommon\n | TokenSrcCommon['$extensions'];\n};\n\nexport function isTokenGroup(\n tokenObject: unknown,\n): tokenObject is TokenSrcGroup {\n // @todo improve\n return (\n isObject(tokenObject) &&\n !isTokenSrcExtensions(tokenObject) &&\n !isObjKey('$value', tokenObject) &&\n // ensuring we are not in `$extensions` object\n !isObjKey('cloud.knapsack', tokenObject)\n );\n}\n\n// Token VAR references look like TokenSrcGroup\nexport function isTokenTypeVarRef(tokenObject: unknown) {\n // It's at least a TokenSrcGroup\n if (isTokenGroup(tokenObject)) {\n // The specific key within collectionInfo with the var reference\n const varRefCollectionInfo =\n tokenObject.$extensions['cloud.knapsack'].group.collectionInfo;\n if (\n isObjKey('type', varRefCollectionInfo) &&\n isObjKey('referenceId', varRefCollectionInfo)\n ) {\n return true;\n }\n }\n\n return false;\n}\n","import { parseNumberWithUnit } from '@knapsack/utils';\n\nexport function getPrimitiveValue(\n tokenValue: unknown,\n): 'string' | 'number' | 'boolean' {\n const type = typeof tokenValue;\n if (type === 'string' || type === 'number' || type === 'boolean') {\n return type;\n }\n throw new Error(\n `Invalid token value type: ${JSON.stringify(\n type,\n )}. Token value is: ${JSON.stringify(tokenValue)}`,\n );\n}\n\nexport type TokenDimensionUnit = 'px' | 'rem' | 'em' | '%';\n\n/**\n * Dimension strings require ending in 'px' or 'rem'\n * @see `libs/types/src/app-client-data/design-tokens-types/token-definitions.ts`\n */\nexport const isDimensionString = (\n value: string,\n): value is `${number}${'px' | 'rem' | 'em' | '%'}` =>\n value.includes('px') ||\n value.includes('rem') ||\n value.includes('em') ||\n value.includes('%');\n\n/**\n * Pass in values like `'12px'` to get detailed info\n * @throws if value is not a number or does not end in supported unit\n */\nexport function parseTokenDimensionValue(valueToParse: string | number): {\n value: number;\n unit?: TokenDimensionUnit;\n} {\n const { value, unit } = parseNumberWithUnit(valueToParse);\n if (!unit) {\n return { value };\n }\n if (unit !== 'px' && unit !== 'rem' && unit !== 'em' && unit !== '%') {\n throw new Error(`Invalid unit \"${unit}\" for value: ${value}`);\n }\n\n return { value, unit };\n}\n","import type { CSSProperties } from 'react';\nimport type { JsonSchemaObject } from '../json-schema';\nimport type { RendererId, TemplateInfo } from '../renderers';\nimport type { BlockConfig } from './blocks';\nimport type { ContentMeta, Folder, KnapsackImage } from '../misc';\nimport type { Page } from './page';\nimport type { PatternTab } from './tabs';\nimport type { TokenSrcValueInfo } from './design-tokens-types/token-src-value-info';\n\nexport interface KsStatus {\n id: string;\n title: string;\n color?: string;\n}\n\nexport interface KsStatusSet {\n id: string;\n title: string;\n statuses: KsStatus[];\n}\n\n/**\n * Used by template renderers in addition to `path`\n * Twig: `@components/button.twig`\n * Web Components: `my-button` => `<my-button>`\n * React: a named export of the file if not `default`\n * @todo Replace this with {@link TemplateInfo}\n */\ntype TemplateAlias = string;\n\nexport type SlottedTemplateDemo = {\n type: 'template-demo';\n /**\n * The demo referenced by `demoId` is inlined here before sending to server to\n * render, but is never stored in the json data. If this is present, it is\n * used instead of the demo referenced by `demoId`. This is done to ensure\n * server has all the latest data for a template demo by ensuring it includes\n * it's slotted children's data.\n * @see {inlineDemoData}\n */\n demo?: DemoWithData;\n /**\n * ID will be to demo that must be {@link DemoWithData}\n */\n demoId: DemoWithData['id'];\n};\n\n/**\n * i.e. Given a React Component, `Button`, this set to null/false would be\n * `<Button>` and set to true it would just be a reference to it: `Button`\n * @see {KsSlotInfo['isTemplateReference']}\n */\nexport type SlottedTemplateReference = {\n type: 'template-reference';\n patternId: string;\n templateId: string;\n};\n\nexport type SlottedText = {\n type: 'text';\n text: string;\n};\n\nexport type SlottedData =\n | SlottedText\n | SlottedTemplateDemo\n | SlottedTemplateReference;\n\n/**\n * Collection ID: Mode ID\n */\nexport type ThemeDefinition = {\n [collectionId: string]: string;\n};\n\nexport type SlotOptions = {\n /**\n * @default 'div'\n */\n wrappingElementName?: string;\n cssClasses?: string[];\n align?: {\n value:\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'left'\n | 'center'\n | 'right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n };\n layout?: {\n value: 'horizontal' | 'vertical' | 'wrap';\n };\n gap?: {\n value: TokenSrcValueInfo<'dimension'>;\n };\n paddingHorizontal?: {\n value: TokenSrcValueInfo<'dimension'>[];\n };\n paddingVertical?: {\n value: TokenSrcValueInfo<'dimension'>[];\n };\n /**\n * Collection ID: Mode ID\n */\n theme?: ThemeDefinition;\n};\n\n/**\n * These are created from {SlotOptions}\n * Only available in App Client for rendering - this is NOT saved in App Client Data\n */\nexport type SlotOptionsComputed = {\n styles: CSSProperties;\n cssClasses: string[];\n /**\n * @default 'div'\n */\n wrappingElementName: string;\n /**\n * can't be `style` or `class` or `className`\n */\n attributes: {\n [attributeName: string]: string;\n };\n};\n\nexport type KnapsackTemplateData = {\n /**\n * @todo Ideal would be `{ [key: string]: string | boolean | number }`\n */\n props: {\n [prop: string]: unknown;\n };\n slots?: {\n [slotName: string]: Array<SlottedData>;\n };\n /**\n * Settings from users are stored here and saved in App Client Data\n * This is used to dynamically create `slotsOptionsComputed`\n */\n slotsOptions?: {\n [slotName: string]: SlotOptions;\n };\n /**\n * Use `slotsOptions` to set & save styles on slotted children\n * Never set nor stored in App Client Data that gets saved\n * This is only inlined in the demo data for rendering so the App Client can\n * apply the styles to the slotted children\n * @see {inlineDemoData}\n */\n slotsOptionsComputed?: {\n [slotName: string]: SlotOptionsComputed;\n };\n};\n\ntype DemoBase = {\n id: string;\n title: string;\n description?: string;\n /**\n * Would override what was on the template\n */\n assetSetId?: string;\n width?: number;\n height?: number;\n /** Collection ID: Mode ID */\n theme?: ThemeDefinition;\n meta: ContentMeta;\n};\n\n/**\n * A {@link Demo} that has data from a form and a template to render\n * Uses `patternId` & `templateId` to find the template to render\n * @see {@link TemplateDemo}\n * @see {@link DataDemoWithTemplateInfo}\n */\nexport type DataDemo = DemoBase & {\n type: 'data';\n patternId: string;\n templateId: string;\n data: KnapsackTemplateData;\n};\n\n/**\n * A {@link Demo} that shows source code from a rendered template that is passed no data\n * @see {@link DataDemo}\n * @see {@link DataDemoWithTemplateInfo}\n */\nexport type TemplateDemo = DemoBase & {\n type: 'template';\n templateInfo: {\n alias?: TemplateAlias;\n path?: string;\n };\n};\n\n/**\n * A {@link Demo} that has data from a form and a template to render\n * Similar to {@link DataDemo} but instead of using `patternId` & `templateId`\n * it uses `templateInfo` which is {@link TemplateInfo} and contains renderer specific information\n * for finding things like package path & named export (which `patternId` & `templateId` were used to find)\n * @see {@link DataDemo}\n * @see {@link TemplateDemo}\n */\nexport type DataDemoWithTemplateInfo = DemoBase & {\n type: 'data-w-template-info';\n templateInfo: TemplateInfo;\n data: KnapsackTemplateData;\n};\n\n/**\n * A Demo that results in rendered HTML seen in iFrame Stage.\n * Can be one of:\n * - {@link DataDemo}\n * - {@link DataDemoWithTemplateInfo}\n * - {@link TemplateDemo}\n */\nexport type Demo = TemplateDemo | DataDemo | DataDemoWithTemplateInfo;\n\n/**\n * A {@link Demo} that has data from a form\n * @see {@link DataDemo}\n * @see {@link DataDemoWithTemplateInfo}\n * @see {@link isDemoWithData}\n */\nexport type DemoWithData = DataDemo | DataDemoWithTemplateInfo;\n\nexport type RenderDataDemo = Demo & {\n inlineStyles?: string;\n bodyAttributes?: Record<string, string>;\n};\n\n/**\n * Does this demo have data from the stage form?\n * Can be one of these kinds of {@link Demo} types:\n * - {@link DataDemo}\n * - {@link DataDemoWithTemplateInfo}\n */\nexport function isDemoWithData(\n demo: Demo,\n): demo is DataDemo | DataDemoWithTemplateInfo {\n return demo?.type === 'data' || demo?.type === 'data-w-template-info';\n}\n\nexport function isDataDemo(demo: Demo): demo is DataDemo {\n return demo?.type === 'data';\n}\n\nexport function isTemplateDemo(demo: Demo): demo is TemplateDemo {\n return demo?.type === 'template';\n}\n\nexport type KsSlotInfo = {\n title: string;\n description?: string;\n disallowText?: boolean;\n isRequired?: boolean;\n allowOnlyOne?: boolean;\n /**\n * i.e. Given a React Component, `Button`, this set to null/false would be\n * `<Button>` and set to true it would just be a reference to it: `Button`\n * @see {SlottedTemplateReference}\n */\n isTemplateReference?: boolean;\n allowedPatternIds?: string[];\n};\n\n/**\n * Supersedes `schema`\n */\nexport type KsTemplateSpec<\n IsInferred extends boolean | undefined = boolean | undefined,\n> = {\n /**\n * Attempt to create the props & slots spec by reading the source file.\n * Prevents ability to use spec editor.\n */\n isInferred?: IsInferred;\n /**\n * JSON Schema defining the serializable data passed in\n * The classic, formerly `schema`\n */\n props?: JsonSchemaObject;\n /**\n * Child component slots\n */\n propOrder?: string[];\n slots?: {\n [name: string]: KsSlotInfo;\n };\n slotOrder?: string[];\n /**\n * @todo evaluate & refine\n */\n // cssProps?: {\n // [name: string]: {\n // title: string;\n // description: string;\n // };\n // };\n hidePropsTable?: boolean;\n hideSlotsTable?: boolean;\n /**\n * Extra Docs are each shown in their own table.\n * Useful for non-traditional spec docs that are more template language specific.\n * Examples: events, methods, etc\n */\n extraDocs?: {\n id: string;\n title: string;\n description?: string;\n tableRows?: {\n [columnTitle: string]: string;\n }[];\n }[];\n};\n\n/**\n * Used in {@link KsSpecMeta}\n */\nexport type KsSpecPropConfig = {\n hidden?: boolean;\n};\n\n/**\n * Metadata for {@link KsTemplateSpec}\n * Kept outside of the `spec` object b/c when it's `isInferred: true` the whole object gets replaced with `{ isInferred: true }`\n */\nexport type KsSpecMeta = {\n propOrder?: string[];\n slotOrder?: string[];\n propFilters?: string[];\n propConfig?: Record<string, KsSpecPropConfig>;\n};\n\nexport interface KnapsackPatternTemplate {\n id: string;\n title?: string;\n /**\n * Relative file path to the template from the config file it is declared in\n */\n path: string;\n\n alias?: TemplateAlias;\n /**\n * Which template language? i.e. `twig`, `react` Replaces\n * KnapsackTemplateRenderer.test which ran a test on the file path (similar to\n * how WebPack loader `test` works)\n */\n templateLanguageId: RendererId;\n assetSetIds?: string[];\n spec?: { isInferred: true } | KsTemplateSpec<false | undefined>;\n specMeta?: KsSpecMeta;\n /** Array of demo IDs, actual demo data is stored in `db.demos.demosById` */\n demoIds: Demo['id'][];\n /** Array of block IDs, actual block content is stored in db.blocks.blocksById */\n blockIds: BlockConfig['id'][];\n}\n\n/**\n * Determines if a `template.spec` is not inferred and therefore has a `props` object\n * @see {@link KsTemplateSpec}\n */\nexport function isSpecNotInferred(\n spec: KnapsackPatternTemplate['spec'],\n): spec is KsTemplateSpec<false> {\n return typeof spec === 'object' && !spec.isInferred;\n}\n\nexport type KnapsackPattern = Page & {\n $schema?: string;\n statuses?: {\n [statusSetId: string]: string;\n };\n templates?: KnapsackPatternTemplate[];\n /**\n * @TODO: subPages will be deprecated in favor of tabs soon\n * */\n subPages?: {\n id: string;\n title: string;\n blockIds: BlockConfig['id'][];\n }[];\n designSrcComponentsById?: Record<\n string,\n {\n id: string;\n title: string;\n componentId: string;\n fileId: string;\n }\n >;\n /** Controls order of `templates` & `subPages` on Pattern Page */\n tabs?: PatternTab[];\n\n aliases?: string[];\n /**\n * Prevents pattern from appearing in System Overview and Status Table blocks\n */\n hideFromOverviewBlocks?: boolean;\n /**\n * Prevents pattern from appearing as an option in Component Embed and\n * Component Demo blocks\n */\n hideFromComponentBlocks?: boolean;\n hideStatusSets?: boolean;\n thumbnail?: KnapsackImage;\n demoFoldersById?: Record<string, Folder>;\n demoFoldersOrder?: Array<Folder['id']>;\n};\n\nexport interface KnapsackPatternTemplateCode {\n html: string;\n data?: Record<string, any>;\n templateSrc: string;\n usage: string;\n language: string;\n}\n\nexport type KnapsackPatternsConfig = {\n $schema?: string;\n statusSets: KsStatusSet[];\n};\n\nexport interface TemplateRendererMeta {\n id: RendererId;\n title: string;\n version?: string;\n aliasTitle?: string;\n aliasDescription?: string;\n aliasUse: 'off' | 'optional' | 'required';\n aliasIsJsNamedExport?: boolean;\n syntaxHighlightingLanguage?: string;\n enableDataDemos: boolean;\n enableTemplateDemos: boolean;\n hasSlotsSupport: boolean;\n hasSlotOptionsSupport?: boolean;\n hasTemplateImgSupport?: boolean;\n hasInferSpecSupport: boolean;\n hasTemplateSuggestionsSupport: boolean;\n prototypingTemplate?: {\n path: string;\n alias?: string;\n spec: Pick<KsTemplateSpec, 'props' | 'slots' | 'isInferred'>;\n };\n}\n\nexport type PatternsState = {\n patterns: {\n [id: string]: KnapsackPattern;\n };\n renderers: Partial<\n Record<\n RendererId,\n {\n meta: TemplateRendererMeta;\n }\n >\n >;\n} & KnapsackPatternsConfig;\n","import type { Role } from '../user-roles';\nimport type { BlockCollection } from './blocks';\n\nexport const patternTabTypes = {\n designSrc: 'Design Source',\n subPage: 'Subpage',\n template: 'Template',\n} as const;\n\n/**\n * Legacy pattern page tab that is of a certain type\n * @deprecated Use `PageTab` instead\n */\nexport type PatternTab = {\n hidden?: boolean;\n id: string;\n minRoleNeeded?: Role;\n type: keyof typeof patternTabTypes;\n};\n\n/**\n * A tab section within a page, referencing a BlockCollection as its content source.\n */\nexport type PageTab = {\n // Can be expanded into a union for future tab types\n type: 'block-collection-tab';\n id: string;\n title: string;\n /**\n * Slug for the tab. Used in URL path.\n * e.g./pages/[pageSlug]/[tabSlug]\n */\n slug: string;\n /**\n * A tab contains collection of blocks, usually only 1.\n * @see BlockCollection type\n */\n blockCollectionIds: BlockCollection['id'][]; // string[]\n /**\n * Options for the tab.\n */\n options?: {\n hidden?: boolean;\n minRoleNeeded?: Role;\n };\n};\n","import { ColorConfig } from '../color-config';\n\nexport enum PageHeaderSizes {\n auto = 'auto',\n small = 'small',\n medium = 'medium',\n large = 'large',\n full = 'full',\n}\n\nexport interface PageHeaderSettings {\n size?: `${PageHeaderSizes}`;\n backgroundImage?: string;\n backgroundColor?: ColorConfig;\n backgroundOverlay?: boolean;\n backgroundSize?: 'cover' | 'contain' | 'string';\n backgroundPosition?: 'left' | 'center' | 'right' | 'string';\n backgroundRepeat?: 'no-repeat' | 'repeat-x' | 'repeat-y' | 'repeat';\n hideText?: boolean;\n textColorTitle?: ColorConfig;\n textColorDescription?: ColorConfig;\n}\n","import {\n // type structs validate that a value has a set of properties on it, but it does not assert anything about unspecified properties. This allows you to assert that a particular set of functionality exists without a strict equality check for properties.\n type,\n string,\n Describe,\n boolean,\n optional,\n array,\n number,\n define,\n} from 'superstruct';\nimport { z } from 'zod/v4-mini';\nimport { isObjKey, isObject } from '../type-utils';\nimport type { KnapsackAssetSetsData } from './asset-sets';\nimport type { TokenSrcGroup } from './design-tokens-types';\nimport type { MetaState } from './meta';\nimport type { KnapsackNavsConfig } from './nav';\nimport type { KsFiles } from './files';\nimport type { BlockCollection, BlockConfig } from './blocks';\nimport type { KnapsackCustomPagesData } from './custom-pages';\nimport type { Demo, PatternsState } from './patterns';\nimport { UiConfig } from '../ui-config';\nimport { PagesSettings } from './page';\nimport { BlocksSettings } from './blocks.settings';\nimport { DesignSrcFile } from '../design-src.types';\nimport type {\n RendererTemplateConfig,\n TemplateInfoId,\n RendererId,\n} from '../renderers';\nimport type { PageTab } from './tabs';\n\nexport * from './asset-sets';\nexport * from './blocks';\nexport * from './custom-pages';\nexport * from './design-tokens';\nexport * from './design-tokens-types';\nexport * from './nav';\nexport * from './files';\nexport * from './meta';\nexport * from './page';\nexport * from './patterns';\nexport * from './tabs';\nexport { PageHeaderSizes } from './page.header';\nexport type { PageHeaderSettings } from './page.header';\n\nexport interface KsAppClientData {\n patternsState: PatternsState;\n customPagesState: KnapsackCustomPagesData;\n assetSetsState: KnapsackAssetSetsData;\n navsState: KnapsackNavsConfig;\n tokensSrc: TokenSrcGroup;\n metaState?: MetaState;\n filesState: KsFiles;\n db: {\n blocks: {\n byId: Record<string, BlockConfig>;\n settings: BlocksSettings;\n };\n demos: {\n byId: Record<string, Demo>;\n // \"never\" for now until there are actual settings for demos\n settings: Record<string, never>;\n };\n tabs: {\n byId: Record<string, PageTab>;\n // \"never\" for now until there are actual settings for Tabs\n settings: Record<string, never>;\n };\n blockCollections: {\n byId: Record<string, BlockCollection>;\n // \"never\" for now until there are actual settings for Block Collections\n settings: Record<string, never>;\n };\n /**\n * @see {@link createTemplateInfoId} for getting the key\n */\n templatesConfig?: Record<TemplateInfoId, RendererTemplateConfig>;\n settings: {\n title?: string;\n hideTitleInNavigation?: boolean;\n logoUrl?: string;\n favicon?: `https://${string}`;\n theme?: UiConfig;\n pages?: PagesSettings;\n patterns?: {\n hideStatusSetsOnPages?: boolean;\n };\n codeSrcs?: {\n enableInSlots?: boolean;\n };\n designSrcs?: {\n files?: DesignSrcFile[];\n hideOpenInSource?: boolean;\n };\n tokens?: {\n theming?: {\n /** Which template languages theming controls will show up for next to the components preview stage. */\n enabledRendererIds?: string[];\n /** Whether to hide the theme selector on the template stage. */\n hideThemeSelector?: boolean;\n /** Collections to hide from the theme selector. */\n hiddenCollections?: string[];\n };\n };\n prototyping?: {\n patternId: string;\n disabledRendererIds?: RendererId[];\n };\n };\n };\n}\n\nexport type KsAppClientDataNoMeta = Omit<KsAppClientData, 'metaState'>;\nexport type KsAppClientDataAndMeta = Required<KsAppClientData>;\n\nexport const emptyAppClientData: KsAppClientDataNoMeta = {\n patternsState: {\n patterns: {},\n renderers: {},\n statusSets: [],\n },\n customPagesState: {\n pages: {},\n },\n assetSetsState: {},\n navsState: {\n byId: {},\n order: [],\n },\n tokensSrc: {},\n filesState: {\n files: {},\n },\n db: {\n blocks: {\n byId: {},\n settings: {\n tokens: {\n rootFontSize: '16px',\n },\n },\n },\n demos: {\n byId: {},\n settings: {},\n },\n tabs: {\n byId: {},\n settings: {},\n },\n blockCollections: {\n byId: {},\n settings: {},\n },\n settings: {\n title: '',\n logoUrl: '',\n },\n },\n};\n\nexport function isKsAppClientDataNoMeta(\n data: unknown,\n): data is KsAppClientDataNoMeta {\n if (!isObject(data)) return false;\n // TODO: bring in exhaustive key checking here so all keys are caught\n const requiredKeys: Array<keyof KsAppClientDataNoMeta> = [\n 'assetSetsState',\n 'customPagesState',\n 'navsState',\n 'patternsState',\n 'tokensSrc',\n 'db',\n ];\n if (!requiredKeys.every((key) => isObjKey(key, data))) return false;\n if (!isObjKey('metaState', data)) return true;\n return false;\n}\n\nexport const KsAppClientDataNoMetaStruct = define<KsAppClientDataNoMeta>(\n 'KsAppClientDataNoMeta',\n isKsAppClientDataNoMeta,\n);\n\n/**\n * This is a WIP Zod schema for the App Client Data.\n * We use {@link KsAppClientDataNoMetaZod} to use the validation from this,\n * but the types from {@link KsAppClientDataNoMeta} via `z.custom()`\n */\nconst KsAppClientDataNoMetaZodWIP = z.strictObject({\n assetSetsState: z.object({}),\n customPagesState: z.object({\n pages: z.object({}),\n }),\n navsState: z.object({\n byId: z.object(),\n order: z.array(z.string()),\n }),\n patternsState: z.object({\n patterns: z.object({}),\n renderers: z.object({}),\n statusSets: z.array(z.object()),\n }),\n tokensSrc: z.object({}),\n filesState: z.object({\n files: z.object({}),\n }),\n db: z.object({\n blocks: z.object({\n byId: z.object({}),\n settings: z.object({}),\n }),\n demos: z.object({\n byId: z.object({}),\n settings: z.object({}),\n }),\n tabs: z.optional(\n z.object({\n byId: z.object({}),\n settings: z.object({}),\n }),\n ),\n blockCollections: z.optional(\n z.object({\n byId: z.object({}),\n settings: z.object({}),\n }),\n ),\n templatesConfig: z.optional(z.object({})),\n settings: z.object({\n title: z.optional(z.string()),\n hideTitleInNavigation: z.optional(z.boolean()),\n logoUrl: z.optional(z.string()),\n }),\n }),\n});\n\nexport const KsAppClientDataNoMetaZod = z\n // uses the types from this type\n .custom<KsAppClientDataNoMeta>()\n .check((ctx) => {\n const { error } = KsAppClientDataNoMetaZodWIP.safeParse(ctx.value);\n if (error) {\n // @ts-expect-error this says that `issue.input` is not a valid property, but it is\n ctx.issues.push(...error.issues);\n }\n });\n\nexport function isKsAppClientDataAndMeta(\n data: unknown,\n): data is KsAppClientDataAndMeta {\n if (!isObject(data)) return false;\n // TODO: bring in exhaustive key checking here so all keys are caught\n const requiredKeys: Array<keyof KsAppClientDataAndMeta> = [\n 'assetSetsState',\n 'customPagesState',\n 'navsState',\n 'patternsState',\n 'tokensSrc',\n 'metaState',\n 'db',\n ];\n return requiredKeys.every((key) => isObjKey(key, data));\n}\n\nexport const KsAppClientDataAndMetaStruct = define<KsAppClientDataAndMeta>(\n 'KsAppClientDataAndMeta',\n isKsAppClientDataAndMeta,\n);\n\nexport const KsMetaStateStruct: Describe<KsAppClientData['metaState']> = type({\n isLocalDev: boolean(),\n plugins: array(\n type({\n id: string(),\n hasContent: boolean(),\n clientPluginPath: optional(string()),\n cssPath: optional(string()),\n }),\n ),\n meta: optional(\n type({\n version: optional(string()),\n hasKnapsackCloud: boolean(),\n knapsackCloudSiteId: optional(string()),\n serverPort: optional(number()),\n websocketsPort: optional(number()),\n https: optional(boolean()),\n cacheDir: optional(string()),\n ksVersions: type({\n app: string(),\n }),\n }),\n ),\n});\n\nexport const isKsMetaState = KsMetaStateStruct.is;\n","import {\n // type structs validate that a value has a set of properties on it, but it does not assert anything about unspecified properties. This allows you to assert that a particular set of functionality exists without a strict equality check for properties.\n type,\n string,\n Describe,\n boolean,\n optional,\n array,\n number,\n define,\n} from 'superstruct';\nimport { isObjKey, isObject } from '../type-utils';\nimport type { KnapsackAssetSetsData } from './asset-sets';\nimport type { KsDesignTokensState } from './design-tokens';\nimport type { MetaState } from './meta';\nimport type { KnapsackNavsConfig } from './nav';\nimport type { KsFiles } from './files';\nimport type { KnapsackCustomPagesData } from './custom-pages';\nimport type { PatternsState } from './patterns';\nimport type { KnapsackSettings } from './settings';\n\nexport type {\n KsDesignToken,\n KsDesignTokenAttributes,\n KsDesignTokenData,\n KsDesignTokenDataGroup,\n KsDesignTokenSrc,\n KsDesignTokenSrcGroup,\n KsDesignTokensState,\n KsTokenType,\n KsTokenValue,\n KnapsackDesignToken,\n} from './design-tokens';\n\nexport interface KsAppClientDataV3 {\n settingsState: {\n settings: KnapsackSettings;\n };\n patternsState: PatternsState;\n customPagesState: KnapsackCustomPagesData;\n assetSetsState: KnapsackAssetSetsData;\n navsState: KnapsackNavsConfig;\n tokensState: KsDesignTokensState;\n metaState?: MetaState;\n filesState: KsFiles;\n}\n\nexport type KsAppClientDataNoMetaV3 = Omit<KsAppClientDataV3, 'metaState'>;\nexport type KsAppClientDataAndMetaV3 = Required<KsAppClientDataV3>;\n\nexport function isKsAppClientDataNoMetaV3(\n data: unknown,\n): data is KsAppClientDataNoMetaV3 {\n if (!isObject(data)) return false;\n const requiredKeys: Array<keyof KsAppClientDataNoMetaV3> = [\n 'assetSetsState',\n 'customPagesState',\n 'navsState',\n 'patternsState',\n 'settingsState',\n 'tokensState',\n ];\n if (!requiredKeys.every((key) => isObjKey(key, data))) return false;\n if (!isObjKey('metaState', data)) return true;\n return false;\n}\n\nexport const KsAppClientDataNoMetaStructV3 = define<KsAppClientDataNoMetaV3>(\n 'KsAppClientDataNoMeta',\n isKsAppClientDataNoMetaV3,\n);\n\nexport function isKsAppClientDataAndMetaV3(\n data: unknown,\n): data is KsAppClientDataAndMetaV3 {\n if (!isObject(data)) return false;\n const requiredKeys: Array<keyof KsAppClientDataAndMetaV3> = [\n 'assetSetsState',\n 'customPagesState',\n 'navsState',\n 'patternsState',\n 'settingsState',\n 'tokensState',\n 'metaState',\n ];\n return requiredKeys.every((key) => isObjKey(key, data));\n}\n\nexport const KsAppClientDataAndMetaStructV3 = define<KsAppClientDataAndMetaV3>(\n 'KsAppClientDataAndMeta',\n isKsAppClientDataAndMetaV3,\n);\n\nexport const KsMetaStateStructV3: Describe<KsAppClientDataV3['metaState']> =\n type({\n isLocalDev: boolean(),\n plugins: array(\n type({\n id: string(),\n hasContent: boolean(),\n clientPluginPath: optional(string()),\n cssPath: optional(string()),\n }),\n ),\n meta: optional(\n type({\n version: optional(string()),\n hasKnapsackCloud: boolean(),\n knapsackCloudSiteId: optional(string()),\n serverPort: optional(number()),\n websocketsPort: optional(number()),\n https: optional(boolean()),\n cacheDir: optional(string()),\n ksVersions: type({\n app: string(),\n }),\n }),\n ),\n });\n\nexport const isKsMetaStateV3 = KsMetaStateStructV3.is;\n","import { isDraft, type Draft } from 'immer';\nimport { Migration } from './migration.types';\nimport { KnapsackPattern, SlottedData } from '../app-client-data/patterns';\n\ntype Migration417DemosType = {\n version: string;\n checkIfNeeded: (appClientData: any) => boolean;\n migrate: (appClientData: Draft<any>) => void;\n};\n\nexport const migration417Demos: Migration417DemosType = {\n version: '4.1.7',\n checkIfNeeded: (appClientData) => {\n // this one will be tough to check for, so we'll just assume it's needed\n return true;\n },\n // note that `appClientData` is mutable since we're already in Immer\n migrate: (appClientData) => {\n if (!isDraft(appClientData)) {\n throw new Error(\n `Tried to run migrations on appClientData but it is not an Immer Draft`,\n );\n }\n Object.values(appClientData.patternsState.patterns).forEach(\n (\n pattern: Draft<\n KnapsackPattern & {\n demoSize?: string;\n }\n >,\n ) => {\n delete pattern.demoSize;\n },\n );\n\n Object.values(appClientData.db.demos.byId).forEach((demo) => {\n if (demo.type !== 'data') return;\n\n Object.entries(demo.data.slots ?? {}).forEach(([slotName, slotData]) => {\n demo.data.slots[slotName] = slotData.map(\n (slottedData: Draft<SlottedData | string>) => {\n // it used to be just a string\n if (typeof slottedData === 'string') {\n return {\n type: 'text',\n text: slottedData,\n };\n }\n if (\n // not doing anything with these\n slottedData.type === 'template-reference' ||\n // these already were migrated or made by the new editor\n slottedData.type === 'text'\n ) {\n return slottedData;\n }\n // these used to not have a type set\n slottedData.type = 'template-demo';\n return slottedData;\n },\n );\n });\n\n if (demo.patternId && demo.templateId) return;\n\n // using an IIFE so we can stop looping once we find it\n // would use `break` but it's a double loop\n (() => {\n for (const { id: pId, templates = [] } of Object.values(\n appClientData.patternsState.patterns,\n )) {\n for (const { id: tId, demoIds = [] } of templates) {\n if (demoIds.includes(demo.id)) {\n demo.patternId = pId;\n demo.templateId = tId;\n // found it - stop looking\n return;\n }\n }\n }\n })();\n });\n },\n} satisfies Migration;\n","import { migration417Demos } from './4.1.7-demos';\n\nexport const migrations = [migration417Demos];\n","export const appSectionsById = {\n ROOT: 'ROOT',\n DESIGN: 'Design',\n DEVELOP: 'Develop',\n DOCUMENT: 'Documentation',\n PROTOTYPE: 'Prototype',\n SETTINGS: 'Settings',\n} as const;\nexport const appSections = Object.values(appSectionsById);\nexport type AppSection = keyof typeof appSectionsById;\n","// import { JSONSchema7 } from 'json-schema'; @todo consider using instead; though I'm not seeing it make it's way to the compiled JSON schema themselves via `convert-types-to-json-schmea.js`\n\ntype PropBase<Type = any> = {\n title?: string;\n description?: string;\n default?: Type;\n};\n\nexport enum PropTypeNames {\n 'string' = 'string',\n 'boolean' = 'boolean',\n 'number' = 'number',\n 'object' = 'object',\n 'options' = 'options',\n 'function' = 'function',\n 'customTypeScript' = 'customTypeScript',\n 'array' = 'array',\n 'arrayOfObjects' = 'arrayOfObjects',\n 'arrayOfStrings' = 'arrayOfStrings',\n 'arrayOfNumbers' = 'arrayOfNumbers',\n 'unknown' = 'unknown',\n}\nexport type PropTypeNamesList = keyof typeof PropTypeNames;\n\nexport type StringProp = {\n type: 'string';\n} & PropBase<string>;\n\nexport type BooleanProp = {\n type: 'boolean';\n} & PropBase<boolean>;\n\nexport type NumberProp = {\n type: 'number';\n} & PropBase<number>;\n\nexport type OptionsProp = {\n type: 'string' | 'number';\n enum: Array<string | number>;\n enumNames?: string[];\n} & PropBase<string | number>;\n\nexport type CustomTypeScriptProp = {\n /**\n * TypeScript type\n * @example (name: string) => void\n */\n tsType: string;\n type?: never;\n default?: string;\n} & PropBase<string>;\n\nexport type FunctionProp = {\n typeof: 'function';\n /**\n * TypeScript type\n * @example (name: string) => void\n */\n tsType: string;\n default?: string;\n type?: 'string';\n} & PropBase<string>;\n\nexport type ObjectProp = {\n type: 'object';\n additionalProperties?: boolean;\n required?: string[];\n properties: {\n [prop: string]: PropertyTypes;\n };\n} & PropBase;\n\nexport type ArrayProp = {\n type: 'array';\n items: PropertyTypes;\n} & PropBase<unknown[]>;\n\nexport type ArrayOfStringsProp = {\n type: 'array';\n uniqueItems?: boolean;\n items: StringProp;\n} & PropBase<unknown[]>;\n\nexport type ArrayOfNumbersProp = {\n type: 'array';\n uniqueItems?: boolean;\n items: NumberProp;\n} & PropBase<number[]>;\n\nexport type ArrayOfObjectsProp = {\n type: 'array';\n items: ObjectProp;\n} & PropBase<Array<Record<string, unknown>>>;\n\nexport type PropertyTypes =\n | StringProp\n | BooleanProp\n | NumberProp\n | OptionsProp\n | FunctionProp\n | CustomTypeScriptProp\n | ObjectProp\n | ArrayOfObjectsProp\n | ArrayOfStringsProp\n | ArrayOfNumbersProp\n | ArrayProp;\n\nexport const isStringProp = (prop: PropertyTypes): prop is StringProp =>\n 'type' in prop && prop.type === 'string' && !('enum' in prop);\nexport const isNumberProp = (prop: PropertyTypes): prop is NumberProp =>\n 'type' in prop && prop.type === 'number';\nexport const isBooleanProp = (prop: PropertyTypes): prop is BooleanProp =>\n 'type' in prop && prop.type === 'boolean';\nexport const isOptionsProp = (prop: PropertyTypes): prop is OptionsProp =>\n 'enum' in prop;\nexport const isFunctionProp = (prop: PropertyTypes): prop is FunctionProp =>\n 'typeof' in prop && prop?.typeof === 'function';\nexport const isCustomTypeScriptProp = (\n prop: PropertyTypes,\n): prop is CustomTypeScriptProp => !('typeof' in prop) && 'tsType' in prop;\nexport const isArrayOfObjectsProp = (\n prop: PropertyTypes,\n): prop is ArrayOfObjectsProp =>\n 'type' in prop &&\n prop.type === 'array' &&\n 'items' in prop &&\n prop.items.type === 'object';\nexport const isObjectProp = (prop: PropertyTypes): prop is ObjectProp =>\n 'type' in prop &&\n prop.type === 'object' &&\n 'properties' in prop &&\n Object.keys(prop.properties).length > 0;\nexport const isArrayOfStringsProp = (\n prop: PropertyTypes,\n): prop is ArrayOfStringsProp =>\n 'type' in prop &&\n prop.type === 'array' &&\n 'items' in prop &&\n prop.items.type === 'string';\nexport const isArrayOfNumbersProp = (\n prop: PropertyTypes,\n): prop is ArrayOfNumbersProp =>\n 'type' in prop &&\n prop.type === 'array' &&\n 'items' in prop &&\n prop.items.type === 'number';\n\nexport interface PropTypeDataBase {\n type: any;\n id: string;\n isRequired?: boolean;\n data: any;\n}\n\nexport interface StringPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.string;\n data: StringProp;\n}\n\nexport interface BooleanPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.boolean;\n data: BooleanProp;\n}\n\nexport interface NumberPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.number;\n data: NumberProp;\n}\n\nexport interface OptionsPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.options;\n data: OptionsProp;\n}\n\nexport interface FunctionPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.function;\n data: FunctionProp;\n}\n\nexport interface CustomTypeScriptPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.customTypeScript;\n data: CustomTypeScriptProp;\n}\n\nexport interface ObjectPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.object;\n data: ObjectProp;\n}\n\nexport interface ArrayOfObjectsPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.arrayOfObjects;\n data: ArrayOfObjectsProp;\n}\n\nexport interface ArrayOfStringsPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.arrayOfStrings;\n data: ArrayOfStringsProp;\n}\n\nexport interface ArrayOfNumbersPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.arrayOfNumbers;\n data: ArrayOfNumbersProp;\n}\n\nexport interface ArrayPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.array;\n data: ArrayProp;\n}\n\nexport type PropTypeData =\n | StringPropTypeData\n | BooleanPropTypeData\n | NumberPropTypeData\n | OptionsPropTypeData\n | FunctionPropTypeData\n | CustomTypeScriptPropTypeData\n | ObjectPropTypeData\n | ArrayOfObjectsPropTypeData\n | ArrayOfStringsPropTypeData\n | ArrayOfNumbersPropTypeData;\n\nexport type JsonSchemaObject<PropNames extends string = string> = {\n $schema?: string;\n title?: string;\n description?: string;\n type: 'object';\n required?: PropNames[];\n properties: Record<PropNames, PropertyTypes>;\n examples?: Record<string, unknown>[];\n};\n","import * as s from 'superstruct';\nimport type { Patch } from 'immer';\nimport type { SetOptional } from '@knapsack/utils';\nimport type { UUID, DateString } from './misc';\n\n/**\n * Patch\n */\n\nexport type { Patch };\n\nconst PatchStructRuntime = s.object({\n op: s.union([s.literal('replace'), s.literal('remove'), s.literal('add')]),\n path: s.array(s.union([s.string(), s.number()])),\n value: s.optional(s.any()),\n});\nconst PatchStruct: s.Describe<Patch> = PatchStructRuntime;\n\nexport const isPatch = (patch: unknown): patch is Patch =>\n PatchStruct.is(patch);\n\nconst PatchesStructRuntime = s.array(PatchStructRuntime);\nconst PatchesStruct: s.Describe<Patch[]> = PatchesStructRuntime;\n\nexport const isPatches = (patches: unknown): patches is Patch[] =>\n PatchesStruct.is(patches);\n\n/**\n * KsRemoteChange\n */\nexport type KsChange<Event extends { type: string } = { type: string }> = {\n patches: Patch[];\n inversePatches: Patch[];\n event: Event;\n id: UUID;\n date: DateString;\n};\nexport type KsRemoteChange = SetOptional<KsChange, 'inversePatches' | 'event'>;\n\nconst KsRemoteChangeRuntime = s.type({\n patches: PatchesStructRuntime,\n inversePatches: s.optional(PatchesStructRuntime),\n event: s.optional(s.object({ type: s.string() })),\n id: s.string(),\n date: s.string(),\n userId: s.optional(s.string()),\n});\nconst KsRemoteChangeStruct: s.Describe<KsRemoteChange> = KsRemoteChangeRuntime;\n\nexport const isKsRemoteChange = (change: unknown): change is KsRemoteChange =>\n KsRemoteChangeStruct.is(change);\n\nconst KsRemoteChangesStructRuntime = s.array(KsRemoteChangeRuntime);\nexport const KsRemoteChangesStruct: s.Describe<KsRemoteChange[]> =\n KsRemoteChangesStructRuntime;\n\nexport const isKsRemoteChanges = (\n changes: unknown,\n): changes is KsRemoteChange[] => KsRemoteChangesStruct.is(changes);\n","import { z } from 'zod';\nimport type {\n PathPackage,\n PathPackageSubPath,\n PathRelative,\n Branded,\n} from './re-exports';\nimport type {\n KnapsackPatternTemplate,\n TemplateDemo,\n TemplateRendererMeta,\n KsSpecMeta,\n KsTemplateSpec,\n} from './app-client-data/patterns';\nimport type { Simplify } from './type-utils';\n\nexport const rendererIds = {\n react: 'react',\n vue: 'vue',\n 'web-components': 'web-components',\n twig: 'twig',\n hbs: 'hbs',\n angular: 'angular',\n html: 'html',\n ios: 'ios',\n android: 'android',\n} as const;\n\n/**\n * The ID of a renderer, e.g. 'react', 'vue', 'angular', etc.\n * On Pattern Templates, this will match up to `templateLanguageId` to identify which renderer to use.\n * @see {KnapsackPatternTemplate['templateLanguageId']}\n */\nexport type RendererId = keyof typeof rendererIds;\nexport type CodeSrc =\n | {\n type: 'package';\n path: PathPackage;\n pathFromOutputDir: PathPackage;\n pkgName: PathPackage;\n rendererId: RendererId;\n }\n | {\n type: 'package-sub-path';\n path: PathPackageSubPath;\n pathFromOutputDir: PathPackageSubPath;\n pkgName: PathPackage;\n subPath: PathRelative;\n rendererId: RendererId;\n }\n | {\n type: 'relative-from-data-dir';\n rendererId: RendererId;\n path: PathRelative;\n pathFromOutputDir: PathRelative;\n };\n\nexport type CodeSrcUserConfig = {\n /**\n * Can contain glob patterns, relative paths, absolute paths, package paths, or package sub-paths\n */\n path: string;\n filter?: (path: string) => boolean;\n};\n\nexport const CodeSrcUserConfigSchema = z.strictObject({\n path: z\n .string()\n .describe(\n 'Can contain glob patterns, relative paths, absolute paths, package paths, or package sub-paths',\n ),\n filter: z\n .custom<(path: string) => boolean>((val) => {\n return typeof val === 'function';\n })\n .optional()\n .describe('A function that takes a path and returns a boolean'),\n});\n\nexport type TemplateInfoId = Branded<string, 'TemplateInfoId'>;\n\nexport type TemplateInfo<TheRendererId extends RendererId = RendererId> =\n Extract<\n | {\n rendererId: 'react';\n codeSrcPath: CodeSrc['path'];\n /**\n * Name of the export. If it's the default export, this will be `'default'`.\n */\n exportName: string;\n }\n | {\n rendererId: 'vue';\n codeSrcPath: CodeSrc['path'];\n }\n | {\n rendererId: 'web-components';\n elementName: string;\n }\n | {\n rendererId: 'angular';\n codeSrcPath: CodeSrc['path'];\n /**\n * Name of the export. If it's the default export, this will be `'default'`.\n */\n exportName: string;\n }\n | {\n rendererId: 'html';\n codeSrcPath: CodeSrc['path'];\n }\n | {\n rendererId: 'twig';\n namespacePath: string;\n }\n | {\n rendererId: 'hbs';\n codeSrcPath: CodeSrc['path'];\n }\n | {\n rendererId: 'ios';\n /** The library name that exports out several symbols/components */\n moduleName: PathPackage;\n /** The exported name of the component */\n symbolName: string;\n }\n | {\n rendererId: 'android';\n /**\n * The library name that exports out several classes/components\n * Example: `com.google.android.material`\n */\n packageName: PathPackage;\n /** The exported name of the component */\n componentName: string;\n },\n { rendererId: TheRendererId }\n >;\n\nexport type TemplateInfoWithId<TheRendererId extends RendererId = RendererId> =\n Extract<\n Simplify<\n TemplateInfo<TheRendererId> & {\n id: TemplateInfoId;\n }\n >,\n { rendererId: TheRendererId }\n >;\n\nexport type TemplateInfoWithCodeSrcPath = Extract<\n TemplateInfo,\n { codeSrcPath: string }\n>;\n\nexport function isTemplateInfoWithCodeSrcPath(\n info: TemplateInfo,\n): info is TemplateInfoWithCodeSrcPath {\n return 'codeSrcPath' in info;\n}\n\n/**\n * Create a unique ID for a template info\n * This is used to identify the template info by a single unique string\n * @returns A unique ID for the template info\n */\nexport function createTemplateInfoId(t: TemplateInfo): TemplateInfoId {\n switch (t.rendererId) {\n case 'angular':\n case 'react':\n return `${t.rendererId}---${t.codeSrcPath}---${\n t.exportName || 'default'\n }` as TemplateInfoId;\n case 'web-components':\n return `${t.rendererId}---${t.elementName}` as TemplateInfoId;\n case 'twig':\n return `${t.rendererId}---${t.namespacePath}` as TemplateInfoId;\n case 'vue':\n case 'hbs':\n case 'html':\n return `${t.rendererId}---${t.codeSrcPath}` as TemplateInfoId;\n case 'ios':\n return `${t.rendererId}---${t.moduleName}---${t.symbolName}` as TemplateInfoId;\n case 'android':\n return `${t.rendererId}---${t.packageName}---${t.componentName}` as TemplateInfoId;\n default: {\n const _: never = t;\n throw new Error(`Invalid template info: ${JSON.stringify(t)}`);\n }\n }\n}\n\nexport function addIdToTemplateInfo<TheRendererId extends RendererId>(\n t: TemplateInfo<TheRendererId>,\n): TemplateInfoWithId<TheRendererId> {\n return {\n ...t,\n id: createTemplateInfoId(t),\n };\n}\n\n/**\n * Converts old way of specifying template info (`path` & `alias`) to new way {@link TemplateInfo}\n * @see {@link convertTemplateInfoToOldWay} for the reverse\n */\nexport function normalizeTemplateInfo<TheRendererId extends RendererId>({\n rendererId,\n alias,\n path,\n}: {\n rendererId: TheRendererId;\n path?: CodeSrc['path'];\n alias?: string;\n}): TemplateInfo<TheRendererId> {\n const info = ((): TemplateInfo => {\n switch (rendererId) {\n case 'react':\n case 'angular':\n return {\n rendererId,\n codeSrcPath: path,\n exportName: alias || 'default',\n };\n case 'vue':\n case 'hbs':\n case 'html':\n return {\n rendererId,\n codeSrcPath: path,\n };\n case 'twig':\n return {\n rendererId,\n namespacePath: alias,\n };\n case 'web-components':\n return {\n rendererId,\n elementName: alias,\n };\n // @TOOD: Just speculation for ios/android for now\n case 'ios':\n return {\n rendererId,\n moduleName: path as PathPackage,\n symbolName: alias,\n };\n case 'android':\n return {\n rendererId,\n packageName: path as PathPackage,\n componentName: alias,\n };\n default: {\n const _: never = rendererId;\n throw new Error(`Invalid renderer ID: ${rendererId}`);\n }\n }\n })();\n\n return info as TemplateInfo<TheRendererId>;\n}\n\nexport type RendererTemplateConfig = {\n templateInfo: TemplateInfo;\n /**\n * If it's stored here, it's never inferred\n */\n spec?: KsTemplateSpec<false | undefined>;\n specMeta?: KsSpecMeta;\n};\n\n/**\n * Converts new way of specifying template info {@link TemplateInfo} to old way (`path` & `alias`)\n * @see {@link normalizeTemplateInfo} for the reverse\n */\nexport function convertTemplateInfoToOldWay(info: TemplateInfo): {\n path?: string;\n alias?: string;\n} {\n switch (info.rendererId) {\n case 'react':\n case 'angular':\n return {\n path: info.codeSrcPath,\n alias: info.exportName,\n };\n case 'hbs':\n case 'html':\n case 'vue':\n return {\n path: info.codeSrcPath,\n };\n case 'twig':\n return {\n alias: info.namespacePath,\n };\n case 'web-components':\n return {\n alias: info.elementName,\n };\n case 'ios':\n return {\n path: info.moduleName,\n alias: info.symbolName,\n };\n case 'android':\n return {\n path: info.packageName,\n alias: info.componentName,\n };\n default: {\n const _: never = info;\n throw new Error(`Invalid template info: ${JSON.stringify(info)}`);\n }\n }\n}\n\nexport type RendererDiscovery<TheRendererId extends RendererId> = {\n rendererId: TheRendererId;\n meta: TemplateRendererMeta;\n codeSrcsByPath: Record<CodeSrc['path'], CodeSrc>;\n templates: TemplateInfoWithId<TheRendererId>[];\n};\n\n/**\n * Results of rendering a pattern\n */\nexport type KsRenderResults = {\n ok: boolean;\n html: string;\n usage?: string;\n templateLanguage?: string;\n message?: string;\n};\n\nexport type KsRenderApiResults = KsRenderResults & {\n wrappedHtml: string;\n};\nexport type TemplateSuggestion = {\n path: string;\n alias?: string;\n connected?: boolean;\n};\n\nexport type TemplateSuggestionsGetFn = (opt: {\n rendererId: RendererId;\n newPath?: string;\n state: ContentStateForRendering;\n}) => Promise<{\n suggestions: TemplateSuggestion[];\n}>;\n\n/**\n * Aliases for package paths\n * Example:\n * ```js\n * {\n * 'my-pkg': '../path/to/my-pkg',\n * }\n * ```\n */\nexport type PkgPathAliases = Record<string, string>;\n\nexport type ContentStateForRendering = {\n /**\n * Patterns by ID\n */\n patterns: {\n [patternId: string]: {\n id: string;\n templates: Pick<\n KnapsackPatternTemplate,\n 'alias' | 'path' | 'templateLanguageId' | 'spec' | 'id' | 'title'\n >[];\n templateDemos: Array<\n TemplateDemo & {\n templateId: string;\n templateLanguageId: RendererId;\n }\n >;\n };\n };\n};\n\nexport type TemplateUse = {\n patternId: string;\n patternTitle: string;\n templateId: string;\n templateTitle: string;\n};\n\nexport type PathWithTemplates = {\n path: string;\n templates: {\n id: TemplateInfoId;\n templateInfo: TemplateInfoWithId;\n use: TemplateUse;\n suggestion: TemplateSuggestion;\n }[];\n};\n","import type { FeedbackTypes } from './misc';\n\nexport enum KsRendererClientEvents {\n ready = 'ready',\n}\n\n/**\n * Message sent from the renderer client (in the iframe) to the App UI parent window\n * using `window.parent.postMessage()`.\n * Note that this likely will become a union type of all possible messages\n */\nexport type KsRendererClientMsg =\n | {\n /**\n * Sent when a `ResizeObserver` detects a change in the contents height or width.\n */\n type: 'ksRendererClient.contentResized';\n height: number;\n width: number;\n }\n | {\n type: 'ksRendererClient.showToast';\n msg: string;\n feedbackType?: FeedbackTypes;\n }\n /**\n * Tracks the scroll position of the iframe's content\n */\n | {\n type: 'ksRendererClient.scrollPosition';\n scrollTop: number;\n scrollLeft: number;\n }\n /**\n * Sent when the iframe content is fully loaded\n */\n | {\n type: 'ksRendererClient.ready';\n };\n\n/**\n * Message sent from the App UI parent window to the renderer client (in the iframe)\n * using `window.parent.postMessage()`.\n */\nexport type KsRendererIncomingMsg = {\n type: 'ksRendererClient.updateScrollPosition';\n scrollTop: number;\n scrollLeft: number;\n};\n\n/**\n * The meta data is stored in a script tag with this id\n * @see {KsRendererClientMeta}\n */\nexport const ksRendererClientMetaId = 'ks-meta';\n\n/**\n * Metadata about the current renderer client demo\n * @see {ksRendererClientMetaId} for the ID of the script tag\n */\nexport interface KsRendererClientMeta {\n patternId: string;\n templateId: string;\n demoId: string;\n assetSetId: string;\n isInIframe: boolean;\n websocketsPort: number;\n}\n","export const WS_EVENTS = {\n PATTERN_TEMPLATE_CHANGED: 'PATTERN_TEMPLATE_CHANGED',\n PATTERN_ASSET_CHANGED: 'PATTERN_ASSET_CHANGED',\n DESIGN_TOKENS_CHANGED: 'DESIGN_TOKENS_CHANGED',\n RENDERER_CLIENT_RELOAD: 'RENDERER_CLIENT_RELOAD',\n APP_CLIENT_DATA_CHANGED: 'APP_CLIENT_DATA_CHANGED',\n};\n\nexport type WebSocketEvent = keyof typeof WS_EVENTS;\n\nexport interface WebSocketMessage {\n event: string;\n data: Record<string, unknown>;\n}\n\nexport interface DesignTokensChangedData extends WebSocketMessage {\n event: typeof WS_EVENTS.DESIGN_TOKENS_CHANGED;\n data: Record<string, unknown>;\n}\n\nexport interface PatternChangedData extends WebSocketMessage {\n event: typeof WS_EVENTS.PATTERN_TEMPLATE_CHANGED;\n data: {\n /**\n * Absolute path to template on server that was just edited\n */\n path: string;\n };\n}\n\nexport interface AssetChangedData extends WebSocketMessage {\n event: typeof WS_EVENTS.PATTERN_ASSET_CHANGED;\n data: {\n /**\n * Absolute path to asset file (CSS/JS) on server that was just edited\n */\n path: string;\n };\n}\n\nexport interface RendererClientReloadMessage extends WebSocketMessage {\n event: typeof WS_EVENTS.RENDERER_CLIENT_RELOAD;\n data: {\n // @todo add patternId etc for more details\n };\n}\n\nexport interface AppClientDataChanged extends WebSocketMessage {\n event: typeof WS_EVENTS.PATTERN_TEMPLATE_CHANGED;\n data: Record<string, unknown>;\n}\n\nexport type WebSocketMessages =\n | PatternChangedData\n | AssetChangedData\n | DesignTokensChangedData\n | RendererClientReloadMessage;\n","export enum GitProviderType {\n GitHub = 'GitHub',\n GitLab = 'GitLab',\n GitLabRest = 'GitLabRest',\n Bitbucket = 'Bitbucket',\n Azure = 'Azure',\n}\n\nexport type FileAddition = {\n /** base64 */\n contents: string;\n path: string;\n\n /** Action to perform: create, delete, move, update, or chmod. */\n action?: RestActions;\n /** Content of the file. */\n content?: string;\n /** Full path to the file. */\n filePath?: string;\n /** Encoding of the file. Default is text. */\n encoding?: TextEncoding;\n /** Last known file commit ID. */\n lastCommitId?: string;\n /** Original full path to the file being moved. */\n previousPath?: string;\n};\n\nexport type FileDeletion = {\n path: string;\n};\n\nexport enum MergeableState {\n Conflicting = 'CONFLICTING',\n Mergeable = 'MERGEABLE',\n Unknown = 'UNKNOWN',\n}\n\nexport enum RestActions {\n Create = 'CREATE',\n Move = 'MOVE',\n Update = 'UPDATE',\n Chmod = 'CHMOD',\n}\n\nexport enum TextEncoding {\n Base64 = 'BASE64',\n Text = 'TEXT',\n}\n\nexport type FileChanges = {\n /** File to add or change. */\n additions?: FileAddition[];\n\n /** Files to delete. */\n deletions?: FileDeletion[];\n\n /** Last known file commit ID. */\n lastCommitId?: string;\n};\n\nexport type CommitAction = Record<string, unknown>;\n\nexport interface RepoLabel {\n name: string;\n /** ID optional because bitbucket does not provide id. We might be able to generate one if its required, eg. reponame-labelname */\n id?: string;\n}\n\nexport interface RepoInfo {\n id: string;\n url: string;\n name: string;\n ownerName?: string;\n defaultBranch?: any;\n}\n\n// 'BranchInfo' name is currently taken by GitLab generated queries. Thus 'BranchInfoResult'\nexport interface BranchInfoResult {\n sha?: string; // If branch info is not found, this can be undefined\n shortSha?: string;\n associatedPullRequests?: Pr[];\n additions?: number;\n commitUrl?: string;\n deletions?: number;\n id?: string; // In GitLab, this is the branch name. Modelled this way to make deleteBranch work.\n default?: boolean;\n}\n\nexport interface PrInfo {\n url: string;\n number: number;\n id: string;\n}\n\nexport interface Pr {\n id: string;\n title: string;\n createdAt: string;\n headRef: {\n id?: string;\n name?: string;\n target: BranchInfoResult;\n };\n mergeable: MergeableState;\n merged: boolean;\n number: number;\n body: string;\n isDraft: boolean;\n url: string;\n author: {\n login: string;\n avatarUrl?: string;\n };\n diffHeadSha?: string;\n targetBranch?: string;\n version?: string; // needed for bitbucket merge\n}\n\nexport interface GitProvider {\n type: GitProviderType;\n createBranch: (opt: { branch: string }) => Promise<BranchInfoResult>;\n commitOnBranch: (opt: {\n branch: string;\n message: string;\n fileChanges: FileChanges;\n }) => Promise<Record<string, unknown> | void>;\n getRepoLabels: () => Promise<RepoLabel[]>;\n getRepoInfo: () => Promise<RepoInfo>;\n getBranchInfo: ({ branch }: { branch: string }) => Promise<BranchInfoResult>;\n getPrs: () => Promise<Pr[]>;\n getPr: ({ prNumber }: { prNumber: number }) => Promise<Pr>;\n getTree?: (opt: { branch: string }) => Promise<{\n treeItems: {\n path: string;\n type: 'blob';\n /** SHA-1, use https://www.npmjs.com/package/git-hash-object */\n sha: string;\n url?: string;\n }[];\n }>;\n mergePr: ({ prNumber }: { prNumber: number }) => Promise<boolean>;\n createPr: ({\n siteId,\n branch,\n title,\n body,\n labelIds,\n }: {\n siteId: string;\n branch: string;\n title: string;\n body?: string;\n labelIds?: string[];\n }) => Promise<PrInfo>;\n deleteBranch: ({ id, branch }: { id: string; branch: string }) => Promise<{\n clientMutationId?: string;\n }>;\n getFileInfoOnBranchByPath: (opt: {\n filePath: string;\n branch: string;\n }) => Promise<{ exists: boolean; filePath: string }>;\n}\n","import type { AppSection } from './app-sections';\n\n/**\n * The roles here are duplicates of the roles in the database.\n * It needs to be here, in the types package, so it can be used in all packages.\n * If we pull it in from `@knapsack/hasura-gql-client`, which is the source, we get a dependency cycle. So we do it this way.\n * If the roles change in the database, we need to change them here too. We will get a build error if we don't (see code in `@knapsack/hasura-gql-client`).\n */\nexport type Role =\n | 'ADMIN'\n | 'CONTRIBUTOR'\n | 'CONSUMER'\n | 'VIEWER'\n | 'ANONYMOUS'\n /**\n * These are not used, but exist in the DB\n * @todo: remove unused roles from database\n * @link https://linear.app/knapsack/issue/KSP-5991/remove-unused-roles-from-database\n */\n | 'EDITOR'\n | 'MANAGER';\n\nexport type RolePermissions = {\n canManageUsers: boolean;\n canDelete: boolean;\n canEdit: boolean;\n canPublish: boolean;\n canView: boolean;\n};\n\nexport type RoleSectionAccess = Record<\n AppSection,\n {\n canView: boolean;\n canEdit: boolean;\n }\n>;\n\nexport type RoleInfo = {\n id: Role;\n title: string;\n hierarchy: number;\n permissions: RolePermissions;\n sectionAccess: RoleSectionAccess;\n};\n\nexport const rolesById: Record<Role, RoleInfo> = {\n ADMIN: {\n id: 'ADMIN',\n title: 'Admin',\n hierarchy: 4,\n permissions: {\n canManageUsers: true,\n canDelete: true,\n canEdit: true,\n canPublish: true,\n canView: true,\n },\n sectionAccess: {\n ROOT: {\n canEdit: false,\n canView: true,\n },\n DOCUMENT: {\n canEdit: true,\n canView: true,\n },\n DESIGN: {\n canEdit: true,\n canView: true,\n },\n DEVELOP: {\n canEdit: true,\n canView: true,\n },\n PROTOTYPE: {\n canEdit: true,\n canView: true,\n },\n SETTINGS: {\n canEdit: true,\n canView: true,\n },\n },\n },\n CONTRIBUTOR: {\n id: 'CONTRIBUTOR',\n title: 'Contributor',\n hierarchy: 3,\n permissions: {\n canManageUsers: false,\n canDelete: false,\n canEdit: true,\n canPublish: false,\n canView: true,\n },\n sectionAccess: {\n ROOT: {\n canEdit: false,\n canView: true,\n },\n DOCUMENT: {\n canEdit: true,\n canView: true,\n },\n DESIGN: {\n canEdit: true,\n canView: true,\n },\n DEVELOP: {\n canEdit: true,\n canView: true,\n },\n PROTOTYPE: {\n canEdit: true,\n canView: true,\n },\n SETTINGS: {\n canEdit: true,\n canView: true,\n },\n },\n },\n CONSUMER: {\n id: 'CONSUMER',\n title: 'Consumer',\n hierarchy: 2,\n permissions: {\n canManageUsers: false,\n canDelete: false,\n canEdit: true,\n canPublish: false,\n canView: true,\n },\n sectionAccess: {\n ROOT: {\n canEdit: false,\n canView: true,\n },\n DOCUMENT: {\n canEdit: false,\n canView: true,\n },\n DESIGN: {\n canEdit: false,\n canView: false,\n },\n DEVELOP: {\n canEdit: false,\n canView: false,\n },\n PROTOTYPE: {\n canEdit: true,\n canView: true,\n },\n SETTINGS: {\n canEdit: false,\n canView: false,\n },\n },\n },\n VIEWER: {\n id: 'VIEWER',\n title: 'Viewer',\n hierarchy: 1,\n permissions: {\n canManageUsers: false,\n canDelete: false,\n canEdit: false,\n canPublish: false,\n canView: true,\n },\n sectionAccess: {\n ROOT: {\n canEdit: false,\n canView: true,\n },\n DOCUMENT: {\n canEdit: false,\n canView: true,\n },\n DESIGN: {\n canEdit: false,\n canView: false,\n },\n DEVELOP: {\n canEdit: false,\n canView: false,\n },\n PROTOTYPE: {\n canEdit: false,\n canView: false,\n },\n SETTINGS: {\n canEdit: false,\n canView: false,\n },\n },\n },\n ANONYMOUS: {\n id: 'ANONYMOUS',\n title: 'Anonymous',\n hierarchy: 0,\n permissions: {\n canManageUsers: false,\n canDelete: false,\n canEdit: false,\n canPublish: false,\n canView: true,\n },\n sectionAccess: {\n ROOT: {\n canEdit: false,\n canView: true,\n },\n DOCUMENT: {\n canEdit: false,\n canView: true,\n },\n DESIGN: {\n canEdit: false,\n canView: false,\n },\n DEVELOP: {\n canEdit: false,\n canView: false,\n },\n PROTOTYPE: {\n canEdit: false,\n canView: false,\n },\n SETTINGS: {\n canEdit: false,\n canView: false,\n },\n },\n },\n /**\n * These are not used, but exist in the DB\n * @todo: remove unused roles from database\n * @link https://linear.app/knapsack/issue/KSP-5991/remove-unused-roles-from-database\n */\n EDITOR: {\n id: 'EDITOR',\n title: 'Editor',\n hierarchy: 0,\n permissions: {\n canManageUsers: false,\n canDelete: false,\n canEdit: false,\n canPublish: false,\n canView: false,\n },\n sectionAccess: {\n ROOT: {\n canEdit: false,\n canView: false,\n },\n DOCUMENT: {\n canEdit: false,\n canView: false,\n },\n DESIGN: {\n canEdit: false,\n canView: false,\n },\n DEVELOP: {\n canEdit: false,\n canView: false,\n },\n PROTOTYPE: {\n canEdit: false,\n canView: false,\n },\n SETTINGS: {\n canEdit: false,\n canView: false,\n },\n },\n },\n MANAGER: {\n id: 'MANAGER',\n title: 'Manager',\n hierarchy: 0,\n permissions: {\n canManageUsers: false,\n canDelete: false,\n canEdit: false,\n canPublish: false,\n canView: false,\n },\n sectionAccess: {\n ROOT: {\n canEdit: false,\n canView: false,\n },\n DOCUMENT: {\n canEdit: false,\n canView: false,\n },\n DESIGN: {\n canEdit: false,\n canView: false,\n },\n DEVELOP: {\n canEdit: false,\n canView: false,\n },\n PROTOTYPE: {\n canEdit: false,\n canView: false,\n },\n SETTINGS: {\n canEdit: false,\n canView: false,\n },\n },\n },\n};\n\nexport const roles = Object.values(rolesById);\n","import { createUrlWithParams } from '@knapsack/utils/urls';\n\n/**\n * A type-safe representation of an API route.\n */\nexport type ApiRoute<\n Config extends {\n path: `/${string}`;\n method: 'GET' | 'POST';\n /**\n * GET - query params\n * POST - body\n */\n input?: Record<string, unknown>;\n /**\n * Response body\n * Can be a string if the response is a plain text message or html\n * Otherwise, it should be a JSON object\n */\n output?: Record<string, unknown> | string;\n },\n> = {\n path: Config['path'];\n method: Config['method'];\n input?: Config['input'];\n output?: Config['output'];\n};\n\n/**\n * Creates a URL for a specific API route with typed query parameters\n * @example\n * ```ts\n * createUrlForRoute({\n * path: '/api/users',\n * queryParams: { id: '123' },\n * origin: 'https://example.com'\n * })\n * // => URL('https://example.com/api/users?id=123')\n */\nexport function createUrlForRoute<Route extends ApiRoute<any>>({\n /** API route path */\n path,\n /** Typed query parameters matching the route's input type */\n queryParams,\n /** Base URL for relative paths */\n origin,\n}: {\n path: Route['path'];\n queryParams: Route['input'] extends Record<string, unknown>\n ? Route['input']\n : undefined;\n origin?: string;\n}) {\n return createUrlWithParams({\n url: path,\n queryParams,\n origin,\n });\n}\n\n/**\n * Converts URLSearchParams into a typed object\n * @example\n * ```ts\n * const params = new URLSearchParams('foo=bar&count=42');\n * getParams(params)\n * // => { foo: 'bar', count: '42' }\n */\nexport function getParams<Params extends Record<string, string>>(\n /** URLSearchParams object to convert */\n params: URLSearchParams,\n): Params {\n return Object.fromEntries(params.entries()) as Params;\n}\n\n/**\n * Converts URLSearchParams into a typed object matching an API route's input type\n * @example\n * ```ts\n * const params = new URLSearchParams('userId=123&action=update');\n * getParamsForRoute<UserRoute>(params)\n * // => { userId: '123', action: 'update' }\n */\nexport function getParamsForRoute<Route extends ApiRoute<any>>(\n /** URLSearchParams object to convert */\n params: URLSearchParams,\n): Route['input'] {\n return getParams(params);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ui-config.ts","../src/color-config.ts","../src/typography-config.ts","../src/nav-customization-config.ts","../src/app-client-data/blocks.ts","../src/app-client-data/design-tokens.ts","../src/app-client-data/design-tokens-types/token-definitions.ts","../src/app-client-data/design-tokens-types/token-data.ts","../src/app-client-data/design-tokens-types/token-src-value-info.ts","../src/app-client-data/design-tokens-types/token-src.ts","../src/app-client-data/design-tokens-types/token-utils.ts","../src/app-client-data/patterns.ts","../src/app-client-data/tabs.ts","../src/app-client-data/page.header.ts","../src/app-client-data/index.ts","../src/app-client-data-v3/index.ts","../src/app-client-data-migrations/4.1.7-demos.ts","../src/app-client-data-migrations/index.ts","../src/app-sections.ts","../src/json-schema.ts","../src/changes.ts","../src/renderers.ts","../src/renderer-client-types.ts","../src/web-sockets.ts","../src/git-providers.ts","../src/user-roles.ts","../src/api-routes.ts"],"names":["isColor","color","colorString","__name","ColorStringStruct","define","value","ColorConfigStruct","union","type","literal","string","ColorTokenConfigStruct","HeadingLevels","FontSizeConfigValStruct","object","enums","number","FontFaceWeightStruct","FontFaceSourceFormats","FontFaceFormatsEnumStruct","FontFaceSourceStruct","FontFaceConfigStruct","optional","size","array","TextTransforms","FontStretches","TypographyLinkConfigStruct","boolean","FontSizeConfigStruct","TypographyConfigStruct","pageElementConfig","pageLinkElementConfig","pageElements","pageElementsV2","NavCustomizationConfigStruct","PrimaryNavCustomizationConfigStruct","SecondaryNavCustomizationConfigStruct","navCustomizationConfig","secondaryNavCustomizationConfig","primaryNavCustomizationConfig","customizableNavElements","UiConfigV1Struct","UiConfigV2Struct","UiConfigV3Struct","UiConfigV4Struct","defaulted","UiConfigV5Struct","UiConfigV6Struct","UiConfigV7Struct","UiConfigV8Struct","UiConfigV9Struct","UiConfigV10Struct","UiConfigStruct","BlockSizes","BlockSpacings","tokenNameDisplayFormats","strokeStyleValues","isTokenReference","val","hasTokenReferences","isNotTokenReference","TokenReferenceStruct","Te","compositeTypesRecord","tokenTypeComposites","singularTypesRecord","tokenTypeSingulars","isTokenTypeComposite","isTokenTypeSingular","expectType","TokenDataBaseStruct","t","isTokenDataComposite","tokenData","isTokenValueColor","TokenValueColorStruct","TokenDataColorNonRefStruct","TokenDataColorRefStruct","isTokenValueDimension","TokenValueDimensionStruct","TokenDataDimensionNonRefStruct","TokenDataDimensionRefStruct","isTokenValueDuration","TokenValueDurationStruct","TokenDataDurationNonRefStruct","TokenDataDurationRefStruct","isTokenValueFontWeight","TokenValueFontWeightStruct","TokenDataFontWeightNonRefStruct","TokenDataFontWeightRefStruct","TokenValueCubicBezierStruct","v","TokenDataCubicBezierNonRefStruct","TokenDataCubicBezierRefStruct","isTokenValueShadow","isObject","TokenValueShadowStruct","TokenDataShadowNonRefStruct","TokenDataShadowRefStruct","TokenValueStrokeStyleStruct","isTokenValueBorder","TokenValueBorderStruct","TokenDataBorderNonRefStruct","TokenDataBorderRefStruct","isTokenValueTransition","TokenValueTransitionStruct","TokenDataTransitionNonRefStruct","TokenDataTransitionRefStruct","TokenDataStringNonRefStruct","TokenDataStringRefStruct","TokenDataStrokeStyleNonRefStruct","TokenDataStrokeStyleRefStruct","TokenDataNumberNonRefStruct","TokenDataNumberRefStruct","TokenDataBooleanNonRefStruct","TokenDataBooleanRefStruct","assertTokenData","data","isObjKey","kind","error","isTokenSrcValueInfoSingular","tokenSrcValueInfo","isTokenSrcValueInfoComposite","isTokenSrcExtensions","extensionsObj","isTokenSrc","tokenObject","isTokenGroup","isTokenTypeVarRef","varRefCollectionInfo","getPrimitiveValue","tokenValue","isDimensionString","parseTokenDimensionValue","valueToParse","unit","parseNumberWithUnit","isDemoWithData","demo","isDataDemo","isTemplateDemo","isSpecNotInferred","spec","patternTabTypes","PageHeaderSizes","emptyAppClientData","isKsAppClientDataNoMeta","key","KsAppClientDataNoMetaStruct","KsAppClientDataNoMetaZodWIP","z","KsAppClientDataNoMetaZod","ctx","isKsAppClientDataAndMeta","KsAppClientDataAndMetaStruct","KsMetaStateStruct","isKsMetaState","isKsAppClientDataNoMetaV3","KsAppClientDataNoMetaStructV3","isKsAppClientDataAndMetaV3","KsAppClientDataAndMetaStructV3","KsMetaStateStructV3","isKsMetaStateV3","migration417Demos","appClientData","isDraft","pattern","slotName","slotData","slottedData","pId","templates","tId","demoIds","migrations","appSectionsById","appSections","PropTypeNames","isStringProp","prop","isNumberProp","isBooleanProp","isOptionsProp","isFunctionProp","isCustomTypeScriptProp","isArrayOfObjectsProp","isObjectProp","isArrayOfStringsProp","isArrayOfNumbersProp","PatchStructRuntime","p","PatchStruct","isPatch","patch","PatchesStructRuntime","PatchesStruct","isPatches","patches","KsRemoteChangeRuntime","KsRemoteChangeStruct","isKsRemoteChange","change","KsRemoteChangesStructRuntime","KsRemoteChangesStruct","isKsRemoteChanges","changes","rendererIds","CodeSrcUserConfigSchema","isTemplateInfoWithCodeSrcPath","info","createTemplateInfoId","addIdToTemplateInfo","normalizeTemplateInfo","rendererId","alias","path","convertTemplateInfoToOldWay","metaForIosRenderer","metaForAndroidRenderer","KsRendererClientEvents","ksRendererClientMetaId","WS_EVENTS","GitProviderType","MergeableState","RestActions","TextEncoding","rolesById","roles","createUrlForRoute","queryParams","origin","createUrlWithParams","getParams","params","getParamsForRoute"],"mappings":"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","file":"index.js","sourcesContent":["import {\n type,\n Describe,\n literal,\n optional,\n defaulted,\n boolean,\n array,\n object,\n} from 'superstruct';\n\nimport { ExpandRecursively } from '@knapsack/utils';\n\nimport {\n ColorConfig,\n ColorConfigStruct,\n ColorStringStruct,\n} from './color-config';\n\nimport {\n FontFaceConfigStruct,\n FontFaceConfig,\n TypographyConfigStruct,\n TypographyLinkConfigStruct,\n pageElements,\n pageElementsV2,\n} from './typography-config';\n\nimport {\n customizableNavElements,\n NavCustomizationConfigStruct,\n PrimaryNavCustomizationConfigStruct,\n SecondaryNavCustomizationConfigStruct,\n} from './nav-customization-config';\n\nexport type UiConfigV1 = {\n version: 1;\n oldSillySidebarBgColor: string;\n};\n\nexport const UiConfigV1Struct: Describe<UiConfigV1> = object({\n version: literal(1),\n oldSillySidebarBgColor: ColorStringStruct,\n});\n\nexport type UiConfigV2 = {\n version: 2;\n anotherSillySidebarBgColor: string;\n};\n\nexport const UiConfigV2Struct: Describe<UiConfigV2> = object({\n version: literal(2),\n anotherSillySidebarBgColor: ColorStringStruct,\n});\n\nexport type UiConfigV3 = {\n version: 3;\n sidebarBgColor: string;\n};\n\nexport const UiConfigV3Struct: Describe<UiConfigV3> = object({\n version: literal(3),\n sidebarBgColor: ColorStringStruct,\n});\n\nexport type UiConfigV4 = {\n version: 4;\n primaryColor: ColorConfig;\n darkColor: ColorConfig;\n lightColor: ColorConfig;\n enableSidebarIcons?: boolean;\n};\nexport const UiConfigV4Struct: Describe<UiConfigV4> = object({\n version: literal(4),\n primaryColor: ColorConfigStruct,\n darkColor: ColorConfigStruct,\n lightColor: ColorConfigStruct,\n enableSidebarIcons: optional(defaulted(boolean(), true)),\n});\n\nexport type UiConfigV5 = {\n version: 5;\n primaryColor: ColorConfig;\n darkColor: ColorConfig;\n lightColor: ColorConfig;\n linkColor: ColorConfig;\n enableSidebarIcons: boolean;\n};\nexport const UiConfigV5Struct: Describe<UiConfigV5> = object({\n version: literal(5),\n primaryColor: ColorConfigStruct,\n darkColor: ColorConfigStruct,\n lightColor: ColorConfigStruct,\n linkColor: ColorConfigStruct,\n enableSidebarIcons: optional(defaulted(boolean(), true)),\n});\n\nexport interface _UiConfigV6 extends Omit<UiConfigV5, 'version'> {\n version: 6;\n appearance: {\n customFonts?: FontFaceConfig[];\n pageElements: typeof pageElements;\n };\n}\n\n// ExpandRecursively needed to avoid \"Type 'UiConfigV6' is not assignable to type 'Record<string, unknown>'.\" error\nexport type UiConfigV6 = ExpandRecursively<_UiConfigV6>;\n\nexport const UiConfigV6Struct: Describe<UiConfigV6> = object({\n version: literal(6),\n primaryColor: ColorConfigStruct,\n darkColor: ColorConfigStruct,\n lightColor: ColorConfigStruct,\n linkColor: ColorConfigStruct,\n enableSidebarIcons: optional(defaulted(boolean(), true)),\n\n appearance: type({\n customFonts: optional(array(FontFaceConfigStruct)),\n pageElements: type({\n pageTitle: optional(TypographyConfigStruct),\n pageDescription: optional(TypographyConfigStruct),\n headingLarge: optional(TypographyConfigStruct),\n headingMedium: optional(TypographyConfigStruct),\n headingSmall: optional(TypographyConfigStruct),\n bodyText: optional(TypographyConfigStruct),\n link: optional(TypographyLinkConfigStruct),\n }),\n }),\n});\n\nexport interface _UiConfigV7 extends Omit<UiConfigV6, 'version'> {\n version: 7;\n appearance: {\n navigation?: typeof customizableNavElements;\n customFonts?: UiConfigV6['appearance']['customFonts'];\n pageElements: UiConfigV6['appearance']['pageElements'];\n };\n}\n\n// ExpandRecursively needed to avoid \"Type 'UiConfig7' is not assignable to type 'Record<string, unknown>'.\" error in ui-config.xstate.ts\nexport type UiConfigV7 = ExpandRecursively<_UiConfigV7>;\n\nexport const UiConfigV7Struct: Describe<UiConfigV7> = object({\n version: literal(7),\n primaryColor: ColorConfigStruct,\n darkColor: ColorConfigStruct,\n lightColor: ColorConfigStruct,\n linkColor: ColorConfigStruct,\n enableSidebarIcons: optional(defaulted(boolean(), true)),\n\n appearance: type({\n customFonts: optional(array(FontFaceConfigStruct)),\n navigation: optional(\n type({\n primaryNav: optional(PrimaryNavCustomizationConfigStruct),\n secondaryNav: optional(SecondaryNavCustomizationConfigStruct),\n tabs: optional(NavCustomizationConfigStruct),\n }),\n ),\n pageElements: type({\n pageTitle: optional(TypographyConfigStruct),\n pageDescription: optional(TypographyConfigStruct),\n headingLarge: optional(TypographyConfigStruct),\n headingMedium: optional(TypographyConfigStruct),\n headingSmall: optional(TypographyConfigStruct),\n bodyText: optional(TypographyConfigStruct),\n link: optional(TypographyLinkConfigStruct),\n }),\n }),\n});\n\nexport interface _UiConfigV8\n extends Omit<UiConfigV7, 'version' | 'enableSidebarIcons'> {\n version: 8;\n}\n\n// ExpandRecursively needed to avoid \"Type 'UiConfig8' is not assignable to type 'Record<string, unknown>'.\" error in ui-config.xstate.ts\n// TODO: move this to @knapsack/types\nexport type UiConfigV8 = ExpandRecursively<_UiConfigV8>;\n\nexport const UiConfigV8Struct: Describe<UiConfigV8> = object({\n version: literal(8),\n primaryColor: ColorConfigStruct,\n darkColor: ColorConfigStruct,\n lightColor: ColorConfigStruct,\n linkColor: ColorConfigStruct,\n\n appearance: type({\n customFonts: optional(array(FontFaceConfigStruct)),\n navigation: optional(\n type({\n primaryNav: optional(PrimaryNavCustomizationConfigStruct),\n secondaryNav: optional(SecondaryNavCustomizationConfigStruct),\n tabs: optional(NavCustomizationConfigStruct),\n }),\n ),\n pageElements: type({\n pageTitle: optional(TypographyConfigStruct),\n pageDescription: optional(TypographyConfigStruct),\n headingLarge: optional(TypographyConfigStruct),\n headingMedium: optional(TypographyConfigStruct),\n headingSmall: optional(TypographyConfigStruct),\n bodyText: optional(TypographyConfigStruct),\n link: optional(TypographyLinkConfigStruct),\n }),\n }),\n});\n\nexport interface _UiConfigV9\n extends Omit<\n UiConfigV8,\n 'version' | 'primaryColor' | 'darkColor' | 'lightColor' | 'linkColor'\n > {\n version: 9;\n}\nexport type UiConfigV9 = ExpandRecursively<_UiConfigV9>;\n\nexport const UiConfigV9Struct: Describe<UiConfigV9> = object({\n version: literal(9),\n\n appearance: type({\n customFonts: optional(array(FontFaceConfigStruct)),\n navigation: optional(\n type({\n primaryNav: optional(PrimaryNavCustomizationConfigStruct),\n secondaryNav: optional(SecondaryNavCustomizationConfigStruct),\n tabs: optional(NavCustomizationConfigStruct),\n }),\n ),\n pageElements: type({\n pageTitle: optional(TypographyConfigStruct),\n pageDescription: optional(TypographyConfigStruct),\n headingLarge: optional(TypographyConfigStruct),\n headingMedium: optional(TypographyConfigStruct),\n headingSmall: optional(TypographyConfigStruct),\n bodyText: optional(TypographyConfigStruct),\n link: optional(TypographyLinkConfigStruct),\n }),\n }),\n});\n\nexport interface _UiConfigV10 extends Omit<UiConfigV9, 'version'> {\n version: 10;\n appearance: {\n navigation?: UiConfigV9['appearance']['navigation'];\n customFonts?: UiConfigV9['appearance']['customFonts'];\n pageElements: typeof pageElementsV2;\n };\n}\nexport type UiConfigV10 = ExpandRecursively<_UiConfigV10>;\n\nexport const UiConfigV10Struct: Describe<UiConfigV10> = object({\n version: literal(10),\n\n appearance: type({\n customFonts: optional(array(FontFaceConfigStruct)),\n navigation: optional(\n type({\n primaryNav: optional(PrimaryNavCustomizationConfigStruct),\n secondaryNav: optional(SecondaryNavCustomizationConfigStruct),\n tabs: optional(NavCustomizationConfigStruct),\n }),\n ),\n pageElements: type({\n pageTitle: optional(TypographyConfigStruct),\n pageDescription: optional(TypographyConfigStruct),\n headingXLarge: optional(TypographyConfigStruct),\n headingLarge: optional(TypographyConfigStruct),\n headingMedium: optional(TypographyConfigStruct),\n headingSmall: optional(TypographyConfigStruct),\n headingXSmall: optional(TypographyConfigStruct),\n bodyText: optional(TypographyConfigStruct),\n link: optional(TypographyLinkConfigStruct),\n }),\n }),\n});\n\nexport type UiConfigVersions =\n | typeof UiConfigV1Struct.TYPE\n | typeof UiConfigV2Struct.TYPE\n | typeof UiConfigV3Struct.TYPE\n | typeof UiConfigV4Struct.TYPE\n | typeof UiConfigV5Struct.TYPE\n | typeof UiConfigV6Struct.TYPE\n | typeof UiConfigV7Struct.TYPE\n | typeof UiConfigV8Struct.TYPE\n | typeof UiConfigV9Struct.TYPE\n | typeof UiConfigV10Struct.TYPE;\n\n// ALIASES FOR LATEST VERSIONS\nexport type UiConfig = UiConfigV10;\nexport const UiConfigStruct: typeof UiConfigV10Struct = UiConfigV10Struct;\n\nexport type NavElementNames = keyof UiConfig['appearance']['navigation'];\n","import colorString from 'color-string';\nimport { define, Describe, literal, string, type, union } from 'superstruct'; // https://docs.superstructjs.org\n\n/** Use `import { isColor } from '@knapsack/color-utils'` if you can, need to duplicate this logic due to dep cycle */\nfunction isColor(color: unknown): color is string {\n if (typeof color !== 'string') return false;\n try {\n return !!colorString.get(color);\n } catch (e) {\n return false;\n }\n}\n\nexport type ColorTokenConfig = {\n type: 'design-token';\n /** Will be **either** `-` (old) or `.` (new) separated */\n tokenName: string;\n};\nexport type ColorConfig =\n | { type: 'value'; colorValue: string }\n | ColorTokenConfig;\n\nexport const ColorStringStruct = define<string>(\n 'ColorStringStruct',\n (value) => typeof value === 'string' && isColor(value),\n);\n\nexport const ColorConfigStruct: Describe<ColorConfig> = union([\n type({\n type: literal('value'),\n colorValue: ColorStringStruct,\n }),\n type({\n type: literal('design-token'),\n tokenName: string(),\n }),\n]);\n\n// so we can check if an object is not just a ColorConfig but specifically a token\nexport const ColorTokenConfigStruct: Describe<ColorTokenConfig> = type({\n type: literal('design-token'),\n tokenName: string(),\n});\n","import {\n Describe,\n string,\n type,\n union,\n number,\n enums,\n optional,\n literal,\n array,\n size,\n boolean,\n object,\n} from 'superstruct'; // https://docs.superstructjs.org\nimport { ColorConfig, ColorConfigStruct } from './color-config';\n\nexport const HeadingLevels = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] as const;\nexport type HeadingLevel = (typeof HeadingLevels)[number];\n\nexport type FontSizeConfigVal = {\n unit: 'px' | 'rem';\n value: number;\n};\n\nexport const FontSizeConfigValStruct: Describe<FontSizeConfigVal> = object({\n unit: enums(['rem', 'px']),\n value: number(),\n});\n\nexport type FontFaceWeight = number | string;\n\nexport const FontFaceWeightStruct: Describe<FontFaceWeight> = union([\n string(),\n number(),\n]);\n\nexport enum FontFaceSourceFormats {\n woff2 = 'woff2',\n woff = 'woff',\n}\n\nexport type FontFaceSource = {\n /**\n * Note: if /when we eventually add 'local' type support, format isn't used!\n */\n format: keyof typeof FontFaceSourceFormats;\n type: 'url';\n path: string;\n};\n\nexport const FontFaceFormatsEnumStruct = enums(['woff2', 'woff']);\n\nexport const FontFaceSourceStruct: Describe<FontFaceSource> = type({\n format: FontFaceFormatsEnumStruct,\n type: literal('url'),\n path: string(),\n});\n\nexport type FontFaceConfig = {\n /**\n * registered name of the custom font\n *\n * MDN Docs on {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-family @font-face's font-family property}\n */\n family?: string;\n\n /**\n * number between 1 and 1000.\n *\n * note: since two weights are allowed (with variable fonts), this type is an\n * optional array for easy parsing down the road.\n *\n * MDN Docs on {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-weight @font-face's font-weight property}.\n */\n weight?: FontFaceWeight | FontFaceWeight[];\n\n /**\n * the collection of urls / paths pointing to font files\n *\n * MDN Docs on {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/src @font-face's src property}.\n */\n src?: FontFaceSource[];\n\n /**\n * the style of the custom font (ex. normal or italic)\n *\n * {@link https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-style See MDN docs on font-style}.\n */\n style?: string;\n\n // @todo: implement these later\n // display?: 'auto' | 'block' | 'swap' | 'fallback' | 'optional';\n // variationSettings?: string;\n // unicodeRange?: string; // or ideally, URange; //\n // see https://drafts.csswg.org/css-syntax-3/#urange-syntax and\n // https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/unicode-range\n};\n\nexport const FontFaceConfigStruct: Describe<FontFaceConfig> = type({\n family: optional(string()),\n weight: optional(\n union([FontFaceWeightStruct, size(array(FontFaceWeightStruct), 2)]),\n ),\n src: optional(array(FontFaceSourceStruct)),\n style: optional(string()),\n display: optional(enums(['auto', 'block', 'swap', 'fallback', 'optional'])),\n variationSettings: optional(string()),\n unicodeRange: optional(string()),\n});\n\nexport type FontSizeConfig = {\n min: FontSizeConfigVal;\n max?: FontSizeConfigVal;\n};\n\nexport enum TextTransforms {\n inherit = 'As typed',\n capitalize = 'Capitalize',\n lowercase = 'Lowercase',\n uppercase = 'Uppercase',\n}\n\nexport enum FontStretches {\n 'ultra-condensed' = 'Ultra-condensed',\n 'extra-condensed' = 'Extra-condensed',\n condensed = 'Condensed',\n 'semi-condensed' = 'Semi-condensed',\n normal = 'Normal',\n 'semi-expanded' = 'Semi-expanded',\n expanded = 'Expanded',\n 'extra-expanded' = 'Extra-expanded',\n 'ultra-expanded' = 'Ultra-expanded',\n}\n\nexport type TypographyConfig = {\n /**\n * min / max height used to future-proof way of supporting responsive typography\n */\n fontSize?: FontSizeConfig;\n\n /**\n * reminder: line-heights can also be unitless!\n */\n lineHeight?: string | number;\n fontWeight?: FontFaceWeight;\n\n /**\n * note: letter-spacing can't be unitless, unit required!\n */\n letterSpacing?: string;\n\n /**\n * if not specified, Knapsack default font, otherwise should allow for a stack of font strings + fallbacks (including the names of custom registered fonts)\n */\n fontFamily?: string;\n\n textColor?: ColorConfig;\n\n textTransform?: keyof typeof TextTransforms;\n\n fontStretch?: keyof typeof FontStretches;\n};\n\nexport interface TypographyLinkConfig {\n fontWeight?: FontFaceWeight;\n textColor?: ColorConfig;\n hoverColor?: ColorConfig;\n underline?: boolean;\n textTransform?: keyof typeof TextTransforms;\n fontStretch?: keyof typeof FontStretches;\n}\n\nexport const TypographyLinkConfigStruct: Describe<TypographyLinkConfig> = type({\n fontWeight: optional(union([string(), number()])),\n textColor: optional(ColorConfigStruct),\n hoverColor: optional(ColorConfigStruct),\n underline: optional(boolean()),\n textTransform: optional(\n enums(['inherit', 'capitalize', 'lowercase', 'uppercase']),\n ),\n fontStretch: optional(\n enums([\n 'ultra-condensed',\n 'extra-condensed',\n 'condensed',\n 'semi-condensed',\n 'normal',\n 'semi-expanded',\n 'expanded',\n 'extra-expanded',\n 'ultra-expanded',\n ]),\n ),\n});\n\nexport const FontSizeConfigStruct: Describe<FontSizeConfig> = type({\n min: FontSizeConfigValStruct,\n max: optional(FontSizeConfigValStruct),\n});\n\nexport const TypographyConfigStruct: Describe<TypographyConfig> = type({\n fontSize: optional(FontSizeConfigStruct),\n lineHeight: optional(union([string(), number()])),\n fontWeight: optional(union([string(), number()])),\n letterSpacing: optional(string()),\n fontFamily: optional(string()),\n textColor: optional(ColorConfigStruct),\n textTransform: optional(\n enums(['inherit', 'capitalize', 'lowercase', 'uppercase']),\n ),\n fontStretch: optional(\n enums([\n 'ultra-condensed',\n 'extra-condensed',\n 'condensed',\n 'semi-condensed',\n 'normal',\n 'semi-expanded',\n 'expanded',\n 'extra-expanded',\n 'ultra-expanded',\n ]),\n ),\n});\n\nconst pageElementConfig: TypographyConfig = {};\nconst pageLinkElementConfig: TypographyLinkConfig = {};\n\nexport const pageElements = {\n pageTitle: pageElementConfig,\n pageDescription: pageElementConfig,\n headingLarge: pageElementConfig,\n headingMedium: pageElementConfig,\n headingSmall: pageElementConfig,\n bodyText: pageElementConfig,\n link: pageLinkElementConfig,\n} as const;\n\nexport const pageElementsV2 = {\n pageTitle: pageElementConfig,\n pageDescription: pageElementConfig,\n headingXLarge: pageElementConfig,\n headingLarge: pageElementConfig,\n headingMedium: pageElementConfig,\n headingSmall: pageElementConfig,\n headingXSmall: pageElementConfig,\n bodyText: pageElementConfig,\n link: pageLinkElementConfig,\n} as const;\n\nexport type PageElementNames = keyof typeof pageElementsV2;\nexport type PageElementConfig = (typeof pageElementsV2)[PageElementNames];\n","import { Describe, type, union, optional } from 'superstruct'; // https://docs.superstructjs.org\nimport { ColorConfig, ColorConfigStruct } from './color-config';\nimport { TypographyConfig, TypographyConfigStruct } from './typography-config';\n\nexport interface NavCustomizationConfig extends TypographyConfig {\n accentColor?: ColorConfig;\n}\n\nexport interface PrimaryNavCustomizationConfig extends NavCustomizationConfig {\n hoverColor?: ColorConfig;\n backgroundColor?: ColorConfig;\n}\n\nexport type SecondaryNavCustomizationConfig = Omit<\n PrimaryNavCustomizationConfig,\n 'hoverColor'\n>;\n\nexport const NavCustomizationConfigStruct: Describe<NavCustomizationConfig> =\n union([\n TypographyConfigStruct,\n type({\n accentColor: optional(ColorConfigStruct),\n }),\n ]);\n\n// hoverColor: optional(ColorConfigStruct),\nexport const PrimaryNavCustomizationConfigStruct: Describe<PrimaryNavCustomizationConfig> =\n union([\n NavCustomizationConfigStruct,\n type({\n hoverColor: optional(ColorConfigStruct),\n backgroundColor: optional(ColorConfigStruct),\n }),\n ]);\n\nexport const SecondaryNavCustomizationConfigStruct: Describe<SecondaryNavCustomizationConfig> =\n union([\n NavCustomizationConfigStruct,\n type({\n backgroundColor: optional(ColorConfigStruct),\n }),\n ]);\n\nconst navCustomizationConfig: NavCustomizationConfig = {};\nconst secondaryNavCustomizationConfig: SecondaryNavCustomizationConfig = {};\nconst primaryNavCustomizationConfig: PrimaryNavCustomizationConfig = {};\n\nexport const customizableNavElements = {\n primaryNav: primaryNavCustomizationConfig,\n secondaryNav: secondaryNavCustomizationConfig,\n tabs: navCustomizationConfig,\n} as const;\n\nexport type CustomizableNavElementNames = keyof typeof customizableNavElements;\nexport type CustomizableNavElementConfig =\n (typeof customizableNavElements)[CustomizableNavElementNames];\n","import type { JSONContent } from '@tiptap/core';\nimport { TokenType, TokenVarType } from './design-tokens-types';\n\nexport const BlockSizes = ['large', 'medium', 'small'] as const;\ntype BlockSize = (typeof BlockSizes)[number];\n\nexport const BlockSpacings = ['large', 'medium', 'small'] as const;\ntype BlockSpacing = (typeof BlockSpacings)[number];\n\nexport type BlockHeader = {\n showHeader?: boolean;\n title?: string;\n description?: string;\n};\n\n/**\n * Data for blocks made using the `createEmbedBlock` function\n */\ntype IframeBlockData = {\n url?: string;\n clickToInteract: boolean;\n height?: number | string;\n};\n\ntype BlockConfigBase<\n BlockType extends string,\n Data extends Record<string, unknown> = never,\n> = {\n // Unique across all blocks, basically a UUID upon creation\n // e.g. `ut79D2X_H`\n id: string;\n // Match this to a Slices `id` to use it\n blockType: BlockType;\n data: Data;\n header?: BlockHeader;\n size?: BlockSize;\n /** Controls the amount of spacing AFTER a block */\n spacing?: BlockSpacing;\n};\n\ntype BlockConfigUnion =\n | BlockConfigBase<\n 'component-spec-block',\n {\n patternId?: string;\n templateId?: string;\n collapsible?: boolean;\n expanded?: boolean;\n }\n >\n | BlockConfigBase<\n 'pattern-template-block',\n {\n patternId?: string;\n templateId?: string;\n demoId?: string;\n /** @deprecated */\n demoSize?: string;\n showSchemaForm?: boolean;\n showCodeSnippet?: boolean;\n hideControls?: boolean;\n allowResizing?: boolean;\n }\n >\n | BlockConfigBase<\n 'design-src-tiles',\n {\n columns?: '4' | '3' | '2' | '1';\n imageStyles?: {\n align?: 'left' | 'right' | 'center';\n background?: 'dark' | 'light' | 'none';\n corners?: 'square' | 'rounded';\n fit?: 'contain' | 'fill';\n seamless?: boolean;\n size?: 'auto' | 'small' | 'medium' | 'large' | 'xsmall' | 'xlarge';\n };\n items: {\n description?: JSONContent;\n fileId: string;\n nodeId: string;\n title?: string;\n }[];\n layout?: 'grid' | 'list';\n hideComponentProps?: boolean;\n }\n >\n | BlockConfigBase<\n 'design-src-component',\n {\n fileId: string;\n componentId: string;\n contents: Array<'variants' | 'spec' | 'usage'>;\n styles?: {\n columns?: '4' | '3' | '2' | '1';\n image?: {\n align?: 'left' | 'right' | 'center';\n background?: 'dark' | 'light';\n corners?: 'square' | 'rounded';\n size?: 'auto' | 'small' | 'medium' | 'large' | 'xsmall' | 'xlarge';\n };\n layout?: 'grid' | 'list';\n };\n hideComponentProps?: boolean;\n hideComponentTitles?: boolean;\n }\n >\n | BlockConfigBase<\n 'text-editor',\n {\n autoFocus?: boolean;\n content: JSONContent;\n }\n >\n | BlockConfigBase<\n 'files-list',\n {\n files: string[];\n }\n >\n | BlockConfigBase<\n 'callout',\n {\n type: 'error' | 'info' | 'success' | 'warning';\n content: JSONContent;\n }\n >\n | BlockConfigBase<\n 'code-snippet',\n {\n content: JSONContent;\n }\n >\n | BlockConfigBase<'divider-block', Record<string, never>>\n | BlockConfigBase<\n 'guidelines',\n {\n guidelines: {\n id: string;\n image?: {\n src: string;\n title?: string;\n alt?: string;\n };\n imageFit?: 'contain' | 'cover';\n type: 'caution' | 'do' | 'dont';\n content?: JSONContent;\n }[];\n gridStyles?: {\n centered?: boolean;\n columns?: '4' | '3' | '2' | '1';\n };\n tileStyles?: {\n headerBeforeImage?: boolean;\n imageOutlined?: boolean;\n imageRounded?: boolean;\n imageSize?:\n | 'none'\n | 'small'\n | 'medium'\n | 'large'\n | 'xsmall'\n | 'xlarge';\n };\n }\n >\n | BlockConfigBase<\n 'image-block',\n {\n imageSize?: 'xs' | 's' | 'm' | 'l' | 'full';\n images?: {\n caption?: string;\n src: string;\n }[];\n }\n >\n | BlockConfigBase<\n 'shortcut-tiles',\n {\n shortcuts: {\n description?: string;\n id: string;\n image?: string;\n link: {\n external?: boolean;\n name?: string;\n path: string;\n };\n title: string;\n }[];\n gridStyles?: {\n columns?: '4' | '3' | '2' | '1';\n centered?: boolean;\n gapSize?: number;\n };\n tileStyles?: {\n imageSize?: 'none' | 'xsmall' | 'small' | 'medium' | 'large';\n outlined?: boolean;\n rounded?: boolean;\n titleSize?: 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';\n };\n }\n >\n | BlockConfigBase<\n 'table',\n {\n content: JSONContent;\n }\n >\n | BlockConfigBase<\n 'pattern-variations',\n {\n patternId?: string;\n templateId?: string;\n demoId?: string;\n variationId?: string;\n assetSetId?: string;\n excludePropValue?: string;\n includePropValue?: string;\n size?: 's' | 'm' | 'l' | 'full';\n /** @deprecated */\n hideBlockTitle?: boolean;\n }\n >\n | BlockConfigBase<\n 'design-tokens',\n {\n tokenType: TokenType | '';\n demoId: string;\n groupIds: string[];\n exclude?: string;\n include?: string;\n }\n >\n | BlockConfigBase<\n 'design-token-collection',\n {\n collectionId: string;\n modeIds?: string[];\n groupIds?: string[];\n exclude?: string;\n include?: string;\n varType?: TokenVarType;\n display?: 'color-swatches' | 'table';\n }\n >\n | BlockConfigBase<\n 'pattern-list-block',\n {\n itemSize?: 'small' | 'medium' | 'large' | 'full';\n showDescriptions?: boolean;\n excludePatterns?: string[];\n }\n >\n | BlockConfigBase<\n 'pattern-status-table-block',\n {\n excludeHiddenNavItems?: boolean;\n excludePatterns?: string[];\n }\n >\n | BlockConfigBase<\n 'video',\n {\n video: {\n format: string;\n name: string;\n size: string;\n url: string;\n };\n }\n >\n /** @deprecated */\n | BlockConfigBase<\n 'design-token-block',\n {\n tokens?: {\n type?: TokenType;\n category?: string;\n tags?: string[];\n name?: string;\n exclude?: string;\n };\n demo?: {\n id?: string;\n };\n }\n >\n | BlockConfigBase<'generic-iframe', IframeBlockData>\n | BlockConfigBase<'abstract-block', IframeBlockData>\n | BlockConfigBase<'adobe-xd-block', IframeBlockData>\n | BlockConfigBase<'airtable-block', IframeBlockData>\n | BlockConfigBase<'figma-block', IframeBlockData>\n | BlockConfigBase<'framer-cloud-block', IframeBlockData>\n | BlockConfigBase<'lucidchart-block', IframeBlockData>\n | BlockConfigBase<'storybook-block', IframeBlockData>\n | BlockConfigBase<'vimeo-block', IframeBlockData>\n | BlockConfigBase<'youtube-block', IframeBlockData>\n | BlockConfigBase<'whimsical-block', IframeBlockData>\n | BlockConfigBase<\n 'markdown-block',\n {\n md?: string | string[];\n /** Automatically switches to edit mode + autofocuses on the editor */\n autoEdit?: boolean;\n columns?: number;\n }\n >;\n\n/**\n * This is the config for a block - which is what is stored in `block.ID.json` and available at `data.db.blocks.byId[blockId]`\n *\n * @example\n * // Use the first generic to filter down to a specific block type\n * type PatternListBlockConfig = BlockConfig<'pattern-list-block'>;\n * // Access the field `data` by doing this:\n * type Data= BlockConfig<'pattern-list-block'>['data'];\n */\nexport type BlockConfig<\n BlockType extends BlockConfigUnion['blockType'] = BlockConfigUnion['blockType'],\n> = Extract<BlockConfigUnion, { blockType: BlockType }>;\n\n/**\n * Block Collection \"location\" here refers to where in the Knapsack data model\n * the \"location\" of the data is. Older \"block collection\" concepts within `page`\n * `patternSubPage` and `patternTemplate` were just an array of block IDs. Newer,\n * \"real\" `blockCollectionsById` is an actual data model that holds a list of block\n * IDs, separate from the page or pattern.\n * */\nexport type BlockCollectionLocation =\n | {\n type: 'page';\n pageId: string;\n }\n /** Tab on Page */\n | {\n type: 'pageTab';\n pageId: string;\n tabId: string;\n }\n /** Tab on Pattern Page */\n | {\n type: 'patternSubPage';\n patternId: string;\n subPageId: string;\n }\n /** At bottom of Pattern Template page (under Spec table) - least used location */\n | {\n type: 'patternTemplate';\n patternId: string;\n templateId: string;\n };\n\n/**\n * A named set of blocks grouped together for reuse or composition.\n */\nexport type BlockCollection = {\n id: string;\n // @TODO: Add title and description when a user can define these through UI\n // title: string;\n // description?: string;\n\n /**\n * Array of Block IDs\n */\n blockIds: BlockConfig['id'][]; // string[]\n};\n","export const tokenNameDisplayFormats = {\n default: 'Default',\n android: 'Android',\n cssVar: 'CSS Var',\n json: 'JSON',\n less: 'Less',\n scss: 'SCSS',\n swift: 'Swift',\n} as const;\n\nexport type TokenNameDisplayFormat = keyof typeof tokenNameDisplayFormats;\n","import * as s from 'superstruct';\n\nexport const strokeStyleValues = [\n 'solid',\n 'dashed',\n 'dotted',\n 'double',\n 'groove',\n 'ridge',\n 'outset',\n 'inset',\n] as const;\n\n/**\n * Don't use this one, use this instead:\n * @see {@link TokenDefinitionSingular}\n */\ntype TokenDefinitionSingularRaw =\n | { type: 'string'; value: string }\n | { type: 'number'; value: number }\n | { type: 'boolean'; value: boolean }\n | { type: 'color'; value: string }\n | {\n type: 'strokeStyle';\n value: (typeof strokeStyleValues)[number];\n }\n | { type: 'dimension'; value: `${number}${'px' | 'rem' | 'em' | '%'}` }\n | { type: 'duration'; value: `${number}ms` }\n // | { type: 'fontFamily'; value: string | string[] }\n | {\n type: 'fontWeight';\n // @TODO: Include union of possible strings https://tr.designtokens.org/format/#font-weight\n value: string | number;\n }\n | { type: 'cubicBezier'; value: [number, number, number, number] };\n\n/**\n * Definitions for both singular (non-composite) tokens.\n * Use first generic param to get just that type.\n * @example\n * ```ts\n * type TokenDefinitionDimension = TokenDefinitionSingular<'dimension'>\n * ```\n */\nexport type TokenDefinitionSingular<\n TheTokenType extends TokenDefinitionSingularRaw['type'] = TokenDefinitionSingularRaw['type'],\n> = Extract<TokenDefinitionSingularRaw, { type: TheTokenType }>;\n\n/**\n * Don't use this one, use this instead:\n * @see {@link TokenDefinitionComposite}\n */\ntype TokenDefinitionCompositeRaw =\n | {\n type: 'border';\n value: {\n color: { type: 'color' };\n style: { type: 'strokeStyle' };\n width: { type: 'dimension' };\n };\n }\n | {\n type: 'shadow';\n value: {\n color: { type: 'color' };\n offsetX: { type: 'dimension' };\n offsetY: { type: 'dimension' };\n spread: { type: 'dimension' };\n blur: { type: 'dimension' };\n inset: { type: 'boolean' };\n };\n }\n | {\n type: 'transition';\n value: {\n duration: { type: 'duration' };\n delay: { type: 'duration' };\n timingFunction: { type: 'cubicBezier' };\n };\n };\n// | {\n// type: 'gradient';\n// value: {\n// color: { type: 'color' };\n// position: { type: 'dimension' };\n// }[];\n// };\n\n/**\n * Definitions for composite tokens.\n * Use first generic param to get just that type.\n * @example\n * ```ts\n * type TokenDefinitionShadow = TokenDefinitionComposite<'shadow'>\n * ```\n */\nexport type TokenDefinitionComposite<\n TheTokenType extends TokenDefinitionCompositeRaw['type'] = TokenDefinitionCompositeRaw['type'],\n> = Extract<TokenDefinitionCompositeRaw, { type: TheTokenType }>;\n\n/**\n * Definitions for both singular and composite tokens.\n * Use first generic param to get just that type.\n * @example\n * ```ts\n * type TokenDefinitionDimension = TokenDefinition<'dimension'>\n * ```\n */\nexport type TokenDefinition<\n TheTokenType extends\n | TokenDefinitionComposite['type']\n | TokenDefinitionSingular['type'] =\n | TokenDefinitionComposite['type']\n | TokenDefinitionSingular['type'],\n> = Extract<\n TokenDefinitionComposite | TokenDefinitionSingular,\n { type: TheTokenType }\n>;\n\nexport type TokenReference = `{${string}}`;\n/** ensures there is no `{}` */\nexport type NotTokenReference<T> = T extends TokenReference ? never : T;\n\nexport function isTokenReference(val: unknown): val is TokenReference {\n if (typeof val !== 'string') return false;\n // total times `{` appears in `val`\n // Handle situation `{a.b} {c.d}`. Ensure count of `{` and `}` === 1. This\n // guarantees we ONLY support a single reference, ie `{a.b}`\n const totalOpenBrackets = val.split('{').length - 1;\n return totalOpenBrackets === 1 && val.startsWith('{') && val.endsWith('}');\n}\n\nexport function hasTokenReferences(val: unknown): boolean {\n return typeof val === 'string' && val.includes('{');\n}\n\nexport function isNotTokenReference<T>(\n value: T,\n): value is NotTokenReference<T> {\n return !isTokenReference(value);\n}\n\nexport const TokenReferenceStruct = s.define<TokenReference>(\n 'Token Reference',\n (value) => {\n if (typeof value !== 'string') return false;\n if (isNotTokenReference(value)) {\n return 'Must start and end with curly braces';\n }\n return true;\n },\n);\n\nexport type TokenType = TokenDefinition['type'];\nexport type TokenTypeComposite = TokenDefinitionComposite['type'];\nexport type TokenTypeSingular = TokenDefinitionSingular['type'];\nexport type TokenValueSingular = TokenDefinitionSingular['value'];\n\n// We make a Record to ensure we have *every* possible value\n// b/c TS will yell at us if a new one is added but isn't included here\n// then we make an array out of them, so we can be sure we have *every* possible value\nconst compositeTypesRecord: Record<TokenTypeComposite, TokenTypeComposite> = {\n border: 'border',\n shadow: 'shadow',\n transition: 'transition',\n};\nexport const tokenTypeComposites = Object.values(compositeTypesRecord);\nconst singularTypesRecord: Record<TokenTypeSingular, TokenTypeSingular> = {\n string: 'string',\n number: 'number',\n boolean: 'boolean',\n color: 'color',\n dimension: 'dimension',\n duration: 'duration',\n // fontFamily: 'fontFamily',\n fontWeight: 'fontWeight',\n strokeStyle: 'strokeStyle',\n cubicBezier: 'cubicBezier',\n};\nexport const tokenTypeSingulars = Object.values(singularTypesRecord);\n/**\n * @deprecated You probably want `isTokenDataComposite`\n * @see {isTokenDataComposite}\n */\nexport function isTokenTypeComposite(\n type: TokenType,\n): type is TokenTypeComposite {\n return tokenTypeComposites.includes(type as TokenTypeComposite);\n}\n\nexport function isTokenTypeSingular(\n type: TokenType,\n): type is TokenTypeSingular {\n return tokenTypeSingulars.includes(type as TokenTypeSingular);\n}\n","import { Simplify, expectType, isObjKey, isObject } from '@knapsack/utils';\nimport * as s from 'superstruct';\nimport {\n NotTokenReference,\n TokenDefinition,\n TokenDefinitionComposite,\n TokenDefinitionSingular,\n TokenReference,\n TokenReferenceStruct,\n TokenType,\n hasTokenReferences,\n isTokenTypeComposite,\n} from './token-definitions';\nimport { TokenKsExtensions, TokenOrder } from './token-misc';\nimport { TokenSrcValue } from './token-src';\n\n/** Used for tokens AND groups */\ntype TokenDataBothCommon = {\n id: string;\n description?: string;\n};\n\n// Shows what a fully de-referenced `value` of a composite token would be\ntype CreateDataValueForComposite<\n ValueObj extends Record<string, { type: TokenDefinitionSingular['type'] }>,\n> = {\n [Key in keyof ValueObj]: TokenDefinitionSingular<\n ValueObj[Key]['type']\n >['value'];\n};\n\nexpectType<\n CreateDataValueForComposite<TokenDefinitionComposite<'shadow'>['value']>[]\n>([\n {\n inset: false,\n color: '#000',\n offsetX: '0px',\n offsetY: '0px',\n spread: '0px',\n blur: '0px',\n },\n {\n color: '#000',\n offsetX: '0px',\n offsetY: '0px',\n spread: '0px',\n blur: '0px',\n inset: true,\n },\n]);\n\ntype TokenDataCommon<\n Info extends {\n /** Basically the ID */\n type: TokenDefinition['type'];\n value: unknown;\n },\n> = TokenDataBothCommon & {\n type: Info['type'];\n value: Info['value'];\n /**\n * Extracted from `$extensions['cloud.knapsack'].token`\n */\n tokenConfig?: TokenKsExtensions['token'];\n /**\n * Tokens that are references by this token\n * @todo will need to change for shadow\n * @example\n * ```\n * [\n * ['color.primary', 'color.secondary'],\n * ['spacing.medium']\n * ]\n * ```\n */\n references?: Array<string[]>;\n /**\n * Tokens that use this as a reference token\n * @see {CreateTokenData.references}\n * @example\n * * ```\n * [\n * ['color.primary', 'color.secondary'],\n * ['spacing.medium']\n * ]\n * ```\n */\n // referencedBy?: Array<string[]>;\n};\n\ntype CreateTokenData<\n Info extends {\n type: TokenDefinition['type'];\n value: unknown;\n },\n> =\n | ({\n kind: 'ref';\n /** Has `{}` removed */\n referencedTokenId: string;\n originalValue: TokenReference;\n } & TokenDataCommon<Info>)\n | ({\n kind: 'static';\n originalValue: NotTokenReference<TokenSrcValue<Info['type']>>;\n } & TokenDataCommon<Info>);\n\nconst TokenDataBaseStruct: s.Describe<\n TokenDataBothCommon & {\n references?: Array<string[]>;\n tokenConfig?: TokenKsExtensions['token'];\n }\n> = s.type({\n id: s.string(),\n description: s.optional(s.string()),\n references: s.optional(s.array(s.array(s.string()))),\n tokenConfig: s.optional(\n s.type({\n purpose: s.optional(s.string()),\n }),\n ),\n});\n\ntype TokenDataSingularRaw = {\n // ignore the key, this makes a discriminated union out of the values\n [TokenDef in TokenDefinitionSingular as TokenDef['type']]: Simplify<\n CreateTokenData<TokenDef>\n >;\n}[TokenDefinitionSingular['type']];\n\nexport type TokenDataSingular<\n TT extends TokenDataSingularRaw['type'] = TokenDataSingularRaw['type'],\n> = Extract<TokenDataSingularRaw, { type: TT }>;\n\nexpectType<TokenDataSingular[]>([\n {\n type: 'duration',\n value: '1ms',\n originalValue: '1ms',\n id: '1',\n kind: 'static',\n },\n {\n type: 'duration',\n value: '1ms',\n kind: 'ref',\n id: '1',\n originalValue: '{a.b}',\n referencedTokenId: '1',\n },\n // @ts-expect-error - kind is wrong\n {\n type: 'duration',\n value: '1ms',\n originalValue: '1ms',\n id: '1',\n kind: 'ref',\n },\n // @ts-expect-error - kind is wrong\n {\n type: 'duration',\n value: '1ms',\n kind: 'static',\n id: '1',\n originalValue: '{a.b}',\n referencedTokenId: '1',\n },\n {\n type: 'color',\n value: '#000',\n kind: 'static',\n id: '1',\n originalValue: '#000',\n },\n {\n type: 'color',\n value: '#000',\n kind: 'ref',\n id: '1',\n originalValue: '{c.b}',\n referencedTokenId: 'c.b',\n },\n {\n type: 'cubicBezier',\n kind: 'static',\n value: [0, 0, 0, 1],\n originalValue: [0, 0, 0, 1],\n id: '1',\n },\n]);\n\ntype TokenDataCompositeRaw = {\n [TokenType in TokenDefinitionComposite['type']]: Simplify<\n CreateTokenData<{\n type: TokenType;\n value: Simplify<\n CreateDataValueForComposite<\n TokenDefinitionComposite<TokenType>['value']\n >\n >;\n }>\n >;\n}[TokenDefinitionComposite['type']];\n\nexport type TokenDataComposite<\n TheTokenType extends TokenDataCompositeRaw['type'] = TokenDataCompositeRaw['type'],\n> = Extract<TokenDataCompositeRaw, { type: TheTokenType }>;\n\nexport function isTokenDataComposite(\n tokenData: TokenData,\n): tokenData is TokenDataComposite {\n return isTokenTypeComposite(tokenData.type);\n}\n\nexpectType<TokenDataComposite[]>([\n {\n type: 'border',\n kind: 'static',\n id: '1',\n value: {\n color: '#000',\n style: 'solid',\n width: '1px',\n },\n originalValue: {\n color: '#000',\n style: 'solid',\n width: '1px',\n },\n },\n {\n type: 'border',\n kind: 'ref',\n referencedTokenId: 'a.b',\n id: '1',\n value: {\n color: 'red',\n style: 'dashed',\n width: '2px',\n },\n originalValue: '{a.b}',\n },\n {\n type: 'shadow',\n value: {\n color: '#000',\n offsetX: '1px',\n offsetY: '1px',\n blur: '1px',\n spread: '1px',\n inset: false,\n },\n originalValue: {\n color: '#000',\n offsetX: '{a.a}',\n offsetY: '1px',\n blur: '1px',\n spread: '1px',\n inset: false,\n },\n id: '1',\n kind: 'static',\n },\n {\n type: 'shadow',\n kind: 'ref',\n referencedTokenId: 'a.b',\n value: {\n inset: true,\n color: 'red',\n offsetX: '1px',\n blur: '2px',\n offsetY: '3px',\n spread: '4px',\n },\n originalValue: '{a.b}',\n id: '1',\n },\n {\n type: 'transition',\n value: {\n duration: '100ms',\n delay: '200ms',\n timingFunction: [0, 0, 0, 0],\n },\n originalValue: '{a.b}',\n kind: 'ref',\n referencedTokenId: 'a.b',\n id: '1',\n },\n {\n type: 'transition',\n kind: 'static',\n value: {\n duration: '100ms',\n delay: '200ms',\n timingFunction: [0, 0, 0, 0],\n },\n originalValue: {\n duration: '100ms',\n delay: '{a.c}',\n timingFunction: '{a.c}',\n },\n id: '1',\n },\n {\n type: 'transition',\n kind: 'static',\n value: {\n duration: '100ms',\n delay: '200ms',\n timingFunction: [0, 0, 0, 0],\n },\n originalValue: {\n duration: '100ms',\n delay: '200ms',\n timingFunction: [0, 0, 0, 0],\n },\n id: '1',\n },\n]);\n\nexport type TokenData<\n TheTokenType extends TokenDataSingular['type'] | TokenDataComposite['type'] =\n | TokenDataSingular['type']\n | TokenDataComposite['type'],\n> = Extract<TokenDataSingular | TokenDataComposite, { type: TheTokenType }>;\n\nexport type TokenGroupData = Simplify<\n {\n type?: TokenType;\n /**\n * Extracted from `$extensions['cloud.knapsack'].group`\n */\n groupConfig?: TokenKsExtensions['group'];\n children: TokenOrder;\n } & TokenDataBothCommon\n>;\n\n/**\n * @deprecated Use `TokenValueColorStruct` instead\n */\nexport function isTokenValueColor(\n value: unknown,\n): value is TokenDefinitionSingular<'color'>['value'] {\n return typeof value === 'string' && !hasTokenReferences(value);\n}\n\nexport const TokenValueColorStruct = s.define<TokenData<'color'>['value']>(\n 'Color Value',\n (value) => {\n if (typeof value !== 'string') {\n return 'Value must be a string';\n }\n if (value === '') {\n return 'Value must not be empty';\n }\n if (hasTokenReferences(value)) {\n return 'Value must not contain {} (token references)';\n }\n return true;\n },\n);\n\nconst TokenDataColorNonRefStruct: s.Describe<\n Extract<TokenData<'color'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('color'),\n value: TokenValueColorStruct,\n kind: s.literal('static'),\n originalValue: TokenValueColorStruct,\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataColorRefStruct: s.Describe<\n Extract<TokenData<'color'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('color'),\n value: TokenValueColorStruct,\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\n/**\n * @deprecated Use `TokenValueDimensionStruct` instead\n */\nexport function isTokenValueDimension(\n value: unknown,\n): value is TokenDefinitionSingular<'dimension'>['value'] {\n return (\n typeof value === 'string' &&\n (value.endsWith('px') || value.endsWith('rem')) &&\n !hasTokenReferences(value)\n );\n}\n\nexport const TokenValueDimensionStruct = s.define<\n TokenData<'dimension'>['value']\n>('Dimension Value', (value) => {\n if (typeof value !== 'string') {\n return 'Value must be a string';\n }\n if (hasTokenReferences(value)) {\n return 'Value must not contain {} (token references)';\n }\n if (\n !value.endsWith('px') &&\n !value.endsWith('rem') &&\n !value.endsWith('em') &&\n !value.endsWith('%')\n ) {\n return 'Value must end with px, rem, em or %';\n }\n return true;\n});\n\nconst TokenDataDimensionNonRefStruct: s.Describe<\n Extract<TokenData<'dimension'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('dimension'),\n value: TokenValueDimensionStruct,\n kind: s.literal('static'),\n originalValue: TokenValueDimensionStruct,\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataDimensionRefStruct: s.Describe<\n Extract<TokenData<'dimension'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('dimension'),\n value: TokenValueDimensionStruct,\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\n/**\n * @deprecated Use `TokenValueDurationStruct` instead\n */\nexport function isTokenValueDuration(\n value: unknown,\n): value is TokenDefinitionSingular<'duration'>['value'] {\n return (\n typeof value === 'string' &&\n value.endsWith('ms') &&\n !hasTokenReferences(value)\n );\n}\n\nexport const TokenValueDurationStruct = s.define<\n TokenData<'duration'>['value']\n>('Duration Value', (value) => {\n if (typeof value !== 'string') {\n return 'Value must be a string';\n }\n if (hasTokenReferences(value)) {\n return 'Value must not contain {} (token references)';\n }\n\n const durationRegex = /^\\d+ms$/;\n if (!durationRegex.test(value)) {\n return 'Value must be a number followed by \"ms\" (e.g., \"100ms\")';\n }\n\n return true;\n});\n\nconst TokenDataDurationNonRefStruct: s.Describe<\n Extract<TokenData<'duration'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('duration'),\n value: TokenValueDurationStruct,\n kind: s.literal('static'),\n originalValue: TokenValueDurationStruct,\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataDurationRefStruct: s.Describe<\n Extract<TokenData<'duration'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('duration'),\n value: TokenValueDurationStruct,\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\n/**\n * @deprecated Use `TokenValueFontWeightStruct` instead\n */\nexport function isTokenValueFontWeight(\n value: unknown,\n): value is TokenDefinitionSingular<'fontWeight'>['value'] {\n return (\n (typeof value === 'string' || typeof value === 'number') &&\n !hasTokenReferences(value)\n );\n}\n\nexport const TokenValueFontWeightStruct = s.define<\n TokenData<'fontWeight'>['value']\n>('Font Weight Value', (value) => {\n if (typeof value !== 'string' && typeof value !== 'number') {\n return 'Value must be a string or number';\n }\n if (hasTokenReferences(value)) {\n return 'Value must not contain {} (token references)';\n }\n return true;\n});\n\nconst TokenDataFontWeightNonRefStruct: s.Describe<\n Extract<TokenData<'fontWeight'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('fontWeight'),\n value: TokenValueFontWeightStruct,\n kind: s.literal('static'),\n originalValue: TokenValueFontWeightStruct,\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataFontWeightRefStruct: s.Describe<\n Extract<TokenData<'fontWeight'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('fontWeight'),\n value: TokenValueFontWeightStruct,\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\nexport const TokenValueCubicBezierStruct = s.define<\n TokenData<'cubicBezier'>['value']\n>('Cubic Bezier Value', (value) => {\n if (!Array.isArray(value)) {\n return 'Value must be an array';\n }\n if (value.length !== 4) {\n return 'Value must be an array of 4 numbers';\n }\n if (!value.every((v) => typeof v === 'number')) {\n return 'Value must be an array of 4 numbers';\n }\n // check if the first and third values are between 0 and 1\n // cubic-bezier( <number [0,1]> , <number> , <number [0,1]> , <number> )\n if (value[0] < 0 || value[0] > 1 || value[2] < 0 || value[2] > 1) {\n return 'The first and third cubicBezier values must be between 0 and 1';\n }\n return true;\n});\n\nconst TokenDataCubicBezierNonRefStruct: s.Describe<\n Extract<TokenData<'cubicBezier'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('cubicBezier'),\n value: TokenValueCubicBezierStruct,\n kind: s.literal('static'),\n originalValue: TokenValueCubicBezierStruct,\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataCubicBezierRefStruct: s.Describe<\n Extract<TokenData<'cubicBezier'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('cubicBezier'),\n value: TokenValueCubicBezierStruct,\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\n/**\n * Determines if it's a \"shadow\" token value AND totally de-referenced\n */\nexport function isTokenValueShadow(\n value: unknown,\n): value is Simplify<\n CreateDataValueForComposite<TokenDefinitionComposite<'shadow'>['value']>\n> {\n return (\n isObject(value) &&\n isTokenValueColor(value.color) &&\n isTokenValueDimension(value.offsetX) &&\n isTokenValueDimension(value.offsetY) &&\n isTokenValueDimension(value.blur) &&\n isTokenValueDimension(value.spread)\n );\n}\n\nconst TokenValueShadowStruct = s.define<TokenData<'shadow'>['value']>(\n 'Shadow Value',\n (value) => {\n if (isTokenValueShadow(value)) return true;\n return `Expected a shadow value, got ${JSON.stringify(value)}`;\n },\n);\n\nconst TokenDataShadowNonRefStruct: s.Describe<\n Extract<TokenData<'shadow'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('shadow'),\n value: TokenValueShadowStruct,\n kind: s.literal('static'),\n originalValue: s.type({\n color: s.union([TokenValueColorStruct, TokenReferenceStruct]),\n offsetX: s.union([TokenValueDimensionStruct, TokenReferenceStruct]),\n offsetY: s.union([TokenValueDimensionStruct, TokenReferenceStruct]),\n blur: s.union([TokenValueDimensionStruct, TokenReferenceStruct]),\n spread: s.union([TokenValueDimensionStruct, TokenReferenceStruct]),\n inset: s.union([\n // marking this as optional b/c it could be `undefined` instead of `false`\n s.optional(s.boolean()),\n TokenReferenceStruct,\n ]),\n }),\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataShadowRefStruct: s.Describe<\n Extract<TokenData<'shadow'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('shadow'),\n value: TokenValueShadowStruct,\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\nexport const TokenValueStrokeStyleStruct = s.union([\n s.literal('solid'),\n s.literal('dashed'),\n s.literal('dotted'),\n s.literal('double'),\n s.literal('groove'),\n s.literal('ridge'),\n s.literal('outset'),\n s.literal('inset'),\n]);\n\n/**\n * Determines if it's a \"border\" token value AND totally de-referenced\n */\nexport function isTokenValueBorder(\n value: unknown,\n): value is Simplify<\n CreateDataValueForComposite<TokenDefinitionComposite<'border'>['value']>\n> {\n return (\n isObject(value) &&\n TokenValueColorStruct.is(value.color) &&\n TokenValueStrokeStyleStruct.is(value.style) &&\n TokenValueDimensionStruct.is(value.width)\n );\n}\n\nconst TokenValueBorderStruct = s.define<TokenData<'border'>['value']>(\n 'Border Value',\n isTokenValueBorder,\n);\n\nconst TokenDataBorderNonRefStruct: s.Describe<\n Extract<TokenData<'border'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('border'),\n value: TokenValueBorderStruct,\n kind: s.literal('static'),\n originalValue: s.type({\n color: s.union([TokenValueColorStruct, TokenReferenceStruct]),\n style: s.union([TokenValueStrokeStyleStruct, TokenReferenceStruct]),\n width: s.union([TokenValueDimensionStruct, TokenReferenceStruct]),\n }),\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataBorderRefStruct: s.Describe<\n Extract<TokenData<'border'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('border'),\n value: TokenValueBorderStruct,\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\n/**\n * Determines if it's a \"transition\" token value AND totally de-referenced\n */\nexport function isTokenValueTransition(\n value: unknown,\n): value is Simplify<\n CreateDataValueForComposite<TokenDefinitionComposite<'transition'>['value']>\n> {\n return (\n isObject(value) &&\n TokenValueCubicBezierStruct.is(value.timingFunction) &&\n TokenValueDurationStruct.is(value.duration) &&\n TokenValueDurationStruct.is(value.delay)\n );\n}\nconst TokenValueTransitionStruct = s.define<TokenData<'transition'>['value']>(\n 'Transition Value',\n isTokenValueTransition,\n);\n\nconst TokenDataTransitionNonRefStruct: s.Describe<\n Extract<TokenData<'transition'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('transition'),\n value: TokenValueTransitionStruct,\n kind: s.literal('static'),\n originalValue: s.type({\n timingFunction: s.union([\n TokenValueCubicBezierStruct,\n TokenReferenceStruct,\n ]),\n duration: s.union([TokenValueDurationStruct, TokenReferenceStruct]),\n delay: s.union([TokenValueDurationStruct, TokenReferenceStruct]),\n }),\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataTransitionRefStruct: s.Describe<\n Extract<TokenData<'transition'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('transition'),\n value: TokenValueTransitionStruct,\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataStringNonRefStruct: s.Describe<\n Extract<TokenData<'string'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('string'),\n value: s.string(),\n kind: s.literal('static'),\n originalValue: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataStringRefStruct: s.Describe<\n Extract<TokenData<'string'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('string'),\n value: s.string(),\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataStrokeStyleNonRefStruct: s.Describe<\n Extract<TokenData<'strokeStyle'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('strokeStyle'),\n value: TokenValueStrokeStyleStruct,\n kind: s.literal('static'),\n originalValue: TokenValueStrokeStyleStruct,\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataStrokeStyleRefStruct: s.Describe<\n Extract<TokenData<'strokeStyle'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('strokeStyle'),\n value: TokenValueStrokeStyleStruct,\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: TokenValueStrokeStyleStruct,\n }),\n TokenDataBaseStruct,\n);\n// const TokenDataFontFamilyNonRefStruct: s.Describe<\n// Extract<TokenData<'fontFamily'>, { kind: 'static' }>\n// > = s.assign(\n// s.type({\n// type: s.literal('fontFamily'),\n// value: s.union([s.string(), s.array(s.string())]),\n// kind: s.literal('static'),\n// originalValue: s.union([s.string(), s.array(s.string())]),\n// }),\n// TokenDataBaseStruct,\n// );\n\n// const TokenDataFontFamilyRefStruct: s.Describe<\n// Extract<TokenData<'fontFamily'>, { kind: 'ref' }>\n// > = s.assign(\n// s.type({\n// type: s.literal('fontFamily'),\n// value: s.union([s.string(), s.array(s.string())]),\n// kind: s.literal('ref'),\n// originalValue: TokenReferenceStruct,\n// referencedTokenId: s.string(),\n// }),\n// TokenDataBaseStruct,\n// );\n\nconst TokenDataNumberNonRefStruct: s.Describe<\n Extract<TokenData<'number'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('number'),\n value: s.number(),\n kind: s.literal('static'),\n originalValue: s.number(),\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataNumberRefStruct: s.Describe<\n Extract<TokenData<'number'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('number'),\n value: s.number(),\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataBooleanNonRefStruct: s.Describe<\n Extract<TokenData<'boolean'>, { kind: 'static' }>\n> = s.assign(\n s.type({\n type: s.literal('boolean'),\n value: s.boolean(),\n kind: s.literal('static'),\n originalValue: s.boolean(),\n }),\n TokenDataBaseStruct,\n);\n\nconst TokenDataBooleanRefStruct: s.Describe<\n Extract<TokenData<'boolean'>, { kind: 'ref' }>\n> = s.assign(\n s.type({\n type: s.literal('boolean'),\n value: s.boolean(),\n kind: s.literal('ref'),\n originalValue: TokenReferenceStruct,\n referencedTokenId: s.string(),\n }),\n TokenDataBaseStruct,\n);\n\n// Instead of using `s.union` to combine all the token data structs,\n// we first find out what \"type\" the token is\n// then we find out `kind` - which is our 2nd layer of discriminated union\n// and then use the specific struct\n// that way the errors are more specific to the actual declared token \"type\"\n// In a nutshell, `s.union` is not very good at discriminated unions errors\nexport const assertTokenData = (data: unknown): asserts data is TokenData => {\n if (!isObject(data)) {\n throw new Error(\n `Expected token data to be an object, got ${JSON.stringify(data)}`,\n );\n }\n if (!isObjKey('type', data)) {\n throw new Error(\n `Expected token data to have a \"type\" property, got ${JSON.stringify(\n data,\n )}`,\n );\n }\n if (typeof data.type !== 'string') {\n throw new Error(\n `Expected token data \"type\" property to be a string, got ${JSON.stringify(\n data,\n )}`,\n );\n }\n const type = data.type as TokenData['type'];\n const kind = data.kind as TokenData['kind'];\n try {\n switch (type) {\n case 'boolean':\n if (kind === 'ref') {\n TokenDataBooleanRefStruct.assert(data);\n } else {\n TokenDataBooleanNonRefStruct.assert(data);\n }\n return;\n case 'border':\n if (kind === 'ref') {\n TokenDataBorderRefStruct.assert(data);\n } else {\n TokenDataBorderNonRefStruct.assert(data);\n }\n return;\n case 'color':\n if (kind === 'ref') {\n TokenDataColorRefStruct.assert(data);\n } else {\n TokenDataColorNonRefStruct.assert(data);\n }\n return;\n case 'cubicBezier':\n if (kind === 'ref') {\n TokenDataCubicBezierRefStruct.assert(data);\n } else {\n TokenDataCubicBezierNonRefStruct.assert(data);\n }\n return;\n case 'dimension':\n if (kind === 'ref') {\n TokenDataDimensionRefStruct.assert(data);\n } else {\n TokenDataDimensionNonRefStruct.assert(data);\n }\n return;\n case 'duration':\n if (kind === 'ref') {\n TokenDataDurationRefStruct.assert(data);\n } else {\n TokenDataDurationNonRefStruct.assert(data);\n }\n return;\n case 'fontWeight':\n if (kind === 'ref') {\n TokenDataFontWeightRefStruct.assert(data);\n } else {\n TokenDataFontWeightNonRefStruct.assert(data);\n }\n return;\n case 'number':\n if (kind === 'ref') {\n TokenDataNumberRefStruct.assert(data);\n } else {\n TokenDataNumberNonRefStruct.assert(data);\n }\n return;\n case 'shadow':\n if (kind === 'ref') {\n TokenDataShadowRefStruct.assert(data);\n } else {\n TokenDataShadowNonRefStruct.assert(data);\n }\n return;\n case 'string':\n if (kind === 'ref') {\n TokenDataStringRefStruct.assert(data);\n } else {\n TokenDataStringNonRefStruct.assert(data);\n }\n return;\n case 'strokeStyle': // temp implementation\n if (kind === 'ref') {\n TokenDataStrokeStyleRefStruct.assert(data);\n } else {\n TokenDataStrokeStyleNonRefStruct.assert(data);\n }\n return;\n // case 'fontFamily':\n // if (kind === 'ref') {\n // TokenDataFontFamilyRefStruct.assert(data);\n // } else {\n // TokenDataFontFamilyNonRefStruct.assert(data);\n // }\n // return;\n case 'transition':\n if (kind === 'ref') {\n TokenDataTransitionRefStruct.assert(data);\n } else {\n TokenDataTransitionNonRefStruct.assert(data);\n }\n return;\n default: {\n const _exhaustiveCheck: never = type;\n throw new Error(`Unknown token data type: ${type}`);\n }\n }\n } catch (error) {\n if (!(error instanceof s.StructError)) throw error;\n throw new Error(\n `Invalid token data for type \"${type}\": ${\n error.message\n }. Received this data: \"${JSON.stringify(data)}\"`,\n );\n }\n};\n","import { Simplify, expectType } from '@knapsack/utils';\nimport {\n TokenType,\n TokenDefinitionSingular,\n TokenDefinitionComposite,\n isTokenTypeComposite,\n isTokenTypeSingular,\n} from './token-definitions';\n\ntype CreateTokenSrcValueInfo<\n T extends {\n type: TokenType;\n value: unknown;\n },\n> =\n | {\n kind: 'ref';\n /** Has `{}` removed */\n referencedTokenId: string;\n isVarRef?: boolean;\n type: T['type'];\n }\n | {\n kind: 'static';\n type: T['type'];\n value: T['value'];\n };\n\ntype TokenSrcValueInfoSingularRaw = {\n // Ignore the key, pay attention to the value\n // The values become the items in the discriminated union\n [TheTokenType in TokenDefinitionSingular as TheTokenType['type']]: Simplify<\n CreateTokenSrcValueInfo<TheTokenType>\n >;\n}[TokenDefinitionSingular['type']];\n\n// This helper allows us to just pass the type string in to get that\n// item out of the discriminated union: `TokenSrcValueInfoSingular<'color'>`\ntype TokenSrcValueInfoSingular<\n TT extends TokenSrcValueInfoSingularRaw['type'] = TokenSrcValueInfoSingularRaw['type'],\n> = Extract<TokenSrcValueInfoSingularRaw, { type: TT }>;\n\nexpectType<TokenSrcValueInfoSingular<'dimension'>[]>([\n {\n type: 'dimension',\n kind: 'static',\n value: '1px',\n },\n {\n type: 'dimension',\n kind: 'ref',\n referencedTokenId: 'a.b',\n },\n]);\n\ntype CreateSrcValueInfoForComposite<\n ValueObj extends Record<string, { type: TokenDefinitionSingular['type'] }>,\n> = {\n [Key in keyof ValueObj]: Simplify<\n CreateTokenSrcValueInfo<{\n type: ValueObj[Key]['type'];\n value: TokenDefinitionSingular<ValueObj[Key]['type']>['value'];\n }>\n >;\n};\n\ntype TokenSrcValueInfoCompositeRaw = {\n [TheTokenType in TokenDefinitionComposite['type']]: Simplify<\n CreateTokenSrcValueInfo<{\n type: TheTokenType;\n value: Simplify<\n CreateSrcValueInfoForComposite<\n TokenDefinitionComposite<TheTokenType>['value']\n >\n >;\n }>\n >;\n}[TokenDefinitionComposite['type']];\n\ntype TokenSrcValueInfoComposite<\n TT extends TokenSrcValueInfoCompositeRaw['type'] = TokenSrcValueInfoCompositeRaw['type'],\n> = Extract<TokenSrcValueInfoCompositeRaw, { type: TT }>;\n\nexpectType<TokenSrcValueInfoComposite<'border'>[]>([\n {\n type: 'border',\n kind: 'ref',\n referencedTokenId: 'a.b',\n },\n {\n type: 'border',\n kind: 'static',\n value: {\n color: {\n kind: 'static',\n type: 'color',\n value: 'red',\n },\n style: {\n kind: 'ref',\n type: 'strokeStyle',\n referencedTokenId: '', // FIX\n },\n width: {\n kind: 'static',\n type: 'dimension',\n value: '2px',\n },\n },\n },\n]);\n\nexpectType<TokenSrcValueInfoComposite<'transition'>[]>([\n {\n type: 'transition',\n kind: 'ref',\n referencedTokenId: 'a.b',\n },\n {\n type: 'transition',\n kind: 'static',\n value: {\n delay: {\n kind: 'static',\n type: 'duration',\n value: '1ms',\n },\n duration: {\n kind: 'ref',\n type: 'duration',\n referencedTokenId: 'animation.slow',\n },\n timingFunction: {\n kind: 'static',\n type: 'cubicBezier',\n value: [0.4, 0.0, 0.2, 1],\n },\n },\n },\n]);\n\nexport type TokenSrcValueInfo<\n TT extends\n | TokenSrcValueInfoComposite['type']\n | TokenSrcValueInfoSingular['type'] =\n | TokenSrcValueInfoComposite['type']\n | TokenSrcValueInfoSingular['type'],\n TheKind extends\n | TokenSrcValueInfoComposite['kind']\n | TokenSrcValueInfoSingular['kind'] =\n | TokenSrcValueInfoComposite['kind']\n | TokenSrcValueInfoSingular['kind'],\n> = Extract<\n TokenSrcValueInfoComposite | TokenSrcValueInfoSingular,\n { type: TT; kind: TheKind }\n>;\n\nexport function isTokenSrcValueInfoSingular(\n tokenSrcValueInfo: TokenSrcValueInfo,\n): tokenSrcValueInfo is TokenSrcValueInfoSingular {\n return isTokenTypeSingular(tokenSrcValueInfo?.type);\n}\nexport function isTokenSrcValueInfoComposite(\n tokenSrcValueInfo: TokenSrcValueInfo,\n): tokenSrcValueInfo is TokenSrcValueInfoComposite {\n return isTokenTypeComposite(tokenSrcValueInfo?.type);\n}\n\nexpectType<TokenSrcValueInfo[]>([\n {\n type: 'dimension',\n kind: 'static',\n value: '1px',\n },\n {\n type: 'transition',\n kind: 'ref',\n referencedTokenId: 'a.b',\n },\n {\n type: 'transition',\n kind: 'ref',\n // @ts-expect-error - with `kind: 'ref'`, `value` is not allowed\n value: '1px',\n },\n {\n kind: 'ref',\n type: 'duration',\n referencedTokenId: 'animation.slow',\n },\n {\n kind: 'static',\n type: 'cubicBezier',\n value: [0.4, 0.0, 0.2, 1],\n },\n {\n type: 'transition',\n kind: 'static',\n value: {\n delay: {\n kind: 'static',\n type: 'duration',\n value: '1ms',\n },\n duration: {\n kind: 'ref',\n type: 'duration',\n referencedTokenId: 'animation.slow',\n },\n timingFunction: {\n kind: 'static',\n type: 'cubicBezier',\n value: [0.4, 0.0, 0.2, 1],\n },\n },\n },\n]);\n\n/**\n * A common object that is used to represent a token in the app.\n * Used in functions for editing communication between UI forms, Xstate,\n * and `@knapsack/design-tokens-utils`.\n */\nexport type TokenInfo<\n TheTokenType extends TokenSrcValueInfo['type'] = TokenSrcValueInfo['type'],\n> = {\n tokenSrcValueInfo: TokenSrcValueInfo<TheTokenType>;\n tokenId: string;\n description?: string;\n};\n","import { Simplify, expectType, isObjKey, isObject } from '@knapsack/utils';\nimport {\n TokenDefinitionComposite,\n TokenDefinitionSingular,\n TokenReference,\n TokenType,\n TokenDefinition,\n} from './token-definitions';\nimport { TokenKsExtensions } from './token-misc';\n\nexport type TokenSrcCommon<TheType extends TokenType = TokenType> = {\n $type?: TokenDefinition<TheType>['type'];\n $description?: string;\n $extensions?: {\n 'cloud.knapsack'?: TokenKsExtensions;\n };\n};\n\nexport function isTokenSrcExtensions(\n extensionsObj: unknown,\n): extensionsObj is TokenSrcCommon['$extensions'] {\n return isObject(extensionsObj) && isObjKey('cloud.knapsack', extensionsObj);\n}\n\ntype CreateSrcValueForComposite<\n ValueObj extends Record<string, { type: TokenDefinitionSingular['type'] }>,\n> = {\n [Key in keyof ValueObj]:\n | TokenReference\n | TokenDefinitionSingular<ValueObj[Key]['type']>['value'];\n};\n\ntype TokenSrcValueCompositeRaw = {\n [TheTokenType in TokenDefinitionComposite['type']]: Simplify<{\n type: TheTokenType;\n value: Simplify<\n CreateSrcValueForComposite<\n TokenDefinitionComposite<TheTokenType>['value']\n >\n >;\n }>;\n}[TokenDefinitionComposite['type']];\n\ntype TokenSrcValueComposite<\n TT extends TokenSrcValueCompositeRaw['type'] = TokenSrcValueCompositeRaw['type'],\n> = Extract<TokenSrcValueCompositeRaw, { type: TT }>;\n\ntype TokenSrcValueRaw = TokenDefinitionSingular | TokenSrcValueComposite;\n\nexport type TokenSrcValue<\n Type extends\n | TokenDefinitionSingular['type']\n | TokenSrcValueComposite['type'] =\n | TokenDefinitionSingular['type']\n | TokenSrcValueComposite['type'],\n> = Extract<TokenSrcValueRaw, { type: Type }>['value'] | TokenReference;\n\nexpectType<TokenSrcValue[]>([\n '#ddd',\n true,\n [83, 1, 1, 1],\n {\n color: '#000',\n style: 'solid',\n width: '1px',\n },\n {\n inset: true,\n color: '#000',\n offsetX: '0px',\n offsetY: '{spacing.medium}',\n spread: '0px',\n blur: '0px',\n },\n {\n timingFunction: '{timing.ease}',\n duration: '{timing.duration.medium}',\n delay: '7ms',\n color: '#000',\n },\n]);\n\nexport type TokenSrc<\n TheType extends\n | TokenDefinitionSingular['type']\n | TokenSrcValueComposite['type'] =\n | TokenDefinitionSingular['type']\n | TokenSrcValueComposite['type'],\n> = Simplify<\n {\n $value: TokenSrcValue<TheType>;\n } & TokenSrcCommon<TheType>\n>;\n\nexport function isTokenSrc(tokenObject: unknown): tokenObject is TokenSrc {\n if (isObject(tokenObject) && isObjKey('$value', tokenObject)) return true;\n return false;\n}\n\nexport type TokenSrcGroup = TokenSrcCommon & {\n [key: string]:\n | TokenSrcGroup\n | TokenSrc\n | TokenSrcCommon\n | TokenSrcCommon['$extensions'];\n};\n\nexport function isTokenGroup(\n tokenObject: unknown,\n): tokenObject is TokenSrcGroup {\n // @todo improve\n return (\n isObject(tokenObject) &&\n !isTokenSrcExtensions(tokenObject) &&\n !isObjKey('$value', tokenObject) &&\n // ensuring we are not in `$extensions` object\n !isObjKey('cloud.knapsack', tokenObject)\n );\n}\n\n// Token VAR references look like TokenSrcGroup\nexport function isTokenTypeVarRef(tokenObject: unknown) {\n // It's at least a TokenSrcGroup\n if (isTokenGroup(tokenObject)) {\n // The specific key within collectionInfo with the var reference\n const varRefCollectionInfo =\n tokenObject.$extensions['cloud.knapsack'].group.collectionInfo;\n if (\n isObjKey('type', varRefCollectionInfo) &&\n isObjKey('referenceId', varRefCollectionInfo)\n ) {\n return true;\n }\n }\n\n return false;\n}\n","import { parseNumberWithUnit } from '@knapsack/utils';\n\nexport function getPrimitiveValue(\n tokenValue: unknown,\n): 'string' | 'number' | 'boolean' {\n const type = typeof tokenValue;\n if (type === 'string' || type === 'number' || type === 'boolean') {\n return type;\n }\n throw new Error(\n `Invalid token value type: ${JSON.stringify(\n type,\n )}. Token value is: ${JSON.stringify(tokenValue)}`,\n );\n}\n\nexport type TokenDimensionUnit = 'px' | 'rem' | 'em' | '%';\n\n/**\n * Dimension strings require ending in 'px' or 'rem'\n * @see `libs/types/src/app-client-data/design-tokens-types/token-definitions.ts`\n */\nexport const isDimensionString = (\n value: string,\n): value is `${number}${'px' | 'rem' | 'em' | '%'}` =>\n value.includes('px') ||\n value.includes('rem') ||\n value.includes('em') ||\n value.includes('%');\n\n/**\n * Pass in values like `'12px'` to get detailed info\n * @throws if value is not a number or does not end in supported unit\n */\nexport function parseTokenDimensionValue(valueToParse: string | number): {\n value: number;\n unit?: TokenDimensionUnit;\n} {\n const { value, unit } = parseNumberWithUnit(valueToParse);\n if (!unit) {\n return { value };\n }\n if (unit !== 'px' && unit !== 'rem' && unit !== 'em' && unit !== '%') {\n throw new Error(`Invalid unit \"${unit}\" for value: ${value}`);\n }\n\n return { value, unit };\n}\n","import type { CSSProperties } from 'react';\nimport type { JsonSchemaObject } from '../json-schema';\nimport type { RendererId, TemplateInfo } from '../renderers';\nimport type { BlockConfig } from './blocks';\nimport type { ContentMeta, Folder, KnapsackImage } from '../misc';\nimport type { Page } from './page';\nimport type { PatternTab } from './tabs';\nimport type { TokenSrcValueInfo } from './design-tokens-types/token-src-value-info';\n\nexport interface KsStatus {\n id: string;\n title: string;\n color?: string;\n}\n\nexport interface KsStatusSet {\n id: string;\n title: string;\n statuses: KsStatus[];\n}\n\n/**\n * Used by template renderers in addition to `path`\n * Twig: `@components/button.twig`\n * Web Components: `my-button` => `<my-button>`\n * React: a named export of the file if not `default`\n * @todo Replace this with {@link TemplateInfo}\n */\ntype TemplateAlias = string;\n\nexport type SlottedTemplateDemo = {\n type: 'template-demo';\n /**\n * The demo referenced by `demoId` is inlined here before sending to server to\n * render, but is never stored in the json data. If this is present, it is\n * used instead of the demo referenced by `demoId`. This is done to ensure\n * server has all the latest data for a template demo by ensuring it includes\n * it's slotted children's data.\n * @see {inlineDemoData}\n */\n demo?: DemoWithData;\n /**\n * ID will be to demo that must be {@link DemoWithData}\n */\n demoId: DemoWithData['id'];\n};\n\n/**\n * i.e. Given a React Component, `Button`, this set to null/false would be\n * `<Button>` and set to true it would just be a reference to it: `Button`\n * @see {KsSlotInfo['isTemplateReference']}\n */\nexport type SlottedTemplateReference = {\n type: 'template-reference';\n patternId: string;\n templateId: string;\n};\n\nexport type SlottedText = {\n type: 'text';\n text: string;\n};\n\nexport type SlottedData =\n | SlottedText\n | SlottedTemplateDemo\n | SlottedTemplateReference;\n\n/**\n * Collection ID: Mode ID\n */\nexport type ThemeDefinition = {\n [collectionId: string]: string;\n};\n\nexport type SlotOptions = {\n /**\n * @default 'div'\n */\n wrappingElementName?: string;\n cssClasses?: string[];\n align?: {\n value:\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'left'\n | 'center'\n | 'right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n };\n layout?: {\n value: 'horizontal' | 'vertical' | 'wrap';\n };\n gap?: {\n value: TokenSrcValueInfo<'dimension'>;\n };\n paddingHorizontal?: {\n value: TokenSrcValueInfo<'dimension'>[];\n };\n paddingVertical?: {\n value: TokenSrcValueInfo<'dimension'>[];\n };\n /**\n * Collection ID: Mode ID\n */\n theme?: ThemeDefinition;\n};\n\n/**\n * These are created from {SlotOptions}\n * Only available in App Client for rendering - this is NOT saved in App Client Data\n */\nexport type SlotOptionsComputed = {\n styles: CSSProperties;\n cssClasses: string[];\n /**\n * @default 'div'\n */\n wrappingElementName: string;\n /**\n * can't be `style` or `class` or `className`\n */\n attributes: {\n [attributeName: string]: string;\n };\n};\n\nexport type KnapsackTemplateData = {\n /**\n * @todo Ideal would be `{ [key: string]: string | boolean | number }`\n */\n props: {\n [prop: string]: unknown;\n };\n slots?: {\n [slotName: string]: Array<SlottedData>;\n };\n /**\n * Settings from users are stored here and saved in App Client Data\n * This is used to dynamically create `slotsOptionsComputed`\n */\n slotsOptions?: {\n [slotName: string]: SlotOptions;\n };\n /**\n * Use `slotsOptions` to set & save styles on slotted children\n * Never set nor stored in App Client Data that gets saved\n * This is only inlined in the demo data for rendering so the App Client can\n * apply the styles to the slotted children\n * @see {inlineDemoData}\n */\n slotsOptionsComputed?: {\n [slotName: string]: SlotOptionsComputed;\n };\n};\n\ntype DemoBase = {\n id: string;\n title: string;\n description?: string;\n /**\n * Would override what was on the template\n */\n assetSetId?: string;\n width?: number;\n height?: number;\n /** Collection ID: Mode ID */\n theme?: ThemeDefinition;\n meta: ContentMeta;\n};\n\n/**\n * A {@link Demo} that has data from a form and a template to render\n * Uses `patternId` & `templateId` to find the template to render\n * @see {@link TemplateDemo}\n * @see {@link DataDemoWithTemplateInfo}\n */\nexport type DataDemo = DemoBase & {\n type: 'data';\n patternId: string;\n templateId: string;\n data: KnapsackTemplateData;\n};\n\n/**\n * A {@link Demo} that shows source code from a rendered template that is passed no data\n * @see {@link DataDemo}\n * @see {@link DataDemoWithTemplateInfo}\n */\nexport type TemplateDemo = DemoBase & {\n type: 'template';\n templateInfo: {\n alias?: TemplateAlias;\n path?: string;\n };\n};\n\n/**\n * A {@link Demo} that has data from a form and a template to render\n * Similar to {@link DataDemo} but instead of using `patternId` & `templateId`\n * it uses `templateInfo` which is {@link TemplateInfo} and contains renderer specific information\n * for finding things like package path & named export (which `patternId` & `templateId` were used to find)\n * @see {@link DataDemo}\n * @see {@link TemplateDemo}\n */\nexport type DataDemoWithTemplateInfo = DemoBase & {\n type: 'data-w-template-info';\n templateInfo: TemplateInfo;\n data: KnapsackTemplateData;\n};\n\n/**\n * A Demo that results in rendered HTML seen in iFrame Stage.\n * Can be one of:\n * - {@link DataDemo}\n * - {@link DataDemoWithTemplateInfo}\n * - {@link TemplateDemo}\n */\nexport type Demo = TemplateDemo | DataDemo | DataDemoWithTemplateInfo;\n\n/**\n * A {@link Demo} that has data from a form\n * @see {@link DataDemo}\n * @see {@link DataDemoWithTemplateInfo}\n * @see {@link isDemoWithData}\n */\nexport type DemoWithData = DataDemo | DataDemoWithTemplateInfo;\n\nexport type RenderDataDemo = Demo & {\n inlineStyles?: string;\n bodyAttributes?: Record<string, string>;\n};\n\n/**\n * Does this demo have data from the stage form?\n * Can be one of these kinds of {@link Demo} types:\n * - {@link DataDemo}\n * - {@link DataDemoWithTemplateInfo}\n */\nexport function isDemoWithData(\n demo: Demo,\n): demo is DataDemo | DataDemoWithTemplateInfo {\n return demo?.type === 'data' || demo?.type === 'data-w-template-info';\n}\n\nexport function isDataDemo(demo: Demo): demo is DataDemo {\n return demo?.type === 'data';\n}\n\nexport function isTemplateDemo(demo: Demo): demo is TemplateDemo {\n return demo?.type === 'template';\n}\n\nexport type KsSlotInfo = {\n title: string;\n description?: string;\n disallowText?: boolean;\n isRequired?: boolean;\n allowOnlyOne?: boolean;\n /**\n * i.e. Given a React Component, `Button`, this set to null/false would be\n * `<Button>` and set to true it would just be a reference to it: `Button`\n * @see {SlottedTemplateReference}\n */\n isTemplateReference?: boolean;\n allowedPatternIds?: string[];\n};\n\n/**\n * Supersedes `schema`\n */\nexport type KsTemplateSpec<\n IsInferred extends boolean | undefined = boolean | undefined,\n> = {\n /**\n * Attempt to create the props & slots spec by reading the source file.\n * Prevents ability to use spec editor.\n */\n isInferred?: IsInferred;\n /**\n * JSON Schema defining the serializable data passed in\n * The classic, formerly `schema`\n */\n props?: JsonSchemaObject;\n /**\n * Child component slots\n */\n propOrder?: string[];\n slots?: {\n [name: string]: KsSlotInfo;\n };\n slotOrder?: string[];\n /**\n * @todo evaluate & refine\n */\n // cssProps?: {\n // [name: string]: {\n // title: string;\n // description: string;\n // };\n // };\n hidePropsTable?: boolean;\n hideSlotsTable?: boolean;\n /**\n * Extra Docs are each shown in their own table.\n * Useful for non-traditional spec docs that are more template language specific.\n * Examples: events, methods, etc\n */\n extraDocs?: {\n id: string;\n title: string;\n description?: string;\n tableRows?: {\n [columnTitle: string]: string;\n }[];\n }[];\n};\n\n/**\n * Used in {@link KsSpecMeta}\n */\nexport type KsSpecPropConfig = {\n hidden?: boolean;\n};\n\n/**\n * Metadata for {@link KsTemplateSpec}\n * Kept outside of the `spec` object b/c when it's `isInferred: true` the whole object gets replaced with `{ isInferred: true }`\n */\nexport type KsSpecMeta = {\n propOrder?: string[];\n slotOrder?: string[];\n propFilters?: string[];\n propConfig?: Record<string, KsSpecPropConfig>;\n};\n\nexport interface KnapsackPatternTemplate {\n id: string;\n title?: string;\n /**\n * Relative file path to the template from the config file it is declared in\n */\n path: string;\n\n alias?: TemplateAlias;\n /**\n * Which template language? i.e. `twig`, `react` Replaces\n * KnapsackTemplateRenderer.test which ran a test on the file path (similar to\n * how WebPack loader `test` works)\n */\n templateLanguageId: RendererId;\n assetSetIds?: string[];\n spec?: { isInferred: true } | KsTemplateSpec<false | undefined>;\n specMeta?: KsSpecMeta;\n /** Array of demo IDs, actual demo data is stored in `db.demos.demosById` */\n demoIds: Demo['id'][];\n /** Array of block IDs, actual block content is stored in db.blocks.blocksById */\n blockIds: BlockConfig['id'][];\n}\n\n/**\n * Determines if a `template.spec` is not inferred and therefore has a `props` object\n * @see {@link KsTemplateSpec}\n */\nexport function isSpecNotInferred(\n spec: KnapsackPatternTemplate['spec'],\n): spec is KsTemplateSpec<false> {\n return typeof spec === 'object' && !spec.isInferred;\n}\n\nexport type KnapsackPattern = Page & {\n $schema?: string;\n statuses?: {\n [statusSetId: string]: string;\n };\n templates?: KnapsackPatternTemplate[];\n /**\n * @TODO: subPages will be deprecated in favor of tabs soon\n * */\n subPages?: {\n id: string;\n title: string;\n blockIds: BlockConfig['id'][];\n }[];\n designSrcComponentsById?: Record<\n string,\n {\n id: string;\n title: string;\n componentId: string;\n fileId: string;\n }\n >;\n /** Controls order of `templates` & `subPages` on Pattern Page */\n tabs?: PatternTab[];\n\n aliases?: string[];\n /**\n * Prevents pattern from appearing in System Overview and Status Table blocks\n */\n hideFromOverviewBlocks?: boolean;\n /**\n * Prevents pattern from appearing as an option in Component Embed and\n * Component Demo blocks\n */\n hideFromComponentBlocks?: boolean;\n hideStatusSets?: boolean;\n thumbnail?: KnapsackImage;\n demoFoldersById?: Record<string, Folder>;\n demoFoldersOrder?: Array<Folder['id']>;\n};\n\nexport interface KnapsackPatternTemplateCode {\n html: string;\n data?: Record<string, any>;\n templateSrc: string;\n usage: string;\n language: string;\n}\n\nexport type KnapsackPatternsConfig = {\n $schema?: string;\n statusSets: KsStatusSet[];\n};\n\nexport interface TemplateRendererMeta {\n id: RendererId;\n title: string;\n version?: string;\n aliasTitle?: string;\n aliasDescription?: string;\n aliasUse: 'off' | 'optional' | 'required';\n aliasIsJsNamedExport?: boolean;\n syntaxHighlightingLanguage?: string;\n enableDataDemos: boolean;\n enableTemplateDemos: boolean;\n hasSlotsSupport: boolean;\n hasSlotOptionsSupport?: boolean;\n hasTemplateImgSupport?: boolean;\n hasInferSpecSupport: boolean;\n hasTemplateSuggestionsSupport: boolean;\n prototypingTemplate?: {\n path: string;\n alias?: string;\n spec: Pick<KsTemplateSpec, 'props' | 'slots' | 'isInferred'>;\n };\n}\n\nexport type PatternsState = {\n patterns: {\n [id: string]: KnapsackPattern;\n };\n renderers: Partial<\n Record<\n RendererId,\n {\n meta: TemplateRendererMeta;\n }\n >\n >;\n} & KnapsackPatternsConfig;\n","import type { Role } from '../user-roles';\nimport type { BlockCollection } from './blocks';\n\nexport const patternTabTypes = {\n designSrc: 'Design Source',\n subPage: 'Subpage',\n template: 'Template',\n} as const;\n\n/**\n * Legacy pattern page tab that is of a certain type\n * @deprecated Use `PageTab` instead\n */\nexport type PatternTab = {\n hidden?: boolean;\n id: string;\n minRoleNeeded?: Role;\n type: keyof typeof patternTabTypes;\n};\n\n/**\n * A tab section within a page, referencing a BlockCollection as its content source.\n */\nexport type PageTab = {\n // Can be expanded into a union for future tab types\n type: 'block-collection-tab';\n id: string;\n title: string;\n /**\n * Slug for the tab. Used in URL path.\n * e.g./pages/[pageSlug]/[tabSlug]\n */\n slug: string;\n /**\n * A tab contains collection of blocks, usually only 1.\n * @see BlockCollection type\n */\n blockCollectionIds: BlockCollection['id'][]; // string[]\n /**\n * Options for the tab.\n */\n options?: {\n hidden?: boolean;\n minRoleNeeded?: Role;\n };\n};\n","import { ColorConfig } from '../color-config';\n\nexport enum PageHeaderSizes {\n auto = 'auto',\n small = 'small',\n medium = 'medium',\n large = 'large',\n full = 'full',\n}\n\nexport interface PageHeaderSettings {\n size?: `${PageHeaderSizes}`;\n backgroundImage?: string;\n backgroundColor?: ColorConfig;\n backgroundOverlay?: boolean;\n backgroundSize?: 'cover' | 'contain' | 'string';\n backgroundPosition?: 'left' | 'center' | 'right' | 'string';\n backgroundRepeat?: 'no-repeat' | 'repeat-x' | 'repeat-y' | 'repeat';\n hideText?: boolean;\n textColorTitle?: ColorConfig;\n textColorDescription?: ColorConfig;\n}\n","import {\n // type structs validate that a value has a set of properties on it, but it does not assert anything about unspecified properties. This allows you to assert that a particular set of functionality exists without a strict equality check for properties.\n type,\n string,\n Describe,\n boolean,\n optional,\n array,\n number,\n define,\n} from 'superstruct';\nimport { z } from 'zod/v4-mini';\nimport { isObjKey, isObject } from '../type-utils';\nimport type { KnapsackAssetSetsData } from './asset-sets';\nimport type { TokenSrcGroup } from './design-tokens-types';\nimport type { MetaState } from './meta';\nimport type { KnapsackNavsConfig } from './nav';\nimport type { KsFiles } from './files';\nimport type { BlockCollection, BlockConfig } from './blocks';\nimport type { KnapsackCustomPagesData } from './custom-pages';\nimport type { Demo, PatternsState } from './patterns';\nimport { UiConfig } from '../ui-config';\nimport { PagesSettings } from './page';\nimport { BlocksSettings } from './blocks.settings';\nimport { DesignSrcFile } from '../design-src.types';\nimport type {\n RendererTemplateConfig,\n TemplateInfoId,\n RendererId,\n} from '../renderers';\nimport type { PageTab } from './tabs';\n\nexport * from './asset-sets';\nexport * from './blocks';\nexport * from './custom-pages';\nexport * from './design-tokens';\nexport * from './design-tokens-types';\nexport * from './nav';\nexport * from './files';\nexport * from './meta';\nexport * from './page';\nexport * from './patterns';\nexport * from './tabs';\nexport { PageHeaderSizes } from './page.header';\nexport type { PageHeaderSettings } from './page.header';\n\nexport interface KsAppClientData {\n patternsState: PatternsState;\n customPagesState: KnapsackCustomPagesData;\n assetSetsState: KnapsackAssetSetsData;\n navsState: KnapsackNavsConfig;\n tokensSrc: TokenSrcGroup;\n metaState?: MetaState;\n filesState: KsFiles;\n db: {\n blocks: {\n byId: Record<string, BlockConfig>;\n settings: BlocksSettings;\n };\n demos: {\n byId: Record<string, Demo>;\n // \"never\" for now until there are actual settings for demos\n settings: Record<string, never>;\n };\n tabs: {\n byId: Record<string, PageTab>;\n // \"never\" for now until there are actual settings for Tabs\n settings: Record<string, never>;\n };\n blockCollections: {\n byId: Record<string, BlockCollection>;\n // \"never\" for now until there are actual settings for Block Collections\n settings: Record<string, never>;\n };\n /**\n * @see {@link createTemplateInfoId} for getting the key\n */\n templatesConfig?: Record<TemplateInfoId, RendererTemplateConfig>;\n settings: {\n title?: string;\n hideTitleInNavigation?: boolean;\n logoUrl?: string;\n favicon?: `https://${string}`;\n theme?: UiConfig;\n pages?: PagesSettings;\n patterns?: {\n hideStatusSetsOnPages?: boolean;\n };\n codeSrcs?: {\n enableInSlots?: boolean;\n };\n designSrcs?: {\n files?: DesignSrcFile[];\n hideOpenInSource?: boolean;\n };\n tokens?: {\n theming?: {\n /** Which template languages theming controls will show up for next to the components preview stage. */\n enabledRendererIds?: string[];\n /** Whether to hide the theme selector on the template stage. */\n hideThemeSelector?: boolean;\n /** Collections to hide from the theme selector. */\n hiddenCollections?: string[];\n };\n };\n prototyping?: {\n patternId: string;\n disabledRendererIds?: RendererId[];\n };\n };\n };\n}\n\nexport type KsAppClientDataNoMeta = Omit<KsAppClientData, 'metaState'>;\nexport type KsAppClientDataAndMeta = Required<KsAppClientData>;\n\nexport const emptyAppClientData: KsAppClientDataNoMeta = {\n patternsState: {\n patterns: {},\n renderers: {},\n statusSets: [],\n },\n customPagesState: {\n pages: {},\n },\n assetSetsState: {},\n navsState: {\n byId: {},\n order: [],\n },\n tokensSrc: {},\n filesState: {\n files: {},\n },\n db: {\n blocks: {\n byId: {},\n settings: {\n tokens: {\n rootFontSize: '16px',\n },\n },\n },\n demos: {\n byId: {},\n settings: {},\n },\n tabs: {\n byId: {},\n settings: {},\n },\n blockCollections: {\n byId: {},\n settings: {},\n },\n settings: {\n title: '',\n logoUrl: '',\n },\n },\n};\n\nexport function isKsAppClientDataNoMeta(\n data: unknown,\n): data is KsAppClientDataNoMeta {\n if (!isObject(data)) return false;\n // TODO: bring in exhaustive key checking here so all keys are caught\n const requiredKeys: Array<keyof KsAppClientDataNoMeta> = [\n 'assetSetsState',\n 'customPagesState',\n 'navsState',\n 'patternsState',\n 'tokensSrc',\n 'db',\n ];\n if (!requiredKeys.every((key) => isObjKey(key, data))) return false;\n if (!isObjKey('metaState', data)) return true;\n return false;\n}\n\nexport const KsAppClientDataNoMetaStruct = define<KsAppClientDataNoMeta>(\n 'KsAppClientDataNoMeta',\n isKsAppClientDataNoMeta,\n);\n\n/**\n * This is a WIP Zod schema for the App Client Data.\n * We use {@link KsAppClientDataNoMetaZod} to use the validation from this,\n * but the types from {@link KsAppClientDataNoMeta} via `z.custom()`\n */\nconst KsAppClientDataNoMetaZodWIP = z.strictObject({\n assetSetsState: z.object({}),\n customPagesState: z.object({\n pages: z.object({}),\n }),\n navsState: z.object({\n byId: z.object(),\n order: z.array(z.string()),\n }),\n patternsState: z.object({\n patterns: z.object({}),\n renderers: z.object({}),\n statusSets: z.array(z.object()),\n }),\n tokensSrc: z.object({}),\n filesState: z.object({\n files: z.object({}),\n }),\n db: z.object({\n blocks: z.object({\n byId: z.object({}),\n settings: z.object({}),\n }),\n demos: z.object({\n byId: z.object({}),\n settings: z.object({}),\n }),\n tabs: z.optional(\n z.object({\n byId: z.object({}),\n settings: z.object({}),\n }),\n ),\n blockCollections: z.optional(\n z.object({\n byId: z.object({}),\n settings: z.object({}),\n }),\n ),\n templatesConfig: z.optional(z.object({})),\n settings: z.object({\n title: z.optional(z.string()),\n hideTitleInNavigation: z.optional(z.boolean()),\n logoUrl: z.optional(z.string()),\n }),\n }),\n});\n\nexport const KsAppClientDataNoMetaZod = z\n // uses the types from this type\n .custom<KsAppClientDataNoMeta>()\n .check((ctx) => {\n const { error } = KsAppClientDataNoMetaZodWIP.safeParse(ctx.value);\n if (error) {\n // @ts-expect-error this says that `issue.input` is not a valid property, but it is\n ctx.issues.push(...error.issues);\n }\n });\n\nexport function isKsAppClientDataAndMeta(\n data: unknown,\n): data is KsAppClientDataAndMeta {\n if (!isObject(data)) return false;\n // TODO: bring in exhaustive key checking here so all keys are caught\n const requiredKeys: Array<keyof KsAppClientDataAndMeta> = [\n 'assetSetsState',\n 'customPagesState',\n 'navsState',\n 'patternsState',\n 'tokensSrc',\n 'metaState',\n 'db',\n ];\n return requiredKeys.every((key) => isObjKey(key, data));\n}\n\nexport const KsAppClientDataAndMetaStruct = define<KsAppClientDataAndMeta>(\n 'KsAppClientDataAndMeta',\n isKsAppClientDataAndMeta,\n);\n\nexport const KsMetaStateStruct: Describe<KsAppClientData['metaState']> = type({\n isLocalDev: boolean(),\n plugins: array(\n type({\n id: string(),\n hasContent: boolean(),\n clientPluginPath: optional(string()),\n cssPath: optional(string()),\n }),\n ),\n meta: optional(\n type({\n version: optional(string()),\n hasKnapsackCloud: boolean(),\n knapsackCloudSiteId: optional(string()),\n serverPort: optional(number()),\n websocketsPort: optional(number()),\n https: optional(boolean()),\n cacheDir: optional(string()),\n ksVersions: type({\n app: string(),\n }),\n }),\n ),\n});\n\nexport const isKsMetaState = KsMetaStateStruct.is;\n","import {\n // type structs validate that a value has a set of properties on it, but it does not assert anything about unspecified properties. This allows you to assert that a particular set of functionality exists without a strict equality check for properties.\n type,\n string,\n Describe,\n boolean,\n optional,\n array,\n number,\n define,\n} from 'superstruct';\nimport { isObjKey, isObject } from '../type-utils';\nimport type { KnapsackAssetSetsData } from './asset-sets';\nimport type { KsDesignTokensState } from './design-tokens';\nimport type { MetaState } from './meta';\nimport type { KnapsackNavsConfig } from './nav';\nimport type { KsFiles } from './files';\nimport type { KnapsackCustomPagesData } from './custom-pages';\nimport type { PatternsState } from './patterns';\nimport type { KnapsackSettings } from './settings';\n\nexport type {\n KsDesignToken,\n KsDesignTokenAttributes,\n KsDesignTokenData,\n KsDesignTokenDataGroup,\n KsDesignTokenSrc,\n KsDesignTokenSrcGroup,\n KsDesignTokensState,\n KsTokenType,\n KsTokenValue,\n KnapsackDesignToken,\n} from './design-tokens';\n\nexport interface KsAppClientDataV3 {\n settingsState: {\n settings: KnapsackSettings;\n };\n patternsState: PatternsState;\n customPagesState: KnapsackCustomPagesData;\n assetSetsState: KnapsackAssetSetsData;\n navsState: KnapsackNavsConfig;\n tokensState: KsDesignTokensState;\n metaState?: MetaState;\n filesState: KsFiles;\n}\n\nexport type KsAppClientDataNoMetaV3 = Omit<KsAppClientDataV3, 'metaState'>;\nexport type KsAppClientDataAndMetaV3 = Required<KsAppClientDataV3>;\n\nexport function isKsAppClientDataNoMetaV3(\n data: unknown,\n): data is KsAppClientDataNoMetaV3 {\n if (!isObject(data)) return false;\n const requiredKeys: Array<keyof KsAppClientDataNoMetaV3> = [\n 'assetSetsState',\n 'customPagesState',\n 'navsState',\n 'patternsState',\n 'settingsState',\n 'tokensState',\n ];\n if (!requiredKeys.every((key) => isObjKey(key, data))) return false;\n if (!isObjKey('metaState', data)) return true;\n return false;\n}\n\nexport const KsAppClientDataNoMetaStructV3 = define<KsAppClientDataNoMetaV3>(\n 'KsAppClientDataNoMeta',\n isKsAppClientDataNoMetaV3,\n);\n\nexport function isKsAppClientDataAndMetaV3(\n data: unknown,\n): data is KsAppClientDataAndMetaV3 {\n if (!isObject(data)) return false;\n const requiredKeys: Array<keyof KsAppClientDataAndMetaV3> = [\n 'assetSetsState',\n 'customPagesState',\n 'navsState',\n 'patternsState',\n 'settingsState',\n 'tokensState',\n 'metaState',\n ];\n return requiredKeys.every((key) => isObjKey(key, data));\n}\n\nexport const KsAppClientDataAndMetaStructV3 = define<KsAppClientDataAndMetaV3>(\n 'KsAppClientDataAndMeta',\n isKsAppClientDataAndMetaV3,\n);\n\nexport const KsMetaStateStructV3: Describe<KsAppClientDataV3['metaState']> =\n type({\n isLocalDev: boolean(),\n plugins: array(\n type({\n id: string(),\n hasContent: boolean(),\n clientPluginPath: optional(string()),\n cssPath: optional(string()),\n }),\n ),\n meta: optional(\n type({\n version: optional(string()),\n hasKnapsackCloud: boolean(),\n knapsackCloudSiteId: optional(string()),\n serverPort: optional(number()),\n websocketsPort: optional(number()),\n https: optional(boolean()),\n cacheDir: optional(string()),\n ksVersions: type({\n app: string(),\n }),\n }),\n ),\n });\n\nexport const isKsMetaStateV3 = KsMetaStateStructV3.is;\n","import { isDraft, type Draft } from 'immer';\nimport { Migration } from './migration.types';\nimport { KnapsackPattern, SlottedData } from '../app-client-data/patterns';\n\ntype Migration417DemosType = {\n version: string;\n checkIfNeeded: (appClientData: any) => boolean;\n migrate: (appClientData: Draft<any>) => void;\n};\n\nexport const migration417Demos: Migration417DemosType = {\n version: '4.1.7',\n checkIfNeeded: (appClientData) => {\n // this one will be tough to check for, so we'll just assume it's needed\n return true;\n },\n // note that `appClientData` is mutable since we're already in Immer\n migrate: (appClientData) => {\n if (!isDraft(appClientData)) {\n throw new Error(\n `Tried to run migrations on appClientData but it is not an Immer Draft`,\n );\n }\n Object.values(appClientData.patternsState.patterns).forEach(\n (\n pattern: Draft<\n KnapsackPattern & {\n demoSize?: string;\n }\n >,\n ) => {\n delete pattern.demoSize;\n },\n );\n\n Object.values(appClientData.db.demos.byId).forEach((demo) => {\n if (demo.type !== 'data') return;\n\n Object.entries(demo.data.slots ?? {}).forEach(([slotName, slotData]) => {\n demo.data.slots[slotName] = slotData.map(\n (slottedData: Draft<SlottedData | string>) => {\n // it used to be just a string\n if (typeof slottedData === 'string') {\n return {\n type: 'text',\n text: slottedData,\n };\n }\n if (\n // not doing anything with these\n slottedData.type === 'template-reference' ||\n // these already were migrated or made by the new editor\n slottedData.type === 'text'\n ) {\n return slottedData;\n }\n // these used to not have a type set\n slottedData.type = 'template-demo';\n return slottedData;\n },\n );\n });\n\n if (demo.patternId && demo.templateId) return;\n\n // using an IIFE so we can stop looping once we find it\n // would use `break` but it's a double loop\n (() => {\n for (const { id: pId, templates = [] } of Object.values(\n appClientData.patternsState.patterns,\n )) {\n for (const { id: tId, demoIds = [] } of templates) {\n if (demoIds.includes(demo.id)) {\n demo.patternId = pId;\n demo.templateId = tId;\n // found it - stop looking\n return;\n }\n }\n }\n })();\n });\n },\n} satisfies Migration;\n","import { migration417Demos } from './4.1.7-demos';\n\nexport const migrations = [migration417Demos];\n","export const appSectionsById = {\n ROOT: 'ROOT',\n DESIGN: 'Design',\n DEVELOP: 'Develop',\n DOCUMENT: 'Documentation',\n PROTOTYPE: 'Prototype',\n SETTINGS: 'Settings',\n} as const;\nexport const appSections = Object.values(appSectionsById);\nexport type AppSection = keyof typeof appSectionsById;\n","// import { JSONSchema7 } from 'json-schema'; @todo consider using instead; though I'm not seeing it make it's way to the compiled JSON schema themselves via `convert-types-to-json-schmea.js`\n\ntype PropBase<Type = any> = {\n title?: string;\n description?: string;\n default?: Type;\n};\n\nexport enum PropTypeNames {\n 'string' = 'string',\n 'boolean' = 'boolean',\n 'number' = 'number',\n 'object' = 'object',\n 'options' = 'options',\n 'function' = 'function',\n 'customTypeScript' = 'customTypeScript',\n 'array' = 'array',\n 'arrayOfObjects' = 'arrayOfObjects',\n 'arrayOfStrings' = 'arrayOfStrings',\n 'arrayOfNumbers' = 'arrayOfNumbers',\n 'unknown' = 'unknown',\n}\nexport type PropTypeNamesList = keyof typeof PropTypeNames;\n\nexport type StringProp = {\n type: 'string';\n} & PropBase<string>;\n\nexport type BooleanProp = {\n type: 'boolean';\n} & PropBase<boolean>;\n\nexport type NumberProp = {\n type: 'number';\n} & PropBase<number>;\n\nexport type OptionsProp = {\n type: 'string' | 'number';\n enum: Array<string | number>;\n enumNames?: string[];\n} & PropBase<string | number>;\n\nexport type CustomTypeScriptProp = {\n /**\n * TypeScript type\n * @example (name: string) => void\n */\n tsType: string;\n type?: never;\n default?: string;\n} & PropBase<string>;\n\nexport type FunctionProp = {\n typeof: 'function';\n /**\n * TypeScript type\n * @example (name: string) => void\n */\n tsType: string;\n default?: string;\n type?: 'string';\n} & PropBase<string>;\n\nexport type ObjectProp = {\n type: 'object';\n additionalProperties?: boolean;\n required?: string[];\n properties: {\n [prop: string]: PropertyTypes;\n };\n} & PropBase;\n\nexport type ArrayProp = {\n type: 'array';\n items: PropertyTypes;\n} & PropBase<unknown[]>;\n\nexport type ArrayOfStringsProp = {\n type: 'array';\n uniqueItems?: boolean;\n items: StringProp;\n} & PropBase<unknown[]>;\n\nexport type ArrayOfNumbersProp = {\n type: 'array';\n uniqueItems?: boolean;\n items: NumberProp;\n} & PropBase<number[]>;\n\nexport type ArrayOfObjectsProp = {\n type: 'array';\n items: ObjectProp;\n} & PropBase<Array<Record<string, unknown>>>;\n\nexport type PropertyTypes =\n | StringProp\n | BooleanProp\n | NumberProp\n | OptionsProp\n | FunctionProp\n | CustomTypeScriptProp\n | ObjectProp\n | ArrayOfObjectsProp\n | ArrayOfStringsProp\n | ArrayOfNumbersProp\n | ArrayProp;\n\nexport const isStringProp = (prop: PropertyTypes): prop is StringProp =>\n 'type' in prop && prop.type === 'string' && !('enum' in prop);\nexport const isNumberProp = (prop: PropertyTypes): prop is NumberProp =>\n 'type' in prop && prop.type === 'number';\nexport const isBooleanProp = (prop: PropertyTypes): prop is BooleanProp =>\n 'type' in prop && prop.type === 'boolean';\nexport const isOptionsProp = (prop: PropertyTypes): prop is OptionsProp =>\n 'enum' in prop;\nexport const isFunctionProp = (prop: PropertyTypes): prop is FunctionProp =>\n 'typeof' in prop && prop?.typeof === 'function';\nexport const isCustomTypeScriptProp = (\n prop: PropertyTypes,\n): prop is CustomTypeScriptProp => !('typeof' in prop) && 'tsType' in prop;\nexport const isArrayOfObjectsProp = (\n prop: PropertyTypes,\n): prop is ArrayOfObjectsProp =>\n 'type' in prop &&\n prop.type === 'array' &&\n 'items' in prop &&\n prop.items.type === 'object';\nexport const isObjectProp = (prop: PropertyTypes): prop is ObjectProp =>\n 'type' in prop &&\n prop.type === 'object' &&\n 'properties' in prop &&\n Object.keys(prop.properties).length > 0;\nexport const isArrayOfStringsProp = (\n prop: PropertyTypes,\n): prop is ArrayOfStringsProp =>\n 'type' in prop &&\n prop.type === 'array' &&\n 'items' in prop &&\n prop.items.type === 'string';\nexport const isArrayOfNumbersProp = (\n prop: PropertyTypes,\n): prop is ArrayOfNumbersProp =>\n 'type' in prop &&\n prop.type === 'array' &&\n 'items' in prop &&\n prop.items.type === 'number';\n\nexport interface PropTypeDataBase {\n type: any;\n id: string;\n isRequired?: boolean;\n data: any;\n}\n\nexport interface StringPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.string;\n data: StringProp;\n}\n\nexport interface BooleanPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.boolean;\n data: BooleanProp;\n}\n\nexport interface NumberPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.number;\n data: NumberProp;\n}\n\nexport interface OptionsPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.options;\n data: OptionsProp;\n}\n\nexport interface FunctionPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.function;\n data: FunctionProp;\n}\n\nexport interface CustomTypeScriptPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.customTypeScript;\n data: CustomTypeScriptProp;\n}\n\nexport interface ObjectPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.object;\n data: ObjectProp;\n}\n\nexport interface ArrayOfObjectsPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.arrayOfObjects;\n data: ArrayOfObjectsProp;\n}\n\nexport interface ArrayOfStringsPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.arrayOfStrings;\n data: ArrayOfStringsProp;\n}\n\nexport interface ArrayOfNumbersPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.arrayOfNumbers;\n data: ArrayOfNumbersProp;\n}\n\nexport interface ArrayPropTypeData extends PropTypeDataBase {\n type: typeof PropTypeNames.array;\n data: ArrayProp;\n}\n\nexport type PropTypeData =\n | StringPropTypeData\n | BooleanPropTypeData\n | NumberPropTypeData\n | OptionsPropTypeData\n | FunctionPropTypeData\n | CustomTypeScriptPropTypeData\n | ObjectPropTypeData\n | ArrayOfObjectsPropTypeData\n | ArrayOfStringsPropTypeData\n | ArrayOfNumbersPropTypeData;\n\nexport type JsonSchemaObject<PropNames extends string = string> = {\n $schema?: string;\n title?: string;\n description?: string;\n type: 'object';\n required?: PropNames[];\n properties: Record<PropNames, PropertyTypes>;\n examples?: Record<string, unknown>[];\n};\n","import * as s from 'superstruct';\nimport type { Patch } from 'immer';\nimport type { SetOptional } from '@knapsack/utils';\nimport type { UUID, DateString } from './misc';\n\n/**\n * Patch\n */\n\nexport type { Patch };\n\nconst PatchStructRuntime = s.object({\n op: s.union([s.literal('replace'), s.literal('remove'), s.literal('add')]),\n path: s.array(s.union([s.string(), s.number()])),\n value: s.optional(s.any()),\n});\nconst PatchStruct: s.Describe<Patch> = PatchStructRuntime;\n\nexport const isPatch = (patch: unknown): patch is Patch =>\n PatchStruct.is(patch);\n\nconst PatchesStructRuntime = s.array(PatchStructRuntime);\nconst PatchesStruct: s.Describe<Patch[]> = PatchesStructRuntime;\n\nexport const isPatches = (patches: unknown): patches is Patch[] =>\n PatchesStruct.is(patches);\n\n/**\n * KsRemoteChange\n */\nexport type KsChange<Event extends { type: string } = { type: string }> = {\n patches: Patch[];\n inversePatches: Patch[];\n event: Event;\n id: UUID;\n date: DateString;\n};\nexport type KsRemoteChange = SetOptional<KsChange, 'inversePatches' | 'event'>;\n\nconst KsRemoteChangeRuntime = s.type({\n patches: PatchesStructRuntime,\n inversePatches: s.optional(PatchesStructRuntime),\n event: s.optional(s.object({ type: s.string() })),\n id: s.string(),\n date: s.string(),\n userId: s.optional(s.string()),\n});\nconst KsRemoteChangeStruct: s.Describe<KsRemoteChange> = KsRemoteChangeRuntime;\n\nexport const isKsRemoteChange = (change: unknown): change is KsRemoteChange =>\n KsRemoteChangeStruct.is(change);\n\nconst KsRemoteChangesStructRuntime = s.array(KsRemoteChangeRuntime);\nexport const KsRemoteChangesStruct: s.Describe<KsRemoteChange[]> =\n KsRemoteChangesStructRuntime;\n\nexport const isKsRemoteChanges = (\n changes: unknown,\n): changes is KsRemoteChange[] => KsRemoteChangesStruct.is(changes);\n","import { z } from 'zod';\nimport type {\n PathPackage,\n PathPackageSubPath,\n PathRelative,\n Branded,\n} from './re-exports';\nimport type {\n KnapsackPatternTemplate,\n TemplateDemo,\n TemplateRendererMeta,\n KsSpecMeta,\n KsTemplateSpec,\n} from './app-client-data/patterns';\nimport type { Simplify } from './type-utils';\n\nexport const rendererIds = {\n react: 'react',\n vue: 'vue',\n 'web-components': 'web-components',\n twig: 'twig',\n hbs: 'hbs',\n angular: 'angular',\n html: 'html',\n ios: 'ios',\n android: 'android',\n} as const;\n\n/**\n * The ID of a renderer, e.g. 'react', 'vue', 'angular', etc.\n * On Pattern Templates, this will match up to `templateLanguageId` to identify which renderer to use.\n * @see {KnapsackPatternTemplate['templateLanguageId']}\n */\nexport type RendererId = keyof typeof rendererIds;\nexport type CodeSrc =\n | {\n type: 'package';\n path: PathPackage;\n pathFromOutputDir: PathPackage;\n pkgName: PathPackage;\n rendererId: RendererId;\n }\n | {\n type: 'package-sub-path';\n path: PathPackageSubPath;\n pathFromOutputDir: PathPackageSubPath;\n pkgName: PathPackage;\n subPath: PathRelative;\n rendererId: RendererId;\n }\n | {\n type: 'relative-from-data-dir';\n rendererId: RendererId;\n path: PathRelative;\n pathFromOutputDir: PathRelative;\n };\n\nexport type CodeSrcUserConfig = {\n /**\n * Can contain glob patterns, relative paths, absolute paths, package paths, or package sub-paths\n */\n path: string;\n filter?: (path: string) => boolean;\n};\n\nexport const CodeSrcUserConfigSchema = z.strictObject({\n path: z\n .string()\n .describe(\n 'Can contain glob patterns, relative paths, absolute paths, package paths, or package sub-paths',\n ),\n filter: z\n .custom<(path: string) => boolean>((val) => {\n return typeof val === 'function';\n })\n .optional()\n .describe('A function that takes a path and returns a boolean'),\n});\n\nexport type TemplateInfoId = Branded<string, 'TemplateInfoId'>;\n\nexport type TemplateInfo<TheRendererId extends RendererId = RendererId> =\n Extract<\n | {\n rendererId: 'react';\n codeSrcPath: CodeSrc['path'];\n /**\n * Name of the export. If it's the default export, this will be `'default'`.\n */\n exportName: string;\n }\n | {\n rendererId: 'vue';\n codeSrcPath: CodeSrc['path'];\n }\n | {\n rendererId: 'web-components';\n elementName: string;\n }\n | {\n rendererId: 'angular';\n codeSrcPath: CodeSrc['path'];\n /**\n * Name of the export. If it's the default export, this will be `'default'`.\n */\n exportName: string;\n }\n | {\n rendererId: 'html';\n codeSrcPath: CodeSrc['path'];\n }\n | {\n rendererId: 'twig';\n namespacePath: string;\n }\n | {\n rendererId: 'hbs';\n codeSrcPath: CodeSrc['path'];\n }\n | {\n rendererId: 'ios';\n /** The library name that exports out several symbols/components */\n moduleName: PathPackage;\n /** The exported name of the component */\n symbolName: string;\n }\n | {\n rendererId: 'android';\n /**\n * The library name that exports out several classes/components\n * Example: `com.google.android.material`\n */\n packageName: PathPackage;\n /** The exported name of the component */\n componentName: string;\n },\n { rendererId: TheRendererId }\n >;\n\nexport type TemplateInfoWithId<TheRendererId extends RendererId = RendererId> =\n Extract<\n Simplify<\n TemplateInfo<TheRendererId> & {\n id: TemplateInfoId;\n }\n >,\n { rendererId: TheRendererId }\n >;\n\nexport type TemplateInfoWithCodeSrcPath = Extract<\n TemplateInfo,\n { codeSrcPath: string }\n>;\n\nexport function isTemplateInfoWithCodeSrcPath(\n info: TemplateInfo,\n): info is TemplateInfoWithCodeSrcPath {\n return 'codeSrcPath' in info;\n}\n\n/**\n * Create a unique ID for a template info\n * This is used to identify the template info by a single unique string\n * @returns A unique ID for the template info\n */\nexport function createTemplateInfoId(t: TemplateInfo): TemplateInfoId {\n switch (t.rendererId) {\n case 'angular':\n case 'react':\n return `${t.rendererId}---${t.codeSrcPath}---${\n t.exportName || 'default'\n }` as TemplateInfoId;\n case 'web-components':\n return `${t.rendererId}---${t.elementName}` as TemplateInfoId;\n case 'twig':\n return `${t.rendererId}---${t.namespacePath}` as TemplateInfoId;\n case 'vue':\n case 'hbs':\n case 'html':\n return `${t.rendererId}---${t.codeSrcPath}` as TemplateInfoId;\n case 'ios':\n return `${t.rendererId}---${t.moduleName}---${t.symbolName}` as TemplateInfoId;\n case 'android':\n return `${t.rendererId}---${t.packageName}---${t.componentName}` as TemplateInfoId;\n default: {\n const _: never = t;\n throw new Error(`Invalid template info: ${JSON.stringify(t)}`);\n }\n }\n}\n\nexport function addIdToTemplateInfo<TheRendererId extends RendererId>(\n t: TemplateInfo<TheRendererId>,\n): TemplateInfoWithId<TheRendererId> {\n return {\n ...t,\n id: createTemplateInfoId(t),\n };\n}\n\n/**\n * Converts old way of specifying template info (`path` & `alias`) to new way {@link TemplateInfo}\n * @see {@link convertTemplateInfoToOldWay} for the reverse\n */\nexport function normalizeTemplateInfo<TheRendererId extends RendererId>({\n rendererId,\n alias,\n path,\n}: {\n rendererId: TheRendererId;\n path?: CodeSrc['path'];\n alias?: string;\n}): TemplateInfo<TheRendererId> {\n const info = ((): TemplateInfo => {\n switch (rendererId) {\n case 'react':\n case 'angular':\n return {\n rendererId,\n codeSrcPath: path,\n exportName: alias || 'default',\n };\n case 'vue':\n case 'hbs':\n case 'html':\n return {\n rendererId,\n codeSrcPath: path,\n };\n case 'twig':\n return {\n rendererId,\n namespacePath: alias,\n };\n case 'web-components':\n return {\n rendererId,\n elementName: alias,\n };\n // @TOOD: Just speculation for ios/android for now\n case 'ios':\n return {\n rendererId,\n moduleName: path as PathPackage,\n symbolName: alias,\n };\n case 'android':\n return {\n rendererId,\n packageName: path as PathPackage,\n componentName: alias,\n };\n default: {\n const _: never = rendererId;\n throw new Error(`Invalid renderer ID: ${rendererId}`);\n }\n }\n })();\n\n return info as TemplateInfo<TheRendererId>;\n}\n\nexport type RendererTemplateConfig = {\n templateInfo: TemplateInfo;\n /**\n * If it's stored here, it's never inferred\n */\n spec?: KsTemplateSpec<false | undefined>;\n specMeta?: KsSpecMeta;\n};\n\n/**\n * Converts new way of specifying template info {@link TemplateInfo} to old way (`path` & `alias`)\n * @see {@link normalizeTemplateInfo} for the reverse\n */\nexport function convertTemplateInfoToOldWay(info: TemplateInfo): {\n path?: string;\n alias?: string;\n} {\n switch (info.rendererId) {\n case 'react':\n case 'angular':\n return {\n path: info.codeSrcPath,\n alias: info.exportName,\n };\n case 'hbs':\n case 'html':\n case 'vue':\n return {\n path: info.codeSrcPath,\n };\n case 'twig':\n return {\n alias: info.namespacePath,\n };\n case 'web-components':\n return {\n alias: info.elementName,\n };\n case 'ios':\n return {\n path: info.moduleName,\n alias: info.symbolName,\n };\n case 'android':\n return {\n path: info.packageName,\n alias: info.componentName,\n };\n default: {\n const _: never = info;\n throw new Error(`Invalid template info: ${JSON.stringify(info)}`);\n }\n }\n}\n\nexport type RendererDiscovery<TheRendererId extends RendererId> = {\n rendererId: TheRendererId;\n meta: TemplateRendererMeta;\n codeSrcsByPath: Record<CodeSrc['path'], CodeSrc>;\n templates: TemplateInfoWithId<TheRendererId>[];\n};\n\n/**\n * Results of rendering a pattern\n */\nexport type KsRenderResults = {\n ok: boolean;\n html: string;\n usage?: string;\n templateLanguage?: string;\n message?: string;\n};\n\nexport type KsRenderApiResults = KsRenderResults & {\n wrappedHtml: string;\n};\nexport type TemplateSuggestion = {\n path: string;\n alias?: string;\n connected?: boolean;\n};\n\nexport type TemplateSuggestionsGetFn = (opt: {\n rendererId: RendererId;\n newPath?: string;\n state: ContentStateForRendering;\n}) => Promise<{\n suggestions: TemplateSuggestion[];\n}>;\n\n/**\n * Aliases for package paths\n * Example:\n * ```js\n * {\n * 'my-pkg': '../path/to/my-pkg',\n * }\n * ```\n */\nexport type PkgPathAliases = Record<string, string>;\n\nexport type ContentStateForRendering = {\n /**\n * Patterns by ID\n */\n patterns: {\n [patternId: string]: {\n id: string;\n templates: Pick<\n KnapsackPatternTemplate,\n 'alias' | 'path' | 'templateLanguageId' | 'spec' | 'id' | 'title'\n >[];\n templateDemos: Array<\n TemplateDemo & {\n templateId: string;\n templateLanguageId: RendererId;\n }\n >;\n };\n };\n};\n\nexport type TemplateUse = {\n patternId: string;\n patternTitle: string;\n templateId: string;\n templateTitle: string;\n};\n\nexport type PathWithTemplates = {\n path: string;\n templates: {\n id: TemplateInfoId;\n templateInfo: TemplateInfoWithId;\n use: TemplateUse;\n suggestion: TemplateSuggestion;\n }[];\n};\n\nexport const metaForIosRenderer: TemplateRendererMeta = {\n id: rendererIds.ios,\n title: 'Native iOS',\n aliasUse: 'required',\n aliasTitle: 'Symbol Name',\n aliasDescription: 'The synchronized name of the iOS symbol.',\n enableDataDemos: true,\n enableTemplateDemos: false,\n hasTemplateImgSupport: true,\n hasSlotsSupport: false,\n hasSlotOptionsSupport: false,\n hasInferSpecSupport: true,\n hasTemplateSuggestionsSupport: true,\n};\n\nexport const metaForAndroidRenderer: TemplateRendererMeta = {\n id: rendererIds.android,\n title: 'Native Android',\n aliasUse: 'required',\n aliasTitle: 'Component Name',\n aliasDescription: 'The synchronized name of the Android component.',\n enableDataDemos: true,\n enableTemplateDemos: false,\n hasSlotsSupport: false,\n hasSlotOptionsSupport: false,\n hasTemplateImgSupport: true,\n hasInferSpecSupport: true,\n hasTemplateSuggestionsSupport: true,\n};\n","import type { FeedbackTypes } from './misc';\n\nexport enum KsRendererClientEvents {\n ready = 'ready',\n}\n\n/**\n * Message sent from the renderer client (in the iframe) to the App UI parent window\n * using `window.parent.postMessage()`.\n * Note that this likely will become a union type of all possible messages\n */\nexport type KsRendererClientMsg =\n | {\n /**\n * Sent when a `ResizeObserver` detects a change in the contents height or width.\n */\n type: 'ksRendererClient.contentResized';\n height: number;\n width: number;\n }\n | {\n type: 'ksRendererClient.showToast';\n msg: string;\n feedbackType?: FeedbackTypes;\n }\n /**\n * Tracks the scroll position of the iframe's content\n */\n | {\n type: 'ksRendererClient.scrollPosition';\n scrollTop: number;\n scrollLeft: number;\n }\n /**\n * Sent when the iframe content is fully loaded\n */\n | {\n type: 'ksRendererClient.ready';\n };\n\n/**\n * Message sent from the App UI parent window to the renderer client (in the iframe)\n * using `window.parent.postMessage()`.\n */\nexport type KsRendererIncomingMsg = {\n type: 'ksRendererClient.updateScrollPosition';\n scrollTop: number;\n scrollLeft: number;\n};\n\n/**\n * The meta data is stored in a script tag with this id\n * @see {KsRendererClientMeta}\n */\nexport const ksRendererClientMetaId = 'ks-meta';\n\n/**\n * Metadata about the current renderer client demo\n * @see {ksRendererClientMetaId} for the ID of the script tag\n */\nexport interface KsRendererClientMeta {\n patternId: string;\n templateId: string;\n demoId: string;\n assetSetId: string;\n isInIframe: boolean;\n websocketsPort: number;\n}\n","export const WS_EVENTS = {\n PATTERN_TEMPLATE_CHANGED: 'PATTERN_TEMPLATE_CHANGED',\n PATTERN_ASSET_CHANGED: 'PATTERN_ASSET_CHANGED',\n DESIGN_TOKENS_CHANGED: 'DESIGN_TOKENS_CHANGED',\n RENDERER_CLIENT_RELOAD: 'RENDERER_CLIENT_RELOAD',\n APP_CLIENT_DATA_CHANGED: 'APP_CLIENT_DATA_CHANGED',\n};\n\nexport type WebSocketEvent = keyof typeof WS_EVENTS;\n\nexport interface WebSocketMessage {\n event: string;\n data: Record<string, unknown>;\n}\n\nexport interface DesignTokensChangedData extends WebSocketMessage {\n event: typeof WS_EVENTS.DESIGN_TOKENS_CHANGED;\n data: Record<string, unknown>;\n}\n\nexport interface PatternChangedData extends WebSocketMessage {\n event: typeof WS_EVENTS.PATTERN_TEMPLATE_CHANGED;\n data: {\n /**\n * Absolute path to template on server that was just edited\n */\n path: string;\n };\n}\n\nexport interface AssetChangedData extends WebSocketMessage {\n event: typeof WS_EVENTS.PATTERN_ASSET_CHANGED;\n data: {\n /**\n * Absolute path to asset file (CSS/JS) on server that was just edited\n */\n path: string;\n };\n}\n\nexport interface RendererClientReloadMessage extends WebSocketMessage {\n event: typeof WS_EVENTS.RENDERER_CLIENT_RELOAD;\n data: {\n // @todo add patternId etc for more details\n };\n}\n\nexport interface AppClientDataChanged extends WebSocketMessage {\n event: typeof WS_EVENTS.PATTERN_TEMPLATE_CHANGED;\n data: Record<string, unknown>;\n}\n\nexport type WebSocketMessages =\n | PatternChangedData\n | AssetChangedData\n | DesignTokensChangedData\n | RendererClientReloadMessage;\n","export enum GitProviderType {\n GitHub = 'GitHub',\n GitLab = 'GitLab',\n GitLabRest = 'GitLabRest',\n Bitbucket = 'Bitbucket',\n Azure = 'Azure',\n}\n\nexport type FileAddition = {\n /** base64 */\n contents: string;\n path: string;\n\n /** Action to perform: create, delete, move, update, or chmod. */\n action?: RestActions;\n /** Content of the file. */\n content?: string;\n /** Full path to the file. */\n filePath?: string;\n /** Encoding of the file. Default is text. */\n encoding?: TextEncoding;\n /** Last known file commit ID. */\n lastCommitId?: string;\n /** Original full path to the file being moved. */\n previousPath?: string;\n};\n\nexport type FileDeletion = {\n path: string;\n};\n\nexport enum MergeableState {\n Conflicting = 'CONFLICTING',\n Mergeable = 'MERGEABLE',\n Unknown = 'UNKNOWN',\n}\n\nexport enum RestActions {\n Create = 'CREATE',\n Move = 'MOVE',\n Update = 'UPDATE',\n Chmod = 'CHMOD',\n}\n\nexport enum TextEncoding {\n Base64 = 'BASE64',\n Text = 'TEXT',\n}\n\nexport type FileChanges = {\n /** File to add or change. */\n additions?: FileAddition[];\n\n /** Files to delete. */\n deletions?: FileDeletion[];\n\n /** Last known file commit ID. */\n lastCommitId?: string;\n};\n\nexport type CommitAction = Record<string, unknown>;\n\nexport interface RepoLabel {\n name: string;\n /** ID optional because bitbucket does not provide id. We might be able to generate one if its required, eg. reponame-labelname */\n id?: string;\n}\n\nexport interface RepoInfo {\n id: string;\n url: string;\n name: string;\n ownerName?: string;\n defaultBranch?: any;\n}\n\n// 'BranchInfo' name is currently taken by GitLab generated queries. Thus 'BranchInfoResult'\nexport interface BranchInfoResult {\n sha?: string; // If branch info is not found, this can be undefined\n shortSha?: string;\n associatedPullRequests?: Pr[];\n additions?: number;\n commitUrl?: string;\n deletions?: number;\n id?: string; // In GitLab, this is the branch name. Modelled this way to make deleteBranch work.\n default?: boolean;\n}\n\nexport interface PrInfo {\n url: string;\n number: number;\n id: string;\n}\n\nexport interface Pr {\n id: string;\n title: string;\n createdAt: string;\n headRef: {\n id?: string;\n name?: string;\n target: BranchInfoResult;\n };\n mergeable: MergeableState;\n merged: boolean;\n number: number;\n body: string;\n isDraft: boolean;\n url: string;\n author: {\n login: string;\n avatarUrl?: string;\n };\n diffHeadSha?: string;\n targetBranch?: string;\n version?: string; // needed for bitbucket merge\n}\n\nexport interface GitProvider {\n type: GitProviderType;\n createBranch: (opt: { branch: string }) => Promise<BranchInfoResult>;\n commitOnBranch: (opt: {\n branch: string;\n message: string;\n fileChanges: FileChanges;\n }) => Promise<Record<string, unknown> | void>;\n getRepoLabels: () => Promise<RepoLabel[]>;\n getRepoInfo: () => Promise<RepoInfo>;\n getBranchInfo: ({ branch }: { branch: string }) => Promise<BranchInfoResult>;\n getPrs: () => Promise<Pr[]>;\n getPr: ({ prNumber }: { prNumber: number }) => Promise<Pr>;\n getTree?: (opt: { branch: string }) => Promise<{\n treeItems: {\n path: string;\n type: 'blob';\n /** SHA-1, use https://www.npmjs.com/package/git-hash-object */\n sha: string;\n url?: string;\n }[];\n }>;\n mergePr: ({ prNumber }: { prNumber: number }) => Promise<boolean>;\n createPr: ({\n siteId,\n branch,\n title,\n body,\n labelIds,\n }: {\n siteId: string;\n branch: string;\n title: string;\n body?: string;\n labelIds?: string[];\n }) => Promise<PrInfo>;\n deleteBranch: ({ id, branch }: { id: string; branch: string }) => Promise<{\n clientMutationId?: string;\n }>;\n getFileInfoOnBranchByPath: (opt: {\n filePath: string;\n branch: string;\n }) => Promise<{ exists: boolean; filePath: string }>;\n}\n","import type { AppSection } from './app-sections';\n\n/**\n * The roles here are duplicates of the roles in the database.\n * It needs to be here, in the types package, so it can be used in all packages.\n * If we pull it in from `@knapsack/hasura-gql-client`, which is the source, we get a dependency cycle. So we do it this way.\n * If the roles change in the database, we need to change them here too. We will get a build error if we don't (see code in `@knapsack/hasura-gql-client`).\n */\nexport type Role =\n | 'ADMIN'\n | 'CONTRIBUTOR'\n | 'CONSUMER'\n | 'VIEWER'\n | 'ANONYMOUS'\n /**\n * These are not used, but exist in the DB\n * @todo: remove unused roles from database\n * @link https://linear.app/knapsack/issue/KSP-5991/remove-unused-roles-from-database\n */\n | 'EDITOR'\n | 'MANAGER';\n\nexport type RolePermissions = {\n canManageUsers: boolean;\n canDelete: boolean;\n canEdit: boolean;\n canPublish: boolean;\n canView: boolean;\n};\n\nexport type RoleSectionAccess = Record<\n AppSection,\n {\n canView: boolean;\n canEdit: boolean;\n }\n>;\n\nexport type RoleInfo = {\n id: Role;\n title: string;\n hierarchy: number;\n permissions: RolePermissions;\n sectionAccess: RoleSectionAccess;\n};\n\nexport const rolesById: Record<Role, RoleInfo> = {\n ADMIN: {\n id: 'ADMIN',\n title: 'Admin',\n hierarchy: 4,\n permissions: {\n canManageUsers: true,\n canDelete: true,\n canEdit: true,\n canPublish: true,\n canView: true,\n },\n sectionAccess: {\n ROOT: {\n canEdit: false,\n canView: true,\n },\n DOCUMENT: {\n canEdit: true,\n canView: true,\n },\n DESIGN: {\n canEdit: true,\n canView: true,\n },\n DEVELOP: {\n canEdit: true,\n canView: true,\n },\n PROTOTYPE: {\n canEdit: true,\n canView: true,\n },\n SETTINGS: {\n canEdit: true,\n canView: true,\n },\n },\n },\n CONTRIBUTOR: {\n id: 'CONTRIBUTOR',\n title: 'Contributor',\n hierarchy: 3,\n permissions: {\n canManageUsers: false,\n canDelete: false,\n canEdit: true,\n canPublish: false,\n canView: true,\n },\n sectionAccess: {\n ROOT: {\n canEdit: false,\n canView: true,\n },\n DOCUMENT: {\n canEdit: true,\n canView: true,\n },\n DESIGN: {\n canEdit: true,\n canView: true,\n },\n DEVELOP: {\n canEdit: true,\n canView: true,\n },\n PROTOTYPE: {\n canEdit: true,\n canView: true,\n },\n SETTINGS: {\n canEdit: true,\n canView: true,\n },\n },\n },\n CONSUMER: {\n id: 'CONSUMER',\n title: 'Consumer',\n hierarchy: 2,\n permissions: {\n canManageUsers: false,\n canDelete: false,\n canEdit: true,\n canPublish: false,\n canView: true,\n },\n sectionAccess: {\n ROOT: {\n canEdit: false,\n canView: true,\n },\n DOCUMENT: {\n canEdit: false,\n canView: true,\n },\n DESIGN: {\n canEdit: false,\n canView: false,\n },\n DEVELOP: {\n canEdit: false,\n canView: false,\n },\n PROTOTYPE: {\n canEdit: true,\n canView: true,\n },\n SETTINGS: {\n canEdit: false,\n canView: false,\n },\n },\n },\n VIEWER: {\n id: 'VIEWER',\n title: 'Viewer',\n hierarchy: 1,\n permissions: {\n canManageUsers: false,\n canDelete: false,\n canEdit: false,\n canPublish: false,\n canView: true,\n },\n sectionAccess: {\n ROOT: {\n canEdit: false,\n canView: true,\n },\n DOCUMENT: {\n canEdit: false,\n canView: true,\n },\n DESIGN: {\n canEdit: false,\n canView: false,\n },\n DEVELOP: {\n canEdit: false,\n canView: false,\n },\n PROTOTYPE: {\n canEdit: false,\n canView: false,\n },\n SETTINGS: {\n canEdit: false,\n canView: false,\n },\n },\n },\n ANONYMOUS: {\n id: 'ANONYMOUS',\n title: 'Anonymous',\n hierarchy: 0,\n permissions: {\n canManageUsers: false,\n canDelete: false,\n canEdit: false,\n canPublish: false,\n canView: true,\n },\n sectionAccess: {\n ROOT: {\n canEdit: false,\n canView: true,\n },\n DOCUMENT: {\n canEdit: false,\n canView: true,\n },\n DESIGN: {\n canEdit: false,\n canView: false,\n },\n DEVELOP: {\n canEdit: false,\n canView: false,\n },\n PROTOTYPE: {\n canEdit: false,\n canView: false,\n },\n SETTINGS: {\n canEdit: false,\n canView: false,\n },\n },\n },\n /**\n * These are not used, but exist in the DB\n * @todo: remove unused roles from database\n * @link https://linear.app/knapsack/issue/KSP-5991/remove-unused-roles-from-database\n */\n EDITOR: {\n id: 'EDITOR',\n title: 'Editor',\n hierarchy: 0,\n permissions: {\n canManageUsers: false,\n canDelete: false,\n canEdit: false,\n canPublish: false,\n canView: false,\n },\n sectionAccess: {\n ROOT: {\n canEdit: false,\n canView: false,\n },\n DOCUMENT: {\n canEdit: false,\n canView: false,\n },\n DESIGN: {\n canEdit: false,\n canView: false,\n },\n DEVELOP: {\n canEdit: false,\n canView: false,\n },\n PROTOTYPE: {\n canEdit: false,\n canView: false,\n },\n SETTINGS: {\n canEdit: false,\n canView: false,\n },\n },\n },\n MANAGER: {\n id: 'MANAGER',\n title: 'Manager',\n hierarchy: 0,\n permissions: {\n canManageUsers: false,\n canDelete: false,\n canEdit: false,\n canPublish: false,\n canView: false,\n },\n sectionAccess: {\n ROOT: {\n canEdit: false,\n canView: false,\n },\n DOCUMENT: {\n canEdit: false,\n canView: false,\n },\n DESIGN: {\n canEdit: false,\n canView: false,\n },\n DEVELOP: {\n canEdit: false,\n canView: false,\n },\n PROTOTYPE: {\n canEdit: false,\n canView: false,\n },\n SETTINGS: {\n canEdit: false,\n canView: false,\n },\n },\n },\n};\n\nexport const roles = Object.values(rolesById);\n","import { createUrlWithParams } from '@knapsack/utils/urls';\n\n/**\n * A type-safe representation of an API route.\n */\nexport type ApiRoute<\n Config extends {\n path: `/${string}`;\n method: 'GET' | 'POST';\n /**\n * GET - query params\n * POST - body\n */\n input?: Record<string, unknown>;\n /**\n * Response body\n * Can be a string if the response is a plain text message or html\n * Otherwise, it should be a JSON object\n */\n output?: Record<string, unknown> | string;\n },\n> = {\n path: Config['path'];\n method: Config['method'];\n input?: Config['input'];\n output?: Config['output'];\n};\n\n/**\n * Creates a URL for a specific API route with typed query parameters\n * @example\n * ```ts\n * createUrlForRoute({\n * path: '/api/users',\n * queryParams: { id: '123' },\n * origin: 'https://example.com'\n * })\n * // => URL('https://example.com/api/users?id=123')\n */\nexport function createUrlForRoute<Route extends ApiRoute<any>>({\n /** API route path */\n path,\n /** Typed query parameters matching the route's input type */\n queryParams,\n /** Base URL for relative paths */\n origin,\n}: {\n path: Route['path'];\n queryParams: Route['input'] extends Record<string, unknown>\n ? Route['input']\n : undefined;\n origin?: string;\n}) {\n return createUrlWithParams({\n url: path,\n queryParams,\n origin,\n });\n}\n\n/**\n * Converts URLSearchParams into a typed object\n * @example\n * ```ts\n * const params = new URLSearchParams('foo=bar&count=42');\n * getParams(params)\n * // => { foo: 'bar', count: '42' }\n */\nexport function getParams<Params extends Record<string, string>>(\n /** URLSearchParams object to convert */\n params: URLSearchParams,\n): Params {\n return Object.fromEntries(params.entries()) as Params;\n}\n\n/**\n * Converts URLSearchParams into a typed object matching an API route's input type\n * @example\n * ```ts\n * const params = new URLSearchParams('userId=123&action=update');\n * getParamsForRoute<UserRoute>(params)\n * // => { userId: '123', action: 'update' }\n */\nexport function getParamsForRoute<Route extends ApiRoute<any>>(\n /** URLSearchParams object to convert */\n params: URLSearchParams,\n): Route['input'] {\n return getParams(params);\n}\n"]}
|