@woodsportal/hubspot-kit 1.0.42-dev.0 → 1.0.42-dev.2
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/CHANGELOG.md +7 -1
- package/dist/{chunk-WHYTQEZX.js → chunk-4UFWXPQG.js} +2 -2
- package/dist/{chunk-4GOJPOW3.js → chunk-GXYUGXF5.js} +82 -23
- package/dist/chunk-GXYUGXF5.js.map +1 -0
- package/dist/cli.js +61 -26
- package/dist/cli.js.map +1 -1
- package/dist/{exec-VY6BGWF3.js → exec-NS4GKXZS.js} +2 -2
- package/dist/{scaffold-page-lifecycle-EHMPWPPE.js → scaffold-page-lifecycle-53AWWGFR.js} +3 -3
- package/examples/greenfield/module-hybrid-cdn/README.md +2 -1
- package/examples/greenfield/module-hybrid-cdn-auth-full/README.md +2 -1
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/components/starter-login.tsx +2 -6
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/sso-callback.ts +6 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/README.md +2 -1
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/auth/sso-callback.ts +6 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/README.md +2 -1
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/README.md +2 -1
- package/package.json +3 -2
- package/scripts/build-cdn.mjs +6 -5
- package/scripts/dist-cli-pack-smoke.test.mjs +79 -0
- package/scripts/ensure-wphs-workspace.mjs +7 -2
- package/scripts/resolve-hubspot-cli.mjs +51 -0
- package/scripts/resolve-vite-config.mjs +2 -3
- package/scripts/resolve-vite-spawn.mjs +48 -0
- package/scripts/run-vite-build.mjs +5 -6
- package/scripts/watch-hubspot.mjs +11 -13
- package/templates/module-hybrid-cdn/README.md +2 -1
- package/templates/module-monolith/README.md +2 -1
- package/templates/scaffold/auth/_full/src/features/auth/components/starter-login.tsx +79 -0
- package/templates/scaffold/auth/_shared/src/app.tsx +8 -3
- package/templates/scaffold/auth/_shared/src/features/auth/components/starter-login.tsx +10 -3
- package/templates/scaffold/auth/_shared/src/integrations/woodsportal-sdk.ts +1 -0
- package/templates/scaffold/auth/_sso/src/features/auth/components/starter-login.tsx +10 -3
- package/templates/scaffold/auth/_sso/src/features/auth/sso-callback.ts +6 -0
- package/dist/chunk-4GOJPOW3.js.map +0 -1
- package/dist/ensure-wphs-workspace-5S3GTO6K.js +0 -234
- package/dist/ensure-wphs-workspace-5S3GTO6K.js.map +0 -1
- /package/dist/{chunk-WHYTQEZX.js.map → chunk-4UFWXPQG.js.map} +0 -0
- /package/dist/{exec-VY6BGWF3.js.map → exec-NS4GKXZS.js.map} +0 -0
- /package/dist/{scaffold-page-lifecycle-EHMPWPPE.js.map → scaffold-page-lifecycle-53AWWGFR.js.map} +0 -0
|
@@ -5,7 +5,12 @@ import { Button } from '@/components/ui/Button'
|
|
|
5
5
|
import { Form, FormField } from '@/components/ui/Form'
|
|
6
6
|
import { Input } from '@/components/ui/Input'
|
|
7
7
|
import { api } from '@/integrations/woodsportal-sdk'
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
handleAuthLoginResponse,
|
|
10
|
+
// WPHS_AUTH_NOT_FULL
|
|
11
|
+
MFA_REQUIRED_SCAFFOLD_MESSAGE,
|
|
12
|
+
// /WPHS_AUTH_NOT_FULL
|
|
13
|
+
} from '@/features/auth/login-session-bridge'
|
|
9
14
|
import { resolveAuthLoginErrorMessage } from '@/features/auth/resolve-auth-login-error-message'
|
|
10
15
|
import {
|
|
11
16
|
getStoredLoginEmail,
|
|
@@ -27,11 +32,13 @@ export function StarterLogin() {
|
|
|
27
32
|
const response = await login({ username: email.trim(), password })
|
|
28
33
|
const result = await handleAuthLoginResponse(response, router)
|
|
29
34
|
if (!result.success) {
|
|
35
|
+
// WPHS_AUTH_NOT_FULL
|
|
30
36
|
if (result.reason === 'mfa_required') {
|
|
31
37
|
toast.error(MFA_REQUIRED_SCAFFOLD_MESSAGE)
|
|
32
|
-
|
|
33
|
-
toast.error('Login failed — no access token returned.')
|
|
38
|
+
return
|
|
34
39
|
}
|
|
40
|
+
// /WPHS_AUTH_NOT_FULL
|
|
41
|
+
toast.error('Login failed — no access token returned.')
|
|
35
42
|
return
|
|
36
43
|
}
|
|
37
44
|
if (!result.mfaRequired) {
|
|
@@ -6,7 +6,12 @@ import { Form, FormField } from '@/components/ui/Form'
|
|
|
6
6
|
import { Input } from '@/components/ui/Input'
|
|
7
7
|
import { SsoLoginButton } from '@/components/ui/auth/SsoLoginButton'
|
|
8
8
|
import { api } from '@/integrations/woodsportal-sdk'
|
|
9
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
handleAuthLoginResponse,
|
|
11
|
+
// WPHS_AUTH_NOT_FULL
|
|
12
|
+
MFA_REQUIRED_SCAFFOLD_MESSAGE,
|
|
13
|
+
// /WPHS_AUTH_NOT_FULL
|
|
14
|
+
} from '@/features/auth/login-session-bridge'
|
|
10
15
|
import { resolveAuthLoginErrorMessage } from '@/features/auth/resolve-auth-login-error-message'
|
|
11
16
|
import {
|
|
12
17
|
getStoredLoginEmail,
|
|
@@ -28,11 +33,13 @@ export function StarterLogin() {
|
|
|
28
33
|
const response = await login({ username: email.trim(), password })
|
|
29
34
|
const result = await handleAuthLoginResponse(response, router)
|
|
30
35
|
if (!result.success) {
|
|
36
|
+
// WPHS_AUTH_NOT_FULL
|
|
31
37
|
if (result.reason === 'mfa_required') {
|
|
32
38
|
toast.error(MFA_REQUIRED_SCAFFOLD_MESSAGE)
|
|
33
|
-
|
|
34
|
-
toast.error('Login failed — no access token returned.')
|
|
39
|
+
return
|
|
35
40
|
}
|
|
41
|
+
// /WPHS_AUTH_NOT_FULL
|
|
42
|
+
toast.error('Login failed — no access token returned.')
|
|
36
43
|
return
|
|
37
44
|
}
|
|
38
45
|
if (!result.mfaRequired) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Routes } from '@/config/routes'
|
|
2
2
|
import { readHashPathname } from '@/features/auth/auth-route-paths'
|
|
3
3
|
import { normalizeRouterPath } from '@/utils/normalize-router-path'
|
|
4
|
+
import { WP_STORAGE_KEYS } from 'woodsportal-client-sdk'
|
|
4
5
|
|
|
5
6
|
export type SsoCallbackParams = {
|
|
6
7
|
code: string
|
|
@@ -60,6 +61,11 @@ export function clearPreHashQueryParams(): void {
|
|
|
60
61
|
window.history.replaceState(null, '', `${window.location.pathname}${window.location.hash}`)
|
|
61
62
|
}
|
|
62
63
|
|
|
64
|
+
/** Legacy sessionStorage inflight — clear on boot so stale keys never block exchange. */
|
|
65
|
+
export function clearLegacySsoCallbackInFlight(): void {
|
|
66
|
+
sessionStorage.removeItem(`${WP_STORAGE_KEYS.c.sso.cb}:inflight`)
|
|
67
|
+
}
|
|
68
|
+
|
|
63
69
|
export function isSsoCallbackAlreadyProcessed(key: string): boolean {
|
|
64
70
|
return processedKeys.has(key)
|
|
65
71
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/exec.ts","../src/lib/exec-debug.ts","../src/lib/errors.ts"],"sourcesContent":["import { spawn, spawnSync, type SpawnSyncOptions } from 'node:child_process'\n\nimport { formatExecDebugLine } from './exec-debug.js'\nimport { WpHsError, ExitCode } from './errors.js'\nimport type { Logger } from './logger.js'\n\nconst SECRET_PATTERN = /(token|secret|password|pat|key)=/i\n\nexport type RunOptions = {\n cwd: string\n env?: NodeJS.ProcessEnv\n logger?: Logger\n dryRun?: boolean\n timeoutMs?: number\n /** Expected exit code on success (default 0) */\n okCodes?: number[]\n /** Stream child stdout/stderr to the terminal (verbose mode). */\n streamOutput?: boolean\n /** Shorten cwd paths in debug logs. */\n projectRoot?: string\n}\n\nfunction logExec(logger: Logger | undefined, command: string, args: string[], options: RunOptions): void {\n if (!logger) return\n const env = options.env ?? process.env\n logger.debug(\n formatExecDebugLine(command, args, options.cwd, env, options.projectRoot),\n )\n}\n\nexport function runCommand(\n command: string,\n args: string[],\n options: RunOptions,\n): { status: number; stdout: string; stderr: string } {\n const { cwd, env = process.env, logger, dryRun = false, okCodes = [0], streamOutput = false } =\n options\n\n if (dryRun) {\n logger?.info(`[dry-run] ${formatExecDebugLine(command, args, cwd, env, options.projectRoot)}`)\n return { status: 0, stdout: '', stderr: '' }\n }\n\n logExec(logger, command, args, options)\n\n if (streamOutput) {\n const result = spawnSync(command, args, {\n cwd,\n env,\n encoding: 'utf8',\n stdio: 'inherit',\n })\n const status = result.status ?? 1\n throwOnBadExit(command, args, status, '', '', okCodes)\n return { status, stdout: '', stderr: '' }\n }\n\n const spawnOpts: SpawnSyncOptions = {\n cwd,\n env,\n encoding: 'utf8',\n stdio: ['inherit', 'pipe', 'pipe'],\n }\n\n const result = spawnSync(command, args, spawnOpts)\n const status = result.status ?? 1\n const stdout = typeof result.stdout === 'string' ? result.stdout : ''\n const stderr = typeof result.stderr === 'string' ? result.stderr : ''\n\n throwOnBadExit(command, args, status, stdout, stderr, okCodes)\n\n return { status, stdout, stderr }\n}\n\nexport function runNodeScript(\n scriptPath: string,\n args: string[],\n options: RunOptions,\n): void {\n runCommand(process.execPath, [scriptPath, ...args], options)\n}\n\nfunction throwOnBadExit(\n command: string,\n args: string[],\n status: number,\n stdout: string,\n stderr: string,\n okCodes: number[],\n): void {\n if (okCodes.includes(status)) {\n return\n }\n const detail = stderr.trim() || stdout.trim() || `exit ${status}`\n if (SECRET_PATTERN.test(detail)) {\n throw new WpHsError(`Command failed: ${command}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Re-run with --verbose for details (secrets are never logged).',\n })\n }\n throw new WpHsError(`Command failed: ${command} ${args.join(' ')}\\n${detail}`, {\n exitCode: ExitCode.USER_ERROR,\n })\n}\n\n/**\n * Non-blocking spawn — keeps the Node event loop alive so @clack spinners animate.\n */\nexport function runCommandAsync(\n command: string,\n args: string[],\n options: RunOptions,\n): Promise<{ status: number; stdout: string; stderr: string }> {\n const { cwd, env = process.env, logger, dryRun = false, okCodes = [0], streamOutput = false } =\n options\n\n if (dryRun) {\n logger?.info(`[dry-run] ${formatExecDebugLine(command, args, cwd, env, options.projectRoot)}`)\n return Promise.resolve({ status: 0, stdout: '', stderr: '' })\n }\n\n logExec(logger, command, args, options)\n\n if (streamOutput) {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n env,\n stdio: 'inherit',\n })\n\n child.on('error', (error) => {\n reject(error)\n })\n\n child.on('close', (code) => {\n const status = code ?? 1\n try {\n throwOnBadExit(command, args, status, '', '', okCodes)\n resolve({ status, stdout: '', stderr: '' })\n } catch (error) {\n reject(error)\n }\n })\n })\n }\n\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n env,\n stdio: ['inherit', 'pipe', 'pipe'],\n })\n\n let stdout = ''\n let stderr = ''\n\n child.stdout?.setEncoding('utf8')\n child.stderr?.setEncoding('utf8')\n child.stdout?.on('data', (chunk: string) => {\n stdout += chunk\n })\n child.stderr?.on('data', (chunk: string) => {\n stderr += chunk\n })\n\n child.on('error', (error) => {\n reject(error)\n })\n\n child.on('close', (code) => {\n const status = code ?? 1\n try {\n throwOnBadExit(command, args, status, stdout, stderr, okCodes)\n resolve({ status, stdout, stderr })\n } catch (error) {\n reject(error)\n }\n })\n })\n}\n\nexport function runNodeScriptAsync(\n scriptPath: string,\n args: string[],\n options: RunOptions,\n): Promise<void> {\n return runCommandAsync(process.execPath, [scriptPath, ...args], options).then(() => undefined)\n}\n\n/**\n * Spawn a Node script with inherited stdio and forward SIGINT/SIGTERM (wp watch, long-running tools).\n * Unlike spawnSync, the parent event loop stays alive so Ctrl+C works while the child runs.\n */\nexport function runNodeScriptLongRunning(\n scriptPath: string,\n args: string[],\n options: RunOptions,\n): Promise<number> {\n const { cwd, env = process.env, logger, dryRun = false } = options\n\n if (dryRun) {\n logger?.info(\n `[dry-run] ${formatExecDebugLine(process.execPath, [scriptPath, ...args], cwd, env, options.projectRoot)}`,\n )\n return Promise.resolve(0)\n }\n\n return new Promise((resolve, reject) => {\n const child = spawn(process.execPath, [scriptPath, ...args], {\n cwd,\n env,\n stdio: 'inherit',\n })\n\n const forwardSignal = (signal: NodeJS.Signals) => {\n if (!child.killed) {\n child.kill(signal)\n }\n }\n\n process.on('SIGINT', forwardSignal)\n process.on('SIGTERM', forwardSignal)\n\n child.on('error', (error) => {\n process.off('SIGINT', forwardSignal)\n process.off('SIGTERM', forwardSignal)\n reject(error)\n })\n\n child.on('exit', (code, signal) => {\n process.off('SIGINT', forwardSignal)\n process.off('SIGTERM', forwardSignal)\n\n if (signal === 'SIGINT') {\n resolve(130)\n return\n }\n if (signal === 'SIGTERM') {\n resolve(143)\n return\n }\n\n resolve(code ?? 1)\n })\n })\n}\n","import { basename, relative } from 'node:path'\n\nconst SECRET_ENV_KEY =\n /(_KEY|_TOKEN|_SECRET|_PASSWORD|_PAT|AUTH|CREDENTIAL|GITHUB|NPM_|ERASER|LINEAR|AWS_|SSH_)/i\n\nconst RELEVANT_ENV_PREFIX = /^WP_HS_|^WP_/\n\nexport function isSecretEnvKey(key: string): boolean {\n return SECRET_ENV_KEY.test(key)\n}\n\nexport function maskEnvForLog(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const masked: NodeJS.ProcessEnv = {}\n for (const [key, value] of Object.entries(env)) {\n if (value === undefined) continue\n masked[key] = isSecretEnvKey(key) ? '[redacted]' : value\n }\n return masked\n}\n\nexport function formatRelevantEnv(env: NodeJS.ProcessEnv): string | undefined {\n const pairs = Object.entries(env)\n .filter(([key, value]) => value !== undefined && RELEVANT_ENV_PREFIX.test(key))\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, value]) => {\n const shown = isSecretEnvKey(key) ? '[redacted]' : value\n return `${key}=${shown}`\n })\n\n return pairs.length > 0 ? pairs.join(' ') : undefined\n}\n\nfunction shortenScriptPath(scriptPath: string): string {\n const marker = '/scripts/'\n const idx = scriptPath.lastIndexOf(marker)\n if (idx >= 0) {\n return `scripts/${scriptPath.slice(idx + marker.length)}`\n }\n return basename(scriptPath)\n}\n\nexport function formatExecCommand(command: string, args: string[]): string {\n if (command === process.execPath && args.length > 0) {\n const rest = args.slice(1).join(' ')\n return `node ${shortenScriptPath(args[0])}${rest ? ` ${rest}` : ''}`\n }\n return [command, ...args].join(' ')\n}\n\nexport function formatExecCwd(cwd: string, projectRoot?: string): string {\n if (projectRoot) {\n try {\n const rel = relative(projectRoot, cwd)\n if (!rel.startsWith('..')) {\n return rel === '' ? '.' : rel\n }\n } catch {\n // fall through\n }\n }\n const parts = cwd.split('/')\n if (parts.length > 3) {\n return `…/${parts.slice(-2).join('/')}`\n }\n return cwd\n}\n\n/** One-line verbose exec label for developers (no full env dump). */\nexport function formatExecDebugLine(\n command: string,\n args: string[],\n cwd: string,\n env: NodeJS.ProcessEnv,\n projectRoot?: string,\n): string {\n const cmd = formatExecCommand(command, args)\n const cwdLabel = formatExecCwd(cwd, projectRoot)\n const envLabel = formatRelevantEnv(env)\n const parts = [cmd, `cwd=${cwdLabel}`]\n if (envLabel) {\n parts.push(envLabel)\n }\n return parts.join(' ')\n}\n","export const ExitCode = {\n SUCCESS: 0,\n USER_ERROR: 1,\n PREREQUISITE: 2,\n BUILD_FAILED: 3,\n PUBLISH_FAILED: 4,\n AUDIT_FAILED: 5,\n INTERNAL: 10,\n} as const\n\nexport type ExitCodeValue = (typeof ExitCode)[keyof typeof ExitCode]\n\nexport class WpHsError extends Error {\n readonly exitCode: ExitCodeValue\n readonly remediation?: string\n\n constructor(\n message: string,\n options: { exitCode?: ExitCodeValue; remediation?: string; cause?: unknown } = {},\n ) {\n super(message, { cause: options.cause })\n this.name = 'WpHsError'\n this.exitCode = options.exitCode ?? ExitCode.USER_ERROR\n this.remediation = options.remediation\n }\n}\n\nexport function isWpHsError(error: unknown): error is WpHsError {\n return error instanceof WpHsError\n}\n"],"mappings":"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","names":["result","status"]}
|
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
#!/usr/bin/env node
|
|
3
|
-
|
|
4
|
-
// scripts/ensure-wphs-workspace.mjs
|
|
5
|
-
import { existsSync as existsSync5, mkdirSync as mkdirSync2, writeFileSync } from "fs";
|
|
6
|
-
|
|
7
|
-
// scripts/project-root.mjs
|
|
8
|
-
import { existsSync as existsSync2 } from "fs";
|
|
9
|
-
import { dirname, resolve as resolve2 } from "path";
|
|
10
|
-
import { fileURLToPath } from "url";
|
|
11
|
-
|
|
12
|
-
// scripts/config-files.mjs
|
|
13
|
-
import { existsSync } from "fs";
|
|
14
|
-
import { resolve } from "path";
|
|
15
|
-
var WOODSCLI_CONFIG_FILE = "woodscli.json";
|
|
16
|
-
function woodscliConfigPath(projectRoot) {
|
|
17
|
-
return resolve(projectRoot, WOODSCLI_CONFIG_FILE);
|
|
18
|
-
}
|
|
19
|
-
function resolveProjectConfigPath(projectRoot) {
|
|
20
|
-
const fromEnv = process.env.WOODSCLI_CONFIG?.trim() || process.env.WP_HS_CONFIG?.trim() || null;
|
|
21
|
-
if (fromEnv) {
|
|
22
|
-
const path2 = resolve(projectRoot, fromEnv);
|
|
23
|
-
return existsSync(path2) ? path2 : null;
|
|
24
|
-
}
|
|
25
|
-
const path = woodscliConfigPath(projectRoot);
|
|
26
|
-
return existsSync(path) ? path : null;
|
|
27
|
-
}
|
|
28
|
-
function findProjectRootWithConfig(from = process.cwd()) {
|
|
29
|
-
if (process.env.WP_HS_PROJECT_ROOT?.trim()) {
|
|
30
|
-
return resolve(process.env.WP_HS_PROJECT_ROOT.trim());
|
|
31
|
-
}
|
|
32
|
-
let dir = resolve(from);
|
|
33
|
-
while (true) {
|
|
34
|
-
if (resolveProjectConfigPath(dir)) return dir;
|
|
35
|
-
const parent = resolve(dir, "..");
|
|
36
|
-
if (parent === dir) return resolve(from);
|
|
37
|
-
dir = parent;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// scripts/project-root.mjs
|
|
42
|
-
var kitRoot = resolve2(dirname(fileURLToPath(import.meta.url)), "..");
|
|
43
|
-
function findProjectRoot(from = process.cwd()) {
|
|
44
|
-
return findProjectRootWithConfig(from);
|
|
45
|
-
}
|
|
46
|
-
function getKitRoot() {
|
|
47
|
-
return kitRoot;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// scripts/wphs-paths.mjs
|
|
51
|
-
import { existsSync as existsSync3, readFileSync } from "fs";
|
|
52
|
-
import { join, resolve as resolve3 } from "path";
|
|
53
|
-
var WPHS_WORKSPACE_DIR = ".wphs";
|
|
54
|
-
var LEGACY_WORKSPACE_DIRS = [".dev", ".woodsportal"];
|
|
55
|
-
function readWphsWorkspaceDir(projectRoot) {
|
|
56
|
-
const root = projectRoot ?? findProjectRootWithConfig();
|
|
57
|
-
const configPath = resolveProjectConfigPath(root);
|
|
58
|
-
if (configPath && existsSync3(configPath)) {
|
|
59
|
-
try {
|
|
60
|
-
const raw = JSON.parse(readFileSync(configPath, "utf8"));
|
|
61
|
-
const dir = raw?.dev?.moduleConfigDir;
|
|
62
|
-
if (typeof dir === "string" && dir.trim()) {
|
|
63
|
-
const trimmed = dir.trim();
|
|
64
|
-
if (trimmed !== WPHS_WORKSPACE_DIR) {
|
|
65
|
-
throw new Error(
|
|
66
|
-
`dev.moduleConfigDir must be "${WPHS_WORKSPACE_DIR}" (got "${trimmed}"). Run wp migrate.`
|
|
67
|
-
);
|
|
68
|
-
}
|
|
69
|
-
return trimmed;
|
|
70
|
-
}
|
|
71
|
-
} catch (error) {
|
|
72
|
-
if (error instanceof Error && error.message.includes("moduleConfigDir")) {
|
|
73
|
-
throw error;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return WPHS_WORKSPACE_DIR;
|
|
78
|
-
}
|
|
79
|
-
function wphsPaths(projectRoot) {
|
|
80
|
-
const workspaceDir = readWphsWorkspaceDir(projectRoot);
|
|
81
|
-
const workspaceRoot = resolve3(projectRoot, workspaceDir);
|
|
82
|
-
return {
|
|
83
|
-
workspaceDir,
|
|
84
|
-
moduleConfigDir: workspaceDir,
|
|
85
|
-
workspaceRoot,
|
|
86
|
-
devDir: workspaceRoot,
|
|
87
|
-
configDir: join(workspaceRoot, "config"),
|
|
88
|
-
localConfigPath: join(workspaceRoot, "config", "module-config.local.json"),
|
|
89
|
-
exampleConfigPath: join(workspaceRoot, "config", "module-config.example.json"),
|
|
90
|
-
assetsDir: join(workspaceRoot, "assets", "branding"),
|
|
91
|
-
fixturesDir: join(workspaceRoot, "fixtures"),
|
|
92
|
-
hubspotDataFixturePath: join(workspaceRoot, "fixtures", "hubspot-data.json"),
|
|
93
|
-
previewFixturesDir: join(workspaceRoot, "fixtures", "preview"),
|
|
94
|
-
cacheDir: join(workspaceRoot, "cache"),
|
|
95
|
-
auditDir: join(workspaceRoot, "audit"),
|
|
96
|
-
baselineDir: join(workspaceRoot, "audit", "baseline"),
|
|
97
|
-
stateDir: join(workspaceRoot, "state"),
|
|
98
|
-
kitModuleConfigLink: join(workspaceRoot, ".kit-module-config"),
|
|
99
|
-
kitBootstrapLink: join(workspaceRoot, ".kit-bootstrap.tsx"),
|
|
100
|
-
kitBootstrapGreenfieldLink: join(workspaceRoot, ".kit-bootstrap-greenfield.tsx"),
|
|
101
|
-
readmePath: join(workspaceRoot, "README.md"),
|
|
102
|
-
brandingAssetsUrlPrefix: `/${workspaceDir}/assets/branding/`,
|
|
103
|
-
legacyBrandingAssetsUrlPrefixes: [
|
|
104
|
-
"/dev/branding-assets/",
|
|
105
|
-
"/.dev/branding-assets/",
|
|
106
|
-
`/${workspaceDir}/branding-assets/`
|
|
107
|
-
],
|
|
108
|
-
legacyWorkspaceDirs: LEGACY_WORKSPACE_DIRS
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
function moduleConfigPaths(projectRoot) {
|
|
112
|
-
const paths = wphsPaths(projectRoot);
|
|
113
|
-
return {
|
|
114
|
-
moduleConfigDir: paths.moduleConfigDir,
|
|
115
|
-
devDir: paths.devDir,
|
|
116
|
-
localConfigPath: paths.localConfigPath,
|
|
117
|
-
exampleConfigPath: paths.exampleConfigPath,
|
|
118
|
-
assetsDir: paths.assetsDir,
|
|
119
|
-
brandingAssetsUrlPrefix: paths.brandingAssetsUrlPrefix,
|
|
120
|
-
legacyBrandingAssetsUrlPrefix: paths.legacyBrandingAssetsUrlPrefixes[0],
|
|
121
|
-
legacyBrandingAssetsUrlPrefixes: paths.legacyBrandingAssetsUrlPrefixes,
|
|
122
|
-
...paths
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
function wphsWorkspaceSubdirs(projectRoot) {
|
|
126
|
-
const p = wphsPaths(projectRoot);
|
|
127
|
-
return [
|
|
128
|
-
p.configDir,
|
|
129
|
-
p.assetsDir,
|
|
130
|
-
p.fixturesDir,
|
|
131
|
-
p.previewFixturesDir,
|
|
132
|
-
p.cacheDir,
|
|
133
|
-
p.auditDir,
|
|
134
|
-
p.baselineDir,
|
|
135
|
-
p.stateDir
|
|
136
|
-
];
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// scripts/vite/ensure-dev-kit-shims.js
|
|
140
|
-
import { cpSync, existsSync as existsSync4, lstatSync, mkdirSync, rmSync, symlinkSync } from "fs";
|
|
141
|
-
import { dirname as dirname2, resolve as resolve4 } from "path";
|
|
142
|
-
import { platform } from "os";
|
|
143
|
-
var isWin = platform() === "win32";
|
|
144
|
-
function ensureKitShim(shimPath, target, { directory }) {
|
|
145
|
-
const targetAbs = resolve4(target);
|
|
146
|
-
const shimAbs = resolve4(shimPath);
|
|
147
|
-
try {
|
|
148
|
-
if (existsSync4(shimAbs)) {
|
|
149
|
-
const stat = lstatSync(shimAbs);
|
|
150
|
-
if (stat.isSymbolicLink()) {
|
|
151
|
-
return shimAbs;
|
|
152
|
-
}
|
|
153
|
-
rmSync(shimAbs, { recursive: directory, force: true });
|
|
154
|
-
}
|
|
155
|
-
mkdirSync(dirname2(shimAbs), { recursive: true });
|
|
156
|
-
if (isWin && directory) {
|
|
157
|
-
symlinkSync(targetAbs, shimAbs, "junction");
|
|
158
|
-
return shimAbs;
|
|
159
|
-
}
|
|
160
|
-
symlinkSync(targetAbs, shimAbs, directory ? "dir" : "file");
|
|
161
|
-
return shimAbs;
|
|
162
|
-
} catch {
|
|
163
|
-
try {
|
|
164
|
-
if (existsSync4(shimAbs)) {
|
|
165
|
-
rmSync(shimAbs, { recursive: directory, force: true });
|
|
166
|
-
}
|
|
167
|
-
mkdirSync(dirname2(shimAbs), { recursive: true });
|
|
168
|
-
cpSync(targetAbs, shimAbs, { recursive: directory, force: true });
|
|
169
|
-
return shimAbs;
|
|
170
|
-
} catch {
|
|
171
|
-
return targetAbs;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
function ensureDevKitShims(projectRoot, kitRoot2) {
|
|
176
|
-
const { devDir } = moduleConfigPaths(projectRoot);
|
|
177
|
-
const moduleConfigRoot = ensureKitShim(
|
|
178
|
-
resolve4(devDir, ".kit-module-config"),
|
|
179
|
-
resolve4(kitRoot2, "src/dev-module-config"),
|
|
180
|
-
{ directory: true }
|
|
181
|
-
);
|
|
182
|
-
const bootstrapShim = ensureKitShim(
|
|
183
|
-
resolve4(devDir, ".kit-bootstrap.tsx"),
|
|
184
|
-
resolve4(kitRoot2, "src/dev/bootstrap.tsx"),
|
|
185
|
-
{ directory: false }
|
|
186
|
-
);
|
|
187
|
-
const bootstrapGreenfieldShim = ensureKitShim(
|
|
188
|
-
resolve4(devDir, ".kit-bootstrap-greenfield.tsx"),
|
|
189
|
-
resolve4(kitRoot2, "src/dev/bootstrap-greenfield.tsx"),
|
|
190
|
-
{ directory: false }
|
|
191
|
-
);
|
|
192
|
-
return { moduleConfigRoot, bootstrapShim, bootstrapGreenfieldShim };
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
// scripts/ensure-wphs-workspace.mjs
|
|
196
|
-
var WPHS_README = `# WoodsCLI workspace (.wphs/)
|
|
197
|
-
|
|
198
|
-
Local state for **WoodsCLI** (\`@woodsportal/hubspot-kit\`). Not shipped to HubSpot.
|
|
199
|
-
|
|
200
|
-
| Path | Purpose |
|
|
201
|
-
|------|---------|
|
|
202
|
-
| \`config/module-config.local.json\` | Live Content/Styles values (gitignored) |
|
|
203
|
-
| \`config/module-config.example.json\` | Example generated from \`fields.json\` |
|
|
204
|
-
| \`assets/branding/\` | Dev-tool uploaded images (gitignored) |
|
|
205
|
-
| \`fixtures/\` | Optional preview / hubspot-data overrides |
|
|
206
|
-
| \`cache/\` | CLI caches (gitignored) |
|
|
207
|
-
| \`audit/baseline/\` | Build parity snapshots (gitignored) |
|
|
208
|
-
| \`.kit-module-config\` | Symlink to kit dev-module-config |
|
|
209
|
-
| \`.kit-bootstrap.tsx\` | Symlink to kit dev bootstrap (full portal) |
|
|
210
|
-
| \`.kit-bootstrap-greenfield.tsx\` | Symlink to kit greenfield dev bootstrap |
|
|
211
|
-
|
|
212
|
-
Run \`wp doctor\` to recreate missing folders.
|
|
213
|
-
`;
|
|
214
|
-
function ensureWphsWorkspace(projectRoot, kitRoot2) {
|
|
215
|
-
const root = projectRoot ?? findProjectRoot();
|
|
216
|
-
const kit = kitRoot2 ?? getKitRoot();
|
|
217
|
-
const paths = wphsPaths(root);
|
|
218
|
-
for (const dir of wphsWorkspaceSubdirs(root)) {
|
|
219
|
-
mkdirSync2(dir, { recursive: true });
|
|
220
|
-
}
|
|
221
|
-
if (!existsSync5(paths.readmePath)) {
|
|
222
|
-
writeFileSync(paths.readmePath, WPHS_README);
|
|
223
|
-
}
|
|
224
|
-
ensureDevKitShims(root, kit);
|
|
225
|
-
return paths;
|
|
226
|
-
}
|
|
227
|
-
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
228
|
-
const paths = ensureWphsWorkspace();
|
|
229
|
-
console.log(`[wphs] workspace ready at ${paths.workspaceRoot}`);
|
|
230
|
-
}
|
|
231
|
-
export {
|
|
232
|
-
ensureWphsWorkspace
|
|
233
|
-
};
|
|
234
|
-
//# sourceMappingURL=ensure-wphs-workspace-5S3GTO6K.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../scripts/ensure-wphs-workspace.mjs","../scripts/project-root.mjs","../scripts/config-files.mjs","../scripts/wphs-paths.mjs","../scripts/vite/ensure-dev-kit-shims.js"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Scaffold WoodsCLI `.wphs/` workspace + kit symlinks.\n */\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs'\n\nimport { findProjectRoot, getKitRoot } from './project-root.mjs'\nimport { wphsPaths, wphsWorkspaceSubdirs } from './wphs-paths.mjs'\nimport { ensureDevKitShims } from './vite/ensure-dev-kit-shims.js'\n\nconst WPHS_README = `# WoodsCLI workspace (.wphs/)\n\nLocal state for **WoodsCLI** (\\`@woodsportal/hubspot-kit\\`). Not shipped to HubSpot.\n\n| Path | Purpose |\n|------|---------|\n| \\`config/module-config.local.json\\` | Live Content/Styles values (gitignored) |\n| \\`config/module-config.example.json\\` | Example generated from \\`fields.json\\` |\n| \\`assets/branding/\\` | Dev-tool uploaded images (gitignored) |\n| \\`fixtures/\\` | Optional preview / hubspot-data overrides |\n| \\`cache/\\` | CLI caches (gitignored) |\n| \\`audit/baseline/\\` | Build parity snapshots (gitignored) |\n| \\`.kit-module-config\\` | Symlink to kit dev-module-config |\n| \\`.kit-bootstrap.tsx\\` | Symlink to kit dev bootstrap (full portal) |\n| \\`.kit-bootstrap-greenfield.tsx\\` | Symlink to kit greenfield dev bootstrap |\n\nRun \\`wp doctor\\` to recreate missing folders.\n`\n\n/**\n * @param {string} [projectRoot]\n * @param {string} [kitRoot]\n */\nexport function ensureWphsWorkspace(projectRoot, kitRoot) {\n const root = projectRoot ?? findProjectRoot()\n const kit = kitRoot ?? getKitRoot()\n const paths = wphsPaths(root)\n\n for (const dir of wphsWorkspaceSubdirs(root)) {\n mkdirSync(dir, { recursive: true })\n }\n\n if (!existsSync(paths.readmePath)) {\n writeFileSync(paths.readmePath, WPHS_README)\n }\n\n ensureDevKitShims(root, kit)\n return paths\n}\n\nif (import.meta.url === `file://${process.argv[1]}`) {\n const paths = ensureWphsWorkspace()\n console.log(`[wphs] workspace ready at ${paths.workspaceRoot}`)\n}\n","/**\n * Resolve consumer project root (woodscli.json) vs kit package root.\n */\nimport { existsSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { findProjectRootWithConfig } from './config-files.mjs'\n\nconst kitRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..')\n\n/**\n * @param {string} [from]\n */\nexport function findProjectRoot(from = process.cwd()) {\n return findProjectRootWithConfig(from)\n}\n\nexport function getKitRoot() {\n return kitRoot\n}\n\n/**\n * @param {...string} segments\n */\nexport function kitPath(...segments) {\n return resolve(kitRoot, ...segments)\n}\n\nexport { resolveProjectConfigPath, WOODSCLI_CONFIG_FILE, LEGACY_WOODSPORTAL_HS_FILE } from './config-files.mjs'\n","/**\n * Shared project config resolution — `woodscli.json` only.\n */\nimport { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nexport const WOODSCLI_CONFIG_FILE = 'woodscli.json'\nexport const LEGACY_WOODSPORTAL_HS_FILE = 'woodsportal.hs.json'\n\n/**\n * @param {string} projectRoot\n */\nexport function woodscliConfigPath(projectRoot) {\n return resolve(projectRoot, WOODSCLI_CONFIG_FILE)\n}\n\n/**\n * @param {string} projectRoot\n */\nexport function legacyConfigPath(projectRoot) {\n return resolve(projectRoot, LEGACY_WOODSPORTAL_HS_FILE)\n}\n\n/**\n * @param {string} projectRoot\n */\nexport function resolveProjectConfigPath(projectRoot) {\n const fromEnv = process.env.WOODSCLI_CONFIG?.trim() || process.env.WP_HS_CONFIG?.trim() || null\n if (fromEnv) {\n const path = resolve(projectRoot, fromEnv)\n return existsSync(path) ? path : null\n }\n\n const path = woodscliConfigPath(projectRoot)\n return existsSync(path) ? path : null\n}\n\n/**\n * @param {string} [from]\n */\nexport function findProjectRootWithConfig(from = process.cwd()) {\n if (process.env.WP_HS_PROJECT_ROOT?.trim()) {\n return resolve(process.env.WP_HS_PROJECT_ROOT.trim())\n }\n\n let dir = resolve(from)\n while (true) {\n if (resolveProjectConfigPath(dir)) return dir\n const parent = resolve(dir, '..')\n if (parent === dir) return resolve(from)\n dir = parent\n }\n}\n","/**\n * WoodsCLI workspace (`.wphs/`) — single local home for config, assets, fixtures, cache, audit.\n */\nimport { existsSync, readFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport { findProjectRootWithConfig, resolveProjectConfigPath } from './config-files.mjs'\n\nexport const WPHS_WORKSPACE_DIR = '.wphs'\n\n/** @deprecated use WPHS_WORKSPACE_DIR */\nexport const DEFAULT_MODULE_CONFIG_DIR = WPHS_WORKSPACE_DIR\n\nconst LEGACY_WORKSPACE_DIRS = ['.dev', '.woodsportal']\n\n/**\n * @param {string} [projectRoot]\n */\nexport function readWphsWorkspaceDir(projectRoot) {\n const root = projectRoot ?? findProjectRootWithConfig()\n const configPath = resolveProjectConfigPath(root)\n if (configPath && existsSync(configPath)) {\n try {\n const raw = JSON.parse(readFileSync(configPath, 'utf8'))\n const dir = raw?.dev?.moduleConfigDir\n if (typeof dir === 'string' && dir.trim()) {\n const trimmed = dir.trim()\n if (trimmed !== WPHS_WORKSPACE_DIR) {\n throw new Error(\n `dev.moduleConfigDir must be \"${WPHS_WORKSPACE_DIR}\" (got \"${trimmed}\"). Run wp migrate.`,\n )\n }\n return trimmed\n }\n } catch (error) {\n if (error instanceof Error && error.message.includes('moduleConfigDir')) {\n throw error\n }\n }\n }\n return WPHS_WORKSPACE_DIR\n}\n\n/** @deprecated use readWphsWorkspaceDir */\nexport const readModuleConfigDir = readWphsWorkspaceDir\n\n/**\n * @param {string} projectRoot\n */\nexport function wphsPaths(projectRoot) {\n const workspaceDir = readWphsWorkspaceDir(projectRoot)\n const workspaceRoot = resolve(projectRoot, workspaceDir)\n return {\n workspaceDir,\n moduleConfigDir: workspaceDir,\n workspaceRoot,\n devDir: workspaceRoot,\n configDir: join(workspaceRoot, 'config'),\n localConfigPath: join(workspaceRoot, 'config', 'module-config.local.json'),\n exampleConfigPath: join(workspaceRoot, 'config', 'module-config.example.json'),\n assetsDir: join(workspaceRoot, 'assets', 'branding'),\n fixturesDir: join(workspaceRoot, 'fixtures'),\n hubspotDataFixturePath: join(workspaceRoot, 'fixtures', 'hubspot-data.json'),\n previewFixturesDir: join(workspaceRoot, 'fixtures', 'preview'),\n cacheDir: join(workspaceRoot, 'cache'),\n auditDir: join(workspaceRoot, 'audit'),\n baselineDir: join(workspaceRoot, 'audit', 'baseline'),\n stateDir: join(workspaceRoot, 'state'),\n kitModuleConfigLink: join(workspaceRoot, '.kit-module-config'),\n kitBootstrapLink: join(workspaceRoot, '.kit-bootstrap.tsx'),\n kitBootstrapGreenfieldLink: join(workspaceRoot, '.kit-bootstrap-greenfield.tsx'),\n readmePath: join(workspaceRoot, 'README.md'),\n brandingAssetsUrlPrefix: `/${workspaceDir}/assets/branding/`,\n legacyBrandingAssetsUrlPrefixes: [\n '/dev/branding-assets/',\n '/.dev/branding-assets/',\n `/${workspaceDir}/branding-assets/`,\n ],\n legacyWorkspaceDirs: LEGACY_WORKSPACE_DIRS,\n }\n}\n\n/** @deprecated use wphsPaths */\nexport function moduleConfigPaths(projectRoot) {\n const paths = wphsPaths(projectRoot)\n return {\n moduleConfigDir: paths.moduleConfigDir,\n devDir: paths.devDir,\n localConfigPath: paths.localConfigPath,\n exampleConfigPath: paths.exampleConfigPath,\n assetsDir: paths.assetsDir,\n brandingAssetsUrlPrefix: paths.brandingAssetsUrlPrefix,\n legacyBrandingAssetsUrlPrefix: paths.legacyBrandingAssetsUrlPrefixes[0],\n legacyBrandingAssetsUrlPrefixes: paths.legacyBrandingAssetsUrlPrefixes,\n ...paths,\n }\n}\n\n/**\n * Subdirectories created by wp doctor / wp init.\n * @param {string} projectRoot\n * @returns {string[]}\n */\nexport function wphsWorkspaceSubdirs(projectRoot) {\n const p = wphsPaths(projectRoot)\n return [\n p.configDir,\n p.assetsDir,\n p.fixturesDir,\n p.previewFixturesDir,\n p.cacheDir,\n p.auditDir,\n p.baselineDir,\n p.stateDir,\n ]\n}\n","import { cpSync, existsSync, lstatSync, mkdirSync, rmSync, symlinkSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport { platform } from 'node:os'\n\nimport { moduleConfigPaths } from '../module-config-dir.mjs'\n\nconst isWin = platform() === 'win32'\n\n/**\n * Link or copy kit dev sources into `.wphs/` so Vite serves them in-project.\n * Windows: directory junctions (no admin) and file copy fallback — symlinks often fail with EPERM.\n */\nexport function ensureKitShim(shimPath, target, { directory }) {\n const targetAbs = resolve(target)\n const shimAbs = resolve(shimPath)\n\n try {\n if (existsSync(shimAbs)) {\n const stat = lstatSync(shimAbs)\n if (stat.isSymbolicLink()) {\n return shimAbs\n }\n rmSync(shimAbs, { recursive: directory, force: true })\n }\n\n mkdirSync(dirname(shimAbs), { recursive: true })\n\n if (isWin && directory) {\n symlinkSync(targetAbs, shimAbs, 'junction')\n return shimAbs\n }\n\n symlinkSync(targetAbs, shimAbs, directory ? 'dir' : 'file')\n return shimAbs\n } catch {\n try {\n if (existsSync(shimAbs)) {\n rmSync(shimAbs, { recursive: directory, force: true })\n }\n mkdirSync(dirname(shimAbs), { recursive: true })\n cpSync(targetAbs, shimAbs, { recursive: directory, force: true })\n return shimAbs\n } catch {\n return targetAbs\n }\n }\n}\n\n/**\n * Symlink kit dev sources into the consumer repo so Vite serves them in-root\n * (avoids @fs/ + broken react/jsx-dev-runtime / react-dom CJS interop).\n */\nexport function ensureDevKitShims(projectRoot, kitRoot) {\n const { devDir } = moduleConfigPaths(projectRoot)\n\n const moduleConfigRoot = ensureKitShim(\n resolve(devDir, '.kit-module-config'),\n resolve(kitRoot, 'src/dev-module-config'),\n { directory: true },\n )\n\n const bootstrapShim = ensureKitShim(\n resolve(devDir, '.kit-bootstrap.tsx'),\n resolve(kitRoot, 'src/dev/bootstrap.tsx'),\n { directory: false },\n )\n\n const bootstrapGreenfieldShim = ensureKitShim(\n resolve(devDir, '.kit-bootstrap-greenfield.tsx'),\n resolve(kitRoot, 'src/dev/bootstrap-greenfield.tsx'),\n { directory: false },\n )\n\n return { moduleConfigRoot, bootstrapShim, bootstrapGreenfieldShim }\n}\n\n/** @deprecated use ensureDevKitShims */\nexport function ensureDevModuleConfigShim(projectRoot, kitRoot) {\n return ensureDevKitShims(projectRoot, kitRoot).moduleConfigRoot\n}\n"],"mappings":"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","names":["existsSync","mkdirSync","existsSync","resolve","path","resolve","existsSync","resolve","existsSync","resolve","existsSync","dirname","resolve","resolve","existsSync","dirname","kitRoot","kitRoot","mkdirSync","existsSync"]}
|
|
File without changes
|
|
File without changes
|
/package/dist/{scaffold-page-lifecycle-EHMPWPPE.js.map → scaffold-page-lifecycle-53AWWGFR.js.map}
RENAMED
|
File without changes
|