@tenderprompt/accounts 0.8.3 → 0.9.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 +6 -355
- package/cli.js +8 -0
- package/package.json +7 -29
- package/dist/api.d.ts +0 -109
- package/dist/api.d.ts.map +0 -1
- package/dist/api.js +0 -141
- package/dist/api.js.map +0 -1
- package/dist/artifact.d.ts +0 -8
- package/dist/artifact.d.ts.map +0 -1
- package/dist/artifact.js +0 -205
- package/dist/artifact.js.map +0 -1
- package/dist/auth-store.d.ts +0 -51
- package/dist/auth-store.d.ts.map +0 -1
- package/dist/auth-store.js +0 -242
- package/dist/auth-store.js.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -4
- package/dist/cli.js.map +0 -1
- package/dist/contracts.d.ts +0 -226
- package/dist/contracts.d.ts.map +0 -1
- package/dist/contracts.js +0 -5
- package/dist/contracts.js.map +0 -1
- package/dist/errors.d.ts +0 -10
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -19
- package/dist/errors.js.map +0 -1
- package/dist/files.d.ts +0 -22
- package/dist/files.d.ts.map +0 -1
- package/dist/files.js +0 -272
- package/dist/files.js.map +0 -1
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -4
- package/dist/index.js.map +0 -1
- package/dist/main.d.ts +0 -37
- package/dist/main.d.ts.map +0 -1
- package/dist/main.js +0 -2131
- package/dist/main.js.map +0 -1
- package/dist/oauth.d.ts +0 -67
- package/dist/oauth.d.ts.map +0 -1
- package/dist/oauth.js +0 -187
- package/dist/oauth.js.map +0 -1
- package/dist/processes.d.ts +0 -12
- package/dist/processes.d.ts.map +0 -1
- package/dist/processes.js +0 -48
- package/dist/processes.js.map +0 -1
- package/dist/profile-bindings.d.ts +0 -26
- package/dist/profile-bindings.d.ts.map +0 -1
- package/dist/profile-bindings.js +0 -214
- package/dist/profile-bindings.js.map +0 -1
- package/dist/starter.d.ts +0 -20
- package/dist/starter.d.ts.map +0 -1
- package/dist/starter.js +0 -154
- package/dist/starter.js.map +0 -1
- package/skill/tender-accounts/SKILL.md +0 -372
- package/templates/shopify-customer-account/AGENTS.md +0 -15
- package/templates/shopify-customer-account/README.md +0 -50
- package/templates/shopify-customer-account/apps/gateway/AGENTS.md +0 -10
- package/templates/shopify-customer-account/apps/gateway/README.md +0 -9
- package/templates/shopify-customer-account/apps/gateway/database-schema.json +0 -49
- package/templates/shopify-customer-account/apps/gateway/dot.dev.vars.example +0 -12
- package/templates/shopify-customer-account/apps/gateway/migrations/0001_customer_auth.sql +0 -76
- package/templates/shopify-customer-account/apps/gateway/package.json +0 -25
- package/templates/shopify-customer-account/apps/gateway/scripts/build-worker.mjs +0 -15
- package/templates/shopify-customer-account/apps/gateway/scripts/pack-tender-artifact.mjs +0 -85
- package/templates/shopify-customer-account/apps/gateway/src/platform/customer-auth/hostname-policy.ts +0 -66
- package/templates/shopify-customer-account/apps/gateway/src/platform/customer-auth/schema.ts +0 -90
- package/templates/shopify-customer-account/apps/gateway/src/platform/customer-auth/session-store.ts +0 -864
- package/templates/shopify-customer-account/apps/gateway/src/platform/customer-auth/shopify-route-adapter.ts +0 -1157
- package/templates/shopify-customer-account/apps/gateway/src/platform/runtime-hostname.ts +0 -46
- package/templates/shopify-customer-account/apps/gateway/src/portal-service.test.ts +0 -70
- package/templates/shopify-customer-account/apps/gateway/src/portal-service.ts +0 -71
- package/templates/shopify-customer-account/apps/gateway/src/runtime-config.test.ts +0 -30
- package/templates/shopify-customer-account/apps/gateway/src/runtime-config.ts +0 -56
- package/templates/shopify-customer-account/apps/gateway/src/worker.ts +0 -85
- package/templates/shopify-customer-account/apps/gateway/tender-accounts.json +0 -10
- package/templates/shopify-customer-account/apps/gateway/tender-app.config.json +0 -40
- package/templates/shopify-customer-account/apps/gateway/tsconfig.json +0 -13
- package/templates/shopify-customer-account/apps/gateway/vitest.config.ts +0 -8
- package/templates/shopify-customer-account/apps/gateway/worker-configuration.d.ts +0 -26
- package/templates/shopify-customer-account/apps/gateway/wrangler.jsonc +0 -42
- package/templates/shopify-customer-account/apps/portal/AGENTS.md +0 -10
- package/templates/shopify-customer-account/apps/portal/README.md +0 -7
- package/templates/shopify-customer-account/apps/portal/index.html +0 -13
- package/templates/shopify-customer-account/apps/portal/package.json +0 -33
- package/templates/shopify-customer-account/apps/portal/scripts/build-worker.mjs +0 -11
- package/templates/shopify-customer-account/apps/portal/scripts/pack-tender-artifact.mjs +0 -63
- package/templates/shopify-customer-account/apps/portal/scripts/portal-worker.mjs +0 -84
- package/templates/shopify-customer-account/apps/portal/scripts/portal-worker.test.mjs +0 -14
- package/templates/shopify-customer-account/apps/portal/src/App.tsx +0 -111
- package/templates/shopify-customer-account/apps/portal/src/main.tsx +0 -10
- package/templates/shopify-customer-account/apps/portal/src/styles.css +0 -54
- package/templates/shopify-customer-account/apps/portal/tender-accounts.json +0 -10
- package/templates/shopify-customer-account/apps/portal/tender-app.config.json +0 -19
- package/templates/shopify-customer-account/apps/portal/tsconfig.json +0 -14
- package/templates/shopify-customer-account/apps/portal/vite.config.ts +0 -7
- package/templates/shopify-customer-account/apps/portal/worker-configuration.d.ts +0 -11
- package/templates/shopify-customer-account/apps/portal/wrangler.jsonc +0 -22
- package/templates/shopify-customer-account/dot.dev.vars.example +0 -4
- package/templates/shopify-customer-account/dot.gitignore +0 -9
- package/templates/shopify-customer-account/package.json +0 -22
- package/templates/shopify-customer-account/scripts/artifact-contract.mjs +0 -109
package/dist/profile-bindings.js
DELETED
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { chmod, mkdir, open, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
3
|
-
import { homedir } from "node:os";
|
|
4
|
-
import { dirname, isAbsolute, relative, resolve } from "node:path";
|
|
5
|
-
import { validateAuthProfile } from "./auth-store.js";
|
|
6
|
-
import { CliError } from "./errors.js";
|
|
7
|
-
export const CLI_PROFILE_BINDINGS_SCHEMA = "tender.accounts-profile-bindings/v1";
|
|
8
|
-
export function createDefaultProfileBindings(environment) {
|
|
9
|
-
const explicitPath = environment.TENDER_ACCOUNTS_PROFILE_BINDINGS_FILE;
|
|
10
|
-
if (explicitPath)
|
|
11
|
-
return new FileCliProfileBindings(resolve(explicitPath));
|
|
12
|
-
return new FileCliProfileBindings(resolve(homedir(), ".tender-accounts/profiles/directory-bindings.json"));
|
|
13
|
-
}
|
|
14
|
-
export class MemoryCliProfileBindings {
|
|
15
|
-
bindings = new Map();
|
|
16
|
-
async resolve(directory) {
|
|
17
|
-
return resolveDirectoryBinding(resolve(directory), this.bindings);
|
|
18
|
-
}
|
|
19
|
-
async list() {
|
|
20
|
-
return sortedBindings(this.bindings);
|
|
21
|
-
}
|
|
22
|
-
async activate(profile, directory) {
|
|
23
|
-
this.bindings.set(resolve(directory), validateAuthProfile(profile));
|
|
24
|
-
}
|
|
25
|
-
async deactivate(directory) {
|
|
26
|
-
const target = resolve(directory);
|
|
27
|
-
const direct = this.bindings.get(target);
|
|
28
|
-
if (!direct)
|
|
29
|
-
throw missingDirectBinding(target, resolveDirectoryBinding(target, this.bindings));
|
|
30
|
-
this.bindings.delete(target);
|
|
31
|
-
return { directory: target, profile: direct };
|
|
32
|
-
}
|
|
33
|
-
async removeProfile(profile) {
|
|
34
|
-
const selected = validateAuthProfile(profile);
|
|
35
|
-
const removed = [];
|
|
36
|
-
for (const [directory, boundProfile] of this.bindings) {
|
|
37
|
-
if (boundProfile !== selected)
|
|
38
|
-
continue;
|
|
39
|
-
this.bindings.delete(directory);
|
|
40
|
-
removed.push(directory);
|
|
41
|
-
}
|
|
42
|
-
return removed.sort();
|
|
43
|
-
}
|
|
44
|
-
async clearAll() {
|
|
45
|
-
this.bindings.clear();
|
|
46
|
-
}
|
|
47
|
-
description() {
|
|
48
|
-
return "memory";
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
class FileCliProfileBindings {
|
|
52
|
-
path;
|
|
53
|
-
constructor(path) {
|
|
54
|
-
this.path = path;
|
|
55
|
-
}
|
|
56
|
-
async resolve(directory) {
|
|
57
|
-
return resolveDirectoryBinding(resolve(directory), await this.read());
|
|
58
|
-
}
|
|
59
|
-
async list() {
|
|
60
|
-
return sortedBindings(await this.read());
|
|
61
|
-
}
|
|
62
|
-
async activate(profile, directory) {
|
|
63
|
-
const selected = validateAuthProfile(profile);
|
|
64
|
-
const target = resolve(directory);
|
|
65
|
-
await this.mutate((bindings) => bindings.set(target, selected));
|
|
66
|
-
}
|
|
67
|
-
async deactivate(directory) {
|
|
68
|
-
const target = resolve(directory);
|
|
69
|
-
let removed = null;
|
|
70
|
-
await this.mutate((bindings) => {
|
|
71
|
-
const direct = bindings.get(target);
|
|
72
|
-
if (!direct)
|
|
73
|
-
throw missingDirectBinding(target, resolveDirectoryBinding(target, bindings));
|
|
74
|
-
bindings.delete(target);
|
|
75
|
-
removed = { directory: target, profile: direct };
|
|
76
|
-
});
|
|
77
|
-
if (!removed)
|
|
78
|
-
throw new CliError("auth_profile_binding_missing", "The profile directory binding was not removed.");
|
|
79
|
-
return removed;
|
|
80
|
-
}
|
|
81
|
-
async removeProfile(profile) {
|
|
82
|
-
const selected = validateAuthProfile(profile);
|
|
83
|
-
const removed = [];
|
|
84
|
-
await this.mutate((bindings) => {
|
|
85
|
-
for (const [directory, boundProfile] of bindings) {
|
|
86
|
-
if (boundProfile !== selected)
|
|
87
|
-
continue;
|
|
88
|
-
bindings.delete(directory);
|
|
89
|
-
removed.push(directory);
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
return removed.sort();
|
|
93
|
-
}
|
|
94
|
-
async clearAll() {
|
|
95
|
-
await mkdir(dirname(this.path), { recursive: true, mode: 0o700 });
|
|
96
|
-
await this.withLock(async () => await rm(this.path, { force: true }));
|
|
97
|
-
}
|
|
98
|
-
description() {
|
|
99
|
-
return this.path;
|
|
100
|
-
}
|
|
101
|
-
async read() {
|
|
102
|
-
try {
|
|
103
|
-
return parseBindings(await readFile(this.path, "utf8"));
|
|
104
|
-
}
|
|
105
|
-
catch (error) {
|
|
106
|
-
if (isMissing(error))
|
|
107
|
-
return new Map();
|
|
108
|
-
throw error;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
async mutate(change) {
|
|
112
|
-
await mkdir(dirname(this.path), { recursive: true, mode: 0o700 });
|
|
113
|
-
await chmod(dirname(this.path), 0o700);
|
|
114
|
-
await this.withLock(async () => {
|
|
115
|
-
const bindings = await this.read();
|
|
116
|
-
change(bindings);
|
|
117
|
-
if (bindings.size === 0) {
|
|
118
|
-
await rm(this.path, { force: true });
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
const temporary = `${this.path}.${process.pid}.${randomUUID()}.tmp`;
|
|
122
|
-
const payload = {
|
|
123
|
-
schema: CLI_PROFILE_BINDINGS_SCHEMA,
|
|
124
|
-
bindings: Object.fromEntries([...bindings.entries()].sort(([left], [right]) => left.localeCompare(right))),
|
|
125
|
-
};
|
|
126
|
-
await writeFile(temporary, `${JSON.stringify(payload, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
|
|
127
|
-
await chmod(temporary, 0o600);
|
|
128
|
-
await rename(temporary, this.path);
|
|
129
|
-
await chmod(this.path, 0o600);
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
async withLock(operation) {
|
|
133
|
-
const lockPath = `${this.path}.lock`;
|
|
134
|
-
const deadline = Date.now() + 5_000;
|
|
135
|
-
let handle;
|
|
136
|
-
while (!handle) {
|
|
137
|
-
try {
|
|
138
|
-
handle = await open(lockPath, "wx", 0o600);
|
|
139
|
-
}
|
|
140
|
-
catch (error) {
|
|
141
|
-
if (!isAlreadyExists(error))
|
|
142
|
-
throw error;
|
|
143
|
-
const lock = await stat(lockPath).catch(() => null);
|
|
144
|
-
if (lock && Date.now() - lock.mtimeMs > 30_000) {
|
|
145
|
-
await rm(lockPath, { force: true });
|
|
146
|
-
continue;
|
|
147
|
-
}
|
|
148
|
-
if (Date.now() >= deadline) {
|
|
149
|
-
throw new CliError("auth_profile_bindings_busy", "Another Tender Accounts command is updating profile directory bindings.", "Wait for that command to finish, then retry.");
|
|
150
|
-
}
|
|
151
|
-
await new Promise((resolvePromise) => setTimeout(resolvePromise, 25));
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
try {
|
|
155
|
-
return await operation();
|
|
156
|
-
}
|
|
157
|
-
finally {
|
|
158
|
-
await handle.close();
|
|
159
|
-
await rm(lockPath, { force: true });
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
function parseBindings(value) {
|
|
164
|
-
let parsed;
|
|
165
|
-
try {
|
|
166
|
-
parsed = JSON.parse(value);
|
|
167
|
-
}
|
|
168
|
-
catch {
|
|
169
|
-
throw new CliError("auth_profile_bindings_invalid", "The stored Tender Accounts profile directory bindings are not valid JSON.", "Run tender-accounts auth deactivate from each affected directory after repairing the file.");
|
|
170
|
-
}
|
|
171
|
-
if (!isRecord(parsed) || parsed.schema !== CLI_PROFILE_BINDINGS_SCHEMA || !isRecord(parsed.bindings)) {
|
|
172
|
-
throw new CliError("auth_profile_bindings_invalid", "The stored profile directory bindings use an unsupported format.");
|
|
173
|
-
}
|
|
174
|
-
const bindings = new Map();
|
|
175
|
-
for (const [directory, profile] of Object.entries(parsed.bindings)) {
|
|
176
|
-
if (!isAbsolute(directory) || typeof profile !== "string") {
|
|
177
|
-
throw new CliError("auth_profile_bindings_invalid", "A stored profile directory binding is invalid.");
|
|
178
|
-
}
|
|
179
|
-
bindings.set(resolve(directory), validateAuthProfile(profile));
|
|
180
|
-
}
|
|
181
|
-
return bindings;
|
|
182
|
-
}
|
|
183
|
-
function resolveDirectoryBinding(directory, bindings) {
|
|
184
|
-
const target = resolve(directory);
|
|
185
|
-
const candidates = [...bindings.entries()]
|
|
186
|
-
.filter(([boundDirectory]) => isDirectoryOrDescendant(target, boundDirectory))
|
|
187
|
-
.sort(([left], [right]) => right.length - left.length);
|
|
188
|
-
const selected = candidates[0];
|
|
189
|
-
return selected ? { directory: selected[0], profile: selected[1] } : null;
|
|
190
|
-
}
|
|
191
|
-
function sortedBindings(bindings) {
|
|
192
|
-
return [...bindings.entries()]
|
|
193
|
-
.sort(([left], [right]) => left.localeCompare(right))
|
|
194
|
-
.map(([directory, profile]) => ({ directory, profile }));
|
|
195
|
-
}
|
|
196
|
-
function isDirectoryOrDescendant(target, ancestor) {
|
|
197
|
-
const child = relative(ancestor, target);
|
|
198
|
-
return child === "" || (!child.startsWith("..") && !isAbsolute(child));
|
|
199
|
-
}
|
|
200
|
-
function missingDirectBinding(target, inherited) {
|
|
201
|
-
return inherited
|
|
202
|
-
? new CliError("auth_profile_binding_inherited", `No profile is directly bound to ${target}; profile ${inherited.profile} is inherited from ${inherited.directory}.`, `tender-accounts auth deactivate ${inherited.directory}`)
|
|
203
|
-
: new CliError("auth_profile_binding_missing", `No auth profile is bound directly to ${target}.`);
|
|
204
|
-
}
|
|
205
|
-
function isMissing(value) {
|
|
206
|
-
return value instanceof Error && "code" in value && value.code === "ENOENT";
|
|
207
|
-
}
|
|
208
|
-
function isAlreadyExists(value) {
|
|
209
|
-
return value instanceof Error && "code" in value && value.code === "EEXIST";
|
|
210
|
-
}
|
|
211
|
-
function isRecord(value) {
|
|
212
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
213
|
-
}
|
|
214
|
-
//# sourceMappingURL=profile-bindings.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profile-bindings.js","sourceRoot":"","sources":["../src/profile-bindings.ts"],"names":[],"mappings":"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"}
|
package/dist/starter.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
export interface StarterInput {
|
|
2
|
-
cwd: string;
|
|
3
|
-
directory?: string;
|
|
4
|
-
name: string;
|
|
5
|
-
slug?: string;
|
|
6
|
-
template?: string;
|
|
7
|
-
dryRun: boolean;
|
|
8
|
-
}
|
|
9
|
-
export interface StarterResult {
|
|
10
|
-
status: "planned" | "created";
|
|
11
|
-
template: string;
|
|
12
|
-
name: string;
|
|
13
|
-
slug: string;
|
|
14
|
-
directory: string;
|
|
15
|
-
files: string[];
|
|
16
|
-
wroteFiles: boolean;
|
|
17
|
-
nextSteps: string[];
|
|
18
|
-
}
|
|
19
|
-
export declare function initializeStarter(input: StarterInput): Promise<StarterResult>;
|
|
20
|
-
//# sourceMappingURL=starter.d.ts.map
|
package/dist/starter.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"starter.d.ts","sourceRoot":"","sources":["../src/starter.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAsDnF"}
|
package/dist/starter.js
DELETED
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import { fileURLToPath } from "node:url";
|
|
2
|
-
import { lstat, mkdir, readFile, readdir, writeFile } from "node:fs/promises";
|
|
3
|
-
import { dirname, isAbsolute, relative, resolve, sep } from "node:path";
|
|
4
|
-
import { CliError } from "./errors.js";
|
|
5
|
-
const DEFAULT_TEMPLATE = "shopify-customer-account";
|
|
6
|
-
const TEMPLATE_FILE_MAX_BYTES = 2 * 1024 * 1024;
|
|
7
|
-
const STARTER_NAME = /^[A-Za-z0-9][A-Za-z0-9 _-]{1,63}$/u;
|
|
8
|
-
const STARTER_SLUG = /^[a-z0-9][a-z0-9-]{1,47}$/u;
|
|
9
|
-
export async function initializeStarter(input) {
|
|
10
|
-
const template = input.template ?? DEFAULT_TEMPLATE;
|
|
11
|
-
if (template !== DEFAULT_TEMPLATE) {
|
|
12
|
-
throw new CliError("starter_template_unknown", `Unknown starter template: ${template}.`, `tender-accounts init --name "My account" --template ${DEFAULT_TEMPLATE}`);
|
|
13
|
-
}
|
|
14
|
-
const name = validStarterName(input.name);
|
|
15
|
-
const slug = validStarterSlug(input.slug ?? slugify(name));
|
|
16
|
-
const target = await safeStarterTarget(input.cwd, input.directory ?? ".");
|
|
17
|
-
await assertEmptyStarterTarget(target);
|
|
18
|
-
const templateRoot = fileURLToPath(new URL(`../templates/${template}/`, import.meta.url));
|
|
19
|
-
const templateFiles = await walkTemplate(templateRoot);
|
|
20
|
-
const files = templateFiles.map((path) => renderedRelativePath(relative(templateRoot, path)))
|
|
21
|
-
.sort((left, right) => left.localeCompare(right));
|
|
22
|
-
if (!input.dryRun) {
|
|
23
|
-
await mkdir(target, { recursive: true });
|
|
24
|
-
for (const source of templateFiles) {
|
|
25
|
-
const relativeSource = relative(templateRoot, source);
|
|
26
|
-
const destination = resolve(target, renderedRelativePath(relativeSource));
|
|
27
|
-
assertWithin(target, destination);
|
|
28
|
-
const entry = await lstat(source);
|
|
29
|
-
if (!entry.isFile() || entry.isSymbolicLink() || entry.size > TEMPLATE_FILE_MAX_BYTES) {
|
|
30
|
-
throw new CliError("starter_template_unsafe", `Starter template contains an unsafe file: ${relativeSource}.`);
|
|
31
|
-
}
|
|
32
|
-
const contents = new TextDecoder("utf-8", { fatal: true }).decode(await readFile(source));
|
|
33
|
-
await mkdir(dirname(destination), { recursive: true });
|
|
34
|
-
await writeFile(destination, renderTemplate(contents, { name, slug }), { encoding: "utf8", flag: "wx" });
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
const displayDirectory = relative(resolve(input.cwd), target) || ".";
|
|
38
|
-
const prefix = displayDirectory === "." ? "" : `cd ${shellSafePath(displayDirectory)} && `;
|
|
39
|
-
return {
|
|
40
|
-
status: input.dryRun ? "planned" : "created",
|
|
41
|
-
template,
|
|
42
|
-
name,
|
|
43
|
-
slug,
|
|
44
|
-
directory: target,
|
|
45
|
-
files,
|
|
46
|
-
wroteFiles: !input.dryRun,
|
|
47
|
-
nextSteps: [
|
|
48
|
-
`${prefix}npm install`,
|
|
49
|
-
`${prefix}git init && git add . && git commit -m "Initialize ${name}"`,
|
|
50
|
-
`${prefix}npm run dev`,
|
|
51
|
-
`${prefix}npx tender-accounts auth create ${slug}`,
|
|
52
|
-
`${prefix}npx tender-accounts auth activate ${slug}`,
|
|
53
|
-
`${prefix}npx tender-accounts doctor --cwd apps/portal --json`,
|
|
54
|
-
],
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
function validStarterName(value) {
|
|
58
|
-
const normalized = value.trim().replace(/\s+/gu, " ");
|
|
59
|
-
if (!STARTER_NAME.test(normalized)) {
|
|
60
|
-
throw new CliError("starter_name_invalid", "--name must be 2-64 letters, numbers, spaces, hyphens, or underscores.", "tender-accounts init --name \"My customer account\" --directory ./my-account");
|
|
61
|
-
}
|
|
62
|
-
return normalized;
|
|
63
|
-
}
|
|
64
|
-
function validStarterSlug(value) {
|
|
65
|
-
const normalized = value.trim().toLowerCase();
|
|
66
|
-
if (!STARTER_SLUG.test(normalized) || normalized.endsWith("-")) {
|
|
67
|
-
throw new CliError("starter_slug_invalid", "--slug must be 2-48 lowercase letters, numbers, or hyphens and cannot end with a hyphen.", "tender-accounts init --name \"My account\" --slug my-account");
|
|
68
|
-
}
|
|
69
|
-
return normalized;
|
|
70
|
-
}
|
|
71
|
-
function slugify(value) {
|
|
72
|
-
return value.toLowerCase().replace(/[^a-z0-9]+/gu, "-").replace(/^-+|-+$/gu, "").slice(0, 48).replace(/-+$/u, "");
|
|
73
|
-
}
|
|
74
|
-
async function safeStarterTarget(cwd, value) {
|
|
75
|
-
if (isAbsolute(value) || value.includes("\\") || value.includes("%") || /[\r\n\0]/u.test(value)) {
|
|
76
|
-
throw new CliError("starter_directory_unsafe", "--directory must be a safe path relative to the current directory.");
|
|
77
|
-
}
|
|
78
|
-
const segments = value === "." ? [] : value.split("/");
|
|
79
|
-
if (segments.some((segment) => !segment || segment === "." || segment === ".." || !/^[A-Za-z0-9._-]+$/u.test(segment))) {
|
|
80
|
-
throw new CliError("starter_directory_unsafe", "--directory must be a safe path relative to the current directory.");
|
|
81
|
-
}
|
|
82
|
-
const root = resolve(cwd);
|
|
83
|
-
const target = resolve(root, ...segments);
|
|
84
|
-
if (target !== root)
|
|
85
|
-
assertWithin(root, target);
|
|
86
|
-
let cursor = root;
|
|
87
|
-
for (const segment of segments) {
|
|
88
|
-
cursor = resolve(cursor, segment);
|
|
89
|
-
const entry = await optionalLstat(cursor);
|
|
90
|
-
if (entry?.isSymbolicLink()) {
|
|
91
|
-
throw new CliError("starter_directory_unsafe", `Starter path cannot traverse a symbolic link: ${cursor}.`);
|
|
92
|
-
}
|
|
93
|
-
if (entry && !entry.isDirectory()) {
|
|
94
|
-
throw new CliError("starter_directory_unsafe", `Starter path is not a directory: ${cursor}.`);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return target;
|
|
98
|
-
}
|
|
99
|
-
async function assertEmptyStarterTarget(target) {
|
|
100
|
-
const entry = await optionalLstat(target);
|
|
101
|
-
if (!entry)
|
|
102
|
-
return;
|
|
103
|
-
if (!entry.isDirectory() || entry.isSymbolicLink()) {
|
|
104
|
-
throw new CliError("starter_target_unsafe", "The starter target must be a regular directory.");
|
|
105
|
-
}
|
|
106
|
-
const existing = (await readdir(target)).filter((name) => name !== ".git");
|
|
107
|
-
if (existing.length > 0) {
|
|
108
|
-
throw new CliError("starter_target_not_empty", `The starter target contains existing files: ${existing.slice(0, 5).join(", ")}.`, "Choose a new empty --directory. Existing applications should adopt tender-accounts.json instead of using init.");
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
async function walkTemplate(root) {
|
|
112
|
-
const entries = await readdir(root, { withFileTypes: true });
|
|
113
|
-
const files = [];
|
|
114
|
-
for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {
|
|
115
|
-
const path = resolve(root, entry.name);
|
|
116
|
-
if (entry.isSymbolicLink())
|
|
117
|
-
throw new CliError("starter_template_unsafe", `Starter template contains a symbolic link: ${path}.`);
|
|
118
|
-
if (entry.isDirectory())
|
|
119
|
-
files.push(...await walkTemplate(path));
|
|
120
|
-
else if (entry.isFile())
|
|
121
|
-
files.push(path);
|
|
122
|
-
else
|
|
123
|
-
throw new CliError("starter_template_unsafe", `Starter template contains an unsupported entry: ${path}.`);
|
|
124
|
-
}
|
|
125
|
-
return files;
|
|
126
|
-
}
|
|
127
|
-
function renderedRelativePath(value) {
|
|
128
|
-
return value.split(sep).map((segment) => segment.startsWith("dot.") ? `.${segment.slice(4)}` : segment).join("/");
|
|
129
|
-
}
|
|
130
|
-
function renderTemplate(value, input) {
|
|
131
|
-
return value
|
|
132
|
-
.replaceAll("__APP_NAME__", input.name)
|
|
133
|
-
.replaceAll("__APP_SLUG__", input.slug);
|
|
134
|
-
}
|
|
135
|
-
function assertWithin(root, target) {
|
|
136
|
-
const suffix = relative(resolve(root), resolve(target));
|
|
137
|
-
if (!suffix || suffix === ".." || suffix.startsWith(`..${sep}`) || isAbsolute(suffix)) {
|
|
138
|
-
throw new CliError("starter_directory_unsafe", "Starter files must stay inside the selected directory.");
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
async function optionalLstat(path) {
|
|
142
|
-
try {
|
|
143
|
-
return await lstat(path);
|
|
144
|
-
}
|
|
145
|
-
catch (error) {
|
|
146
|
-
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
147
|
-
return null;
|
|
148
|
-
throw error;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
function shellSafePath(value) {
|
|
152
|
-
return /^[A-Za-z0-9._/-]+$/u.test(value) ? value : JSON.stringify(value);
|
|
153
|
-
}
|
|
154
|
-
//# sourceMappingURL=starter.js.map
|
package/dist/starter.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"starter.js","sourceRoot":"","sources":["../src/starter.ts"],"names":[],"mappings":"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"}
|