your-ai-workflow-firebase-os 1.2.36 → 1.2.38
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/vite.cjs.js +1 -1
- package/dist/vite.es.js +31 -15
- package/dist/your-ai-workflow-firebase-os.cjs.js +13 -12
- package/dist/your-ai-workflow-firebase-os.css +1 -1
- package/dist/your-ai-workflow-firebase-os.es.js +1059 -1036
- package/package.json +1 -1
- package/scripts/postinstall.js +42 -22
- package/src/index.css +25 -0
package/dist/vite.cjs.js
CHANGED
|
@@ -157,4 +157,4 @@ if (typeof window !== 'undefined') {
|
|
|
157
157
|
export const pagesRegistry = pages;
|
|
158
158
|
export const formsRegistry = forms;
|
|
159
159
|
export const microcomponentRegistry = microcomponents;
|
|
160
|
-
`}var T=e=>w(x(e)),E=e=>e.split(`/`).pop()||e,D=e=>/\/configs\/[^/]+$/.test(e),O=e=>/\/microcomponents\/[^/]+\.tsx$/.test(e),k=e=>e.replace(/\/\*[\s\S]*?\*\//g,``).replace(/(^|[^:\\'"`])\/\/.*$/gm,`$1`),A=(e,t)=>{let n=RegExp(`(?:^|[\\s,{])${t}\\s*:\\s*([^,\\n}]+)`,`g`),r=[],i;for(;i=n.exec(e);)r.push(i[1].trim());return r},j=e=>{let t=e.match(/^(['"`])([^'"`]*)\1$/);return t?t[2]:null},M=e=>/export\s+(?:const|let|var|function|class)\s+\w*Config\b/.test(e)||/export\s*\{[^}]*\b\w*Config\b[^}]*\}/.test(e),N=e=>/export\s+default\b/.test(e),P=e=>{let t=A(e,`route`);return{first:t[0],count:t.length}};function F(e){let t=[],n=[],r=new Map;for(let{file:i,source:
|
|
160
|
+
`}var T=e=>w(x(e)),E=e=>e.split(`/`).pop()||e,D=e=>/\/configs\/[^/]+$/.test(e),O=e=>/\/microcomponents\/[^/]+\.tsx$/.test(e),k=e=>e.replace(/\/\*[\s\S]*?\*\//g,``).replace(/(^|[^:\\'"`])\/\/.*$/gm,`$1`),A=(e,t)=>{let n=RegExp(`(?:^|[\\s,{])${t}\\s*:\\s*([^,\\n}]+)`,`g`),r=[],i;for(;i=n.exec(e);)r.push(i[1].trim());return r},j=e=>{let t=e.match(/^(['"`])([^'"`]*)\1$/);return t?t[2]:null},M=e=>/export\s+(?:const|let|var|function|class)\s+\w*Config\b/.test(e)||/export\s*\{[^}]*\b\w*Config\b[^}]*\}/.test(e),N=e=>/export\s+default\b/.test(e),P=e=>{let t=A(e,`route`);return{first:t[0],count:t.length}};function F(e){let t=[],n=[],r=new Map,i=new Set;for(let{file:t}of e)if(O(t))for(let e of h(E(t)))i.add(e);for(let{file:a,source:o}of e){let e=E(a),s=k(o);if(D(a)){let n=_(e);if(n===`shipped`)continue;if(n===`other`){t.push(`${a}: rename it to somethingTab.config.ts (a dashboard page), somethingPage.config.ts (a page for anyone) or somethingForm.config.ts (a form).`);continue}if(!M(s)&&!N(s)&&t.push(`${a}: export one const named ${g(e)}Config.`),n===`tab`||n===`page`){let{first:o,count:c}=P(s),l=o===void 0?null:j(o);if(c===0||l===null||!l.startsWith(`/`))t.push(`${a}: route must be one string starting with /, e.g. route: '/onboarding'. A page has exactly one web address.`);else{let e=r.get(l);e?t.push(`${a}: route '${l}' is already used by ${e}. One page, one file, one address.`):r.set(l,a)}let u=A(s,`template`)[0],d=u===void 0?null:j(u);if(!d||![`board`,`table`,`calendar`,`drive`,`inline_form`,`popup_form`].includes(d)){let r=n===`tab`?f(e):p(e),o=A(s,n===`tab`?`tabName`:`pageName`)[0],c=o===void 0?null:j(o),l=e=>e.toLowerCase().replace(/[^a-z0-9]+/g,`_`).replace(/^_|_$/g,``);if(![r,...c?[l(c),l(c).replace(/_/g,``)]:[]].some(e=>i.has(e))){let n=g(e).replace(/(Tab|Page)$/,``),r=(c||n).split(/[^a-zA-Z0-9]+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(``);t.push(`${a}: no content file matches this page, so it renders empty — create src/your-ai-workflow-firebase-os/microcomponents/${r}Content.tsx with export default.`)}}}if(n===`tab`){let e=A(s,`pageType`)[0],n=e===void 0?null:j(e);n!==`user`&&n!==`internal`&&n!==`admin`&&t.push(`${a}: pageType must be 'user', 'internal' or 'admin'. A dashboard page is never public.`)}if(n===`form`){let n=m(e),r=A(s,`systemName`)[0];r!==void 0&&j(r)!==n&&t.push(`${a}: systemName must be '${n}'.`)}continue}O(a)&&(N(s)||t.push(`${a}: add export default.`),(/<form\b/.test(s)||/\bonSubmit\b/.test(s))&&!/ContactPopup/.test(s)&&n.push(`${a}: forms are *Form.config.ts files shown with <ContactPopup formId="…" />; a hand-written form never reaches the Inbox.`))}return{errors:t,warnings:n}}function I(e,t){return F(e.map(e=>({file:e.file,source:t(e.abs)})))}var L=i,R=`\0`+L,z=[{rel:`src/App.tsx`,source:a},{rel:`src/main.tsx`,source:o}],B=e=>`${e} is owned by Your AI Firebase; your edit was discarded.`,V=e=>e.replace(/[?#].*$/,``),H=e=>n.normalize(e).split(n.sep).join(`/`),U={info:e=>console.log(e),warn:e=>console.warn(e),error:e=>console.error(e)};function W(e,r=U){let i=[];for(let{rel:a,source:o}of z){let s=n.join(e,a),c=null;try{c=t.readFileSync(s,`utf8`)}catch{c=null}c!==o&&(t.mkdirSync(n.dirname(s),{recursive:!0}),t.writeFileSync(s,o),i.push(a),c!==null&&r.warn(B(a)))}return i}var G=(e,t)=>{let r=H(V(t));for(let{rel:t,source:i}of z)if(r===H(n.join(e,t)))return i;return null};function K(){let e=process.cwd(),n=!1,r=`build`,i=U,a=()=>I(x(e),e=>t.readFileSync(e,`utf8`));return{name:`your-ai-firebase`,enforce:`pre`,configResolved(t){e=t.root,r=t.command,i=t.logger,n=y(e),n&&W(e,i)},resolveId(e){return e===L?R:null},buildStart(){if(!n)return;let{errors:e,warnings:t}=a();for(let e of t)this.warn(e);if(e.length!==0)if(r===`build`)this.error(e[0]);else for(let t of e)i.error(t)},load(r){if(!n)return null;if(r===R){let n=x(e),{errors:r}=I(n,e=>t.readFileSync(e,`utf8`));return r.length&&this.error(r[0]),w(n)}return G(e,r)},configureServer(t){if(!n)return;let r=()=>{let e=t.moduleGraph.getModuleById(R);e&&t.moduleGraph.invalidateModule(e),t.ws.send({type:`full-reload`,path:`*`})},i=n=>{let i=H(n);if(G(e,i)!==null){W(e,t.config.logger);return}if(!b(e,i))return;r();let{errors:o,warnings:s}=a();for(let e of s)t.config.logger.warn(e);for(let e of o)t.config.logger.error(e)};t.watcher.on(`add`,i),t.watcher.on(`unlink`,i),t.watcher.on(`change`,i)}}}exports.CANONICAL_APP_TSX=a,exports.CANONICAL_MAIN_TSX=o,exports.CONFIGS_DIR=c,exports.CONSUMER_DIR=s,exports.MICROCOMPONENTS_DIR=l,exports.OWNED_BANNER=r,exports.RESOLVED_VIRTUAL_ID=R,exports.SHIPPED_CONFIG_FILES=u,exports.VIRTUAL_ID=L,exports.VIRTUAL_REGISTRIES_ID=i,exports.classifyConfigFile=_,exports.discover=x,exports.fileIdFromConfigFile=g,exports.formIdFromFile=m,exports.isConsumerRoot=y,exports.isDiscoveredPath=b,exports.microcomponentKeysFromFile=h,exports.ownedMessage=B,exports.pageIdFromFile=p,exports.registrable=S,exports.restoreOwnedFiles=W,exports.stripComments=k,exports.tabIdFromFile=f,exports.validate=F,exports.validateDiscovered=I,exports.virtualModuleSource=T,exports.virtualModuleSourceFor=w,exports.yourAiFirebase=K;
|
package/dist/vite.es.js
CHANGED
|
@@ -245,35 +245,51 @@ var w = (e) => C(b(e)), T = (e) => e.split("/").pop() || e, E = (e) => /\/config
|
|
|
245
245
|
};
|
|
246
246
|
};
|
|
247
247
|
function P(e) {
|
|
248
|
-
let t = [], n = [], r = /* @__PURE__ */ new Map();
|
|
249
|
-
for (let { file:
|
|
250
|
-
|
|
251
|
-
|
|
248
|
+
let t = [], n = [], r = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Set();
|
|
249
|
+
for (let { file: t } of e) if (D(t)) for (let e of m(T(t))) i.add(e);
|
|
250
|
+
for (let { file: a, source: o } of e) {
|
|
251
|
+
let e = T(a), s = O(o);
|
|
252
|
+
if (E(a)) {
|
|
252
253
|
let n = g(e);
|
|
253
254
|
if (n === "shipped") continue;
|
|
254
255
|
if (n === "other") {
|
|
255
|
-
t.push(`${
|
|
256
|
+
t.push(`${a}: rename it to somethingTab.config.ts (a dashboard page), somethingPage.config.ts (a page for anyone) or somethingForm.config.ts (a form).`);
|
|
256
257
|
continue;
|
|
257
258
|
}
|
|
258
|
-
if (!j(
|
|
259
|
-
let { first:
|
|
260
|
-
if (
|
|
259
|
+
if (!j(s) && !M(s) && t.push(`${a}: export one const named ${h(e)}Config.`), n === "tab" || n === "page") {
|
|
260
|
+
let { first: o, count: c } = N(s), l = o === void 0 ? null : A(o);
|
|
261
|
+
if (c === 0 || l === null || !l.startsWith("/")) t.push(`${a}: route must be one string starting with /, e.g. route: '/onboarding'. A page has exactly one web address.`);
|
|
261
262
|
else {
|
|
262
|
-
let e = r.get(
|
|
263
|
-
e ? t.push(`${
|
|
263
|
+
let e = r.get(l);
|
|
264
|
+
e ? t.push(`${a}: route '${l}' is already used by ${e}. One page, one file, one address.`) : r.set(l, a);
|
|
265
|
+
}
|
|
266
|
+
let u = k(s, "template")[0], p = u === void 0 ? null : A(u);
|
|
267
|
+
if (!p || ![
|
|
268
|
+
"board",
|
|
269
|
+
"table",
|
|
270
|
+
"calendar",
|
|
271
|
+
"drive",
|
|
272
|
+
"inline_form",
|
|
273
|
+
"popup_form"
|
|
274
|
+
].includes(p)) {
|
|
275
|
+
let r = n === "tab" ? d(e) : f(e), o = k(s, n === "tab" ? "tabName" : "pageName")[0], c = o === void 0 ? null : A(o), l = (e) => e.toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_|_$/g, "");
|
|
276
|
+
if (![r, ...c ? [l(c), l(c).replace(/_/g, "")] : []].some((e) => i.has(e))) {
|
|
277
|
+
let n = h(e).replace(/(Tab|Page)$/, ""), r = (c || n).split(/[^a-zA-Z0-9]+/).filter(Boolean).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join("");
|
|
278
|
+
t.push(`${a}: no content file matches this page, so it renders empty — create src/your-ai-workflow-firebase-os/microcomponents/${r}Content.tsx with export default.`);
|
|
279
|
+
}
|
|
264
280
|
}
|
|
265
281
|
}
|
|
266
282
|
if (n === "tab") {
|
|
267
|
-
let e = k(
|
|
268
|
-
n !== "user" && n !== "internal" && n !== "admin" && t.push(`${
|
|
283
|
+
let e = k(s, "pageType")[0], n = e === void 0 ? null : A(e);
|
|
284
|
+
n !== "user" && n !== "internal" && n !== "admin" && t.push(`${a}: pageType must be 'user', 'internal' or 'admin'. A dashboard page is never public.`);
|
|
269
285
|
}
|
|
270
286
|
if (n === "form") {
|
|
271
|
-
let n = p(e), r = k(
|
|
272
|
-
r !== void 0 && A(r) !== n && t.push(`${
|
|
287
|
+
let n = p(e), r = k(s, "systemName")[0];
|
|
288
|
+
r !== void 0 && A(r) !== n && t.push(`${a}: systemName must be '${n}'.`);
|
|
273
289
|
}
|
|
274
290
|
continue;
|
|
275
291
|
}
|
|
276
|
-
D(
|
|
292
|
+
D(a) && (M(s) || t.push(`${a}: add export default.`), (/<form\b/.test(s) || /\bonSubmit\b/.test(s)) && !/ContactPopup/.test(s) && n.push(`${a}: forms are *Form.config.ts files shown with <ContactPopup formId="…" />; a hand-written form never reaches the Inbox.`));
|
|
277
293
|
}
|
|
278
294
|
return {
|
|
279
295
|
errors: t,
|