polen 0.3.1 → 0.4.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/build/cli/commands/create.d.ts +2 -0
- package/build/cli/commands/create.d.ts.map +1 -0
- package/build/cli/commands/create.js +78 -0
- package/build/cli/commands/create.js.map +1 -0
- package/build/cli/commands/open.js +1 -1
- package/build/cli/commands/open.js.map +1 -1
- package/package.json +2 -2
- package/src/cli/commands/create.ts +98 -0
- package/src/cli/commands/open.ts +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { Command } from '@molt/command';
|
|
2
|
+
import { Fs, Manifest, Name, Path, Str } from '@wollybeard/kit';
|
|
3
|
+
import consola from 'consola';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { $ } from 'zx';
|
|
6
|
+
const Examples = z.enum([`github`, `pokemon`]);
|
|
7
|
+
const args = Command
|
|
8
|
+
.create()
|
|
9
|
+
.parameter(`name`, z.string().default(() => Name.generate()).describe(`Defaults to a random name.`))
|
|
10
|
+
.parameter(`link`, z.boolean().default(false).describe(`When installing polen, do so as a link. You must have Polen globally linked on your machine.`))
|
|
11
|
+
.parameter(`example`, Examples.default(`pokemon`).describe(`The example to use to scaffold your project.`))
|
|
12
|
+
.parse();
|
|
13
|
+
const cwd = process.cwd();
|
|
14
|
+
const isCwdEmpty = await Fs.isEmptyDir(cwd);
|
|
15
|
+
const name = Str.Case.kebab(args.name);
|
|
16
|
+
const projectRoot = isCwdEmpty ? cwd : Path.join(cwd, name);
|
|
17
|
+
if (!isCwdEmpty) {
|
|
18
|
+
const isProjectRootExists = await Fs.exists(projectRoot);
|
|
19
|
+
const isEmpty = isProjectRootExists && await Fs.isEmptyDir(projectRoot);
|
|
20
|
+
if (isProjectRootExists && !isEmpty) {
|
|
21
|
+
consola.error(`Project root of name "${name}" already exists`);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
consola.info(`creating your project in ./${name}`);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
consola.info(`Current working directory is empty, creating your project here`);
|
|
28
|
+
}
|
|
29
|
+
// Scaffold Example
|
|
30
|
+
// Pull an example from the Polen repository
|
|
31
|
+
// Copy all the files to the project root
|
|
32
|
+
const repository = `https://github.com/the-guild-org/polen`;
|
|
33
|
+
const repoExampleDir = `examples/${args.example}`;
|
|
34
|
+
consola.info(`Scaffolding "${args.example}" example...`);
|
|
35
|
+
try {
|
|
36
|
+
// Create temporary directory
|
|
37
|
+
const { stdout: tmpDir } = await $ `mktemp -d`;
|
|
38
|
+
const tmpDirPath = tmpDir.trim();
|
|
39
|
+
try {
|
|
40
|
+
// Clone only the specific example directory using sparse checkout
|
|
41
|
+
await $({ quiet: true }) `git clone --depth 1 --filter=blob:none --sparse ${repository} ${tmpDirPath}`;
|
|
42
|
+
await $ `cd ${tmpDirPath} && git sparse-checkout set ${repoExampleDir}`;
|
|
43
|
+
const sourceExamplePath = Path.join(tmpDirPath, repoExampleDir);
|
|
44
|
+
// Verify the example exists
|
|
45
|
+
if (!await Fs.exists(sourceExamplePath)) {
|
|
46
|
+
throw new Error(`Example "${args.example}" not found in the repository`);
|
|
47
|
+
}
|
|
48
|
+
// Create project root directory if needed
|
|
49
|
+
await $ `mkdir -p ${projectRoot}`;
|
|
50
|
+
// Copy files excluding build artifacts and dependencies using rsync
|
|
51
|
+
await $ `rsync -av --exclude="node_modules/" --exclude="dist/" --exclude=".bundle-explorer/" --exclude="pnpm-lock.yaml" ${sourceExamplePath}/ ${projectRoot}/`;
|
|
52
|
+
consola.success(`Done`);
|
|
53
|
+
if (!isCwdEmpty) {
|
|
54
|
+
consola.success(`Your project is ready! Get Started:`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
// Clean up temporary directory
|
|
59
|
+
await $ `rm -rf ${tmpDirPath}`;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
consola.error(`Failed to scaffold example: ${error instanceof Error ? error.message : String(error)}`);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
// End Scaffold Example
|
|
67
|
+
// --------------------
|
|
68
|
+
await Manifest.resource.update((manifest) => {
|
|
69
|
+
manifest.name = name;
|
|
70
|
+
manifest.description = `A new project`;
|
|
71
|
+
manifest.packageManager = `pnpm@10.11.0`;
|
|
72
|
+
}, projectRoot);
|
|
73
|
+
if (args.link) {
|
|
74
|
+
await $ `pnpm link polen`;
|
|
75
|
+
}
|
|
76
|
+
console.log(``);
|
|
77
|
+
console.log(` cd ./${Path.relative(cwd, projectRoot)} && pnpm dev`);
|
|
78
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,7 @@ import { Command } from '@molt/command';
|
|
|
14
14
|
import { Err, Fs, Json, Path, Rec } from '@wollybeard/kit';
|
|
15
15
|
import { homedir } from 'node:os';
|
|
16
16
|
import { z } from 'zod';
|
|
17
|
-
import { defineConfig } from '../../
|
|
17
|
+
import { defineConfig } from '../../api/define-config.js';
|
|
18
18
|
const args = Command.create()
|
|
19
19
|
.parameter(`--introspection-headers --inh`, z
|
|
20
20
|
.string()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/cli/commands/open.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,cAAc;AACd;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM
|
|
1
|
+
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/cli/commands/open.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "polen",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A framework for delightful GraphQL developer portals",
|
|
6
6
|
"author": {
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"@swc/core": "^1.11.29",
|
|
61
61
|
"@types/jsesc": "^3.0.3",
|
|
62
62
|
"@vitejs/plugin-react": "^4.4.1",
|
|
63
|
-
"@wollybeard/kit": "^0.
|
|
63
|
+
"@wollybeard/kit": "^0.25.0",
|
|
64
64
|
"@wollybeard/projector": "^0.1.0",
|
|
65
65
|
"ansis": "^4.0.0",
|
|
66
66
|
"consola": "^3.4.2",
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { Command } from '@molt/command'
|
|
2
|
+
import { Fs, Manifest, Name, Path, Str } from '@wollybeard/kit'
|
|
3
|
+
import consola from 'consola'
|
|
4
|
+
import { z } from 'zod'
|
|
5
|
+
import { $ } from 'zx'
|
|
6
|
+
|
|
7
|
+
const Examples = z.enum([`github`, `pokemon`])
|
|
8
|
+
|
|
9
|
+
const args = Command
|
|
10
|
+
.create()
|
|
11
|
+
.parameter(`name`, z.string().default(() => Name.generate()).describe(`Defaults to a random name.`))
|
|
12
|
+
.parameter(
|
|
13
|
+
`link`,
|
|
14
|
+
z.boolean().default(false).describe(
|
|
15
|
+
`When installing polen, do so as a link. You must have Polen globally linked on your machine.`,
|
|
16
|
+
),
|
|
17
|
+
)
|
|
18
|
+
.parameter(`example`, Examples.default(`pokemon`).describe(`The example to use to scaffold your project.`))
|
|
19
|
+
.parse()
|
|
20
|
+
|
|
21
|
+
const cwd = process.cwd()
|
|
22
|
+
const isCwdEmpty = await Fs.isEmptyDir(cwd)
|
|
23
|
+
const name = Str.Case.kebab(args.name)
|
|
24
|
+
const projectRoot = isCwdEmpty ? cwd : Path.join(cwd, name)
|
|
25
|
+
|
|
26
|
+
if (!isCwdEmpty) {
|
|
27
|
+
const isProjectRootExists = await Fs.exists(projectRoot)
|
|
28
|
+
const isEmpty = isProjectRootExists && await Fs.isEmptyDir(projectRoot)
|
|
29
|
+
if (isProjectRootExists && !isEmpty) {
|
|
30
|
+
consola.error(`Project root of name "${name}" already exists`)
|
|
31
|
+
process.exit(1)
|
|
32
|
+
}
|
|
33
|
+
consola.info(`creating your project in ./${name}`)
|
|
34
|
+
} else {
|
|
35
|
+
consola.info(`Current working directory is empty, creating your project here`)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Scaffold Example
|
|
39
|
+
|
|
40
|
+
// Pull an example from the Polen repository
|
|
41
|
+
// Copy all the files to the project root
|
|
42
|
+
const repository = `https://github.com/the-guild-org/polen`
|
|
43
|
+
const repoExampleDir = `examples/${args.example}`
|
|
44
|
+
|
|
45
|
+
consola.info(`Scaffolding "${args.example}" example...`)
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
// Create temporary directory
|
|
49
|
+
const { stdout: tmpDir } = await $`mktemp -d`
|
|
50
|
+
const tmpDirPath = tmpDir.trim()
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
// Clone only the specific example directory using sparse checkout
|
|
54
|
+
await $({ quiet: true })`git clone --depth 1 --filter=blob:none --sparse ${repository} ${tmpDirPath}`
|
|
55
|
+
await $`cd ${tmpDirPath} && git sparse-checkout set ${repoExampleDir}`
|
|
56
|
+
|
|
57
|
+
const sourceExamplePath = Path.join(tmpDirPath, repoExampleDir)
|
|
58
|
+
|
|
59
|
+
// Verify the example exists
|
|
60
|
+
if (!await Fs.exists(sourceExamplePath)) {
|
|
61
|
+
throw new Error(`Example "${args.example}" not found in the repository`)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Create project root directory if needed
|
|
65
|
+
await $`mkdir -p ${projectRoot}`
|
|
66
|
+
|
|
67
|
+
// Copy files excluding build artifacts and dependencies using rsync
|
|
68
|
+
await $`rsync -av --exclude="node_modules/" --exclude="dist/" --exclude=".bundle-explorer/" --exclude="pnpm-lock.yaml" ${sourceExamplePath}/ ${projectRoot}/`
|
|
69
|
+
|
|
70
|
+
consola.success(`Done`)
|
|
71
|
+
|
|
72
|
+
if (!isCwdEmpty) {
|
|
73
|
+
consola.success(`Your project is ready! Get Started:`)
|
|
74
|
+
}
|
|
75
|
+
} finally {
|
|
76
|
+
// Clean up temporary directory
|
|
77
|
+
await $`rm -rf ${tmpDirPath}`
|
|
78
|
+
}
|
|
79
|
+
} catch (error) {
|
|
80
|
+
consola.error(`Failed to scaffold example: ${error instanceof Error ? error.message : String(error)}`)
|
|
81
|
+
process.exit(1)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// End Scaffold Example
|
|
85
|
+
// --------------------
|
|
86
|
+
|
|
87
|
+
await Manifest.resource.update((manifest) => {
|
|
88
|
+
manifest.name = name
|
|
89
|
+
manifest.description = `A new project`
|
|
90
|
+
manifest.packageManager = `pnpm@10.11.0`
|
|
91
|
+
}, projectRoot)
|
|
92
|
+
|
|
93
|
+
if (args.link) {
|
|
94
|
+
await $`pnpm link polen`
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
console.log(``)
|
|
98
|
+
console.log(` cd ./${Path.relative(cwd, projectRoot)} && pnpm dev`)
|
package/src/cli/commands/open.ts
CHANGED
|
@@ -16,7 +16,7 @@ import type { Fn } from '@wollybeard/kit'
|
|
|
16
16
|
import { Err, Fs, Json, Path, Rec } from '@wollybeard/kit'
|
|
17
17
|
import { homedir } from 'node:os'
|
|
18
18
|
import { z } from 'zod'
|
|
19
|
-
import { defineConfig } from '../../
|
|
19
|
+
import { defineConfig } from '../../api/define-config.js'
|
|
20
20
|
|
|
21
21
|
const args = Command.create()
|
|
22
22
|
.parameter(
|