@snapback/cli 1.6.0 → 3.0.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/README.md +121 -22
- package/dist/SkippedTestDetector-AXTMWWHC.js +5 -0
- package/dist/SkippedTestDetector-QLSQV7K7.js +5 -0
- package/dist/analysis-6WTBZJH3.js +6 -0
- package/dist/analysis-C472LUGW.js +2475 -0
- package/dist/auth-UA7I3YE4.js +1446 -0
- package/dist/auto-provision-organization-6YF463TK.js +161 -0
- package/dist/{chunk-FVIYXFCL.js → chunk-4YTE4JEW.js} +2 -3
- package/dist/chunk-5EOPYJ4Y.js +12 -0
- package/dist/{chunk-ARVV3F4K.js → chunk-5SQA44V7.js} +1085 -18
- package/dist/{chunk-RB7H4UQJ.js → chunk-7ADPL4Q3.js} +10 -3
- package/dist/chunk-BE3HNVSV.js +2300 -0
- package/dist/chunk-BWWPGNZ5.js +5842 -0
- package/dist/chunk-CBGOC6RV.js +293 -0
- package/dist/{chunk-7JX6Y4TL.js → chunk-DPWFZNMY.js} +21 -34
- package/dist/{chunk-R7CUQ7CU.js → chunk-E6V6QKS7.js} +317 -33
- package/dist/chunk-GT4ZUCFR.js +111 -0
- package/dist/chunk-NOWJBG6X.js +3654 -0
- package/dist/chunk-O7HMAZ7L.js +3497 -0
- package/dist/chunk-PL4HF4M2.js +593 -0
- package/dist/chunk-V7B37PPD.js +4075 -0
- package/dist/chunk-YVZXPBSV.js +314 -0
- package/dist/chunk-ZBQDE6WJ.js +108 -0
- package/dist/client-RHDS6NOB.js +8 -0
- package/dist/dist-5LR7APG5.js +5 -0
- package/dist/dist-CUHOKNLS.js +12 -0
- package/dist/dist-RJE4RSZJ.js +9 -0
- package/dist/index.js +60568 -36578
- package/dist/local-service-adapter-AB3UYRUK.js +6 -0
- package/dist/pioneer-oauth-hook-V2JKEXM7.js +12 -0
- package/dist/{secure-credentials-IWQB6KU4.js → secure-credentials-UEPG7GWW.js} +2 -3
- package/dist/snapback-dir-MG7DTRMF.js +6 -0
- package/package.json +12 -11
- package/scripts/postinstall.mjs +2 -3
- package/dist/SkippedTestDetector-5WJZKZQ3.js +0 -5
- package/dist/SkippedTestDetector-5WJZKZQ3.js.map +0 -1
- package/dist/analysis-YI4UNUCM.js +0 -6
- package/dist/analysis-YI4UNUCM.js.map +0 -1
- package/dist/chunk-7JX6Y4TL.js.map +0 -1
- package/dist/chunk-ARVV3F4K.js.map +0 -1
- package/dist/chunk-EU2IZPOK.js +0 -13002
- package/dist/chunk-EU2IZPOK.js.map +0 -1
- package/dist/chunk-FVIYXFCL.js.map +0 -1
- package/dist/chunk-R7CUQ7CU.js.map +0 -1
- package/dist/chunk-RB7H4UQJ.js.map +0 -1
- package/dist/chunk-SOABQWAU.js +0 -385
- package/dist/chunk-SOABQWAU.js.map +0 -1
- package/dist/dist-O6EBXLN6.js +0 -5
- package/dist/dist-O6EBXLN6.js.map +0 -1
- package/dist/dist-PJVBBZTF.js +0 -5
- package/dist/dist-PJVBBZTF.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/learning-pruner-QC4CTJDX.js +0 -5
- package/dist/learning-pruner-QC4CTJDX.js.map +0 -1
- package/dist/secure-credentials-IWQB6KU4.js.map +0 -1
- package/dist/snapback-dir-V6MWXIW4.js +0 -5
- package/dist/snapback-dir-V6MWXIW4.js.map +0 -1
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
#!/usr/bin/env node --no-warnings=ExperimentalWarning
|
|
2
|
+
import { trackEvent } from './chunk-GT4ZUCFR.js';
|
|
3
|
+
import './chunk-BE3HNVSV.js';
|
|
4
|
+
import { logger } from './chunk-PL4HF4M2.js';
|
|
5
|
+
import './chunk-NOWJBG6X.js';
|
|
6
|
+
import './chunk-5EOPYJ4Y.js';
|
|
7
|
+
import './chunk-CBGOC6RV.js';
|
|
8
|
+
import { __name } from './chunk-7ADPL4Q3.js';
|
|
9
|
+
import { nanoid } from 'nanoid';
|
|
10
|
+
|
|
11
|
+
process.env.SNAPBACK_CLI='true';
|
|
12
|
+
var MAX_SLUG_RETRIES = 5;
|
|
13
|
+
var SLUG_SUFFIX_LENGTH = 6;
|
|
14
|
+
var MAX_ORG_NAME_LENGTH = 100;
|
|
15
|
+
var MAX_SLUG_LENGTH = 50;
|
|
16
|
+
function sanitizeOrgName(name) {
|
|
17
|
+
return name.replace(/<[^>]*>/g, "").replace(/[\x00-\x1f\x7f]/g, "").replace(/\s+/g, " ").trim().slice(0, MAX_ORG_NAME_LENGTH);
|
|
18
|
+
}
|
|
19
|
+
__name(sanitizeOrgName, "sanitizeOrgName");
|
|
20
|
+
function generateSlug(name) {
|
|
21
|
+
return name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, MAX_SLUG_LENGTH - SLUG_SUFFIX_LENGTH - 1);
|
|
22
|
+
}
|
|
23
|
+
__name(generateSlug, "generateSlug");
|
|
24
|
+
async function generateUniqueSlug(db, combinedSchema, baseName) {
|
|
25
|
+
const { sql } = await import('drizzle-orm');
|
|
26
|
+
const { organization } = combinedSchema;
|
|
27
|
+
const baseSlug = generateSlug(baseName);
|
|
28
|
+
for (let attempt = 0; attempt < MAX_SLUG_RETRIES; attempt++) {
|
|
29
|
+
const slug = attempt === 0 ? baseSlug : `${baseSlug}-${nanoid(SLUG_SUFFIX_LENGTH)}`;
|
|
30
|
+
const existing = await db.select({
|
|
31
|
+
id: organization.id
|
|
32
|
+
}).from(organization).where(sql`${organization.slug} = ${slug}`).limit(1);
|
|
33
|
+
if (existing.length === 0) {
|
|
34
|
+
return slug;
|
|
35
|
+
}
|
|
36
|
+
logger.debug("Slug collision detected, retrying", {
|
|
37
|
+
slug,
|
|
38
|
+
attempt
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return `org-${nanoid(12)}`;
|
|
42
|
+
}
|
|
43
|
+
__name(generateUniqueSlug, "generateUniqueSlug");
|
|
44
|
+
function getDisplayName(user) {
|
|
45
|
+
if (user.name && user.name.trim()) {
|
|
46
|
+
return sanitizeOrgName(user.name.trim());
|
|
47
|
+
}
|
|
48
|
+
const emailParts = user.email.split("@");
|
|
49
|
+
if (emailParts[0]) {
|
|
50
|
+
const username = emailParts[0];
|
|
51
|
+
return sanitizeOrgName(username.charAt(0).toUpperCase() + username.slice(1));
|
|
52
|
+
}
|
|
53
|
+
return "Personal Workspace";
|
|
54
|
+
}
|
|
55
|
+
__name(getDisplayName, "getDisplayName");
|
|
56
|
+
async function autoProvisionOrganization(user) {
|
|
57
|
+
const startTime = Date.now();
|
|
58
|
+
try {
|
|
59
|
+
const { db, combinedSchema } = await import('./dist-CUHOKNLS.js');
|
|
60
|
+
const { sql } = await import('drizzle-orm');
|
|
61
|
+
if (!db) {
|
|
62
|
+
logger.error("Database not available for auto-provisioning", {
|
|
63
|
+
userId: user.id
|
|
64
|
+
});
|
|
65
|
+
return {
|
|
66
|
+
success: false,
|
|
67
|
+
error: "Database not available"
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const { organization, member } = combinedSchema;
|
|
71
|
+
const displayName = getDisplayName(user);
|
|
72
|
+
const orgName = `${displayName}'s Workspace`;
|
|
73
|
+
const orgSlug = await generateUniqueSlug(db, combinedSchema, displayName);
|
|
74
|
+
const orgId = nanoid();
|
|
75
|
+
await db.transaction(async (tx) => {
|
|
76
|
+
await tx.insert(organization).values({
|
|
77
|
+
id: orgId,
|
|
78
|
+
name: orgName,
|
|
79
|
+
slug: orgSlug,
|
|
80
|
+
createdAt: /* @__PURE__ */ new Date()
|
|
81
|
+
});
|
|
82
|
+
await tx.insert(member).values({
|
|
83
|
+
id: nanoid(),
|
|
84
|
+
userId: user.id,
|
|
85
|
+
organizationId: orgId,
|
|
86
|
+
role: "owner",
|
|
87
|
+
createdAt: /* @__PURE__ */ new Date()
|
|
88
|
+
});
|
|
89
|
+
const { session } = combinedSchema;
|
|
90
|
+
try {
|
|
91
|
+
await tx.update(session).set({
|
|
92
|
+
activeOrganizationId: orgId
|
|
93
|
+
}).where(sql`${session.userId} = ${user.id}`);
|
|
94
|
+
} catch {
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
const duration = Date.now() - startTime;
|
|
98
|
+
await trackEvent("org.auto_provisioned", {
|
|
99
|
+
userId: user.id,
|
|
100
|
+
orgId,
|
|
101
|
+
organizationName: orgName,
|
|
102
|
+
organizationSlug: orgSlug,
|
|
103
|
+
duration,
|
|
104
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
105
|
+
});
|
|
106
|
+
logger.info("Auto-provisioned organization for new user", {
|
|
107
|
+
userId: user.id,
|
|
108
|
+
organizationId: orgId,
|
|
109
|
+
organizationSlug: orgSlug,
|
|
110
|
+
duration
|
|
111
|
+
});
|
|
112
|
+
return {
|
|
113
|
+
success: true,
|
|
114
|
+
organizationId: orgId,
|
|
115
|
+
organizationSlug: orgSlug
|
|
116
|
+
};
|
|
117
|
+
} catch (error) {
|
|
118
|
+
const duration = Date.now() - startTime;
|
|
119
|
+
logger.error("Failed to auto-provision organization", {
|
|
120
|
+
userId: user.id,
|
|
121
|
+
error: error instanceof Error ? error.message : String(error),
|
|
122
|
+
stack: error instanceof Error ? error.stack : void 0,
|
|
123
|
+
duration
|
|
124
|
+
});
|
|
125
|
+
await trackEvent("org.auto_provision_failed", {
|
|
126
|
+
userId: user.id,
|
|
127
|
+
errorMessage: error instanceof Error ? error.message : String(error),
|
|
128
|
+
duration,
|
|
129
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
130
|
+
}).catch(() => {
|
|
131
|
+
});
|
|
132
|
+
return {
|
|
133
|
+
success: false,
|
|
134
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
__name(autoProvisionOrganization, "autoProvisionOrganization");
|
|
139
|
+
async function userHasOrganization(userId) {
|
|
140
|
+
try {
|
|
141
|
+
const { db, combinedSchema } = await import('./dist-CUHOKNLS.js');
|
|
142
|
+
const { sql } = await import('drizzle-orm');
|
|
143
|
+
if (!db) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
const { member } = combinedSchema;
|
|
147
|
+
const memberships = await db.select({
|
|
148
|
+
id: member.id
|
|
149
|
+
}).from(member).where(sql`${member.userId} = ${userId}`).limit(1);
|
|
150
|
+
return memberships.length > 0;
|
|
151
|
+
} catch (error) {
|
|
152
|
+
logger.error("Failed to check user organization membership", {
|
|
153
|
+
userId,
|
|
154
|
+
error: error instanceof Error ? error.message : String(error)
|
|
155
|
+
});
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
__name(userHasOrganization, "userHasOrganization");
|
|
160
|
+
|
|
161
|
+
export { autoProvisionOrganization, userHasOrganization };
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node --no-warnings=ExperimentalWarning
|
|
2
|
-
import { __name } from './chunk-
|
|
2
|
+
import { __name } from './chunk-7ADPL4Q3.js';
|
|
3
3
|
import { parse } from '@babel/parser';
|
|
4
4
|
|
|
5
|
+
process.env.SNAPBACK_CLI='true';
|
|
5
6
|
function detectSkippedTests(code, filePath) {
|
|
6
7
|
const skipped = [];
|
|
7
8
|
try {
|
|
@@ -105,5 +106,3 @@ function getSkippedTestSummary(results) {
|
|
|
105
106
|
__name(getSkippedTestSummary, "getSkippedTestSummary");
|
|
106
107
|
|
|
107
108
|
export { analyzeSkippedTests, detectSkippedTests, getSkippedTestSummary };
|
|
108
|
-
//# sourceMappingURL=chunk-FVIYXFCL.js.map
|
|
109
|
-
//# sourceMappingURL=chunk-FVIYXFCL.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node --no-warnings=ExperimentalWarning
|
|
2
|
+
import { __name } from './chunk-7ADPL4Q3.js';
|
|
3
|
+
import { nanoid } from 'nanoid';
|
|
4
|
+
|
|
5
|
+
process.env.SNAPBACK_CLI='true';
|
|
6
|
+
function generateId(prefix) {
|
|
7
|
+
const id = nanoid();
|
|
8
|
+
return prefix ? `${prefix}-${id}` : id;
|
|
9
|
+
}
|
|
10
|
+
__name(generateId, "generateId");
|
|
11
|
+
|
|
12
|
+
export { generateId };
|