@tidecloak/create-nextjs 0.0.1 → 0.0.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/dist/cjs/create.cjs +48 -15
- package/dist/cjs/create.js.map +1 -1
- package/dist/esm/create.js +48 -15
- package/dist/esm/create.js.map +1 -1
- package/init/tcinit.sh +1 -1
- package/package.json +1 -1
- package/template-js-app/app/home/page.jsx +16 -6
- package/template-js-app/init/tcinit.sh +1 -1
- package/template-ts-app/app/home/page.tsx +13 -3
- package/template-ts-app/init/tcinit.sh +1 -1
package/dist/cjs/create.cjs
CHANGED
|
@@ -9,6 +9,15 @@ const path_1 = __importDefault(require("path"));
|
|
|
9
9
|
const child_process_1 = require("child_process");
|
|
10
10
|
const enquirer_1 = __importDefault(require("enquirer"));
|
|
11
11
|
const { prompt } = enquirer_1.default;
|
|
12
|
+
function hasCommand(cmd) {
|
|
13
|
+
try {
|
|
14
|
+
(0, child_process_1.execSync)(`command -v ${cmd}`, { stdio: 'ignore' });
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
12
21
|
async function main() {
|
|
13
22
|
const [, , targetDir] = process.argv;
|
|
14
23
|
if (!targetDir) {
|
|
@@ -19,7 +28,7 @@ async function main() {
|
|
|
19
28
|
const { language } = await prompt({
|
|
20
29
|
type: 'select',
|
|
21
30
|
name: 'language',
|
|
22
|
-
message: '
|
|
31
|
+
message: 'Preferred app language?',
|
|
23
32
|
choices: ['TypeScript', 'JavaScript']
|
|
24
33
|
});
|
|
25
34
|
// 2. Scaffold template
|
|
@@ -34,11 +43,37 @@ async function main() {
|
|
|
34
43
|
const { initialize } = await prompt({
|
|
35
44
|
type: 'confirm',
|
|
36
45
|
name: 'initialize',
|
|
37
|
-
message: '
|
|
46
|
+
message: 'Initialize TideCloak now? Your server must be running.',
|
|
38
47
|
initial: true
|
|
39
48
|
});
|
|
40
|
-
if (initialize) {
|
|
41
|
-
|
|
49
|
+
if (!initialize) {
|
|
50
|
+
console.log('Initialization skipped.');
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// 4. Check prerequisites
|
|
54
|
+
let missing = ['curl', 'jq'].filter(cmd => !hasCommand(cmd));
|
|
55
|
+
if (missing.length > 0) {
|
|
56
|
+
console.warn(`Missing prerequisites: ${missing.join(', ')}`);
|
|
57
|
+
const { action } = await prompt({
|
|
58
|
+
type: 'input',
|
|
59
|
+
name: 'action',
|
|
60
|
+
message: `Please install the missing prerequisites (${missing.join(', ')}), then press ENTER to retry, or type 'skip' to skip initialization`
|
|
61
|
+
});
|
|
62
|
+
if (action.trim().toLowerCase() === 'skip') {
|
|
63
|
+
console.log('Initialization skipped.');
|
|
64
|
+
console.log(`"${targetDir}" is ready!`);
|
|
65
|
+
console.log(`"Start developing your app here: `);
|
|
66
|
+
console.log(` cd ${targetDir} && npm install`);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// retry
|
|
70
|
+
missing = ['curl', 'jq'].filter(cmd => !hasCommand(cmd));
|
|
71
|
+
if (missing.length > 0) {
|
|
72
|
+
console.warn(`Still missing: ${missing.join(', ')}. Skipping initialization.`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// 5. Collect config values
|
|
42
77
|
const { tideUrl } = await prompt({
|
|
43
78
|
type: 'input',
|
|
44
79
|
name: 'tideUrl',
|
|
@@ -49,43 +84,43 @@ async function main() {
|
|
|
49
84
|
const { realmName } = await prompt({
|
|
50
85
|
type: 'input',
|
|
51
86
|
name: 'realmName',
|
|
52
|
-
message: 'Realm name:',
|
|
87
|
+
message: 'TideCloak new Realm name:',
|
|
53
88
|
initial: 'nextjs-test',
|
|
54
89
|
validate: (input) => input.trim().length > 0 || 'Please enter a realm name'
|
|
55
90
|
});
|
|
56
91
|
const { clientName } = await prompt({
|
|
57
92
|
type: 'input',
|
|
58
93
|
name: 'clientName',
|
|
59
|
-
message: 'Client name:',
|
|
94
|
+
message: 'TideCloak new Client name:',
|
|
60
95
|
initial: 'myclient',
|
|
61
96
|
validate: (input) => input.trim().length > 0 || 'Please enter a client name'
|
|
62
97
|
});
|
|
63
98
|
const { clientAppUrl } = await prompt({
|
|
64
99
|
type: 'input',
|
|
65
100
|
name: 'clientAppUrl',
|
|
66
|
-
message: '
|
|
101
|
+
message: 'This App URL (e.g. http://localhost:3000):',
|
|
67
102
|
initial: 'http://localhost:3000',
|
|
68
103
|
validate: (input) => input.trim().length > 0 || 'Please enter your app URL'
|
|
69
104
|
});
|
|
70
105
|
const { kcUser } = await prompt({
|
|
71
106
|
type: 'input',
|
|
72
107
|
name: 'kcUser',
|
|
73
|
-
message: '
|
|
108
|
+
message: 'TideCloak bootstrap / master admin username:',
|
|
74
109
|
initial: 'admin',
|
|
75
110
|
validate: (input) => input.trim().length > 0 || 'Please enter a username'
|
|
76
111
|
});
|
|
77
112
|
const { kcPassword } = await prompt({
|
|
78
113
|
type: 'input',
|
|
79
114
|
name: 'kcPassword',
|
|
80
|
-
message: '
|
|
115
|
+
message: 'TideCloak bootstrap / master admin password:',
|
|
81
116
|
initial: 'password',
|
|
82
117
|
validate: (input) => input.trim().length > 0 || 'Please enter a password'
|
|
83
118
|
});
|
|
84
|
-
//
|
|
119
|
+
// 6. Run initialization script
|
|
85
120
|
const { runInit } = await prompt({
|
|
86
121
|
type: 'confirm',
|
|
87
122
|
name: 'runInit',
|
|
88
|
-
message: '
|
|
123
|
+
message: 'Ready to initialize TideCloak?',
|
|
89
124
|
initial: true
|
|
90
125
|
});
|
|
91
126
|
if (runInit) {
|
|
@@ -125,11 +160,9 @@ async function main() {
|
|
|
125
160
|
console.log(`To run init later: cd ${targetDir} && bash init/tcinit.sh`);
|
|
126
161
|
}
|
|
127
162
|
}
|
|
128
|
-
|
|
129
|
-
console.log('Initialization skipped.');
|
|
130
|
-
}
|
|
131
|
-
// 6. Final instructions
|
|
163
|
+
// 7. Final instructions
|
|
132
164
|
console.log(`"${targetDir}" is ready!`);
|
|
165
|
+
console.log("Proceed to run your app:");
|
|
133
166
|
console.log(`cd ${targetDir} && npm install && npm run dev`);
|
|
134
167
|
}
|
|
135
168
|
main().catch((err) => {
|
package/dist/cjs/create.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../create.ts"],"names":[],"mappings":";;;;;;AACA,4CAAmB;AACnB,gDAAuB;AACvB,iDAAwC;AACxC,wDAA+B;AAE/B,MAAM,EAAE,MAAM,EAAE,GAAG,kBAAQ,CAAA;AAE3B,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,EAAE,AAAD,EAAG,SAAS,CAAC,GAAG,OAAO,CAAC,IAAgB,CAAA;IAChD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAA;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,qBAAqB;IACrB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAA4C;QAC3E,IAAI,EAAK,QAAQ;QACjB,IAAI,EAAK,UAAU;QACnB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../create.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/create.js
CHANGED
|
@@ -4,6 +4,15 @@ import path from 'path';
|
|
|
4
4
|
import { execSync } from 'child_process';
|
|
5
5
|
import Enquirer from 'enquirer';
|
|
6
6
|
const { prompt } = Enquirer;
|
|
7
|
+
function hasCommand(cmd) {
|
|
8
|
+
try {
|
|
9
|
+
execSync(`command -v ${cmd}`, { stdio: 'ignore' });
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
7
16
|
async function main() {
|
|
8
17
|
const [, , targetDir] = process.argv;
|
|
9
18
|
if (!targetDir) {
|
|
@@ -14,7 +23,7 @@ async function main() {
|
|
|
14
23
|
const { language } = await prompt({
|
|
15
24
|
type: 'select',
|
|
16
25
|
name: 'language',
|
|
17
|
-
message: '
|
|
26
|
+
message: 'Preferred app language?',
|
|
18
27
|
choices: ['TypeScript', 'JavaScript']
|
|
19
28
|
});
|
|
20
29
|
// 2. Scaffold template
|
|
@@ -29,11 +38,37 @@ async function main() {
|
|
|
29
38
|
const { initialize } = await prompt({
|
|
30
39
|
type: 'confirm',
|
|
31
40
|
name: 'initialize',
|
|
32
|
-
message: '
|
|
41
|
+
message: 'Initialize TideCloak now? Your server must be running.',
|
|
33
42
|
initial: true
|
|
34
43
|
});
|
|
35
|
-
if (initialize) {
|
|
36
|
-
|
|
44
|
+
if (!initialize) {
|
|
45
|
+
console.log('Initialization skipped.');
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
// 4. Check prerequisites
|
|
49
|
+
let missing = ['curl', 'jq'].filter(cmd => !hasCommand(cmd));
|
|
50
|
+
if (missing.length > 0) {
|
|
51
|
+
console.warn(`Missing prerequisites: ${missing.join(', ')}`);
|
|
52
|
+
const { action } = await prompt({
|
|
53
|
+
type: 'input',
|
|
54
|
+
name: 'action',
|
|
55
|
+
message: `Please install the missing prerequisites (${missing.join(', ')}), then press ENTER to retry, or type 'skip' to skip initialization`
|
|
56
|
+
});
|
|
57
|
+
if (action.trim().toLowerCase() === 'skip') {
|
|
58
|
+
console.log('Initialization skipped.');
|
|
59
|
+
console.log(`"${targetDir}" is ready!`);
|
|
60
|
+
console.log(`"Start developing your app here: `);
|
|
61
|
+
console.log(` cd ${targetDir} && npm install`);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
// retry
|
|
65
|
+
missing = ['curl', 'jq'].filter(cmd => !hasCommand(cmd));
|
|
66
|
+
if (missing.length > 0) {
|
|
67
|
+
console.warn(`Still missing: ${missing.join(', ')}. Skipping initialization.`);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// 5. Collect config values
|
|
37
72
|
const { tideUrl } = await prompt({
|
|
38
73
|
type: 'input',
|
|
39
74
|
name: 'tideUrl',
|
|
@@ -44,43 +79,43 @@ async function main() {
|
|
|
44
79
|
const { realmName } = await prompt({
|
|
45
80
|
type: 'input',
|
|
46
81
|
name: 'realmName',
|
|
47
|
-
message: 'Realm name:',
|
|
82
|
+
message: 'TideCloak new Realm name:',
|
|
48
83
|
initial: 'nextjs-test',
|
|
49
84
|
validate: (input) => input.trim().length > 0 || 'Please enter a realm name'
|
|
50
85
|
});
|
|
51
86
|
const { clientName } = await prompt({
|
|
52
87
|
type: 'input',
|
|
53
88
|
name: 'clientName',
|
|
54
|
-
message: 'Client name:',
|
|
89
|
+
message: 'TideCloak new Client name:',
|
|
55
90
|
initial: 'myclient',
|
|
56
91
|
validate: (input) => input.trim().length > 0 || 'Please enter a client name'
|
|
57
92
|
});
|
|
58
93
|
const { clientAppUrl } = await prompt({
|
|
59
94
|
type: 'input',
|
|
60
95
|
name: 'clientAppUrl',
|
|
61
|
-
message: '
|
|
96
|
+
message: 'This App URL (e.g. http://localhost:3000):',
|
|
62
97
|
initial: 'http://localhost:3000',
|
|
63
98
|
validate: (input) => input.trim().length > 0 || 'Please enter your app URL'
|
|
64
99
|
});
|
|
65
100
|
const { kcUser } = await prompt({
|
|
66
101
|
type: 'input',
|
|
67
102
|
name: 'kcUser',
|
|
68
|
-
message: '
|
|
103
|
+
message: 'TideCloak bootstrap / master admin username:',
|
|
69
104
|
initial: 'admin',
|
|
70
105
|
validate: (input) => input.trim().length > 0 || 'Please enter a username'
|
|
71
106
|
});
|
|
72
107
|
const { kcPassword } = await prompt({
|
|
73
108
|
type: 'input',
|
|
74
109
|
name: 'kcPassword',
|
|
75
|
-
message: '
|
|
110
|
+
message: 'TideCloak bootstrap / master admin password:',
|
|
76
111
|
initial: 'password',
|
|
77
112
|
validate: (input) => input.trim().length > 0 || 'Please enter a password'
|
|
78
113
|
});
|
|
79
|
-
//
|
|
114
|
+
// 6. Run initialization script
|
|
80
115
|
const { runInit } = await prompt({
|
|
81
116
|
type: 'confirm',
|
|
82
117
|
name: 'runInit',
|
|
83
|
-
message: '
|
|
118
|
+
message: 'Ready to initialize TideCloak?',
|
|
84
119
|
initial: true
|
|
85
120
|
});
|
|
86
121
|
if (runInit) {
|
|
@@ -120,11 +155,9 @@ async function main() {
|
|
|
120
155
|
console.log(`To run init later: cd ${targetDir} && bash init/tcinit.sh`);
|
|
121
156
|
}
|
|
122
157
|
}
|
|
123
|
-
|
|
124
|
-
console.log('Initialization skipped.');
|
|
125
|
-
}
|
|
126
|
-
// 6. Final instructions
|
|
158
|
+
// 7. Final instructions
|
|
127
159
|
console.log(`"${targetDir}" is ready!`);
|
|
160
|
+
console.log("Proceed to run your app:");
|
|
128
161
|
console.log(`cd ${targetDir} && npm install && npm run dev`);
|
|
129
162
|
}
|
|
130
163
|
main().catch((err) => {
|
package/dist/esm/create.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../create.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,QAAQ,MAAM,UAAU,CAAA;AAE/B,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAA;AAE3B,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,EAAE,AAAD,EAAG,SAAS,CAAC,GAAG,OAAO,CAAC,IAAgB,CAAA;IAChD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAA;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,qBAAqB;IACrB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAA4C;QAC3E,IAAI,EAAK,QAAQ;QACjB,IAAI,EAAK,UAAU;QACnB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../create.ts"],"names":[],"mappings":"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"}
|
package/init/tcinit.sh
CHANGED
|
@@ -144,7 +144,7 @@ approve_and_commit clients
|
|
|
144
144
|
# Step 4: create admin user + assign role
|
|
145
145
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
146
146
|
TOKEN="$(get_admin_token)"
|
|
147
|
-
echo "👤 Creating admin user..."
|
|
147
|
+
echo "👤 Creating new admin user..."
|
|
148
148
|
curl -s -X POST "${TIDECLOAK_LOCAL_URL}/admin/realms/${REALM_NAME}/users" \
|
|
149
149
|
-H "Authorization: Bearer ${TOKEN}" \
|
|
150
150
|
-H "Content-Type: application/json" \
|
package/package.json
CHANGED
|
@@ -1,17 +1,28 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
|
-
import { useState, useCallback } from 'react'
|
|
3
|
+
import { useState, useCallback, useEffect } from 'react'
|
|
4
4
|
import { useTideCloak } from '@tidecloak/nextjs'
|
|
5
5
|
import tcConfig from "../../tidecloak.json"
|
|
6
6
|
|
|
7
7
|
export default function HomePage() {
|
|
8
|
-
const { logout, getValueFromIdToken, hasRealmRole,
|
|
9
|
-
const username = getValueFromIdToken('preferred_username') || '…'
|
|
10
|
-
const hasDefaultRole = hasRealmRole(`default-roles-${tcConfig["realm"]}`)
|
|
8
|
+
const { logout, getValueFromIdToken, hasRealmRole, token } = useTideCloak()
|
|
11
9
|
|
|
10
|
+
const [username, setUsername] = useState("")
|
|
11
|
+
const [hasDefaultRole, setHasDefaultRole] = useState(false)
|
|
12
12
|
const [verifyResult, setVerifyResult] = useState(null)
|
|
13
13
|
const [verifying, setVerifying] = useState(false)
|
|
14
14
|
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
if (token) {
|
|
17
|
+
const name = getValueFromIdToken("preferred_username")
|
|
18
|
+
const defaultRole = hasRealmRole(`default-roles-${tcConfig["realm"]}`)
|
|
19
|
+
setUsername(name);
|
|
20
|
+
setHasDefaultRole(defaultRole)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
}, [token])
|
|
24
|
+
|
|
25
|
+
|
|
15
26
|
const onLogout = useCallback(() => {
|
|
16
27
|
logout()
|
|
17
28
|
}, [logout])
|
|
@@ -20,7 +31,6 @@ export default function HomePage() {
|
|
|
20
31
|
setVerifying(true)
|
|
21
32
|
setVerifyResult(null)
|
|
22
33
|
try {
|
|
23
|
-
const token = await getAccessToken()
|
|
24
34
|
const res = await fetch('/api/protected', {
|
|
25
35
|
method: 'GET',
|
|
26
36
|
headers: { Authorization: `Bearer ${token}` },
|
|
@@ -36,7 +46,7 @@ export default function HomePage() {
|
|
|
36
46
|
} finally {
|
|
37
47
|
setVerifying(false)
|
|
38
48
|
}
|
|
39
|
-
}, [
|
|
49
|
+
}, [token])
|
|
40
50
|
|
|
41
51
|
return (
|
|
42
52
|
<div style={containerStyle}>
|
|
@@ -144,7 +144,7 @@ approve_and_commit clients
|
|
|
144
144
|
# Step 4: create admin user + assign role
|
|
145
145
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
146
146
|
TOKEN="$(get_admin_token)"
|
|
147
|
-
echo "👤 Creating admin user..."
|
|
147
|
+
echo "👤 Creating new admin user..."
|
|
148
148
|
curl -s -X POST "${TIDECLOAK_LOCAL_URL}/admin/realms/${REALM_NAME}/users" \
|
|
149
149
|
-H "Authorization: Bearer ${TOKEN}" \
|
|
150
150
|
-H "Content-Type: application/json" \
|
|
@@ -1,18 +1,28 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
3
|
import { useTideCloak } from '@tidecloak/nextjs'
|
|
4
|
-
import { useState, useCallback } from 'react'
|
|
4
|
+
import { useState, useCallback, useEffect } from 'react'
|
|
5
5
|
import tcConfig from "../../tidecloak.json"
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
export default function HomePage() {
|
|
9
9
|
const { logout, getValueFromIdToken, hasRealmRole, token } = useTideCloak()
|
|
10
|
-
const username = getValueFromIdToken('preferred_username') ?? '…'
|
|
11
|
-
const hasDefaultRole = hasRealmRole(`default-roles-${tcConfig["realm"]}`)
|
|
12
10
|
|
|
11
|
+
const [username, setUsername] = useState("")
|
|
12
|
+
const [hasDefaultRole, setHasDefaultRole] = useState(false)
|
|
13
13
|
const [verifyResult, setVerifyResult] = useState<string | null>(null)
|
|
14
14
|
const [verifying, setVerifying] = useState(false)
|
|
15
15
|
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
if (token) {
|
|
18
|
+
const name = getValueFromIdToken("preferred_username")
|
|
19
|
+
const defaultRole = hasRealmRole(`default-roles-${tcConfig["realm"]}`)
|
|
20
|
+
setUsername(name);
|
|
21
|
+
setHasDefaultRole(defaultRole)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
}, [token])
|
|
25
|
+
|
|
16
26
|
const onLogout = useCallback(() => {
|
|
17
27
|
logout()
|
|
18
28
|
}, [logout])
|
|
@@ -144,7 +144,7 @@ approve_and_commit clients
|
|
|
144
144
|
# Step 4: create admin user + assign role
|
|
145
145
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
146
146
|
TOKEN="$(get_admin_token)"
|
|
147
|
-
echo "👤 Creating admin user..."
|
|
147
|
+
echo "👤 Creating new admin user..."
|
|
148
148
|
curl -s -X POST "${TIDECLOAK_LOCAL_URL}/admin/realms/${REALM_NAME}/users" \
|
|
149
149
|
-H "Authorization: Bearer ${TOKEN}" \
|
|
150
150
|
-H "Content-Type: application/json" \
|