@collie-lang/config 1.1.1 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,3 @@
1
- import "./chunk-7D4SUZUM.js";
2
-
3
1
  // src/index.ts
4
2
  import fs from "fs/promises";
5
3
  import path2 from "path";
@@ -356,7 +354,7 @@ async function loadTsConfigFile(filePath) {
356
354
  }
357
355
  async function getTsImport() {
358
356
  if (!tsImportFnPromise) {
359
- tsImportFnPromise = import("./api-RX6VV46A.js").then((mod) => mod.tsImport);
357
+ tsImportFnPromise = import("tsx/esm/api").then((mod) => mod.tsImport);
360
358
  }
361
359
  return tsImportFnPromise;
362
360
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/normalize.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type {\n CollieConfig,\n CollieProjectConfig,\n NormalizedCollieConfig\n} from \"./types\";\nimport { normalizeConfig } from \"./normalize\";\n\nexport * from \"./types\";\nexport * from \"./normalize\";\n\nconst DEFAULT_CONFIG_FILES = [\n \"collie.config.ts\",\n \"collie.config.js\",\n \"collie.config.mjs\",\n \"collie.config.cjs\",\n \"collie.config.json\"\n] as const;\n\ntype TsImportFn = (\n specifier: string,\n parent: string | { parentURL: string }\n) => Promise<unknown>;\nlet tsImportFnPromise: Promise<TsImportFn> | null = null;\n\nexport interface LoadConfigOptions {\n cwd?: string;\n explicitPath?: string;\n}\n\nexport function defineConfig(config: CollieConfig): CollieConfig {\n return config;\n}\n\nexport async function loadConfig(\n options: LoadConfigOptions = {}\n): Promise<CollieConfig | null> {\n const cwd = options.cwd ?? process.cwd();\n const resolvedPath = await resolveConfigPath(cwd, options.explicitPath);\n\n if (!resolvedPath) {\n return null;\n }\n\n const ext = path.extname(resolvedPath).toLowerCase();\n\n if (ext === \".ts\") {\n const rawConfig = await loadTsConfigFile(resolvedPath);\n return validateBasicConfig(rawConfig, resolvedPath);\n }\n\n const rawConfig = await loadConfigFile(resolvedPath, ext);\n return validateBasicConfig(rawConfig, resolvedPath);\n}\n\nexport async function loadAndNormalizeConfig(\n options: LoadConfigOptions = {}\n): Promise<NormalizedCollieConfig | null> {\n const config = await loadConfig(options);\n if (!config) {\n return null;\n }\n return normalizeConfig(config, { cwd: options.cwd });\n}\n\nasync function resolveConfigPath(\n cwd: string,\n explicitPath?: string\n): Promise<string | null> {\n if (explicitPath) {\n const absolutePath = path.isAbsolute(explicitPath)\n ? explicitPath\n : path.resolve(cwd, explicitPath);\n const exists = await fileExists(absolutePath);\n if (!exists) {\n throw new Error(`Config file not found at ${absolutePath}`);\n }\n return absolutePath;\n }\n\n for (const filename of DEFAULT_CONFIG_FILES) {\n const candidate = path.join(cwd, filename);\n if (await fileExists(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nasync function fileExists(targetPath: string): Promise<boolean> {\n try {\n await fs.access(targetPath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function loadConfigFile(\n filePath: string,\n ext: string\n): Promise<unknown> {\n if (ext === \".ts\") {\n return loadTsConfigFile(filePath);\n }\n\n if (ext === \".json\") {\n const contents = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(contents);\n }\n\n if (ext === \".cjs\" || ext === \".js\" || ext === \".mjs\") {\n const imported = await import(pathToFileURL(filePath).href);\n return imported?.default ?? imported;\n }\n\n throw new Error(`Unsupported config extension: ${ext}`);\n}\n\nasync function loadTsConfigFile(filePath: string): Promise<unknown> {\n try {\n const tsImport = await getTsImport();\n const fileUrl = pathToFileURL(filePath).href;\n return await tsImport(fileUrl, { parentURL: fileUrl });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Failed to load TypeScript config at \"${filePath}\": ${message}`\n );\n }\n}\n\nasync function getTsImport(): Promise<TsImportFn> {\n if (!tsImportFnPromise) {\n tsImportFnPromise = import(\"tsx/esm/api\").then((mod) => mod.tsImport);\n }\n return tsImportFnPromise;\n}\n\nfunction validateBasicConfig(config: unknown, filePath: string): CollieConfig {\n if (!config || typeof config !== \"object\") {\n throw new Error(\n `Config file \"${filePath}\" did not export an object. Export a Collie config object.`\n );\n }\n\n const typedConfig = config as CollieConfig;\n\n if (!Array.isArray(typedConfig.projects)) {\n throw new Error(\n `Config file \"${filePath}\" must define a \"projects\" array.`\n );\n }\n\n (typedConfig.projects as unknown[]).forEach((project, index) => {\n validateProject(project, index, filePath);\n });\n\n return typedConfig;\n}\n\nfunction validateProject(\n project: unknown,\n index: number,\n filePath: string\n): void {\n if (!project || typeof project !== \"object\") {\n throw new Error(\n `Project entry at index ${index} in \"${filePath}\" must be an object.`\n );\n }\n\n const typedProject = project as CollieProjectConfig;\n\n if (!typedProject.type || typeof typedProject.type !== \"string\") {\n throw new Error(\n `Project ${index} in \"${filePath}\" must include a string \"type\".`\n );\n }\n\n if (\n typeof typedProject.input !== \"string\" &&\n !(\n Array.isArray(typedProject.input) &&\n typedProject.input.every((entry) => typeof entry === \"string\")\n )\n ) {\n throw new Error(\n `Project ${index} in \"${filePath}\" must define \"input\" as a string or array of strings.`\n );\n }\n}\n","import path from \"node:path\";\n\nimport type {\n CollieConfig,\n CollieCssOptions,\n CollieDialectOptions,\n CollieDialectTokenRule,\n CollieDialectTokenKind,\n CollieDiagnosticLevel,\n CollieProjectConfig,\n NormalizedCollieConfig,\n NormalizedCollieCssOptions,\n NormalizedCollieDialectOptions,\n NormalizedCollieDialectPropsOptions,\n NormalizedCollieDialectTokenRule,\n NormalizedCollieDialectTokens,\n NormalizedCollieProjectConfig\n} from \"./types\";\n\ninterface NormalizeOptions {\n cwd?: string;\n}\n\nexport function normalizeConfig(\n config: CollieConfig,\n options: NormalizeOptions = {}\n): NormalizedCollieConfig {\n const cwd = options.cwd ?? process.cwd();\n const normalizedProjects = config.projects.map((project, index) =>\n normalizeProject(project, index, cwd)\n );\n const normalizedCss = normalizeCssOptions(config.css);\n const normalizedDialect = normalizeDialectOptions(config.dialect);\n\n return {\n ...config,\n css: normalizedCss,\n dialect: normalizedDialect,\n projects: normalizedProjects\n };\n}\n\nfunction normalizeProject(\n project: CollieProjectConfig,\n index: number,\n cwd: string\n): NormalizedCollieProjectConfig {\n const name = project.name ?? `${project.type}-${index}`;\n const root = project.root\n ? path.isAbsolute(project.root)\n ? project.root\n : path.resolve(cwd, project.root)\n : cwd;\n const input = Array.isArray(project.input) ? project.input : [project.input];\n\n return {\n ...project,\n name,\n root,\n input,\n output: project.output ?? {},\n html: project.html,\n react: project.react\n };\n}\n\nconst CSS_STRATEGIES = [\"tailwind\", \"global\", \"unknown\"] as const;\nconst DIAGNOSTIC_LEVELS = [\"off\", \"info\", \"warn\", \"error\"] as const;\nconst ACCESS_STYLES = [\"locals\", \"namespace\", \"either\"] as const;\n\nconst DEFAULT_DIALECT_TOKENS: NormalizedCollieDialectTokens = {\n if: { preferred: \"@if\", allow: [\"@if\"], onDisallowed: \"error\" },\n else: { preferred: \"@else\", allow: [\"@else\"], onDisallowed: \"error\" },\n elseIf: { preferred: \"@elseIf\", allow: [\"@elseIf\"], onDisallowed: \"error\" },\n for: { preferred: \"@for\", allow: [\"@for\"], onDisallowed: \"error\" },\n id: {\n preferred: \"id\",\n allow: [\"#id\", \"#id:\", \"#id=\", \"id\", \"id:\", \"id=\"],\n onDisallowed: \"warn\"\n }\n};\n\nfunction normalizeCssOptions(input: CollieCssOptions | undefined): NormalizedCollieCssOptions {\n if (input !== undefined && !isPlainObject(input)) {\n throw new Error(`Invalid \"css\": expected an object.`);\n }\n const strategy = normalizeEnum(input?.strategy, \"css.strategy\", CSS_STRATEGIES, \"unknown\");\n if (input?.diagnostics !== undefined && !isPlainObject(input.diagnostics)) {\n throw new Error(`Invalid \"css.diagnostics\": expected an object.`);\n }\n const unknownClassDefault = strategy === \"global\" ? \"warn\" : \"off\";\n const unknownClass = normalizeDiagnosticLevel(\n input?.diagnostics?.unknownClass,\n \"css.diagnostics.unknownClass\",\n unknownClassDefault\n );\n\n return {\n strategy,\n diagnostics: {\n unknownClass\n }\n };\n}\n\nfunction normalizeDialectOptions(input: CollieDialectOptions | undefined): NormalizedCollieDialectOptions {\n if (input !== undefined && !isPlainObject(input)) {\n throw new Error(`Invalid \"dialect\": expected an object.`);\n }\n\n const tokens = normalizeTokenRules(input?.tokens);\n const normalizeOnFormat = normalizeBoolean(input?.normalizeOnFormat, \"dialect.normalizeOnFormat\", true);\n const normalizeOnBuild = normalizeBoolean(input?.normalizeOnBuild, \"dialect.normalizeOnBuild\", false);\n const props = normalizeDialectProps(input?.props);\n\n return {\n tokens,\n normalizeOnFormat,\n normalizeOnBuild,\n props\n };\n}\n\nfunction normalizeTokenRules(input: CollieDialectOptions[\"tokens\"] | undefined): NormalizedCollieDialectTokens {\n if (input !== undefined && !isPlainObject(input)) {\n throw new Error(`Invalid \"dialect.tokens\": expected an object.`);\n }\n\n const normalized = {} as NormalizedCollieDialectTokens;\n const kinds = Object.keys(DEFAULT_DIALECT_TOKENS) as CollieDialectTokenKind[];\n\n for (const kind of kinds) {\n const rule = input?.[kind];\n normalized[kind] = normalizeTokenRule(kind, rule, DEFAULT_DIALECT_TOKENS[kind]);\n }\n\n return normalized;\n}\n\nfunction normalizeTokenRule(\n kind: CollieDialectTokenKind,\n rule: CollieDialectTokenRule | undefined,\n defaults: NormalizedCollieDialectTokenRule\n): NormalizedCollieDialectTokenRule {\n if (rule !== undefined && !isPlainObject(rule)) {\n throw new Error(`Invalid \"dialect.tokens.${kind}\": expected an object.`);\n }\n\n const preferred = normalizeString(\n rule?.preferred,\n `dialect.tokens.${kind}.preferred`,\n defaults.preferred\n );\n const allow = normalizeStringArray(\n rule?.allow,\n `dialect.tokens.${kind}.allow`,\n defaults.allow\n );\n const onDisallowed = normalizeDiagnosticLevel(\n rule?.onDisallowed,\n `dialect.tokens.${kind}.onDisallowed`,\n defaults.onDisallowed\n );\n const normalizedAllow = normalizeAllowList(allow, preferred);\n\n return {\n preferred,\n allow: normalizedAllow,\n onDisallowed\n };\n}\n\nfunction normalizeDialectProps(\n input: CollieDialectOptions[\"props\"] | undefined\n): NormalizedCollieDialectPropsOptions {\n if (input !== undefined && !isPlainObject(input)) {\n throw new Error(`Invalid \"dialect.props\": expected an object.`);\n }\n\n const allowPropsNamespace = normalizeBoolean(\n input?.allowPropsNamespace,\n \"dialect.props.allowPropsNamespace\",\n true\n );\n const allowDeclaredLocals = normalizeBoolean(\n input?.allowDeclaredLocals,\n \"dialect.props.allowDeclaredLocals\",\n true\n );\n const requireDeclarationForLocals = normalizeBoolean(\n input?.requireDeclarationForLocals,\n \"dialect.props.requireDeclarationForLocals\",\n allowDeclaredLocals\n );\n if (!allowDeclaredLocals && requireDeclarationForLocals) {\n throw new Error(\n `Invalid \"dialect.props.requireDeclarationForLocals\": cannot be true when allowDeclaredLocals is false.`\n );\n }\n\n if (input?.requirePropsBlockWhen !== undefined && !isPlainObject(input.requirePropsBlockWhen)) {\n throw new Error(`Invalid \"dialect.props.requirePropsBlockWhen\": expected an object.`);\n }\n const requirePropsBlockWhenEnabled = normalizeBoolean(\n input?.requirePropsBlockWhen?.enabled,\n \"dialect.props.requirePropsBlockWhen.enabled\",\n false\n );\n const requirePropsBlockWhenMin = normalizePositiveInteger(\n input?.requirePropsBlockWhen?.minUniquePropsUsed,\n \"dialect.props.requirePropsBlockWhen.minUniquePropsUsed\",\n 2\n );\n const requirePropsBlockWhenSeverity = normalizeDiagnosticLevel(\n input?.requirePropsBlockWhen?.severity,\n \"dialect.props.requirePropsBlockWhen.severity\",\n \"warn\"\n );\n\n const preferAccessStyle = normalizeEnum(\n input?.preferAccessStyle,\n \"dialect.props.preferAccessStyle\",\n ACCESS_STYLES,\n \"either\"\n );\n\n if (input?.diagnostics !== undefined && !isPlainObject(input.diagnostics)) {\n throw new Error(`Invalid \"dialect.props.diagnostics\": expected an object.`);\n }\n const missingDeclaration = normalizeDiagnosticLevel(\n input?.diagnostics?.missingDeclaration,\n \"dialect.props.diagnostics.missingDeclaration\",\n \"error\"\n );\n const unusedDeclaration = normalizeDiagnosticLevel(\n input?.diagnostics?.unusedDeclaration,\n \"dialect.props.diagnostics.unusedDeclaration\",\n \"warn\"\n );\n const style = normalizeDiagnosticLevel(\n input?.diagnostics?.style,\n \"dialect.props.diagnostics.style\",\n \"info\"\n );\n\n return {\n allowPropsNamespace,\n allowDeclaredLocals,\n requireDeclarationForLocals,\n requirePropsBlockWhen: {\n enabled: requirePropsBlockWhenEnabled,\n minUniquePropsUsed: requirePropsBlockWhenMin,\n severity: requirePropsBlockWhenSeverity\n },\n preferAccessStyle,\n diagnostics: {\n missingDeclaration,\n unusedDeclaration,\n style\n }\n };\n}\n\nfunction normalizeBoolean(value: unknown, path: string, fallback: boolean): boolean {\n if (value === undefined) {\n return fallback;\n }\n if (typeof value !== \"boolean\") {\n throw new Error(`Invalid \"${path}\": expected a boolean.`);\n }\n return value;\n}\n\nfunction normalizePositiveInteger(value: unknown, path: string, fallback: number): number {\n if (value === undefined) {\n return fallback;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0 || Math.floor(value) !== value) {\n throw new Error(`Invalid \"${path}\": expected a positive integer.`);\n }\n return value;\n}\n\nfunction normalizeEnum<T extends string>(\n value: unknown,\n path: string,\n allowed: readonly T[],\n fallback: T\n): T {\n if (value === undefined) {\n return fallback;\n }\n if (typeof value !== \"string\" || !allowed.includes(value as T)) {\n throw new Error(`Invalid \"${path}\": expected one of ${allowed.join(\", \")}.`);\n }\n return value as T;\n}\n\nfunction normalizeDiagnosticLevel(\n value: unknown,\n path: string,\n fallback: CollieDiagnosticLevel\n): CollieDiagnosticLevel {\n return normalizeEnum(value, path, DIAGNOSTIC_LEVELS, fallback);\n}\n\nfunction normalizeString(value: unknown, path: string, fallback: string): string {\n if (value === undefined) {\n return fallback;\n }\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`Invalid \"${path}\": expected a non-empty string.`);\n }\n return value;\n}\n\nfunction normalizeStringArray(value: unknown, path: string, fallback: string[]): string[] {\n if (value === undefined) {\n return [...fallback];\n }\n if (!Array.isArray(value)) {\n throw new Error(`Invalid \"${path}\": expected an array of strings.`);\n }\n for (const entry of value) {\n if (typeof entry !== \"string\" || entry.trim().length === 0) {\n throw new Error(`Invalid \"${path}\": entries must be non-empty strings.`);\n }\n }\n return [...value];\n}\n\nfunction normalizeAllowList(allow: string[], preferred: string): string[] {\n const allowSet = new Set(allow);\n allowSet.add(preferred);\n const normalized = Array.from(allowSet);\n normalized.sort();\n return normalized;\n}\n\nfunction isPlainObject(value: unknown): boolean {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n"],"mappings":"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","names":["path","path","path","rawConfig"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/normalize.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type {\n CollieConfig,\n CollieProjectConfig,\n NormalizedCollieConfig\n} from \"./types.ts\";\nimport { normalizeConfig } from \"./normalize.ts\";\n\nexport * from \"./types.ts\";\nexport * from \"./normalize.ts\";\n\nconst DEFAULT_CONFIG_FILES = [\n \"collie.config.ts\",\n \"collie.config.js\",\n \"collie.config.mjs\",\n \"collie.config.cjs\",\n \"collie.config.json\"\n] as const;\n\ntype TsImportFn = (\n specifier: string,\n parent: string | { parentURL: string }\n) => Promise<unknown>;\nlet tsImportFnPromise: Promise<TsImportFn> | null = null;\n\nexport interface LoadConfigOptions {\n cwd?: string;\n explicitPath?: string;\n}\n\nexport function defineConfig(config: CollieConfig): CollieConfig {\n return config;\n}\n\nexport async function loadConfig(\n options: LoadConfigOptions = {}\n): Promise<CollieConfig | null> {\n const cwd = options.cwd ?? process.cwd();\n const resolvedPath = await resolveConfigPath(cwd, options.explicitPath);\n\n if (!resolvedPath) {\n return null;\n }\n\n const ext = path.extname(resolvedPath).toLowerCase();\n\n if (ext === \".ts\") {\n const rawConfig = await loadTsConfigFile(resolvedPath);\n return validateBasicConfig(rawConfig, resolvedPath);\n }\n\n const rawConfig = await loadConfigFile(resolvedPath, ext);\n return validateBasicConfig(rawConfig, resolvedPath);\n}\n\nexport async function loadAndNormalizeConfig(\n options: LoadConfigOptions = {}\n): Promise<NormalizedCollieConfig | null> {\n const config = await loadConfig(options);\n if (!config) {\n return null;\n }\n return normalizeConfig(config, { cwd: options.cwd });\n}\n\nasync function resolveConfigPath(\n cwd: string,\n explicitPath?: string\n): Promise<string | null> {\n if (explicitPath) {\n const absolutePath = path.isAbsolute(explicitPath)\n ? explicitPath\n : path.resolve(cwd, explicitPath);\n const exists = await fileExists(absolutePath);\n if (!exists) {\n throw new Error(`Config file not found at ${absolutePath}`);\n }\n return absolutePath;\n }\n\n for (const filename of DEFAULT_CONFIG_FILES) {\n const candidate = path.join(cwd, filename);\n if (await fileExists(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nasync function fileExists(targetPath: string): Promise<boolean> {\n try {\n await fs.access(targetPath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function loadConfigFile(\n filePath: string,\n ext: string\n): Promise<unknown> {\n if (ext === \".ts\") {\n return loadTsConfigFile(filePath);\n }\n\n if (ext === \".json\") {\n const contents = await fs.readFile(filePath, \"utf8\");\n return JSON.parse(contents);\n }\n\n if (ext === \".cjs\" || ext === \".js\" || ext === \".mjs\") {\n const imported = await import(pathToFileURL(filePath).href);\n return imported?.default ?? imported;\n }\n\n throw new Error(`Unsupported config extension: ${ext}`);\n}\n\nasync function loadTsConfigFile(filePath: string): Promise<unknown> {\n try {\n const tsImport = await getTsImport();\n const fileUrl = pathToFileURL(filePath).href;\n return await tsImport(fileUrl, { parentURL: fileUrl });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Failed to load TypeScript config at \"${filePath}\": ${message}`\n );\n }\n}\n\nasync function getTsImport(): Promise<TsImportFn> {\n if (!tsImportFnPromise) {\n tsImportFnPromise = import(\"tsx/esm/api\").then((mod) => mod.tsImport);\n }\n return tsImportFnPromise;\n}\n\nfunction validateBasicConfig(config: unknown, filePath: string): CollieConfig {\n if (!config || typeof config !== \"object\") {\n throw new Error(\n `Config file \"${filePath}\" did not export an object. Export a Collie config object.`\n );\n }\n\n const typedConfig = config as CollieConfig;\n\n if (!Array.isArray(typedConfig.projects)) {\n throw new Error(\n `Config file \"${filePath}\" must define a \"projects\" array.`\n );\n }\n\n (typedConfig.projects as unknown[]).forEach((project, index) => {\n validateProject(project, index, filePath);\n });\n\n return typedConfig;\n}\n\nfunction validateProject(\n project: unknown,\n index: number,\n filePath: string\n): void {\n if (!project || typeof project !== \"object\") {\n throw new Error(\n `Project entry at index ${index} in \"${filePath}\" must be an object.`\n );\n }\n\n const typedProject = project as CollieProjectConfig;\n\n if (!typedProject.type || typeof typedProject.type !== \"string\") {\n throw new Error(\n `Project ${index} in \"${filePath}\" must include a string \"type\".`\n );\n }\n\n if (\n typeof typedProject.input !== \"string\" &&\n !(\n Array.isArray(typedProject.input) &&\n typedProject.input.every((entry) => typeof entry === \"string\")\n )\n ) {\n throw new Error(\n `Project ${index} in \"${filePath}\" must define \"input\" as a string or array of strings.`\n );\n }\n}\n","import path from \"node:path\";\n\nimport type {\n CollieConfig,\n CollieCssOptions,\n CollieDialectOptions,\n CollieDialectTokenRule,\n CollieDialectTokenKind,\n CollieDiagnosticLevel,\n CollieProjectConfig,\n NormalizedCollieConfig,\n NormalizedCollieCssOptions,\n NormalizedCollieDialectOptions,\n NormalizedCollieDialectPropsOptions,\n NormalizedCollieDialectTokenRule,\n NormalizedCollieDialectTokens,\n NormalizedCollieProjectConfig\n} from \"./types.ts\";\n\ninterface NormalizeOptions {\n cwd?: string;\n}\n\nexport function normalizeConfig(\n config: CollieConfig,\n options: NormalizeOptions = {}\n): NormalizedCollieConfig {\n const cwd = options.cwd ?? process.cwd();\n const normalizedProjects = config.projects.map((project, index) =>\n normalizeProject(project, index, cwd)\n );\n const normalizedCss = normalizeCssOptions(config.css);\n const normalizedDialect = normalizeDialectOptions(config.dialect);\n\n return {\n ...config,\n css: normalizedCss,\n dialect: normalizedDialect,\n projects: normalizedProjects\n };\n}\n\nfunction normalizeProject(\n project: CollieProjectConfig,\n index: number,\n cwd: string\n): NormalizedCollieProjectConfig {\n const name = project.name ?? `${project.type}-${index}`;\n const root = project.root\n ? path.isAbsolute(project.root)\n ? project.root\n : path.resolve(cwd, project.root)\n : cwd;\n const input = Array.isArray(project.input) ? project.input : [project.input];\n\n return {\n ...project,\n name,\n root,\n input,\n output: project.output ?? {},\n html: project.html,\n react: project.react\n };\n}\n\nconst CSS_STRATEGIES = [\"tailwind\", \"global\", \"unknown\"] as const;\nconst DIAGNOSTIC_LEVELS = [\"off\", \"info\", \"warn\", \"error\"] as const;\nconst ACCESS_STYLES = [\"locals\", \"namespace\", \"either\"] as const;\n\nconst DEFAULT_DIALECT_TOKENS: NormalizedCollieDialectTokens = {\n if: { preferred: \"@if\", allow: [\"@if\"], onDisallowed: \"error\" },\n else: { preferred: \"@else\", allow: [\"@else\"], onDisallowed: \"error\" },\n elseIf: { preferred: \"@elseIf\", allow: [\"@elseIf\"], onDisallowed: \"error\" },\n for: { preferred: \"@for\", allow: [\"@for\"], onDisallowed: \"error\" },\n id: {\n preferred: \"id\",\n allow: [\"#id\", \"#id:\", \"#id=\", \"id\", \"id:\", \"id=\"],\n onDisallowed: \"warn\"\n }\n};\n\nfunction normalizeCssOptions(input: CollieCssOptions | undefined): NormalizedCollieCssOptions {\n if (input !== undefined && !isPlainObject(input)) {\n throw new Error(`Invalid \"css\": expected an object.`);\n }\n const strategy = normalizeEnum(input?.strategy, \"css.strategy\", CSS_STRATEGIES, \"unknown\");\n if (input?.diagnostics !== undefined && !isPlainObject(input.diagnostics)) {\n throw new Error(`Invalid \"css.diagnostics\": expected an object.`);\n }\n const unknownClassDefault = strategy === \"global\" ? \"warn\" : \"off\";\n const unknownClass = normalizeDiagnosticLevel(\n input?.diagnostics?.unknownClass,\n \"css.diagnostics.unknownClass\",\n unknownClassDefault\n );\n\n return {\n strategy,\n diagnostics: {\n unknownClass\n }\n };\n}\n\nfunction normalizeDialectOptions(input: CollieDialectOptions | undefined): NormalizedCollieDialectOptions {\n if (input !== undefined && !isPlainObject(input)) {\n throw new Error(`Invalid \"dialect\": expected an object.`);\n }\n\n const tokens = normalizeTokenRules(input?.tokens);\n const normalizeOnFormat = normalizeBoolean(input?.normalizeOnFormat, \"dialect.normalizeOnFormat\", true);\n const normalizeOnBuild = normalizeBoolean(input?.normalizeOnBuild, \"dialect.normalizeOnBuild\", false);\n const props = normalizeDialectProps(input?.props);\n\n return {\n tokens,\n normalizeOnFormat,\n normalizeOnBuild,\n props\n };\n}\n\nfunction normalizeTokenRules(input: CollieDialectOptions[\"tokens\"] | undefined): NormalizedCollieDialectTokens {\n if (input !== undefined && !isPlainObject(input)) {\n throw new Error(`Invalid \"dialect.tokens\": expected an object.`);\n }\n\n const normalized = {} as NormalizedCollieDialectTokens;\n const kinds = Object.keys(DEFAULT_DIALECT_TOKENS) as CollieDialectTokenKind[];\n\n for (const kind of kinds) {\n const rule = input?.[kind];\n normalized[kind] = normalizeTokenRule(kind, rule, DEFAULT_DIALECT_TOKENS[kind]);\n }\n\n return normalized;\n}\n\nfunction normalizeTokenRule(\n kind: CollieDialectTokenKind,\n rule: CollieDialectTokenRule | undefined,\n defaults: NormalizedCollieDialectTokenRule\n): NormalizedCollieDialectTokenRule {\n if (rule !== undefined && !isPlainObject(rule)) {\n throw new Error(`Invalid \"dialect.tokens.${kind}\": expected an object.`);\n }\n\n const preferred = normalizeString(\n rule?.preferred,\n `dialect.tokens.${kind}.preferred`,\n defaults.preferred\n );\n const allow = normalizeStringArray(\n rule?.allow,\n `dialect.tokens.${kind}.allow`,\n defaults.allow\n );\n const onDisallowed = normalizeDiagnosticLevel(\n rule?.onDisallowed,\n `dialect.tokens.${kind}.onDisallowed`,\n defaults.onDisallowed\n );\n const normalizedAllow = normalizeAllowList(allow, preferred);\n\n return {\n preferred,\n allow: normalizedAllow,\n onDisallowed\n };\n}\n\nfunction normalizeDialectProps(\n input: CollieDialectOptions[\"props\"] | undefined\n): NormalizedCollieDialectPropsOptions {\n if (input !== undefined && !isPlainObject(input)) {\n throw new Error(`Invalid \"dialect.props\": expected an object.`);\n }\n\n const allowPropsNamespace = normalizeBoolean(\n input?.allowPropsNamespace,\n \"dialect.props.allowPropsNamespace\",\n true\n );\n const allowDeclaredLocals = normalizeBoolean(\n input?.allowDeclaredLocals,\n \"dialect.props.allowDeclaredLocals\",\n true\n );\n const requireDeclarationForLocals = normalizeBoolean(\n input?.requireDeclarationForLocals,\n \"dialect.props.requireDeclarationForLocals\",\n allowDeclaredLocals\n );\n if (!allowDeclaredLocals && requireDeclarationForLocals) {\n throw new Error(\n `Invalid \"dialect.props.requireDeclarationForLocals\": cannot be true when allowDeclaredLocals is false.`\n );\n }\n\n if (input?.requirePropsBlockWhen !== undefined && !isPlainObject(input.requirePropsBlockWhen)) {\n throw new Error(`Invalid \"dialect.props.requirePropsBlockWhen\": expected an object.`);\n }\n const requirePropsBlockWhenEnabled = normalizeBoolean(\n input?.requirePropsBlockWhen?.enabled,\n \"dialect.props.requirePropsBlockWhen.enabled\",\n false\n );\n const requirePropsBlockWhenMin = normalizePositiveInteger(\n input?.requirePropsBlockWhen?.minUniquePropsUsed,\n \"dialect.props.requirePropsBlockWhen.minUniquePropsUsed\",\n 2\n );\n const requirePropsBlockWhenSeverity = normalizeDiagnosticLevel(\n input?.requirePropsBlockWhen?.severity,\n \"dialect.props.requirePropsBlockWhen.severity\",\n \"warn\"\n );\n\n const preferAccessStyle = normalizeEnum(\n input?.preferAccessStyle,\n \"dialect.props.preferAccessStyle\",\n ACCESS_STYLES,\n \"either\"\n );\n\n if (input?.diagnostics !== undefined && !isPlainObject(input.diagnostics)) {\n throw new Error(`Invalid \"dialect.props.diagnostics\": expected an object.`);\n }\n const missingDeclaration = normalizeDiagnosticLevel(\n input?.diagnostics?.missingDeclaration,\n \"dialect.props.diagnostics.missingDeclaration\",\n \"error\"\n );\n const unusedDeclaration = normalizeDiagnosticLevel(\n input?.diagnostics?.unusedDeclaration,\n \"dialect.props.diagnostics.unusedDeclaration\",\n \"warn\"\n );\n const style = normalizeDiagnosticLevel(\n input?.diagnostics?.style,\n \"dialect.props.diagnostics.style\",\n \"info\"\n );\n\n return {\n allowPropsNamespace,\n allowDeclaredLocals,\n requireDeclarationForLocals,\n requirePropsBlockWhen: {\n enabled: requirePropsBlockWhenEnabled,\n minUniquePropsUsed: requirePropsBlockWhenMin,\n severity: requirePropsBlockWhenSeverity\n },\n preferAccessStyle,\n diagnostics: {\n missingDeclaration,\n unusedDeclaration,\n style\n }\n };\n}\n\nfunction normalizeBoolean(value: unknown, path: string, fallback: boolean): boolean {\n if (value === undefined) {\n return fallback;\n }\n if (typeof value !== \"boolean\") {\n throw new Error(`Invalid \"${path}\": expected a boolean.`);\n }\n return value;\n}\n\nfunction normalizePositiveInteger(value: unknown, path: string, fallback: number): number {\n if (value === undefined) {\n return fallback;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0 || Math.floor(value) !== value) {\n throw new Error(`Invalid \"${path}\": expected a positive integer.`);\n }\n return value;\n}\n\nfunction normalizeEnum<T extends string>(\n value: unknown,\n path: string,\n allowed: readonly T[],\n fallback: T\n): T {\n if (value === undefined) {\n return fallback;\n }\n if (typeof value !== \"string\" || !allowed.includes(value as T)) {\n throw new Error(`Invalid \"${path}\": expected one of ${allowed.join(\", \")}.`);\n }\n return value as T;\n}\n\nfunction normalizeDiagnosticLevel(\n value: unknown,\n path: string,\n fallback: CollieDiagnosticLevel\n): CollieDiagnosticLevel {\n return normalizeEnum(value, path, DIAGNOSTIC_LEVELS, fallback);\n}\n\nfunction normalizeString(value: unknown, path: string, fallback: string): string {\n if (value === undefined) {\n return fallback;\n }\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`Invalid \"${path}\": expected a non-empty string.`);\n }\n return value;\n}\n\nfunction normalizeStringArray(value: unknown, path: string, fallback: string[]): string[] {\n if (value === undefined) {\n return [...fallback];\n }\n if (!Array.isArray(value)) {\n throw new Error(`Invalid \"${path}\": expected an array of strings.`);\n }\n for (const entry of value) {\n if (typeof entry !== \"string\" || entry.trim().length === 0) {\n throw new Error(`Invalid \"${path}\": entries must be non-empty strings.`);\n }\n }\n return [...value];\n}\n\nfunction normalizeAllowList(allow: string[], preferred: string): string[] {\n const allowSet = new Set(allow);\n allowSet.add(preferred);\n const normalized = Array.from(allowSet);\n normalized.sort();\n return normalized;\n}\n\nfunction isPlainObject(value: unknown): boolean {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n"],"mappings":"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","names":["path","path","path","rawConfig"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@collie-lang/config",
3
- "version": "1.1.1",
3
+ "version": "1.2.1",
4
4
  "description": "Shared configuration types and helpers for Collie.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -20,18 +20,24 @@
20
20
  "publishConfig": {
21
21
  "access": "public"
22
22
  },
23
- "dependencies": {},
24
- "devDependencies": {
25
- "rimraf": "^6.0.1",
26
- "tsup": "^8.3.5",
27
- "tsx": "^4.21.0",
28
- "typescript": "^5.7.2"
23
+ "engines": {
24
+ "node": ">=18"
25
+ },
26
+ "sideEffects": false,
27
+ "dependencies": {
28
+ "tsx": "^4.21.0"
29
29
  },
30
30
  "scripts": {
31
31
  "build": "tsup",
32
32
  "dev": "tsup --watch",
33
33
  "clean": "rimraf dist",
34
+ "prepack": "pnpm run build",
34
35
  "typecheck": "tsc -p tsconfig.json --noEmit",
35
36
  "lint": "echo \"(mvp) no lint configured\""
37
+ },
38
+ "devDependencies": {
39
+ "rimraf": "^6.0.1",
40
+ "tsup": "^8.3.5",
41
+ "typescript": "^5.7.2"
36
42
  }
37
- }
43
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 Collie Coders
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.