@cmflow/source-pack 3.21.0 → 3.22.0
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/README.md
CHANGED
|
@@ -51,7 +51,7 @@ import { defineConfig } from "@cmflow/source-pack";
|
|
|
51
51
|
|
|
52
52
|
export default defineConfig({
|
|
53
53
|
outputDir: "./tmp/source-pack",
|
|
54
|
-
repository: { provider: "github", owner: "
|
|
54
|
+
repository: { provider: "github", owner: "acme", name: "example-api" },
|
|
55
55
|
// GitLab: { provider: "gitlab", projectId: "group/project" (or 1234), apiUrl: "https://gitlab.example.com/api/v4" }
|
|
56
56
|
sources: {
|
|
57
57
|
include: ["**/*.{ts,tsx,js,json,yaml,yml,md,feature}"],
|
|
@@ -60,9 +60,9 @@ export default defineConfig({
|
|
|
60
60
|
},
|
|
61
61
|
chunking: { lines: 100, overlap: 15 },
|
|
62
62
|
embedding: {
|
|
63
|
-
baseUrl: "https://
|
|
64
|
-
model: "text-embedding-3-small
|
|
65
|
-
fallbackModels: ["text-embedding-3-small-
|
|
63
|
+
baseUrl: "https://litellm.example.com",
|
|
64
|
+
model: "text-embedding-3-small",
|
|
65
|
+
fallbackModels: ["text-embedding-3-small-fallback-1", "text-embedding-3-small-fallback-2"],
|
|
66
66
|
referenceModel: "text-embedding-3-small",
|
|
67
67
|
dimensions: 1536,
|
|
68
68
|
batchSize: 64,
|
package/dist/bin/source-pack.mjs
CHANGED
|
@@ -2988,7 +2988,7 @@ function run(action) {
|
|
|
2988
2988
|
function registerCommands(program) {
|
|
2989
2989
|
const configPath = () => path.resolve(process.cwd(), program.opts().config);
|
|
2990
2990
|
program.command("init").description("Create a default source-pack.config.ts (repository deduced from the Git remote)").option("--force", "Overwrite an existing config", false).action((options) => run(async () => {
|
|
2991
|
-
const { initConfig } = await import("../initConfig-
|
|
2991
|
+
const { initConfig } = await import("../initConfig-Cy7oMMxo.mjs");
|
|
2992
2992
|
const result = await initConfig({
|
|
2993
2993
|
configPath: configPath(),
|
|
2994
2994
|
force: options.force
|
package/dist/index.d.mts
CHANGED
|
@@ -88,7 +88,7 @@ interface SourceChunk {
|
|
|
88
88
|
//#region src/interfaces/SourcePackManifest.d.ts
|
|
89
89
|
interface SourcePackProject {
|
|
90
90
|
provider: RepositoryProvider;
|
|
91
|
-
/** Stable project identifier, e.g. `github:
|
|
91
|
+
/** Stable project identifier, e.g. `github:acme/example-api` or `gitlab:1234`. */
|
|
92
92
|
id: string;
|
|
93
93
|
owner?: string;
|
|
94
94
|
name?: string;
|
|
@@ -140,9 +140,9 @@ export default defineConfig({
|
|
|
140
140
|
},
|
|
141
141
|
chunking: { lines: ${100}, overlap: ${15} },
|
|
142
142
|
embedding: {
|
|
143
|
-
baseUrl: "https://
|
|
144
|
-
model: "text-embedding-3-small
|
|
145
|
-
fallbackModels: ["text-embedding-3-small-
|
|
143
|
+
baseUrl: "https://litellm.example.com",
|
|
144
|
+
model: "text-embedding-3-small",
|
|
145
|
+
fallbackModels: ["text-embedding-3-small-fallback-1", "text-embedding-3-small-fallback-2"],
|
|
146
146
|
referenceModel: "text-embedding-3-small",
|
|
147
147
|
dimensions: ${DEFAULT_DIMENSIONS},
|
|
148
148
|
batchSize: ${64}
|
|
@@ -181,4 +181,4 @@ async function initConfig({ configPath, force = false }) {
|
|
|
181
181
|
|
|
182
182
|
//#endregion
|
|
183
183
|
export { initConfig };
|
|
184
|
-
//# sourceMappingURL=initConfig-
|
|
184
|
+
//# sourceMappingURL=initConfig-Cy7oMMxo.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initConfig-DawW5Lht.mjs","names":[],"sources":["../src/git/parseRemoteUrl.ts","../src/init/detectProjectType.ts","../src/init/projectPresets.ts","../src/init/generateConfigSource.ts","../src/commands/initConfig.ts"],"sourcesContent":["import type { RepositoryProvider } from \"../config/interfaces/UserConfig\";\n\nexport interface ParsedRemote {\n provider: RepositoryProvider;\n host: string;\n owner: string;\n name: string;\n}\n\n/**\n * Parses an SSH (`git@host:owner/name.git`, `ssh://git@host:22/owner/name.git`) or HTTPS remote URL.\n * GitLab owners may contain subgroups (`group/sub`). Returns undefined for unknown hosts.\n */\nexport function parseRemoteUrl(remote: string): ParsedRemote | undefined {\n const trimmed = remote.trim();\n const scp = /^(?:[\\w.-]+@)?([\\w.-]+):(?!\\/\\/)(.+)$/.exec(trimmed);\n let host: string;\n let pathname: string;\n\n if (scp && !/^[a-z]+:\\/\\//i.test(trimmed)) {\n host = scp[1]!;\n pathname = scp[2]!;\n } else {\n try {\n const url = new URL(trimmed);\n host = url.hostname;\n pathname = url.pathname;\n } catch {\n return undefined;\n }\n }\n\n const segments = pathname\n .replace(/\\.git\\/?$/, \"\")\n .split(\"/\")\n .filter(Boolean);\n\n if (segments.length < 2) {\n return undefined;\n }\n\n const provider: RepositoryProvider | undefined = /(^|\\.)github\\./i.test(host) ? \"github\" : /gitlab/i.test(host) ? \"gitlab\" : undefined;\n\n if (!provider) {\n return undefined;\n }\n\n return { provider, host, owner: segments.slice(0, -1).join(\"/\"), name: segments.at(-1)! };\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\n\nexport type ProjectType = \"node\" | \"python\" | \"jvm\" | \"go\" | \"generic\";\n\nconst MARKERS: Array<[ProjectType, string[]]> = [\n [\"node\", [\"package.json\"]],\n [\"python\", [\"pyproject.toml\", \"requirements.txt\", \"setup.py\"]],\n [\"jvm\", [\"pom.xml\", \"build.gradle\", \"build.gradle.kts\"]],\n [\"go\", [\"go.mod\"]]\n];\n\nexport function detectProjectType(directory: string): ProjectType {\n return MARKERS.find(([, files]) => files.some((file) => existsSync(path.join(directory, file))))?.[0] ?? \"generic\";\n}\n","import {\n BUILD_OUTPUT_DIRS,\n DEFAULT_EXCLUDE,\n DEFAULT_INCLUDE,\n LOCKFILES_BY_ECOSYSTEM,\n NODE_DEPENDENCY_DIRS,\n TEST_FILES_BY_ECOSYSTEM\n} from \"../config/defaults\";\nimport type { ProjectType } from \"./detectProjectType\";\n\nexport interface ProjectPreset {\n include: string[];\n exclude: string[];\n}\n\nexport const PROJECT_PRESETS: Record<ProjectType, ProjectPreset> = {\n node: {\n include: [\"**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs,json,yaml,yml,md,feature,graphql}\"],\n exclude: [...NODE_DEPENDENCY_DIRS, ...BUILD_OUTPUT_DIRS, ...LOCKFILES_BY_ECOSYSTEM.node, ...TEST_FILES_BY_ECOSYSTEM.node]\n },\n python: {\n include: [\"**/*.{py,pyi,toml,cfg,ini,json,yaml,yml,md}\"],\n exclude: [\n \"**/.venv/**\",\n \"**/venv/**\",\n \"**/__pycache__/**\",\n ...BUILD_OUTPUT_DIRS,\n ...LOCKFILES_BY_ECOSYSTEM.python,\n ...TEST_FILES_BY_ECOSYSTEM.python\n ]\n },\n jvm: {\n include: [\"**/*.{java,kt,kts,groovy,gradle,xml,properties,json,yaml,yml,md}\"],\n exclude: [\"**/target/**\", \"**/.gradle/**\", ...BUILD_OUTPUT_DIRS, ...LOCKFILES_BY_ECOSYSTEM.jvm, ...TEST_FILES_BY_ECOSYSTEM.jvm]\n },\n go: {\n include: [\"**/*.{go,mod,json,yaml,yml,md,sql}\"],\n exclude: [\"**/vendor/**\", \"**/bin/**\", ...BUILD_OUTPUT_DIRS, ...LOCKFILES_BY_ECOSYSTEM.go, ...TEST_FILES_BY_ECOSYSTEM.go]\n },\n generic: { include: DEFAULT_INCLUDE, exclude: DEFAULT_EXCLUDE }\n};\n","import {\n DEFAULT_API_KEY_ENV,\n DEFAULT_BATCH_SIZE,\n DEFAULT_CHUNK_LINES,\n DEFAULT_CHUNK_OVERLAP,\n DEFAULT_DIMENSIONS\n} from \"../config/defaults\";\nimport {\n DEFAULT_ASSET_NAME_TEMPLATE,\n DEFAULT_GITHUB_API_URL,\n DEFAULT_GITLAB_API_URL,\n DEFAULT_OUTPUT_DIR,\n DEFAULT_TAG_TEMPLATE,\n GITHUB_TOKEN_ENV,\n GITLAB_TOKEN_ENV\n} from \"../constants\";\nimport type { ParsedRemote } from \"../git/parseRemoteUrl\";\nimport type { ProjectType } from \"./detectProjectType\";\nimport { PROJECT_PRESETS } from \"./projectPresets\";\n\nexport interface GenerateConfigSourceOptions {\n remote?: ParsedRemote;\n projectType: ProjectType;\n}\n\nfunction list(values: string[], indent: string): string {\n return `[\\n${values.map((value) => `${indent} ${JSON.stringify(value)}`).join(\",\\n\")}\\n${indent}]`;\n}\n\nfunction apiUrlLine(remote: ParsedRemote | undefined): string {\n if (remote?.provider === \"gitlab\") {\n return remote.host === \"gitlab.com\"\n ? `// apiUrl: ${JSON.stringify(DEFAULT_GITLAB_API_URL)}`\n : `apiUrl: ${JSON.stringify(`https://${remote.host}/api/v4`)}`;\n }\n\n return remote && remote.host !== \"github.com\"\n ? `apiUrl: ${JSON.stringify(`https://${remote.host}/api/v3`)}`\n : `// apiUrl: ${JSON.stringify(DEFAULT_GITHUB_API_URL)}`;\n}\n\nfunction repositoryBlock(remote: ParsedRemote | undefined): string {\n const fields = [\n `provider: ${JSON.stringify(remote?.provider ?? \"github\")}`,\n `owner: ${JSON.stringify(remote?.owner ?? \"TODO-owner\")}`,\n `name: ${JSON.stringify(remote?.name ?? \"TODO-repository\")}`\n ];\n const apiUrl = apiUrlLine(remote);\n const lines = apiUrl.startsWith(\"//\") ? [fields.join(\",\\n \"), apiUrl] : [[...fields, apiUrl].join(\",\\n \")];\n\n return `{\\n ${lines.join(\"\\n \")}\\n }`;\n}\n\n/** Source of a default `source-pack.config.ts`, deduced from the Git remote and the project type. */\nexport function generateConfigSource({ remote, projectType }: GenerateConfigSourceOptions): string {\n const preset = PROJECT_PRESETS[projectType];\n\n return `import { defineConfig } from \"@cmflow/source-pack\";\n\n// Secrets are read from the environment only: ${DEFAULT_API_KEY_ENV} (embeddings), ${remote?.provider === \"gitlab\" ? GITLAB_TOKEN_ENV : GITHUB_TOKEN_ENV} (publish).\nexport default defineConfig({\n outputDir: ${JSON.stringify(DEFAULT_OUTPUT_DIR)},\n repository: ${repositoryBlock(remote)},\n sources: {\n include: ${list(preset.include, \" \")},\n // Adjust to the project: generated data, fixtures, mocks, vendored code...\n exclude: ${list(preset.exclude, \" \")}\n },\n chunking: { lines: ${DEFAULT_CHUNK_LINES}, overlap: ${DEFAULT_CHUNK_OVERLAP} },\n embedding: {\n baseUrl: \"https://apim-prdaiplatform-frc.azure-api.net/litellm-api\",\n model: \"text-embedding-3-small-gmdt\",\n fallbackModels: [\"text-embedding-3-small-swc-gmdt\", \"text-embedding-3-small-eus2-gmdt\"],\n referenceModel: \"text-embedding-3-small\",\n dimensions: ${DEFAULT_DIMENSIONS},\n batchSize: ${DEFAULT_BATCH_SIZE}\n },\n publish: {\n tag: ${JSON.stringify(DEFAULT_TAG_TEMPLATE)},\n assetName: ${JSON.stringify(DEFAULT_ASSET_NAME_TEMPLATE)}\n }\n});\n`;\n}\n","import { access, mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { GitRepository } from \"../git/GitRepository\";\nimport { type ParsedRemote, parseRemoteUrl } from \"../git/parseRemoteUrl\";\nimport { detectProjectType, type ProjectType } from \"../init/detectProjectType\";\nimport { generateConfigSource } from \"../init/generateConfigSource\";\n\nexport interface InitConfigOptions {\n configPath: string;\n force?: boolean;\n}\n\nexport interface InitConfigResult {\n configPath: string;\n remote?: ParsedRemote;\n projectType: ProjectType;\n}\n\n/** Writes a default `source-pack.config.ts` next to `configPath`, deduced from the Git remote `origin`. */\nexport async function initConfig({ configPath, force = false }: InitConfigOptions): Promise<InitConfigResult> {\n const directory = path.dirname(configPath);\n\n if (!force) {\n const exists = await access(configPath).then(\n () => true,\n () => false\n );\n\n if (exists) {\n throw new Error(`${configPath} already exists. Use --force to overwrite it.`);\n }\n }\n\n const repository = await GitRepository.open(directory).catch(() => undefined);\n const remoteUrl = await repository?.remoteUrl();\n const remote = remoteUrl ? parseRemoteUrl(remoteUrl) : undefined;\n const projectType = detectProjectType(repository?.root ?? directory);\n\n await mkdir(directory, { recursive: true });\n await writeFile(configPath, generateConfigSource({ remote, projectType }), \"utf8\");\n\n return { configPath, remote, projectType };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"initConfig-Cy7oMMxo.mjs","names":[],"sources":["../src/git/parseRemoteUrl.ts","../src/init/detectProjectType.ts","../src/init/projectPresets.ts","../src/init/generateConfigSource.ts","../src/commands/initConfig.ts"],"sourcesContent":["import type { RepositoryProvider } from \"../config/interfaces/UserConfig\";\n\nexport interface ParsedRemote {\n provider: RepositoryProvider;\n host: string;\n owner: string;\n name: string;\n}\n\n/**\n * Parses an SSH (`git@host:owner/name.git`, `ssh://git@host:22/owner/name.git`) or HTTPS remote URL.\n * GitLab owners may contain subgroups (`group/sub`). Returns undefined for unknown hosts.\n */\nexport function parseRemoteUrl(remote: string): ParsedRemote | undefined {\n const trimmed = remote.trim();\n const scp = /^(?:[\\w.-]+@)?([\\w.-]+):(?!\\/\\/)(.+)$/.exec(trimmed);\n let host: string;\n let pathname: string;\n\n if (scp && !/^[a-z]+:\\/\\//i.test(trimmed)) {\n host = scp[1]!;\n pathname = scp[2]!;\n } else {\n try {\n const url = new URL(trimmed);\n host = url.hostname;\n pathname = url.pathname;\n } catch {\n return undefined;\n }\n }\n\n const segments = pathname\n .replace(/\\.git\\/?$/, \"\")\n .split(\"/\")\n .filter(Boolean);\n\n if (segments.length < 2) {\n return undefined;\n }\n\n const provider: RepositoryProvider | undefined = /(^|\\.)github\\./i.test(host) ? \"github\" : /gitlab/i.test(host) ? \"gitlab\" : undefined;\n\n if (!provider) {\n return undefined;\n }\n\n return { provider, host, owner: segments.slice(0, -1).join(\"/\"), name: segments.at(-1)! };\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\n\nexport type ProjectType = \"node\" | \"python\" | \"jvm\" | \"go\" | \"generic\";\n\nconst MARKERS: Array<[ProjectType, string[]]> = [\n [\"node\", [\"package.json\"]],\n [\"python\", [\"pyproject.toml\", \"requirements.txt\", \"setup.py\"]],\n [\"jvm\", [\"pom.xml\", \"build.gradle\", \"build.gradle.kts\"]],\n [\"go\", [\"go.mod\"]]\n];\n\nexport function detectProjectType(directory: string): ProjectType {\n return MARKERS.find(([, files]) => files.some((file) => existsSync(path.join(directory, file))))?.[0] ?? \"generic\";\n}\n","import {\n BUILD_OUTPUT_DIRS,\n DEFAULT_EXCLUDE,\n DEFAULT_INCLUDE,\n LOCKFILES_BY_ECOSYSTEM,\n NODE_DEPENDENCY_DIRS,\n TEST_FILES_BY_ECOSYSTEM\n} from \"../config/defaults\";\nimport type { ProjectType } from \"./detectProjectType\";\n\nexport interface ProjectPreset {\n include: string[];\n exclude: string[];\n}\n\nexport const PROJECT_PRESETS: Record<ProjectType, ProjectPreset> = {\n node: {\n include: [\"**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs,json,yaml,yml,md,feature,graphql}\"],\n exclude: [...NODE_DEPENDENCY_DIRS, ...BUILD_OUTPUT_DIRS, ...LOCKFILES_BY_ECOSYSTEM.node, ...TEST_FILES_BY_ECOSYSTEM.node]\n },\n python: {\n include: [\"**/*.{py,pyi,toml,cfg,ini,json,yaml,yml,md}\"],\n exclude: [\n \"**/.venv/**\",\n \"**/venv/**\",\n \"**/__pycache__/**\",\n ...BUILD_OUTPUT_DIRS,\n ...LOCKFILES_BY_ECOSYSTEM.python,\n ...TEST_FILES_BY_ECOSYSTEM.python\n ]\n },\n jvm: {\n include: [\"**/*.{java,kt,kts,groovy,gradle,xml,properties,json,yaml,yml,md}\"],\n exclude: [\"**/target/**\", \"**/.gradle/**\", ...BUILD_OUTPUT_DIRS, ...LOCKFILES_BY_ECOSYSTEM.jvm, ...TEST_FILES_BY_ECOSYSTEM.jvm]\n },\n go: {\n include: [\"**/*.{go,mod,json,yaml,yml,md,sql}\"],\n exclude: [\"**/vendor/**\", \"**/bin/**\", ...BUILD_OUTPUT_DIRS, ...LOCKFILES_BY_ECOSYSTEM.go, ...TEST_FILES_BY_ECOSYSTEM.go]\n },\n generic: { include: DEFAULT_INCLUDE, exclude: DEFAULT_EXCLUDE }\n};\n","import {\n DEFAULT_API_KEY_ENV,\n DEFAULT_BATCH_SIZE,\n DEFAULT_CHUNK_LINES,\n DEFAULT_CHUNK_OVERLAP,\n DEFAULT_DIMENSIONS\n} from \"../config/defaults\";\nimport {\n DEFAULT_ASSET_NAME_TEMPLATE,\n DEFAULT_GITHUB_API_URL,\n DEFAULT_GITLAB_API_URL,\n DEFAULT_OUTPUT_DIR,\n DEFAULT_TAG_TEMPLATE,\n GITHUB_TOKEN_ENV,\n GITLAB_TOKEN_ENV\n} from \"../constants\";\nimport type { ParsedRemote } from \"../git/parseRemoteUrl\";\nimport type { ProjectType } from \"./detectProjectType\";\nimport { PROJECT_PRESETS } from \"./projectPresets\";\n\nexport interface GenerateConfigSourceOptions {\n remote?: ParsedRemote;\n projectType: ProjectType;\n}\n\nfunction list(values: string[], indent: string): string {\n return `[\\n${values.map((value) => `${indent} ${JSON.stringify(value)}`).join(\",\\n\")}\\n${indent}]`;\n}\n\nfunction apiUrlLine(remote: ParsedRemote | undefined): string {\n if (remote?.provider === \"gitlab\") {\n return remote.host === \"gitlab.com\"\n ? `// apiUrl: ${JSON.stringify(DEFAULT_GITLAB_API_URL)}`\n : `apiUrl: ${JSON.stringify(`https://${remote.host}/api/v4`)}`;\n }\n\n return remote && remote.host !== \"github.com\"\n ? `apiUrl: ${JSON.stringify(`https://${remote.host}/api/v3`)}`\n : `// apiUrl: ${JSON.stringify(DEFAULT_GITHUB_API_URL)}`;\n}\n\nfunction repositoryBlock(remote: ParsedRemote | undefined): string {\n const fields = [\n `provider: ${JSON.stringify(remote?.provider ?? \"github\")}`,\n `owner: ${JSON.stringify(remote?.owner ?? \"TODO-owner\")}`,\n `name: ${JSON.stringify(remote?.name ?? \"TODO-repository\")}`\n ];\n const apiUrl = apiUrlLine(remote);\n const lines = apiUrl.startsWith(\"//\") ? [fields.join(\",\\n \"), apiUrl] : [[...fields, apiUrl].join(\",\\n \")];\n\n return `{\\n ${lines.join(\"\\n \")}\\n }`;\n}\n\n/** Source of a default `source-pack.config.ts`, deduced from the Git remote and the project type. */\nexport function generateConfigSource({ remote, projectType }: GenerateConfigSourceOptions): string {\n const preset = PROJECT_PRESETS[projectType];\n\n return `import { defineConfig } from \"@cmflow/source-pack\";\n\n// Secrets are read from the environment only: ${DEFAULT_API_KEY_ENV} (embeddings), ${remote?.provider === \"gitlab\" ? GITLAB_TOKEN_ENV : GITHUB_TOKEN_ENV} (publish).\nexport default defineConfig({\n outputDir: ${JSON.stringify(DEFAULT_OUTPUT_DIR)},\n repository: ${repositoryBlock(remote)},\n sources: {\n include: ${list(preset.include, \" \")},\n // Adjust to the project: generated data, fixtures, mocks, vendored code...\n exclude: ${list(preset.exclude, \" \")}\n },\n chunking: { lines: ${DEFAULT_CHUNK_LINES}, overlap: ${DEFAULT_CHUNK_OVERLAP} },\n embedding: {\n baseUrl: \"https://litellm.example.com\",\n model: \"text-embedding-3-small\",\n fallbackModels: [\"text-embedding-3-small-fallback-1\", \"text-embedding-3-small-fallback-2\"],\n referenceModel: \"text-embedding-3-small\",\n dimensions: ${DEFAULT_DIMENSIONS},\n batchSize: ${DEFAULT_BATCH_SIZE}\n },\n publish: {\n tag: ${JSON.stringify(DEFAULT_TAG_TEMPLATE)},\n assetName: ${JSON.stringify(DEFAULT_ASSET_NAME_TEMPLATE)}\n }\n});\n`;\n}\n","import { access, mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { GitRepository } from \"../git/GitRepository\";\nimport { type ParsedRemote, parseRemoteUrl } from \"../git/parseRemoteUrl\";\nimport { detectProjectType, type ProjectType } from \"../init/detectProjectType\";\nimport { generateConfigSource } from \"../init/generateConfigSource\";\n\nexport interface InitConfigOptions {\n configPath: string;\n force?: boolean;\n}\n\nexport interface InitConfigResult {\n configPath: string;\n remote?: ParsedRemote;\n projectType: ProjectType;\n}\n\n/** Writes a default `source-pack.config.ts` next to `configPath`, deduced from the Git remote `origin`. */\nexport async function initConfig({ configPath, force = false }: InitConfigOptions): Promise<InitConfigResult> {\n const directory = path.dirname(configPath);\n\n if (!force) {\n const exists = await access(configPath).then(\n () => true,\n () => false\n );\n\n if (exists) {\n throw new Error(`${configPath} already exists. Use --force to overwrite it.`);\n }\n }\n\n const repository = await GitRepository.open(directory).catch(() => undefined);\n const remoteUrl = await repository?.remoteUrl();\n const remote = remoteUrl ? parseRemoteUrl(remoteUrl) : undefined;\n const projectType = detectProjectType(repository?.root ?? directory);\n\n await mkdir(directory, { recursive: true });\n await writeFile(configPath, generateConfigSource({ remote, projectType }), \"utf8\");\n\n return { configPath, remote, projectType };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED